├── .gitignore
├── README.md
├── example
├── .gitignore
├── package-lock.json
├── package.json
├── public
│ ├── favicon.png
│ ├── global.css
│ ├── index.html
│ └── tailwind.css
├── rollup.config.js
└── src
│ ├── App.svelte
│ └── main.js
├── package-lock.json
├── package.json
├── rollup.config.js
└── src
├── Listbox.svelte
├── ListboxButton.svelte
├── ListboxLabel.svelte
├── ListboxList.svelte
├── ListboxOption.svelte
├── ListboxState.js
└── index.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist/
4 | /temp/
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## svelte-listbox
2 |
3 | A svelte implementation of https://github.com/tailwindui/vue
4 |
5 | # WIP
6 |
7 |
8 | ## example use:
9 |
10 | ```html
11 |
30 |
31 |
36 |
37 |
38 |
44 |
47 |
48 | {selection !== null ? selection.name : ''}
49 |
59 |
60 |
61 | {#if isOpen}
62 |
65 | {#each values as item}
66 |
71 |
72 |
76 | {item.name}
77 |
78 |
79 | {#if selected}
80 |
81 |
91 |
92 | {/if}
93 |
94 | {/each}
95 |
96 | {/if}
97 |
98 |
99 | ```
100 |
--------------------------------------------------------------------------------
/example/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /public/build/
3 |
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/example/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "svelte-app",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.10.1",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz",
10 | "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.10.1"
14 | }
15 | },
16 | "@babel/helper-validator-identifier": {
17 | "version": "7.10.1",
18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz",
19 | "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==",
20 | "dev": true
21 | },
22 | "@babel/highlight": {
23 | "version": "7.10.1",
24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz",
25 | "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==",
26 | "dev": true,
27 | "requires": {
28 | "@babel/helper-validator-identifier": "^7.10.1",
29 | "chalk": "^2.0.0",
30 | "js-tokens": "^4.0.0"
31 | }
32 | },
33 | "@polka/url": {
34 | "version": "0.5.0",
35 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz",
36 | "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw=="
37 | },
38 | "@rollup/plugin-commonjs": {
39 | "version": "12.0.0",
40 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-12.0.0.tgz",
41 | "integrity": "sha512-8+mDQt1QUmN+4Y9D3yCG8AJNewuTSLYPJVzKKUZ+lGeQrI+bV12Tc5HCyt2WdlnG6ihIL/DPbKRJlB40DX40mw==",
42 | "dev": true,
43 | "requires": {
44 | "@rollup/pluginutils": "^3.0.8",
45 | "commondir": "^1.0.1",
46 | "estree-walker": "^1.0.1",
47 | "glob": "^7.1.2",
48 | "is-reference": "^1.1.2",
49 | "magic-string": "^0.25.2",
50 | "resolve": "^1.11.0"
51 | }
52 | },
53 | "@rollup/plugin-node-resolve": {
54 | "version": "8.0.0",
55 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.0.tgz",
56 | "integrity": "sha512-5poJCChrkVggXXND/sQ7yNqwjUNT4fP31gpRWCnSNnlXuUXTCMHT33xZrTGxgjm5Rl18MHj7iEzlCT8rYWwQSA==",
57 | "dev": true,
58 | "requires": {
59 | "@rollup/pluginutils": "^3.0.8",
60 | "@types/resolve": "0.0.8",
61 | "builtin-modules": "^3.1.0",
62 | "deep-freeze": "^0.0.1",
63 | "deepmerge": "^4.2.2",
64 | "is-module": "^1.0.0",
65 | "resolve": "^1.14.2"
66 | }
67 | },
68 | "@rollup/pluginutils": {
69 | "version": "3.0.10",
70 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz",
71 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==",
72 | "dev": true,
73 | "requires": {
74 | "@types/estree": "0.0.39",
75 | "estree-walker": "^1.0.1",
76 | "picomatch": "^2.2.2"
77 | }
78 | },
79 | "@types/estree": {
80 | "version": "0.0.39",
81 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
82 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
83 | "dev": true
84 | },
85 | "@types/node": {
86 | "version": "14.0.9",
87 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.9.tgz",
88 | "integrity": "sha512-0sCTiXKXELOBxvZLN4krQ0FPOAA7ij+6WwvD0k/PHd9/KAkr4dXel5J9fh6F4x1FwAQILqAWkmpeuS6mjf1iKA==",
89 | "dev": true
90 | },
91 | "@types/resolve": {
92 | "version": "0.0.8",
93 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
94 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
95 | "dev": true,
96 | "requires": {
97 | "@types/node": "*"
98 | }
99 | },
100 | "ansi-styles": {
101 | "version": "3.2.1",
102 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
103 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
104 | "dev": true,
105 | "requires": {
106 | "color-convert": "^1.9.0"
107 | }
108 | },
109 | "anymatch": {
110 | "version": "3.1.1",
111 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
112 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
113 | "dev": true,
114 | "requires": {
115 | "normalize-path": "^3.0.0",
116 | "picomatch": "^2.0.4"
117 | }
118 | },
119 | "async-limiter": {
120 | "version": "1.0.1",
121 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
122 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
123 | "dev": true
124 | },
125 | "balanced-match": {
126 | "version": "1.0.0",
127 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
128 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
129 | "dev": true
130 | },
131 | "binary-extensions": {
132 | "version": "2.0.0",
133 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
134 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
135 | "dev": true
136 | },
137 | "brace-expansion": {
138 | "version": "1.1.11",
139 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
140 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
141 | "dev": true,
142 | "requires": {
143 | "balanced-match": "^1.0.0",
144 | "concat-map": "0.0.1"
145 | }
146 | },
147 | "braces": {
148 | "version": "3.0.2",
149 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
150 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
151 | "dev": true,
152 | "requires": {
153 | "fill-range": "^7.0.1"
154 | }
155 | },
156 | "buffer-from": {
157 | "version": "1.1.1",
158 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
159 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
160 | "dev": true
161 | },
162 | "builtin-modules": {
163 | "version": "3.1.0",
164 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
165 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
166 | "dev": true
167 | },
168 | "chalk": {
169 | "version": "2.4.2",
170 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
171 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
172 | "dev": true,
173 | "requires": {
174 | "ansi-styles": "^3.2.1",
175 | "escape-string-regexp": "^1.0.5",
176 | "supports-color": "^5.3.0"
177 | }
178 | },
179 | "chokidar": {
180 | "version": "3.4.0",
181 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz",
182 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==",
183 | "dev": true,
184 | "requires": {
185 | "anymatch": "~3.1.1",
186 | "braces": "~3.0.2",
187 | "fsevents": "~2.1.2",
188 | "glob-parent": "~5.1.0",
189 | "is-binary-path": "~2.1.0",
190 | "is-glob": "~4.0.1",
191 | "normalize-path": "~3.0.0",
192 | "readdirp": "~3.4.0"
193 | }
194 | },
195 | "color-convert": {
196 | "version": "1.9.3",
197 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
198 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
199 | "dev": true,
200 | "requires": {
201 | "color-name": "1.1.3"
202 | }
203 | },
204 | "color-name": {
205 | "version": "1.1.3",
206 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
207 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
208 | "dev": true
209 | },
210 | "commander": {
211 | "version": "2.20.3",
212 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
213 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
214 | "dev": true
215 | },
216 | "commondir": {
217 | "version": "1.0.1",
218 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
219 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
220 | "dev": true
221 | },
222 | "concat-map": {
223 | "version": "0.0.1",
224 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
225 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
226 | "dev": true
227 | },
228 | "console-clear": {
229 | "version": "1.1.1",
230 | "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz",
231 | "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ=="
232 | },
233 | "deep-freeze": {
234 | "version": "0.0.1",
235 | "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
236 | "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=",
237 | "dev": true
238 | },
239 | "deepmerge": {
240 | "version": "4.2.2",
241 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
242 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
243 | "dev": true
244 | },
245 | "escape-string-regexp": {
246 | "version": "1.0.5",
247 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
248 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
249 | "dev": true
250 | },
251 | "estree-walker": {
252 | "version": "1.0.1",
253 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
254 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
255 | "dev": true
256 | },
257 | "fill-range": {
258 | "version": "7.0.1",
259 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
260 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
261 | "dev": true,
262 | "requires": {
263 | "to-regex-range": "^5.0.1"
264 | }
265 | },
266 | "fs.realpath": {
267 | "version": "1.0.0",
268 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
269 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
270 | "dev": true
271 | },
272 | "fsevents": {
273 | "version": "2.1.3",
274 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
275 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
276 | "dev": true,
277 | "optional": true
278 | },
279 | "get-port": {
280 | "version": "3.2.0",
281 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
282 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw="
283 | },
284 | "glob": {
285 | "version": "7.1.6",
286 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
287 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
288 | "dev": true,
289 | "requires": {
290 | "fs.realpath": "^1.0.0",
291 | "inflight": "^1.0.4",
292 | "inherits": "2",
293 | "minimatch": "^3.0.4",
294 | "once": "^1.3.0",
295 | "path-is-absolute": "^1.0.0"
296 | }
297 | },
298 | "glob-parent": {
299 | "version": "5.1.2",
300 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
301 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
302 | "dev": true,
303 | "requires": {
304 | "is-glob": "^4.0.1"
305 | }
306 | },
307 | "has-flag": {
308 | "version": "3.0.0",
309 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
310 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
311 | "dev": true
312 | },
313 | "inflight": {
314 | "version": "1.0.6",
315 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
316 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
317 | "dev": true,
318 | "requires": {
319 | "once": "^1.3.0",
320 | "wrappy": "1"
321 | }
322 | },
323 | "inherits": {
324 | "version": "2.0.4",
325 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
326 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
327 | "dev": true
328 | },
329 | "is-binary-path": {
330 | "version": "2.1.0",
331 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
332 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
333 | "dev": true,
334 | "requires": {
335 | "binary-extensions": "^2.0.0"
336 | }
337 | },
338 | "is-extglob": {
339 | "version": "2.1.1",
340 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
341 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
342 | "dev": true
343 | },
344 | "is-glob": {
345 | "version": "4.0.1",
346 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
347 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
348 | "dev": true,
349 | "requires": {
350 | "is-extglob": "^2.1.1"
351 | }
352 | },
353 | "is-module": {
354 | "version": "1.0.0",
355 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
356 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
357 | "dev": true
358 | },
359 | "is-number": {
360 | "version": "7.0.0",
361 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
362 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
363 | "dev": true
364 | },
365 | "is-reference": {
366 | "version": "1.2.0",
367 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz",
368 | "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==",
369 | "dev": true,
370 | "requires": {
371 | "@types/estree": "0.0.44"
372 | },
373 | "dependencies": {
374 | "@types/estree": {
375 | "version": "0.0.44",
376 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz",
377 | "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==",
378 | "dev": true
379 | }
380 | }
381 | },
382 | "jest-worker": {
383 | "version": "24.9.0",
384 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
385 | "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
386 | "dev": true,
387 | "requires": {
388 | "merge-stream": "^2.0.0",
389 | "supports-color": "^6.1.0"
390 | },
391 | "dependencies": {
392 | "supports-color": {
393 | "version": "6.1.0",
394 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
395 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
396 | "dev": true,
397 | "requires": {
398 | "has-flag": "^3.0.0"
399 | }
400 | }
401 | }
402 | },
403 | "js-tokens": {
404 | "version": "4.0.0",
405 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
406 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
407 | "dev": true
408 | },
409 | "kleur": {
410 | "version": "3.0.3",
411 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
412 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
413 | },
414 | "livereload": {
415 | "version": "0.9.1",
416 | "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz",
417 | "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==",
418 | "dev": true,
419 | "requires": {
420 | "chokidar": "^3.3.0",
421 | "livereload-js": "^3.1.0",
422 | "opts": ">= 1.2.0",
423 | "ws": "^6.2.1"
424 | }
425 | },
426 | "livereload-js": {
427 | "version": "3.2.2",
428 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz",
429 | "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==",
430 | "dev": true
431 | },
432 | "local-access": {
433 | "version": "1.0.1",
434 | "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz",
435 | "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA=="
436 | },
437 | "magic-string": {
438 | "version": "0.25.7",
439 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
440 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
441 | "dev": true,
442 | "requires": {
443 | "sourcemap-codec": "^1.4.4"
444 | }
445 | },
446 | "merge-stream": {
447 | "version": "2.0.0",
448 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
449 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
450 | "dev": true
451 | },
452 | "mime": {
453 | "version": "2.4.6",
454 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
455 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
456 | },
457 | "minimatch": {
458 | "version": "3.0.4",
459 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
460 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
461 | "dev": true,
462 | "requires": {
463 | "brace-expansion": "^1.1.7"
464 | }
465 | },
466 | "mri": {
467 | "version": "1.1.5",
468 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz",
469 | "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg=="
470 | },
471 | "normalize-path": {
472 | "version": "3.0.0",
473 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
474 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
475 | "dev": true
476 | },
477 | "once": {
478 | "version": "1.4.0",
479 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
480 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
481 | "dev": true,
482 | "requires": {
483 | "wrappy": "1"
484 | }
485 | },
486 | "opts": {
487 | "version": "1.2.7",
488 | "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz",
489 | "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==",
490 | "dev": true
491 | },
492 | "path-is-absolute": {
493 | "version": "1.0.1",
494 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
495 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
496 | "dev": true
497 | },
498 | "path-parse": {
499 | "version": "1.0.7",
500 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
501 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
502 | "dev": true
503 | },
504 | "picomatch": {
505 | "version": "2.2.2",
506 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
507 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
508 | "dev": true
509 | },
510 | "readdirp": {
511 | "version": "3.4.0",
512 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
513 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
514 | "dev": true,
515 | "requires": {
516 | "picomatch": "^2.2.1"
517 | }
518 | },
519 | "require-relative": {
520 | "version": "0.8.7",
521 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
522 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
523 | "dev": true
524 | },
525 | "resolve": {
526 | "version": "1.17.0",
527 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
528 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
529 | "dev": true,
530 | "requires": {
531 | "path-parse": "^1.0.6"
532 | }
533 | },
534 | "rollup": {
535 | "version": "2.12.1",
536 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.12.1.tgz",
537 | "integrity": "sha512-qNl9jiVC4/jqTaGUTP0sUnKKCdnebAKYY/8hTy/NnNaeVfjHOW9aIwRT8XHV/zrcpRgJn1g/mjAorMcD38Dlhg==",
538 | "dev": true,
539 | "requires": {
540 | "fsevents": "~2.1.2"
541 | }
542 | },
543 | "rollup-plugin-livereload": {
544 | "version": "1.3.0",
545 | "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz",
546 | "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==",
547 | "dev": true,
548 | "requires": {
549 | "livereload": "^0.9.1"
550 | }
551 | },
552 | "rollup-plugin-svelte": {
553 | "version": "5.2.2",
554 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz",
555 | "integrity": "sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ==",
556 | "dev": true,
557 | "requires": {
558 | "require-relative": "^0.8.7",
559 | "rollup-pluginutils": "^2.8.2",
560 | "sourcemap-codec": "^1.4.8"
561 | }
562 | },
563 | "rollup-plugin-terser": {
564 | "version": "5.3.0",
565 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz",
566 | "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==",
567 | "dev": true,
568 | "requires": {
569 | "@babel/code-frame": "^7.5.5",
570 | "jest-worker": "^24.9.0",
571 | "rollup-pluginutils": "^2.8.2",
572 | "serialize-javascript": "^2.1.2",
573 | "terser": "^4.6.2"
574 | }
575 | },
576 | "rollup-pluginutils": {
577 | "version": "2.8.2",
578 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
579 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
580 | "dev": true,
581 | "requires": {
582 | "estree-walker": "^0.6.1"
583 | },
584 | "dependencies": {
585 | "estree-walker": {
586 | "version": "0.6.1",
587 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
588 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
589 | "dev": true
590 | }
591 | }
592 | },
593 | "sade": {
594 | "version": "1.7.3",
595 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz",
596 | "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==",
597 | "requires": {
598 | "mri": "^1.1.0"
599 | }
600 | },
601 | "serialize-javascript": {
602 | "version": "2.1.2",
603 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
604 | "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
605 | "dev": true
606 | },
607 | "sirv": {
608 | "version": "0.4.6",
609 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.6.tgz",
610 | "integrity": "sha512-rYpOXlNbpHiY4nVXxuDf4mXPvKz1reZGap/LkWp9TvcZ84qD/nPBjjH/6GZsgIjVMbOslnY8YYULAyP8jMn1GQ==",
611 | "requires": {
612 | "@polka/url": "^0.5.0",
613 | "mime": "^2.3.1"
614 | }
615 | },
616 | "sirv-cli": {
617 | "version": "0.4.6",
618 | "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.6.tgz",
619 | "integrity": "sha512-/Vj85/kBvPL+n9ibgX6FicLE8VjidC1BhlX67PYPBfbBAphzR6i0k0HtU5c2arejfU3uzq8l3SYPCwl1x7z6Ww==",
620 | "requires": {
621 | "console-clear": "^1.1.0",
622 | "get-port": "^3.2.0",
623 | "kleur": "^3.0.0",
624 | "local-access": "^1.0.1",
625 | "sade": "^1.4.0",
626 | "sirv": "^0.4.6",
627 | "tinydate": "^1.0.0"
628 | }
629 | },
630 | "source-map": {
631 | "version": "0.6.1",
632 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
633 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
634 | "dev": true
635 | },
636 | "source-map-support": {
637 | "version": "0.5.19",
638 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
639 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
640 | "dev": true,
641 | "requires": {
642 | "buffer-from": "^1.0.0",
643 | "source-map": "^0.6.0"
644 | }
645 | },
646 | "sourcemap-codec": {
647 | "version": "1.4.8",
648 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
649 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
650 | "dev": true
651 | },
652 | "supports-color": {
653 | "version": "5.5.0",
654 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
655 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
656 | "dev": true,
657 | "requires": {
658 | "has-flag": "^3.0.0"
659 | }
660 | },
661 | "svelte": {
662 | "version": "3.23.0",
663 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.23.0.tgz",
664 | "integrity": "sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==",
665 | "dev": true
666 | },
667 | "svelte-listbox": {
668 | "version": "0.0.1",
669 | "resolved": "https://registry.npmjs.org/svelte-listbox/-/svelte-listbox-0.0.1.tgz",
670 | "integrity": "sha512-rw0gErkknp7m7wcB6dpTOThDR3d71yY/pltzm+ps+nPfLDaffn7BmetLVke0hvJJFiMzx5j+A2R9Nv5Ql9q1Kg=="
671 | },
672 | "terser": {
673 | "version": "4.7.0",
674 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz",
675 | "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==",
676 | "dev": true,
677 | "requires": {
678 | "commander": "^2.20.0",
679 | "source-map": "~0.6.1",
680 | "source-map-support": "~0.5.12"
681 | }
682 | },
683 | "tinydate": {
684 | "version": "1.2.0",
685 | "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz",
686 | "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg=="
687 | },
688 | "to-regex-range": {
689 | "version": "5.0.1",
690 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
691 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
692 | "dev": true,
693 | "requires": {
694 | "is-number": "^7.0.0"
695 | }
696 | },
697 | "wrappy": {
698 | "version": "1.0.2",
699 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
700 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
701 | "dev": true
702 | },
703 | "ws": {
704 | "version": "6.2.2",
705 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
706 | "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
707 | "dev": true,
708 | "requires": {
709 | "async-limiter": "~1.0.0"
710 | }
711 | }
712 | }
713 | }
714 |
--------------------------------------------------------------------------------
/example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "svelte-app",
3 | "version": "1.0.0",
4 | "scripts": {
5 | "build": "rollup -c",
6 | "dev": "rollup -c -w",
7 | "start": "sirv public"
8 | },
9 | "devDependencies": {
10 | "@rollup/plugin-commonjs": "^12.0.0",
11 | "@rollup/plugin-node-resolve": "^8.0.0",
12 | "rollup": "^2.3.4",
13 | "rollup-plugin-livereload": "^1.0.0",
14 | "rollup-plugin-svelte": "^5.0.3",
15 | "rollup-plugin-terser": "^5.1.2",
16 | "svelte": "^3.0.0"
17 | },
18 | "dependencies": {
19 | "sirv-cli": "^0.4.4",
20 | "svelte-listbox": "0.0.1"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/example/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasDaniel/svelte-listbox/d728f92a310dffb565375146edaa73c37fea8211/example/public/favicon.png
--------------------------------------------------------------------------------
/example/public/global.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | position: relative;
3 | width: 100%;
4 | height: 100%;
5 | }
6 |
7 | body {
8 | color: #333;
9 | margin: 0;
10 | padding: 8px;
11 | box-sizing: border-box;
12 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
13 | }
14 |
15 | a {
16 | color: rgb(0,100,200);
17 | text-decoration: none;
18 | }
19 |
20 | a:hover {
21 | text-decoration: underline;
22 | }
23 |
24 | a:visited {
25 | color: rgb(0,80,160);
26 | }
27 |
28 | label {
29 | display: block;
30 | }
31 |
32 | input, button, select, textarea {
33 | font-family: inherit;
34 | font-size: inherit;
35 | padding: 0.4em;
36 | margin: 0 0 0.5em 0;
37 | box-sizing: border-box;
38 | border: 1px solid #ccc;
39 | border-radius: 2px;
40 | }
41 |
42 | input:disabled {
43 | color: #ccc;
44 | }
45 |
46 | input[type="range"] {
47 | height: 0;
48 | }
49 |
50 | button {
51 | color: #333;
52 | background-color: #f4f4f4;
53 | outline: none;
54 | }
55 |
56 | button:disabled {
57 | color: #999;
58 | }
59 |
60 | button:not(:disabled):active {
61 | background-color: #ddd;
62 | }
63 |
64 | button:focus {
65 | border-color: #666;
66 | }
67 |
--------------------------------------------------------------------------------
/example/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Svelte app
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/example/rollup.config.js:
--------------------------------------------------------------------------------
1 | import svelte from 'rollup-plugin-svelte';
2 | import resolve from '@rollup/plugin-node-resolve';
3 | import commonjs from '@rollup/plugin-commonjs';
4 | import livereload from 'rollup-plugin-livereload';
5 | import { terser } from 'rollup-plugin-terser';
6 |
7 | const production = !process.env.ROLLUP_WATCH;
8 |
9 | export default {
10 | input: 'src/main.js',
11 | output: {
12 | sourcemap: true,
13 | format: 'iife',
14 | name: 'app',
15 | file: 'public/build/bundle.js'
16 | },
17 | plugins: [
18 | svelte({
19 | // enable run-time checks when not in production
20 | dev: !production,
21 | // we'll extract any component CSS out into
22 | // a separate file - better for performance
23 | css: css => {
24 | css.write('public/build/bundle.css');
25 | }
26 | }),
27 |
28 | // If you have external dependencies installed from
29 | // npm, you'll most likely need these plugins. In
30 | // some cases you'll need additional configuration -
31 | // consult the documentation for details:
32 | // https://github.com/rollup/plugins/tree/master/packages/commonjs
33 | resolve({
34 | browser: true,
35 | dedupe: ['svelte']
36 | }),
37 | commonjs(),
38 |
39 | // In dev mode, call `npm run start` once
40 | // the bundle has been generated
41 | !production && serve(),
42 |
43 | // Watch the `public` directory and refresh the
44 | // browser on changes when not in production
45 | !production && livereload('public'),
46 |
47 | // If we're building for production (npm run build
48 | // instead of npm run dev), minify
49 | production && terser()
50 | ],
51 | watch: {
52 | clearScreen: false
53 | }
54 | };
55 |
56 | function serve() {
57 | let started = false;
58 |
59 | return {
60 | writeBundle() {
61 | if (!started) {
62 | started = true;
63 |
64 | require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
65 | stdio: ['ignore', 'inherit', 'inherit'],
66 | shell: true
67 | });
68 | }
69 | }
70 | };
71 | }
72 |
--------------------------------------------------------------------------------
/example/src/App.svelte:
--------------------------------------------------------------------------------
1 |
56 |
57 |
62 |
63 |
64 |
70 |
71 | Pick a friend
72 |
73 |
76 |
77 | {selection !== null ? selection.name : ''}
78 |
88 |
89 |
90 |
91 |
94 | {#each options as option}
95 |
100 |
101 |
105 | {option.name}
106 |
107 |
108 | {#if selected}
109 |
110 |
120 |
121 | {/if}
122 |
123 | {/each}
124 |
125 |
126 |
127 |
128 |
--------------------------------------------------------------------------------
/example/src/main.js:
--------------------------------------------------------------------------------
1 | import App from './App.svelte';
2 |
3 | var app = new App({
4 | target: document.body
5 | });
6 |
7 | export default app;
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "svelte-listbox",
3 | "version": "0.0.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@rollup/plugin-node-resolve": {
8 | "version": "6.1.0",
9 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz",
10 | "integrity": "sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==",
11 | "dev": true,
12 | "requires": {
13 | "@rollup/pluginutils": "^3.0.0",
14 | "@types/resolve": "0.0.8",
15 | "builtin-modules": "^3.1.0",
16 | "is-module": "^1.0.0",
17 | "resolve": "^1.11.1"
18 | }
19 | },
20 | "@rollup/pluginutils": {
21 | "version": "3.0.10",
22 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz",
23 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==",
24 | "dev": true,
25 | "requires": {
26 | "@types/estree": "0.0.39",
27 | "estree-walker": "^1.0.1",
28 | "picomatch": "^2.2.2"
29 | }
30 | },
31 | "@types/estree": {
32 | "version": "0.0.39",
33 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
34 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
35 | "dev": true
36 | },
37 | "@types/node": {
38 | "version": "14.0.6",
39 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.6.tgz",
40 | "integrity": "sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==",
41 | "dev": true
42 | },
43 | "@types/resolve": {
44 | "version": "0.0.8",
45 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
46 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
47 | "dev": true,
48 | "requires": {
49 | "@types/node": "*"
50 | }
51 | },
52 | "acorn": {
53 | "version": "7.2.0",
54 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz",
55 | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==",
56 | "dev": true
57 | },
58 | "builtin-modules": {
59 | "version": "3.1.0",
60 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
61 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
62 | "dev": true
63 | },
64 | "estree-walker": {
65 | "version": "1.0.1",
66 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
67 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
68 | "dev": true
69 | },
70 | "is-module": {
71 | "version": "1.0.0",
72 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
73 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
74 | "dev": true
75 | },
76 | "path-parse": {
77 | "version": "1.0.7",
78 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
79 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
80 | "dev": true
81 | },
82 | "picomatch": {
83 | "version": "2.2.2",
84 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
85 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
86 | "dev": true
87 | },
88 | "require-relative": {
89 | "version": "0.8.7",
90 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
91 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
92 | "dev": true
93 | },
94 | "resolve": {
95 | "version": "1.17.0",
96 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
97 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
98 | "dev": true,
99 | "requires": {
100 | "path-parse": "^1.0.6"
101 | }
102 | },
103 | "rollup": {
104 | "version": "1.32.1",
105 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz",
106 | "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==",
107 | "dev": true,
108 | "requires": {
109 | "@types/estree": "*",
110 | "@types/node": "*",
111 | "acorn": "^7.1.0"
112 | }
113 | },
114 | "rollup-plugin-svelte": {
115 | "version": "5.2.2",
116 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz",
117 | "integrity": "sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ==",
118 | "dev": true,
119 | "requires": {
120 | "require-relative": "^0.8.7",
121 | "rollup-pluginutils": "^2.8.2",
122 | "sourcemap-codec": "^1.4.8"
123 | }
124 | },
125 | "rollup-pluginutils": {
126 | "version": "2.8.2",
127 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
128 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
129 | "dev": true,
130 | "requires": {
131 | "estree-walker": "^0.6.1"
132 | },
133 | "dependencies": {
134 | "estree-walker": {
135 | "version": "0.6.1",
136 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
137 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
138 | "dev": true
139 | }
140 | }
141 | },
142 | "sourcemap-codec": {
143 | "version": "1.4.8",
144 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
145 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
146 | "dev": true
147 | },
148 | "svelte": {
149 | "version": "3.23.0",
150 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.23.0.tgz",
151 | "integrity": "sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==",
152 | "dev": true
153 | }
154 | }
155 | }
156 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "svelte-listbox",
3 | "version": "0.0.1",
4 | "svelte": "src/index.js",
5 | "module": "dist/index.mjs",
6 | "main": "dist/index.js",
7 | "scripts": {
8 | "build": "rollup -c",
9 | "prepublishOnly": "npm run build"
10 | },
11 | "devDependencies": {
12 | "@rollup/plugin-node-resolve": "^6.0.0",
13 | "rollup": "^1.20.0",
14 | "rollup-plugin-svelte": "^5.0.0",
15 | "svelte": "^3.0.0"
16 | },
17 | "keywords": [
18 | "svelte",
19 | "svelte3",
20 | "listbox",
21 | "ui"
22 | ],
23 | "files": [
24 | "src",
25 | "dist"
26 | ]
27 | }
28 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import svelte from "rollup-plugin-svelte";
2 | import resolve from "@rollup/plugin-node-resolve";
3 | import pkg from "./package.json";
4 |
5 | const name = pkg.name
6 | .replace(/^(@\S+\/)?(svelte-)?(\S+)/, "$3")
7 | .replace(/^\w/, m => m.toUpperCase())
8 | .replace(/-\w/g, m => m[1].toUpperCase());
9 |
10 | export default {
11 | input: "src/index.js",
12 | output: [
13 | { file: pkg.module, format: "es" },
14 | { file: pkg.main, format: "umd", name },
15 | { file: pkg.main.replace('.js', '_cjs.js'), format: "cjs", name }
16 | ],
17 | plugins: [svelte(), resolve()]
18 | };
19 |
--------------------------------------------------------------------------------
/src/Listbox.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
31 |
32 |
--------------------------------------------------------------------------------
/src/ListboxButton.svelte:
--------------------------------------------------------------------------------
1 |
8 |
9 |
21 |
--------------------------------------------------------------------------------
/src/ListboxLabel.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/ListboxList.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 |
9 |
--------------------------------------------------------------------------------
/src/ListboxOption.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 | select(value)}
11 | on:mousemove={()=>focus(value)}
12 | role='option'
13 | aria-selected={selected}
14 | {id}
15 | >
16 |
--------------------------------------------------------------------------------
/src/ListboxState.js:
--------------------------------------------------------------------------------
1 | import { writable, get } from 'svelte/store';
2 | import { tick } from 'svelte';
3 |
4 | export const isOpen = writable(false);
5 | export const selectedValue = writable(undefined); // use undefined so value can be passed in listbox
6 | export const activeValue = writable(false);
7 | export const items = writable([]);
8 | export const elList = writable(null);
9 | export const labelId = writable(null);
10 |
11 | export function toggleOpen() {
12 | isOpen.set(!get(isOpen));
13 | }
14 |
15 | export function close() {
16 | isOpen.set(false);
17 | }
18 |
19 | export function open() {
20 | isOpen.set(false);
21 | }
22 |
23 | export function select(val) {
24 | selectedValue.set(val);
25 | close();
26 | }
27 |
28 | export async function focus(val) {
29 | activeValue.set(val);
30 | if (val !== null) {
31 | await tick();
32 | if(get(elList) && get(elList).children[get(items).indexOf(val)]){
33 | get(elList).children[get(items).indexOf(val)].scrollIntoView({ block: 'nearest' });
34 | }
35 | }
36 | }
37 |
38 | export function handleKeydown(e) {
39 | if(!get(isOpen)) return;
40 | let values = get(items)
41 | let focusedIndex = values.indexOf(get(activeValue))
42 |
43 | let indexToFocus;
44 | switch (e.key) {
45 | case 'Esc':
46 | case 'Escape':
47 | e.preventDefault()
48 | close()
49 | break
50 | case 'Tab':
51 | e.preventDefault()
52 | break
53 | case 'Up':
54 | case 'ArrowUp':
55 | e.preventDefault()
56 | indexToFocus = focusedIndex - 1 < 0 ? values.length - 1 : focusedIndex - 1
57 | focus(values[indexToFocus])
58 | break
59 | case 'Home':
60 | e.preventDefault()
61 | indexToFocus = 0
62 | focus(values[indexToFocus])
63 | break
64 | case 'End':
65 | e.preventDefault()
66 | indexToFocus = values.length - 1
67 | focus(values[indexToFocus])
68 | break
69 | case 'Down':
70 | case 'ArrowDown':
71 | e.preventDefault()
72 | indexToFocus = (focusedIndex + 1) % values.length
73 | focus(values[indexToFocus])
74 | break
75 | case 'Enter':
76 | case ' ':
77 | case 'Space':
78 | e.preventDefault()
79 | select(get(activeValue))
80 | break
81 | default:
82 | e.preventDefault()
83 | }
84 | return
85 | }
86 |
87 | let id = 0;
88 |
89 | export function generateId() {
90 | return `listbox-id-${id++}`
91 | }
92 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | export { default as Listbox } from "./Listbox.svelte";
2 | export { default as ListboxButton } from "./ListboxButton.svelte";
3 | export { default as ListboxLabel } from "./ListboxLabel.svelte";
4 | export { default as ListboxList } from "./ListboxList.svelte";
5 | export { default as ListboxOption } from "./ListboxOption.svelte";
6 |
--------------------------------------------------------------------------------