├── .github └── FUNDING.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src ├── app.d.ts ├── app.html ├── lib │ ├── constants.ts │ ├── index.ts │ ├── ripple.css │ └── ripple.ts └── routes │ ├── +page.svelte │ ├── +page.ts │ ├── CodeBlock.svelte │ ├── Examples.svelte │ ├── app.css │ └── example.ts ├── static ├── logo-large.png └── logo.png ├── svelte.config.js ├── tsconfig.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [posandu] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Posandu Mapa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte Ripple Action 2 | 3 |

4 | 8 | 9 | GitHub Repo stars 10 |

11 | 12 | View the [demo](https://ripple.posandu.com/). 13 | 14 | Svelte Ripple Action is a simple and customizable action for creating ripple effects on elements in a Svelte application. 15 | 16 | ## Installation 17 | 18 | Install the package from npm or your preferred package manager: 19 | 20 | ```bash 21 | npm install svelte-ripple-action 22 | ``` 23 | 24 | ## Usage 25 | 26 | 1. Import the CSS styles for the ripple effect: 27 | 28 | ```javascript 29 | import "svelte-ripple-action/ripple.css"; 30 | ``` 31 | 32 | 2. Import the `ripple` action and use it on any element you want to have a ripple effect on: 33 | 34 | ```svelte 35 | 38 | 39 | 40 | ``` 41 | 42 | That's it! You now have a ripple effect on your element. 43 | 44 | ## Options 45 | 46 | You can pass options to customize the ripple effect. 47 | 48 | ### `center?: boolean` 49 | 50 | By default, the ripple effect starts from the point where the user clicks on the element. If you want the ripple effect to start from the center of the element, you can pass the `center` option. 51 | 52 | ```svelte 53 | 54 | ``` 55 | 56 | ### `color?: string` 57 | 58 | You can customize the color of the ripple effect by passing a valid CSS color value to the `color` option. 59 | 60 | ```svelte 61 | 66 | ``` 67 | 68 | ### `duration?: number` 69 | 70 | You can control the duration of the ripple effect in seconds by passing a number to the `duration` option. 71 | 72 | ```svelte 73 | 74 | 75 | ``` 76 | 77 | ### `maxRadius?: number` 78 | 79 | You can control the maximum radius of the ripple effect in pixels by passing a number to the `maxRadius` option. 80 | 81 | ```svelte 82 | 83 | ``` 84 | 85 | ## Credits 86 | 87 | Created by [Posandu](https://posandu.com). You can find the source code on [GitHub](https://github.com/posandu/svelte-ripple-action). 88 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-ripple-action", 3 | "version": "2.0.0", 4 | "description": "A svelte action to add a ripple effect to any element", 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build && npm run package", 8 | "preview": "vite preview", 9 | "package": "svelte-kit sync && svelte-package && publint", 10 | "prepublishOnly": "npm run package", 11 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 12 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" 13 | }, 14 | "exports": { 15 | ".": { 16 | "types": "./dist/index.d.ts", 17 | "svelte": "./dist/index.js" 18 | }, 19 | "./ripple.css": "./dist/ripple.css" 20 | }, 21 | "files": [ 22 | "dist", 23 | "!dist/**/*.test.*", 24 | "!dist/**/*.spec.*" 25 | ], 26 | "peerDependencies": { 27 | "svelte": "^5.0.0" 28 | }, 29 | "devDependencies": { 30 | "@sveltejs/adapter-auto": "^3.0.0", 31 | "@sveltejs/kit": "^2.5.27", 32 | "@sveltejs/package": "^2.3.7", 33 | "@sveltejs/vite-plugin-svelte": "^4.0.0", 34 | "publint": "^0.1.9", 35 | "shiki": "^1.1.7", 36 | "svelte": "^5.0.0", 37 | "svelte-check": "^4.0.0", 38 | "tslib": "^2.4.1", 39 | "typescript": "^5.5.0", 40 | "vite": "^5.4.4" 41 | }, 42 | "svelte": "./dist/index.js", 43 | "types": "./dist/index.d.ts", 44 | "type": "module", 45 | "license": "MIT", 46 | "repository": { 47 | "type": "git", 48 | "url": "https://github.com/posandu/svelte-ripple-action" 49 | }, 50 | "author": "posandu", 51 | "main": "./dist/index.js" 52 | } 53 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@sveltejs/adapter-auto': 12 | specifier: ^3.0.0 13 | version: 3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11)) 14 | '@sveltejs/kit': 15 | specifier: ^2.5.27 16 | version: 2.8.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11) 17 | '@sveltejs/package': 18 | specifier: ^2.3.7 19 | version: 2.3.7(svelte@5.2.0)(typescript@5.6.3) 20 | '@sveltejs/vite-plugin-svelte': 21 | specifier: ^4.0.0 22 | version: 4.0.0(svelte@5.2.0)(vite@5.4.11) 23 | publint: 24 | specifier: ^0.1.9 25 | version: 0.1.16 26 | shiki: 27 | specifier: ^1.1.7 28 | version: 1.1.7 29 | svelte: 30 | specifier: ^5.0.0 31 | version: 5.2.0 32 | svelte-check: 33 | specifier: ^4.0.0 34 | version: 4.0.7(svelte@5.2.0)(typescript@5.6.3) 35 | tslib: 36 | specifier: ^2.4.1 37 | version: 2.6.1 38 | typescript: 39 | specifier: ^5.5.0 40 | version: 5.6.3 41 | vite: 42 | specifier: ^5.4.4 43 | version: 5.4.11 44 | 45 | packages: 46 | 47 | '@ampproject/remapping@2.3.0': 48 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 49 | engines: {node: '>=6.0.0'} 50 | 51 | '@esbuild/aix-ppc64@0.21.5': 52 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 53 | engines: {node: '>=12'} 54 | cpu: [ppc64] 55 | os: [aix] 56 | 57 | '@esbuild/android-arm64@0.21.5': 58 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 59 | engines: {node: '>=12'} 60 | cpu: [arm64] 61 | os: [android] 62 | 63 | '@esbuild/android-arm@0.21.5': 64 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 65 | engines: {node: '>=12'} 66 | cpu: [arm] 67 | os: [android] 68 | 69 | '@esbuild/android-x64@0.21.5': 70 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 71 | engines: {node: '>=12'} 72 | cpu: [x64] 73 | os: [android] 74 | 75 | '@esbuild/darwin-arm64@0.21.5': 76 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 77 | engines: {node: '>=12'} 78 | cpu: [arm64] 79 | os: [darwin] 80 | 81 | '@esbuild/darwin-x64@0.21.5': 82 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 83 | engines: {node: '>=12'} 84 | cpu: [x64] 85 | os: [darwin] 86 | 87 | '@esbuild/freebsd-arm64@0.21.5': 88 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 89 | engines: {node: '>=12'} 90 | cpu: [arm64] 91 | os: [freebsd] 92 | 93 | '@esbuild/freebsd-x64@0.21.5': 94 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 95 | engines: {node: '>=12'} 96 | cpu: [x64] 97 | os: [freebsd] 98 | 99 | '@esbuild/linux-arm64@0.21.5': 100 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 101 | engines: {node: '>=12'} 102 | cpu: [arm64] 103 | os: [linux] 104 | 105 | '@esbuild/linux-arm@0.21.5': 106 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 107 | engines: {node: '>=12'} 108 | cpu: [arm] 109 | os: [linux] 110 | 111 | '@esbuild/linux-ia32@0.21.5': 112 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 113 | engines: {node: '>=12'} 114 | cpu: [ia32] 115 | os: [linux] 116 | 117 | '@esbuild/linux-loong64@0.21.5': 118 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 119 | engines: {node: '>=12'} 120 | cpu: [loong64] 121 | os: [linux] 122 | 123 | '@esbuild/linux-mips64el@0.21.5': 124 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 125 | engines: {node: '>=12'} 126 | cpu: [mips64el] 127 | os: [linux] 128 | 129 | '@esbuild/linux-ppc64@0.21.5': 130 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 131 | engines: {node: '>=12'} 132 | cpu: [ppc64] 133 | os: [linux] 134 | 135 | '@esbuild/linux-riscv64@0.21.5': 136 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 137 | engines: {node: '>=12'} 138 | cpu: [riscv64] 139 | os: [linux] 140 | 141 | '@esbuild/linux-s390x@0.21.5': 142 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 143 | engines: {node: '>=12'} 144 | cpu: [s390x] 145 | os: [linux] 146 | 147 | '@esbuild/linux-x64@0.21.5': 148 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 149 | engines: {node: '>=12'} 150 | cpu: [x64] 151 | os: [linux] 152 | 153 | '@esbuild/netbsd-x64@0.21.5': 154 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 155 | engines: {node: '>=12'} 156 | cpu: [x64] 157 | os: [netbsd] 158 | 159 | '@esbuild/openbsd-x64@0.21.5': 160 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 161 | engines: {node: '>=12'} 162 | cpu: [x64] 163 | os: [openbsd] 164 | 165 | '@esbuild/sunos-x64@0.21.5': 166 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 167 | engines: {node: '>=12'} 168 | cpu: [x64] 169 | os: [sunos] 170 | 171 | '@esbuild/win32-arm64@0.21.5': 172 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 173 | engines: {node: '>=12'} 174 | cpu: [arm64] 175 | os: [win32] 176 | 177 | '@esbuild/win32-ia32@0.21.5': 178 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 179 | engines: {node: '>=12'} 180 | cpu: [ia32] 181 | os: [win32] 182 | 183 | '@esbuild/win32-x64@0.21.5': 184 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 185 | engines: {node: '>=12'} 186 | cpu: [x64] 187 | os: [win32] 188 | 189 | '@jridgewell/gen-mapping@0.3.5': 190 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 191 | engines: {node: '>=6.0.0'} 192 | 193 | '@jridgewell/resolve-uri@3.1.1': 194 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 195 | engines: {node: '>=6.0.0'} 196 | 197 | '@jridgewell/set-array@1.2.1': 198 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 199 | engines: {node: '>=6.0.0'} 200 | 201 | '@jridgewell/sourcemap-codec@1.4.15': 202 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 203 | 204 | '@jridgewell/sourcemap-codec@1.5.0': 205 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 206 | 207 | '@jridgewell/trace-mapping@0.3.25': 208 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 209 | 210 | '@polka/url@1.0.0-next.28': 211 | resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} 212 | 213 | '@rollup/rollup-android-arm-eabi@4.27.0': 214 | resolution: {integrity: sha512-e312hTjuM89YLqlcqEs7mSvwhxN5pgXqRobUob7Jsz1wDQlpAb2WTX4jzvrx5NrL1h2SE4fGdHSNyPxbLfzyeA==} 215 | cpu: [arm] 216 | os: [android] 217 | 218 | '@rollup/rollup-android-arm64@4.27.0': 219 | resolution: {integrity: sha512-cBUOny8GNXP++gN00Bo5L04I2oqUEFAU0OSDb+4hqp4/R/pZL/zlGzp7lJkhtPX52Rj+PIe0S8aOqhK4hztxHQ==} 220 | cpu: [arm64] 221 | os: [android] 222 | 223 | '@rollup/rollup-darwin-arm64@4.27.0': 224 | resolution: {integrity: sha512-aauK2M2ptFQQYdOqbKGYCg1LHlPbm6IxepSnHLLaMIGcd9YBiKRGl2+KtzQL/IkurP+b54EKBkvtZaWXijmzfQ==} 225 | cpu: [arm64] 226 | os: [darwin] 227 | 228 | '@rollup/rollup-darwin-x64@4.27.0': 229 | resolution: {integrity: sha512-VAjOnHUwpvxf3XT33sMpsLGKq24Rz1sTQhLuUicYrV9pxB4TNi0w11qAGPOyR+dQu/iZf88DmEmG0+2Gaqa1gg==} 230 | cpu: [x64] 231 | os: [darwin] 232 | 233 | '@rollup/rollup-freebsd-arm64@4.27.0': 234 | resolution: {integrity: sha512-I2eRlZG87gl6WxP6PvSB5bfFA1btE7tWnG6QAoEU/0Gr47f6KaxRwiRfBujHlzkuMPqtpTlSOW4aOEOyMtQqfg==} 235 | cpu: [arm64] 236 | os: [freebsd] 237 | 238 | '@rollup/rollup-freebsd-x64@4.27.0': 239 | resolution: {integrity: sha512-G05JNYFdjikD/2hJTf1gHdD5KjI2TotjiDn17amHtB5JgwrRF1EA9hJ3TRGIvT3zGXilNWWlR71R/2TT1pXRDg==} 240 | cpu: [x64] 241 | os: [freebsd] 242 | 243 | '@rollup/rollup-linux-arm-gnueabihf@4.27.0': 244 | resolution: {integrity: sha512-FMXxMZ7qnMULwgdmGSFVlOduAhFyqDPoK1A2Q8HBkzGYX9SMFU3ITKfLdIiCzTaaj/pt1OiEbpF2szUw6Kh++Q==} 245 | cpu: [arm] 246 | os: [linux] 247 | 248 | '@rollup/rollup-linux-arm-musleabihf@4.27.0': 249 | resolution: {integrity: sha512-0315TiPsJfOY+jAwEeqxcy9yVcAy/jg99GrMcd/L7CRESzi1vhyLPbnkDnz7giaEttSRf/d3llJYfoC+44Nl3A==} 250 | cpu: [arm] 251 | os: [linux] 252 | 253 | '@rollup/rollup-linux-arm64-gnu@4.27.0': 254 | resolution: {integrity: sha512-4zCKY5E9djPyHzvoCWIouFsuAvg+dk+rNia8lz1bjKpzKz02QvK4JPHyjcDT8CFR2J/aA98WccCirdDOy+VDWQ==} 255 | cpu: [arm64] 256 | os: [linux] 257 | 258 | '@rollup/rollup-linux-arm64-musl@4.27.0': 259 | resolution: {integrity: sha512-6St9rrPSLbYBbbJAClpU4gmnO7cdZCMMzx2MT0UCIIIevoLAmsCDOAG6t3J/RgN4CPUpdaGr/UnPqQTHZ4oDwA==} 260 | cpu: [arm64] 261 | os: [linux] 262 | 263 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.0': 264 | resolution: {integrity: sha512-dIBfp8NDrgvwUJxyqFv7501coIba+7xxBJy1gQEF0RGkIKa3Tq0Mh3sF9hmstDLtaMt7gL2aXsCNG9SCKyVVZg==} 265 | cpu: [ppc64] 266 | os: [linux] 267 | 268 | '@rollup/rollup-linux-riscv64-gnu@4.27.0': 269 | resolution: {integrity: sha512-Pu7xLHRy+5UjFCKR/vWsbFmiBYUC9993v99YoKWhAgK4VsdNuWHPs17NuCJEtVsZpYCNVPbRyBpQw58Ma8BmeA==} 270 | cpu: [riscv64] 271 | os: [linux] 272 | 273 | '@rollup/rollup-linux-s390x-gnu@4.27.0': 274 | resolution: {integrity: sha512-2Q9qQnk/eWdvXzzHl22y7tpDHREppFUh7N6cCs70HZEbQSgB7wd/2S/B05SSiyAiIn5BL+fYiASLds5bz0IQFw==} 275 | cpu: [s390x] 276 | os: [linux] 277 | 278 | '@rollup/rollup-linux-x64-gnu@4.27.0': 279 | resolution: {integrity: sha512-CNnqMZ4Yz0Ga0A75qux7DNChq0P9oAWn2S7yjZPRC+AaEF8Ysw5K/1lzT25/a3reJ4V2abcShIVG+tfZHb1UrQ==} 280 | cpu: [x64] 281 | os: [linux] 282 | 283 | '@rollup/rollup-linux-x64-musl@4.27.0': 284 | resolution: {integrity: sha512-dS1+eCbbao54XB+wLW6uuwRkChq4L0UfKhd3wvt6s+EN1rTIi24ee5Lk3HfRGq9J2jsRm12/AGKLA0kd82Sp/g==} 285 | cpu: [x64] 286 | os: [linux] 287 | 288 | '@rollup/rollup-win32-arm64-msvc@4.27.0': 289 | resolution: {integrity: sha512-VrYQHY5+Y71OU/uOSRE9lLhph16bbuWGrMwGwZDPxCUXUW5NgLA+K+q0kv7rafHRlnrsZSVcMOkZskzTNnR3ZQ==} 290 | cpu: [arm64] 291 | os: [win32] 292 | 293 | '@rollup/rollup-win32-ia32-msvc@4.27.0': 294 | resolution: {integrity: sha512-LCqk4Xi3e4GzLqaq+QDM7gP5DtJ/RgWMzV3U2brwp/vEz9RTA5YBgIDP69xYfrTXexes6xPsOIquy79+kLifiA==} 295 | cpu: [ia32] 296 | os: [win32] 297 | 298 | '@rollup/rollup-win32-x64-msvc@4.27.0': 299 | resolution: {integrity: sha512-dj2ZolfViR3chLWwSHID2mBzLLwYvXFldIplR6BSkdACXqAsrcmItKTff4h7enYB3Ugoh0v41WbxijE9HJb1Hw==} 300 | cpu: [x64] 301 | os: [win32] 302 | 303 | '@shikijs/core@1.1.7': 304 | resolution: {integrity: sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg==} 305 | 306 | '@sveltejs/adapter-auto@3.3.1': 307 | resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} 308 | peerDependencies: 309 | '@sveltejs/kit': ^2.0.0 310 | 311 | '@sveltejs/kit@2.8.1': 312 | resolution: {integrity: sha512-uuOfFwZ4xvnfPsiTB6a4H1ljjTUksGhWnYq5X/Y9z4x5+3uM2Md8q/YVeHL+7w+mygAwoEFdgKZ8YkUuk+VKww==} 313 | engines: {node: '>=18.13'} 314 | hasBin: true 315 | peerDependencies: 316 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 317 | svelte: ^4.0.0 || ^5.0.0-next.0 318 | vite: ^5.0.3 319 | 320 | '@sveltejs/package@2.3.7': 321 | resolution: {integrity: sha512-LYgUkde5GUYqOpXbcoCGUpEH4Ctl3Wj4u4CVZBl56dEeLW5fGHE037ZL1qlK0Ky+QD5uUfwONSeGwIOIighFMQ==} 322 | engines: {node: ^16.14 || >=18} 323 | hasBin: true 324 | peerDependencies: 325 | svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 326 | 327 | '@sveltejs/vite-plugin-svelte-inspector@3.0.1': 328 | resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} 329 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 330 | peerDependencies: 331 | '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 332 | svelte: ^5.0.0-next.96 || ^5.0.0 333 | vite: ^5.0.0 334 | 335 | '@sveltejs/vite-plugin-svelte@4.0.0': 336 | resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} 337 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 338 | peerDependencies: 339 | svelte: ^5.0.0-next.96 || ^5.0.0 340 | vite: ^5.0.0 341 | 342 | '@types/cookie@0.6.0': 343 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 344 | 345 | '@types/estree@1.0.6': 346 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 347 | 348 | acorn-typescript@1.4.13: 349 | resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} 350 | peerDependencies: 351 | acorn: '>=8.9.0' 352 | 353 | acorn@8.14.0: 354 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 355 | engines: {node: '>=0.4.0'} 356 | hasBin: true 357 | 358 | aria-query@5.3.2: 359 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 360 | engines: {node: '>= 0.4'} 361 | 362 | axobject-query@4.1.0: 363 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 364 | engines: {node: '>= 0.4'} 365 | 366 | balanced-match@1.0.2: 367 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 368 | 369 | brace-expansion@2.0.1: 370 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 371 | 372 | chokidar@4.0.1: 373 | resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} 374 | engines: {node: '>= 14.16.0'} 375 | 376 | cookie@0.6.0: 377 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 378 | engines: {node: '>= 0.6'} 379 | 380 | debug@4.3.7: 381 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 382 | engines: {node: '>=6.0'} 383 | peerDependencies: 384 | supports-color: '*' 385 | peerDependenciesMeta: 386 | supports-color: 387 | optional: true 388 | 389 | dedent-js@1.0.1: 390 | resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 391 | 392 | deepmerge@4.3.1: 393 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 394 | engines: {node: '>=0.10.0'} 395 | 396 | devalue@5.1.1: 397 | resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} 398 | 399 | esbuild@0.21.5: 400 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 401 | engines: {node: '>=12'} 402 | hasBin: true 403 | 404 | esm-env@1.0.0: 405 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 406 | 407 | esrap@1.2.2: 408 | resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} 409 | 410 | fdir@6.4.2: 411 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 412 | peerDependencies: 413 | picomatch: ^3 || ^4 414 | peerDependenciesMeta: 415 | picomatch: 416 | optional: true 417 | 418 | fs.realpath@1.0.0: 419 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 420 | 421 | fsevents@2.3.3: 422 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 423 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 424 | os: [darwin] 425 | 426 | glob@8.1.0: 427 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 428 | engines: {node: '>=12'} 429 | 430 | globalyzer@0.1.0: 431 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 432 | 433 | globrex@0.1.2: 434 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 435 | 436 | ignore-walk@5.0.1: 437 | resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} 438 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 439 | 440 | import-meta-resolve@4.1.0: 441 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 442 | 443 | inflight@1.0.6: 444 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 445 | 446 | inherits@2.0.4: 447 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 448 | 449 | is-reference@3.0.3: 450 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 451 | 452 | kleur@4.1.5: 453 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 454 | engines: {node: '>=6'} 455 | 456 | locate-character@3.0.0: 457 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 458 | 459 | lower-case@2.0.2: 460 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 461 | 462 | lru-cache@6.0.0: 463 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 464 | engines: {node: '>=10'} 465 | 466 | magic-string@0.30.12: 467 | resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} 468 | 469 | minimatch@5.1.6: 470 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 471 | engines: {node: '>=10'} 472 | 473 | mri@1.2.0: 474 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 475 | engines: {node: '>=4'} 476 | 477 | mrmime@2.0.0: 478 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} 479 | engines: {node: '>=10'} 480 | 481 | ms@2.1.3: 482 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 483 | 484 | nanoid@3.3.7: 485 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 486 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 487 | hasBin: true 488 | 489 | no-case@3.0.4: 490 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 491 | 492 | npm-bundled@2.0.1: 493 | resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} 494 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 495 | 496 | npm-normalize-package-bin@2.0.0: 497 | resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} 498 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 499 | 500 | npm-packlist@5.1.3: 501 | resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} 502 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 503 | hasBin: true 504 | 505 | once@1.4.0: 506 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 507 | 508 | pascal-case@3.1.2: 509 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 510 | 511 | picocolors@1.0.0: 512 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 513 | 514 | picocolors@1.1.1: 515 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 516 | 517 | postcss@8.4.49: 518 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 519 | engines: {node: ^10 || ^12 || >=14} 520 | 521 | publint@0.1.16: 522 | resolution: {integrity: sha512-wJgk7HnXDT5Ap0DjFYbGz78kPkN44iQvDiaq8P63IEEyNU9mYXvaMd2cAyIM6OgqXM/IA3CK6XWIsRq+wjNpgw==} 523 | engines: {node: '>=16'} 524 | hasBin: true 525 | 526 | readdirp@4.0.2: 527 | resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 528 | engines: {node: '>= 14.16.0'} 529 | 530 | rollup@4.27.0: 531 | resolution: {integrity: sha512-nrOD/RrnAMssruS7bPa7MYpEuH6tUpOa43NLtxQiLKem0An8HZyXun5Ndig6JzbkJoIbaKkt85V67VCaQ59GyA==} 532 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 533 | hasBin: true 534 | 535 | sade@1.8.1: 536 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 537 | engines: {node: '>=6'} 538 | 539 | semver@7.5.4: 540 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 541 | engines: {node: '>=10'} 542 | hasBin: true 543 | 544 | set-cookie-parser@2.6.0: 545 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 546 | 547 | shiki@1.1.7: 548 | resolution: {integrity: sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw==} 549 | 550 | sirv@3.0.0: 551 | resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} 552 | engines: {node: '>=18'} 553 | 554 | source-map-js@1.2.1: 555 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 556 | engines: {node: '>=0.10.0'} 557 | 558 | svelte-check@4.0.7: 559 | resolution: {integrity: sha512-24hwo+D5L35HOXsh3Z2sU4WhdDLavlHquYaJhrEqAt+mV1xOVzoMVYThW80n99osDJxyuH+vxjNFkNRL4EvwTg==} 560 | engines: {node: '>= 18.0.0'} 561 | hasBin: true 562 | peerDependencies: 563 | svelte: ^4.0.0 || ^5.0.0-next.0 564 | typescript: '>=5.0.0' 565 | 566 | svelte2tsx@0.7.25: 567 | resolution: {integrity: sha512-P47YhXv8TRNv9IFJOjKQmXsYErZkJavbixazpSTyaGqKBGm9kRZRGcr3HBHNrYkCikzISQlh55j24yS23MdTPA==} 568 | peerDependencies: 569 | svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 570 | typescript: ^4.9.4 || ^5.0.0 571 | 572 | svelte@5.2.0: 573 | resolution: {integrity: sha512-LOowFhMB0CoTzDsa90snaICFMftrxKlYsOhH4YP1AamjCSDBZvtDq0yB5QY8LJA1tFftcmpAhmLCK/gAOFNrtw==} 574 | engines: {node: '>=18'} 575 | 576 | tiny-glob@0.2.9: 577 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 578 | 579 | totalist@3.0.1: 580 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 581 | engines: {node: '>=6'} 582 | 583 | tslib@2.6.1: 584 | resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} 585 | 586 | typescript@5.6.3: 587 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 588 | engines: {node: '>=14.17'} 589 | hasBin: true 590 | 591 | vite@5.4.11: 592 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 593 | engines: {node: ^18.0.0 || >=20.0.0} 594 | hasBin: true 595 | peerDependencies: 596 | '@types/node': ^18.0.0 || >=20.0.0 597 | less: '*' 598 | lightningcss: ^1.21.0 599 | sass: '*' 600 | sass-embedded: '*' 601 | stylus: '*' 602 | sugarss: '*' 603 | terser: ^5.4.0 604 | peerDependenciesMeta: 605 | '@types/node': 606 | optional: true 607 | less: 608 | optional: true 609 | lightningcss: 610 | optional: true 611 | sass: 612 | optional: true 613 | sass-embedded: 614 | optional: true 615 | stylus: 616 | optional: true 617 | sugarss: 618 | optional: true 619 | terser: 620 | optional: true 621 | 622 | vitefu@1.0.3: 623 | resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} 624 | peerDependencies: 625 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 626 | peerDependenciesMeta: 627 | vite: 628 | optional: true 629 | 630 | wrappy@1.0.2: 631 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 632 | 633 | yallist@4.0.0: 634 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 635 | 636 | zimmerframe@1.1.2: 637 | resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} 638 | 639 | snapshots: 640 | 641 | '@ampproject/remapping@2.3.0': 642 | dependencies: 643 | '@jridgewell/gen-mapping': 0.3.5 644 | '@jridgewell/trace-mapping': 0.3.25 645 | 646 | '@esbuild/aix-ppc64@0.21.5': 647 | optional: true 648 | 649 | '@esbuild/android-arm64@0.21.5': 650 | optional: true 651 | 652 | '@esbuild/android-arm@0.21.5': 653 | optional: true 654 | 655 | '@esbuild/android-x64@0.21.5': 656 | optional: true 657 | 658 | '@esbuild/darwin-arm64@0.21.5': 659 | optional: true 660 | 661 | '@esbuild/darwin-x64@0.21.5': 662 | optional: true 663 | 664 | '@esbuild/freebsd-arm64@0.21.5': 665 | optional: true 666 | 667 | '@esbuild/freebsd-x64@0.21.5': 668 | optional: true 669 | 670 | '@esbuild/linux-arm64@0.21.5': 671 | optional: true 672 | 673 | '@esbuild/linux-arm@0.21.5': 674 | optional: true 675 | 676 | '@esbuild/linux-ia32@0.21.5': 677 | optional: true 678 | 679 | '@esbuild/linux-loong64@0.21.5': 680 | optional: true 681 | 682 | '@esbuild/linux-mips64el@0.21.5': 683 | optional: true 684 | 685 | '@esbuild/linux-ppc64@0.21.5': 686 | optional: true 687 | 688 | '@esbuild/linux-riscv64@0.21.5': 689 | optional: true 690 | 691 | '@esbuild/linux-s390x@0.21.5': 692 | optional: true 693 | 694 | '@esbuild/linux-x64@0.21.5': 695 | optional: true 696 | 697 | '@esbuild/netbsd-x64@0.21.5': 698 | optional: true 699 | 700 | '@esbuild/openbsd-x64@0.21.5': 701 | optional: true 702 | 703 | '@esbuild/sunos-x64@0.21.5': 704 | optional: true 705 | 706 | '@esbuild/win32-arm64@0.21.5': 707 | optional: true 708 | 709 | '@esbuild/win32-ia32@0.21.5': 710 | optional: true 711 | 712 | '@esbuild/win32-x64@0.21.5': 713 | optional: true 714 | 715 | '@jridgewell/gen-mapping@0.3.5': 716 | dependencies: 717 | '@jridgewell/set-array': 1.2.1 718 | '@jridgewell/sourcemap-codec': 1.5.0 719 | '@jridgewell/trace-mapping': 0.3.25 720 | 721 | '@jridgewell/resolve-uri@3.1.1': {} 722 | 723 | '@jridgewell/set-array@1.2.1': {} 724 | 725 | '@jridgewell/sourcemap-codec@1.4.15': {} 726 | 727 | '@jridgewell/sourcemap-codec@1.5.0': {} 728 | 729 | '@jridgewell/trace-mapping@0.3.25': 730 | dependencies: 731 | '@jridgewell/resolve-uri': 3.1.1 732 | '@jridgewell/sourcemap-codec': 1.4.15 733 | 734 | '@polka/url@1.0.0-next.28': {} 735 | 736 | '@rollup/rollup-android-arm-eabi@4.27.0': 737 | optional: true 738 | 739 | '@rollup/rollup-android-arm64@4.27.0': 740 | optional: true 741 | 742 | '@rollup/rollup-darwin-arm64@4.27.0': 743 | optional: true 744 | 745 | '@rollup/rollup-darwin-x64@4.27.0': 746 | optional: true 747 | 748 | '@rollup/rollup-freebsd-arm64@4.27.0': 749 | optional: true 750 | 751 | '@rollup/rollup-freebsd-x64@4.27.0': 752 | optional: true 753 | 754 | '@rollup/rollup-linux-arm-gnueabihf@4.27.0': 755 | optional: true 756 | 757 | '@rollup/rollup-linux-arm-musleabihf@4.27.0': 758 | optional: true 759 | 760 | '@rollup/rollup-linux-arm64-gnu@4.27.0': 761 | optional: true 762 | 763 | '@rollup/rollup-linux-arm64-musl@4.27.0': 764 | optional: true 765 | 766 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.0': 767 | optional: true 768 | 769 | '@rollup/rollup-linux-riscv64-gnu@4.27.0': 770 | optional: true 771 | 772 | '@rollup/rollup-linux-s390x-gnu@4.27.0': 773 | optional: true 774 | 775 | '@rollup/rollup-linux-x64-gnu@4.27.0': 776 | optional: true 777 | 778 | '@rollup/rollup-linux-x64-musl@4.27.0': 779 | optional: true 780 | 781 | '@rollup/rollup-win32-arm64-msvc@4.27.0': 782 | optional: true 783 | 784 | '@rollup/rollup-win32-ia32-msvc@4.27.0': 785 | optional: true 786 | 787 | '@rollup/rollup-win32-x64-msvc@4.27.0': 788 | optional: true 789 | 790 | '@shikijs/core@1.1.7': {} 791 | 792 | '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11))': 793 | dependencies: 794 | '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11) 795 | import-meta-resolve: 4.1.0 796 | 797 | '@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11)': 798 | dependencies: 799 | '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.2.0)(vite@5.4.11) 800 | '@types/cookie': 0.6.0 801 | cookie: 0.6.0 802 | devalue: 5.1.1 803 | esm-env: 1.0.0 804 | import-meta-resolve: 4.1.0 805 | kleur: 4.1.5 806 | magic-string: 0.30.12 807 | mrmime: 2.0.0 808 | sade: 1.8.1 809 | set-cookie-parser: 2.6.0 810 | sirv: 3.0.0 811 | svelte: 5.2.0 812 | tiny-glob: 0.2.9 813 | vite: 5.4.11 814 | 815 | '@sveltejs/package@2.3.7(svelte@5.2.0)(typescript@5.6.3)': 816 | dependencies: 817 | chokidar: 4.0.1 818 | kleur: 4.1.5 819 | sade: 1.8.1 820 | semver: 7.5.4 821 | svelte: 5.2.0 822 | svelte2tsx: 0.7.25(svelte@5.2.0)(typescript@5.6.3) 823 | transitivePeerDependencies: 824 | - typescript 825 | 826 | '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11)': 827 | dependencies: 828 | '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.2.0)(vite@5.4.11) 829 | debug: 4.3.7 830 | svelte: 5.2.0 831 | vite: 5.4.11 832 | transitivePeerDependencies: 833 | - supports-color 834 | 835 | '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11)': 836 | dependencies: 837 | '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.2.0)(vite@5.4.11))(svelte@5.2.0)(vite@5.4.11) 838 | debug: 4.3.7 839 | deepmerge: 4.3.1 840 | kleur: 4.1.5 841 | magic-string: 0.30.12 842 | svelte: 5.2.0 843 | vite: 5.4.11 844 | vitefu: 1.0.3(vite@5.4.11) 845 | transitivePeerDependencies: 846 | - supports-color 847 | 848 | '@types/cookie@0.6.0': {} 849 | 850 | '@types/estree@1.0.6': {} 851 | 852 | acorn-typescript@1.4.13(acorn@8.14.0): 853 | dependencies: 854 | acorn: 8.14.0 855 | 856 | acorn@8.14.0: {} 857 | 858 | aria-query@5.3.2: {} 859 | 860 | axobject-query@4.1.0: {} 861 | 862 | balanced-match@1.0.2: {} 863 | 864 | brace-expansion@2.0.1: 865 | dependencies: 866 | balanced-match: 1.0.2 867 | 868 | chokidar@4.0.1: 869 | dependencies: 870 | readdirp: 4.0.2 871 | 872 | cookie@0.6.0: {} 873 | 874 | debug@4.3.7: 875 | dependencies: 876 | ms: 2.1.3 877 | 878 | dedent-js@1.0.1: {} 879 | 880 | deepmerge@4.3.1: {} 881 | 882 | devalue@5.1.1: {} 883 | 884 | esbuild@0.21.5: 885 | optionalDependencies: 886 | '@esbuild/aix-ppc64': 0.21.5 887 | '@esbuild/android-arm': 0.21.5 888 | '@esbuild/android-arm64': 0.21.5 889 | '@esbuild/android-x64': 0.21.5 890 | '@esbuild/darwin-arm64': 0.21.5 891 | '@esbuild/darwin-x64': 0.21.5 892 | '@esbuild/freebsd-arm64': 0.21.5 893 | '@esbuild/freebsd-x64': 0.21.5 894 | '@esbuild/linux-arm': 0.21.5 895 | '@esbuild/linux-arm64': 0.21.5 896 | '@esbuild/linux-ia32': 0.21.5 897 | '@esbuild/linux-loong64': 0.21.5 898 | '@esbuild/linux-mips64el': 0.21.5 899 | '@esbuild/linux-ppc64': 0.21.5 900 | '@esbuild/linux-riscv64': 0.21.5 901 | '@esbuild/linux-s390x': 0.21.5 902 | '@esbuild/linux-x64': 0.21.5 903 | '@esbuild/netbsd-x64': 0.21.5 904 | '@esbuild/openbsd-x64': 0.21.5 905 | '@esbuild/sunos-x64': 0.21.5 906 | '@esbuild/win32-arm64': 0.21.5 907 | '@esbuild/win32-ia32': 0.21.5 908 | '@esbuild/win32-x64': 0.21.5 909 | 910 | esm-env@1.0.0: {} 911 | 912 | esrap@1.2.2: 913 | dependencies: 914 | '@jridgewell/sourcemap-codec': 1.5.0 915 | '@types/estree': 1.0.6 916 | 917 | fdir@6.4.2: {} 918 | 919 | fs.realpath@1.0.0: {} 920 | 921 | fsevents@2.3.3: 922 | optional: true 923 | 924 | glob@8.1.0: 925 | dependencies: 926 | fs.realpath: 1.0.0 927 | inflight: 1.0.6 928 | inherits: 2.0.4 929 | minimatch: 5.1.6 930 | once: 1.4.0 931 | 932 | globalyzer@0.1.0: {} 933 | 934 | globrex@0.1.2: {} 935 | 936 | ignore-walk@5.0.1: 937 | dependencies: 938 | minimatch: 5.1.6 939 | 940 | import-meta-resolve@4.1.0: {} 941 | 942 | inflight@1.0.6: 943 | dependencies: 944 | once: 1.4.0 945 | wrappy: 1.0.2 946 | 947 | inherits@2.0.4: {} 948 | 949 | is-reference@3.0.3: 950 | dependencies: 951 | '@types/estree': 1.0.6 952 | 953 | kleur@4.1.5: {} 954 | 955 | locate-character@3.0.0: {} 956 | 957 | lower-case@2.0.2: 958 | dependencies: 959 | tslib: 2.6.1 960 | 961 | lru-cache@6.0.0: 962 | dependencies: 963 | yallist: 4.0.0 964 | 965 | magic-string@0.30.12: 966 | dependencies: 967 | '@jridgewell/sourcemap-codec': 1.5.0 968 | 969 | minimatch@5.1.6: 970 | dependencies: 971 | brace-expansion: 2.0.1 972 | 973 | mri@1.2.0: {} 974 | 975 | mrmime@2.0.0: {} 976 | 977 | ms@2.1.3: {} 978 | 979 | nanoid@3.3.7: {} 980 | 981 | no-case@3.0.4: 982 | dependencies: 983 | lower-case: 2.0.2 984 | tslib: 2.6.1 985 | 986 | npm-bundled@2.0.1: 987 | dependencies: 988 | npm-normalize-package-bin: 2.0.0 989 | 990 | npm-normalize-package-bin@2.0.0: {} 991 | 992 | npm-packlist@5.1.3: 993 | dependencies: 994 | glob: 8.1.0 995 | ignore-walk: 5.0.1 996 | npm-bundled: 2.0.1 997 | npm-normalize-package-bin: 2.0.0 998 | 999 | once@1.4.0: 1000 | dependencies: 1001 | wrappy: 1.0.2 1002 | 1003 | pascal-case@3.1.2: 1004 | dependencies: 1005 | no-case: 3.0.4 1006 | tslib: 2.6.1 1007 | 1008 | picocolors@1.0.0: {} 1009 | 1010 | picocolors@1.1.1: {} 1011 | 1012 | postcss@8.4.49: 1013 | dependencies: 1014 | nanoid: 3.3.7 1015 | picocolors: 1.1.1 1016 | source-map-js: 1.2.1 1017 | 1018 | publint@0.1.16: 1019 | dependencies: 1020 | npm-packlist: 5.1.3 1021 | picocolors: 1.0.0 1022 | sade: 1.8.1 1023 | 1024 | readdirp@4.0.2: {} 1025 | 1026 | rollup@4.27.0: 1027 | dependencies: 1028 | '@types/estree': 1.0.6 1029 | optionalDependencies: 1030 | '@rollup/rollup-android-arm-eabi': 4.27.0 1031 | '@rollup/rollup-android-arm64': 4.27.0 1032 | '@rollup/rollup-darwin-arm64': 4.27.0 1033 | '@rollup/rollup-darwin-x64': 4.27.0 1034 | '@rollup/rollup-freebsd-arm64': 4.27.0 1035 | '@rollup/rollup-freebsd-x64': 4.27.0 1036 | '@rollup/rollup-linux-arm-gnueabihf': 4.27.0 1037 | '@rollup/rollup-linux-arm-musleabihf': 4.27.0 1038 | '@rollup/rollup-linux-arm64-gnu': 4.27.0 1039 | '@rollup/rollup-linux-arm64-musl': 4.27.0 1040 | '@rollup/rollup-linux-powerpc64le-gnu': 4.27.0 1041 | '@rollup/rollup-linux-riscv64-gnu': 4.27.0 1042 | '@rollup/rollup-linux-s390x-gnu': 4.27.0 1043 | '@rollup/rollup-linux-x64-gnu': 4.27.0 1044 | '@rollup/rollup-linux-x64-musl': 4.27.0 1045 | '@rollup/rollup-win32-arm64-msvc': 4.27.0 1046 | '@rollup/rollup-win32-ia32-msvc': 4.27.0 1047 | '@rollup/rollup-win32-x64-msvc': 4.27.0 1048 | fsevents: 2.3.3 1049 | 1050 | sade@1.8.1: 1051 | dependencies: 1052 | mri: 1.2.0 1053 | 1054 | semver@7.5.4: 1055 | dependencies: 1056 | lru-cache: 6.0.0 1057 | 1058 | set-cookie-parser@2.6.0: {} 1059 | 1060 | shiki@1.1.7: 1061 | dependencies: 1062 | '@shikijs/core': 1.1.7 1063 | 1064 | sirv@3.0.0: 1065 | dependencies: 1066 | '@polka/url': 1.0.0-next.28 1067 | mrmime: 2.0.0 1068 | totalist: 3.0.1 1069 | 1070 | source-map-js@1.2.1: {} 1071 | 1072 | svelte-check@4.0.7(svelte@5.2.0)(typescript@5.6.3): 1073 | dependencies: 1074 | '@jridgewell/trace-mapping': 0.3.25 1075 | chokidar: 4.0.1 1076 | fdir: 6.4.2 1077 | picocolors: 1.0.0 1078 | sade: 1.8.1 1079 | svelte: 5.2.0 1080 | typescript: 5.6.3 1081 | transitivePeerDependencies: 1082 | - picomatch 1083 | 1084 | svelte2tsx@0.7.25(svelte@5.2.0)(typescript@5.6.3): 1085 | dependencies: 1086 | dedent-js: 1.0.1 1087 | pascal-case: 3.1.2 1088 | svelte: 5.2.0 1089 | typescript: 5.6.3 1090 | 1091 | svelte@5.2.0: 1092 | dependencies: 1093 | '@ampproject/remapping': 2.3.0 1094 | '@jridgewell/sourcemap-codec': 1.5.0 1095 | '@types/estree': 1.0.6 1096 | acorn: 8.14.0 1097 | acorn-typescript: 1.4.13(acorn@8.14.0) 1098 | aria-query: 5.3.2 1099 | axobject-query: 4.1.0 1100 | esm-env: 1.0.0 1101 | esrap: 1.2.2 1102 | is-reference: 3.0.3 1103 | locate-character: 3.0.0 1104 | magic-string: 0.30.12 1105 | zimmerframe: 1.1.2 1106 | 1107 | tiny-glob@0.2.9: 1108 | dependencies: 1109 | globalyzer: 0.1.0 1110 | globrex: 0.1.2 1111 | 1112 | totalist@3.0.1: {} 1113 | 1114 | tslib@2.6.1: {} 1115 | 1116 | typescript@5.6.3: {} 1117 | 1118 | vite@5.4.11: 1119 | dependencies: 1120 | esbuild: 0.21.5 1121 | postcss: 8.4.49 1122 | rollup: 4.27.0 1123 | optionalDependencies: 1124 | fsevents: 2.3.3 1125 | 1126 | vitefu@1.0.3(vite@5.4.11): 1127 | optionalDependencies: 1128 | vite: 5.4.11 1129 | 1130 | wrappy@1.0.2: {} 1131 | 1132 | yallist@4.0.0: {} 1133 | 1134 | zimmerframe@1.1.2: {} 1135 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | %sveltekit.head% 7 | Svelte ripple action - posandu.com 8 | 9 | 10 | 11 | 12 | 16 | 20 | 24 | 25 | 26 |
%sveltekit.body%
27 | 28 | 29 | -------------------------------------------------------------------------------- /src/lib/constants.ts: -------------------------------------------------------------------------------- 1 | const INEVENTS = ["pointerdown", "touchstart"]; 2 | const OUTEVENTS = [ 3 | "pointerup", 4 | "mouseleave", 5 | "dragleave", 6 | "touchmove", 7 | "touchend", 8 | "touchcancel", 9 | ]; 10 | 11 | const ATTR_NAME = "svelte-ripple-effect-ready"; 12 | const ATTR_CENTER_NAME = "ripple-center"; 13 | 14 | export interface RippleOptions { 15 | center?: boolean; 16 | color?: string; 17 | /** 18 | * Duration in seconds 19 | */ 20 | duration?: number; 21 | /** 22 | * Max width of the ripple 23 | */ 24 | maxRadius?: number; 25 | /** 26 | * If true, ripple will not be shown 27 | */ 28 | disabled?: boolean; 29 | } 30 | 31 | const addEvent = ( 32 | el: HTMLElement, 33 | event: string, 34 | callback: (...args: any[]) => void 35 | ) => { 36 | el.addEventListener(event, callback); 37 | }; 38 | 39 | const removeEvent = ( 40 | el: HTMLElement, 41 | event: string, 42 | callback: (...args: any[]) => void 43 | ) => { 44 | el.removeEventListener(event, callback); 45 | }; 46 | 47 | const findFurthestPoint = ( 48 | clickPointX: number, 49 | elementWidth: number, 50 | offsetX: number, 51 | clickPointY: number, 52 | elementHeight: number, 53 | offsetY: number 54 | ) => { 55 | const x = clickPointX - offsetX > elementWidth / 2 ? 0 : elementWidth; 56 | const y = clickPointY - offsetY > elementHeight / 2 ? 0 : elementHeight; 57 | const d = Math.hypot( 58 | x - (clickPointX - offsetX), 59 | y - (clickPointY - offsetY) 60 | ); 61 | 62 | return d; 63 | }; 64 | 65 | export { 66 | INEVENTS, 67 | OUTEVENTS, 68 | ATTR_NAME, 69 | ATTR_CENTER_NAME, 70 | addEvent, 71 | removeEvent, 72 | findFurthestPoint, 73 | }; 74 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { ripple } from "./ripple.js"; 2 | -------------------------------------------------------------------------------- /src/lib/ripple.css: -------------------------------------------------------------------------------- 1 | [svelte-ripple-effect-ready] { 2 | position: relative; 3 | overflow: hidden; 4 | } 5 | 6 | [svelte-ripple-effect-ready] .ripple { 7 | background-color: var(--ripple-color, color-mix(in srgb, currentColor 28%, transparent)); 8 | position: absolute; 9 | border-radius: 50%; 10 | pointer-events: none; 11 | -webkit-transform: translate3d(0, 0, 0); 12 | transform: translate3d(0, 0, 0); 13 | -webkit-transition: opacity .6s; 14 | transition: opacity .6s; 15 | -webkit-animation: ripple var(--ripple-duration, 0.4s) cubic-bezier(0.4, 0, 0.2, 1); 16 | animation: ripple var(--ripple-duration, 0.4s) cubic-bezier(0.4, 0, 0.2, 1); 17 | } 18 | 19 | [svelte-ripple-effect-ready][ripple-center] .ripple { 20 | top: 50% !important; 21 | left: 50% !important; 22 | translate: -50% -50% !important; 23 | -webkit-animation: ripple var(--ripple-duration, 0.6s) cubic-bezier(0.4, 0, 0.2, 1); 24 | animation: ripple var(--ripple-duration, 0.6s) cubic-bezier(0.4, 0, 0.2, 1); 25 | } 26 | 27 | @keyframes ripple { 28 | from { 29 | -webkit-transform: scale(0); 30 | transform: scale(0); 31 | } 32 | 33 | to { 34 | -webkit-transform: scale(1); 35 | transform: scale(1); 36 | } 37 | } -------------------------------------------------------------------------------- /src/lib/ripple.ts: -------------------------------------------------------------------------------- 1 | import type { RippleOptions } from "./constants.js"; 2 | import { 3 | INEVENTS, 4 | OUTEVENTS, 5 | ATTR_NAME, 6 | ATTR_CENTER_NAME, 7 | addEvent, 8 | removeEvent, 9 | findFurthestPoint, 10 | } from "./constants"; 11 | import { onMount } from "svelte"; 12 | 13 | function ripple(el: HTMLElement, options?: RippleOptions) { 14 | const addClassIfMissing = () => { 15 | if (!el.getAttribute(ATTR_NAME)) { 16 | el.setAttribute(ATTR_NAME, ""); 17 | } 18 | 19 | if (options?.center) { 20 | el.setAttribute(ATTR_CENTER_NAME, ""); 21 | } else { 22 | el.removeAttribute(ATTR_CENTER_NAME); 23 | } 24 | }; 25 | 26 | onMount(() => { 27 | addClassIfMissing(); 28 | }); 29 | 30 | let maximumRadius = 0; 31 | 32 | const setOptions = (options: RippleOptions) => { 33 | /** 34 | * Add custom --ripple-color if set 35 | */ 36 | if (options?.color) { 37 | el.style.setProperty("--ripple-color", options.color); 38 | } 39 | 40 | /** 41 | * Add custom --ripple-duration if set 42 | */ 43 | if (options?.duration) { 44 | el.style.setProperty("--ripple-duration", options.duration + "s"); 45 | } 46 | 47 | /** 48 | * If maxWidth is set 49 | */ 50 | if (options?.maxRadius) { 51 | maximumRadius = options.maxRadius; 52 | } 53 | }; 54 | 55 | setOptions(options); 56 | 57 | const createRipple = (e: PointerEvent) => { 58 | if (options?.disabled) return; 59 | 60 | e.stopPropagation(); 61 | 62 | addClassIfMissing(); 63 | 64 | const rect = el.getBoundingClientRect(); 65 | const radius = findFurthestPoint( 66 | e.clientX, 67 | el.offsetWidth, 68 | rect.left, 69 | e.clientY, 70 | el.offsetHeight, 71 | rect.top 72 | ); 73 | 74 | const ripple = document.createElement("div"); 75 | ripple.classList.add("ripple"); 76 | 77 | let size = radius * 2; 78 | let top = e.clientY - rect.top - radius; 79 | let left = e.clientX - rect.left - radius; 80 | 81 | if (maximumRadius && size > maximumRadius) { 82 | size = maximumRadius * 2; 83 | top = e.clientY - rect.top - maximumRadius; 84 | left = e.clientX - rect.left - maximumRadius; 85 | } 86 | 87 | ripple.style.left = left + "px"; 88 | ripple.style.top = top + "px"; 89 | 90 | ripple.style.width = ripple.style.height = size + "px"; 91 | 92 | el.appendChild(ripple); 93 | 94 | const removeRipple = () => { 95 | const timeOutDuration = options?.duration 96 | ? options.duration * 1000 97 | : 1000; 98 | 99 | if (ripple !== null) { 100 | setTimeout(() => { 101 | ripple.style.opacity = "0"; 102 | }, timeOutDuration / 4); 103 | 104 | setTimeout(() => { 105 | ripple.remove(); 106 | }, timeOutDuration); 107 | } 108 | }; 109 | 110 | OUTEVENTS.forEach((event) => { 111 | addEvent(el, event, removeRipple); 112 | }); 113 | }; 114 | 115 | INEVENTS.forEach((event) => { 116 | addEvent(el, event, createRipple); 117 | }); 118 | 119 | return { 120 | destroy: () => { 121 | INEVENTS.forEach((event) => { 122 | removeEvent(el, event, createRipple); 123 | }); 124 | }, 125 | update: (newOptions: RippleOptions) => { 126 | options = newOptions; 127 | 128 | setOptions(newOptions); 129 | }, 130 | }; 131 | } 132 | 133 | export { ripple }; 134 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 42 | 43 |
51 | 52 | 53 |

Svelte ripple action

54 | 55 |

Svelte directive for a ripple effect

56 | 57 | 58 | 59 |

60 | 65 | 69 | 70 | 71 | 76 | 80 | 81 | 82 | 87 | GitHub Repo stars 91 | 92 |

93 |
94 | 95 |
96 |
97 |

Installation

98 | 99 |

Install the package from npm

100 | 101 | 102 | 103 |
104 | 105 |

Is this compatible with Svelte 5?

106 | 107 |

Yep, versions 2.0.0 onwards support Svelte 5

108 |
109 | 110 |
111 |

Usage

112 | 113 |

114 | Import the base styles inside the root of your app 115 |

116 | 117 | `} 119 | /> 120 | 121 |

Use the directive in your components

122 | 123 | \n\n`} 125 | /> 126 | 127 | 133 |
134 |
135 | 136 |
137 |
138 |

Options

139 | 140 |

141 | You can pass an object to the directive to customize the ripple effect 142 |

143 | 144 |
145 |
146 | color?: string 149 | 150 |
151 | 152 | 159 |
160 | 161 |
162 |
163 | duration?: number 166 | 169 |
170 | 171 | 178 |
179 | 180 |
181 |
182 | maxRadius?: number 185 | 188 |
189 | 190 | 197 |
198 | 199 |
203 |
204 | center?: boolean 207 | 210 |
211 | 212 | 219 |
220 | 221 |
228 |
229 | disabled?: boolean 232 | 235 |
236 | 237 | 244 |
245 |
246 | 247 |
248 |

Preview

249 | 250 |
251 | 264 |
265 | 266 | {#key customizeOptions} 267 | 281 | Click me 282 | `} 283 | /> 284 | {/key} 285 |
286 |
287 | 288 |
289 |

Other examples

290 | 291 | 292 |
293 | 294 | 298 | 299 | 480 | -------------------------------------------------------------------------------- /src/routes/+page.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /src/routes/CodeBlock.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | {#await html} 17 |
{code}
19 | {:then html} 20 | {@html html} 21 | {/await} 22 | -------------------------------------------------------------------------------- /src/routes/Examples.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
Image ripple
8 |
Gradient ripple
9 | 10 |
11 |
12 | 13 |

Needs to be wrapped in a div for void elements like img, input, etc.

14 | 15 |
16 | Man dancing 20 |
21 | 22 |
27 | 28 |
29 | 30 |

31 | 32 | 33 | 34 | 75 | -------------------------------------------------------------------------------- /src/routes/app.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ress.css • v4.0.0 3 | * MIT License 4 | * github.com/filipelinhares/ress 5 | */ 6 | html { 7 | box-sizing: border-box; 8 | -webkit-text-size-adjust: 100%; 9 | word-break: normal; 10 | -moz-tab-size: 4; 11 | tab-size: 4; 12 | font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; 13 | } 14 | *, 15 | :after, 16 | :before { 17 | background-repeat: no-repeat; 18 | box-sizing: inherit; 19 | font-family: inherit; 20 | } 21 | :after, 22 | :before { 23 | text-decoration: inherit; 24 | vertical-align: inherit; 25 | } 26 | * { 27 | padding: 0; 28 | margin: 0; 29 | } 30 | hr { 31 | overflow: visible; 32 | height: 0; 33 | color: inherit; 34 | } 35 | details, 36 | main { 37 | display: block; 38 | } 39 | summary { 40 | display: list-item; 41 | } 42 | small { 43 | font-size: 80%; 44 | } 45 | [hidden] { 46 | display: none; 47 | } 48 | abbr[title] { 49 | border-bottom: none; 50 | text-decoration: underline; 51 | text-decoration: underline dotted; 52 | } 53 | a { 54 | background-color: transparent; 55 | } 56 | a:active, 57 | a:hover { 58 | outline-width: 0; 59 | } 60 | code, 61 | kbd, 62 | pre, 63 | samp { 64 | font-family: monospace, monospace; 65 | } 66 | pre { 67 | font-size: 1em; 68 | } 69 | b, 70 | strong { 71 | font-weight: bolder; 72 | } 73 | sub, 74 | sup { 75 | font-size: 75%; 76 | line-height: 0; 77 | position: relative; 78 | vertical-align: baseline; 79 | } 80 | sub { 81 | bottom: -0.25em; 82 | } 83 | sup { 84 | top: -0.5em; 85 | } 86 | table { 87 | border-color: inherit; 88 | text-indent: 0; 89 | } 90 | input { 91 | border-radius: 0; 92 | } 93 | [disabled] { 94 | cursor: default; 95 | } 96 | [type="number"]::-webkit-inner-spin-button, 97 | [type="number"]::-webkit-outer-spin-button { 98 | height: auto; 99 | } 100 | [type="search"] { 101 | -webkit-appearance: textfield; 102 | outline-offset: -2px; 103 | } 104 | [type="search"]::-webkit-search-decoration { 105 | -webkit-appearance: none; 106 | } 107 | textarea { 108 | overflow: auto; 109 | resize: vertical; 110 | } 111 | button, 112 | input, 113 | optgroup, 114 | select, 115 | textarea { 116 | font: inherit; 117 | } 118 | optgroup { 119 | font-weight: 700; 120 | } 121 | button { 122 | overflow: visible; 123 | } 124 | button, 125 | select { 126 | text-transform: none; 127 | } 128 | [role="button"], 129 | [type="button"], 130 | [type="reset"], 131 | [type="submit"], 132 | button { 133 | cursor: pointer; 134 | color: inherit; 135 | } 136 | [type="button"]::-moz-focus-inner, 137 | [type="reset"]::-moz-focus-inner, 138 | [type="submit"]::-moz-focus-inner, 139 | button::-moz-focus-inner { 140 | border-style: none; 141 | padding: 0; 142 | } 143 | [type="button"]::-moz-focus-inner, 144 | [type="reset"]::-moz-focus-inner, 145 | [type="submit"]::-moz-focus-inner, 146 | button:-moz-focusring { 147 | outline: 1px dotted ButtonText; 148 | } 149 | [type="reset"], 150 | [type="submit"], 151 | button, 152 | html [type="button"] { 153 | -webkit-appearance: button; 154 | } 155 | button, 156 | input, 157 | select, 158 | textarea { 159 | background-color: transparent; 160 | border-style: none; 161 | } 162 | a:focus, 163 | button:focus, 164 | input:focus, 165 | select:focus, 166 | textarea:focus { 167 | outline-width: 0; 168 | } 169 | select { 170 | -moz-appearance: none; 171 | -webkit-appearance: none; 172 | } 173 | select::-ms-expand { 174 | display: none; 175 | } 176 | select::-ms-value { 177 | color: currentColor; 178 | } 179 | legend { 180 | border: 0; 181 | color: inherit; 182 | display: table; 183 | white-space: normal; 184 | max-width: 100%; 185 | } 186 | ::-webkit-file-upload-button { 187 | -webkit-appearance: button; 188 | color: inherit; 189 | font: inherit; 190 | } 191 | img { 192 | border-style: none; 193 | } 194 | progress { 195 | vertical-align: baseline; 196 | } 197 | [aria-busy="true"] { 198 | cursor: progress; 199 | } 200 | [aria-controls] { 201 | cursor: pointer; 202 | } 203 | [aria-disabled="true"] { 204 | cursor: default; 205 | } 206 | 207 | pre { 208 | white-space: pre-wrap; /* css-3 */ 209 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 210 | white-space: -pre-wrap; /* Opera 4-6 */ 211 | white-space: -o-pre-wrap; /* Opera 7 */ 212 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 213 | } 214 | -------------------------------------------------------------------------------- /src/routes/example.ts: -------------------------------------------------------------------------------- 1 | const SCRIPT = `script>`; 2 | const CODE = `<${SCRIPT} 3 | import { ripple } from "svelte-ripple-action"; 4 | Image ripple 7 |
Gradient ripple
8 | 9 |
10 |
11 | 12 |

Needs to be wrapped in a div for void elements like img, input, etc.

13 | 14 |
15 | Man dancing 19 |
20 | 21 |
26 | 27 |
28 | 29 | 74 | `; 75 | 76 | export { CODE }; 77 | -------------------------------------------------------------------------------- /static/logo-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Posandu/svelte-ripple-action/9282f3f85b97b7ea5be0f72a72f20a35132f5628/static/logo-large.png -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Posandu/svelte-ripple-action/9282f3f85b97b7ea5be0f72a72f20a35132f5628/static/logo.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true 11 | }, 12 | "moduleResolution": "NodeNext" 13 | } 14 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | --------------------------------------------------------------------------------