├── .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 | 57 | 58 | 59 | 60 | 61 | {#if isOpen} 62 | 65 | {#each values as item} 66 | 71 | 72 | {item.name} 76 | {item.name} 77 | 78 | 79 | {#if selected} 80 | 81 | 89 | 90 | 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 | 86 | 87 | 88 | 89 | 90 | 91 | 94 | {#each options as option} 95 | 100 | 101 | {option.name} 105 | {option.name} 106 | 107 | 108 | {#if selected} 109 | 110 | 118 | 119 | 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 | --------------------------------------------------------------------------------