From 86aeac8bfe198a5afa044ba58c97c272803a9572 Mon Sep 17 00:00:00 2001 From: Liam Egan Date: Sat, 18 Apr 2026 16:37:50 -0700 Subject: [PATCH 01/11] Adding flying navigation example and hamburger nav --- flying-gallery/index.html | 23 +++ package-lock.json | 4 +- src/flying-gallery/FlyingGallery.jsx | 146 +++++++++++++ src/flying-gallery/flying-gallery.module.css | 206 +++++++++++++++++++ src/flying-gallery/index.jsx | 12 ++ src/main.jsx | 2 + src/nav/HamburgerNav.jsx | 59 ++++++ src/nav/hamburger-nav.module.css | 100 +++++++++ vite.config.js | 6 + 9 files changed, 556 insertions(+), 2 deletions(-) create mode 100644 flying-gallery/index.html create mode 100644 src/flying-gallery/FlyingGallery.jsx create mode 100644 src/flying-gallery/flying-gallery.module.css create mode 100644 src/flying-gallery/index.jsx create mode 100644 src/nav/HamburgerNav.jsx create mode 100644 src/nav/hamburger-nav.module.css diff --git a/flying-gallery/index.html b/flying-gallery/index.html new file mode 100644 index 0000000..6851f82 --- /dev/null +++ b/flying-gallery/index.html @@ -0,0 +1,23 @@ + + + + + + + Flying Gallery — @wethegit/react-gallery + + + +
+ + + diff --git a/package-lock.json b/package-lock.json index 332b678..401a7dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wethegit/react-gallery", - "version": "4.0.1", + "version": "4.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wethegit/react-gallery", - "version": "4.0.1", + "version": "4.0.2", "license": "MIT", "devDependencies": { "@types/react": "~19.0.12", diff --git a/src/flying-gallery/FlyingGallery.jsx b/src/flying-gallery/FlyingGallery.jsx new file mode 100644 index 0000000..a573232 --- /dev/null +++ b/src/flying-gallery/FlyingGallery.jsx @@ -0,0 +1,146 @@ +import { + Gallery, + GalleryMain, + GalleryItem, + GalleryNav, + GalleryPagination, + GalleryPaginationItem, +} from "../lib" +import styles from "./flying-gallery.module.css" + +const ITEMS = [ + { + id: 1, + image: + "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Sun rays through a forest", + }, + { + id: 2, + image: + "https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Snow-capped mountain peak at night", + }, + { + id: 3, + image: + "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Mountain reflected in a still lake", + }, + { + id: 4, + image: + "https://images.unsplash.com/photo-1501854140801-50d01698950b?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1501854140801-50d01698950b?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Aerial view of green hills", + }, + { + id: 5, + image: + "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Orange wildflower field", + }, + { + id: 6, + image: + "https://images.unsplash.com/photo-1547234935-80c7145ec969?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1547234935-80c7145ec969?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Tropical beach with clear water", + }, +] + +export function FlyingGallery() { + return ( +
+ +
+ { + const isPrev = activeIndex > index + + return ( + +
+ {item.alt} +
+
+ ) + }} + /> + + + Previous + + + + Next + +
+ + ( + + {item.alt} + + )} + /> +
+
+ ) +} diff --git a/src/flying-gallery/flying-gallery.module.css b/src/flying-gallery/flying-gallery.module.css new file mode 100644 index 0000000..600b9d5 --- /dev/null +++ b/src/flying-gallery/flying-gallery.module.css @@ -0,0 +1,206 @@ +.root { + --perspective: 100px; + --xoffset: 600px; + --yoffset: 200px; + --rotation: 16deg; + --blur: 2px; + + background: #0a0a0f; + color: #fff; + display: flex; + flex-direction: column; + gap: 1.5rem; + min-height: 100vh; + padding: 3rem 0 2rem; + overflow: hidden; +} + +.slideArea { + position: relative; +} + +/* + * The gallery is configured with --item-width: 4px; --gap: 0, so all
  • + * elements collapse to near-zero horizontal positions. + * All visual positioning is handled here on .slide using CSS vars inherited + * from the library-managed
  • : + * + * --center-offset absolute distance from active (0, 1, 2 …) + * --duration transition speed + * + * className={styles.item} is appended to the library's class list on each
  • . + * Since this CSS module is loaded after the library's, same-specificity rules here + * win on source order.. + */ +.item { + transform: translateX(0) !important; +} + +[data-side="prev"].item { + z-index: calc(20 - var(--center-offset, 0)); +} + +.slide { + aspect-ratio: 16 / 9; + border-radius: 10px; + overflow: hidden; + position: relative; + transition: + transform var(--duration, 0.5s), + filter var(--duration, 0.5s), + opacity var(--duration, 0.5s); + width: 100%; +} + +.slide img { + display: block; + height: 100%; + object-fit: cover; + width: 100%; +} + +[data-side="active"] .slide { + filter: none; + opacity: 1; + transform: perspective(var(--perspective, 1000px)); +} + +[data-side="prev"] .slide { + filter: blur(calc(var(--center-offset, 0) * var(--blur, 2px))); + opacity: calc(1 - var(--center-offset, 0) * 0.68); + transform: perspective(var(--perspective, 1000px)) + translateX(calc(var(--center-offset, 0) * -1 * var(--xoffset, 600px))) + translateY(calc(var(--center-offset, 0) * -1 * var(--yoffset, 200px))) + translateZ(calc(var(--center-offset, 0) * 40px)) + rotateZ( + calc( + var(--center-offset, 0) * -1 * var(--rotation, 16deg) + + sin(calc(var(--i, 0) * 1rad)) * 6deg + ) + ); +} + +[data-side="next"] .slide { + filter: blur(calc(var(--center-offset, 0) * var(--blur, 2px))); + opacity: calc(1 - var(--center-offset, 0) * 0.3); + transform: perspective(var(--perspective, 1000px)) + translateX(calc(var(--center-offset, 0) * var(--xoffset, 600px))) + translateY(calc(var(--center-offset, 0) * var(--yoffset, 200px))) + translateZ(calc(var(--center-offset, 0) * -80px)) + rotateZ( + calc( + var(--center-offset, 0) * var(--rotation, 16deg) + + sin(calc(var(--i, 0) * 1.7rad)) * 6deg + ) + ); +} + +@media (prefers-reduced-motion: reduce) { + .slide { + transition: none; + } +} + +.navPrev, +.navNext { + align-items: center; + appearance: none; + background: rgb(255 255 255 / 12%); + backdrop-filter: blur(8px); + border: 1px solid rgb(255 255 255 / 20%); + border-radius: 50%; + color: #fff; + cursor: pointer; + display: flex; + height: 3rem; + justify-content: center; + position: absolute; + top: 50%; + transform: translateY(-50%); + transition: + background 0.2s, + border-color 0.2s; + width: 3rem; + z-index: 1000; +} + +.navPrev:hover, +.navNext:hover { + background: rgb(255 255 255 / 25%); + border-color: rgb(255 255 255 / 40%); +} + +.navPrev:disabled, +.navNext:disabled { + opacity: 0.3; + pointer-events: none; +} + +.navPrev { + left: 1rem; +} + +.navNext { + right: 1rem; +} + +.thumbs { + display: flex !important; + gap: 0.5rem !important; + justify-content: center; + list-style: none; + margin-top: 10px; + overflow-x: auto; + padding: 0 1.5rem; + position: relative; + z-index: 10; +} + +.thumbItem { + flex-shrink: 0; + line-height: 0; +} + +.thumbButton { + appearance: none; + background: none; + border: 2px solid transparent; + border-radius: 5px; + cursor: pointer; + display: block; + height: 52px; + opacity: 0.45; + overflow: hidden; + padding: 0; + transition: + opacity 0.2s, + border-color 0.2s; + width: 88px; +} + +.thumbButton img { + display: block; + height: 100%; + object-fit: cover; + width: 100%; +} + +.thumbButton[aria-current="true"] { + border-color: #fff; + opacity: 1; +} + +.thumbButton:hover { + opacity: 0.8; +} + +.srOnly { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} diff --git a/src/flying-gallery/index.jsx b/src/flying-gallery/index.jsx new file mode 100644 index 0000000..9bf6b91 --- /dev/null +++ b/src/flying-gallery/index.jsx @@ -0,0 +1,12 @@ +import React from "react" +import ReactDOM from "react-dom/client" + +import { HamburgerNav } from "../nav/HamburgerNav" +import { FlyingGallery } from "./FlyingGallery" + +ReactDOM.createRoot(document.getElementById("root")).render( + + + + +) diff --git a/src/main.jsx b/src/main.jsx index 8e98c53..2fb2e32 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,6 +1,7 @@ import React from "react" import ReactDOM from "react-dom/client" +import { HamburgerNav } from "./nav/HamburgerNav" import { Gallery, GalleryMain, @@ -87,6 +88,7 @@ function App() { ReactDOM.createRoot(document.getElementById("root")).render( + ) diff --git a/src/nav/HamburgerNav.jsx b/src/nav/HamburgerNav.jsx new file mode 100644 index 0000000..7970254 --- /dev/null +++ b/src/nav/HamburgerNav.jsx @@ -0,0 +1,59 @@ +import { useState, useEffect, useRef } from "react" +import styles from "./hamburger-nav.module.css" + +const PAGES = [ + { label: "Basic Gallery", href: "/" }, + { label: "Flying Gallery", href: "/flying-gallery/" }, +] + +export function HamburgerNav() { + const [open, setOpen] = useState(false) + const navRef = useRef(null) + + useEffect(() => { + if (!open) return + const handleKey = (e) => e.key === "Escape" && setOpen(false) + const handleClick = (e) => !navRef.current?.contains(e.target) && setOpen(false) + document.addEventListener("keydown", handleKey) + document.addEventListener("mousedown", handleClick) + return () => { + document.removeEventListener("keydown", handleKey) + document.removeEventListener("mousedown", handleClick) + } + }, [open]) + + return ( + + ) +} diff --git a/src/nav/hamburger-nav.module.css b/src/nav/hamburger-nav.module.css new file mode 100644 index 0000000..bb4597e --- /dev/null +++ b/src/nav/hamburger-nav.module.css @@ -0,0 +1,100 @@ +.nav { + position: fixed; + top: 1.25rem; + right: 1.25rem; + z-index: 100; +} + +.toggle { + display: flex; + flex-direction: column; + justify-content: center; + gap: 5px; + width: 2.5rem; + height: 2.5rem; + padding: 0.5rem; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 6px; + cursor: pointer; + box-shadow: 0 1px 4px rgb(0 0 0 / 8%); +} + +.toggle:focus-visible { + outline: 2px solid #333; + outline-offset: 2px; +} + +.bar { + display: block; + width: 100%; + height: 2px; + background: #333; + border-radius: 2px; + transform-origin: center; + transition: + transform 0.2s ease, + opacity 0.2s ease; +} + +.barTop { + transform: translateY(7px) rotate(45deg); +} + +.barMid { + opacity: 0; + transform: scaleX(0); +} + +.barBot { + transform: translateY(-7px) rotate(-45deg); +} + +.menu { + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + min-width: 180px; + margin: 0; + padding: 0.375rem; + list-style: none; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 8px; + box-shadow: 0 4px 16px rgb(0 0 0 / 10%); + opacity: 0; + pointer-events: none; + transform: translateY(-6px) scale(0.97); + transform-origin: top right; + transition: + opacity 0.18s ease, + transform 0.18s ease; +} + +.menuOpen { + opacity: 1; + pointer-events: all; + transform: translateY(0) scale(1); +} + +.link { + display: block; + padding: 0.6rem 0.875rem; + border-radius: 5px; + color: #333; + text-decoration: none; + font-family: system-ui, sans-serif; + font-size: 0.9rem; + white-space: nowrap; + transition: background 0.12s ease; +} + +.link:hover { + background: #f5f5f5; +} + +.link[aria-current="page"] { + font-weight: 600; + color: #000; + background: #f0f0f0; +} diff --git a/vite.config.js b/vite.config.js index ce15f10..1892fc1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,6 +16,12 @@ export default defineConfig({ // make sure to externalize deps that shouldn't be bundled // into your library external: ["react", "react-dom"], + input: { + // eslint-disable-next-line no-undef + main: resolve(__dirname, "index.html"), + // eslint-disable-next-line no-undef + flyingGallery: resolve(__dirname, "flying-gallery/index.html"), + }, output: { // Provide global variables to use in the UMD build // for externalized deps From 450200e6b03dced9a45876b5adb55ff0076d81ec Mon Sep 17 00:00:00 2001 From: Andrew Rubin Date: Wed, 27 May 2026 14:26:58 -0700 Subject: [PATCH 02/11] build: add changeset workflow --- .github/workflows/publish-package.yml | 25 - .github/workflows/release.yml | 47 ++ package-lock.json | 895 +++++++++++++++++++++++++- package.json | 2 + 4 files changed, 939 insertions(+), 30 deletions(-) delete mode 100644 .github/workflows/publish-package.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml deleted file mode 100644 index f919976..0000000 --- a/.github/workflows/publish-package.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Publish to NPM and Github Packages -on: - push: - branches: - - main - paths: - - src/** - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - registry-url: "https://registry.npmjs.org" - - - run: npm i - - run: npm run build - - run: npm publish --access public - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0a3a50a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,47 @@ +name: Release + +on: + push: + branches: + - main + paths: + - src/** + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + permissions: + contents: write # to create release (changesets/action) + issues: write # to post issue comments (changesets/action) + pull-requests: write # to create pull request (changesets/action) + + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - name: Install Dependencies + run: npm i + + - name: Lint + run: npm run lint + + - name: Build + run: npm run build + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + version: npm run version + publish: npm run release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package-lock.json b/package-lock.json index 332b678..912b98b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,16 @@ { "name": "@wethegit/react-gallery", - "version": "4.0.1", + "version": "4.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wethegit/react-gallery", - "version": "4.0.1", + "version": "4.0.2", "license": "MIT", "devDependencies": { + "@changesets/changelog-github": "~0.7.0", + "@changesets/cli": "~2.31.0", "@types/react": "~19.0.12", "@types/react-dom": "~19.0.4", "@vitejs/plugin-react-swc": "^3.0.0", @@ -59,6 +61,357 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", + "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", + "dev": true, + "dependencies": { + "@changesets/config": "^3.1.4", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", + "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/assemble-release-plan/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/changelog-github": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.7.0.tgz", + "integrity": "sha512-rBsbRvc4TVn+FvFnOVM3LxlFJfTXXCp8gfVJ+0BubxWNSVnLuAzowi5j+IEraLLP52w8AAs9QfKbPS3MMiXQJA==", + "dev": true, + "dependencies": { + "@changesets/get-github-info": "^0.8.0", + "@changesets/types": "^6.1.0", + "dotenv": "^8.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", + "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", + "dev": true, + "dependencies": { + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.4", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@changesets/cli/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", + "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/logger": "^0.1.1", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", + "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@changesets/get-github-info": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.8.0.tgz", + "integrity": "sha512-cRnC+xdF0JIik7coko3iUP9qbnfi1iJQ3sAa6dE+Tx3+ET8bjFEm63PA4WEohgjYcmsOikPHWzPsMWWiZmntOQ==", + "dev": true, + "dependencies": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", + "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", + "dev": true, + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", + "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.1.0", + "js-yaml": "^4.1.1" + } + }, + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "dev": true, + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/read": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", + "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", + "dev": true, + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.3", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "dev": true, + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", @@ -607,6 +960,145 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1133,6 +1625,17 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -1364,6 +1867,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", @@ -1595,6 +2107,18 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1731,6 +2255,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -1938,6 +2468,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -2041,6 +2577,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2065,6 +2610,15 @@ "node": ">=6.0.0" } }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2085,6 +2639,19 @@ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -2525,6 +3092,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -2596,6 +3176,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2751,6 +3337,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3027,6 +3627,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3153,6 +3759,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", + "dev": true, + "bin": { + "human-id": "dist/cli.js" + } + }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -3177,6 +3792,22 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3605,6 +4236,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", @@ -3680,6 +4323,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -3716,9 +4368,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -3751,6 +4403,15 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -3904,6 +4565,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -4185,6 +4852,15 @@ "node": ">= 6" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4215,6 +4891,26 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -4420,6 +5116,12 @@ "node": ">= 0.8.0" } }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -4437,6 +5139,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4467,6 +5181,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "dependencies": { + "quansync": "^0.2.7" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4569,6 +5310,15 @@ "node": ">=0.10" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -4745,6 +5495,22 @@ "node": ">=6" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ] + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4863,6 +5629,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/redent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", @@ -5133,6 +5936,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -5345,6 +6154,16 @@ "node": ">=0.10.0" } }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -5377,6 +6196,12 @@ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -5535,6 +6360,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -5932,6 +6766,18 @@ "node": ">=8" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5950,6 +6796,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -6113,6 +6965,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6197,6 +7066,22 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 953cb7b..1d67cd2 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,8 @@ "author": "Andrew Rubin (https://wethecollective.com)", "license": "MIT", "devDependencies": { + "@changesets/changelog-github": "~0.7.0", + "@changesets/cli": "~2.31.0", "@types/react": "~19.0.12", "@types/react-dom": "~19.0.4", "@vitejs/plugin-react-swc": "^3.0.0", From 1648475a9e1cbb8bf34964c51675bd219f1913ab Mon Sep 17 00:00:00 2001 From: Saugat Malla Date: Tue, 5 May 2026 19:04:20 -0400 Subject: [PATCH 03/11] fix: add pointer cancel event to handle cancelled pointer on touch devices --- package.json | 2 +- src/lib/components/gallery-main.jsx | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 1d67cd2..76ab03f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wethegit/react-gallery", - "version": "4.0.2", + "version": "4.0.1", "description": "A customizable, accessible gallery component for React projects.", "files": [ "dist" diff --git a/src/lib/components/gallery-main.jsx b/src/lib/components/gallery-main.jsx index d0fa8b6..c50dc3e 100644 --- a/src/lib/components/gallery-main.jsx +++ b/src/lib/components/gallery-main.jsx @@ -19,6 +19,17 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { swipeThreshold, } = useGallery() + const handlePointerCancel = useCallback(() => { + setTouchState((prevState) => ({ + ...prevState, + isDragging: false, + xOffset: 0, + start: 0, + offsetting: false, + scrolling: false, + })) + }, [setTouchState]) + const handlePointerDown = useCallback(() => { if (!draggable) return @@ -99,24 +110,16 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { else previous() } - // reset all the touchState values. - setTouchState((prevState) => ({ - ...prevState, - isDragging: false, - xOffset: 0, - start: 0, - offsetting: false, - scrolling: false, - })) + handlePointerCancel() } }, [ draggable, touchState.isDragging, touchState.xOffset, swipeThreshold, - setTouchState, next, previous, + handlePointerCancel, ]) return ( @@ -125,6 +128,7 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { onPointerDown={draggable ? handlePointerDown : null} onPointerMove={draggable ? handlePointerMove : null} onPointerUp={draggable ? handlePointerUp : null} + onPointerCancel={draggable ? handlePointerCancel : null} style={{ "--selected": activeIndex, "--total": galleryItems.length }} {...props} > From d9c7358aeb14e99ebc090b6e79db5a53407cc11a Mon Sep 17 00:00:00 2001 From: Saugat Malla Date: Thu, 7 May 2026 19:54:13 -0400 Subject: [PATCH 04/11] fix: add setPointerCapture to allow pointer to observe outside of the gallery --- src/lib/components/gallery-main.jsx | 63 ++++++++++++++++++----------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/src/lib/components/gallery-main.jsx b/src/lib/components/gallery-main.jsx index c50dc3e..4cc2f16 100644 --- a/src/lib/components/gallery-main.jsx +++ b/src/lib/components/gallery-main.jsx @@ -19,7 +19,7 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { swipeThreshold, } = useGallery() - const handlePointerCancel = useCallback(() => { + const resetTouchState = useCallback(() => { setTouchState((prevState) => ({ ...prevState, isDragging: false, @@ -30,11 +30,14 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { })) }, [setTouchState]) - const handlePointerDown = useCallback(() => { - if (!draggable) return - - setTouchState((prevState) => ({ ...prevState, isDragging: true })) - }, [draggable, setTouchState]) + const handlePointerDown = useCallback( + (event) => { + if (!draggable) return + event.currentTarget.setPointerCapture?.(event.pointerId) + setTouchState((prevState) => ({ ...prevState, isDragging: true })) + }, + [draggable, setTouchState] + ) const handlePointerMove = useCallback( (event) => { @@ -96,31 +99,43 @@ export const GalleryMain = ({ renderGalleryItem, className, ...props }) => { ] ) - const handlePointerUp = useCallback(() => { - if (!draggable) return + const handlePointerUp = useCallback( + (event) => { + if (!draggable) return - if (touchState.isDragging) { - /* + event.currentTarget.releasePointerCapture?.(event.pointerId) + if (touchState.isDragging) { + /* check if the offset value is more than the swipeThreshold. if it is then we'll move to the next or prev item in the gallery, otherwise it'll just spring back to the current position. */ - if (Math.abs(touchState.xOffset) > swipeThreshold) { - if (touchState.xOffset < 0) next() - else previous() + if (Math.abs(touchState.xOffset) > swipeThreshold) { + if (touchState.xOffset < 0) next() + else previous() + } + + resetTouchState() } + }, + [ + draggable, + touchState.isDragging, + touchState.xOffset, + swipeThreshold, + next, + previous, + resetTouchState, + ] + ) - handlePointerCancel() - } - }, [ - draggable, - touchState.isDragging, - touchState.xOffset, - swipeThreshold, - next, - previous, - handlePointerCancel, - ]) + const handlePointerCancel = useCallback( + (event) => { + event.currentTarget.releasePointerCapture?.(event.pointerId) + resetTouchState() + }, + [resetTouchState] + ) return (
      Date: Thu, 7 May 2026 19:57:56 -0400 Subject: [PATCH 05/11] revert: package number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 76ab03f..1d67cd2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wethegit/react-gallery", - "version": "4.0.1", + "version": "4.0.2", "description": "A customizable, accessible gallery component for React projects.", "files": [ "dist" From 1535d2fbc1f498eb3f856e7f49f3f988e96ec0f8 Mon Sep 17 00:00:00 2001 From: Saugat Malla Date: Wed, 27 May 2026 16:30:18 -0400 Subject: [PATCH 06/11] chore: add changeset --- .changeset/README.md | 8 ++++++++ .changeset/config.json | 11 +++++++++++ .changeset/seven-badgers-type.md | 5 +++++ package-lock.json | 1 + 4 files changed, 25 insertions(+) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json create mode 100644 .changeset/seven-badgers-type.md diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..654c6d4 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets). + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md). diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..5c58ec9 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.4/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.changeset/seven-badgers-type.md b/.changeset/seven-badgers-type.md new file mode 100644 index 0000000..05d4949 --- /dev/null +++ b/.changeset/seven-badgers-type.md @@ -0,0 +1,5 @@ +--- +"@wethegit/react-gallery": patch +--- + +Fix gallery item getting stuck diff --git a/package-lock.json b/package-lock.json index 912b98b..1c7d72a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4372,6 +4372,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, From 86a8b666d53c79d2f86defefbe9533c0df4a5ad6 Mon Sep 17 00:00:00 2001 From: Andrew Rubin Date: Wed, 27 May 2026 14:48:55 -0700 Subject: [PATCH 07/11] build: add missing changeset scripts --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d67cd2..c85a41f 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,10 @@ "build": "vite build", "lint:scripts": "eslint --fix --ext .jsx,js --ignore-path .gitignore .", "lint:styles": "stylelint src/**/*.{css,scss}", - "lint": "npm run lint:scripts && npm run lint:styles" + "lint": "npm run lint:scripts && npm run lint:styles", + "changeset": "changeset", + "version": "changeset version", + "release": "npm run build && changeset publish" }, "publishConfig": { "access": "public" From 608a4472401f620a763e4b0d0d34d670bff2435c Mon Sep 17 00:00:00 2001 From: Liam Egan Date: Wed, 27 May 2026 16:34:17 -0700 Subject: [PATCH 08/11] trigger workflow From 3c6d05827131077c20bbc69603c8120c5b425589 Mon Sep 17 00:00:00 2001 From: Andrew Rubin Date: Wed, 27 May 2026 16:54:57 -0700 Subject: [PATCH 09/11] chore: adjust one ID in the demo to force the package release workflow --- src/main.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.jsx b/src/main.jsx index 8e98c53..4c6cbe6 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -16,7 +16,7 @@ export const GALLERY_ITEMS = [ image: "https://images.unsplash.com/photo-1680212703757-2565f02a653e?auto=format&fit=crop&w=1000&height=500&q=80", alt: "", - id: 131789, + id: 13178, }, { image: From 0eba388a2a9e5701a0e671bd61bb24d58fff5a2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 May 2026 23:57:18 +0000 Subject: [PATCH 10/11] Version Packages --- .changeset/seven-badgers-type.md | 5 ----- CHANGELOG.md | 7 +++++++ package.json | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 .changeset/seven-badgers-type.md create mode 100644 CHANGELOG.md diff --git a/.changeset/seven-badgers-type.md b/.changeset/seven-badgers-type.md deleted file mode 100644 index 05d4949..0000000 --- a/.changeset/seven-badgers-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@wethegit/react-gallery": patch ---- - -Fix gallery item getting stuck diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e2d0d50 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# @wethegit/react-gallery + +## 4.0.3 + +### Patch Changes + +- 1535d2f: Fix gallery item getting stuck diff --git a/package.json b/package.json index c85a41f..f7583bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@wethegit/react-gallery", - "version": "4.0.2", + "version": "4.0.3", "description": "A customizable, accessible gallery component for React projects.", "files": [ "dist" From 9c81191b3661bbdd99726df500cbffe6aa531e48 Mon Sep 17 00:00:00 2001 From: Liam Egan Date: Sat, 18 Apr 2026 16:37:50 -0700 Subject: [PATCH 11/11] Adding flying navigation example and hamburger nav --- flying-gallery/index.html | 23 +++ src/flying-gallery/FlyingGallery.jsx | 146 +++++++++++++ src/flying-gallery/flying-gallery.module.css | 206 +++++++++++++++++++ src/flying-gallery/index.jsx | 12 ++ src/main.jsx | 2 + src/nav/HamburgerNav.jsx | 59 ++++++ src/nav/hamburger-nav.module.css | 100 +++++++++ vite.config.js | 6 + 8 files changed, 554 insertions(+) create mode 100644 flying-gallery/index.html create mode 100644 src/flying-gallery/FlyingGallery.jsx create mode 100644 src/flying-gallery/flying-gallery.module.css create mode 100644 src/flying-gallery/index.jsx create mode 100644 src/nav/HamburgerNav.jsx create mode 100644 src/nav/hamburger-nav.module.css diff --git a/flying-gallery/index.html b/flying-gallery/index.html new file mode 100644 index 0000000..6851f82 --- /dev/null +++ b/flying-gallery/index.html @@ -0,0 +1,23 @@ + + + + + + + Flying Gallery — @wethegit/react-gallery + + + +
      + + + diff --git a/src/flying-gallery/FlyingGallery.jsx b/src/flying-gallery/FlyingGallery.jsx new file mode 100644 index 0000000..a573232 --- /dev/null +++ b/src/flying-gallery/FlyingGallery.jsx @@ -0,0 +1,146 @@ +import { + Gallery, + GalleryMain, + GalleryItem, + GalleryNav, + GalleryPagination, + GalleryPaginationItem, +} from "../lib" +import styles from "./flying-gallery.module.css" + +const ITEMS = [ + { + id: 1, + image: + "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Sun rays through a forest", + }, + { + id: 2, + image: + "https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1519681393784-d120267933ba?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Snow-capped mountain peak at night", + }, + { + id: 3, + image: + "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Mountain reflected in a still lake", + }, + { + id: 4, + image: + "https://images.unsplash.com/photo-1501854140801-50d01698950b?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1501854140801-50d01698950b?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Aerial view of green hills", + }, + { + id: 5, + image: + "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Orange wildflower field", + }, + { + id: 6, + image: + "https://images.unsplash.com/photo-1547234935-80c7145ec969?auto=format&fit=crop&w=1200&h=700&q=80", + thumb: + "https://images.unsplash.com/photo-1547234935-80c7145ec969?auto=format&fit=crop&w=200&h=120&q=60", + alt: "Tropical beach with clear water", + }, +] + +export function FlyingGallery() { + return ( +
      + +
      + { + const isPrev = activeIndex > index + + return ( + +
      + {item.alt} +
      +
      + ) + }} + /> + + + Previous + + + + Next + +
      + + ( + + {item.alt} + + )} + /> +
      +
      + ) +} diff --git a/src/flying-gallery/flying-gallery.module.css b/src/flying-gallery/flying-gallery.module.css new file mode 100644 index 0000000..600b9d5 --- /dev/null +++ b/src/flying-gallery/flying-gallery.module.css @@ -0,0 +1,206 @@ +.root { + --perspective: 100px; + --xoffset: 600px; + --yoffset: 200px; + --rotation: 16deg; + --blur: 2px; + + background: #0a0a0f; + color: #fff; + display: flex; + flex-direction: column; + gap: 1.5rem; + min-height: 100vh; + padding: 3rem 0 2rem; + overflow: hidden; +} + +.slideArea { + position: relative; +} + +/* + * The gallery is configured with --item-width: 4px; --gap: 0, so all
    • + * elements collapse to near-zero horizontal positions. + * All visual positioning is handled here on .slide using CSS vars inherited + * from the library-managed
    • : + * + * --center-offset absolute distance from active (0, 1, 2 …) + * --duration transition speed + * + * className={styles.item} is appended to the library's class list on each
    • . + * Since this CSS module is loaded after the library's, same-specificity rules here + * win on source order.. + */ +.item { + transform: translateX(0) !important; +} + +[data-side="prev"].item { + z-index: calc(20 - var(--center-offset, 0)); +} + +.slide { + aspect-ratio: 16 / 9; + border-radius: 10px; + overflow: hidden; + position: relative; + transition: + transform var(--duration, 0.5s), + filter var(--duration, 0.5s), + opacity var(--duration, 0.5s); + width: 100%; +} + +.slide img { + display: block; + height: 100%; + object-fit: cover; + width: 100%; +} + +[data-side="active"] .slide { + filter: none; + opacity: 1; + transform: perspective(var(--perspective, 1000px)); +} + +[data-side="prev"] .slide { + filter: blur(calc(var(--center-offset, 0) * var(--blur, 2px))); + opacity: calc(1 - var(--center-offset, 0) * 0.68); + transform: perspective(var(--perspective, 1000px)) + translateX(calc(var(--center-offset, 0) * -1 * var(--xoffset, 600px))) + translateY(calc(var(--center-offset, 0) * -1 * var(--yoffset, 200px))) + translateZ(calc(var(--center-offset, 0) * 40px)) + rotateZ( + calc( + var(--center-offset, 0) * -1 * var(--rotation, 16deg) + + sin(calc(var(--i, 0) * 1rad)) * 6deg + ) + ); +} + +[data-side="next"] .slide { + filter: blur(calc(var(--center-offset, 0) * var(--blur, 2px))); + opacity: calc(1 - var(--center-offset, 0) * 0.3); + transform: perspective(var(--perspective, 1000px)) + translateX(calc(var(--center-offset, 0) * var(--xoffset, 600px))) + translateY(calc(var(--center-offset, 0) * var(--yoffset, 200px))) + translateZ(calc(var(--center-offset, 0) * -80px)) + rotateZ( + calc( + var(--center-offset, 0) * var(--rotation, 16deg) + + sin(calc(var(--i, 0) * 1.7rad)) * 6deg + ) + ); +} + +@media (prefers-reduced-motion: reduce) { + .slide { + transition: none; + } +} + +.navPrev, +.navNext { + align-items: center; + appearance: none; + background: rgb(255 255 255 / 12%); + backdrop-filter: blur(8px); + border: 1px solid rgb(255 255 255 / 20%); + border-radius: 50%; + color: #fff; + cursor: pointer; + display: flex; + height: 3rem; + justify-content: center; + position: absolute; + top: 50%; + transform: translateY(-50%); + transition: + background 0.2s, + border-color 0.2s; + width: 3rem; + z-index: 1000; +} + +.navPrev:hover, +.navNext:hover { + background: rgb(255 255 255 / 25%); + border-color: rgb(255 255 255 / 40%); +} + +.navPrev:disabled, +.navNext:disabled { + opacity: 0.3; + pointer-events: none; +} + +.navPrev { + left: 1rem; +} + +.navNext { + right: 1rem; +} + +.thumbs { + display: flex !important; + gap: 0.5rem !important; + justify-content: center; + list-style: none; + margin-top: 10px; + overflow-x: auto; + padding: 0 1.5rem; + position: relative; + z-index: 10; +} + +.thumbItem { + flex-shrink: 0; + line-height: 0; +} + +.thumbButton { + appearance: none; + background: none; + border: 2px solid transparent; + border-radius: 5px; + cursor: pointer; + display: block; + height: 52px; + opacity: 0.45; + overflow: hidden; + padding: 0; + transition: + opacity 0.2s, + border-color 0.2s; + width: 88px; +} + +.thumbButton img { + display: block; + height: 100%; + object-fit: cover; + width: 100%; +} + +.thumbButton[aria-current="true"] { + border-color: #fff; + opacity: 1; +} + +.thumbButton:hover { + opacity: 0.8; +} + +.srOnly { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} diff --git a/src/flying-gallery/index.jsx b/src/flying-gallery/index.jsx new file mode 100644 index 0000000..9bf6b91 --- /dev/null +++ b/src/flying-gallery/index.jsx @@ -0,0 +1,12 @@ +import React from "react" +import ReactDOM from "react-dom/client" + +import { HamburgerNav } from "../nav/HamburgerNav" +import { FlyingGallery } from "./FlyingGallery" + +ReactDOM.createRoot(document.getElementById("root")).render( + + + + +) diff --git a/src/main.jsx b/src/main.jsx index 4c6cbe6..32f5161 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,6 +1,7 @@ import React from "react" import ReactDOM from "react-dom/client" +import { HamburgerNav } from "./nav/HamburgerNav" import { Gallery, GalleryMain, @@ -87,6 +88,7 @@ function App() { ReactDOM.createRoot(document.getElementById("root")).render( + ) diff --git a/src/nav/HamburgerNav.jsx b/src/nav/HamburgerNav.jsx new file mode 100644 index 0000000..7970254 --- /dev/null +++ b/src/nav/HamburgerNav.jsx @@ -0,0 +1,59 @@ +import { useState, useEffect, useRef } from "react" +import styles from "./hamburger-nav.module.css" + +const PAGES = [ + { label: "Basic Gallery", href: "/" }, + { label: "Flying Gallery", href: "/flying-gallery/" }, +] + +export function HamburgerNav() { + const [open, setOpen] = useState(false) + const navRef = useRef(null) + + useEffect(() => { + if (!open) return + const handleKey = (e) => e.key === "Escape" && setOpen(false) + const handleClick = (e) => !navRef.current?.contains(e.target) && setOpen(false) + document.addEventListener("keydown", handleKey) + document.addEventListener("mousedown", handleClick) + return () => { + document.removeEventListener("keydown", handleKey) + document.removeEventListener("mousedown", handleClick) + } + }, [open]) + + return ( + + ) +} diff --git a/src/nav/hamburger-nav.module.css b/src/nav/hamburger-nav.module.css new file mode 100644 index 0000000..bb4597e --- /dev/null +++ b/src/nav/hamburger-nav.module.css @@ -0,0 +1,100 @@ +.nav { + position: fixed; + top: 1.25rem; + right: 1.25rem; + z-index: 100; +} + +.toggle { + display: flex; + flex-direction: column; + justify-content: center; + gap: 5px; + width: 2.5rem; + height: 2.5rem; + padding: 0.5rem; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 6px; + cursor: pointer; + box-shadow: 0 1px 4px rgb(0 0 0 / 8%); +} + +.toggle:focus-visible { + outline: 2px solid #333; + outline-offset: 2px; +} + +.bar { + display: block; + width: 100%; + height: 2px; + background: #333; + border-radius: 2px; + transform-origin: center; + transition: + transform 0.2s ease, + opacity 0.2s ease; +} + +.barTop { + transform: translateY(7px) rotate(45deg); +} + +.barMid { + opacity: 0; + transform: scaleX(0); +} + +.barBot { + transform: translateY(-7px) rotate(-45deg); +} + +.menu { + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + min-width: 180px; + margin: 0; + padding: 0.375rem; + list-style: none; + background: #fff; + border: 1px solid #e5e5e5; + border-radius: 8px; + box-shadow: 0 4px 16px rgb(0 0 0 / 10%); + opacity: 0; + pointer-events: none; + transform: translateY(-6px) scale(0.97); + transform-origin: top right; + transition: + opacity 0.18s ease, + transform 0.18s ease; +} + +.menuOpen { + opacity: 1; + pointer-events: all; + transform: translateY(0) scale(1); +} + +.link { + display: block; + padding: 0.6rem 0.875rem; + border-radius: 5px; + color: #333; + text-decoration: none; + font-family: system-ui, sans-serif; + font-size: 0.9rem; + white-space: nowrap; + transition: background 0.12s ease; +} + +.link:hover { + background: #f5f5f5; +} + +.link[aria-current="page"] { + font-weight: 600; + color: #000; + background: #f0f0f0; +} diff --git a/vite.config.js b/vite.config.js index ce15f10..1892fc1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -16,6 +16,12 @@ export default defineConfig({ // make sure to externalize deps that shouldn't be bundled // into your library external: ["react", "react-dom"], + input: { + // eslint-disable-next-line no-undef + main: resolve(__dirname, "index.html"), + // eslint-disable-next-line no-undef + flyingGallery: resolve(__dirname, "flying-gallery/index.html"), + }, output: { // Provide global variables to use in the UMD build // for externalized deps