From f5ea96a0937a0b263c82ca770eb7d1e122521056 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 10 Mar 2024 23:24:17 +0800 Subject: [PATCH 001/968] Merge dup boosts in Catch-up --- src/pages/catchup.css | 16 +++++++++++++++- src/pages/catchup.jsx | 30 ++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/pages/catchup.css b/src/pages/catchup.css index 2a52e42c..024ea614 100644 --- a/src/pages/catchup.css +++ b/src/pages/catchup.css @@ -626,10 +626,24 @@ gap: 4px; align-items: center; flex-shrink: 0; + min-height: 24px; - .icon { + > .avatar { + outline: 1px solid var(--bg-blur-color); + } + + > .avatar ~ .avatar { + margin-left: -8px; + } + + > .icon { color: var(--reblog-color); } + + > .name-text { + opacity: 0.75; + filter: grayscale(0.75); + } } .post-author { diff --git a/src/pages/catchup.jsx b/src/pages/catchup.jsx index c3f2caa6..d23b422c 100644 --- a/src/pages/catchup.jsx +++ b/src/pages/catchup.jsx @@ -429,9 +429,29 @@ function Catchup() { return postFilterMatches; }); + // Deduplicate boosts + const boostedPosts = {}; + filteredPosts = filteredPosts.filter((post) => { + if (post.reblog) { + if (boostedPosts[post.reblog.id]) { + if (boostedPosts[post.reblog.id].__BOOSTERS) { + boostedPosts[post.reblog.id].__BOOSTERS.add(post.account); + } else { + boostedPosts[post.reblog.id].__BOOSTERS = new Set([post.account]); + } + return false; + } else { + boostedPosts[post.reblog.id] = post; + } + } + return true; + }); + if (selectedAuthor && authorCountsMap.has(selectedAuthor)) { filteredPosts = filteredPosts.filter( - (post) => post.account.id === selectedAuthor, + (post) => + post.account.id === selectedAuthor || + [...(post.__BOOSTERS || [])].find((a) => a.id === selectedAuthor), ); } @@ -1420,6 +1440,7 @@ const PostLine = memo( _followedTags: isFollowedTags, _filtered: filterInfo, visibility, + __BOOSTERS, } = post; const isReplyTo = inReplyToId && inReplyToAccountId !== account.id; const isFiltered = !!filterInfo; @@ -1453,7 +1474,12 @@ const PostLine = memo( {' '} + /> + {__BOOSTERS?.size > 0 + ? [...__BOOSTERS].map((b) => ( + + )) + : ''}{' '} {' '} {/* Date: Sun, 10 Mar 2024 23:25:07 +0800 Subject: [PATCH 002/968] Potential perf improvements for canvas --- src/components/account-info.jsx | 5 ++++- src/components/avatar.jsx | 1 + src/components/status.jsx | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index 37e5f599..bc72890d 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -453,12 +453,15 @@ function AccountInfo({ e.target.classList.add('loaded'); try { // Get color from four corners of image - const canvas = document.createElement('canvas'); + const canvas = window.OffscreenCanvas + ? new OffscreenCanvas(1, 1) + : document.createElement('canvas'); const ctx = canvas.getContext('2d', { willReadFrequently: true, }); canvas.width = e.target.width; canvas.height = e.target.height; + ctx.imageSmoothingEnabled = false; ctx.drawImage(e.target, 0, 0); // const colors = [ // ctx.getImageData(0, 0, 1, 1).data, diff --git a/src/components/avatar.jsx b/src/components/avatar.jsx index 0edc9d3b..f0afddfa 100644 --- a/src/components/avatar.jsx +++ b/src/components/avatar.jsx @@ -21,6 +21,7 @@ const canvas = window.OffscreenCanvas const ctx = canvas.getContext('2d', { willReadFrequently: true, }); +ctx.imageSmoothingEnabled = false; function Avatar({ url, size, alt = '', squircle, ...props }) { size = SIZES[size] || size || SIZES.m; diff --git a/src/components/status.jsx b/src/components/status.jsx index 441a034f..7ae36a3d 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -2167,10 +2167,13 @@ function Card({ card, selfReferential, instance }) { const w = 44; const h = 44; const blurhashPixels = decodeBlurHash(blurhash, w, h); - const canvas = document.createElement('canvas'); + const canvas = window.OffscreenCanvas + ? new OffscreenCanvas(1, 1) + : document.createElement('canvas'); canvas.width = w; canvas.height = h; const ctx = canvas.getContext('2d'); + ctx.imageSmoothingEnabled = false; const imageData = ctx.createImageData(w, h); imageData.data.set(blurhashPixels); ctx.putImageData(imageData, 0, 0); From f72ec0aba5e2b4dee86a2edf1da25698d759342e Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Mon, 11 Mar 2024 12:21:15 +0800 Subject: [PATCH 003/968] Scroll up too if changing author --- src/pages/catchup.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pages/catchup.jsx b/src/pages/catchup.jsx index d23b422c..6fb99f2e 100644 --- a/src/pages/catchup.jsx +++ b/src/pages/catchup.jsx @@ -634,6 +634,12 @@ function Catchup() { inline: 'center', behavior: 'smooth', }); + } else if (authorRect.top < 0) { + authorElement.scrollIntoView({ + block: 'nearest', + inline: 'nearest', + behavior: 'smooth', + }); } } } From 0b8cbbef513879e235613491c273d084add6d7fb Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Mon, 11 Mar 2024 19:04:08 +0800 Subject: [PATCH 004/968] Consider the safe areas --- src/components/report-modal.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/report-modal.css b/src/components/report-modal.css index 8306de99..831c5d22 100644 --- a/src/components/report-modal.css +++ b/src/components/report-modal.css @@ -26,6 +26,8 @@ background-color: var(--bg-blur-color); backdrop-filter: blur(16px); padding: 16px; + padding: calc(var(--sai-top, 0) + 16px) calc(var(--sai-right, 0) + 16px) + 16px calc(var(--sai-left, 0) + 16px); display: flex; gap: 8px; justify-content: space-between; @@ -41,6 +43,8 @@ main { padding: 0 16px 16px; + padding: 0 calc(var(--sai-right, 0) + 16px) + calc(var(--sai-bottom, 0) + 16px) calc(var(--sai-left, 0) + 16px); /* display: flex; flex-direction: column; gap: 16px; */ From 3dbbba0be24849f88f97a59eebb8a0545c3358a2 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Tue, 12 Mar 2024 08:14:07 +0800 Subject: [PATCH 005/968] Fix captioning turned on even when showCaption = false --- src/components/status.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/status.jsx b/src/components/status.jsx index 7ae36a3d..eebdfb19 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -1822,7 +1822,9 @@ function Status({ media={media} autoAnimate={isSizeLarge} showCaption={mediaAttachments.length === 1} - allowLongerCaption={!content} + allowLongerCaption={ + !content && mediaAttachments.length === 1 + } lang={language} altIndex={ showMultipleMediaCaptions && From fef033b282853d6117755fa45d6825e081db6fe6 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Wed, 13 Mar 2024 13:30:58 +0800 Subject: [PATCH 006/968] Show relative time if replying to old post Ref: https://blog.joinmastodon.org/2023/11/improving-the-quality-of-conversations-on-mastodon/ --- src/components/compose.css | 4 ++++ src/components/compose.jsx | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/components/compose.css b/src/components/compose.css index 5e8d3bcf..5cb0e9ac 100644 --- a/src/components/compose.css +++ b/src/components/compose.css @@ -95,6 +95,10 @@ 0 1px 10px var(--bg-color), 0 1px 10px var(--bg-color), 0 1px 10px var(--bg-color); z-index: 2; + + strong { + color: var(--red-color); + } } #_compose-container .status-preview-legend.reply-to { color: var(--reply-to-color); diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 84034257..3ab1d488 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -174,6 +174,8 @@ function highlightText(text, { maxCharacters = Infinity }) { ); // Emoji shortcodes } +const rtf = new Intl.RelativeTimeFormat(); + function Compose({ onClose, replyToStatus, @@ -637,6 +639,16 @@ function Compose({ return [topLanguages, restLanguages]; }, [language]); + const replyToStatusMonthsAgo = useMemo( + () => + !!replyToStatus?.createdAt && + Math.floor( + (Date.now() - new Date(replyToStatus.createdAt)) / + (1000 * 60 * 60 * 24 * 30), + ), + [replyToStatus], + ); + return (
@@ -786,6 +798,16 @@ function Compose({ Replying to @ {replyToStatus.account.acct || replyToStatus.account.username} ’s post + {replyToStatusMonthsAgo >= 3 && ( + <> + {' '} + ( + + {rtf.format(-replyToStatusMonthsAgo, 'month')} + + ) + + )}
)} From 2e28c147b96ae082293107b684ea2d68d76e0e08 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Fri, 15 Mar 2024 09:05:05 +0800 Subject: [PATCH 007/968] Scope the keyboard shortcuts in Catch-up --- src/pages/catchup.jsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pages/catchup.jsx b/src/pages/catchup.jsx index 6fb99f2e..a9aeed7f 100644 --- a/src/pages/catchup.jsx +++ b/src/pages/catchup.jsx @@ -648,7 +648,7 @@ function Catchup() { const [showHelp, setShowHelp] = useState(false); const itemsSelector = '.catchup-list > li > a'; - useHotkeys( + const jRef = useHotkeys( 'j', () => { const activeItem = document.activeElement.closest(itemsSelector); @@ -692,7 +692,7 @@ function Catchup() { }, ); - useHotkeys( + const kRef = useHotkeys( 'k', () => { const activeItem = document.activeElement.closest(itemsSelector); @@ -736,7 +736,7 @@ function Catchup() { }, ); - useHotkeys( + const hlRef = useHotkeys( 'h, l', (_, handler) => { // Go next/prev selectedAuthor in authorCountsList list @@ -757,13 +757,18 @@ function Catchup() { { preventDefault: true, ignoreModifiers: true, - enableOnFormTags: true, + enableOnFormTags: ['input'], }, ); return (
{ + scrollableRef.current = node; + jRef.current = node; + kRef.current = node; + hlRef.current = node; + }} id="catchup-page" class="deck-container" tabIndex="-1" From cd3ed64e48005bc84bdf6cb8e2c33af5caf59481 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Fri, 15 Mar 2024 16:02:33 +0800 Subject: [PATCH 008/968] Show relative time if boosting/quoting old post --- src/components/status.jsx | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/status.jsx b/src/components/status.jsx index eebdfb19..d3389bf5 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -85,6 +85,8 @@ const isIOS = window.ontouchstart !== undefined && /iPad|iPhone|iPod/.test(navigator.userAgent); +const rtf = new Intl.RelativeTimeFormat(); + const REACTIONS_LIMIT = 80; function getPollText(poll) { @@ -508,6 +510,13 @@ function Status({ (attachment) => !attachment.description?.trim?.(), ); }, [mediaAttachments]); + + const statusMonthsAgo = useMemo(() => { + return Math.floor( + (new Date() - createdAtDate) / (1000 * 60 * 60 * 24 * 30), + ); + }, [createdAtDate]); + const boostStatus = async () => { if (!sameInstance || !authenticated) { alert(unauthInteractionErrorMessage); @@ -767,12 +776,22 @@ function Status({ } menuFooter={ - mediaNoDesc && - !reblogged && ( + mediaNoDesc && !reblogged ? ( + ) : ( + statusMonthsAgo >= 3 && ( + + ) ) } disabled={!canBoost} From 861ad83423705111f98eb2fd72da4475bd585e76 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Fri, 15 Mar 2024 18:06:52 +0800 Subject: [PATCH 009/968] More keyboard shortcuts for Catch-up --- src/pages/catchup.css | 19 ++++++++++++++- src/pages/catchup.jsx | 55 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/pages/catchup.css b/src/pages/catchup.css index 024ea614..05eb6a90 100644 --- a/src/pages/catchup.css +++ b/src/pages/catchup.css @@ -525,10 +525,13 @@ background-color: var(--bg-faded-color); box-shadow: 0 8px 16px -8px var(--drop-shadow-color), inset 0 1px var(--bg-color); - outline: 1px solid var(--outline-color); text-shadow: 0 1px var(--bg-color); } + &:hover:not(:focus-visible) { + outline: 1px solid var(--outline-color); + } + &:active { filter: brightness(0.95); box-shadow: none; @@ -1091,6 +1094,20 @@ dd { margin-block-end: 1em; margin-inline: 1em; + + + dd { + margin-block-start: -0.9em; + } } } + + kbd { + border-radius: 4px; + display: inline-block; + padding: 0.2em 0.3em; + margin: 1px 0; + line-height: 1; + border: 1px solid var(--outline-color); + background-color: var(--bg-faded-color); + } } diff --git a/src/pages/catchup.jsx b/src/pages/catchup.jsx index a9aeed7f..fe5cd5a7 100644 --- a/src/pages/catchup.jsx +++ b/src/pages/catchup.jsx @@ -740,18 +740,23 @@ function Catchup() { 'h, l', (_, handler) => { // Go next/prev selectedAuthor in authorCountsList list + const key = handler.keys[0]; if (selectedAuthor) { - const key = handler.keys[0]; const index = authorCountsList.indexOf(selectedAuthor); if (key === 'h') { if (index > 0 && index < authorCountsList.length) { setSelectedAuthor(authorCountsList[index - 1]); + scrollableRef.current?.focus(); } } else if (key === 'l') { if (index < authorCountsList.length - 1 && index >= 0) { setSelectedAuthor(authorCountsList[index + 1]); + scrollableRef.current?.focus(); } } + } else if (key === 'l') { + setSelectedAuthor(authorCountsList[0]); + scrollableRef.current?.focus(); } }, { @@ -761,6 +766,34 @@ function Catchup() { }, ); + const escRef = useHotkeys( + 'esc', + () => { + setSelectedAuthor(null); + scrollableRef.current?.focus(); + }, + { + preventDefault: true, + ignoreModifiers: true, + enableOnFormTags: ['input'], + }, + ); + + const dotRef = useHotkeys( + '.', + () => { + scrollableRef.current?.scrollTo({ + top: 0, + behavior: 'smooth', + }); + }, + { + preventDefault: true, + ignoreModifiers: true, + enableOnFormTags: ['input'], + }, + ); + return (
{ @@ -768,6 +801,7 @@ function Catchup() { jRef.current = node; kRef.current = node; hlRef.current = node; + escRef.current = node; }} id="catchup-page" class="deck-container" @@ -1430,6 +1464,25 @@ function Catchup() { Posts are grouped by authors, sorted by posts count per author. +
Keyboard shortcuts
+
+ j: Next post +
+
+ k: Previous post +
+
+ l: Next author +
+
+ h: Previous author +
+
+ Enter: Open post details +
+
+ .: Scroll to top +
From 69c47489e3d5b80d08bd25a19ee67eaf430e4dbd Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Fri, 15 Mar 2024 18:20:45 +0800 Subject: [PATCH 010/968] Fix some at-mentions not handled --- src/utils/handle-content-links.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/handle-content-links.js b/src/utils/handle-content-links.js index be6547fb..f1bf712a 100644 --- a/src/utils/handle-content-links.js +++ b/src/utils/handle-content-links.js @@ -16,7 +16,9 @@ function handleContentLinks(opts) { const textBeforeLinkIsAt = prevText?.endsWith('@'); const textStartsWithAt = target.innerText.startsWith('@'); if ( - (target.classList.contains('u-url') && textStartsWithAt) || + ((target.classList.contains('u-url') || + target.classList.contains('mention')) && + textStartsWithAt) || (textBeforeLinkIsAt && !textStartsWithAt) ) { const targetText = ( From cf05568e0ce21cc149f1569d9a361403b14de71a Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 15 Mar 2024 18:06:56 +0100 Subject: [PATCH 011/968] Add tooltip for truncated preview text Expose the full content of preview text that might get truncated in their tooltips. --- src/components/status.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/status.jsx b/src/components/status.jsx index d3389bf5..b4438165 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -2232,10 +2232,10 @@ function Card({ card, selfReferential, instance }) {

{domain}

-

+

{title}

-

+

{description || (!!publishedAt && ( @@ -2304,8 +2304,8 @@ function Card({ card, selfReferential, instance }) {

{domain}

-

{title}

-

{description || providerName || authorName}

+

{title}

+

{description || providerName || authorName}

); From c7762cc56fa255654f416d53bf37a8d1cd3c6646 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 16 Mar 2024 10:12:34 +0800 Subject: [PATCH 012/968] Upgrade dependencies --- package-lock.json | 477 +++++++++++++++++++++++++--------------------- package.json | 8 +- 2 files changed, 264 insertions(+), 221 deletions(-) diff --git a/package-lock.json b/package-lock.json index edefa907..e0c64e1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,16 +44,16 @@ "valtio": "1.13.2" }, "devDependencies": { - "@preact/preset-vite": "~2.8.1", + "@preact/preset-vite": "~2.8.2", "@trivago/prettier-plugin-sort-imports": "~4.3.0", "postcss": "~8.4.35", "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.4.0", + "postcss-preset-env": "~9.5.1", "twitter-text": "~3.1.0", - "vite": "~5.1.5", + "vite": "~5.1.6", "vite-plugin-generate-file": "~0.1.1", "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.2", + "vite-plugin-pwa": "~0.19.4", "vite-plugin-remove-console": "~2.2.0", "workbox-cacheable-response": "~7.0.0", "workbox-expiration": "~7.0.0", @@ -1950,9 +1950,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.8.tgz", - "integrity": "sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz", + "integrity": "sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==", "dev": true, "funding": [ { @@ -1968,8 +1968,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/color-helpers": { @@ -1992,9 +1992,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.7.tgz", - "integrity": "sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.0.tgz", + "integrity": "sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==", "dev": true, "funding": [ { @@ -2010,14 +2010,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-color-parser": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.5.2.tgz", - "integrity": "sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.6.0.tgz", + "integrity": "sha512-Wc1X6jZvGhT8Bii4jUF6tC3Je3wgDFg7D/SvGKndrnakDsCPk4TMxtt4AQHyWdMBrBJ1hLjXbppaXgP1DUIpBw==", "dev": true, "funding": [ { @@ -2031,20 +2031,20 @@ ], "dependencies": { "@csstools/color-helpers": "^4.0.0", - "@csstools/css-calc": "^1.1.7" + "@csstools/css-calc": "^1.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz", - "integrity": "sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", "dev": true, "funding": [ { @@ -2060,13 +2060,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", "dev": true, "funding": [ { @@ -2083,9 +2083,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.8.tgz", - "integrity": "sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", "dev": true, "funding": [ { @@ -2101,8 +2101,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, "node_modules/@csstools/postcss-cascade-layers": { @@ -2132,9 +2132,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.10.tgz", - "integrity": "sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.11.tgz", + "integrity": "sha512-z53Pp2tsemiIq72PKu4vjD0CtcQlXdvA22elEHuDOvCIlqphNjd5ZD5HBns/ZjaJF7BjPls2zaAT58hfLyS0MQ==", "dev": true, "funding": [ { @@ -2147,10 +2147,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2161,9 +2161,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.10.tgz", - "integrity": "sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.11.tgz", + "integrity": "sha512-Jz1R5ZXxpT5FIY95F3VSJtwQYWCYOtCBUBS/ShDxS+fUtd3sAdAtD3a9tAdz3FG3BvkmqtlURyoIhJRu/wfo/A==", "dev": true, "funding": [ { @@ -2176,10 +2176,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2190,9 +2190,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.4.tgz", - "integrity": "sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.5.tgz", + "integrity": "sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==", "dev": true, "funding": [ { @@ -2205,9 +2205,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2243,9 +2243,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.3.tgz", - "integrity": "sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.4.tgz", + "integrity": "sha512-jjHP44awnSijgddNJpZEFfmb8csFx+BiYYpX+ydyScWwLzSpve5eLXneu4uIhZmKom+WXLXWc4y7CvOfVLQ2VQ==", "dev": true, "funding": [ { @@ -2258,9 +2258,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2270,9 +2270,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.10.tgz", - "integrity": "sha512-PwKOxVuX8lo52bPtPeKjaIp6oH2EzhcBxCndRcvGZKsqZYQ35k9A5G4yihZ+wp7PoxPqDNiXuhQsvQG2lqMpOA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.12.tgz", + "integrity": "sha512-F1mOb6MuIMAV7qq9dYLhi2tlmmQn+osCVl+VdDNI+4AO6y3l6dTWmc7XVQMsVxIZCKEZMie9KLtE0PRp3i1UyQ==", "dev": true, "funding": [ { @@ -2285,10 +2285,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2299,9 +2299,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.9.tgz", - "integrity": "sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.10.tgz", + "integrity": "sha512-wYyhFLQ1zkirAhfRxh5BK9WRIJGBb7jtE9H9a2wPOf20kGbS/PmqxHtGmE+o1vSz/MaBIbW+6lqyS16yEzjQJA==", "dev": true, "funding": [ { @@ -2314,10 +2314,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2328,9 +2328,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.4.tgz", - "integrity": "sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.5.tgz", + "integrity": "sha512-9CriM/zvKXa/lDARlxs/MgeyKE6ZmmX4V77VLD7VUxKLVSt0Go3NCy/gRMbwGzxbrk3iaHFXnFbc2lNw+/7jcg==", "dev": true, "funding": [ { @@ -2343,7 +2343,7 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2403,9 +2403,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.0.tgz", - "integrity": "sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.1.tgz", + "integrity": "sha512-CJOcp+m7Njbu91HtYMMoYuZznsvNSpJtLiR/7BO8/bHTXYPiuAZfxunh7wXLkMbHd5dRBgAVAQZ+H4iFqrvWZw==", "dev": true, "funding": [ { @@ -2418,9 +2418,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2522,9 +2522,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.6.tgz", - "integrity": "sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.7.tgz", + "integrity": "sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==", "dev": true, "funding": [ { @@ -2537,7 +2537,7 @@ } ], "dependencies": { - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/css-tokenizer": "^2.2.4", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2548,9 +2548,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.3.tgz", - "integrity": "sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz", + "integrity": "sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==", "dev": true, "funding": [ { @@ -2563,10 +2563,10 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2576,9 +2576,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.6.tgz", - "integrity": "sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.7.tgz", + "integrity": "sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==", "dev": true, "funding": [ { @@ -2591,9 +2591,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2654,9 +2654,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.10.tgz", - "integrity": "sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.11.tgz", + "integrity": "sha512-nIeOZqTFn/zJXSb70JwUcyUBb9658FED7saZlaZNEEhQ3GYxjRhdlV7hgflNi0FDdqNqaEeeI/B/BqnPG9+Q/Q==", "dev": true, "funding": [ { @@ -2669,10 +2669,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2683,9 +2683,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.0.tgz", - "integrity": "sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.1.tgz", + "integrity": "sha512-cx/bZgj+MK8SpRZNTu2zGeVFMCQfhsaeuDhukAhfA53yykvIXaTIwLi5shW9hfkvPrkqBeFoiRAzq/qogxeHTA==", "dev": true, "funding": [ { @@ -2708,9 +2708,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.10.tgz", - "integrity": "sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.11.tgz", + "integrity": "sha512-YmYGwGLoqZp71wXqjyFuG+JApL+CoZqUZ+MJshlokdqqryKX/zj/NrSrwMTAwB4xSx2DgHJUQK3iWumUse8rXw==", "dev": true, "funding": [ { @@ -2723,10 +2723,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -2762,9 +2762,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.5.tgz", - "integrity": "sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.6.tgz", + "integrity": "sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==", "dev": true, "funding": [ { @@ -2777,9 +2777,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2815,9 +2815,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.5.tgz", - "integrity": "sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.6.tgz", + "integrity": "sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==", "dev": true, "funding": [ { @@ -2830,9 +2830,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.1.7", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-calc": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2863,6 +2863,28 @@ "postcss": "^8.4" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz", + "integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, "node_modules/@csstools/selector-specificity": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz", @@ -3125,9 +3147,9 @@ } }, "node_modules/@preact/preset-vite": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.8.1.tgz", - "integrity": "sha512-a9KV4opdj17X2gOFuGup0aE+sXYABX/tJi/QDptOrleX4FlnoZgDWvz45tHOdVfrZX+3uvVsIYPHxRsTerkDNA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.8.2.tgz", + "integrity": "sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==", "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.15", @@ -3139,7 +3161,9 @@ "kolorist": "^1.8.0", "magic-string": "0.30.5", "node-html-parser": "^6.1.10", - "resolve": "^1.22.8" + "resolve": "^1.22.8", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" }, "peerDependencies": { "@babel/core": "7.x", @@ -3164,6 +3188,15 @@ "node": ">=12" } }, + "node_modules/@preact/preset-vite/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@prefresh/babel-plugin": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.0.tgz", @@ -3706,9 +3739,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -3725,8 +3758,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3921,9 +3954,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -4186,9 +4219,9 @@ } }, "node_modules/cssdb": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.0.tgz", - "integrity": "sha512-YUVAJhjDcTZzVD5XE49l3PQtGE29vvhzaL1bM3BtkvSmIRJeYENdfn1dn5jauBI7BBF+IyyiBS+oSVx3Hz/Gaw==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "dev": true, "funding": [ { @@ -6039,9 +6072,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.5.tgz", - "integrity": "sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.6.tgz", + "integrity": "sha512-2GENDVgEk1dt+OdVhPO+zO4Dzj31Xs9EuKgQLbY9RSkKS3jUqnbTAh33bUhKce5JM1ZmsXm0azCb7Bh8j6W6Nw==", "dev": true, "funding": [ { @@ -6054,10 +6087,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -6120,9 +6153,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.3.tgz", - "integrity": "sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.4.tgz", + "integrity": "sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==", "dev": true, "funding": [ { @@ -6135,10 +6168,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.8" + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9" }, "engines": { "node": "^14 || ^16 || >=18" @@ -6148,9 +6181,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "13.3.5", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.5.tgz", - "integrity": "sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==", + "version": "13.3.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.6.tgz", + "integrity": "sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA==", "dev": true, "funding": [ { @@ -6163,9 +6196,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -6177,9 +6210,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.7.tgz", - "integrity": "sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz", + "integrity": "sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==", "dev": true, "funding": [ { @@ -6192,9 +6225,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.8", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", + "@csstools/cascade-layer-name-parser": "^1.0.9", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -6252,9 +6285,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.4.tgz", - "integrity": "sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.5.tgz", + "integrity": "sha512-26Tx4BfoxMNO9C89Nk56bfGv4jAwdDVgrQOyHZOP/6/D+xuOBf306KzTjHC2oBzaIIVtX+famOWHv4raxMjJMQ==", "dev": true, "funding": [ { @@ -6267,7 +6300,7 @@ } ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -6387,9 +6420,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.10.tgz", - "integrity": "sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.11.tgz", + "integrity": "sha512-toTAozTlBBhqSynSJ32O6ssukZFphS58AAQcVqMA8kG/E04+v+e7E5OKRqq68M/VJaWIeMdpyeBEO51buMrdvw==", "dev": true, "funding": [ { @@ -6402,10 +6435,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.5.2", - "@csstools/css-parser-algorithms": "^2.6.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", + "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -6441,9 +6474,9 @@ } }, "node_modules/postcss-nesting": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.3.tgz", - "integrity": "sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.0.tgz", + "integrity": "sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==", "dev": true, "funding": [ { @@ -6456,6 +6489,7 @@ } ], "dependencies": { + "@csstools/selector-resolve-nested": "^1.1.0", "@csstools/selector-specificity": "^3.0.2", "postcss-selector-parser": "^6.0.13" }, @@ -6550,9 +6584,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.4.0.tgz", - "integrity": "sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.1.tgz", + "integrity": "sha512-m2biepZ2amqH/ygGRV+lQxnT9+AsYG2OScMwBRLa9YefDOXaCVKzsPtmnvdUG7QENdhAl9tE9nsHbYHVYsqJmQ==", "dev": true, "funding": [ { @@ -6566,58 +6600,58 @@ ], "dependencies": { "@csstools/postcss-cascade-layers": "^4.0.3", - "@csstools/postcss-color-function": "^3.0.10", - "@csstools/postcss-color-mix-function": "^2.0.10", - "@csstools/postcss-exponential-functions": "^1.0.4", + "@csstools/postcss-color-function": "^3.0.11", + "@csstools/postcss-color-mix-function": "^2.0.11", + "@csstools/postcss-exponential-functions": "^1.0.5", "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.3", - "@csstools/postcss-gradients-interpolation-method": "^4.0.10", - "@csstools/postcss-hwb-function": "^3.0.9", - "@csstools/postcss-ic-unit": "^3.0.4", + "@csstools/postcss-gamut-mapping": "^1.0.4", + "@csstools/postcss-gradients-interpolation-method": "^4.0.12", + "@csstools/postcss-hwb-function": "^3.0.10", + "@csstools/postcss-ic-unit": "^3.0.5", "@csstools/postcss-initial": "^1.0.1", "@csstools/postcss-is-pseudo-class": "^4.0.5", - "@csstools/postcss-light-dark-function": "^1.0.0", + "@csstools/postcss-light-dark-function": "^1.0.1", "@csstools/postcss-logical-float-and-clear": "^2.0.1", "@csstools/postcss-logical-overflow": "^1.0.1", "@csstools/postcss-logical-overscroll-behavior": "^1.0.1", "@csstools/postcss-logical-resize": "^2.0.1", - "@csstools/postcss-logical-viewport-units": "^2.0.6", - "@csstools/postcss-media-minmax": "^1.1.3", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.6", + "@csstools/postcss-logical-viewport-units": "^2.0.7", + "@csstools/postcss-media-minmax": "^1.1.4", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.7", "@csstools/postcss-nested-calc": "^3.0.2", "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.10", - "@csstools/postcss-progressive-custom-properties": "^3.1.0", - "@csstools/postcss-relative-color-syntax": "^2.0.10", + "@csstools/postcss-oklab-function": "^3.0.11", + "@csstools/postcss-progressive-custom-properties": "^3.1.1", + "@csstools/postcss-relative-color-syntax": "^2.0.11", "@csstools/postcss-scope-pseudo-class": "^3.0.1", - "@csstools/postcss-stepped-value-functions": "^3.0.5", + "@csstools/postcss-stepped-value-functions": "^3.0.6", "@csstools/postcss-text-decoration-shorthand": "^3.0.4", - "@csstools/postcss-trigonometric-functions": "^3.0.5", + "@csstools/postcss-trigonometric-functions": "^3.0.6", "@csstools/postcss-unset-value": "^3.0.1", - "autoprefixer": "^10.4.17", + "autoprefixer": "^10.4.18", "browserslist": "^4.22.3", "css-blank-pseudo": "^6.0.1", "css-has-pseudo": "^6.0.2", "css-prefers-color-scheme": "^9.0.1", - "cssdb": "^7.11.0", + "cssdb": "^7.11.1", "postcss-attribute-case-insensitive": "^6.0.3", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.5", + "postcss-color-functional-notation": "^6.0.6", "postcss-color-hex-alpha": "^9.0.4", "postcss-color-rebeccapurple": "^9.0.3", - "postcss-custom-media": "^10.0.3", - "postcss-custom-properties": "^13.3.5", - "postcss-custom-selectors": "^7.1.7", + "postcss-custom-media": "^10.0.4", + "postcss-custom-properties": "^13.3.6", + "postcss-custom-selectors": "^7.1.8", "postcss-dir-pseudo-class": "^8.0.1", - "postcss-double-position-gradients": "^5.0.4", + "postcss-double-position-gradients": "^5.0.5", "postcss-focus-visible": "^9.0.1", "postcss-focus-within": "^8.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^5.0.1", "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.10", + "postcss-lab-function": "^6.0.11", "postcss-logical": "^7.0.1", - "postcss-nesting": "^12.0.3", + "postcss-nesting": "^12.1.0", "postcss-opacity-percentage": "^2.0.0", "postcss-overflow-shorthand": "^5.0.1", "postcss-page-break": "^3.0.4", @@ -7266,6 +7300,15 @@ "dev": true, "license": "MIT" }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/string-length": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", @@ -7815,9 +7858,9 @@ } }, "node_modules/vite": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", - "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -7896,9 +7939,9 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.2.tgz", - "integrity": "sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.4.tgz", + "integrity": "sha512-KiEFXaYEj2Hg1it+yECy75oqNmlXimI7BaLx7Sxl7Qsd9EIVxaf3GX1mZdLpHe83pDgHBNwm9USGQxSCNp5m7A==", "dev": true, "dependencies": { "debug": "^4.3.4", diff --git a/package.json b/package.json index af7978a4..d5c32db7 100644 --- a/package.json +++ b/package.json @@ -46,16 +46,16 @@ "valtio": "1.13.2" }, "devDependencies": { - "@preact/preset-vite": "~2.8.1", + "@preact/preset-vite": "~2.8.2", "@trivago/prettier-plugin-sort-imports": "~4.3.0", "postcss": "~8.4.35", "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.4.0", + "postcss-preset-env": "~9.5.1", "twitter-text": "~3.1.0", - "vite": "~5.1.5", + "vite": "~5.1.6", "vite-plugin-generate-file": "~0.1.1", "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.2", + "vite-plugin-pwa": "~0.19.4", "vite-plugin-remove-console": "~2.2.0", "workbox-cacheable-response": "~7.0.0", "workbox-expiration": "~7.0.0", From 2723ef4593a1f28cbd8d76f57a3941503718663b Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 16 Mar 2024 13:36:23 +0800 Subject: [PATCH 013/968] Attempt to fix wrong boosts count --- src/components/timeline.jsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/timeline.jsx b/src/components/timeline.jsx index f7b48b70..c91f4a91 100644 --- a/src/components/timeline.jsx +++ b/src/components/timeline.jsx @@ -535,15 +535,15 @@ const TimelineItem = memo( const url = instance ? `/${instance}/s/${actualStatusID}` : `/s/${actualStatusID}`; - let title = ''; - if (type === 'boosts') { - title = `${items.length} Boosts`; - } else if (type === 'pinned') { - title = 'Pinned posts'; - } - const isCarousel = type === 'boosts' || type === 'pinned'; if (items) { const fItems = filteredItems(items, filterContext); + let title = ''; + if (type === 'boosts') { + title = `${fItems.length} Boosts`; + } else if (type === 'pinned') { + title = 'Pinned posts'; + } + const isCarousel = type === 'boosts' || type === 'pinned'; if (isCarousel) { // Here, we don't hide filtered posts, but we sort them last fItems.sort((a, b) => { From 4718ef36b032c4d2715f32f372c9c1d3d583017e Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 16 Mar 2024 17:49:41 +0800 Subject: [PATCH 014/968] Need one more detail: site version --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 96cbff08..6dc764db 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -10,6 +10,7 @@ assignees: '' **Describe the bug** A clear and concise description of what the bug is. - Which site: [e.g. dev.phanpy.social OR phanpy.social] +- Which site version: [On Phanpy, go to Settings -> About] - Which instance: [e.g. mastodon.social] **To Reproduce** From 6157ee105c6bf4a69543ff22527112c6d6dee094 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 16 Mar 2024 18:45:59 +0800 Subject: [PATCH 015/968] Fix "hide"-filtered post bug again --- src/app.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app.css b/src/app.css index 30481d83..f6964b07 100644 --- a/src/app.css +++ b/src/app.css @@ -2673,6 +2673,10 @@ ul.link-list li a .icon { box-shadow: 0px 1px var(--bg-blur-color); transition: transform 0.4s var(--timing-function); --back-transition: transform 0.4s ease-out; + + &:is(:empty, :has(> a:empty)) { + display: none; + } } .timeline:not(.flat) > li > a { border-radius: inherit; From e8219e458d3f681f6f06a56f0cd6fd76cfc4d4d9 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 16 Mar 2024 20:02:20 +0800 Subject: [PATCH 016/968] Try this font settings out. Depends on system font's capabilities, so may not work. --- src/app.css | 2 ++ src/components/name-text.css | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/app.css b/src/app.css index f6964b07..bc254d31 100644 --- a/src/app.css +++ b/src/app.css @@ -34,6 +34,8 @@ a.mention span { text-decoration-color: inherit; text-decoration-thickness: 2px; text-underline-offset: 2px; + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; } /* a.mention:has(span).hashtag { color: var(--link-light-color); diff --git a/src/components/name-text.css b/src/components/name-text.css index 374184d4..a0b4bf89 100644 --- a/src/components/name-text.css +++ b/src/components/name-text.css @@ -8,6 +8,11 @@ font-weight: 500; unicode-bidi: isolate; } + + i { + font-variant-numeric: slashed-zero; + font-feature-settings: 'ss01'; + } } .name-text.show-acct { display: inline-block; From c7f68c89716586fc7a54ea3286621b26a70e0f3f Mon Sep 17 00:00:00 2001 From: snail-coupe <53581981+snail-coupe@users.noreply.github.com> Date: Sun, 17 Mar 2024 21:31:26 +0000 Subject: [PATCH 017/968] Update README.md - adding another instance --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7db062f3..3a02321d 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,7 @@ These are self-hosted by other wonderful folks. - [phanpy.bauxite.tech](https://phanpy.bauxite.tech) by [@b4ux1t3@hachyderm.io](https://hachyderm.io/@b4ux1t3) - [phanpy.hear-me.social](https://phanpy.hear-me.social) by [@admin@hear-me.social](https://hear-me.social/@admin) - [phanpy.fulda.social](https://phanpy.fulda.social) by [@Ganneff@fulda.social](https://fulda.social/@Ganneff) +- [phanpy.crmbl.uk](https://phanpy.crmbl.uk) by [@snail@crmbl.uk](https://mstdn.crmbl.uk/@snail) > Note: Add yours by creating a pull request. From 552ad249e5e7c0d7ed91b200905ef6356e5e2790 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Mon, 18 Mar 2024 11:48:15 +0800 Subject: [PATCH 018/968] Clean up the usernames --- src/components/account-block.jsx | 7 ++++--- src/components/name-text.jsx | 11 ++++++++--- src/pages/account-statuses.jsx | 8 ++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/components/account-block.jsx b/src/components/account-block.jsx index 47c15774..487f7af2 100644 --- a/src/components/account-block.jsx +++ b/src/components/account-block.jsx @@ -33,7 +33,7 @@ function AccountBlock({ ████████
- +
); @@ -87,7 +87,7 @@ function AccountBlock({ class="account-block" href={url} target={external ? '_blank' : null} - title={`@${acct}`} + title={acct2 ? acct : `@${acct}`} onClick={(e) => { if (external) return; e.preventDefault(); @@ -121,7 +121,8 @@ function AccountBlock({ )}{' '} + {following && !!relationship && ( + <> + { + setRelationshipUIState('loading'); + (async () => { + try { + const rel = await currentMasto.v1.accounts + .$select(accountID.current) + .follow({ + notify: !notifying, + }); + if (rel) setRelationship(rel); + setRelationshipUIState('default'); + showToast( + rel.notifying + ? `Notifications enabled for @${username}'s posts.` + : ` Notifications disabled for @${username}'s posts.`, + ); + } catch (e) { + alert(e); + setRelationshipUIState('error'); + } + })(); + }} + > + + + {notifying + ? 'Disable notifications' + : 'Enable notifications'} + + + { + setRelationshipUIState('loading'); + (async () => { + try { + const rel = await currentMasto.v1.accounts + .$select(accountID.current) + .follow({ + reblogs: !showingReblogs, + }); + if (rel) setRelationship(rel); + setRelationshipUIState('default'); + showToast( + rel.showingReblogs + ? `Boosts from @${username} disabled.` + : `Boosts from @${username} enabled.`, + ); + } catch (e) { + alert(e); + setRelationshipUIState('error'); + } + })(); + }} + > + + + {showingReblogs ? 'Disable boosts' : 'Enable boosts'} + + + + )} {/* Add/remove from lists is only possible if following the account */} {following && ( Date: Sat, 23 Mar 2024 12:26:22 +0800 Subject: [PATCH 029/968] Better red color for danger menus --- src/app.css | 4 ++-- src/index.css | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app.css b/src/app.css index bc254d31..c55b9a2f 100644 --- a/src/app.css +++ b/src/app.css @@ -1925,11 +1925,11 @@ body > .szh-menu-container { .szh-menu__item:not(.szh-menu__item--disabled):not( .szh-menu__item--hover ).danger { - color: var(--red-color); + color: var(--red-text-color); } .szh-menu .szh-menu__item.danger:not(.szh-menu__item--disabled).szh-menu__item--hover { - background-color: var(--red-color); + background-color: var(--red-text-color); } .szh-menu .szh-menu__item:not(.szh-menu__item--disabled):not( diff --git a/src/index.css b/src/index.css index e6dde279..7025ae9f 100644 --- a/src/index.css +++ b/src/index.css @@ -24,6 +24,11 @@ transparent ); --red-color: orangered; + --red-text-color: color-mix( + in srgb-linear, + var(--red-color) 60%, + var(--text-color) 40% + ); --red-bg-color: color-mix(in lch, var(--red-color) 40%, transparent); --bg-color: #fff; --bg-faded-color: #f0f2f5; From 5ccf8b68424f31cea9d7afee36668a77f5683685 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 23 Mar 2024 12:26:50 +0800 Subject: [PATCH 030/968] Show published dates for cards --- src/components/status.css | 14 +++++++------- src/components/status.jsx | 20 +++++++++++++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/components/status.css b/src/components/status.css index 93386fda..5dd3c6e0 100644 --- a/src/components/status.css +++ b/src/components/status.css @@ -1585,16 +1585,16 @@ a:focus-visible .card img { } .card .meta.domain { opacity: 1; - color: var(--link-color); - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; + color: var(--text-insignificant-color); + + .domain { + color: var(--link-color); + } } -.card:visited .meta.domain { +.card:visited .meta .domain { color: var(--link-visited-color); } -.card .meta.domain * { +.card .meta .domain * { vertical-align: middle; } a.card { diff --git a/src/components/status.jsx b/src/components/status.jsx index baaceae9..971f07cc 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -2228,8 +2228,14 @@ function Card({ card, selfReferential, instance }) { />
-

- {domain} +

+ {domain}{' '} + {!!publishedAt && <>· } + {!!publishedAt && ( + <> + + + )}

{title} @@ -2301,7 +2307,15 @@ function Card({ card, selfReferential, instance }) { >

- {domain} + + {domain} + {' '} + {!!publishedAt && <>· } + {!!publishedAt && ( + <> + + + )}

{title} From 8378d6fc1dd7a488f08fbcc8fa16ecdaee668027 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 23 Mar 2024 15:00:13 +0800 Subject: [PATCH 031/968] Upgrade dependencies --- package-lock.json | 572 +++++++++++++++++++++++++++++++++++++--------- package.json | 12 +- 2 files changed, 467 insertions(+), 117 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0c64e1a..73a29bcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,11 +25,11 @@ "idb-keyval": "~6.2.1", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~6.6.4", + "masto": "~6.7.0", "moize": "~6.1.6", "p-retry": "~6.2.0", "p-throttle": "~6.1.0", - "preact": "~10.19.6", + "preact": "~10.20.0", "react-hotkeys-hook": "~4.5.0", "react-intersection-observer": "~9.8.1", "react-quick-pinch-zoom": "~5.1.0", @@ -46,14 +46,14 @@ "devDependencies": { "@preact/preset-vite": "~2.8.2", "@trivago/prettier-plugin-sort-imports": "~4.3.0", - "postcss": "~8.4.35", + "postcss": "~8.4.38", "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.5.1", + "postcss-preset-env": "~9.5.2", "twitter-text": "~3.1.0", - "vite": "~5.1.6", + "vite": "~5.2.3", "vite-plugin-generate-file": "~0.1.1", "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.4", + "vite-plugin-pwa": "~0.19.7", "vite-plugin-remove-console": "~2.2.0", "workbox-cacheable-response": "~7.0.0", "workbox-expiration": "~7.0.0", @@ -2015,9 +2015,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.6.0.tgz", - "integrity": "sha512-Wc1X6jZvGhT8Bii4jUF6tC3Je3wgDFg7D/SvGKndrnakDsCPk4TMxtt4AQHyWdMBrBJ1hLjXbppaXgP1DUIpBw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.6.2.tgz", + "integrity": "sha512-mlt0PomBlDXMGcbPAqCG36Fw35LZTtaSgCQCHEs4k8QTv1cUKe0rJDlFSJMHtqrgQiLC7LAAS9+s9kKQp2ou/Q==", "dev": true, "funding": [ { @@ -2132,9 +2132,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.11.tgz", - "integrity": "sha512-z53Pp2tsemiIq72PKu4vjD0CtcQlXdvA22elEHuDOvCIlqphNjd5ZD5HBns/ZjaJF7BjPls2zaAT58hfLyS0MQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.12.tgz", + "integrity": "sha512-amPGGDI4Xmgu7VN2ciKQe0pP/j5raaETT50nzbnkydp9FMw7imKxSUnXdVQU4NmRgpLKIc5Q7jox0MFhMBImIg==", "dev": true, "funding": [ { @@ -2147,7 +2147,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2161,9 +2161,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.11.tgz", - "integrity": "sha512-Jz1R5ZXxpT5FIY95F3VSJtwQYWCYOtCBUBS/ShDxS+fUtd3sAdAtD3a9tAdz3FG3BvkmqtlURyoIhJRu/wfo/A==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.12.tgz", + "integrity": "sha512-qpAEGwVVqHSa88i3gLb43IMpT4/LyZEE8HzZylQKKXFVJ7XykXaORTmXySxyH6H+flT+NyCnutKG2fegCVyCug==", "dev": true, "funding": [ { @@ -2176,7 +2176,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2243,9 +2243,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.4.tgz", - "integrity": "sha512-jjHP44awnSijgddNJpZEFfmb8csFx+BiYYpX+ydyScWwLzSpve5eLXneu4uIhZmKom+WXLXWc4y7CvOfVLQ2VQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.5.tgz", + "integrity": "sha512-AJ74/4nHXgghLWY4/ydEhu3mzwN8c56EjIGrJsoEhKaNuGBAOtUfE5qbkc9XQQ0G2FMhHggqE+9eRrApeK7ebQ==", "dev": true, "funding": [ { @@ -2258,7 +2258,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4" }, @@ -2270,9 +2270,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.12.tgz", - "integrity": "sha512-F1mOb6MuIMAV7qq9dYLhi2tlmmQn+osCVl+VdDNI+4AO6y3l6dTWmc7XVQMsVxIZCKEZMie9KLtE0PRp3i1UyQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.13.tgz", + "integrity": "sha512-dBbyxs9g+mrIzmEH+UtrqJUmvcJB/60j0ijhBcVJMHCgl/rKjj8ey6r/pJOI0EhkVsckOu3Prc9AGzH88C+1pQ==", "dev": true, "funding": [ { @@ -2285,7 +2285,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2299,9 +2299,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.10.tgz", - "integrity": "sha512-wYyhFLQ1zkirAhfRxh5BK9WRIJGBb7jtE9H9a2wPOf20kGbS/PmqxHtGmE+o1vSz/MaBIbW+6lqyS16yEzjQJA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.11.tgz", + "integrity": "sha512-c36FtMFptwGn5CmsfdONA40IlWG2lHeoC/TDyED/7lwiTht5okxe6iLAa9t2LjBBo5AHQSHfeMvOASdXk/SHog==", "dev": true, "funding": [ { @@ -2314,7 +2314,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2654,9 +2654,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.11.tgz", - "integrity": "sha512-nIeOZqTFn/zJXSb70JwUcyUBb9658FED7saZlaZNEEhQ3GYxjRhdlV7hgflNi0FDdqNqaEeeI/B/BqnPG9+Q/Q==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.12.tgz", + "integrity": "sha512-RNitTHamFvUUh8x+MJuPd2tCekYexUrylGKfUoor5D2GGcgzY1WB6Bl3pIj9t8bAq5h/lcacKaB2wmvUOTfGgQ==", "dev": true, "funding": [ { @@ -2669,7 +2669,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2708,9 +2708,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.11.tgz", - "integrity": "sha512-YmYGwGLoqZp71wXqjyFuG+JApL+CoZqUZ+MJshlokdqqryKX/zj/NrSrwMTAwB4xSx2DgHJUQK3iWumUse8rXw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.12.tgz", + "integrity": "sha512-VreDGDgE634niwCytLtkoE5kRxfva7bnMzSoyok7Eh9VPYFOm8CK/oJXt9y3df71Bxc9PG4KC8RA3CxTknudnw==", "dev": true, "funding": [ { @@ -2723,7 +2723,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -2929,15 +2929,78 @@ "postcss": "^8.4" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2946,6 +3009,294 @@ "node": ">=12" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", @@ -4502,12 +4853,11 @@ } }, "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -4515,28 +4865,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -5679,9 +6030,9 @@ } }, "node_modules/masto": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/masto/-/masto-6.6.4.tgz", - "integrity": "sha512-qoq08UAzdRhVNo9eUG+LIxVNx8UWq+ZqyyeoPGYKLsCOdNyxZpkdK7r3M1negyBscfsNzppdMDpuRhmxDOizxw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/masto/-/masto-6.7.0.tgz", + "integrity": "sha512-R1UyuCdiyBuA9xuIEVIYa2187oIoHhpL1T0glIY+RICAo7JYOAEPdi4aAmROyPcWOYwMlaVDmRRb1zmNbvTnVg==", "dependencies": { "change-case": "^4.1.2", "events-to-async": "^2.0.1", @@ -6003,9 +6354,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -6024,7 +6375,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -6072,9 +6423,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.6.tgz", - "integrity": "sha512-2GENDVgEk1dt+OdVhPO+zO4Dzj31Xs9EuKgQLbY9RSkKS3jUqnbTAh33bUhKce5JM1ZmsXm0azCb7Bh8j6W6Nw==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.7.tgz", + "integrity": "sha512-VwzaVfu1kEYDK2yM8ixeKA/QbgQ8k0uxpRevLH9Wam+R3C1sg68vnRB7m2AMhYfjqb5khp4p0EQk5aO90ASAkw==", "dev": true, "funding": [ { @@ -6087,7 +6438,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -6420,9 +6771,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.11.tgz", - "integrity": "sha512-toTAozTlBBhqSynSJ32O6ssukZFphS58AAQcVqMA8kG/E04+v+e7E5OKRqq68M/VJaWIeMdpyeBEO51buMrdvw==", + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.12.tgz", + "integrity": "sha512-flHW2jdRCRe8ClhMgrylR1BCiyyqLLvp1qKfO5wuAclUihldfRsoDIFQWFVW7rJbruil9/LCoHNUvY9JwTlLPw==", "dev": true, "funding": [ { @@ -6435,7 +6786,7 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.6.0", + "@csstools/css-color-parser": "^1.6.2", "@csstools/css-parser-algorithms": "^2.6.1", "@csstools/css-tokenizer": "^2.2.4", "@csstools/postcss-progressive-custom-properties": "^3.1.1", @@ -6584,9 +6935,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.1.tgz", - "integrity": "sha512-m2biepZ2amqH/ygGRV+lQxnT9+AsYG2OScMwBRLa9YefDOXaCVKzsPtmnvdUG7QENdhAl9tE9nsHbYHVYsqJmQ==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.2.tgz", + "integrity": "sha512-/KIAHELdg5BxsKA/Vc6Nok/66EM7lps8NulKcQWX2S52HdzxAqh+6HcuAFj7trRSW587vlOA4zCjlRFgR+W6Ag==", "dev": true, "funding": [ { @@ -6600,13 +6951,13 @@ ], "dependencies": { "@csstools/postcss-cascade-layers": "^4.0.3", - "@csstools/postcss-color-function": "^3.0.11", - "@csstools/postcss-color-mix-function": "^2.0.11", + "@csstools/postcss-color-function": "^3.0.12", + "@csstools/postcss-color-mix-function": "^2.0.12", "@csstools/postcss-exponential-functions": "^1.0.5", "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.4", - "@csstools/postcss-gradients-interpolation-method": "^4.0.12", - "@csstools/postcss-hwb-function": "^3.0.10", + "@csstools/postcss-gamut-mapping": "^1.0.5", + "@csstools/postcss-gradients-interpolation-method": "^4.0.13", + "@csstools/postcss-hwb-function": "^3.0.11", "@csstools/postcss-ic-unit": "^3.0.5", "@csstools/postcss-initial": "^1.0.1", "@csstools/postcss-is-pseudo-class": "^4.0.5", @@ -6620,9 +6971,9 @@ "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.7", "@csstools/postcss-nested-calc": "^3.0.2", "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.11", + "@csstools/postcss-oklab-function": "^3.0.12", "@csstools/postcss-progressive-custom-properties": "^3.1.1", - "@csstools/postcss-relative-color-syntax": "^2.0.11", + "@csstools/postcss-relative-color-syntax": "^2.0.12", "@csstools/postcss-scope-pseudo-class": "^3.0.1", "@csstools/postcss-stepped-value-functions": "^3.0.6", "@csstools/postcss-text-decoration-shorthand": "^3.0.4", @@ -6636,7 +6987,7 @@ "cssdb": "^7.11.1", "postcss-attribute-case-insensitive": "^6.0.3", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.6", + "postcss-color-functional-notation": "^6.0.7", "postcss-color-hex-alpha": "^9.0.4", "postcss-color-rebeccapurple": "^9.0.3", "postcss-custom-media": "^10.0.4", @@ -6649,7 +7000,7 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^5.0.1", "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.11", + "postcss-lab-function": "^6.0.12", "postcss-logical": "^7.0.1", "postcss-nesting": "^12.1.0", "postcss-opacity-percentage": "^2.0.0", @@ -6748,9 +7099,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.19.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", - "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "version": "10.20.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.0.tgz", + "integrity": "sha512-wU7iZw2BjsaKDal3pDRDy/HpPB6cuFOnVUCcw9aIPKG98+ZrXx3F+szkos8BVME5bquyKDKvRlOJFG8kMkcAbg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -7273,11 +7624,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7858,14 +8208,14 @@ } }, "node_modules/vite": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", - "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.3.tgz", + "integrity": "sha512-+i1oagbvkVIhEy9TnEV+fgXsng13nZM90JQbrcPrf6DvW2mXARlz+DK7DLiDP+qeKoD1FCVx/1SpFL1CLq9Mhw==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.36", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -7939,9 +8289,9 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.4.tgz", - "integrity": "sha512-KiEFXaYEj2Hg1it+yECy75oqNmlXimI7BaLx7Sxl7Qsd9EIVxaf3GX1mZdLpHe83pDgHBNwm9USGQxSCNp5m7A==", + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.19.7.tgz", + "integrity": "sha512-18TECxoGPQE7tVZzKxbf5Icrl5688n1JGMPSgGotTsh89vLDxevY7ICfD3CFVfonZXh8ckuyJXg0NXE5+FAl2A==", "dev": true, "dependencies": { "debug": "^4.3.4", diff --git a/package.json b/package.json index d5c32db7..7febe4f1 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,11 @@ "idb-keyval": "~6.2.1", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~6.6.4", + "masto": "~6.7.0", "moize": "~6.1.6", "p-retry": "~6.2.0", "p-throttle": "~6.1.0", - "preact": "~10.19.6", + "preact": "~10.20.0", "react-hotkeys-hook": "~4.5.0", "react-intersection-observer": "~9.8.1", "react-quick-pinch-zoom": "~5.1.0", @@ -48,14 +48,14 @@ "devDependencies": { "@preact/preset-vite": "~2.8.2", "@trivago/prettier-plugin-sort-imports": "~4.3.0", - "postcss": "~8.4.35", + "postcss": "~8.4.38", "postcss-dark-theme-class": "~1.2.1", - "postcss-preset-env": "~9.5.1", + "postcss-preset-env": "~9.5.2", "twitter-text": "~3.1.0", - "vite": "~5.1.6", + "vite": "~5.2.3", "vite-plugin-generate-file": "~0.1.1", "vite-plugin-html-config": "~1.0.11", - "vite-plugin-pwa": "~0.19.4", + "vite-plugin-pwa": "~0.19.7", "vite-plugin-remove-console": "~2.2.0", "workbox-cacheable-response": "~7.0.0", "workbox-expiration": "~7.0.0", From f6a9f7807efcf36f4ce0add218ee9b9222903f60 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 23 Mar 2024 23:52:05 +0800 Subject: [PATCH 032/968] Allow Lists to be in Shortcuts (except columns) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …and all various Lists-related improvements --- src/app.css | 4 +- src/components/account-info.jsx | 6 +- src/components/columns.jsx | 2 + src/components/list-add-edit.jsx | 12 +++ src/components/nav-menu.jsx | 55 +++++++++--- src/components/shortcuts-settings.jsx | 31 +++---- src/components/shortcuts.jsx | 120 +++++++++++++++++--------- src/pages/list.jsx | 39 +++++++-- src/pages/lists.jsx | 6 +- src/utils/lists.js | 114 ++++++++++++++++++++++++ 10 files changed, 302 insertions(+), 87 deletions(-) create mode 100644 src/utils/lists.js diff --git a/src/app.css b/src/app.css index c55b9a2f..6f5e2a68 100644 --- a/src/app.css +++ b/src/app.css @@ -2288,10 +2288,10 @@ ul.link-list li a .icon { filter: none !important; } .nav-menu-button .avatar { - transition: box-shadow 0.3s ease-out; + box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--link-light-color) !important; } .nav-menu-button:is(:hover, :focus, .active) .avatar { - box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--link-light-color); + box-shadow: 0 0 0 2px var(--bg-color), 0 0 0 4px var(--link-color) !important; } .nav-menu-button.with-avatar .icon { position: absolute; diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index 0128be01..13402ff6 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -14,6 +14,7 @@ import { api } from '../utils/api'; import enhanceContent from '../utils/enhance-content'; import getHTMLText from '../utils/getHTMLText'; import handleContentLinks from '../utils/handle-content-links'; +import { getLists } from '../utils/lists'; import niceDateTime from '../utils/nice-date-time'; import pmem from '../utils/pmem'; import shortenNumber from '../utils/shorten-number'; @@ -1558,13 +1559,12 @@ function AddRemoveListsSheet({ accountID, onClose }) { setUIState('loading'); (async () => { try { - const lists = await masto.v1.lists.list(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await getLists(); + setLists(lists); const listsContainingAccount = await masto.v1.accounts .$select(accountID) .lists.list(); console.log({ lists, listsContainingAccount }); - setLists(lists); setListsContainingAccount(listsContainingAccount); setUIState('default'); } catch (e) { diff --git a/src/components/columns.jsx b/src/components/columns.jsx index 47036dce..f21e1165 100644 --- a/src/components/columns.jsx +++ b/src/components/columns.jsx @@ -39,6 +39,8 @@ function Columns() { if (!Component) return null; // Don't show Search column with no query, for now if (type === 'search' && !params.query) return null; + // Don't show List column with no list, for now + if (type === 'list' && !params.id) return null; return ( ); diff --git a/src/components/list-add-edit.jsx b/src/components/list-add-edit.jsx index 3bf6ff03..7360a7f2 100644 --- a/src/components/list-add-edit.jsx +++ b/src/components/list-add-edit.jsx @@ -1,6 +1,7 @@ import { useEffect, useRef, useState } from 'preact/hooks'; import { api } from '../utils/api'; +import { addListStore, deleteListStore, updateListStore } from '../utils/lists'; import supports from '../utils/supports'; import Icon from './icon'; @@ -75,6 +76,14 @@ function ListAddEdit({ list, onClose }) { state: 'success', list: listResult, }); + + setTimeout(() => { + if (editMode) { + updateListStore(listResult); + } else { + addListStore(listResult); + } + }, 1); } catch (e) { console.error(e); setUIState('error'); @@ -146,6 +155,9 @@ function ListAddEdit({ list, onClose }) { onClose?.({ state: 'deleted', }); + setTimeout(() => { + deleteListStore(list.id); + }, 1); } catch (e) { console.error(e); setUIState('error'); diff --git a/src/components/nav-menu.jsx b/src/components/nav-menu.jsx index 0d4fe98c..ba40dd94 100644 --- a/src/components/nav-menu.jsx +++ b/src/components/nav-menu.jsx @@ -7,11 +7,12 @@ import { SubMenu, } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; -import { useEffect, useRef, useState } from 'preact/hooks'; +import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; import { useLongPress } from 'use-long-press'; import { useSnapshot } from 'valtio'; import { api } from '../utils/api'; +import { getLists } from '../utils/lists'; import safeBoundingBoxPadding from '../utils/safe-bounding-box-padding'; import states from '../utils/states'; import store from '../utils/store'; @@ -24,16 +25,12 @@ function NavMenu(props) { const snapStates = useSnapshot(states); const { masto, instance, authenticated } = api(); - const [currentAccount, setCurrentAccount] = useState(); - const [moreThanOneAccount, setMoreThanOneAccount] = useState(false); - - useEffect(() => { + const [currentAccount, moreThanOneAccount] = useMemo(() => { const accounts = store.local.getJSON('accounts') || []; const acc = accounts.find( (account) => account.info.id === store.session.get('currentAccount'), ); - if (acc) setCurrentAccount(acc); - setMoreThanOneAccount(accounts.length > 1); + return [acc, accounts.length > 1]; }, []); // Home = Following @@ -89,6 +86,13 @@ function NavMenu(props) { return results; } + const [lists, setLists] = useState([]); + useEffect(() => { + if (menuState === 'open') { + getLists().then(setLists); + } + }, [menuState === 'open']); + const buttonClickTS = useRef(); return ( <> @@ -97,7 +101,7 @@ function NavMenu(props) { type="button" class={`button plain nav-menu-button ${ moreThanOneAccount ? 'with-avatar' : '' - } ${open ? 'active' : ''}`} + } ${menuState === 'open' ? 'active' : ''}`} style={{ position: 'relative' }} onClick={() => { buttonClickTS.current = Date.now(); @@ -203,9 +207,38 @@ function NavMenu(props) { Profile )} - - Lists - + {lists?.length > 0 ? ( + + + Lists + + + } + > + + All Lists + + {lists?.length > 0 && ( + <> + + {lists.map((list) => ( + + {list.title} + + ))} + + )} + + ) : ( + + + Lists + + )} Bookmarks diff --git a/src/components/shortcuts-settings.jsx b/src/components/shortcuts-settings.jsx index 94162dff..5ccfdb4c 100644 --- a/src/components/shortcuts-settings.jsx +++ b/src/components/shortcuts-settings.jsx @@ -14,6 +14,7 @@ import tabMenuBarUrl from '../assets/tab-menu-bar.svg'; import { api } from '../utils/api'; import { fetchFollowedTags } from '../utils/followed-tags'; +import { getLists, getListTitle } from '../utils/lists'; import pmem from '../utils/pmem'; import showToast from '../utils/show-toast'; import states from '../utils/states'; @@ -43,7 +44,7 @@ const TYPES = [ const TYPE_TEXT = { following: 'Home / Following', notifications: 'Notifications', - list: 'List', + list: 'Lists', public: 'Public (Local / Federated)', search: 'Search', 'account-statuses': 'Account', @@ -58,6 +59,7 @@ const TYPE_PARAMS = { { text: 'List ID', name: 'id', + notRequired: true, }, ], public: [ @@ -122,10 +124,6 @@ const TYPE_PARAMS = { }, ], }; -const fetchListTitle = pmem(async ({ id }) => { - const list = await api().masto.v1.lists.$select(id).fetch(); - return list.title; -}); const fetchAccountTitle = pmem(async ({ id }) => { const account = await api().masto.v1.accounts.$select(id).fetch(); return account.username || account.acct || account.displayName; @@ -150,10 +148,11 @@ export const SHORTCUTS_META = { icon: 'notification', }, list: { - id: 'list', - title: fetchListTitle, - path: ({ id }) => `/l/${id}`, + id: ({ id }) => (id ? 'list' : 'lists'), + title: ({ id }) => (id ? getListTitle(id) : 'Lists'), + path: ({ id }) => (id ? `/l/${id}` : '/l'), icon: 'list', + excludeViewMode: ({ id }) => (!id ? ['multi-column'] : []), }, public: { id: 'public', @@ -496,18 +495,8 @@ function ShortcutsSettings({ onClose }) { ); } -const FETCH_MAX_AGE = 1000 * 60; // 1 minute -const fetchLists = pmem( - () => { - const { masto } = api(); - return masto.v1.lists.list(); - }, - { - maxAge: FETCH_MAX_AGE, - }, -); - const FORM_NOTES = { + list: `Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`, search: `For multi-column mode, search term is required, else the column will not be shown.`, hashtag: 'Multiple hashtags are supported. Space-separated.', }; @@ -532,8 +521,7 @@ function ShortcutForm({ if (currentType !== 'list') return; try { setUIState('loading'); - const lists = await fetchLists(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await getLists(); setLists(lists); setUIState('default'); } catch (e) { @@ -644,6 +632,7 @@ function ShortcutForm({ disabled={disabled || uiState === 'loading'} defaultValue={editMode ? shortcut.id : undefined} > + {lists.map((list) => ( ))} diff --git a/src/components/shortcuts.jsx b/src/components/shortcuts.jsx index fbb3520d..c4645c7b 100644 --- a/src/components/shortcuts.jsx +++ b/src/components/shortcuts.jsx @@ -1,14 +1,15 @@ import './shortcuts.css'; -import { Menu, MenuItem } from '@szhsin/react-menu'; +import { MenuDivider, SubMenu } from '@szhsin/react-menu'; import { memo } from 'preact/compat'; -import { useMemo, useRef } from 'preact/hooks'; +import { useRef, useState } from 'preact/hooks'; import { useHotkeys } from 'react-hotkeys-hook'; import { useNavigate } from 'react-router-dom'; import { useSnapshot } from 'valtio'; import { SHORTCUTS_META } from '../components/shortcuts-settings'; import { api } from '../utils/api'; +import { getLists } from '../utils/lists'; import states from '../utils/states'; import AsyncText from './AsyncText'; @@ -34,47 +35,48 @@ function Shortcuts() { const menuRef = useRef(); - const formattedShortcuts = useMemo( - () => - shortcuts - .map((pin, i) => { - const { type, ...data } = pin; - if (!SHORTCUTS_META[type]) return null; - let { id, path, title, subtitle, icon } = SHORTCUTS_META[type]; + const hasLists = useRef(false); + const formattedShortcuts = shortcuts + .map((pin, i) => { + const { type, ...data } = pin; + if (!SHORTCUTS_META[type]) return null; + let { id, path, title, subtitle, icon } = SHORTCUTS_META[type]; - if (typeof id === 'function') { - id = id(data, i); - } - if (typeof path === 'function') { - path = path( - { - ...data, - instance: data.instance || instance, - }, - i, - ); - } - if (typeof title === 'function') { - title = title(data, i); - } - if (typeof subtitle === 'function') { - subtitle = subtitle(data, i); - } - if (typeof icon === 'function') { - icon = icon(data, i); - } + if (typeof id === 'function') { + id = id(data, i); + } + if (typeof path === 'function') { + path = path( + { + ...data, + instance: data.instance || instance, + }, + i, + ); + } + if (typeof title === 'function') { + title = title(data, i); + } + if (typeof subtitle === 'function') { + subtitle = subtitle(data, i); + } + if (typeof icon === 'function') { + icon = icon(data, i); + } - return { - id, - path, - title, - subtitle, - icon, - }; - }) - .filter(Boolean), - [shortcuts], - ); + if (id === 'lists') { + hasLists.current = true; + } + + return { + id, + path, + title, + subtitle, + icon, + }; + }) + .filter(Boolean); const navigate = useNavigate(); useHotkeys(['1', '2', '3', '4', '5', '6', '7', '8', '9'], (e, handler) => { @@ -88,6 +90,8 @@ function Shortcuts() { } }); + const [lists, setLists] = useState([]); + return (

{snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? ( @@ -147,6 +151,11 @@ function Shortcuts() { menuClassName="glass-menu shortcuts-menu" gap={8} position="anchor" + onMenuChange={(e) => { + if (e.open && hasLists.current) { + getLists().then(setLists); + } + }} menuButton={ + } + > + + All Lists + + {lists?.length > 0 && ( + <> + + {lists.map((list) => ( + + {list.title} + + ))} + + )} + } headerEnd={ { try { - const lists = await masto.v1.lists.list(); - lists.sort((a, b) => a.title.localeCompare(b.title)); + const lists = await fetchLists(); console.log(lists); setLists(lists); setUIState('default'); diff --git a/src/utils/lists.js b/src/utils/lists.js new file mode 100644 index 00000000..1edc000c --- /dev/null +++ b/src/utils/lists.js @@ -0,0 +1,114 @@ +import { api } from './api'; +import pmem from './pmem'; +import store from './store'; + +const FETCH_MAX_AGE = 1000 * 60; // 1 minute +const MAX_AGE = 24 * 60 * 60 * 1000; // 1 day + +export const fetchLists = pmem( + async () => { + const { masto } = api(); + const lists = await masto.v1.lists.list(); + lists.sort((a, b) => a.title.localeCompare(b.title)); + + if (lists.length) { + setTimeout(() => { + // Save to local storage, with saved timestamp + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + }, 1); + } + + return lists; + }, + { + maxAge: FETCH_MAX_AGE, + }, +); + +export async function getLists() { + try { + const { lists, updatedAt } = store.account.get('lists') || {}; + if (!lists?.length) return await fetchLists(); + if (Date.now() - updatedAt > MAX_AGE) { + // Stale-while-revalidate + fetchLists(); + return lists; + } + return lists; + } catch (e) { + return []; + } +} + +export const fetchList = pmem( + (id) => { + const { masto } = api(); + return masto.v1.lists.$select(id).fetch(); + }, + { + maxAge: FETCH_MAX_AGE, + }, +); + +export async function getList(id) { + const { lists } = store.account.get('lists') || {}; + console.log({ lists }); + if (lists?.length) { + const theList = lists.find((l) => l.id === id); + if (theList) return theList; + } + try { + return fetchList(id); + } catch (e) { + return null; + } +} + +export async function getListTitle(id) { + const list = await getList(id); + return list?.title || ''; +} + +export function addListStore(list) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + lists.push(list); + lists.sort((a, b) => a.title.localeCompare(b.title)); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } +} + +export function updateListStore(list) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + const index = lists.findIndex((l) => l.id === list.id); + if (index !== -1) { + lists[index] = list; + lists.sort((a, b) => a.title.localeCompare(b.title)); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } + } +} + +export function deleteListStore(listID) { + const { lists } = store.account.get('lists') || {}; + if (lists?.length) { + const index = lists.findIndex((l) => l.id === listID); + if (index !== -1) { + lists.splice(index, 1); + store.account.set('lists', { + lists, + updatedAt: Date.now(), + }); + } + } +} From 0fbc566454f6e4b8cfda1ebe87e2d32b781e49d3 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 24 Mar 2024 00:21:41 +0800 Subject: [PATCH 033/968] Fix this somehow-partially implemented dot shortcut --- src/components/timeline.jsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/components/timeline.jsx b/src/components/timeline.jsx index c91f4a91..84b234ed 100644 --- a/src/components/timeline.jsx +++ b/src/components/timeline.jsx @@ -209,17 +209,13 @@ function Timeline({ const showNewPostsIndicator = items.length > 0 && uiState !== 'loading' && showNew; const handleLoadNewPosts = useCallback(() => { - loadItems(true); + if (showNewPostsIndicator) loadItems(true); scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth', }); - }, [loadItems]); - const dotRef = useHotkeys('.', () => { - if (showNewPostsIndicator) { - handleLoadNewPosts(); - } - }); + }, [loadItems, showNewPostsIndicator]); + const dotRef = useHotkeys('.', handleLoadNewPosts); // const { // scrollDirection, @@ -365,6 +361,7 @@ function Timeline({ jRef.current = node; kRef.current = node; oRef.current = node; + dotRef.current = node; }} tabIndex="-1" > From c19096ab1b2af0569e424def6d49c8a2fe6f9dd1 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 24 Mar 2024 10:08:09 +0800 Subject: [PATCH 034/968] Try no split CSS --- vite.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.js b/vite.config.js index 83925733..3c187baa 100644 --- a/vite.config.js +++ b/vite.config.js @@ -110,6 +110,7 @@ export default defineConfig({ ], build: { sourcemap: true, + cssCodeSplit: false, rollupOptions: { treeshake: false, input: { From fd59a3902130953e73b7b18365e7b23a417352c0 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 24 Mar 2024 14:13:58 +0800 Subject: [PATCH 035/968] Preliminary support for severed relationships notifications Reference: https://github.com/mastodon/mastodon/pull/27511 This is done purely based on the above codebase without real testing. --- src/components/ICONS.jsx | 1 + src/components/notification.jsx | 63 +++++++++++++++++++++++++++++-- src/pages/notifications.jsx | 1 + src/utils/group-notifications.jsx | 4 +- 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/components/ICONS.jsx b/src/components/ICONS.jsx index c0ad8bd4..98137774 100644 --- a/src/components/ICONS.jsx +++ b/src/components/ICONS.jsx @@ -106,4 +106,5 @@ export const ICONS = { copy: () => import('@iconify-icons/mingcute/copy-2-line'), quote: () => import('@iconify-icons/mingcute/quote-left-line'), settings: () => import('@iconify-icons/mingcute/settings-6-line'), + unlink: () => import('@iconify-icons/mingcute/unlink-line'), }; diff --git a/src/components/notification.jsx b/src/components/notification.jsx index aeeb1065..6b6205a8 100644 --- a/src/components/notification.jsx +++ b/src/components/notification.jsx @@ -25,6 +25,7 @@ const NOTIFICATION_ICONS = { update: 'pencil', 'admin.signup': 'account-edit', 'admin.report': 'account-warning', + severed_relationships: 'unlink', }; /* @@ -63,6 +64,14 @@ const contentText = { 'favourite+reblog_reply': 'boosted & liked your reply.', 'admin.sign_up': 'signed up.', 'admin.report': (targetAccount) => <>reported {targetAccount}, + severed_relationships: (name) => `Relationships with ${name} severed.`, +}; + +// account_suspension, domain_block, user_domain_block +const SEVERED_RELATIONSHIPS_TEXT = { + account_suspension: 'Account has been suspended.', + domain_block: 'Domain has been blocked.', + user_domain_block: 'You blocked this domain.', }; const AVATARS_LIMIT = 50; @@ -73,7 +82,8 @@ function Notification({ isStatic, disableContextMenu, }) { - const { id, status, account, report, _accounts, _statuses } = notification; + const { id, status, account, report, event, _accounts, _statuses } = + notification; let { type } = notification; // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update @@ -135,6 +145,11 @@ function Notification({ if (targetAccount) { text = text(); } + } else if (type === 'severed_relationships') { + const targetName = event?.targetName; + if (targetName) { + text = text(targetName); + } } } @@ -203,9 +218,11 @@ function Notification({ {' '} ) : ( - <> - {' '} - + account && ( + <> + {' '} + + ) )} )} @@ -224,6 +241,44 @@ function Notification({ {type === 'follow_request' && ( )} + {type === 'severed_relationships' && ( + <> +

+ + {event?.purge ? ( + 'Purged by administrators.' + ) : ( + <> + {event.relationshipsCount} relationship + {event.relationshipsCount === 1 ? '' : 's'} + {!!event.createdAt && ( + <> + {' '} + •{' '} + + + )} + + )} + +
+ {SEVERED_RELATIONSHIPS_TEXT[event.type]} +

+

+ + View + +

+ + )} )} {_accounts?.length > 1 && ( diff --git a/src/pages/notifications.jsx b/src/pages/notifications.jsx index 7a24a386..a629024a 100644 --- a/src/pages/notifications.jsx +++ b/src/pages/notifications.jsx @@ -198,6 +198,7 @@ function Notifications({ columnMode }) { setUIState('default'); } catch (e) { + console.error(e); setUIState('error'); } })(); diff --git a/src/utils/group-notifications.jsx b/src/utils/group-notifications.jsx index 132fd32a..630f2d4c 100644 --- a/src/utils/group-notifications.jsx +++ b/src/utils/group-notifications.jsx @@ -63,11 +63,11 @@ function groupNotifications(notifications) { mappedNotification.id += `-${id}`; } } else { - account._types = [type]; + if (account) account._types = [type]; let n = (notificationsMap[key] = { ...notification, type: virtualType, - _accounts: [account], + _accounts: account ? [account] : [], }); cleanNotifications[j++] = n; } From 13f56214882c961c0209141c9554e7ecdb34651d Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 24 Mar 2024 16:37:58 +0800 Subject: [PATCH 036/968] Fix char counter not showing properly on Firefox --- src/app.css | 139 ++++++++++++++++++++----------------- src/components/compose.jsx | 34 +++++---- 2 files changed, 96 insertions(+), 77 deletions(-) diff --git a/src/app.css b/src/app.css index 6f5e2a68..76a7c72c 100644 --- a/src/app.css +++ b/src/app.css @@ -2026,71 +2026,86 @@ body > .szh-menu-container { text-shadow: none; } -/* DONUT METER */ +/* CHAR COUNTER */ -meter.donut { - appearance: none; -} - -meter.donut::-webkit-meter-inner-element, -meter.donut::-webkit-meter-bar, -meter.donut::-webkit-meter-optimum-value, -meter.donut::-webkit-meter-suboptimum-value, -meter.donut::-webkit-meter-even-less-good-value { - display: none; -} - -meter.donut::-moz-meter-bar { - background: transparent; -} - -meter.donut { - position: relative; +.char-counter { --dimension: 24px; - --border-width: 2px; - --middle-circle-radius: calc(var(--dimension) / 2 - var(--border-width)); - width: var(--dimension); - height: var(--dimension); - border-radius: 50%; - --fill: calc(var(--percentage) * 1%); - --color: var(--link-color); - --middle-circle: radial-gradient( - circle at 50% 50%, - var(--bg-color) var(--middle-circle-radius), - transparent var(--middle-circle-radius) - ); - background-image: var(--middle-circle), - conic-gradient(var(--color) var(--fill), var(--outline-color) 0); - transform: scale(0.7); - transition: transform 0.2s ease-in-out; -} -meter.donut.warning { - --color: var(--orange-color); - transform: scale(1); -} -meter.donut.danger { - --color: var(--red-color); - transform: scale(1); -} -meter.donut.explode { - background-image: none; - transform: scale(1); -} -meter.donut:is(.warning, .danger, .explode):after { - content: attr(data-left); - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: 12px; - color: var(--text-insignificant-color); -} -meter.donut:is(.danger, .explode):after { - color: var(--red-color); -} -meter.donut[hidden] { + min-width: var(--dimension); + min-height: var(--dimension); + position: relative; display: inline-block; - visibility: hidden; + + &[hidden] { + visibility: hidden; + } + + * { + pointer-events: none; + } + + meter { + appearance: none; + position: relative; + --border-width: 2px; + --middle-circle-radius: calc(var(--dimension) / 2 - var(--border-width)); + width: var(--dimension); + height: var(--dimension); + border-radius: 50%; + --fill: calc(var(--percentage) * 1%); + --color: var(--link-color); + --middle-circle: radial-gradient( + circle at 50% 50%, + var(--bg-color) var(--middle-circle-radius), + transparent var(--middle-circle-radius) + ); + background-image: var(--middle-circle), + conic-gradient(var(--color) var(--fill), var(--outline-color) 0); + transform: scale(0.7); + transition: transform 0.2s ease-in-out; + + &::-webkit-meter-inner-element, + &::-webkit-meter-bar, + &::-webkit-meter-optimum-value, + &::-webkit-meter-suboptimum-value, + &::-webkit-meter-even-less-good-value { + display: none; + } + + &::-moz-meter-bar { + background: transparent; + } + + &.warning { + --color: var(--orange-color); + transform: scale(1); + } + &.danger { + --color: var(--red-color); + transform: scale(1); + } + &.explode { + background-image: none; + transform: scale(1); + } + &:is(.warning, .danger, .explode) + .counter { + opacity: 1; + color: var(--text-insignificant-color); + } + &:is(.danger, .explode) + .counter { + opacity: 1; + color: var(--red-color); + } + } + + .counter { + line-height: 1; + opacity: 0; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 12px; + } } /* SHINY PILL */ diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 3ab1d488..e4fd27b6 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -1662,27 +1662,31 @@ function CharCountMeter({ maxCharacters = 500, hidden }) { const charCount = snapStates.composerCharacterCount; const leftChars = maxCharacters - charCount; if (hidden) { - return
{!!title && ( -

+

{title}

)} @@ -1144,6 +1149,7 @@ function Catchup() { class="description" lang={language} dir="auto" + title={description} > {description}

diff --git a/src/pages/trending.jsx b/src/pages/trending.jsx index c107cc57..8c04359a 100644 --- a/src/pages/trending.jsx +++ b/src/pages/trending.jsx @@ -217,13 +217,23 @@ function Trending({ columnMode, ...props }) { )}
{!!title && ( -

+

{title}

)} {!!description && ( -

+

{description}

)} From 9c8aff6d320b5eeb3f167331ee997b658b75f0cf Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sun, 24 Mar 2024 17:24:47 +0800 Subject: [PATCH 038/968] Show post preview inside Boosted/Liked by modal And show the menu in more places --- src/components/generic-accounts.css | 20 ++++++++++++++ src/components/generic-accounts.jsx | 9 +++++++ src/components/modals.jsx | 1 + src/components/status.jsx | 42 ++++++++++++++++------------- 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/components/generic-accounts.css b/src/components/generic-accounts.css index ad33900a..ab82ee97 100644 --- a/src/components/generic-accounts.css +++ b/src/components/generic-accounts.css @@ -1,4 +1,24 @@ #generic-accounts-container { + .post-preview { + --max-height: 120px; + max-height: var(--max-height); + overflow: hidden; + margin-block: 8px; + border: 1px solid var(--outline-color); + border-radius: 8px; + pointer-events: none; + + .status { + font-size: calc(var(--text-size) * 0.9); + mask-image: linear-gradient( + to bottom, + black calc(var(--max-height) / 2), + transparent calc(var(--max-height) - 8px) + ); + filter: saturate(0.5); + } + } + .accounts-list { --list-gap: 16px; list-style: none; diff --git a/src/components/generic-accounts.jsx b/src/components/generic-accounts.jsx index 0fdd557e..1b502a94 100644 --- a/src/components/generic-accounts.jsx +++ b/src/components/generic-accounts.jsx @@ -12,10 +12,12 @@ import useLocationChange from '../utils/useLocationChange'; import AccountBlock from './account-block'; import Icon from './icon'; import Loader from './loader'; +import Status from './status'; export default function GenericAccounts({ instance, excludeRelationshipAttrs = [], + postID, onClose = () => {}, }) { const { masto, instance: currentInstance } = api(); @@ -129,6 +131,8 @@ export default function GenericAccounts({ } }, [snapStates.reloadGenericAccounts.counter]); + const post = states.statuses[postID]; + return (
+ )} +
+ Edit profile +
+
+ {uiState === 'loading' ? ( +

+ +

+ ) : ( +
{ + e.preventDefault(); + const formData = new FormData(e.target); + const displayName = formData.get('display_name'); + const note = formData.get('note'); + (async () => { + try { + const newAccount = await masto.v1.accounts.updateCredentials({ + displayName, + note, + }); + console.log('updated account', newAccount); + onClose?.({ + state: 'success', + account: newAccount, + }); + } catch (e) { + console.error(e); + alert(e?.message || 'Unable to update profile.'); + } + })(); + }} + > +

+ +

+

+

{uiState === 'loading' ? ( @@ -1319,6 +1337,64 @@ function Compose({ /> )} + {showGIFPicker && ( + { + if (e.target === e.currentTarget) { + setShowGIFPicker(false); + } + }} + > + setShowGIFPicker(false)} + onSelect={({ url, type, alt_text }) => { + console.log('GIF URL', url); + if (mediaAttachments.length >= maxMediaAttachments) { + alert( + `You can only attach up to ${maxMediaAttachments} files.`, + ); + return; + } + // Download the GIF and insert it as media attachment + (async () => { + let theToast; + try { + theToast = showToast({ + text: 'Downloading GIF…', + duration: -1, + }); + const blob = await fetch(url, { + referrerPolicy: 'no-referrer', + }).then((res) => res.blob()); + const file = new File( + [blob], + type === 'video/mp4' ? 'video.mp4' : 'image.gif', + { + type, + }, + ); + const newMediaAttachments = [ + ...mediaAttachments, + { + file, + type, + size: file.size, + id: null, + description: alt_text || '', + }, + ]; + setMediaAttachments(newMediaAttachments); + theToast?.hideToast?.(); + } catch (err) { + console.error(err); + theToast?.hideToast?.(); + showToast('Failed to download GIF'); + } + })(); + }} + /> + + )}
); } @@ -2246,4 +2322,225 @@ function CustomEmojisModal({ ); } +const GIFS_PER_PAGE = 20; +function GIFPickerModal({ onClose = () => {}, onSelect = () => {} }) { + const [uiState, setUIState] = useState('default'); + const [results, setResults] = useState([]); + const formRef = useRef(null); + const qRef = useRef(null); + const currentOffset = useRef(0); + const scrollableRef = useRef(null); + + function fetchGIFs({ offset }) { + console.log('fetchGIFs', { offset }); + if (!qRef.current?.value) return; + setUIState('loading'); + scrollableRef.current?.scrollTo?.({ + top: 0, + left: 0, + behavior: 'smooth', + }); + (async () => { + try { + const query = { + api_key: GIPHY_API_KEY, + q: qRef.current.value, + rating: 'g', + limit: GIFS_PER_PAGE, + bundle: 'messaging_non_clips', + offset, + }; + const response = await fetch( + 'https://api.giphy.com/v1/gifs/search?' + new URLSearchParams(query), + { + referrerPolicy: 'no-referrer', + }, + ).then((r) => r.json()); + currentOffset.current = response.pagination?.offset || 0; + setResults(response); + setUIState('results'); + } catch (e) { + setUIState('error'); + console.error(e); + } + })(); + } + + useEffect(() => { + qRef.current?.focus(); + }, []); + + return ( +
+ {!!onClose && ( + + )} +
+ { + e.preventDefault(); + fetchGIFs({ offset: 0 }); + }} + > + + + +
+
+ {uiState === 'default' && ( +
+

Type to search GIFs

+
+ )} + {uiState === 'loading' && !results?.data?.length && ( +
+ +
+ )} + {results?.data?.length > 0 ? ( + <> +
    + {results.data.map((gif) => { + const { id, images, title, alt_text } = gif; + const { + fixed_height_small, + fixed_height_downsampled, + fixed_height, + original, + } = images; + const theImage = fixed_height_small?.url + ? fixed_height_small + : fixed_height_downsampled?.url + ? fixed_height_downsampled + : fixed_height; + let { url, webp, width, height } = theImage; + if (+height > 100) { + width = (width / height) * 100; + height = 100; + } + const urlObj = new URL(url); + const strippedURL = urlObj.origin + urlObj.pathname; + let strippedWebP; + if (webp) { + const webpObj = new URL(webp); + strippedWebP = webpObj.origin + webpObj.pathname; + } + return ( +
  • + +
  • + ); + })} +
+

+ {results.pagination?.offset > 0 && ( + + )} + + {results.pagination?.offset + results.pagination?.count < + results.pagination?.total_count && ( + + )} +

+ + ) : ( + uiState === 'results' && ( +
+

No results

+
+ ) + )} + {uiState === 'error' && ( +
+

Error loading GIFs

+
+ )} +
+
+ ); +} + export default Compose; diff --git a/src/index.css b/src/index.css index b7128bc9..10c4380c 100644 --- a/src/index.css +++ b/src/index.css @@ -347,6 +347,7 @@ button[hidden] { } input[type='text'], +input[type='search'], textarea, select { color: var(--text-color); @@ -356,6 +357,7 @@ select { border-radius: 4px; } input[type='text']:focus, +input[type='search']:focus, textarea:focus, select:focus { border-color: var(--outline-color); @@ -371,7 +373,7 @@ textarea:disabled { background-color: var(--bg-faded-color); } -:is(input[type='text'], textarea, select).block { +:is(input[type='text'], input[type='search'], textarea, select).block { display: block; width: 100%; } diff --git a/src/pages/settings.jsx b/src/pages/settings.jsx index f8e70349..bb6ff7f4 100644 --- a/src/pages/settings.jsx +++ b/src/pages/settings.jsx @@ -28,6 +28,7 @@ const { PHANPY_WEBSITE: WEBSITE, PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL, PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL, + PHANPY_GIPHY_API_KEY: GIPHY_API_KEY, } = import.meta.env; function Settings({ onClose }) { @@ -433,6 +434,37 @@ function Settings({ onClose }) {
+ {!!GIPHY_API_KEY && authenticated && ( +
  • + +
    + + Note: This feature uses external GIF search service, powered + by{' '} + + GIPHY + + . G-rated (suitable for viewing by all ages), tracking + parameters are stripped, referrer information is omitted + from requests, but search queries and IP address information + will still reach their servers. + +
    +
  • + )} {!!IMG_ALT_API_URL && authenticated && (
  • - +
  • ))} @@ -490,7 +502,7 @@ function Timeline({ /> ) : (
  • - +
  • ), )} @@ -525,6 +537,7 @@ const TimelineItem = memo( view, showFollowedTags, showReplyParent, + mediaFirst, }) => { console.debug('RENDER TimelineItem', status.id); const { id: statusID, reblog, items, type, _pinned } = status; @@ -533,6 +546,7 @@ const TimelineItem = memo( const url = instance ? `/${instance}/s/${actualStatusID}` : `/s/${actualStatusID}`; + if (items) { const fItems = filteredItems(items, filterContext); let title = ''; @@ -585,6 +599,7 @@ const TimelineItem = memo( contentTextWeight enableCommentHint // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> ) : ( )} @@ -689,6 +705,7 @@ const TimelineItem = memo( showFollowedTags={showFollowedTags} showReplyParent={showReplyParent} // allowFilters={allowFilters} + mediaFirst={mediaFirst} /> ) : ( )} diff --git a/src/utils/store-utils.js b/src/utils/store-utils.js index ed92b7d6..aff33e4a 100644 --- a/src/utils/store-utils.js +++ b/src/utils/store-utils.js @@ -126,3 +126,8 @@ export function getCurrentInstanceConfiguration() { const instance = getCurrentInstance(); return getInstanceConfiguration(instance); } + +export function isMediaFirstInstance() { + const instance = getCurrentInstance(); + return /pixelfed/i.test(instance?.version); +} From 0efa39b8254bfe9cc69aaefc86d601cb8877b52c Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Thu, 11 Apr 2024 17:45:19 +0800 Subject: [PATCH 112/968] Sometimes it returns a preview image without dimenions --- src/components/media.jsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/components/media.jsx b/src/components/media.jsx index 17aa4668..66944132 100644 --- a/src/components/media.jsx +++ b/src/components/media.jsx @@ -511,6 +511,22 @@ function Media({ height={height} data-orientation={orientation} loading="lazy" + onLoad={(e) => { + if (!hasDimensions) { + const $media = e.target.closest('.media'); + if ($media) { + $media.dataset.orientation = + e.target.naturalWidth > e.target.naturalHeight + ? 'landscape' + : 'portrait'; + $media.style['--width'] = `${e.target.naturalWidth}px`; + $media.style[ + '--height' + ] = `${e.target.naturalHeight}px`; + $media.style.aspectRatio = `${e.target.naturalWidth}/${e.target.naturalHeight}`; + } + } + }} /> ) : (