diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml index 35af059296..37227c1698 100644 --- a/.github/workflows/bundle-size.yml +++ b/.github/workflows/bundle-size.yml @@ -12,19 +12,50 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + with: + fetch-depth: 0 + path: pr-build + - uses: actions/setup-node@v6 with: node-version: 24 cache: "npm" - - run: npm ci - - name: Build and extract bundle sizes - run: npm run build:sizes --silent > bundle-sizes.md - - name: Debug - show file content + cache-dependency-path: pr-build/package-lock.json + + - name: Find latest tag + id: latest-tag run: | - echo "File size:" - wc -l bundle-sizes.md - echo "First 20 lines:" - head -20 bundle-sizes.md + TAG=$(cd pr-build && git tag --sort=-v:refname | grep -v '^production$' | head -1) + echo "tag=$TAG" >> "$GITHUB_OUTPUT" + + - uses: actions/checkout@v6 + continue-on-error: true + id: checkout-tag + with: + path: tag-build + ref: ${{ steps.latest-tag.outputs.tag }} + + - uses: actions/setup-node@v6 + with: + node-version: 24 + + - parallel: + - name: Build tag + continue-on-error: true + run: | + if [ -d "tag-build" ] && [ -f "tag-build/package.json" ]; then + cd tag-build && npm ci && NO_COLOR=true npm run build 2>&1 | grep '^dist/' > ../tag-sizes.txt + fi + - name: Build PR + working-directory: pr-build + run: | + npm ci && NO_COLOR=true npm run build 2>&1 | grep '^dist/' > ../pr-sizes.txt + + - name: Generate diff report + env: + REF_TAG: ${{ steps.latest-tag.outputs.tag }} + run: node pr-build/scripts/bundle-sizes-diff-md.js tag-sizes.txt pr-sizes.txt > bundle-sizes.md + - name: Comment on PR uses: marocchino/sticky-pull-request-comment@v2 with: diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 676d909a82..ecbe3a3144 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -12,7 +12,15 @@ "bracketSameLine": false, "bracketSpacing": true, "sortPackageJson": false, - "ignorePatterns": [".*/**", "*.json", "rollbar.js", "src/data/**", "**/*.md"], + "ignorePatterns": [ + ".*/**", + "*.json", + "rollbar.js", + "src/data/**", + "**/*.md", + /* oxc_formatter_css (native since v0.57) doesn't support @keyframes entry/exit */ + "src/components/quote-chain-modal.css" + ], "sortImports": { "groups": [ "side_effect_style", diff --git a/CHANGELOG.md b/CHANGELOG.md index b4894d8fe0..65f2a0bccf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,227 +3,217 @@ - Dates are in Singapore time zone (UTC+8) - Doesn't include small & quick fixes -## December 15, 2022 + -📢 https://mastodon.social/@cheeaun/109540685870427959 +## June 22, 2026 -- 📖 "Read more" for long-form posts -- 🤘 Profile metadata in Account sheet -- 💬 "Only mentions" filter in Notifications -- 🛗 Nested comments + pagination + collapsible comments +📢 https://mastodon.social/@cheeaun/116793733342092207 -## December 24, 2022 +- 🗂️ Collections (Mastodon v4.6) +- 🤖 Filter notifications from bots (Mastodon v4.6) +- 🐛 Bug fixes -📢 https://mastodon.social/@cheeaun/109569389041297558 +## May 15, 2026 -- 🍰 :shortcode: expander in Compose field -- ⏲️ character count indicator same as Mastodon's front-end (including twitter-text's URL regex) -- 🙈 "Invisible Ink" effect for spoilers +📢 https://mastodon.social/@cheeaun/116578836866401369 -## December 28, 2022 +- 🔄 Experimental paginated timeline +- 🪣 Multi-filters for profile posts +- 🧘 Wellbeing: hide trending, local or federated timelines +- 📱 Haptics +- 🐛 Bug fixes -📢 https://mastodon.social/@cheeaun/109591442248622453 +## February 24, 2026 -- 🔠 Language selector in Compose field +📢 https://mastodon.social/@cheeaun/116126267334672277 + +- 📤 Allow receiving shared data with the Web Share Target API +- 🔐 Timeline access controls +- 👤 New shortcut: "Profile" +- 📝 "Only followings" filter for Mentions +- ↕️ Preliminary support for vertical-lr writing mode - 🐛 Bug fixes -## January 1, 2023 +## January 31, 2026 -📢 https://mastodon.social/@cheeaun/109613657018189874 +📢 https://mastodon.social/@cheeaun/115989883020173120 -- ⌨️ Small list of keyboard shortcuts (j, k, o, meta+enter, esc) +- ⌨️ More sequential hotkeys, g>s (Settings), g>p (Profile), g>b (Bookmarks) +- 💈 Redesigned poll +- 🛬 Redesigned landing page - 🐛 Bug fixes -## January 6, 2023 +## January 7, 2026 -📢 https://mastodon.social/@cheeaun/109642981521972938 +📢 https://mastodon.social/@cheeaun/115853890477340137 -- 🙈 Auto-hide header -- 💅 Small UI changes +- 🗓️ Experimental "Year In Posts" - 🐛 Bug fixes -## January 17, 2023 +## November 26, 2025 -📢 https://mastodon.social/users/cheeaun/statuses/109704010841850370 +📢 https://mastodon.social/@cheeaun/115616195859103739 -- 🔢 Thread count indicator -- 🔐 Handle accept/reject follow requests for locked accounts -- 📬 Unsent draft recovery -- 🎠 Boosts Carousel™️ +- 🤳 QR code for profiles and shortcuts settings +- 🔃 Import/export accounts +- 📸 Extract description from attached image metadata - 🐛 Bug fixes -## February 1, 2023 +## November 8, 2025 -📢 https://mastodon.social/@cheeaun/109785026971372208 +📢 https://mastodon.social/@cheeaun/115514729408923191 -- 🔰 ALT badge inside media modals -- 👀 "Show all sensitive content" menu option for threads -- 🧵 Improved Threads UI; smarter collapsing, expand/collapse button with avatars, nesting up to level 4 -- 🪟 Media modal appears beside the Detail page for large screens +- 🗣️ Reply/Reply all +- ⌨️ Sequential hotkeys, only g>h and g>n for now +- 💈 Decal patterns for posting stats +- 💬 Slightly more support for Mastodon v4.5's native quote posts - 🐛 Bug fixes -## February 19, 2023 +## October 9, 2025 -📢 https://mastodon.social/@cheeaun/109892084130563955 +📢 https://mastodon.social/@cheeaun/115344535219522826 -- 🍰 New menu + pages: Lists, Followed Hashtags, Bookmarks, Favourites, Search, Local, Federated -- 📝 Support edit media description for posted statuses (Mastodon v4.1.0) -- ⚡ Shortcuts™️ (beta) — quick jumping between configured shortcuts -- 🏛️ Experimental multi-column mode, derived from Shortcuts™️ +- 💬 More support for (upcoming) Mastodon v4.5's native quote posts - 🐛 Bug fixes -## March 2, 2023 +## September 17, 2025 -📢 https://mastodon.social/@cheeaun/109954214422731984 +📢 https://mastodon.social/@cheeaun/115219986749353363 -- 🔗 Handle mastodon post links -- #️⃣ Multi-hashtag timeline (5 max) -- 🥞 Context menu for posts in timeline (tap on timestamp) -- 📑 New tab/menu-bar UI for Shortcuts™️ +- 📝 Composer relayout +- 🔍 Recent searches +- 🏛️ Edit History Snapshots +- 🔰 Show role badges with profile usernames +- ⌛ "X months/years later" hint between list of threads or comments +- 🔗 "Open link?" prompt when clicking links that don't show domain +- 🔬 Larger-than-rendered custom emojis opens up in media modal when clicked. +- 🔭 Zoom in/out buttons in Custom Emojis picker - 🐛 Bug fixes -## March 15, 2023 +## July 18, 2025 -📢 https://mastodon.social/@cheeaun/110027507724432132 +📢 https://mastodon.social/@cheeaun/114874317126202331 -- 👥 Grouped favourites AND boosts notifications -- 🔤 Configurable text size -- 💱 Translation - - Works for spoiler/CW text, post content, poll text AND image description. - - Changeable "source" language selector for intricate cases like multilingual sentences. -- ✨ Beautiful profile sheets and pages -- 🚸 Additional prompt when posting or boosting statuses with media that has no description. +- 💬 Better display support for Mastodon v4.4's native quote posts +- 🧮 Math formatting for LaTeX - 🐛 Bug fixes -## March 31, 2023 +## June 8, 2025 -📢 https://mastodon.social/@cheeaun/110118589616753266 +📢 https://mastodon.social/@cheeaun/114647753143423772 -- ❌ Delete post -- 🙅 Mention, Mute, Block account -- 🪣 (Partial) Filtered posts UI -- 👥 Posts context grouping in timelines -- 👥 Boosts deduplication (beta) -- 😉 Custom emoji picker -- 🤏 Pinch-zoom for images. Ctrl/Cmd+scroll for pointers. -- 🙈 Setting to hide "Translate" button for specific languages -- 💱 Translate bio, including profile metadata -- 🎚️ Comments thread UI now nest to ∞ levels +- 🌟 Featured profiles (for upcoming Mastodon v4.4) +- 🔑 Revoke access token when logging out +- 📸 Respect server's media description character limit +- 🪣 Add indicator for exclusive lists +- 🧪 Sandbox https://mastodon.social/@cheeaun/114494995294330803 - 🐛 Bug fixes -## April 7, 2023 +## April 26, 2025 -📢 https://mastodon.social/@cheeaun/110157897526115895 +📢 https://mastodon.social/@cheeaun/114404023673367245 -- 🪣 Filter bar for profile page statuses with these filters: - - Include replies - - Exclude boosts - - Media only - - Featured hashtags -- 🛒 Lists CRUD and Add/Remove accounts in Lists -- 📑 Sort Followed hashtags -- 📈 New "Trending" timeline page -- @ New "Mentions" page -- ✉️ Show "Private mention" badge -- ⚛️ Boosted/favourited by… accounts list +- 🗣️ Migrated to a new API for translations. + - Improved support from 133 to 249 languages +- ⌨️ Keyboard-layout-dependent shortcuts +- 🙈 Handle Mastodon's upcoming `blur` filter https://mastodon.social/@cheeaun/114301571477875063 - 🐛 Bug fixes -## April 25, 2023 +## March 12, 2025 -📢 https://mastodon.social/@cheeaun/110260144082803624 +📢 https://mastodon.social/@cheeaun/114149642985452634 -- #️⃣ Allow hashtag timeline from other instances -- ✏️ Edit Shortcuts -- 🔇 Mute conversation -- 👀 "Full" & "Side peek" views for Status page -- 📶 Slight redesign for multi-column UI -- 🔗 Handle quick post URLs e.g. phanpy.social/#/https://[POST_URL] - a feature from #Elk -- 🧸 Experimental hashtag stuffing collapsing -- 🚀 Quote posts rendering -- 🪄 Experimental cloak mode +- 🎏 Change profile header and avatar +- 🗓️ Scheduled posts +- 🗣️ Experimental implementation of Translator & Language Detector APIs (only Chrome 131 - 137) https://webmachinelearning.github.io/translation-api/ + - The code: https://github.com/cheeaun/phanpy/blob/0759e6431f4572a1d0f10b8eeda0b46b9f14bc0b/src/utils/browser-translator.js +- 🧵 'Add to thread' menu when right-clicking/long-pressing compose button +- 📸 Camera button on composer, if supported (Mobile Safari opens camera, Chrome Android requires one extra step) - 🐛 Bug fixes -New matrix chat room: https://matrix.to/#/%23phanpy:matrix.org - -## May 11, 2023 +## November 13, 2024 -📢 https://mastodon.social/@cheeaun/110350569225129255 +📢 https://mastodon.social/@cheeaun/113475224009500738 -- 🔔 Notification popover, for larger viewports -- ✨ New experiment: auto-refresh timeline posts -- 🔐 "Private" tab, for Private Mentions, in Mentions page -- 🫴 "Follow requests" section in Notifications page -- 📢 "Announcements" section in Notifications page +- 💬 3 new languages: Lithuanian, Norwegian Bokmål, Ukrainian - 🐛 Bug fixes -## October 2, 2023 +## October 9, 2024 -📢 https://mastodon.social/@cheeaun/111166122069800214 +📢 https://mastodon.social/@cheeaun/113272683452140213 -- 🔔 Web Push notifications (still beta! feedback welcomed 🙏) -- ⌨️ More keyboard shortcuts -- 👀 Profile followers and following list -- 📊 Profile posting stats, shown for accounts that you're not following -- 💁‍♂️ Alt badge — but will conditionally show as inline captions -- 👤 Handle memorial and moved accounts -- 📜 Muted and blocked users list +- 💬 4 new languages: Dutch, Esperanto, Italian, Japanese - 🐛 Bug fixes -## October 26, 2023 +Recap: Mastodon v4.3 features (https://github.com/mastodon/mastodon/releases/tag/v4.3.0) already supported on Phanpy: +- Server-side notification grouping (opt-in) +- Filtered notifications +- Severed relationships notifications +- Timeline of public posts about a trending link +- Author highlight for news articles -📢 https://mastodon.social/@cheeaun/111301339529679119 +## August 31, 2024 -- 🗓️ Experimental month filter for posts on profile page -- 🗞️ Trending news carousel -- 🫰 Replace "Favourite" with "Like" +📢 https://mastodon.social/@cheeaun/113056969576068031 + +- 💬 Internationalization https://mastodon.social/@cheeaun/112932794480750449 + - 15 languages with >50% translated: Basque, Catalan, Chinese (Simplified), Czech, Finnish, French, Galician, German, Kabyle, Korean, Persian, Portuguese, Portuguese (Brazil), Russian, Spanish + - Volunteer translations: https://crowdin.com/project/phanpy +- 🔔 V2 Notifications policy API https://mastodon.social/@cheeaun/112960426880369332 +- 🔐 Initial OAuth PKCE implementation https://mastodon.social/@cheeaun/113032467744616699 - 🐛 Bug fixes -## November 6, 2023 +## July 22, 2024 -📢 https://mastodon.social/@cheeaun/111363831401633676 +📢 https://mastodon.social/@cheeaun/112830006096769732 -- 🏟️ Media gallery layout for hashtag page and profile page (media-only filter) -- 🫰 Small UI touches +- 🔔 Experimental opt-in server-side grouped notifications (for upcoming Mastodon v4.3, announced here https://oisaur.com/@renchap/112812306472121018) — it's a bit of a "downgrade" but worth testing. Described as "Potentially improved grouping window but basic grouping logic". +- 🪣 Grouped filtered posts inside boosts carousel - 🐛 Bug fixes -## December 22, 2023 +## June 23, 2024 -📢 https://mastodon.social/@cheeaun/111624848853096639 +📢 https://mastodon.social/@cheeaun/112665474700277373 -- #️⃣ Followed hashtag indicators for non-following posts -- ↔️ Following/followed-by/mutual states in accounts list -- 🔙 Adopt `CloseWatcher` for handling back gesture/button on Chrome Android v120+ https://chromestatus.com/feature/4722261258928128 -- 🗣️ "Speak" menu item for supported browsers -- 🔎 Allow add "Search" in Shortcuts/Columns -- 🛰️ Community deployments https://github.com/cheeaun/phanpy?tab=readme-ov-file#community-deployments +- 🏞️ Non-grid layout for media on post pages https://mastodon.social/@cheeaun/112592781655285124 +- 🔗 Posts timeline for trending link (upcoming Mastodon v4.3) https://mastodon.social/@cheeaun/112621183860142350 - 🐛 Bug fixes -## February 25, 2024 +## June 3, 2024 -📢 https://mastodon.social/@cheeaun/111992491212397964 +📢 https://mastodon.social/@cheeaun/112552481684496462 -- 👀 Show lists containing account in the menu -- 🍽️ Redesigned context menu +- ⬇️ Allow minimize composer https://mastodon.social/@cheeaun/112502500959822353 +- ⚠️ Subtle warning if media file size or dimensions are too large https://mastodon.social/@cheeaun/112512838876542558 +- 🗣️ Experimental client-side language detection for unspecified-language posts and composer. 80 to ~95% accuracy, 24 languages, trained dataset from Tatoeba & UDHR, 34KB gzip, powered by TinyLD (light) https://github.com/komodojp/tinyld - 🐛 Bug fixes -## March 6, 2024 +## May 6, 2024 -📢 https://mastodon.social/@cheeaun/112048317932964165 +📢 https://mastodon.social/@cheeaun/112394549895936563 -- ⏱️ Catch-up (beta) ✨🆕✨ -- 🚩 Report post/account -- ⛏️ Static HTML embed code for posts +- 👾 Custom emoji search. Hoverable & keyboard-accessible tooltips of shortcodes, with fuzzy search. - 🐛 Bug fixes -## March 26, 2024 +## April 17, 2024 -📢 https://mastodon.social/@cheeaun/112162530547628273 +📢 https://mastodon.social/@cheeaun/112286757479031305 + +- 📸 Media-first UI experience + - Only for @Pixelfed accounts, for now. + - Still buggy, so need more feedback. +- 🎁 GIF picker (disabled by default) +- 🐛 Bug fixes + +## March 26, 2024 + +📢 https://mastodon.social/@cheeaun/112162530547628273 - 🌪️ Keyword filters UI - 📝 Allow 'Lists' in Shortcuts (except multi-column view) @@ -237,210 +227,221 @@ For upcoming Mastodon v4.3+: For non-Mastodon servers: - 😉 Best-effort render emoji reactions and notifications (not the reacting part) -## April 17, 2024 +## March 6, 2024 -📢 https://mastodon.social/@cheeaun/112286757479031305 +📢 https://mastodon.social/@cheeaun/112048317932964165 -- 📸 Media-first UI experience - - Only for @Pixelfed accounts, for now. - - Still buggy, so need more feedback. -- 🎁 GIF picker (disabled by default) +- ⏱️ Catch-up (beta) ✨🆕✨ +- 🚩 Report post/account +- ⛏️ Static HTML embed code for posts - 🐛 Bug fixes -## May 6, 2024 +## February 25, 2024 -📢 https://mastodon.social/@cheeaun/112394549895936563 +📢 https://mastodon.social/@cheeaun/111992491212397964 -- 👾 Custom emoji search. Hoverable & keyboard-accessible tooltips of shortcodes, with fuzzy search. +- 👀 Show lists containing account in the menu +- 🍽️ Redesigned context menu - 🐛 Bug fixes -## June 3, 2024 +## December 22, 2023 -📢 https://mastodon.social/@cheeaun/112552481684496462 +📢 https://mastodon.social/@cheeaun/111624848853096639 -- ⬇️ Allow minimize composer https://mastodon.social/@cheeaun/112502500959822353 -- ⚠️ Subtle warning if media file size or dimensions are too large https://mastodon.social/@cheeaun/112512838876542558 -- 🗣️ Experimental client-side language detection for unspecified-language posts and composer. 80 to ~95% accuracy, 24 languages, trained dataset from Tatoeba & UDHR, 34KB gzip, powered by TinyLD (light) https://github.com/komodojp/tinyld +- #️⃣ Followed hashtag indicators for non-following posts +- ↔️ Following/followed-by/mutual states in accounts list +- 🔙 Adopt `CloseWatcher` for handling back gesture/button on Chrome Android v120+ https://chromestatus.com/feature/4722261258928128 +- 🗣️ "Speak" menu item for supported browsers +- 🔎 Allow add "Search" in Shortcuts/Columns +- 🛰️ Community deployments https://github.com/cheeaun/phanpy?tab=readme-ov-file#community-deployments - 🐛 Bug fixes -## June 23, 2024 +## November 6, 2023 -📢 https://mastodon.social/@cheeaun/112665474700277373 +📢 https://mastodon.social/@cheeaun/111363831401633676 -- 🏞️ Non-grid layout for media on post pages https://mastodon.social/@cheeaun/112592781655285124 -- 🔗 Posts timeline for trending link (upcoming Mastodon v4.3) https://mastodon.social/@cheeaun/112621183860142350 +- 🏟️ Media gallery layout for hashtag page and profile page (media-only filter) +- 🫰 Small UI touches - 🐛 Bug fixes -## July 22, 2024 +## October 26, 2023 -📢 https://mastodon.social/@cheeaun/112830006096769732 +📢 https://mastodon.social/@cheeaun/111301339529679119 -- 🔔 Experimental opt-in server-side grouped notifications (for upcoming Mastodon v4.3, announced here https://oisaur.com/@renchap/112812306472121018) — it's a bit of a "downgrade" but worth testing. Described as "Potentially improved grouping window but basic grouping logic". -- 🪣 Grouped filtered posts inside boosts carousel +- 🗓️ Experimental month filter for posts on profile page +- 🗞️ Trending news carousel +- 🫰 Replace "Favourite" with "Like" - 🐛 Bug fixes -## August 31, 2024 +## October 2, 2023 -📢 https://mastodon.social/@cheeaun/113056969576068031 +📢 https://mastodon.social/@cheeaun/111166122069800214 -- 💬 Internationalization https://mastodon.social/@cheeaun/112932794480750449 - - 15 languages with >50% translated: Basque, Catalan, Chinese (Simplified), Czech, Finnish, French, Galician, German, Kabyle, Korean, Persian, Portuguese, Portuguese (Brazil), Russian, Spanish - - Volunteer translations: https://crowdin.com/project/phanpy -- 🔔 V2 Notifications policy API https://mastodon.social/@cheeaun/112960426880369332 -- 🔐 Initial OAuth PKCE implementation https://mastodon.social/@cheeaun/113032467744616699 +- 🔔 Web Push notifications (still beta! feedback welcomed 🙏) +- ⌨️ More keyboard shortcuts +- 👀 Profile followers and following list +- 📊 Profile posting stats, shown for accounts that you're not following +- 💁‍♂️ Alt badge — but will conditionally show as inline captions +- 👤 Handle memorial and moved accounts +- 📜 Muted and blocked users list - 🐛 Bug fixes -## October 9, 2024 +## May 11, 2023 -📢 https://mastodon.social/@cheeaun/113272683452140213 +📢 https://mastodon.social/@cheeaun/110350569225129255 -- 💬 4 new languages: Dutch, Esperanto, Italian, Japanese +- 🔔 Notification popover, for larger viewports +- ✨ New experiment: auto-refresh timeline posts +- 🔐 "Private" tab, for Private Mentions, in Mentions page +- 🫴 "Follow requests" section in Notifications page +- 📢 "Announcements" section in Notifications page - 🐛 Bug fixes -Recap: Mastodon v4.3 features (https://github.com/mastodon/mastodon/releases/tag/v4.3.0) already supported on Phanpy: -- Server-side notification grouping (opt-in) -- Filtered notifications -- Severed relationships notifications -- Timeline of public posts about a trending link -- Author highlight for news articles - -## November 13, 2024 +## April 25, 2023 -📢 https://mastodon.social/@cheeaun/113475224009500738 +📢 https://mastodon.social/@cheeaun/110260144082803624 -- 💬 3 new languages: Lithuanian, Norwegian Bokmål, Ukrainian +- #️⃣ Allow hashtag timeline from other instances +- ✏️ Edit Shortcuts +- 🔇 Mute conversation +- 👀 "Full" & "Side peek" views for Status page +- 📶 Slight redesign for multi-column UI +- 🔗 Handle quick post URLs e.g. phanpy.social/#/https://[POST_URL] - a feature from #Elk +- 🧸 Experimental hashtag stuffing collapsing +- 🚀 Quote posts rendering +- 🪄 Experimental cloak mode - 🐛 Bug fixes -## March 12, 2025 - -📢 https://mastodon.social/@cheeaun/114149642985452634 - -- 🎏 Change profile header and avatar -- 🗓️ Scheduled posts -- 🗣️ Experimental implementation of Translator & Language Detector APIs (only Chrome 131 - 137) https://webmachinelearning.github.io/translation-api/ - - The code: https://github.com/cheeaun/phanpy/blob/0759e6431f4572a1d0f10b8eeda0b46b9f14bc0b/src/utils/browser-translator.js -- 🧵 'Add to thread' menu when right-clicking/long-pressing compose button -- 📸 Camera button on composer, if supported (Mobile Safari opens camera, Chrome Android requires one extra step) -- 🐛 Bug fixes +New matrix chat room: https://matrix.to/#/%23phanpy:matrix.org -## April 26, 2025 +## April 7, 2023 -📢 https://mastodon.social/@cheeaun/114404023673367245 +📢 https://mastodon.social/@cheeaun/110157897526115895 -- 🗣️ Migrated to a new API for translations. - - Improved support from 133 to 249 languages -- ⌨️ Keyboard-layout-dependent shortcuts -- 🙈 Handle Mastodon's upcoming `blur` filter https://mastodon.social/@cheeaun/114301571477875063 +- 🪣 Filter bar for profile page statuses with these filters: + - Include replies + - Exclude boosts + - Media only + - Featured hashtags +- 🛒 Lists CRUD and Add/Remove accounts in Lists +- 📑 Sort Followed hashtags +- 📈 New "Trending" timeline page +- @ New "Mentions" page +- ✉️ Show "Private mention" badge +- ⚛️ Boosted/favourited by… accounts list - 🐛 Bug fixes -## June 8, 2025 +## March 31, 2023 -📢 https://mastodon.social/@cheeaun/114647753143423772 +📢 https://mastodon.social/@cheeaun/110118589616753266 -- 🌟 Featured profiles (for upcoming Mastodon v4.4) -- 🔑 Revoke access token when logging out -- 📸 Respect server's media description character limit -- 🪣 Add indicator for exclusive lists -- 🧪 Sandbox https://mastodon.social/@cheeaun/114494995294330803 +- ❌ Delete post +- 🙅 Mention, Mute, Block account +- 🪣 (Partial) Filtered posts UI +- 👥 Posts context grouping in timelines +- 👥 Boosts deduplication (beta) +- 😉 Custom emoji picker +- 🤏 Pinch-zoom for images. Ctrl/Cmd+scroll for pointers. +- 🙈 Setting to hide "Translate" button for specific languages +- 💱 Translate bio, including profile metadata +- 🎚️ Comments thread UI now nest to ∞ levels - 🐛 Bug fixes -## July 18, 2025 +## March 15, 2023 -📢 https://mastodon.social/@cheeaun/114874317126202331 +📢 https://mastodon.social/@cheeaun/110027507724432132 -- 💬 Better display support for Mastodon v4.4's native quote posts -- 🧮 Math formatting for LaTeX +- 👥 Grouped favourites AND boosts notifications +- 🔤 Configurable text size +- 💱 Translation + - Works for spoiler/CW text, post content, poll text AND image description. + - Changeable "source" language selector for intricate cases like multilingual sentences. +- ✨ Beautiful profile sheets and pages +- 🚸 Additional prompt when posting or boosting statuses with media that has no description. - 🐛 Bug fixes -## September 17, 2025 +## March 2, 2023 -📢 https://mastodon.social/@cheeaun/115219986749353363 +📢 https://mastodon.social/@cheeaun/109954214422731984 -- 📝 Composer relayout -- 🔍 Recent searches -- 🏛️ Edit History Snapshots -- 🔰 Show role badges with profile usernames -- ⌛ "X months/years later" hint between list of threads or comments -- 🔗 "Open link?" prompt when clicking links that don't show domain -- 🔬 Larger-than-rendered custom emojis opens up in media modal when clicked. -- 🔭 Zoom in/out buttons in Custom Emojis picker +- 🔗 Handle mastodon post links +- #️⃣ Multi-hashtag timeline (5 max) +- 🥞 Context menu for posts in timeline (tap on timestamp) +- 📑 New tab/menu-bar UI for Shortcuts™️ - 🐛 Bug fixes -## October 9, 2025 +## February 19, 2023 -📢 https://mastodon.social/@cheeaun/115344535219522826 +📢 https://mastodon.social/@cheeaun/109892084130563955 -- 💬 More support for (upcoming) Mastodon v4.5's native quote posts +- 🍰 New menu + pages: Lists, Followed Hashtags, Bookmarks, Favourites, Search, Local, Federated +- 📝 Support edit media description for posted statuses (Mastodon v4.1.0) +- ⚡ Shortcuts™️ (beta) — quick jumping between configured shortcuts +- 🏛️ Experimental multi-column mode, derived from Shortcuts™️ - 🐛 Bug fixes -## November 8, 2025 +## February 1, 2023 -📢 https://mastodon.social/@cheeaun/115514729408923191 +📢 https://mastodon.social/@cheeaun/109785026971372208 -- 🗣️ Reply/Reply all -- ⌨️ Sequential hotkeys, only g>h and g>n for now -- 💈 Decal patterns for posting stats -- 💬 Slightly more support for Mastodon v4.5's native quote posts +- 🔰 ALT badge inside media modals +- 👀 "Show all sensitive content" menu option for threads +- 🧵 Improved Threads UI; smarter collapsing, expand/collapse button with avatars, nesting up to level 4 +- 🪟 Media modal appears beside the Detail page for large screens - 🐛 Bug fixes -## November 26, 2025 +## January 17, 2023 -📢 https://mastodon.social/@cheeaun/115616195859103739 +📢 https://mastodon.social/users/cheeaun/statuses/109704010841850370 -- 🤳 QR code for profiles and shortcuts settings -- 🔃 Import/export accounts -- 📸 Extract description from attached image metadata +- 🔢 Thread count indicator +- 🔐 Handle accept/reject follow requests for locked accounts +- 📬 Unsent draft recovery +- 🎠 Boosts Carousel™️ - 🐛 Bug fixes -## January 7, 2026 +## January 6, 2023 -📢 https://mastodon.social/@cheeaun/115853890477340137 +📢 https://mastodon.social/@cheeaun/109642981521972938 -- 🗓️ Experimental "Year In Posts" +- 🙈 Auto-hide header +- 💅 Small UI changes - 🐛 Bug fixes -## January 31, 2026 +## January 1, 2023 -📢 https://mastodon.social/@cheeaun/115989883020173120 +📢 https://mastodon.social/@cheeaun/109613657018189874 -- ⌨️ More sequential hotkeys, g>s (Settings), g>p (Profile), g>b (Bookmarks) -- 💈 Redesigned poll -- 🛬 Redesigned landing page +- ⌨️ Small list of keyboard shortcuts (j, k, o, meta+enter, esc) - 🐛 Bug fixes -## February 24, 2026 +## December 28, 2022 -📢 https://mastodon.social/@cheeaun/116126267334672277 +📢 https://mastodon.social/@cheeaun/109591442248622453 -- 📤 Allow receiving shared data with the Web Share Target API -- 🔐 Timeline access controls -- 👤 New shortcut: "Profile" -- 📝 "Only followings" filter for Mentions -- ↕️ Preliminary support for vertical-lr writing mode +- 🔠 Language selector in Compose field - 🐛 Bug fixes -## May 15, 2026 +## December 24, 2022 -📢 https://mastodon.social/@cheeaun/116578836866401369 +📢 https://mastodon.social/@cheeaun/109569389041297558 -- 🔄 Experimental paginated timeline -- 🪣 Multi-filters for profile posts -- 🧘 Wellbeing: hide trending, local or federated timelines -- 📱 Haptics -- 🐛 Bug fixes +- 🍰 :shortcode: expander in Compose field +- ⏲️ character count indicator same as Mastodon's front-end (including twitter-text's URL regex) +- 🙈 "Invisible Ink" effect for spoilers -## June 22, 2026 +## December 16, 2022 -📢 https://mastodon.social/@cheeaun/116793733342092207 +📢 https://mastodon.social/@cheeaun/109540685870427959 -- 🗂️ Collections (Mastodon v4.6) -- 🤖 Filter notifications from bots (Mastodon v4.6) -- 🐛 Bug fixes +- 📖 "Read more" for long-form posts +- 🤘 Profile metadata in Account sheet +- 💬 "Only mentions" filter in Notifications +- 🛗 Nested comments + pagination + collapsible comments - \ No newline at end of file diff --git a/README.md b/README.md index 1e1fe03473..f88195adce 100644 --- a/README.md +++ b/README.md @@ -320,7 +320,6 @@ Changelog available here: [CHANGELOG.md](CHANGELOG.md) These are self-hosted by other wonderful folks. -- [ferengi.one](https://m.ferengi.one/) by [@david@weaknotes.com](https://weaknotes.com/@david) - [halo.mookiesplace.com](https://halo.mookiesplace.com) by [@mookie@suigow.xyz](https://suigow.xyz/@mookie) - [phanpy.app](https://phanpy.app) by [@bumble@ibe.social](https://ibe.social/@bumble) - [phanpy.bauxite.tech](https://phanpy.bauxite.tech) by [@b4ux1t3@hachyderm.io](https://hachyderm.io/@b4ux1t3) @@ -430,9 +429,11 @@ Costs involved in running and developing this web app: - rwmpelstilzchen (Esperanto, Hebrew) - SadmL (Russian) - SadmL_AI (Russian) +- scaglio (Italian) - Schishka71 (Russian) - seizeheures (Esperanto) - shuuji3 (Japanese) +- Six-Fifteenths (Chinese Simplified) - Sky_NiniKo (French) - SoleneGK (French) - StasZin4 (Ukrainian) @@ -447,6 +448,7 @@ Costs involved in running and developing this web app: - Vac31. (Lithuanian) - valtlai (Finnish) - Vasirion (Polish) +- vinzv (German) - voitech (Polish) - voyagercy (Chinese Traditional) - xabi_itzultzaile (Basque) diff --git a/package-lock.json b/package-lock.json index 49d7a7785d..cf01f2f1ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "fuse.js": "~7.4.2", "gifuct-js": "~2.1.2", "html-prettify": "~1.0.7", - "idb-keyval": "~6.2.5", + "idb-keyval": "~6.2.6", "intl-locale-textinfo-polyfill": "~3.0.0", "js-cookie": "~3.0.8", "just-debounce-it": "~3.2.0", @@ -36,13 +36,13 @@ "micro-memoize": "~5.1.1", "p-queue": "~9.3.0", "p-retry": "~8.0.0", - "preact": "10.29.2", + "preact": "10.29.3", "punycode": "~2.3.1", "qr": "~0.6.0", "react-hotkeys-hook": "~5.2.4", "react-intersection-observer": "~10.0.3", - "react-quick-pinch-zoom": "~5.1.1", "react-router-dom": "6.6.2", + "react-zoom-pan-pinch": "~4.0.3", "swiped-events": "~1.2.0", "temml": "~0.13.3", "tinyld": "~1.3.4", @@ -55,24 +55,22 @@ "web-haptics": "~0.0.6" }, "devDependencies": { - "@babel/plugin-transform-runtime": "^7.29.0", "@emnapi/core": "~1.11.1", "@emnapi/runtime": "~1.11.1", "@iconify/utils": "~3.1.3", "@lingui/babel-plugin-lingui-macro": "~6.4.0", "@lingui/cli": "~6.4.0", "@lingui/vite-plugin": "~6.4.0", - "@playwright/test": "~1.61.0", + "@playwright/test": "~1.61.1", "@preact/preset-vite": "~2.10.5", - "@types/node": "~26.0.0", - "oxfmt": "~0.55.0", - "postcss": "~8.5.15", + "@types/node": "~26.1.0", + "oxfmt": "~0.57.0", + "postcss": "~8.5.16", "postcss-dark-theme-class": "~2.0.0", - "postcss-preset-env": "~11.3.1", - "prop-types": "^15.8.1", + "postcss-preset-env": "~11.3.2", "sonda": "~0.13.1", "twitter-text": "~3.1.0", - "vite": "~8.0.16", + "vite": "~8.1.2", "vite-plugin-generate-file": "~0.3.1", "vite-plugin-html-config": "~2.0.2", "vite-plugin-pwa": "~1.3.0", @@ -146,29 +144,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -214,13 +212,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -323,14 +321,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -431,9 +429,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -455,13 +453,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1405,41 +1403,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz", - "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", @@ -1780,9 +1743,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", "dev": true, "funding": [ { @@ -1824,9 +1787,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.7.tgz", - "integrity": "sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", + "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", "dev": true, "funding": [ { @@ -1840,7 +1803,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.0.2", + "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.2.1" }, "engines": { @@ -1919,9 +1882,9 @@ } }, "node_modules/@csstools/postcss-alpha-function": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-2.0.6.tgz", - "integrity": "sha512-XaMnJJqqZv4veulLELvM+5caEMcLTsFyqTrkwGKPMF+UbiM7dlQoe4K46EnwfSJIvnm91K1ZXsZSd3OuJ04p9w==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-2.0.7.tgz", + "integrity": "sha512-ueQMpNJfsIUqyOd38Kjc3c7rTaXDLKn0qr9krteAFx3fsSuawXQePAQ02AI5+RbMpdibv+Mfcs4d0AUl/SULsQ==", "dev": true, "funding": [ { @@ -1935,10 +1898,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -1976,9 +1939,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-5.0.5.tgz", - "integrity": "sha512-s+9fU1+sZazUNk0WyKShlfmTLC0fosxNY5x7DiD637xXbZLX2lyce23QrdRhytP3Ja1G77qUk6cRD37N1gemdQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-5.0.6.tgz", + "integrity": "sha512-CHWuCfTg7afbSFMgVajmF1WU/bJ1rGBKGCj3L3tolDXZpQG2ZCQRu10ozfk1I10By9aRqQ43FTnAiDwBnbC+Hg==", "dev": true, "funding": [ { @@ -1992,10 +1955,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2006,9 +1969,9 @@ } }, "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-2.0.5.tgz", - "integrity": "sha512-YzY5qI0S/CsvqvMSiDn85ZyTCRLdnywxQn+6Fv8AU17aCE/fjcor54OSdVb/HlABBTcBq+d8NlWcLz11Bmo2mQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-2.0.6.tgz", + "integrity": "sha512-65C1CF/d9/ULr7dwmE5TBrRYZVa5sWLZX7mlR7WcBl1YwSYA8ntOvAhEEZmq8B2rBgosrOjZcDLnvFQuGaoRcA==", "dev": true, "funding": [ { @@ -2022,10 +1985,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2036,9 +1999,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-4.0.5.tgz", - "integrity": "sha512-eBrrzTKudOlDl2XOJzW/pzHPIkC8tGkcGpNiFO/vmevb08U1huYEINhlxr8iz4OzSqs1GtiJx4d2v5iHFOZjNw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-4.0.6.tgz", + "integrity": "sha512-gWXS+Qx4GnIq4lRvBcabAcGF5IBkfcbZ7uoUvQw/3+JYDQVkD8SoKIFRoYhwKAOm+zTDJRYLMsjxWieBh9xOZw==", "dev": true, "funding": [ { @@ -2052,10 +2015,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2066,9 +2029,9 @@ } }, "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-2.0.5.tgz", - "integrity": "sha512-O4tE1hZXfEAbTP1IC2R857KjPCLNtpsFUqY2dqgycF/3M6GuFyJI20EWwkxVZzlSFvWdIcNppwRf9pxPFn0qnA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-2.0.6.tgz", + "integrity": "sha512-+bL0RlSDLM/02Z2JgxMK2AIas8IIL4fQkFsjETmMIXFSmOH+iRx1YEKyMbc3SogmiR8zJ41Eid7Q8+bxj7+2Dg==", "dev": true, "funding": [ { @@ -2082,10 +2045,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2123,9 +2086,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-3.0.1.tgz", - "integrity": "sha512-mK5lCgzgV/ZC+LgnFy4rAQVMcXR6HsnX3D1+4Q5gshSQsst5TtcvHbxTdzKy1XTv09sNZHJX8CO4CEQF9zA4ug==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-3.0.2.tgz", + "integrity": "sha512-LUT1eKBzb71pmky0ke2OHJHdcqHl1vtl++qzJei5FioMVWDzxVApElTZsoFwbqV8Et+UmxzieOuhwomuyRullw==", "dev": true, "funding": [ { @@ -2141,7 +2104,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2152,9 +2115,9 @@ } }, "node_modules/@csstools/postcss-contrast-color-function": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-3.0.5.tgz", - "integrity": "sha512-gfdTZ4a5ioL2zM/yN2FqExy6rql+6egkI5sDuK9MvrbfrVJMzB0OjiCkboT5UprU/P0JwfTiIutW1ZSyqK4Icw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-3.0.6.tgz", + "integrity": "sha512-7H+LLv2+A5q/l9TdWLnLB7ZgMT92aOVImzVpYSHg9pCEHSeskbqssn05rKb+ysouRM8rbg649Q2g2kIKFqLYvQ==", "dev": true, "funding": [ { @@ -2168,10 +2131,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2263,9 +2226,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-3.0.5.tgz", - "integrity": "sha512-X6XkKkR9R8KyJey9n1ryEzzfX6WpihPz/JBsyIVvxAlztQcMjMA7I9mMybWVv3ZyRMC+0+H7RlIUe85vZkasNQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-3.0.6.tgz", + "integrity": "sha512-lopCMFvN6ohy33lLmOY46matUrpL1ymVGOyebflzMb44pXoGy+f27glXCXz0PfQmfv8On3a8eVTIQfkX7nf6gQ==", "dev": true, "funding": [ { @@ -2279,7 +2242,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" }, @@ -2291,9 +2254,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-6.0.5.tgz", - "integrity": "sha512-wXiZI6bLRAGcw7XuzsqqPnTVNrHFkHTkcymK2su+ynJjemfCdpCD9HdG+ICikPqtQ782r6LSZdyC3cDhSQqF3Q==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-6.0.6.tgz", + "integrity": "sha512-n23eZrwg8/XT6Ml42AAMd1PqRSm1LlrcGL+cbflpjL84xVZcWsXtHeKVzufg2uxICGnB4/t/iGa4XnOfySusEA==", "dev": true, "funding": [ { @@ -2307,10 +2270,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2321,9 +2284,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-5.0.5.tgz", - "integrity": "sha512-HeJOXAMr1nYHZ7gJT1+6d899X9Y+5qJcpbLJ8WzhujQOIB4oqbzeP3769sd1xl3eH4qbasxtewxr4crs08SEQw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-5.0.6.tgz", + "integrity": "sha512-KO1PBdiyzsxVOnripQbdMF8jXlBym3CtwEWHGQWfjRB2Q7BIU6sE9GGv2OrgG3TyqPOz5BgAwackYlYlVeHWvA==", "dev": true, "funding": [ { @@ -2337,10 +2300,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2351,9 +2314,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-5.0.1.tgz", - "integrity": "sha512-jmsVLXPdMBTlaJAhiEijhIR3qL0j75MrlRfhJEs91DF1Wlt2kpJTDsbpXQpYFzn1nPFHZC/WEf+Mw0I/HXkHzQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-5.0.2.tgz", + "integrity": "sha512-1Wcp0ACoGKImCL9mYm6EIdqtT2JuJoeFp/06Efa6pRT0y3elLgF3jYer+c3+qUoBhV/2uDKtfWrCwAkHJ0CB9w==", "dev": true, "funding": [ { @@ -2367,7 +2330,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2379,9 +2342,9 @@ } }, "node_modules/@csstools/postcss-image-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-image-function/-/postcss-image-function-1.0.0.tgz", - "integrity": "sha512-iuQztV6Cfeuc7NczazfickrzEhALOpxUS0yWgGkmRY1zZ0CKjBBFc/7WWSN9qupfpNAzHY7cPNcJCqUhtr+YMw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-image-function/-/postcss-image-function-1.0.1.tgz", + "integrity": "sha512-6V7+8npoBxVgO3JbIdKqI6eo1NAIQtO0oNSfLSgH439WYB43/kM+GneG4elkgglRo1ppgVhjXxmNqhI+K4pEzg==", "dev": true, "funding": [ { @@ -2397,7 +2360,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2458,9 +2421,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-3.0.1.tgz", - "integrity": "sha512-tD2MMJmZ6XXCHgDythLHcXQDNi5z7KEEWPe7JeB3vPcw+YMuMabpW5ugRqndhIrui+vduhc0Md7f7yGPCmOErg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-3.0.2.tgz", + "integrity": "sha512-Fu6si5QhRrT5lP7nmXxfowR8zNkYrqoolsWOZxPZBZpVTdoEKazN6v+K53vPcy1EM4Mlj6tSaEjMu4gAwC8yqw==", "dev": true, "funding": [ { @@ -2476,7 +2439,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2746,9 +2709,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-5.0.5.tgz", - "integrity": "sha512-A+Nkzj2ODvQboM5FlqEcp0iqilyVo78f9FMx/3cHrRrEBqCymSXvf8sa1cTY54lJoUVI3Sn9XysgvYaVIAuIYg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-5.0.6.tgz", + "integrity": "sha512-6yZ+OySSaBybv12OfgKFBgCK1Se2mBbhh9eIDbUdWGHJUXZPQoLbtPj8S6Wg0lqe0nTqKgY/l8Ir9lHrm2TUBQ==", "dev": true, "funding": [ { @@ -2762,10 +2725,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -2799,9 +2762,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-5.1.0.tgz", - "integrity": "sha512-lt/4yHy2GdKcGVpK4OGhBdSIq+z2PXynSusSRggn/T4y7uFurYAhdHqo/aYM+xI37vNb8rJlEKchqKKvVCXROQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-5.1.1.tgz", + "integrity": "sha512-b9+lusgVDTHXRBgYKE9s0RKUyEn6Q/knmMDmYmSrkZjtpb0Nd71pBtgVMf9tSpOIb0K8hyzeyy6JyKFqg5rBJw==", "dev": true, "funding": [ { @@ -2880,9 +2843,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-4.0.5.tgz", - "integrity": "sha512-kBzf+LIm824cpjsZPhNtl/2N1KK+TXnxy8Kce4y+pEAQSrxhpX6WDUg54wjdHBGx2UZUXKBnlaUOsc71sSRDvg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-4.0.6.tgz", + "integrity": "sha512-4SUC+qfJE/8sV62oo/fcxNKSBgiSVqE8c7f9TBwvNY3WnD0YHJyEM3eIjXn1CxbMNl7gR6uBVuLuJB3xgr/O1w==", "dev": true, "funding": [ { @@ -2896,10 +2859,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -3045,9 +3008,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-5.0.3.tgz", - "integrity": "sha512-62fjggvIM1YYfDJPcErMUDkEZB6CByG8neTJqexnZe1hRBgCjD4dnXDLoCSSurjs1LzjBq6irFDpDaOvDZfrlw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-5.0.4.tgz", + "integrity": "sha512-LHQL1a0CW0j3oBEivwgp1Gqv+VUppWpEyedM9GBzE6yIT6tnZqY9v0ADX1jO6IptTZTdrnBwM+dveDIuUP+pTA==", "dev": true, "funding": [ { @@ -3061,7 +3024,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^6.0.2", + "@csstools/color-helpers": "^6.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -4107,14 +4070,14 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.2" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -4126,9 +4089,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", "dev": true, "license": "MIT", "funding": { @@ -4136,9 +4099,9 @@ } }, "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.55.0.tgz", - "integrity": "sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.57.0.tgz", + "integrity": "sha512-qVBsEO+KugOsCmUHcO8iqNnqc65p7PCKpCs8M66mPZ+Ri+CWbcpoQOEJBg2OTu03+0qu++NK1jj6IzvQVs0Sig==", "cpu": [ "arm" ], @@ -4153,9 +4116,9 @@ } }, "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.55.0.tgz", - "integrity": "sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.57.0.tgz", + "integrity": "sha512-mp6PibWbao3aizijcheOeHQaYEhcUAt8pwLniYbtLfHxL/psFF0BykAwCj+s3c6qIpa8yN8keZICWrqtZ70w8g==", "cpu": [ "arm64" ], @@ -4170,9 +4133,9 @@ } }, "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.55.0.tgz", - "integrity": "sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.57.0.tgz", + "integrity": "sha512-T+0stuCBqmUVY+aMIvrgXhzGhHO3sD5tNiiEcYqgSdPsnukskQqn2u5qOVD0sv1l7RLdFS5Z/f5Wi9Ktyjr3Eg==", "cpu": [ "arm64" ], @@ -4187,9 +4150,9 @@ } }, "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.55.0.tgz", - "integrity": "sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.57.0.tgz", + "integrity": "sha512-O+3JbqWs/mCI2oi4xfhRO2IVPFJNDDEBV8Odo+ZpmsUOeKJfjXoNH7nDmBEQcDgK7NfjDIyE7kRgYSZcTLDO0A==", "cpu": [ "x64" ], @@ -4204,9 +4167,9 @@ } }, "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.55.0.tgz", - "integrity": "sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.57.0.tgz", + "integrity": "sha512-pxwhxVC+JkLX9twOQ/8C/vbuOQcMZyKIDmiRDZfO7yITuVcIdZCiLRqqf4QOxb2+8FWrRXzQpm+1DBKcMpHSSQ==", "cpu": [ "x64" ], @@ -4221,9 +4184,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.55.0.tgz", - "integrity": "sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.57.0.tgz", + "integrity": "sha512-pxBU4zH2imB/MDBfth2rOMeVxXUMjRQLCazagwLARIFH3hVlxZJBlM4nSnHXaIHJK4/qezoFCIORN6AY8Mra4A==", "cpu": [ "arm" ], @@ -4238,9 +4201,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.55.0.tgz", - "integrity": "sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.57.0.tgz", + "integrity": "sha512-JAprOzt8tycYou36ZgEw14DlRHTiN8qdtKANdV3VZIRIvTI/lh/cX13c9pJ/EnDk2GT3FASH7KvCgQ2AufAifQ==", "cpu": [ "arm" ], @@ -4255,9 +4218,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.55.0.tgz", - "integrity": "sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.57.0.tgz", + "integrity": "sha512-ajtjaxSaj9xl4BW7REt+Cef/ttzbAq00Bq4z7JUDZEfgFXdwSjH8K9bF+IcIJzZB9lKqMfQ4eHuSFOvvlvtqOg==", "cpu": [ "arm64" ], @@ -4275,9 +4238,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.55.0.tgz", - "integrity": "sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.57.0.tgz", + "integrity": "sha512-p4Y/+RYk9Bk5WO+zHSUXAClRmZ2fbJCejMuCAsU2HhyME4jqf6Ftt/mJYEwIah1wGCBDYOB7wEGV1x5bCEZ6hA==", "cpu": [ "arm64" ], @@ -4295,9 +4258,9 @@ } }, "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.55.0.tgz", - "integrity": "sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.57.0.tgz", + "integrity": "sha512-By6tRALAZsno0F4zedmtG+wdMvJiJmJoXM4d3+A9zHE4HRXLqXITwRH8mgrlcXc5yJM2g2W3riRPwTYdgemZLQ==", "cpu": [ "ppc64" ], @@ -4315,9 +4278,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.55.0.tgz", - "integrity": "sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.57.0.tgz", + "integrity": "sha512-skYeG+RgvyzspqVEBsEprL90OYYZfoVNqB3HcCNR6QDJyXKOzfDRT3zncnHmUaFluIlBHuY23mU1b5WGgR98hA==", "cpu": [ "riscv64" ], @@ -4335,9 +4298,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.55.0.tgz", - "integrity": "sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.57.0.tgz", + "integrity": "sha512-FFgACrZOXAXUh5KQh2mt1CDOVOZmn+QzHP71wM9QobNwyQvoFfyAeefVUltW83g3sm7LTiH3yfFqLLVUpA5ZFQ==", "cpu": [ "riscv64" ], @@ -4355,9 +4318,9 @@ } }, "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.55.0.tgz", - "integrity": "sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.57.0.tgz", + "integrity": "sha512-Nm/BAOfQeFiiKd502mZn/GAVKJwtd0RdCg17G3Wz/WSOIQmDi3+7/SZH4BHn1Ye5KvTVH3ua8WvfwLLycNIuvA==", "cpu": [ "s390x" ], @@ -4375,9 +4338,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.55.0.tgz", - "integrity": "sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.57.0.tgz", + "integrity": "sha512-BiSy5Ku3mQqyxS6YIqAJgd403wEUWvI7kerfzPxc2l/txZVmZM0pSj7oDM+4bGBExowxOi7o73jEam1W0EDTZg==", "cpu": [ "x64" ], @@ -4395,9 +4358,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.55.0.tgz", - "integrity": "sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.57.0.tgz", + "integrity": "sha512-BCRkJiotz5s9afLYD2LuMvzAoDYx9H17E/YbDyu4xK7l4zHDPeny9ErSXL//i/nJyaOwRk08x4b8cgJC00+JDg==", "cpu": [ "x64" ], @@ -4415,9 +4378,9 @@ } }, "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.55.0.tgz", - "integrity": "sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.57.0.tgz", + "integrity": "sha512-4Oaxe1qrGgXfpCJ1C/ERJ2iCtV2rN1R79ga9fsfyVHfSQRu/hVW780u2KDqZWFZ/iGTHODJji0JemxqFZ63eIQ==", "cpu": [ "arm64" ], @@ -4432,9 +4395,9 @@ } }, "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.55.0.tgz", - "integrity": "sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.57.0.tgz", + "integrity": "sha512-MYLAsDnhdNsSGheLYhWgbk0vfIrlS84iQYun/y21fX6u0jj8iBtYtbpZMdiqYeuf8U12eVPUjVY2xE2NrCfJ0g==", "cpu": [ "arm64" ], @@ -4449,9 +4412,9 @@ } }, "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.55.0.tgz", - "integrity": "sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.57.0.tgz", + "integrity": "sha512-PBwdzZALJY/jcCx2E6is0yu+cuVXeySTDmwuseD+9j0mHqlRNxwlKgsyRTBed/woPeqfVfuXfWjoq4Cx2Zt3Eg==", "cpu": [ "ia32" ], @@ -4466,9 +4429,9 @@ } }, "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.55.0.tgz", - "integrity": "sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.57.0.tgz", + "integrity": "sha512-bQJdH9i4RRfw55jm7+8/xS7GzHLLTbHx4huhrrDxQJaJtbSDbsyOnODvP1ftT7EG0KFKAYO2S+q6AcioXODx8w==", "cpu": [ "x64" ], @@ -4483,13 +4446,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.61.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.0.tgz", - "integrity": "sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.61.0" + "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -4600,9 +4563,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", + "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", "cpu": [ "arm64" ], @@ -4617,9 +4580,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", + "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", "cpu": [ "arm64" ], @@ -4634,9 +4597,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", + "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", "cpu": [ "x64" ], @@ -4651,9 +4614,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", + "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", "cpu": [ "x64" ], @@ -4668,9 +4631,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", + "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", "cpu": [ "arm" ], @@ -4685,9 +4648,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", + "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", "cpu": [ "arm64" ], @@ -4705,9 +4668,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", + "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", "cpu": [ "arm64" ], @@ -4725,9 +4688,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", + "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", "cpu": [ "ppc64" ], @@ -4745,9 +4708,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", + "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", "cpu": [ "s390x" ], @@ -4765,9 +4728,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", + "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", "cpu": [ "x64" ], @@ -4785,9 +4748,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", + "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", "cpu": [ "x64" ], @@ -4805,9 +4768,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", + "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", "cpu": [ "arm64" ], @@ -4822,9 +4785,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", + "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", "cpu": [ "wasm32" ], @@ -4832,52 +4795,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", + "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", "cpu": [ "arm64" ], @@ -4892,9 +4821,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", + "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", "cpu": [ "x64" ], @@ -4909,9 +4838,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0.tgz", - "integrity": "sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, @@ -5460,9 +5389,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", "optional": true, @@ -5502,9 +5431,9 @@ } }, "node_modules/@types/node": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz", - "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.0.tgz", + "integrity": "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==", "license": "MIT", "dependencies": { "undici-types": "~8.3.0" @@ -7316,9 +7245,9 @@ "license": "ISC" }, "node_modules/idb-keyval": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.5.tgz", - "integrity": "sha512-eKQkTnS0relYsSOYomx8ozIbmdsQCKUdhyuIaQ2DZgKuaxtyQQMkyD/wlnQN32pO3yutN1b1L8uqwcDKaJd7/Q==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.6.tgz", + "integrity": "sha512-FY64UEhw+5liMzMQ1R9Mw6AF0+wyBrg1CIA1z4CjI/EvT5ty/SvQcWZgd8s9sgaNhX10Y8UzScTh89tEAls5nA==", "license": "Apache-2.0" }, "node_modules/import-meta-resolve": { @@ -7927,10 +7856,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -8336,6 +8275,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", + "peer": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -8569,16 +8509,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8740,9 +8670,9 @@ } }, "node_modules/oxfmt": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.55.0.tgz", - "integrity": "sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.57.0.tgz", + "integrity": "sha512-ZB7Bi+rGDSqmVIo9jwcLyFgjxXvQhDdU+jx+ZrVy6VRiVXK2+CHc4hO3J4dUQjHe7V0ymHB+MDuv5z+NhK07HA==", "dev": true, "license": "MIT", "dependencies": { @@ -8758,25 +8688,25 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxfmt/binding-android-arm-eabi": "0.55.0", - "@oxfmt/binding-android-arm64": "0.55.0", - "@oxfmt/binding-darwin-arm64": "0.55.0", - "@oxfmt/binding-darwin-x64": "0.55.0", - "@oxfmt/binding-freebsd-x64": "0.55.0", - "@oxfmt/binding-linux-arm-gnueabihf": "0.55.0", - "@oxfmt/binding-linux-arm-musleabihf": "0.55.0", - "@oxfmt/binding-linux-arm64-gnu": "0.55.0", - "@oxfmt/binding-linux-arm64-musl": "0.55.0", - "@oxfmt/binding-linux-ppc64-gnu": "0.55.0", - "@oxfmt/binding-linux-riscv64-gnu": "0.55.0", - "@oxfmt/binding-linux-riscv64-musl": "0.55.0", - "@oxfmt/binding-linux-s390x-gnu": "0.55.0", - "@oxfmt/binding-linux-x64-gnu": "0.55.0", - "@oxfmt/binding-linux-x64-musl": "0.55.0", - "@oxfmt/binding-openharmony-arm64": "0.55.0", - "@oxfmt/binding-win32-arm64-msvc": "0.55.0", - "@oxfmt/binding-win32-ia32-msvc": "0.55.0", - "@oxfmt/binding-win32-x64-msvc": "0.55.0" + "@oxfmt/binding-android-arm-eabi": "0.57.0", + "@oxfmt/binding-android-arm64": "0.57.0", + "@oxfmt/binding-darwin-arm64": "0.57.0", + "@oxfmt/binding-darwin-x64": "0.57.0", + "@oxfmt/binding-freebsd-x64": "0.57.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.57.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.57.0", + "@oxfmt/binding-linux-arm64-gnu": "0.57.0", + "@oxfmt/binding-linux-arm64-musl": "0.57.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.57.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.57.0", + "@oxfmt/binding-linux-riscv64-musl": "0.57.0", + "@oxfmt/binding-linux-s390x-gnu": "0.57.0", + "@oxfmt/binding-linux-x64-gnu": "0.57.0", + "@oxfmt/binding-linux-x64-musl": "0.57.0", + "@oxfmt/binding-openharmony-arm64": "0.57.0", + "@oxfmt/binding-win32-arm64-msvc": "0.57.0", + "@oxfmt/binding-win32-ia32-msvc": "0.57.0", + "@oxfmt/binding-win32-x64-msvc": "0.57.0" }, "peerDependencies": { "svelte": "^5.0.0", @@ -8912,13 +8842,13 @@ } }, "node_modules/playwright": { - "version": "1.61.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.0.tgz", - "integrity": "sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.61.0" + "playwright-core": "1.61.1" }, "bin": { "playwright": "cli.js" @@ -8931,9 +8861,9 @@ } }, "node_modules/playwright-core": { - "version": "1.61.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.0.tgz", - "integrity": "sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==", + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8964,9 +8894,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -9035,9 +8965,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-8.0.5.tgz", - "integrity": "sha512-Cxr97Vtt2VeJCGaex0JNSU5MViqYtjKmJLHKM+jI7d+qIs0J5xgHEVG6Q2bTCaFJ1yjcFz9s9VmWCibuzk3+MA==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-8.0.6.tgz", + "integrity": "sha512-JwHsQNb/zzjRN/RFdhWWb3bk6WiNs7KW85+vYtLP1YVL6MgPQn/2qNMgFrjD8Ymg+wfP3XlwtSrYUI+K4zPvHA==", "dev": true, "funding": [ { @@ -9051,10 +8981,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -9259,9 +9189,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-7.0.1.tgz", - "integrity": "sha512-M69I4EolEGwiYa0KmxKWg4zZp2DxhlNM0Bz12OvHCj930GXDVCvFhdWNGsRscz6BIijN6tFryzSFsy8kMLyD5Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-7.0.2.tgz", + "integrity": "sha512-X62YBNOxoCVvoUpV3uxdg5h86nbzJwF0ogLrgHUL73YsX8FJ5pGeOxRuaUcqhHxQ4wcoKY+O55lJAyCGsxZLJA==", "dev": true, "funding": [ { @@ -9275,7 +9205,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0", "postcss-value-parser": "^4.2.0" }, @@ -9399,9 +9329,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-8.0.5.tgz", - "integrity": "sha512-ohQnYx1LloPkiLQhAjpt/Y9tAGCGOBOUaxgbcmO+1bDTFzUQCTfdpemOVh6oewI4V2K6q7+Vz8d3rP1glvK3uw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-8.0.6.tgz", + "integrity": "sha512-zFU65d+uKFTdkvJWPpEMgRwY0gh7RN5FD4aWfLxbeXeAkITSpODG6nH2GKAdbnA4jWjyPac1lw8osw+1ATMcWg==", "dev": true, "funding": [ { @@ -9415,10 +9345,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^4.1.7", + "@csstools/css-color-parser": "^4.1.9", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/utilities": "^3.0.0" }, "engines": { @@ -9568,9 +9498,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-11.3.1.tgz", - "integrity": "sha512-ox2lu2L0fbuKXB0zRcUFCNii7koS9+fNLFqj+WOKaJ4DU/zZsYkFHOmz73lWNTKx8OHDqnV0R7Si98PIbJXLjQ==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-11.3.2.tgz", + "integrity": "sha512-O7aA42UBH/89RkGy1YXgJqb+LxZ2+zvR8bHn9qyYcYc+lOo4g9TuIpb75nZT1tN77Bd6pX3DMZ+eYohS4MfKQg==", "dev": true, "funding": [ { @@ -9584,26 +9514,26 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-alpha-function": "^2.0.6", + "@csstools/postcss-alpha-function": "^2.0.7", "@csstools/postcss-cascade-layers": "^6.0.0", - "@csstools/postcss-color-function": "^5.0.5", - "@csstools/postcss-color-function-display-p3-linear": "^2.0.5", - "@csstools/postcss-color-mix-function": "^4.0.5", - "@csstools/postcss-color-mix-variadic-function-arguments": "^2.0.5", + "@csstools/postcss-color-function": "^5.0.6", + "@csstools/postcss-color-function-display-p3-linear": "^2.0.6", + "@csstools/postcss-color-mix-function": "^4.0.6", + "@csstools/postcss-color-mix-variadic-function-arguments": "^2.0.6", "@csstools/postcss-container-rule-prelude-list": "^1.0.1", - "@csstools/postcss-content-alt-text": "^3.0.1", - "@csstools/postcss-contrast-color-function": "^3.0.5", + "@csstools/postcss-content-alt-text": "^3.0.2", + "@csstools/postcss-contrast-color-function": "^3.0.6", "@csstools/postcss-exponential-functions": "^3.0.3", "@csstools/postcss-font-format-keywords": "^5.0.0", "@csstools/postcss-font-width-property": "^1.0.0", - "@csstools/postcss-gamut-mapping": "^3.0.5", - "@csstools/postcss-gradients-interpolation-method": "^6.0.5", - "@csstools/postcss-hwb-function": "^5.0.5", - "@csstools/postcss-ic-unit": "^5.0.1", - "@csstools/postcss-image-function": "^1.0.0", + "@csstools/postcss-gamut-mapping": "^3.0.6", + "@csstools/postcss-gradients-interpolation-method": "^6.0.6", + "@csstools/postcss-hwb-function": "^5.0.6", + "@csstools/postcss-ic-unit": "^5.0.2", + "@csstools/postcss-image-function": "^1.0.1", "@csstools/postcss-initial": "^3.0.0", "@csstools/postcss-is-pseudo-class": "^6.0.0", - "@csstools/postcss-light-dark-function": "^3.0.1", + "@csstools/postcss-light-dark-function": "^3.0.2", "@csstools/postcss-logical-float-and-clear": "^4.0.0", "@csstools/postcss-logical-overflow": "^3.0.0", "@csstools/postcss-logical-overscroll-behavior": "^3.0.0", @@ -9614,18 +9544,18 @@ "@csstools/postcss-mixins": "^1.0.0", "@csstools/postcss-nested-calc": "^5.0.0", "@csstools/postcss-normalize-display-values": "^5.0.1", - "@csstools/postcss-oklab-function": "^5.0.5", + "@csstools/postcss-oklab-function": "^5.0.6", "@csstools/postcss-position-area-property": "^2.0.0", - "@csstools/postcss-progressive-custom-properties": "^5.1.0", + "@csstools/postcss-progressive-custom-properties": "^5.1.1", "@csstools/postcss-property-rule-prelude-list": "^2.0.0", "@csstools/postcss-random-function": "^3.0.3", - "@csstools/postcss-relative-color-syntax": "^4.0.5", + "@csstools/postcss-relative-color-syntax": "^4.0.6", "@csstools/postcss-scope-pseudo-class": "^5.0.0", "@csstools/postcss-sign-functions": "^2.0.3", "@csstools/postcss-stepped-value-functions": "^5.0.3", "@csstools/postcss-syntax-descriptor-syntax-production": "^2.0.0", "@csstools/postcss-system-ui-font-family": "^2.0.0", - "@csstools/postcss-text-decoration-shorthand": "^5.0.3", + "@csstools/postcss-text-decoration-shorthand": "^5.0.4", "@csstools/postcss-trigonometric-functions": "^5.0.3", "@csstools/postcss-unset-value": "^5.0.0", "autoprefixer": "^10.5.0", @@ -9636,20 +9566,20 @@ "cssdb": "^8.9.0", "postcss-attribute-case-insensitive": "^8.0.0", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^8.0.5", + "postcss-color-functional-notation": "^8.0.6", "postcss-color-hex-alpha": "^11.0.0", "postcss-color-rebeccapurple": "^11.0.0", "postcss-custom-media": "^12.0.1", "postcss-custom-properties": "^15.0.1", "postcss-custom-selectors": "^9.0.1", "postcss-dir-pseudo-class": "^10.0.0", - "postcss-double-position-gradients": "^7.0.1", + "postcss-double-position-gradients": "^7.0.2", "postcss-focus-visible": "^11.0.0", "postcss-focus-within": "^10.0.0", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^7.0.0", "postcss-image-set-function": "^8.0.0", - "postcss-lab-function": "^8.0.5", + "postcss-lab-function": "^8.0.6", "postcss-logical": "^9.0.0", "postcss-nesting": "^14.0.0", "postcss-opacity-percentage": "^3.0.0", @@ -9751,9 +9681,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.29.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.2.tgz", - "integrity": "sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==", + "version": "10.29.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.3.tgz", + "integrity": "sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==", "license": "MIT", "funding": { "type": "opencollective", @@ -9799,25 +9729,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "devOptional": true, - "license": "MIT" - }, "node_modules/proxy-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", @@ -9926,31 +9837,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/react-quick-pinch-zoom": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-quick-pinch-zoom/-/react-quick-pinch-zoom-5.1.1.tgz", - "integrity": "sha512-x+uL7n0Y8OA+W3wvAEWDQlVkHcsD1BRYow3k3Z5Kki6CaQY92qxQbOrPvs2PC1ygzJpcqFwp+MzMyjlgyWsYCQ==", - "license": "MIT", - "dependencies": { - "tslib": ">=2.0.0" - }, - "peerDependencies": { - "prop-types": ">=15.0.0", - "react": ">=16.4.0", - "react-dom": ">=16.4.0" - }, - "peerDependenciesMeta": { - "prop-types": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/react-router": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.6.2.tgz", @@ -9993,6 +9879,20 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-zoom-pan-pinch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-4.0.3.tgz", + "integrity": "sha512-N2Hi6L78fFmhRra+ORpFSW7WST5x6kxpOPplIvtB0b7b+U2anpo1z1wLgaWRPS2kUSqcraRG+JgBCIlDJnqqAg==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", @@ -10159,13 +10059,13 @@ } }, "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", + "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.133.0", + "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -10175,21 +10075,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" + "@rolldown/binding-android-arm64": "1.1.3", + "@rolldown/binding-darwin-arm64": "1.1.3", + "@rolldown/binding-darwin-x64": "1.1.3", + "@rolldown/binding-freebsd-x64": "1.1.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", + "@rolldown/binding-linux-arm64-gnu": "1.1.3", + "@rolldown/binding-linux-arm64-musl": "1.1.3", + "@rolldown/binding-linux-ppc64-gnu": "1.1.3", + "@rolldown/binding-linux-s390x-gnu": "1.1.3", + "@rolldown/binding-linux-x64-gnu": "1.1.3", + "@rolldown/binding-linux-x64-musl": "1.1.3", + "@rolldown/binding-openharmony-arm64": "1.1.3", + "@rolldown/binding-wasm32-wasi": "1.1.3", + "@rolldown/binding-win32-arm64-msvc": "1.1.3", + "@rolldown/binding-win32-x64-msvc": "1.1.3" } }, "node_modules/rollup": { @@ -10941,6 +10841,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/twemoji-parser": { @@ -11271,16 +11172,16 @@ } }, "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.2.tgz", + "integrity": "sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", + "postcss": "^8.5.16", + "rolldown": "~1.1.3", "tinyglobby": "^0.2.17" }, "bin": { @@ -11297,7 +11198,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", + "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -11887,9 +11788,9 @@ } }, "node_modules/ws": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", - "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index c6a0e22fcc..8c3758af24 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "fuse.js": "~7.4.2", "gifuct-js": "~2.1.2", "html-prettify": "~1.0.7", - "idb-keyval": "~6.2.5", + "idb-keyval": "~6.2.6", "intl-locale-textinfo-polyfill": "~3.0.0", "js-cookie": "~3.0.8", "just-debounce-it": "~3.2.0", @@ -56,13 +56,13 @@ "micro-memoize": "~5.1.1", "p-queue": "~9.3.0", "p-retry": "~8.0.0", - "preact": "10.29.2", + "preact": "10.29.3", "punycode": "~2.3.1", "qr": "~0.6.0", "react-hotkeys-hook": "~5.2.4", "react-intersection-observer": "~10.0.3", - "react-quick-pinch-zoom": "~5.1.1", "react-router-dom": "6.6.2", + "react-zoom-pan-pinch": "~4.0.3", "swiped-events": "~1.2.0", "temml": "~0.13.3", "tinyld": "~1.3.4", @@ -75,24 +75,22 @@ "web-haptics": "~0.0.6" }, "devDependencies": { - "@babel/plugin-transform-runtime": "^7.29.0", "@emnapi/core": "~1.11.1", "@emnapi/runtime": "~1.11.1", "@iconify/utils": "~3.1.3", "@lingui/babel-plugin-lingui-macro": "~6.4.0", "@lingui/cli": "~6.4.0", "@lingui/vite-plugin": "~6.4.0", - "@playwright/test": "~1.61.0", + "@playwright/test": "~1.61.1", "@preact/preset-vite": "~2.10.5", - "@types/node": "~26.0.0", - "oxfmt": "~0.55.0", - "postcss": "~8.5.15", + "@types/node": "~26.1.0", + "oxfmt": "~0.57.0", + "postcss": "~8.5.16", "postcss-dark-theme-class": "~2.0.0", - "postcss-preset-env": "~11.3.1", - "prop-types": "^15.8.1", + "postcss-preset-env": "~11.3.2", "sonda": "~0.13.1", "twitter-text": "~3.1.0", - "vite": "~8.0.16", + "vite": "~8.1.2", "vite-plugin-generate-file": "~0.3.1", "vite-plugin-html-config": "~2.0.2", "vite-plugin-pwa": "~1.3.0", @@ -107,9 +105,7 @@ }, "//notes": [ "@emnapi/core and @emnapi/runtime are temporary fixes for https://github.com/napi-rs/napi-rs/issues/3174", - "react-quick-pinch-zoom requires prop-types", - "playwright uses @types/node", - "@babel/plugin-transform-runtime fixes peer dep conflict from @lingui/vite-plugin pulling in babel 8" + "playwright uses @types/node" ], "postcss": { "plugins": { @@ -149,6 +145,8 @@ "allowScripts": { "core-js@2.6.12": true, "exifreader@4.41.0": true, - "esbuild@0.25.12": true + "esbuild@0.25.12": true, + "fsevents@2.3.2": true, + "fsevents@2.3.3": true } } diff --git a/scripts/bundle-sizes-diff-md.js b/scripts/bundle-sizes-diff-md.js new file mode 100644 index 0000000000..1873411d0d --- /dev/null +++ b/scripts/bundle-sizes-diff-md.js @@ -0,0 +1,232 @@ +#!/usr/bin/env node + +import { readFileSync, existsSync } from 'fs'; + +const GZIP_NOISE_THRESHOLD = 100; + +const refFile = process.argv[2]; +const curFile = process.argv[3]; + +if (!refFile || !curFile) { + console.error( + 'Usage: bundle-sizes-diff-md.js ', + ); + process.exit(1); +} + +function parseSizes(filePath) { + if (!existsSync(filePath)) return []; + const content = readFileSync(filePath, 'utf-8'); + const rows = []; + for (const line of content.trim().split('\n')) { + if (!line.startsWith('dist/')) continue; + const parts = line.split('│').map((p) => p.trim()); + const firstPart = parts[0]; + const match = firstPart.match(/^(\S+)\s+(.+)$/); + if (!match) continue; + const file = match[1]; + const size = match[2].trim(); + let gzip = ''; + let map = ''; + for (let i = 1; i < parts.length; i++) { + if (parts[i].startsWith('gzip:')) { + gzip = parts[i].replace('gzip:', '').trim(); + } else if (parts[i].startsWith('map:')) { + map = parts[i].replace('map:', '').trim(); + } + } + rows.push({ file, size, gzip, map }); + } + return rows; +} + +function parseBytes(str) { + if (!str) return null; + const m = str.match(/^([\d,]+(?:\.\d+)?)\s*(\w+)$/); + if (!m) return null; + const v = parseFloat(m[1].replace(/,/g, '')); + const u = m[2].toLowerCase(); + if (u === 'b') return v; + if (u === 'kb') return v * 1024; + if (u === 'mb') return v * 1024 * 1024; + return null; +} + +function formatBytes(diff, estimated) { + if (diff === 0) return '—'; + const abs = Math.abs(diff); + let s; + if (abs >= 1024 * 1024) { + s = (abs / (1024 * 1024)).toFixed(2) + ' MB'; + } else if (abs >= 1024) { + s = (abs / 1024).toFixed(2) + ' kB'; + } else { + s = abs.toFixed(0) + ' B'; + } + const prefix = estimated ? '~' : diff > 0 ? '+' : '-'; + return `**${prefix}${s}**`; +} + +function normalizeName(file) { + return file.replace(/-([A-Za-z0-9_-]{8})(\.[a-z]+)$/i, '-*$2'); +} + +const refRows = parseSizes(refFile); +const curRows = parseSizes(curFile); + +let gzipRatio = 0; +const ratioSamples = []; +for (const r of [...refRows, ...curRows]) { + const sb = parseBytes(r.size); + const gb = parseBytes(r.gzip); + if (sb !== null && gb !== null && sb > 0) { + ratioSamples.push(gb / sb); + } +} +if (ratioSamples.length > 0) { + gzipRatio = ratioSamples.reduce((a, b) => a + b, 0) / ratioSamples.length; +} + +function estimateGzip(sizeStr) { + const sb = parseBytes(sizeStr); + if (sb === null) return null; + return Math.round(sb * gzipRatio); +} + +if (refRows.length === 0 && curRows.length === 0) { + console.log('## 📦 Bundle Size Report'); + console.log(); + console.log('No bundle files found.'); + process.exit(0); +} + +const refMap = {}; +for (const r of refRows) { + const key = normalizeName(r.file); + if (!refMap[key] || r.size > refMap[key].size) refMap[key] = r; +} + +const curMap = {}; +for (const r of curRows) { + const key = normalizeName(r.file); + if (!curMap[key] || r.size > curMap[key].size) curMap[key] = r; +} + +const allKeys = [...new Set([...Object.keys(refMap), ...Object.keys(curMap)])]; + +allKeys.sort((a, b) => { + const aCur = parseBytes(curMap[a]?.size) || 0; + const aRef = parseBytes(refMap[a]?.size) || 0; + const bCur = parseBytes(curMap[b]?.size) || 0; + const bRef = parseBytes(refMap[b]?.size) || 0; + return Math.max(bCur, bRef) - Math.max(aCur, aRef); +}); + +const changedRows = []; +let addedGzipBytes = 0; +let removedGzipBytes = 0; + +for (const key of allKeys) { + if (key.includes('.map')) continue; + + const ref = refMap[key]; + const cur = curMap[key]; + + const curSize = cur ? cur.size : ref ? ref.size : '—'; + let curGzip = cur && cur.gzip ? cur.gzip : ref && ref.gzip ? ref.gzip : '—'; + + let fileCol; + let gzipDelta; + let hasChange = false; + + if (cur && ref) { + fileCol = `\`${key}\``; + const cg = parseBytes(cur.gzip); + const rg = parseBytes(ref.gzip); + const gdiff = cg !== null && rg !== null ? cg - rg : null; + gzipDelta = + gdiff !== null && Math.abs(gdiff) >= GZIP_NOISE_THRESHOLD + ? formatBytes(gdiff) + : '—'; + if (gzipDelta !== '—') hasChange = true; + } else if (cur && !ref) { + fileCol = `\`${key}\``; + let cg = parseBytes(cur.gzip); + let estimated = false; + if (cg === null) { + cg = estimateGzip(cur.size); + estimated = true; + } + gzipDelta = cg !== null ? formatBytes(cg, estimated) : '—'; + hasChange = true; + if (cg !== null) { + addedGzipBytes += cg; + if (estimated) curGzip = `~${(cg / 1024).toFixed(2)} kB`; + } + } else { + fileCol = `\`${key}\``; + let rg = parseBytes(ref.gzip); + let estimated = false; + if (rg === null) { + rg = estimateGzip(ref.size); + estimated = true; + } + gzipDelta = rg !== null ? formatBytes(-rg, estimated) : '—'; + hasChange = true; + if (rg !== null) { + removedGzipBytes += rg; + if (estimated) curGzip = `~${(rg / 1024).toFixed(2)} kB`; + } + } + + if (hasChange) { + changedRows.push({ fileCol, curSize, curGzip, gzipDelta }); + } +} + +console.log('## 📦 Bundle Size Report'); +console.log(); + +if (refRows.length > 0) { + const refTag = process.env.REF_TAG || refFile.replace('-sizes.txt', ''); + console.log(`_vs \`${refTag}\`_`); + console.log(); +} + +if (changedRows.length > 0) { + const summaryParts = []; + if (addedGzipBytes > 0) { + summaryParts.push(`+${(addedGzipBytes / 1024).toFixed(1)} kB (gzip)`); + } + if (removedGzipBytes > 0) { + summaryParts.push(`-${(removedGzipBytes / 1024).toFixed(1)} kB (gzip)`); + } + if (summaryParts.length > 0) { + console.log(summaryParts.join(' | ')); + console.log(); + } + + console.log('| File | Size | Gzip | ± Gzip |'); + console.log('|------|------|------|--------|'); + for (const row of changedRows) { + console.log( + `| ${row.fileCol} | ${row.curSize} | ${row.curGzip} | ${row.gzipDelta} |`, + ); + } +} else { + console.log('_No bundle size changes_'); +} + +console.log(); +console.log('
'); +console.log('Full bundle list'); +console.log(); +console.log('| File | Size | Gzip | Map |'); +console.log('|------|------|------|-----|'); +for (const row of curRows) { + console.log( + `| \`${row.file}\` | ${row.size} | ${row.gzip || '—'} | ${row.map || '—'} |`, + ); +} +console.log(); +console.log('
'); diff --git a/src/app.css b/src/app.css index a6a44b5a06..c1017f85f2 100644 --- a/src/app.css +++ b/src/app.css @@ -1012,8 +1012,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } .timeline:not(.flat) { > li.timeline-item-container-type-thread.timeline-item-container-middle:not( - .timeline-item-diff-author - ) { + .timeline-item-diff-author + ) { > :is(.status-link, .status-focus) { > .status > .container { > .meta { @@ -1100,8 +1100,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { } } .status-link:active:not( - :has(:is(.media, .poll, .card, .status-card-link, button):active) - ) { + :has(:is(.media, .poll, .card, .status-card-link, button):active) +) { filter: brightness(0.95); } @@ -1264,15 +1264,25 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { border: 1px solid var(--outline-color); background-color: var(--bg-blur-color); border-radius: 16px; + @supports (corner-shape: squircle) { + border-radius: 32px; + corner-shape: squircle; + } overflow: clip; box-shadow: 0 1px var(--bg-color); &:has(.status-badge:not(:empty)) { border-start-end-radius: 8px; + @supports (corner-shape: squircle) { + border-start-end-radius: 16px; + } } .status-carousel.boosts-carousel &:not(.timeline-item-carousel-group &) { border-start-start-radius: 8px; + @supports (corner-shape: squircle) { + border-start-start-radius: 16px; + } } } .status-carousel-link::focus { @@ -1840,6 +1850,10 @@ body:has(.media-modal-container + .status-deck) .media-post-link { width: 100%; max-width: calc(var(--main-width) - 50px - 16px); border-radius: 16px 16px 0 0; + @supports (corner-shape: squircle) { + border-radius: 32px 32px 0 0; + corner-shape: squircle; + } box-shadow: 0 -1px 32px var(--drop-shadow-color); animation: slide-up 0.3s var(--timing-function); /* border: 1px solid var(--outline-color); */ @@ -1989,6 +2003,10 @@ body:has(.media-modal-container + .status-deck) .media-post-link { .sheet-modal { margin: 16px; border-radius: 16px; + @supports (corner-shape: squircle) { + border-radius: 32px; + corner-shape: squircle; + } align-self: safe center; } @@ -2091,6 +2109,10 @@ body > .szh-menu-container { background-color: var(--bg-color); border: 1px solid var(--outline-stronger-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } box-shadow: 0 3px 8px var(--drop-shadow-color), 0 6px 32px -6px var(--drop-shadow-color); @@ -2211,6 +2233,10 @@ body > .szh-menu-container { position: absolute; inset: var(--menu-item-bg-inset); border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } z-index: -1; opacity: 0; } @@ -2625,7 +2651,7 @@ body > .szh-menu-container { .header-account { animation: peekaboo-header 1s linear both; animation-timeline: scroll(); - animation-range: 0 150px; + animation-range: 0 5%; } } @@ -3182,10 +3208,13 @@ ul.link-list li a .icon { .timeline-deck > header .header-grid { border-bottom: 0; border-radius: 16px; + @supports (corner-shape: squircle) { + corner-shape: squircle; + border-radius: 32px; + } background-color: var(--bg-faded-blur-color); backdrop-filter: blur(16px); background-image: none; - border-radius: 16px; min-height: 4em; } .timeline-deck > header[hidden] { diff --git a/src/components/account-block.jsx b/src/components/account-block.jsx index 94b80ff454..7be95bb77d 100644 --- a/src/components/account-block.jsx +++ b/src/components/account-block.jsx @@ -3,6 +3,7 @@ import './account-block.css'; import { ph } from '@lingui/core/macro'; import { Plural, Trans, useLingui } from '@lingui/react/macro'; import { useEffect, useState } from 'preact/hooks'; +import punycode from 'punycode/'; // import { useNavigate } from 'react-router-dom'; import { api } from '../utils/api'; @@ -89,9 +90,10 @@ function AccountBlock(props) { locked, roles, } = account; - let [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct]; + const unicodeAcct = punycode.toUnicode(acct); + let [_, acct1, acct2] = unicodeAcct.match(/([^@]+)(@.+)/i) || [, unicodeAcct]; if (accountInstance) { - acct2 = `@${accountInstance}`; + acct2 = `@${punycode.toUnicode(accountInstance)}`; } const verifiedField = fields?.find((f) => !!f.verifiedAt && !!f.value); @@ -144,7 +146,7 @@ function AccountBlock(props) { class="account-block" href={url} target={external ? '_blank' : null} - title={acct2 ? acct : `@${acct}`} + title={acct2 ? unicodeAcct : `@${unicodeAcct}`} onClick={(e) => { if (external) return; e.preventDefault(); @@ -261,45 +263,47 @@ function AccountBlock(props) { )} {((!hasRelationship && !!familiarFollowers?.length) || !!followersCount) && ( - - - {!hasRelationship && !!familiarFollowers?.length && ( - - {familiarFollowers.slice(0, 3).map((follower) => ( - - ))} + + {!hasRelationship && !!familiarFollowers?.length && ( + + + + {familiarFollowers.slice(0, 3).map((follower) => ( + + ))} + - )}{' '} - {!!followersCount && ( - - - - {shortenNumber(followersCount)} - {' '} - follower - - } - other={ - - - {shortenNumber(followersCount)} - {' '} - followers - - } - /> - - )} - + + )}{' '} + {!!followersCount && ( + + + + {shortenNumber(followersCount)} + {' '} + follower + + } + other={ + + + {shortenNumber(followersCount)} + {' '} + followers + + } + /> + + )} )} {!!verifiedField && ( diff --git a/src/components/account-handle-info.jsx b/src/components/account-handle-info.jsx index f9b7e579f3..8418c98e7d 100644 --- a/src/components/account-handle-info.jsx +++ b/src/components/account-handle-info.jsx @@ -3,8 +3,8 @@ import punycode from 'punycode/'; function AccountHandleInfo({ acct, instance }) { // acct = username or username@server - let [username, server] = acct.split('@'); - if (!server) server = instance; + const fullAcct = acct.includes('@') ? acct : `${acct}@${instance}`; + let [username, server] = punycode.toUnicode(fullAcct).split('@'); const encodedAcct = punycode.toASCII(acct); return (
diff --git a/src/components/account-info.css b/src/components/account-info.css index 46cf0d8e13..360df44a7d 100644 --- a/src/components/account-info.css +++ b/src/components/account-info.css @@ -523,18 +523,30 @@ .account-container .account-metadata-box { overflow: hidden; border-radius: 16px; + @supports (corner-shape: squircle) { + border-radius: 32px; + corner-shape: squircle; + } display: block; text-decoration: none; & > * { margin-bottom: 2px; border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } overflow: hidden; } &:has(+ .account-metadata-box) { border-end-start-radius: 4px; border-end-end-radius: 4px; + @supports (corner-shape: squircle) { + border-end-start-radius: 8px; + border-end-end-radius: 8px; + } } + .account-metadata-box { @@ -542,6 +554,12 @@ border-start-end-radius: 4px; border-end-start-radius: 16px; border-end-end-radius: 16px; + @supports (corner-shape: squircle) { + border-start-start-radius: 8px; + border-start-end-radius: 8px; + border-end-start-radius: 32px; + border-end-end-radius: 32px; + } } } diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index fa5cbf6744..b83d8e64fa 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -11,6 +11,7 @@ import { useRef, useState, } from 'preact/hooks'; +import punycode from 'punycode/'; import { api } from '../utils/api'; import enhanceContent from '../utils/enhance-content'; @@ -196,6 +197,7 @@ function AccountInfo({ roles, hideCollections, } = info || {}; + const unicodeAcct = acct ? punycode.toUnicode(acct) : ''; let headerIsAvatar = false; let { header, headerStatic } = info || {}; if (!header || /missing\.png$/.test(header)) { @@ -609,9 +611,9 @@ function AccountInfo({
{ - const handleWithInstance = acct.includes('@') - ? `@${acct}` - : `@${acct}@${instance}`; + const handleWithInstance = unicodeAcct.includes('@') + ? `@${unicodeAcct}` + : `@${unicodeAcct}@${punycode.toUnicode(instance)}`; try { navigator.clipboard.writeText(handleWithInstance); showToast(t`Handle copied`); @@ -632,9 +634,9 @@ function AccountInfo({ text: url, arena: avatarStatic, backgroundMask: headerStatic, - caption: acct.includes('@') - ? acct - : `${acct}@${instance}`, + caption: unicodeAcct.includes('@') + ? unicodeAcct + : `${unicodeAcct}@${punycode.toUnicode(instance)}`, onScannerClick: handleScannerClick, }; }} diff --git a/src/components/avatar.jsx b/src/components/avatar.jsx index f2c3aae71d..0eb7c481f2 100644 --- a/src/components/avatar.jsx +++ b/src/components/avatar.jsx @@ -75,17 +75,24 @@ function Avatar({ url, staticUrl, size, alt = '', squircle, ...props }) { if (avatarRef.current) avatarRef.current.dataset.loaded = true; if (alphaCache.has(url)) return; if (isMissing) return; - scheduleTask(() => { + const img = e.target; + const loadedSrc = img.currentSrc || img.src; + scheduleTask(async () => { try { + // nodes can be reused; bail without caching if src changed + if ((img.currentSrc || img.src) !== loadedSrc) return; + await img.decode(); + if ((img.currentSrc || img.src) !== loadedSrc) return; + if (!img.complete || !img.naturalWidth) return; // Check if image has alpha channel // Sample at reduced resolution to avoid processing large images - const { naturalWidth: nw, naturalHeight: nh } = e.target; + const { naturalWidth: nw, naturalHeight: nh } = img; const scale = Math.min(1, SIZES.xxxl / Math.max(nw, nh)); const sampleW = Math.max(1, Math.round(nw * scale)); const sampleH = Math.max(1, Math.round(nh * scale)); if (canvas.width !== sampleW) canvas.width = sampleW; if (canvas.height !== sampleH) canvas.height = sampleH; - ctx.drawImage(e.target, 0, 0, sampleW, sampleH); + ctx.drawImage(img, 0, 0, sampleW, sampleH); const { data } = ctx.getImageData(0, 0, sampleW, sampleH); // Early-exit loop: stop once 10% of pixels have alpha <= 128 const totalPixels = data.length / 4; diff --git a/src/components/compose.css b/src/components/compose.css index 4c886b0b0e..da2c5bd20a 100644 --- a/src/components/compose.css +++ b/src/components/compose.css @@ -68,6 +68,10 @@ } #compose-container .status-preview { border-radius: 16px 16px 0 0; + @supports (corner-shape: squircle) { + border-radius: 32px 32px 0 0; + corner-shape: squircle; + } max-height: 160px; background-color: var(--bg-color); margin: 0 8px; @@ -159,6 +163,12 @@ border-radius: 16px; border-start-start-radius: 8px; border-start-end-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 32px; + border-start-start-radius: 16px; + border-start-end-radius: 16px; + corner-shape: squircle; + } } } #compose-container .status-preview ~ form { @@ -191,6 +201,10 @@ @media (min-width: 40em) { max-height: 65vh; border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } } } @@ -217,6 +231,10 @@ background-color: transparent; padding: 0 8px; border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } min-height: 2.4em; min-width: 2.6em; text-align: center; @@ -364,6 +382,10 @@ border: 1px solid var(--outline-color); box-shadow: 0 4px 24px var(--drop-shadow-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } overflow: hidden; z-index: 100; min-width: 10em; @@ -441,6 +463,10 @@ @media (min-width: 40em) { border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } } } #compose-container .media-attachment { @@ -455,6 +481,10 @@ border: 1.5px dashed transparent; line-height: 1; border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } display: flex; &:is(:hover, :focus) { @@ -467,6 +497,10 @@ flex-shrink: 0; border: 1px solid var(--outline-color); border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } overflow: hidden; width: 80px; height: 80px; @@ -541,6 +575,10 @@ padding: 8px; background-color: var(--bg-blur-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } cursor: pointer; } #compose-container .media-sensitive > * { @@ -558,6 +596,10 @@ @media (min-width: 40em) { border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } } } @@ -596,6 +638,10 @@ } #compose-container .multiple .poll-button { border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } } #compose-container .poll-toolbar { @@ -628,6 +674,10 @@ padding: 8px; background-color: var(--bg-blur-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } width: fit-content; } @@ -640,12 +690,20 @@ padding-inline-start: 8px; background-color: var(--bg-blur-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } width: fit-content; } #compose-container { .quote-status { border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } border: 1px solid var(--outline-color); background-color: var(--bg-color); box-shadow: inset 0 0 2px var(--outline-color); @@ -682,6 +740,10 @@ @media (min-width: 40em) { border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } } input[type='datetime-local'] { @@ -728,6 +790,10 @@ #compose-container button[type='submit'] { border-radius: 9px; + @supports (corner-shape: squircle) { + border-radius: 18px; + corner-shape: squircle; + } align-self: stretch; /* @media (min-width: 480px) { @@ -784,6 +850,10 @@ #media-sheet .media-preview { border: 2px solid var(--outline-color); border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } overflow: hidden; box-shadow: 0 2px 16px var(--img-bg-color); /* checkerboard background */ @@ -851,6 +921,10 @@ position: relative; justify-content: space-between; border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } /* align-items: center; */ &:hover { @@ -886,6 +960,10 @@ > button { border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } &:hover { outline: 2px solid var(--button-bg-blur-color); } @@ -1014,6 +1092,10 @@ .compose-highlight-exceeded { mix-blend-mode: multiply; border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } box-shadow: 0 0 0 1px; } .compose-highlight-mention { @@ -1179,6 +1261,10 @@ color: inherit; cursor: pointer; border-radius: 8px; + @supports (corner-shape: squircle) { + border-radius: 16px; + corner-shape: squircle; + } background-color: var(--bg-faded-color); @media (min-height: 480px) { @@ -1217,6 +1303,10 @@ img { background-color: var(--img-bg-color); border-radius: 4px; + @supports (corner-shape: squircle) { + border-radius: 8px; + corner-shape: squircle; + } vertical-align: top; object-fit: contain; } diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 94f2507f08..3469a53e98 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -5,6 +5,7 @@ import { Trans, useLingui } from '@lingui/react/macro'; import { MenuDivider, MenuItem } from '@szhsin/react-menu'; import { deepEqual } from 'fast-equals'; import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; +import punycode from 'punycode/'; import { useHotkeys } from 'react-hotkeys-hook'; import { uid } from 'uid/single'; import { useSnapshot } from 'valtio'; @@ -1218,7 +1219,9 @@ function Compose({ {replyToStatusMonthsAgo > 0 ? ( Replying to @ - {replyToStatus.account.acct || replyToStatus.account.username} + {replyToStatus.account.acct + ? punycode.toUnicode(replyToStatus.account.acct) + : replyToStatus.account.username} ’s post ( {rtf.format(-replyToStatusMonthsAgo, 'month')} @@ -1228,7 +1231,9 @@ function Compose({ ) : ( Replying to @ - {replyToStatus.account.acct || replyToStatus.account.username} + {replyToStatus.account.acct + ? punycode.toUnicode(replyToStatus.account.acct) + : replyToStatus.account.username} ’s post )} diff --git a/src/components/links-bar.css b/src/components/links-bar.css index cf5b4013f9..8c25847b07 100644 --- a/src/components/links-bar.css +++ b/src/components/links-bar.css @@ -67,6 +67,10 @@ text-decoration: none; color: inherit; border-radius: 16px; + @supports (corner-shape: squircle) { + border-radius: 32px; + corner-shape: squircle; + } overflow: hidden; background-color: var(--accent-alpha-color); border: 4px solid transparent; diff --git a/src/components/math-block.jsx b/src/components/math-block.jsx index 7b13f2e02c..aa7b896363 100644 --- a/src/components/math-block.jsx +++ b/src/components/math-block.jsx @@ -2,6 +2,7 @@ import 'temml/dist/Temml-Local.css'; import { useLingui } from '@lingui/react/macro'; import { useCallback, useState } from 'preact/hooks'; +import temmlUrl from 'temml/dist/temml.min.js?url'; import showToast from '../utils/show-toast'; @@ -108,9 +109,17 @@ const MathBlock = ({ content, contentRef, onRevert }) => { } else { // Render math try { - // This needs global because the codebase inside temml is calling a function from global.temml 🤦‍♂️ - const temml = - window.temml || (window.temml = (await import('temml'))?.default); + // Load temml.min.js as a