├── .eslintrc ├── .gitignore ├── .prettierrc ├── CONTRIBUTION_GUIDE.md ├── LICENSE.md ├── README.md ├── package.json ├── page-gen.js ├── postcss.config.cjs ├── src ├── app.css ├── app.d.ts ├── app.html ├── index.test.ts ├── lib │ ├── actions │ │ ├── alertAction │ │ │ ├── Alert.ts │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── clickOutsideAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── clickToCopyAction │ │ │ ├── Clipboard.ts │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── confettiAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── debounceClickAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── documentTitleAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── draggableAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── dropAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── eyeDropperAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── focusAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── fullScreenAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── hotKeyAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── hoverAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── infiniteScrollAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── lazyLoadImageAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── loadingAction │ │ │ ├── Loader.ts │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── longPressAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── messageAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── notifyAction │ │ │ ├── Notification.ts │ │ │ ├── NotificationManager.ts │ │ │ ├── demo.svelte │ │ │ ├── icons │ │ │ │ ├── cross.svg │ │ │ │ ├── error.svg │ │ │ │ ├── index.ts │ │ │ │ ├── info.svg │ │ │ │ ├── success.svg │ │ │ │ └── warn.svg │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── portalAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── resizableAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── scrollToBottomAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── sortableTableAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── textareaAutosizeAction │ │ │ ├── core.ts │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ └── tooltipAction │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── derivatives │ │ ├── first │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── index.ts │ │ ├── pick │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── pickArray │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── sizeOf │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── sort │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ └── toNumber │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── index.js │ ├── middlewares │ │ ├── history │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── index.ts │ │ └── storage │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── readables │ │ └── mouseStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── shared │ │ ├── components │ │ │ ├── BooleanDisplay.svelte │ │ │ ├── DemoContainer.svelte │ │ │ ├── LoadingDots.svelte │ │ │ ├── PrimaryButton.svelte │ │ │ └── Text.svelte │ │ ├── icons │ │ │ ├── cross.svg │ │ │ ├── error.svg │ │ │ ├── index.ts │ │ │ ├── info.svg │ │ │ ├── success.svg │ │ │ └── warn.svg │ │ ├── index.ts │ │ ├── tailwind.ts │ │ └── utils │ │ │ ├── types.ts │ │ │ └── utils.ts │ ├── stores │ │ ├── activeElementStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── counterStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── cssVarStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── dateStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── documentVisibilityStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── elementBoundingStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── elementSizeStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── elementVisibilityStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── eventListenerStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── eyeDropperStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── geolocationStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── hoverStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── intervalFnStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── intervalStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── memoryStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── messagesStore │ │ │ ├── Message.ts │ │ │ ├── MessageManager.ts │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── mouseLeftPage │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── mouseStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── networkStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── onlineStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── pointerStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── rafFnStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── resizeObserverStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── scrollStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── textSelectionStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── timeoutFnStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── timeoutStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── toggleStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── windowFocusStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── windowScrollStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ └── windowSizeStore │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── transitions │ │ ├── roll │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── slide │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ └── swirl │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ ├── utilities │ │ ├── battery │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── clipboard │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── fetchWithTimeoutAndRetry │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── hasPermission │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── mediaQuery │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── parseSearchParams │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── preferredColorScheme │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── preferredContrast │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── preferredDark │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── preferredLanguages │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── preferredReduceMotion │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── reduceable │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ ├── screenOrientation │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ │ └── startViewTransition │ │ │ ├── demo.svelte │ │ │ ├── index.ts │ │ │ ├── meta.json │ │ │ └── usage.txt │ └── watchers │ │ ├── pausableWatch │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt │ │ ├── takeUntil │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt │ │ ├── takeWhile │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt │ │ ├── watch │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt │ │ ├── watchOnce │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt │ │ └── watchWithFilter │ │ ├── demo.svelte │ │ ├── index.ts │ │ ├── meta.json │ │ └── usage.txt └── routes │ ├── +error.svelte │ ├── +layout.svelte │ ├── +layout.ts │ ├── +page.server.ts │ ├── +page.svelte │ ├── DiscordIcon.svelte │ ├── Feature.svelte │ ├── GithubIcon.svelte │ ├── Header.svelte │ ├── SearchIcon.svelte │ ├── TwitterIcon.svelte │ ├── constants.ts │ ├── directories.ts │ ├── guides │ ├── +layout.server.ts │ ├── +layout.svelte │ ├── +page.svelte │ ├── MenuIcon.svelte │ ├── layout-hook.server.ts │ └── layout-hook.svelte │ ├── prism-svelte.ts │ └── search │ ├── +page.server.ts │ └── +page.svelte ├── static ├── favicon.png ├── fonts │ ├── fira-mono-latin-400.woff2 │ ├── overpass-latin-300.woff2 │ └── overpass-latin-600.woff2 ├── logo.jpg └── logo.psd ├── svelte.config.js ├── tailwind.config.cjs ├── tsconfig.json └── vite.config.ts /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["prettier", "plugin:svelte/recommended"], 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "sourceType": "module", 6 | "ecmaVersion": 2020, 7 | "extraFileExtensions": [".svelte"] 8 | }, 9 | "overrides": [ 10 | { 11 | "files": ["*.svelte"], 12 | "parser": "svelte-eslint-parser", 13 | "parserOptions": { 14 | "parser": "@typescript-eslint/parser" 15 | } 16 | } 17 | ], 18 | "ignorePatterns": [ 19 | "**/*.config.js", 20 | "**/*.config.cjs", 21 | "**/dist/**", 22 | "**/build/**", 23 | "**/.svelte-kit/**", 24 | "**/page-gen.js" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | dist 4 | test-results/ 5 | package-lock.json 6 | yarn.lock 7 | pnpm-lock.yaml 8 | vite.config.js.timestamp-* 9 | /packages/create-svelte/template/CHANGELOG.md 10 | /packages/package/test/**/package 11 | /documentation/types.js 12 | .vscode 13 | .env 14 | .vercel_build_output 15 | .svelte-kit 16 | .cloudflare 17 | .pnpm-debug.log 18 | .netlify 19 | .turbo 20 | .vercel 21 | .test-tmp 22 | symlink-from 23 | deploy.sh 24 | build 25 | package 26 | bun.lockb 27 | src/routes/guides/hooks 28 | src/routes/guides/stores 29 | src/routes/guides/actions 30 | src/routes/guides/utilities 31 | src/routes/guides/transitions 32 | src/routes/guides/middlewares 33 | src/routes/guides/derivatives 34 | src/routes/guides/watchers -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "svelteIndentScriptAndStyle": false, 3 | "printWidth": 100, 4 | "tabWidth": 2, 5 | "useTabs": true, 6 | "semi": true, 7 | "singleQuote": false, 8 | "quoteProps": "as-needed", 9 | "trailingComma": "es5", 10 | "bracketSpacing": true, 11 | "bracketSameLine": false, 12 | "arrowParens": "always", 13 | "proseWrap": "preserve", 14 | "htmlWhitespaceSensitivity": "css", 15 | "embeddedLanguageFormatting": "auto", 16 | "singleAttributePerLine": false 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Ankur Singhal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /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 | 7 | 8 | 9 | 18 | %sveltekit.head% 19 | 20 | 21 |
%sveltekit.body%
22 | 23 | 24 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest"; 2 | 3 | describe("sum test", () => { 4 | it("adds 1 + 2 to equal 3", () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /src/lib/actions/alertAction/demo.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 |
12 | 13 |
14 |
15 | 20 |
21 |
22 | -------------------------------------------------------------------------------- /src/lib/stores/elementBoundingStore/index.ts: -------------------------------------------------------------------------------- 1 | import { writableToReadable } from "$lib/shared"; 2 | import { writable, type Readable } from "svelte/store"; 3 | import { resizeObserverStore } from "../resizeObserverStore"; 4 | 5 | function getBounding(target: Element) { 6 | return target.getBoundingClientRect(); 7 | } 8 | 9 | /** 10 | * Reactive size of an HTML element. 11 | * 12 | * @param target 13 | * @param callback 14 | * @param options 15 | */ 16 | export function elementBoundingStore(target: T): Readable { 17 | const size = writable(getBounding(target)); 18 | resizeObserverStore(target, () => { 19 | size.set(getBounding(target)); 20 | }); 21 | 22 | return writableToReadable(size); 23 | } 24 | -------------------------------------------------------------------------------- /src/lib/stores/elementBoundingStore/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "Reactive element bounding" 3 | } 4 | -------------------------------------------------------------------------------- /src/lib/stores/elementBoundingStore/usage.txt: -------------------------------------------------------------------------------- 1 | 13 | 14 |
-------------------------------------------------------------------------------- /src/lib/stores/elementSizeStore/demo.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 |

Resize the box to see changes

13 |