Merge remote-tracking branch 'origin/dev' into feat/beta-public
Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
commit
b13dfd86d8
|
|
@ -21,6 +21,7 @@ env:
|
|||
VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }}
|
||||
VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }}
|
||||
VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }}
|
||||
VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }}
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
|
||||
jobs:
|
||||
|
|
@ -150,7 +151,7 @@ jobs:
|
|||
out/make/**/*.AppImage
|
||||
out/make/**/*.yml
|
||||
|
||||
- run: npx @innei/changelogithub
|
||||
- run: npx changelogithub
|
||||
if: github.ref_type == 'tag' || github.event.inputs.tag_version != ''
|
||||
continue-on-error: true
|
||||
env:
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ env:
|
|||
VITE_IMGPROXY_URL: ${{ vars.VITE_IMGPROXY_URL }}
|
||||
VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }}
|
||||
VITE_POSTHOG_KEY: ${{ vars.VITE_POSTHOG_KEY }}
|
||||
VITE_FIREBASE_CONFIG: ${{ vars.VITE_FIREBASE_CONFIG }}
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
|
||||
jobs:
|
||||
|
|
|
|||
105
CHANGELOG.md
105
CHANGELOG.md
|
|
@ -1,19 +1,23 @@
|
|||
# CHANGELOG
|
||||
|
||||
## [0.0.1-alpha.19](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.3...v0.0.1-alpha.19) (2024-10-05)
|
||||
## [0.0.1-alpha.21](https://github.com/RSSNext/follow/compare/v0.0.1-alpha.19...v0.0.1-alpha.21) (2024-10-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [@unixzii](https://github.com/unixzii) feature request ([b41a78d](https://github.com/RSSNext/follow/commit/b41a78d5c66d5846d1fec33cfa29b9864ddfe20f))
|
||||
* `<Media/>` show fallback ([ca0fd18](https://github.com/RSSNext/follow/commit/ca0fd1802c2f48e4d2a5697f71988df00096fd89))
|
||||
* `F12` cannot open devTools in development mode ([#833](https://github.com/RSSNext/follow/issues/833)) ([ba20507](https://github.com/RSSNext/follow/commit/ba20507cbc410ebd21aa8270cd369ad86964abfc))
|
||||
* `i18nProvider` condition ([0f654b9](https://github.com/RSSNext/follow/commit/0f654b9e61233319787726d3fa3557307efa1b0c))
|
||||
* `IconButton` props ([f33598b](https://github.com/RSSNext/follow/commit/f33598bb9acf870f9c07475e75b4ed5e78ed6a85))
|
||||
* `NotSupport` width reactive ([1292fd4](https://github.com/RSSNext/follow/commit/1292fd41aa04365de1dfae21c6cb9f15255f69db))
|
||||
* `scrollHideDelay` for scroll bar ([5300803](https://github.com/RSSNext/follow/commit/5300803d395daa485ae8ac04e7eaf2f405c7beb4))
|
||||
* about page copy button style ([e6a5042](https://github.com/RSSNext/follow/commit/e6a50427b3c7da16153e766369064bfa1635e532))
|
||||
* accent color ([918d85a](https://github.com/RSSNext/follow/commit/918d85a591cdfc8c6c12261004a6a463516eaf5c))
|
||||
* accept import opml ([39ecc82](https://github.com/RSSNext/follow/commit/39ecc82a8ceecd77139ffccb31a33904082a3d1b))
|
||||
* **achievement:** loading button style ([96bb514](https://github.com/RSSNext/follow/commit/96bb51425427864bc4e77b75808271371839c57a))
|
||||
* add app version on posthog ([9933463](https://github.com/RSSNext/follow/commit/99334639e28b2a2a17b9c3fdd64f0d6d37bdd181))
|
||||
* add aria-describedby to modal content ([bb463a3](https://github.com/RSSNext/follow/commit/bb463a311fe020d079ed021489239a9141246a48))
|
||||
* add bg when context menu trigger, fix [#389](https://github.com/RSSNext/follow/issues/389) ([53f3185](https://github.com/RSSNext/follow/commit/53f3185e7955d1a72912905d8565c5efb0a0bda0))
|
||||
* add copy image in electron, fix [#317](https://github.com/RSSNext/follow/issues/317) ([466e0b7](https://github.com/RSSNext/follow/commit/466e0b78ccc5df66ab11a1e71a800e70c9b34312))
|
||||
* add db index ([a888a78](https://github.com/RSSNext/follow/commit/a888a789e10ecd8b3fab713e859bfe9f56bfe0ad))
|
||||
|
|
@ -31,6 +35,7 @@
|
|||
* add lock when login button click ([539f3bc](https://github.com/RSSNext/follow/commit/539f3bc599f4df9784662ca2bf972a94edf556c4))
|
||||
* add manual refresh of achievement status ([#642](https://github.com/RSSNext/follow/issues/642)) ([419c9cf](https://github.com/RSSNext/follow/commit/419c9cfd51fb766f048cc9a378c150ee974c2ab8))
|
||||
* add missing commit file ([cf897d7](https://github.com/RSSNext/follow/commit/cf897d74db9130d3575fc05b0c95728bc644470c))
|
||||
* add native menu for copy link, close [#822](https://github.com/RSSNext/follow/issues/822) ([5e91f19](https://github.com/RSSNext/follow/commit/5e91f19b18c0b62a27c5b2ac6fee82fae36fd8ce))
|
||||
* add nonce id for temp feed ([8f81d99](https://github.com/RSSNext/follow/commit/8f81d99f1dd48e60f9861d69c840c77fa70bde93))
|
||||
* add page error boundary ([86d366d](https://github.com/RSSNext/follow/commit/86d366db76add0ad07eb921290b9444b211e2c4f))
|
||||
* add rounded class to video fallback message ([#665](https://github.com/RSSNext/follow/issues/665)) ([86d7b8c](https://github.com/RSSNext/follow/commit/86d7b8cc1293d4ec7cca79155a50a5f7ea01dd75))
|
||||
|
|
@ -49,6 +54,7 @@
|
|||
* align end for corner button in player ([#301](https://github.com/RSSNext/follow/issues/301)) ([e551063](https://github.com/RSSNext/follow/commit/e55106307a7ce04be3e6cf34079d6781203eff1e))
|
||||
* align to the baseline ([aebae13](https://github.com/RSSNext/follow/commit/aebae13cbcb0b5dde10bad8e06868c0eb605b13d))
|
||||
* allow cancel proxy configuration ([#545](https://github.com/RSSNext/follow/issues/545)) ([6e70350](https://github.com/RSSNext/follow/commit/6e70350f05821c26a92700d38e9243d9730eeff0))
|
||||
* allow clear translation target in action ([5c8b026](https://github.com/RSSNext/follow/commit/5c8b02625e48d0cb4431a32f102c55d64b3176d1))
|
||||
* allow logout on login page ([#244](https://github.com/RSSNext/follow/issues/244)) ([8b679d1](https://github.com/RSSNext/follow/commit/8b679d1abdb7db2515bd1acb013adb7d1870312f))
|
||||
* allow prod and dev builds running in the same time ([#479](https://github.com/RSSNext/follow/issues/479)) ([7140751](https://github.com/RSSNext/follow/commit/7140751bc2c068782b6e9e9255754629d89152c9))
|
||||
* allow toggle switch by clicking label ([#185](https://github.com/RSSNext/follow/issues/185)) ([5d98eb4](https://github.com/RSSNext/follow/commit/5d98eb42303e4ba6bbe0bfd37d8a17b31f66658a))
|
||||
|
|
@ -58,6 +64,7 @@
|
|||
* audioCover animation and estimatedMins style ([#523](https://github.com/RSSNext/follow/issues/523)) ([11ff31b](https://github.com/RSSNext/follow/commit/11ff31bd40af1884a1760d0d1ca5b9a726f13620))
|
||||
* auto completion can not open when focus in modal ([591f13b](https://github.com/RSSNext/follow/commit/591f13b17f8a22c0c39718d67a88b2024c57efb7))
|
||||
* auto fill default category and view ([ab31850](https://github.com/RSSNext/follow/commit/ab31850b68b215bef9c4c1ed4e75abad5aaa625d))
|
||||
* avatar element masking button ([#852](https://github.com/RSSNext/follow/issues/852)) ([81ca589](https://github.com/RSSNext/follow/commit/81ca589c95ac3b8d9d5cdfbf15faaa8d954fb7d4))
|
||||
* avatar setting ([55b7868](https://github.com/RSSNext/follow/commit/55b7868f2e2aa3c01468e1268e3436485491ee1a))
|
||||
* avoid image cls in entry content ([#666](https://github.com/RSSNext/follow/issues/666)) ([ccda887](https://github.com/RSSNext/follow/commit/ccda8875e93a52131307e69956c2d58fa5481e46))
|
||||
* border color in dark mode ([472fbb2](https://github.com/RSSNext/follow/commit/472fbb2a6b41d9953bbfbda5452558621f71c8d5))
|
||||
|
|
@ -73,7 +80,9 @@
|
|||
* catch get voice error ([aefe8d9](https://github.com/RSSNext/follow/commit/aefe8d9e32f8cbeb4b7e7a1618167f5f87da7f63))
|
||||
* catch setTTS execption ([f7afd37](https://github.com/RSSNext/follow/commit/f7afd373de74a4f531e4a3cbe7c39cd594fdcaff))
|
||||
* category in route should encodeURLComponent ([d5b79cb](https://github.com/RSSNext/follow/commit/d5b79cba8a5d6d8fe18efee5d58da5610fc3ce68))
|
||||
* change copy title icon ([#817](https://github.com/RSSNext/follow/issues/817)) ([b4fed78](https://github.com/RSSNext/follow/commit/b4fed7801bfef27bba2281d8f42e458af5acce88))
|
||||
* change to `EllipsisHorizontalTextWithTooltip` to feed link ([c8cdfd1](https://github.com/RSSNext/follow/commit/c8cdfd1e944b6e595d518e81bff3ba11f7d22a54))
|
||||
* check eagle when available ([b72d455](https://github.com/RSSNext/follow/commit/b72d4557df01fa71d90f561536ee841275b2d364))
|
||||
* check undefined view ([71712f4](https://github.com/RSSNext/follow/commit/71712f464d2ab3043b602d4d2c311e4cc851e046))
|
||||
* ci ([a5a4de0](https://github.com/RSSNext/follow/commit/a5a4de00e3612b7799869d133b893817dbcf82f4))
|
||||
* ci ([8852a81](https://github.com/RSSNext/follow/commit/8852a81d4cfe80a0704bcf52220c39e9ccbe98de))
|
||||
|
|
@ -81,10 +90,15 @@
|
|||
* ci env `NODE_OPTIONS` max-old-space-size ([b4f9b1b](https://github.com/RSSNext/follow/commit/b4f9b1b8ea326b1613ca291ed5bbcd932c5e837a))
|
||||
* **ci:** fetch all depth ([a504a12](https://github.com/RSSNext/follow/commit/a504a127bca93a6675b3ff02bcea0b1eca6e9707))
|
||||
* **ci:** nightly build ([a4ce7b1](https://github.com/RSSNext/follow/commit/a4ce7b16f476b8d72a0b1761709ec1ceba591242))
|
||||
* **ci:** nightly linux build ([702b1d9](https://github.com/RSSNext/follow/commit/702b1d976d52c49647d0433f2dd162c034d0abb4))
|
||||
* **ci:** remove check diff ([32f3a9e](https://github.com/RSSNext/follow/commit/32f3a9edba28ec2368730c6038ff6d3f8d55b404))
|
||||
* clean local async data ([ae26dd7](https://github.com/RSSNext/follow/commit/ae26dd7763fe32990086e76fa896ec09dec170cd))
|
||||
* clear local data when login other account and store window pos before quit ([c7f74cf](https://github.com/RSSNext/follow/commit/c7f74cf7464da96e5f6249926cbfc3eea9d1497e))
|
||||
* cls when star in gird item ([#636](https://github.com/RSSNext/follow/issues/636)) ([b993ae0](https://github.com/RSSNext/follow/commit/b993ae050e282c22e40f649141677f7905ede601))
|
||||
* cmdk panel layout ([#854](https://github.com/RSSNext/follow/issues/854)) ([81a35e0](https://github.com/RSSNext/follow/commit/81a35e046e8bbc4f60a17c1e5fb0ac342f20009e))
|
||||
* code language detection more approximate ([86ce165](https://github.com/RSSNext/follow/commit/86ce16571751c19b64def3dac972f9a5ce37f130))
|
||||
* config `__dirname` resolve ([f3f3cac](https://github.com/RSSNext/follow/commit/f3f3cac2b4ff0865f863b848397f0e27caa435b3))
|
||||
* context menu item title should use title case ([f11eb19](https://github.com/RSSNext/follow/commit/f11eb198157f26861b3d69965f051c2a5b02886e))
|
||||
* context menu sub menu ([9352dd1](https://github.com/RSSNext/follow/commit/9352dd1a2a2d4d30c04cb41a22b95a0dda3eeb40))
|
||||
* copy grammatical ([0267b08](https://github.com/RSSNext/follow/commit/0267b080c01733671ac4fc12cfd5ec9c1807c928))
|
||||
* copywrite ([8967d20](https://github.com/RSSNext/follow/commit/8967d20102bc1ad6f2f94b38909c7abfca6168d1))
|
||||
|
|
@ -102,14 +116,19 @@
|
|||
* deeplink navigate ([00d41ce](https://github.com/RSSNext/follow/commit/00d41cee5632dab86f7a93b1bc965cb3a896417a))
|
||||
* default extra window size ([5688eff](https://github.com/RSSNext/follow/commit/5688eff6a70ab9abc3e94d9dce861726df8d9123))
|
||||
* determine snowflake id ([7dbf48b](https://github.com/RSSNext/follow/commit/7dbf48b92c9445b83588bcf11892f3728e959977))
|
||||
* devtools font not work due to comment ([#846](https://github.com/RSSNext/follow/issues/846)) ([ac09c71](https://github.com/RSSNext/follow/commit/ac09c711d94cd966b5c9839276d11b2e2235e2ce))
|
||||
* disable window blur material lower than windows 11 ([3735390](https://github.com/RSSNext/follow/commit/3735390af80671a4bf954f70062f3838206b8890))
|
||||
* disabled ghost button style ([e01985b](https://github.com/RSSNext/follow/commit/e01985b1e9bf8a60ea20f47fc3e7a7a9a969bca9))
|
||||
* discover form overflow scrollbar ([1145e92](https://github.com/RSSNext/follow/commit/1145e92ae7125873d69f2689d86418b004d93319))
|
||||
* discover form should preview twice when has optional value ([f0f8185](https://github.com/RSSNext/follow/commit/f0f8185d92e447943c14a4ceeeceb7211498bc28))
|
||||
* discover page title i18n ([b92d317](https://github.com/RSSNext/follow/commit/b92d317e9c1dbdd674a6b122a02f3f6a3826682f))
|
||||
* discover page's trending icon is offset. ([#856](https://github.com/RSSNext/follow/issues/856)) ([3ce0a88](https://github.com/RSSNext/follow/commit/3ce0a88cb6f777306e51a44642cb41e25704e883))
|
||||
* discover recommendation card link button style ([1ac465c](https://github.com/RSSNext/follow/commit/1ac465cbb96bda4a189dea086caf3bbe77aa64ee))
|
||||
* discover search optimistic update data ([a6abd05](https://github.com/RSSNext/follow/commit/a6abd058ac691c0116f625f9226bd465f6319f25))
|
||||
* **discover:** update follow status after add feed, closes [#269](https://github.com/RSSNext/follow/issues/269), closes ([32a55ec](https://github.com/RSSNext/follow/commit/32a55ece6440f80f837adc6d558029ea5fbd6982))
|
||||
* display white block ([#633](https://github.com/RSSNext/follow/issues/633)) ([d9bb749](https://github.com/RSSNext/follow/commit/d9bb74937b5b2f528707e80fc2a76a89df10a1a8))
|
||||
* do not filter figure, add pre fallback ([c3abc06](https://github.com/RSSNext/follow/commit/c3abc069780fab2174f66e8f9edda63589b0ab8a)), closes [#847](https://github.com/RSSNext/follow/issues/847)
|
||||
* document title change when entry changed ([a4c1dc2](https://github.com/RSSNext/follow/commit/a4c1dc231c8b792e3e8ed38d07619d1a2a50a358))
|
||||
* don't auto focus in user profile modal ([f1ce5df](https://github.com/RSSNext/follow/commit/f1ce5df581c0a91967d3d093b6735e2fdd3ea906))
|
||||
* don't retry when 404 ([8bd9bd0](https://github.com/RSSNext/follow/commit/8bd9bd0a8bf92764d8dd13a0728e3ab821b3484b))
|
||||
* dont handle unread when filter applied ([acfb35a](https://github.com/RSSNext/follow/commit/acfb35abd0edb85989549849d0176c4a65e5f9fa))
|
||||
|
|
@ -118,6 +137,7 @@
|
|||
* draggable panel dragging bg color ([8de7078](https://github.com/RSSNext/follow/commit/8de7078d10b733456c480117ba8ed8d2166e20b9))
|
||||
* drawer edge shadow style ([cbb8649](https://github.com/RSSNext/follow/commit/cbb8649fde99e7a800153ad35aa041aaf44e6dcf))
|
||||
* drawer top edge anchor ([248369a](https://github.com/RSSNext/follow/commit/248369afe6d085885fd76a4ecf6a3f9b692b14cf))
|
||||
* dropmenu icon prop passive, profile avatar button cls ([ddfcffe](https://github.com/RSSNext/follow/commit/ddfcffeda59c2d2503645b36aba423eff9e2b5b9))
|
||||
* duplicated separator ([6e1ee50](https://github.com/RSSNext/follow/commit/6e1ee50536ded4b65f76cdb35bdf98c4657a1a74))
|
||||
* dynamic load i18n resource in electron prod ([2328648](https://github.com/RSSNext/follow/commit/232864852a934d571a2b47af7f4d02c787cc8250))
|
||||
* eagle icon ([021dfab](https://github.com/RSSNext/follow/commit/021dfab5eeb888f155982cc1cd3636b2b4ca52a3))
|
||||
|
|
@ -132,6 +152,7 @@
|
|||
* empty default font on electron app ([#481](https://github.com/RSSNext/follow/issues/481)) ([4f9d4f2](https://github.com/RSSNext/follow/commit/4f9d4f26f22ac86cce64bb9f1582c2be2b3361c3))
|
||||
* empty entry list will throw not found feed error, fixed [#224](https://github.com/RSSNext/follow/issues/224) ([c41756d](https://github.com/RSSNext/follow/commit/c41756d2b91173a753e09f5de988b71a27daa9ba))
|
||||
* empty title break ([fbbb2a9](https://github.com/RSSNext/follow/commit/fbbb2a98b204ff17d80f1826134b713854a0f40d))
|
||||
* enable pointer events for action buttons in media preview ([#790](https://github.com/RSSNext/follow/issues/790)) ([dcb765e](https://github.com/RSSNext/follow/commit/dcb765ecb4ec93cb1a87493c03a0ced516d5ae76))
|
||||
* ensure unique keys for search items ([#500](https://github.com/RSSNext/follow/issues/500)) ([6c6b082](https://github.com/RSSNext/follow/commit/6c6b0828b83ff62d95c56417dcb0ebc1faed9535))
|
||||
* entries hasNext ([4cb5678](https://github.com/RSSNext/follow/commit/4cb56784acfb46516a4320f0088c294eafb32fcf))
|
||||
* entry bar action ([ba23dcf](https://github.com/RSSNext/follow/commit/ba23dcf46ff7569562d0a786ab85d46093b8abe8))
|
||||
|
|
@ -142,13 +163,17 @@
|
|||
* entry preview modal content ([8492c2a](https://github.com/RSSNext/follow/commit/8492c2afb3af79726b9448359a63b432b04a3518))
|
||||
* entry read history more not showing on desktop ([0c6494b](https://github.com/RSSNext/follow/commit/0c6494b5682078fa1da1ea2e6f5d81aa436a5155))
|
||||
* entry view tracker params ([0c05a8b](https://github.com/RSSNext/follow/commit/0c05a8b88c1c385b7809f1ea9e3355f0d11e69dd))
|
||||
* **entry-layout:** only padding left in wide mode ([c0d49e5](https://github.com/RSSNext/follow/commit/c0d49e5436b9f93857c9efa4bdaf4cc939e86c73))
|
||||
* env example ([cdb8dd5](https://github.com/RSSNext/follow/commit/cdb8dd5cf31ec2d43b18a50cdd3259302620867e))
|
||||
* **error:** filter user is empty ([83b4031](https://github.com/RSSNext/follow/commit/83b4031405d2a6e979a32fbb18095f22d19d6a70))
|
||||
* **eslint:** json sort key ([5a81dd6](https://github.com/RSSNext/follow/commit/5a81dd6786b7c0e4a533f3cb4e50d7900d005875))
|
||||
* exit full screen before hiding window ([#341](https://github.com/RSSNext/follow/issues/341)) ([bd5b08f](https://github.com/RSSNext/follow/commit/bd5b08f314ddaddb9b079b3d10b6928d28962df5))
|
||||
* **exteral:** edit or follow in web app when login ([0ccadf7](https://github.com/RSSNext/follow/commit/0ccadf762bf5c761115a485ab4e68be938c527e6))
|
||||
* external layout header margin ([#754](https://github.com/RSSNext/follow/issues/754)) ([52e7305](https://github.com/RSSNext/follow/commit/52e730525da0f871de96026f076b01accbddcb17))
|
||||
* external list and feed page statistics display ([6760a34](https://github.com/RSSNext/follow/commit/6760a3486f06ec84ab2b9b72fae490456c6fab65))
|
||||
* **external-page:** feed list overlay style ([1dcffc6](https://github.com/RSSNext/follow/commit/1dcffc60d26596065bc024653d69a109a1941578))
|
||||
* extract constants ([f48b589](https://github.com/RSSNext/follow/commit/f48b58941344a4a5e547a402e02f56bb5f9f5abf))
|
||||
* fake profile avatar position when resize ([3af93e3](https://github.com/RSSNext/follow/commit/3af93e37760aabbf9ffb0e112febb3708576bb9a))
|
||||
* fallback image overflow, fixed [#375](https://github.com/RSSNext/follow/issues/375) ([ae3d52c](https://github.com/RSSNext/follow/commit/ae3d52cb7c8756e6524ad6fa7f758bbc6cfb1578))
|
||||
* feed claim action ([4a814ee](https://github.com/RSSNext/follow/commit/4a814ee917ea47ab214dba33b879e24ff4bb3e97))
|
||||
* feed column animation direction ([0767b6b](https://github.com/RSSNext/follow/commit/0767b6b4db3a69f54d1fc2de11a883d9deec4445))
|
||||
|
|
@ -172,6 +197,7 @@
|
|||
* format ([cd4473b](https://github.com/RSSNext/follow/commit/cd4473b3062ca780c0c163c81d3d265077c26862))
|
||||
* format time locale fallback ([6b1009e](https://github.com/RSSNext/follow/commit/6b1009ecfde47d68859a202a2be8a1cde901f2fc))
|
||||
* generate i18n template location ([0877448](https://github.com/RSSNext/follow/commit/08774485b10e22dee67333652bb28ecb700e077b))
|
||||
* generate invite code modal power icon style ([25a505a](https://github.com/RSSNext/follow/commit/25a505a221f51d6cb70c0d2832b0cd5bbc62e26d))
|
||||
* generate-i18n scripti ([fd361e8](https://github.com/RSSNext/follow/commit/fd361e88864c57c6f76793519a2e57a650aa4a2b))
|
||||
* gird item text and icon align center ([eabd59c](https://github.com/RSSNext/follow/commit/eabd59cf1feb774759279832005fcd0e26aa7bb6))
|
||||
* gird mode skeleton ([0a7f648](https://github.com/RSSNext/follow/commit/0a7f6488c176ee059f7c87f3c51e0234c85c1d4c))
|
||||
|
|
@ -182,11 +208,13 @@
|
|||
* handle render error in code block ([8511a79](https://github.com/RSSNext/follow/commit/8511a7909237dd22ccd9f373a0f77a0355ff45ac))
|
||||
* header icon size ([aff559a](https://github.com/RSSNext/follow/commit/aff559a9ddd2a3a5c9235c8e5b0ab521a73d5db0))
|
||||
* header layout action button initial flash ([6758793](https://github.com/RSSNext/follow/commit/6758793a3ed1b5ac2ca74d17ef9828f9cd6b8817))
|
||||
* hidden menu item is not filtered out on native ([#830](https://github.com/RSSNext/follow/issues/830)) ([190a18e](https://github.com/RSSNext/follow/commit/190a18e3324ffce6c714fd572b72a9216c4fcada))
|
||||
* hide entry read history, fixed [#278](https://github.com/RSSNext/follow/issues/278) ([a73b4ab](https://github.com/RSSNext/follow/commit/a73b4abe2212b5ba969770358d8db7306b6ad4e6))
|
||||
* hide peek modal toc ([9c66b33](https://github.com/RSSNext/follow/commit/9c66b33887126287d9f6f5a39f85f76818e28f1f))
|
||||
* hide tip when feed owned by me ([dfb3c6d](https://github.com/RSSNext/follow/commit/dfb3c6d377041f524c9da80c03639e6fea304202))
|
||||
* hono.ts ([fd03caa](https://github.com/RSSNext/follow/commit/fd03caac22f9e035734d369351134ed63da93439))
|
||||
* i18n dispatcher ([c038c79](https://github.com/RSSNext/follow/commit/c038c791af14418ee641af08e689a619b99a1735))
|
||||
* i18n key and dark mode in wide mode and transition other ux fix ([6697ff5](https://github.com/RSSNext/follow/commit/6697ff58b30a1f4838fdca3820c725457ec483d4))
|
||||
* i18n persist ([18e0353](https://github.com/RSSNext/follow/commit/18e035394b8d1a77f8454f47e0049359e69d750a))
|
||||
* **i18n-selector:** hover cls ([60f1af2](https://github.com/RSSNext/follow/commit/60f1af2409300e64ad351621abf71ed326188af8))
|
||||
* **i18n/en:** enhance English grammar ([#698](https://github.com/RSSNext/follow/issues/698)) ([4478517](https://github.com/RSSNext/follow/commit/4478517566aced3e55928229433a4cc83dd0c3ae))
|
||||
|
|
@ -204,33 +232,46 @@
|
|||
* **i18n:** relative time add `ago` postfix ([9fe48c5](https://github.com/RSSNext/follow/commit/9fe48c57133e0360a74aa46c06f01393cc044136))
|
||||
* icon button transition ([596538b](https://github.com/RSSNext/follow/commit/596538ba10b6b70d12ccc4efdd9f206d9ba11817))
|
||||
* icon fallback line height ([02cd98d](https://github.com/RSSNext/follow/commit/02cd98d9cc9c09006a91277a5b976d753054738d))
|
||||
* if inline image is too wider, fallback to block image ([f8ccd74](https://github.com/RSSNext/follow/commit/f8ccd74a9c9c4664767add26cc48f6c3dbdbb83d))
|
||||
* image blurhash `aspectRatio` ([9239483](https://github.com/RSSNext/follow/commit/9239483081e6e4adfda4934695c03df394e873fa))
|
||||
* image url replacement ([8e75a8c](https://github.com/RSSNext/follow/commit/8e75a8cc6931b354e3206ea22917842c991d4c45))
|
||||
* **image:** error fallback ([18fdaa2](https://github.com/RSSNext/follow/commit/18fdaa20610fba875054c3d298ecb07e099ad584))
|
||||
* import circular and copywrite i18n ([725f9f5](https://github.com/RSSNext/follow/commit/725f9f5509c3b34079923fad47096b108568ccd6))
|
||||
* import circular and copywrite i18n ([caf5fe5](https://github.com/RSSNext/follow/commit/caf5fe5c839cc68aec786114b5a659cc8352d167))
|
||||
* import circular and copywrite i18n ([725f9f5](https://github.com/RSSNext/follow/commit/725f9f5509c3b34079923fad47096b108568ccd6))
|
||||
* import circular in dev login page ([a37e927](https://github.com/RSSNext/follow/commit/a37e927e93bf7cb6a5035a74ec8e9708fc559316))
|
||||
* import type error ([0658c4a](https://github.com/RSSNext/follow/commit/0658c4ab6bd3e9bbbb87a9faf07d00fc04aa0bc1))
|
||||
* improve ActionCard state management and UI ([#825](https://github.com/RSSNext/follow/issues/825)) ([56ca95b](https://github.com/RSSNext/follow/commit/56ca95bd9dec7ee581c126c5085eebfe9ca7eb72))
|
||||
* improve code block parser ([e72cb2d](https://github.com/RSSNext/follow/commit/e72cb2df3f1f5cd314feeb4a9bcc20e30204bca5))
|
||||
* improve developing experience with Electron on Windows ([#796](https://github.com/RSSNext/follow/issues/796)) ([3416329](https://github.com/RSSNext/follow/commit/3416329f30baf457dc18c5e2b598e2b86416c9f5))
|
||||
* improve input component display on focus ([#581](https://github.com/RSSNext/follow/issues/581)) ([d8ddffb](https://github.com/RSSNext/follow/commit/d8ddffbc481dc086c8d1d2cd0c80bdef9126f306))
|
||||
* improve proxy URI handling ([#810](https://github.com/RSSNext/follow/issues/810)) ([e7e930d](https://github.com/RSSNext/follow/commit/e7e930d1771e19d909433021d6757eabb44de73f))
|
||||
* inbox data refreshment ([a3a7c82](https://github.com/RSSNext/follow/commit/a3a7c82ea6308756a800514d9df528815ba77781))
|
||||
* incorrect tooltip in read history ([#385](https://github.com/RSSNext/follow/issues/385)) ([cabe210](https://github.com/RSSNext/follow/commit/cabe210aaf8f4a1133fa653532874fa86d02c252))
|
||||
* init store after app init ([728ea84](https://github.com/RSSNext/follow/commit/728ea84fa6e9faff1990184285390a1d86eb2c56))
|
||||
* inline table style ([5837bd4](https://github.com/RSSNext/follow/commit/5837bd4089b59855d0b583aed5d0e97fce04e094))
|
||||
* input box table style ([e0890d5](https://github.com/RSSNext/follow/commit/e0890d5b388facd1f9c16ac706a32f0aa2efdef5))
|
||||
* Input issues fixed [#535](https://github.com/RSSNext/follow/issues/535),[#536](https://github.com/RSSNext/follow/issues/536) ([3d48637](https://github.com/RSSNext/follow/commit/3d486379b91dff13bfbcc90532efd3e186405a13))
|
||||
* intelligence ([8b889d1](https://github.com/RSSNext/follow/commit/8b889d1307186d07c4672879d77f77e1d8fead7b))
|
||||
* invitation code wrap ([4b48202](https://github.com/RSSNext/follow/commit/4b48202ea70ed80b858312d35cf04d1d66515865))
|
||||
* invitation page error display area ([5915357](https://github.com/RSSNext/follow/commit/59153573d8a5d368adfe41b0f5cebc4d6d44a9f3))
|
||||
* **invitation:** reset app data then logout ([5933cea](https://github.com/RSSNext/follow/commit/5933ceab63de0a7a46e85d0b841acbf893d8fcec))
|
||||
* **item:** center content if no desc ([18e26a4](https://github.com/RSSNext/follow/commit/18e26a41c3cf80316bc97c44a1239e6ec45c5db9))
|
||||
* json parse for env VITE_FIREBASE_CONFIG ([b2916bd](https://github.com/RSSNext/follow/commit/b2916bd8b81d02e1f5b673ed34c7f0f181d641c2))
|
||||
* kbd cls and set home scope in shortcuts guideline ([d9999a3](https://github.com/RSSNext/follow/commit/d9999a3fc6cfeae0f3b45b6390cf79d9135566b7))
|
||||
* lang/*.json ([#526](https://github.com/RSSNext/follow/issues/526)) ([be3b2e7](https://github.com/RSSNext/follow/commit/be3b2e7503c1061a1e312394bb0c3556e39ec062))
|
||||
* language setting syncing ([fa1dc5d](https://github.com/RSSNext/follow/commit/fa1dc5df35a2225bb22320a8fc049d3c0b75fa5b))
|
||||
* layout shift ([f5f5213](https://github.com/RSSNext/follow/commit/f5f521300f59a0194a349342d2990e2c5d4bfd63))
|
||||
* less white space, close [#818](https://github.com/RSSNext/follow/issues/818) ([4b0802d](https://github.com/RSSNext/follow/commit/4b0802da69bd64192f622c08e53ba95484d27c71))
|
||||
* link underline style when selected ([781b120](https://github.com/RSSNext/follow/commit/781b1200f8eae3f61b39dc53151c5a688fa36d1b))
|
||||
* lint ([ef0d80d](https://github.com/RSSNext/follow/commit/ef0d80d8546c804b1b52c58fca7640d2f541188a))
|
||||
* list data store and list edit form ([f420e78](https://github.com/RSSNext/follow/commit/f420e78ca921217b18a5c6b4811074d8eb11fe4e))
|
||||
* list item overlay style ([20ef773](https://github.com/RSSNext/follow/commit/20ef77342e73d205409644386c162dc164da009e))
|
||||
* list manage Modal button zh-cn word wrap ([#590](https://github.com/RSSNext/follow/issues/590)) ([0a89c2f](https://github.com/RSSNext/follow/commit/0a89c2ff73a0fde28c85b87401185332975264e0))
|
||||
* **list:** adjust power fee ([47fc1ff](https://github.com/RSSNext/follow/commit/47fc1ff7c40961d102caf31c30d9a1eed8a98475))
|
||||
* lists check ([657dcf0](https://github.com/RSSNext/follow/commit/657dcf0ff241cde8b68feb2a4db14160c52058c4))
|
||||
* lists date group ([b57f43f](https://github.com/RSSNext/follow/commit/b57f43fbcc407fe6d6e81b6c6cfbbc38a7d52f68))
|
||||
* lists edit follow modal in external page ([9cfe2ab](https://github.com/RSSNext/follow/commit/9cfe2ab68531384c0448806cd7366e5c4722461c))
|
||||
* lists read all ([4aac049](https://github.com/RSSNext/follow/commit/4aac04958357e25e13df992a92f34ffb717e4c57))
|
||||
* loadFile options hash ([b41fa66](https://github.com/RSSNext/follow/commit/b41fa665fa334f0037de294d8e0585a5cf94c649))
|
||||
* loading circle clip path ([ba396be](https://github.com/RSSNext/follow/commit/ba396beaa78eae3c1b250fd846cc8434c2abc07f))
|
||||
* loading style ([61ee2cc](https://github.com/RSSNext/follow/commit/61ee2ccb3e30d3ab82de0bfe6aca35df38794dca))
|
||||
|
|
@ -238,6 +279,7 @@
|
|||
* login button transition ([0f566e7](https://github.com/RSSNext/follow/commit/0f566e757bdc15fc72c4cd3681384d7b4242b55a))
|
||||
* login page style ([094a668](https://github.com/RSSNext/follow/commit/094a6684b62de69748f20011f5bd0f68833c30e1))
|
||||
* **login-button:** add overflow ([650aeeb](https://github.com/RSSNext/follow/commit/650aeeb099a18341a6fd25b006e77818f040fa93))
|
||||
* mark all as read height ([eb1a944](https://github.com/RSSNext/follow/commit/eb1a9440b5e3eb8fa205251c312e47a1ad47d77f)), closes [#811](https://github.com/RSSNext/follow/issues/811)
|
||||
* mark all as read in feed action ([cbb5022](https://github.com/RSSNext/follow/commit/cbb502223fd82212f8534eb578786cb138813474))
|
||||
* mark all button overlay position ([5e34d36](https://github.com/RSSNext/follow/commit/5e34d3650eaaa999c660377db3e955269123eab5))
|
||||
* mark read tooltip and shortcut optional ([d4d72dd](https://github.com/RSSNext/follow/commit/d4d72ddf933c89d246585c77b22f8f498b2a98a1))
|
||||
|
|
@ -245,6 +287,7 @@
|
|||
* masonry layout cls ([9428368](https://github.com/RSSNext/follow/commit/9428368cfc4a00afb1c72f9ca3a4267b311c5b2b))
|
||||
* **masonry:** in view mark read and scroll out mark read ([1c5a1ef](https://github.com/RSSNext/follow/commit/1c5a1ef9a58d7953e0966d2fe8d8fe4543463b84))
|
||||
* media fallback src overflow ([3dd705f](https://github.com/RSSNext/follow/commit/3dd705f3a427c53d000c4934513c97d6132399d0))
|
||||
* media preview bug when zero size, close [#764](https://github.com/RSSNext/follow/issues/764) ([#765](https://github.com/RSSNext/follow/issues/765)) ([208d09b](https://github.com/RSSNext/follow/commit/208d09b8d9d296eed7e62e8a0c71e2c542b99e14))
|
||||
* media preview image fixed size ([14c7028](https://github.com/RSSNext/follow/commit/14c7028347b22eb1cf768d5c3a4c20ffe9497b93))
|
||||
* **media-preview:** solve image cls ([e0bcb71](https://github.com/RSSNext/follow/commit/e0bcb718aee57e7eeef31c3ffcdf5564c823c845))
|
||||
* **media:** if no src then return null ([183009a](https://github.com/RSSNext/follow/commit/183009adee6d5674923a72ae0f5a10b85d4c7ba6))
|
||||
|
|
@ -256,10 +299,14 @@
|
|||
* modal title overflow tooltip ([5146dd2](https://github.com/RSSNext/follow/commit/5146dd23487f98080bf246f50101e6d13ed79aea))
|
||||
* **modal:** limit setting modal drag range ([#732](https://github.com/RSSNext/follow/issues/732)) ([34f462f](https://github.com/RSSNext/follow/commit/34f462f2877ed979a59644e666ce27ba14dadc5b))
|
||||
* modify the Tooltip content of the list dates title ([#663](https://github.com/RSSNext/follow/issues/663)) ([f99ba5d](https://github.com/RSSNext/follow/commit/f99ba5de916fc17904f6716b4d7eb4ccc295f79c))
|
||||
* monospace font always be NSimSun on Windows ([#806](https://github.com/RSSNext/follow/issues/806)) ([a3576b0](https://github.com/RSSNext/follow/commit/a3576b04e84489d103664b9f532c1cff0f2f18b6))
|
||||
* more highlighted player thumb ([a17ea00](https://github.com/RSSNext/follow/commit/a17ea00c23604312b09283ef89946140b61b2be9))
|
||||
* navigating from a tts player doesn't work properly ([#828](https://github.com/RSSNext/follow/issues/828)) ([22a72ac](https://github.com/RSSNext/follow/commit/22a72ac15b8aa7ae5707f68051951ea5707a4ae9))
|
||||
* new invitation button zindex ([0d79392](https://github.com/RSSNext/follow/commit/0d79392cde4c282cbc3faf69fd697b3726638279))
|
||||
* nightly build ci ([85a52ad](https://github.com/RSSNext/follow/commit/85a52ad1dfc3f55950b7ae3b59c2c18eaee0e37e))
|
||||
* null reference introduced in ab8c9e5 ([#667](https://github.com/RSSNext/follow/issues/667)) ([1eae565](https://github.com/RSSNext/follow/commit/1eae565fb37c2ed3b6a627855862d2ae30c3dc00))
|
||||
* only can add feed to owned lists, fixed [#863](https://github.com/RSSNext/follow/issues/863) ([0c306bc](https://github.com/RSSNext/follow/commit/0c306bc34ac351ad36617e07769df8dc647d24b5))
|
||||
* only valid feed can be claimed ([1e03bf6](https://github.com/RSSNext/follow/commit/1e03bf66e17e3d873081c9f6faa93ee2407f57e1))
|
||||
* only windows 11 can manually resize logic ([338803a](https://github.com/RSSNext/follow/commit/338803a18936c29fcea694c95baef1b3e8650980))
|
||||
* optimize ai daily modal ([8872067](https://github.com/RSSNext/follow/commit/88720679df1371543c0feb5d3a48b7b7e664a20b))
|
||||
* optimize code string parser ([b3d32d0](https://github.com/RSSNext/follow/commit/b3d32d09fd4d5b53ae1692ffdc154e8d37a77fdd))
|
||||
|
|
@ -271,6 +318,7 @@
|
|||
* panel split color in dark mode ([3a0cfa1](https://github.com/RSSNext/follow/commit/3a0cfa1ebf794351d7f7b1132c0068a55ff2e9a6))
|
||||
* panel spliter zindex ([23e428a](https://github.com/RSSNext/follow/commit/23e428ad30d5df968e881462a699fdf40db43131))
|
||||
* peek modal header background color and copywrite ([b8be81b](https://github.com/RSSNext/follow/commit/b8be81b2105d2c229955a433af91c43f5286194a))
|
||||
* picture action button position ([b18e4a2](https://github.com/RSSNext/follow/commit/b18e4a2bd4f4266e4e44da17b3deac9826570322)), closes [#811](https://github.com/RSSNext/follow/issues/811)
|
||||
* picture entry preview in Grid view ([#658](https://github.com/RSSNext/follow/issues/658)) ([634978f](https://github.com/RSSNext/follow/commit/634978f427865f646088f13a315207cde63d532c))
|
||||
* player holder size ([78cb08c](https://github.com/RSSNext/follow/commit/78cb08c7dc98aeab9cb5575296470106dbeb4e84))
|
||||
* player marquee mask ([aa9ca62](https://github.com/RSSNext/follow/commit/aa9ca624a8d0304838bc05c330a8165a41430d3e))
|
||||
|
|
@ -287,6 +335,7 @@
|
|||
* preview image size ([af474c1](https://github.com/RSSNext/follow/commit/af474c1592b5cf92c114936ccb3e6686ea737e37))
|
||||
* preview media entry background color in dark mode ([4751447](https://github.com/RSSNext/follow/commit/4751447ce2bd9e0dd7d6865ed48b600a747556cf))
|
||||
* previous feed should not be preserved when switching feeds ([f1a2ecb](https://github.com/RSSNext/follow/commit/f1a2ecb7d2e517d45ca75dd6371f3570787f5c5f))
|
||||
* profile category overflow ([3edee63](https://github.com/RSSNext/follow/commit/3edee63a5a9f691481c8532ba524d541ca09c539)), closes [#811](https://github.com/RSSNext/follow/issues/811)
|
||||
* profile fields are not updated after modifying the profile ([#291](https://github.com/RSSNext/follow/issues/291)) ([b765349](https://github.com/RSSNext/follow/commit/b7653494b7fd6c69572d94aeeb2ee5bf15145658))
|
||||
* profile header transform when scroll up/down ([c0683ee](https://github.com/RSSNext/follow/commit/c0683eee6def2b835e79dab9eea37cb4567f02b7))
|
||||
* prose max widht ([2bd5b45](https://github.com/RSSNext/follow/commit/2bd5b45e6bb4cc127dd07aa073d3b83c0a8bee82))
|
||||
|
|
@ -299,11 +348,13 @@
|
|||
* read history delay to polling ([f6f8ec8](https://github.com/RSSNext/follow/commit/f6f8ec84dbb0e86b2d5a109088a1759b62c17dec))
|
||||
* read history style in wide mode ([07ca5ea](https://github.com/RSSNext/follow/commit/07ca5ea22ea6675d08c5df72389733361c4789bb))
|
||||
* **read-history:** hover card alaway open ([2eaabf0](https://github.com/RSSNext/follow/commit/2eaabf003845e321fa687a17845d30f6ce01135d))
|
||||
* **readability:** respect origin html charset ([d5fe10a](https://github.com/RSSNext/follow/commit/d5fe10a95fb9874e23b44a56db8a9fabc6310422))
|
||||
* reduce Electron framework size ([#217](https://github.com/RSSNext/follow/issues/217)) ([34d5dd2](https://github.com/RSSNext/follow/commit/34d5dd228e6986ff8a15310dd9d5f8ed51933de6))
|
||||
* reduce tolltip re-render ([c43bafd](https://github.com/RSSNext/follow/commit/c43bafdd5cd7a94f66c722e30d76ae31307f263f))
|
||||
* reduce wallet setting margin size ([826ebd0](https://github.com/RSSNext/follow/commit/826ebd041a9a143d7785a52d95dc81388b0ea2b4))
|
||||
* ref not found error ([372e043](https://github.com/RSSNext/follow/commit/372e043ed47c47f7677406bdb1115c7fe577dc29))
|
||||
* regarding the style issue of selecting subscription types using the Tab and arrow keys ([#525](https://github.com/RSSNext/follow/issues/525)) ([cea7f4a](https://github.com/RSSNext/follow/commit/cea7f4a95ab7336c85613cc551c48639e20b2b9d))
|
||||
* **release:** changelog ([206c59a](https://github.com/RSSNext/follow/commit/206c59a2572359f49f5e4efe2af584238ef54eb7))
|
||||
* remove `src` ([9aa16b6](https://github.com/RSSNext/follow/commit/9aa16b62d84f40c90334396d219ee9ab2a371750))
|
||||
* remove button leading ([84835c5](https://github.com/RSSNext/follow/commit/84835c5ed9df6ac1370b532980929049e8c0d245))
|
||||
* remove clamp limit, close [#688](https://github.com/RSSNext/follow/issues/688) ([553ba7d](https://github.com/RSSNext/follow/commit/553ba7d61f48d94b7dd2fa89538ec8bd68956d1b))
|
||||
|
|
@ -330,10 +381,13 @@
|
|||
* search items ensure unique keys ([#597](https://github.com/RSSNext/follow/issues/597)) ([ff14738](https://github.com/RSSNext/follow/commit/ff14738eeacf04ffe0c457f3600287fb2ddd0529))
|
||||
* sentry config ([779236e](https://github.com/RSSNext/follow/commit/779236e0827af3981bce29e3c1ac9a527aec3fd5))
|
||||
* set auth config first ([a281f58](https://github.com/RSSNext/follow/commit/a281f58a811213d933585280238fec4088ad7749))
|
||||
* set cmdf container `z-index` to `1000` ([#859](https://github.com/RSSNext/follow/issues/859)) ([db1d190](https://github.com/RSSNext/follow/commit/db1d19076c781696b9421f53dd79c35a6f49a324))
|
||||
* set language when init ([fb3b592](https://github.com/RSSNext/follow/commit/fb3b59210ea1f54af234653b5146ba8a9d4bb8cb))
|
||||
* set selector width as a fixed value ([eb2a845](https://github.com/RSSNext/follow/commit/eb2a84520df503ca4f36955b9d1b312d086fe75a))
|
||||
* setting align ([b0e86b0](https://github.com/RSSNext/follow/commit/b0e86b08d51deb3d62a96ce93c78bc5b7683e259))
|
||||
* setting item support props ([0d60da6](https://github.com/RSSNext/follow/commit/0d60da61cbd3bcec0544a4f328fc45dd065a004d))
|
||||
* setting modal should be resizable from bottomRight only ([#769](https://github.com/RSSNext/follow/issues/769)) ([7ef5dfc](https://github.com/RSSNext/follow/commit/7ef5dfc036dcfba1e5c5e6d5569ca1178b0d890a))
|
||||
* setting modal's edge round is covered by content background ([#768](https://github.com/RSSNext/follow/issues/768)) ([8d95143](https://github.com/RSSNext/follow/commit/8d951436df1d67146b5ed0ca83a7448bd9e23aa6))
|
||||
* setting sidebar icon size ([dd7042e](https://github.com/RSSNext/follow/commit/dd7042e462f68184566ddf7cc561072066705379))
|
||||
* setting wallet style update ([a4f155a](https://github.com/RSSNext/follow/commit/a4f155a7174b802e310baaeb2e8ed14d2f5735b2))
|
||||
* shadow dom font and colors variants ([0355d4f](https://github.com/RSSNext/follow/commit/0355d4fb6bf5e57a1b22bb25d51f7e2c0fbe483a))
|
||||
|
|
@ -343,10 +397,12 @@
|
|||
* shiki block style ([75908d4](https://github.com/RSSNext/follow/commit/75908d4a6f43847539accd4bad876983902bd5d8))
|
||||
* shortcut modal overlay and id ([c210dc9](https://github.com/RSSNext/follow/commit/c210dc900eda2b30e05a9a5434f06810c1a6cd14))
|
||||
* ShortcutMode cannot be closed using shortcuts keys ([#708](https://github.com/RSSNext/follow/issues/708)) ([12f3965](https://github.com/RSSNext/follow/commit/12f3965f6ac093d0b88eb5e25f47651649dc6ddd))
|
||||
* **shortcut:** replace `meta` to `ctrl` in windows ([c520448](https://github.com/RSSNext/follow/commit/c52044884770dcb9292f53e0d269e54d5561e51b))
|
||||
* shortcuts kbd shake ([#433](https://github.com/RSSNext/follow/issues/433)) ([7e8f462](https://github.com/RSSNext/follow/commit/7e8f462424e6b2b98b316c9814610034db93f8c9))
|
||||
* should dismiss when outside (quick new panel) ([675ac84](https://github.com/RSSNext/follow/commit/675ac845d4b9d7c6a71b7891440d2860ca34f0a4))
|
||||
* should use markdown to render link in rsshub parameter desc ([#505](https://github.com/RSSNext/follow/issues/505)) ([2f64787](https://github.com/RSSNext/follow/commit/2f64787e4bc1bc21bf1c1741ed0179f80c66549a))
|
||||
* show add feed error message ([7763129](https://github.com/RSSNext/follow/commit/77631299438b4fe6b575a9de5881cebfea6e4ba4))
|
||||
* show delete category action when available ([fd104d0](https://github.com/RSSNext/follow/commit/fd104d0087f070fd5621fa7081a3704eab1b5455))
|
||||
* show episode cover for podcast ([#315](https://github.com/RSSNext/follow/issues/315)) ([4ef7f8c](https://github.com/RSSNext/follow/commit/4ef7f8cbd38dd0a148c053e5ee0468e282efe5fb))
|
||||
* show fallback media when loading error ([#615](https://github.com/RSSNext/follow/issues/615)) ([40dfbde](https://github.com/RSSNext/follow/commit/40dfbde85e4e2fc2c3dc2daaff73ed520c998c37))
|
||||
* show filtered button only if no next page ([6fb46e7](https://github.com/RSSNext/follow/commit/6fb46e7887409f735df99f7aa08cd0ef61976981))
|
||||
|
|
@ -363,6 +419,7 @@
|
|||
* stable mark all feed list, fixed [#245](https://github.com/RSSNext/follow/issues/245) ([c9d098f](https://github.com/RSSNext/follow/commit/c9d098f4e9bc5d3e3ca5bd026f1947adf6dbcca7))
|
||||
* stable shadow dom key ([06cafb5](https://github.com/RSSNext/follow/commit/06cafb50d8490a29856c27d9344b76090e9f81af))
|
||||
* star icon place in grid template ([dc3ca01](https://github.com/RSSNext/follow/commit/dc3ca01df3870f5ef43b0e4654aa84fa46f034d8))
|
||||
* star icon position in list item ([170c41f](https://github.com/RSSNext/follow/commit/170c41f981a9f25057b51c2309fc81c99f941df4))
|
||||
* stop stopPropagation on Media Imag ([a92f96b](https://github.com/RSSNext/follow/commit/a92f96bf6159316f595a742209a6bbca0d0b41fa))
|
||||
* stored user profile item style ([64f40ee](https://github.com/RSSNext/follow/commit/64f40ee614a3d820b555c76b957287f289d01bb9))
|
||||
* style ([#359](https://github.com/RSSNext/follow/issues/359)) ([3d39308](https://github.com/RSSNext/follow/commit/3d393086966826f194ae660b43bcb0cb33b3d6f3))
|
||||
|
|
@ -374,6 +431,7 @@
|
|||
* **styles:** user subscription modal list item style ([a954eb9](https://github.com/RSSNext/follow/commit/a954eb93bc74fc6730244e15067888f88743d067))
|
||||
* **style:** video play button align center ([465f1a6](https://github.com/RSSNext/follow/commit/465f1a6acf6a1d96a28e724f071f8a68a327a56d))
|
||||
* subcription status & category empty, input value null ([#263](https://github.com/RSSNext/follow/issues/263)) ([93e2ccf](https://github.com/RSSNext/follow/commit/93e2ccfd5831f8a7f43932acd2976785e3adfbff))
|
||||
* subscription group category name ellipsis ([1665a5b](https://github.com/RSSNext/follow/commit/1665a5b2a8b4d4c5810fab38e31610397107e554))
|
||||
* subscription inbox data ([2b496c4](https://github.com/RSSNext/follow/commit/2b496c4e49f223a9d00381983149e827bdb695fd))
|
||||
* subview layout ([36a34de](https://github.com/RSSNext/follow/commit/36a34de26caf2ff00847827635eedd3771faadc0))
|
||||
* supports Windows ([#189](https://github.com/RSSNext/follow/issues/189)) ([486a328](https://github.com/RSSNext/follow/commit/486a328d357317361ef24222fab09eb47e26d07d))
|
||||
|
|
@ -390,11 +448,15 @@
|
|||
* toc not responsive in dev mode ([ee1894c](https://github.com/RSSNext/follow/commit/ee1894c2d0c420ecf0e63a6dd6bafda57a25a6e3))
|
||||
* toc range calcation ([2ebcc58](https://github.com/RSSNext/follow/commit/2ebcc58414802cffc84fc25ad30bb9fe272ea773))
|
||||
* toc scroll logic ([261d12e](https://github.com/RSSNext/follow/commit/261d12e5600028a5bff3b2c1451271ee962403ed))
|
||||
* toc width logic ([0c582f2](https://github.com/RSSNext/follow/commit/0c582f24e7619b6602a66dc8ab01a0e785715af6))
|
||||
* tooltip content of open image and improve i18n support ([#689](https://github.com/RSSNext/follow/issues/689)) ([440de7b](https://github.com/RSSNext/follow/commit/440de7b737f9abcadc68ab1099fd28a8e6710699))
|
||||
* tooltip in dark mode shadow ([55266ce](https://github.com/RSSNext/follow/commit/55266ce2cceea4e348c33989398f8f9bb92644a7))
|
||||
* tooltip style in dark mode ([a61c79e](https://github.com/RSSNext/follow/commit/a61c79ee7d4bd73fdf35fa5565c711297a29c7a0))
|
||||
* transcation table text overflow ([a026c6e](https://github.com/RSSNext/follow/commit/a026c6e34c0eeac1ee6acec1c8181c009ca0ab36))
|
||||
* translation markdown tooltip wrapper style ([639bace](https://github.com/RSSNext/follow/commit/639bace313311db6319fb1fe168b68af7aa1e8e0))
|
||||
* translation tooltip width ([58d251e](https://github.com/RSSNext/follow/commit/58d251e6e40f3b41d99528411d2a90e65bd519da)), closes [#811](https://github.com/RSSNext/follow/issues/811)
|
||||
* translation tooltip z index ([71abbc9](https://github.com/RSSNext/follow/commit/71abbc9b8e0954b0ef6b4d65709b40222b8acc81))
|
||||
* trending icon ([e09dce4](https://github.com/RSSNext/follow/commit/e09dce467b4c13fc585646a944e8b77a1903d4d7))
|
||||
* truncate long title in dialog title ([#729](https://github.com/RSSNext/follow/issues/729)) ([8d25987](https://github.com/RSSNext/follow/commit/8d259878c30a987940d7e982c63b37f100008635))
|
||||
* try fix vercel config ([968dea9](https://github.com/RSSNext/follow/commit/968dea91f474a76298091de6a23f3ba7a11fb22f))
|
||||
* try to fix linux build ([89eda0f](https://github.com/RSSNext/follow/commit/89eda0f2148b5cc4d45d95f462c6a721022d0bc8))
|
||||
|
|
@ -402,6 +464,8 @@
|
|||
* try to fix windows get version ([9fe5a0e](https://github.com/RSSNext/follow/commit/9fe5a0e34571eb86041a108403909c5953ebf6f5))
|
||||
* try vercel conf ([309db21](https://github.com/RSSNext/follow/commit/309db219e8bc1f0d37acc64e699116403b2d5ebb))
|
||||
* tts should hide in web ([30721c8](https://github.com/RSSNext/follow/commit/30721c8170baf131a457d97a2a723e96b7b7fc94))
|
||||
* turn off native form autocompletion in `AutoCompletion` ([#869](https://github.com/RSSNext/follow/issues/869)) ([a421e5d](https://github.com/RSSNext/follow/commit/a421e5d63664476c6d75c41ac819f00fd8bab75c))
|
||||
* type error ([afb7997](https://github.com/RSSNext/follow/commit/afb7997de2601495a643d8d7cc897adea05081b5))
|
||||
* type error ([97779a0](https://github.com/RSSNext/follow/commit/97779a0daab9ea488619a4fd0a10317a067b71dc))
|
||||
* type error ([3fb8eac](https://github.com/RSSNext/follow/commit/3fb8eac4f8ff1a6505ee1ed035a713321b63b4c4))
|
||||
* type error ([c7f11f9](https://github.com/RSSNext/follow/commit/c7f11f99f28bf918aaf8c03b74145b2f9b126a72))
|
||||
|
|
@ -417,6 +481,7 @@
|
|||
* typing ([a386fd6](https://github.com/RSSNext/follow/commit/a386fd6e97fb98c42b3eedf156c5b167ff67bd34))
|
||||
* typo ([deb96c5](https://github.com/RSSNext/follow/commit/deb96c538258c939c60762c723d58955899031cf))
|
||||
* **ui:** entry title line height ([#608](https://github.com/RSSNext/follow/issues/608)) ([5309491](https://github.com/RSSNext/follow/commit/53094912981ad8cfc79120621725bab1708250f8))
|
||||
* **ui:** fetch error toast margin ([e5fc18f](https://github.com/RSSNext/follow/commit/e5fc18fd9a16a0e32928b2d2b04c7d48d546c782))
|
||||
* **ui:** social media gap if no media ([1435632](https://github.com/RSSNext/follow/commit/14356325e42d87c43f33b975fbb1d963cfa67251))
|
||||
* **ui:** social media unread dot position ([e760676](https://github.com/RSSNext/follow/commit/e760676827297f60a4d00a51f4be98579c93c9f7))
|
||||
* undo kbd color in dark mode ([2a106ae](https://github.com/RSSNext/follow/commit/2a106ae632e0641d58d0d45b88f61a1c5c6eafa5))
|
||||
|
|
@ -426,6 +491,8 @@
|
|||
* unify setting tab icon color, fix [#303](https://github.com/RSSNext/follow/issues/303) ([33a049a](https://github.com/RSSNext/follow/commit/33a049a8513f5c3cab9ce8a6adefadf7399164f8))
|
||||
* unread state not up to date, fix [#485](https://github.com/RSSNext/follow/issues/485) ([96f7762](https://github.com/RSSNext/follow/commit/96f77623edd04582e95aa8125ccf4515daac96c1))
|
||||
* update cmdk high contrast, [@unixzii](https://github.com/unixzii) advice ([cbd7593](https://github.com/RSSNext/follow/commit/cbd75932433ad056b257c5934e6aefc3c0d829dd))
|
||||
* update entry action notifications and translations ([#836](https://github.com/RSSNext/follow/issues/836)) ([9230cf7](https://github.com/RSSNext/follow/commit/9230cf71752432ab2d411ae2a83400c37c2a5f2a))
|
||||
* update inbox action button ([f7961ed](https://github.com/RSSNext/follow/commit/f7961edc29d786a57f06f9d128a5ca9e506e0eea))
|
||||
* update invitation fab ([0cd1837](https://github.com/RSSNext/follow/commit/0cd183780f299b94a800cd86342484afa7f716bd))
|
||||
* update lists table ui ([0d68e75](https://github.com/RSSNext/follow/commit/0d68e7584592d08191c54a16257dd92924216387))
|
||||
* update search for ([b51d75f](https://github.com/RSSNext/follow/commit/b51d75ffc9b0a9c2760269041aaa4c5a7f6b26d0))
|
||||
|
|
@ -443,6 +510,7 @@
|
|||
* user modal list padding ([992ea15](https://github.com/RSSNext/follow/commit/992ea1594af02e3815adae2fe99de4f205543239))
|
||||
* user profile can not scroll by scrollbar ([eac1965](https://github.com/RSSNext/follow/commit/eac1965cfc3d2bc86e11f256237322f15892b897))
|
||||
* userActions in feed store ([8da4fb7](https://github.com/RSSNext/follow/commit/8da4fb71d9cc14832bc985cf8c1bd6f04dbe4e4c))
|
||||
* **vercel:** filter subpath ([fc38072](https://github.com/RSSNext/follow/commit/fc38072320f8225e6ae60f4e25719eaeb9ff5e6a))
|
||||
* video preview ([e38820c](https://github.com/RSSNext/follow/commit/e38820c1aa2294f45e05d331bf4bce0e4d8efb44))
|
||||
* view icon color in dark mode ([991bff7](https://github.com/RSSNext/follow/commit/991bff7660e93b872f1398c89c0fe4316f4327d9))
|
||||
* view source content in picture view ([16938f6](https://github.com/RSSNext/follow/commit/16938f60786f8496152361405c0fcff4635f7d59))
|
||||
|
|
@ -452,12 +520,16 @@
|
|||
* **wallet:** add missing space between words in wallet ([#279](https://github.com/RSSNext/follow/issues/279)) ([6873d21](https://github.com/RSSNext/follow/commit/6873d21e267fda102b13bc2a4e52de9bd7eea206))
|
||||
* window titlebar position, fixed [#197](https://github.com/RSSNext/follow/issues/197) ([b6158ec](https://github.com/RSSNext/follow/commit/b6158ec0bd1e18aed29d028f2ff86008489c8a64))
|
||||
* windows app titlebar style in dark mode and radius ([3843905](https://github.com/RSSNext/follow/commit/38439050bb6db71bf6d966ab43026b660ad24f9a))
|
||||
* Windows json sort diff ([74bf02b](https://github.com/RSSNext/follow/commit/74bf02bdd3ad6bc5c252f568787653819c1a8f2e))
|
||||
* windows load locale resource, fixed [#447](https://github.com/RSSNext/follow/issues/447) ([862757a](https://github.com/RSSNext/follow/commit/862757a99ff5246058db5ca0d7e60b5f08a2f7ed))
|
||||
* windows locale lead to app crash, fixed [#255](https://github.com/RSSNext/follow/issues/255) ([bb43da9](https://github.com/RSSNext/follow/commit/bb43da981894d4bf611218bd4b2001a39636df64))
|
||||
* windows maximize will lost frame and background material ([2bd0e78](https://github.com/RSSNext/follow/commit/2bd0e78e4f859d9c98f53f748c9871a41348db1c))
|
||||
* windows multi-display ([7490cd1](https://github.com/RSSNext/follow/commit/7490cd12d0e42a7f41931acd9d77bf64be39a26d))
|
||||
* windows sep, fixes [#741](https://github.com/RSSNext/follow/issues/741) ([9b1de77](https://github.com/RSSNext/follow/commit/9b1de775d2157606c30c4ece3287a42e1e9463a3))
|
||||
* windows web mark all read ui ([#908](https://github.com/RSSNext/follow/issues/908)) ([45b4bd8](https://github.com/RSSNext/follow/commit/45b4bd8085377e8178b6804c0718726ecc15145b))
|
||||
* **windows:** dont remove locale ([7305eba](https://github.com/RSSNext/follow/commit/7305eba3fee218330818d96ca155f833aa99d631))
|
||||
* **windows:** skip remove locle ([5df82d0](https://github.com/RSSNext/follow/commit/5df82d0c0f98bebb6e78a694a6ceda3644eb36ef))
|
||||
* withdraw availableBalance ([167d82a](https://github.com/RSSNext/follow/commit/167d82adc061078102fa9984d29f94735d052ce9))
|
||||
* wrong opening status of newly added feed ([#726](https://github.com/RSSNext/follow/issues/726)) ([2520ddb](https://github.com/RSSNext/follow/commit/2520ddb0f4f1923b729ae707a703713f1a158f06))
|
||||
* wrong text wrap ([#316](https://github.com/RSSNext/follow/issues/316)) ([0cee7ef](https://github.com/RSSNext/follow/commit/0cee7eff25ed1058b108f1c7a9c643ea17b479c0))
|
||||
* wtf, cursor deleted my code ([1852d1e](https://github.com/RSSNext/follow/commit/1852d1ee812567c473ff26d316b93d1ccf8e8a88))
|
||||
|
|
@ -474,6 +546,8 @@
|
|||
* add biz code i18n for fr and ru ([#521](https://github.com/RSSNext/follow/issues/521)) ([0dc4b86](https://github.com/RSSNext/follow/commit/0dc4b866d7eff2d32df2158902d6d1fbdea41f27))
|
||||
* add biz code i18n for zh-cn ([#503](https://github.com/RSSNext/follow/issues/503)) ([d35e011](https://github.com/RSSNext/follow/commit/d35e0119953a154d18273c1d155f14d03c9a6ce8))
|
||||
* add biz user info on sentry tracker ([e3e52ab](https://github.com/RSSNext/follow/commit/e3e52abedeb5507ca71d663faa7ef050b661cf0a))
|
||||
* add bundleId to PushReceiver ([f196493](https://github.com/RSSNext/follow/commit/f196493b68a84489de93ac0c3944b039c79f25c0))
|
||||
* add copy title to context menu of feed entry ([#801](https://github.com/RSSNext/follow/issues/801)) ([1f57ab2](https://github.com/RSSNext/follow/commit/1f57ab2ac76ef04aff37814b4c7e961ad33b6e11))
|
||||
* add discover back to top fab ([a97e60c](https://github.com/RSSNext/follow/commit/a97e60cd005ca7ebb5aed56655b94975ebf1ccb7))
|
||||
* add divider when sticky for date item ([755e292](https://github.com/RSSNext/follow/commit/755e292af05c3adeae8943cc5c4c05af11d30d16))
|
||||
* add external resource ([abec0ef](https://github.com/RSSNext/follow/commit/abec0ef191a8138c109b4a52fa36b04f8e7c16bc))
|
||||
|
|
@ -485,6 +559,7 @@
|
|||
* add manual setting lang lock keyu ([b9c6a8b](https://github.com/RSSNext/follow/commit/b9c6a8b58099c86a178494ffe4c875f7c31760a3))
|
||||
* add missing words in zh-HK ([#610](https://github.com/RSSNext/follow/issues/610)) ([d34c1c9](https://github.com/RSSNext/follow/commit/d34c1c95d68445075987f833d29956b45e1036a3))
|
||||
* add more words i18n ([#516](https://github.com/RSSNext/follow/issues/516)) ([e2b8ec8](https://github.com/RSSNext/follow/commit/e2b8ec88624ad1e8e7f6136a624fc284ae3fb77b))
|
||||
* add more words i18n ([#785](https://github.com/RSSNext/follow/issues/785)) ([892ceb2](https://github.com/RSSNext/follow/commit/892ceb2269ec553049c86a8b295c0a08e5649b04))
|
||||
* add object-cover to feed icon, add zh-HK and zh-TW errors lang ([#508](https://github.com/RSSNext/follow/issues/508)) ([9351a8f](https://github.com/RSSNext/follow/commit/9351a8fe735977ae02320370f9aa6a83854d7adf))
|
||||
* add og image, fixed [#242](https://github.com/RSSNext/follow/issues/242) ([5d4e958](https://github.com/RSSNext/follow/commit/5d4e9586569e4afe212138d2001ed9007ce9950b))
|
||||
* add overflow tooltip for feed title ([a89ad8b](https://github.com/RSSNext/follow/commit/a89ad8be84384c1851587d02f6b21ce64ad24bdb))
|
||||
|
|
@ -527,6 +602,7 @@
|
|||
* custom feed title ([#300](https://github.com/RSSNext/follow/issues/300)) ([501e2f4](https://github.com/RSSNext/follow/commit/501e2f44c1d3eb9a1a316549faedb2e1288f7fbe))
|
||||
* date item in entry column ([#199](https://github.com/RSSNext/follow/issues/199)) ([9d5a811](https://github.com/RSSNext/follow/commit/9d5a81112e873f5b422356fa0b3fcf526abb84e5))
|
||||
* dayjs locale ([6ed0a3b](https://github.com/RSSNext/follow/commit/6ed0a3bf3a937a95985c98bb24c4bc23f6b776de))
|
||||
* delete list ([c881d79](https://github.com/RSSNext/follow/commit/c881d799e27b4934144b25f50a493f96838003d5))
|
||||
* display a tip button and tip users at the bottom of the entry content. ([971f81d](https://github.com/RSSNext/follow/commit/971f81d25d5745748884dcc96a1a072aee3d3dbb))
|
||||
* display certification in discover form ([1e212ef](https://github.com/RSSNext/follow/commit/1e212effad12bab751179dc9a94d71a37a3b5ed8))
|
||||
* display claimed feed list in settings ([d9ae277](https://github.com/RSSNext/follow/commit/d9ae277cfa861c4e558542820896bde821341dc4))
|
||||
|
|
@ -542,6 +618,7 @@
|
|||
* enlarge the interactive area of the close button ([#483](https://github.com/RSSNext/follow/issues/483)) ([3cc7c21](https://github.com/RSSNext/follow/commit/3cc7c2117d951f9994963c7e4017293b4a8840fa))
|
||||
* entry preview modal ([3981995](https://github.com/RSSNext/follow/commit/3981995a248680844cdd5a1f7663135863f4ef5f))
|
||||
* expand entry read history ([#377](https://github.com/RSSNext/follow/issues/377)) ([e7f923a](https://github.com/RSSNext/follow/commit/e7f923a0a08e5a4c7e13ff8dd76820f1b4265f25))
|
||||
* export feeds, close [#873](https://github.com/RSSNext/follow/issues/873) ([eae857d](https://github.com/RSSNext/follow/commit/eae857d25e31532fc2f53e3edc71263a94410922))
|
||||
* expose present user profile modal for electron ([2290760](https://github.com/RSSNext/follow/commit/2290760cbb71c0c061d4be3dc00fa20e9f1ec19a))
|
||||
* external page i18n ([8d8aa09](https://github.com/RSSNext/follow/commit/8d8aa09230eb5ddd55dffe074b20c9ed81e84a99))
|
||||
* extract i18n text ([8454691](https://github.com/RSSNext/follow/commit/8454691e221d2f8544b2b741dbaeaf95303abc51))
|
||||
|
|
@ -587,14 +664,17 @@
|
|||
* **i18n:** Update Chinese Translation ([#572](https://github.com/RSSNext/follow/issues/572)) ([d24139b](https://github.com/RSSNext/follow/commit/d24139b82233ea04674c8b93ddee323d2c84a8ef))
|
||||
* **i18n:** zh-CN: context menu of adding feeds to lists ([#661](https://github.com/RSSNext/follow/issues/661)) ([c3b2fa9](https://github.com/RSSNext/follow/commit/c3b2fa9274ef1e199e66d07c94dc6674f1de6045))
|
||||
* ignore feed errors within 9 hours ([b71926e](https://github.com/RSSNext/follow/commit/b71926ec286b77dd1b9fc25df459176063b194da))
|
||||
* image proxy for avatar images ([#524](https://github.com/RSSNext/follow/issues/524)) ([e33aa5f](https://github.com/RSSNext/follow/commit/e33aa5f0c78f6d1664433405c6d705a507a8aeac))
|
||||
* **image:** blurhash for entry media preview, and other adjustment ([b688848](https://github.com/RSSNext/follow/commit/b688848dacc25f3106c90681b3044a69571a54d5))
|
||||
* impl cmd+b ([ea8a832](https://github.com/RSSNext/follow/commit/ea8a83271e9be37c277540eb605651d7166d2ea4))
|
||||
* impl masonry in view mark read and scroll to mark read ([4263658](https://github.com/RSSNext/follow/commit/4263658e3240850ca74fcaa666bf8145553f8874))
|
||||
* implement immersive translation functionality with caching support in entry content module ([#714](https://github.com/RSSNext/follow/issues/714)) ([3b67b2c](https://github.com/RSSNext/follow/commit/3b67b2c0a79db9b232336bb5f36eb1e756f4b86e))
|
||||
* improve shiki code block renderer and show language ([590d9cb](https://github.com/RSSNext/follow/commit/590d9cbb94a63f843d00bf54848bba40157d2452))
|
||||
* inbox ([#742](https://github.com/RSSNext/follow/issues/742)) ([2fba746](https://github.com/RSSNext/follow/commit/2fba746447c1c10f2d58ac9eb908cd0d6a5fb364))
|
||||
* inbox list api ([6da197c](https://github.com/RSSNext/follow/commit/6da197c76bc4d08c80277fc8801a68bfbd413248))
|
||||
* inbox set read and unread ([6da8bce](https://github.com/RSSNext/follow/commit/6da8bce04cb0da99efbad473879350131f993c16))
|
||||
* inbox unread data updating ([61d9a48](https://github.com/RSSNext/follow/commit/61d9a48310d726205271d1d01026511fb4ccb276))
|
||||
* independent power page ([6aeb666](https://github.com/RSSNext/follow/commit/6aeb66683b2e03ba3f21647589e03ac2b705bf83))
|
||||
* integration settings page ([f9f1938](https://github.com/RSSNext/follow/commit/f9f19386b28e853eb03b3ca5bae629d4f6542cb3))
|
||||
* invitation limitation message ([fa37a0c](https://github.com/RSSNext/follow/commit/fa37a0ca2c8235fb5fd47f96c26de7fdcd762ad8))
|
||||
* **invitation:** add signout button ([3c0f4e7](https://github.com/RSSNext/follow/commit/3c0f4e779c68a933d57e232d62774fca1c0b86ed))
|
||||
|
|
@ -631,6 +711,7 @@
|
|||
* new power page ([c3630f8](https://github.com/RSSNext/follow/commit/c3630f85bd221ecf875b20337e5c6a452c613362))
|
||||
* no media available tip in picture item ([1d4fca4](https://github.com/RSSNext/follow/commit/1d4fca4e7d0e7c6f02f1ac775f36079ef5ce1129))
|
||||
* no media available tip in picture item ([58d9b3b](https://github.com/RSSNext/follow/commit/58d9b3b1b09f52def911521c08d9835f31221401))
|
||||
* notifications logger ([97041ab](https://github.com/RSSNext/follow/commit/97041abab5f0846249343de07f592ba6fc421870))
|
||||
* only closing window can trigger query invalidation ([a8e48f4](https://github.com/RSSNext/follow/commit/a8e48f493127104035e9537e0461c4a40e2dc339))
|
||||
* only show has media entry item in picture view ([f7dedf2](https://github.com/RSSNext/follow/commit/f7dedf2b27f2597a49e9381af5581b6d0550421b))
|
||||
* optimize 404 page ([f51b1e2](https://github.com/RSSNext/follow/commit/f51b1e2de9e8d8c3bdea9db79476c17cd7247a4b))
|
||||
|
|
@ -642,18 +723,23 @@
|
|||
* path parser v8 ([5be2e9a](https://github.com/RSSNext/follow/commit/5be2e9aad4309ba5d63451460d674e233981f6e3))
|
||||
* picture entry preview modal ([29f2c0c](https://github.com/RSSNext/follow/commit/29f2c0ca41badb34b001ac9dff91c1e2b600a71f))
|
||||
* pictures masonry ([#212](https://github.com/RSSNext/follow/issues/212)) ([3f9533a](https://github.com/RSSNext/follow/commit/3f9533aa3a4470b6d705eda15ed988dc0686858a))
|
||||
* power page redirection ([dd398cd](https://github.com/RSSNext/follow/commit/dd398cdc4d082f1c3292dc5fc4729a88a9650756))
|
||||
* preview media min width ([242d0aa](https://github.com/RSSNext/follow/commit/242d0aa55eb5bef84d714ee43fa4b614f726fd03))
|
||||
* preview social media ai daily ([0252bc0](https://github.com/RSSNext/follow/commit/0252bc022306123973ffd27b1cb211aadffae052))
|
||||
* prompt the full categories when editing the feed ([#392](https://github.com/RSSNext/follow/issues/392)) ([d5ce474](https://github.com/RSSNext/follow/commit/d5ce4744fe28c5d4d05844af6fe344fdf7849424))
|
||||
* read clipboard ([e115b6d](https://github.com/RSSNext/follow/commit/e115b6de66df93422465044bc2d2930aa7a073fc))
|
||||
* read image proxy url from ab value ([d81f57d](https://github.com/RSSNext/follow/commit/d81f57d2ad24ab9176a6d342f427676065c0f5f6))
|
||||
* readability support ([#178](https://github.com/RSSNext/follow/issues/178)) ([6c052b8](https://github.com/RSSNext/follow/commit/6c052b881b77e75763a9c4117cd562d21a58044d))
|
||||
* readHistories option for reads post ([6ce2c22](https://github.com/RSSNext/follow/commit/6ce2c2270fbe611fc7ac8f532f68a45cf5f86cff))
|
||||
* redesign image preview swiper style ([23971b5](https://github.com/RSSNext/follow/commit/23971b53f383dc1d6793c3b0dd4ca58a71c5b71e))
|
||||
* reduce motion use fade-in and fade-out transition ([78053c1](https://github.com/RSSNext/follow/commit/78053c17fd91ccd7568fe57af3767cd6636929e2))
|
||||
* refresh cursor style when split panel can't drag ([c9f70c0](https://github.com/RSSNext/follow/commit/c9f70c09891eaf5dec89c305a5382e705c8c7eb3))
|
||||
* refresh unread data in entries refresh action ([31dfbd8](https://github.com/RSSNext/follow/commit/31dfbd8de56bafa6b26188a1329d9d81fca36ed6))
|
||||
* registerPushNotifications ([#812](https://github.com/RSSNext/follow/issues/812)) ([baab5b9](https://github.com/RSSNext/follow/commit/baab5b993f3adef1865e136ba668bfad5492201b))
|
||||
* Remember the open state of the category, Ensure that each View'… ([#709](https://github.com/RSSNext/follow/issues/709)) ([cb2078d](https://github.com/RSSNext/follow/commit/cb2078da70ac93add77aee9da83d5687c4b8b9c8))
|
||||
* remove power modal ([80f1b0f](https://github.com/RSSNext/follow/commit/80f1b0fd287e38c9cfe82e2ec9099c21fe863bf1))
|
||||
* remove tooltip border ([9e770c9](https://github.com/RSSNext/follow/commit/9e770c96a18beeb290adb9d189dd6afff9dbb817))
|
||||
* remove userId query for wallet get ([b19fc2b](https://github.com/RSSNext/follow/commit/b19fc2be2e0a4a7b49b61619c42170be0d6d100b))
|
||||
* render social media with full text ([1531d2b](https://github.com/RSSNext/follow/commit/1531d2b70916b3aff7293db411f472cb013cc4e7))
|
||||
* resizeable setting panel and adjust action tab ([5fd9b23](https://github.com/RSSNext/follow/commit/5fd9b23f03bccd6d3bc427ee0e5c31bfb69e3c42))
|
||||
* save to instapaper ([9d9b2c5](https://github.com/RSSNext/follow/commit/9d9b2c5eccc11b5d6ca10be59041aef4985cc34b))
|
||||
|
|
@ -668,6 +754,7 @@
|
|||
* show media fallback for picture items ([83123f8](https://github.com/RSSNext/follow/commit/83123f8fb23e03a3384719e9228301aac122c215))
|
||||
* show media fallback for video item ([3446a81](https://github.com/RSSNext/follow/commit/3446a81ea28d9e18e5dfa18306758cda64637520))
|
||||
* show reasons for profile update failure ([#484](https://github.com/RSSNext/follow/issues/484)) ([b8b94ac](https://github.com/RSSNext/follow/commit/b8b94ac6c4e97088144f20cb8abd8f1d8080f8fd))
|
||||
* silence action ([#823](https://github.com/RSSNext/follow/issues/823)) ([dd0364d](https://github.com/RSSNext/follow/commit/dd0364d1a9e521a0669f014c6ff51570181aafdd))
|
||||
* smaller and fixed unread dot ([72aa3a8](https://github.com/RSSNext/follow/commit/72aa3a8cae968893b7ca3b0f8abf11c50c739c74))
|
||||
* smaller lists image ([31591d6](https://github.com/RSSNext/follow/commit/31591d68d595c9b44bf2ec49b7e3083acd612bb3))
|
||||
* some optimize ([5f61579](https://github.com/RSSNext/follow/commit/5f6157972c7ce2bf45b6e7b4026d9e727795c9a3))
|
||||
|
|
@ -682,6 +769,8 @@
|
|||
* support i18n ([#345](https://github.com/RSSNext/follow/issues/345)) ([53c1c66](https://github.com/RSSNext/follow/commit/53c1c6639f3e7383ec77f6aace672ba34cd8bbba))
|
||||
* support pageup/pagedown to scroll up/down ([6e0c3bc](https://github.com/RSSNext/follow/commit/6e0c3bc5e3e2437a51fa991940b4e4496ed2bb75))
|
||||
* support setting proxy for app ([#452](https://github.com/RSSNext/follow/issues/452)) ([cfd5275](https://github.com/RSSNext/follow/commit/cfd527545ade50a529698bdd57ec16d0f3ccee98))
|
||||
* support shortcut to toggle wide mode ([b7a054f](https://github.com/RSSNext/follow/commit/b7a054f3132079693f0d93a65eb236c95920bcb8))
|
||||
* support specific import for web and electron ([9a84a29](https://github.com/RSSNext/follow/commit/9a84a293967d5d415e86041c7a586846519def5f))
|
||||
* support toc parser ([fb4ca52](https://github.com/RSSNext/follow/commit/fb4ca522440aced4d2aa18fda2a9d5c43e32d0d1))
|
||||
* sync indicator when disable ([945ddda](https://github.com/RSSNext/follow/commit/945dddae2534f07e5289e307c36de1f8334636bc))
|
||||
* tiny styles ([78bcc55](https://github.com/RSSNext/follow/commit/78bcc5562baa12cece51da6564b77c6f37a1596c))
|
||||
|
|
@ -689,6 +778,12 @@
|
|||
* toast when upgrade ([2a71bfc](https://github.com/RSSNext/follow/commit/2a71bfc0756011c0226c16ef53a755a47cf44acb))
|
||||
* toc hoverable ([3be6f2b](https://github.com/RSSNext/follow/commit/3be6f2ba019cb914e8ff452065d252e01e7ae496))
|
||||
* toc position calcation ([a7828d4](https://github.com/RSSNext/follow/commit/a7828d41e1e8e849a4f7df7e0c5e50c5d15a2491))
|
||||
* **toc:** redesign toc item in wide mode ([535afe2](https://github.com/RSSNext/follow/commit/535afe2393fafe6ea18bc4254c79132967825238))
|
||||
* transform html ([#870](https://github.com/RSSNext/follow/issues/870)) ([926ef00](https://github.com/RSSNext/follow/commit/926ef007854e8b5bda885c58f97469818589b930))
|
||||
* **trending:** implement trending feature and components ([#820](https://github.com/RSSNext/follow/issues/820)) ([6c4c543](https://github.com/RSSNext/follow/commit/6c4c5437085934f38c0527ac61239460c1c19cfc))
|
||||
* trim social media view end redundant br elements ([#826](https://github.com/RSSNext/follow/issues/826)) ([f83278b](https://github.com/RSSNext/follow/commit/f83278bff841b324e420d311ca592a5e77657f0b))
|
||||
* tx types filter ([142c0f5](https://github.com/RSSNext/follow/commit/142c0f5712980407c688700bf8c98412caa8ea89))
|
||||
* **ui:** enhance context menu with hover effects, disable option, and quick list creation ([#787](https://github.com/RSSNext/follow/issues/787)) ([d2b5cc3](https://github.com/RSSNext/follow/commit/d2b5cc36e9750403d0cc9ee48db842d993c3f7e6))
|
||||
* **ui:** social media ui refresh ([#459](https://github.com/RSSNext/follow/issues/459)) ([fcd96ab](https://github.com/RSSNext/follow/commit/fcd96ab2db4335caa8a6d5055cf12b0a2802fea1))
|
||||
* update discord link ([a45071b](https://github.com/RSSNext/follow/commit/a45071b75da3fa343d52d3ddd6626693b73ea35d))
|
||||
* update hono.ts ([66174a0](https://github.com/RSSNext/follow/commit/66174a028d0e709e0bd38cd7862bddeb1bdd19b4))
|
||||
|
|
@ -698,6 +793,7 @@
|
|||
* update invitations ([84c7b46](https://github.com/RSSNext/follow/commit/84c7b46155c064eab1dbd030add4a00dee412469))
|
||||
* update readwise logo ([c85460c](https://github.com/RSSNext/follow/commit/c85460c5bd13a3dadda1d4592b1ce6e434f4a8c6))
|
||||
* update redirect page layout ([bca6276](https://github.com/RSSNext/follow/commit/bca627696eca663abb02483ffb5c98ed2dc0eebc))
|
||||
* updateNotificationsToken on login ([810919c](https://github.com/RSSNext/follow/commit/810919ca1bff128503e8386118bf9d7323479068))
|
||||
* use check api for dailytask; claim toast ([feec0b0](https://github.com/RSSNext/follow/commit/feec0b0f0fb717725bf34208715d89c73968e885))
|
||||
* use claim check api ([03764da](https://github.com/RSSNext/follow/commit/03764dac0ec500068376372ce4d85b1bc412bcd4))
|
||||
* use dotlottie and add confetti ([2385d15](https://github.com/RSSNext/follow/commit/2385d1530c62d7adada3923832d8f57a13268b6e))
|
||||
|
|
@ -710,10 +806,15 @@
|
|||
* warn when go to external untrusted link ([06be9b5](https://github.com/RSSNext/follow/commit/06be9b58f7c054ef166ea7d5759944280de9a201))
|
||||
* webhook action setting ([0016a07](https://github.com/RSSNext/follow/commit/0016a0742b7ecd107152e09cb629d0d2ea637764))
|
||||
* wide mode ([346db5a](https://github.com/RSSNext/follow/commit/346db5ad480966d669edf4d4e1517fba866de93a))
|
||||
* wide mode icon ([a19ab9a](https://github.com/RSSNext/follow/commit/a19ab9a24778bb0be2bed43bc584778d49e798d0))
|
||||
* **wide-mode:** support `esc` to return back ([a162b3b](https://github.com/RSSNext/follow/commit/a162b3be9f795056b15a7ead339e271884d30e4e))
|
||||
* wider user drop menu ([555428c](https://github.com/RSSNext/follow/commit/555428cbb58d13a3eac50edb3dcfbc7269e920c3))
|
||||
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* cache setting key selected atom ([bbde776](https://github.com/RSSNext/follow/commit/bbde776be35f53c0b6715c031e0c39920c76dcd5))
|
||||
* compress and split main entry bundle size ([766ce67](https://github.com/RSSNext/follow/commit/766ce6732cebb54b90f7e8e34d95ff591fec4ab2))
|
||||
* **i18n:** use nested key to reduce i18n resource size ([4fb1487](https://github.com/RSSNext/follow/commit/4fb1487576bf3100e6cb2a8170c9d936b6401b42))
|
||||
* memo entry column to reduce resize panel re-render ([6bca4b4](https://github.com/RSSNext/follow/commit/6bca4b4a033d27b0953a8e6c3e625e3cd9b71277))
|
||||
* merge all namespace of i18n resource in prod ([92bfce0](https://github.com/RSSNext/follow/commit/92bfce0f7e5faa6eef8d19d813f682271dc1bbf0))
|
||||
|
|
|
|||
|
|
@ -12,16 +12,13 @@ import { getIconPath } from "./helper"
|
|||
import { t } from "./lib/i18n"
|
||||
import { store } from "./lib/store"
|
||||
import { updateNotificationsToken } from "./lib/user"
|
||||
import { logger } from "./logger"
|
||||
import { registerAppMenu } from "./menu"
|
||||
import type { RendererHandlers } from "./renderer-handlers"
|
||||
import { initializeSentry } from "./sentry"
|
||||
import { router } from "./tipc"
|
||||
import { createMainWindow, getMainWindow } from "./window"
|
||||
|
||||
const appFolder = {
|
||||
prod: "Follow",
|
||||
dev: "Follow (dev)",
|
||||
}
|
||||
if (process.argv.length === 3 && process.argv[2].startsWith("follow-dev:")) {
|
||||
process.env.NODE_ENV = "development"
|
||||
}
|
||||
|
|
@ -31,7 +28,8 @@ const isDev = process.env.NODE_ENV === "development"
|
|||
* Mandatory and fast initializers for the app
|
||||
*/
|
||||
export function initializeAppStage0() {
|
||||
app.setPath("appData", path.join(app.getPath("appData"), isDev ? appFolder.dev : appFolder.prod))
|
||||
if (isDev) app.setPath("appData", path.join(app.getPath("appData"), "Follow (dev)"))
|
||||
initializeSentry()
|
||||
}
|
||||
export const initializeAppStage1 = () => {
|
||||
if (process.defaultApp) {
|
||||
|
|
@ -44,8 +42,6 @@ export const initializeAppStage1 = () => {
|
|||
app.setAsDefaultProtocolClient(APP_PROTOCOL)
|
||||
}
|
||||
|
||||
initializeSentry()
|
||||
|
||||
registerIpcMain(router)
|
||||
|
||||
if (app.dock) {
|
||||
|
|
@ -149,17 +145,28 @@ const registerPushNotifications = async () => {
|
|||
updateNotificationsToken()
|
||||
|
||||
const instance = new PushReceiver({
|
||||
debug: isDev,
|
||||
firebase: env.VITE_FIREBASE_CONFIG,
|
||||
debug: true,
|
||||
firebase: JSON.parse(env.VITE_FIREBASE_CONFIG),
|
||||
persistentIds: persistentIds || [],
|
||||
credentials,
|
||||
credentials: credentials || null,
|
||||
bundleId: "is.follow",
|
||||
chromeId: "is.follow",
|
||||
})
|
||||
logger.info(
|
||||
`PushReceiver initialized with credentials ${JSON.stringify(credentials)} and firebase config ${env.VITE_FIREBASE_CONFIG}`,
|
||||
)
|
||||
|
||||
instance.onReady(() => {
|
||||
logger.info("PushReceiver ready")
|
||||
})
|
||||
|
||||
instance.onCredentialsChanged(({ newCredentials }) => {
|
||||
logger.info(`PushReceiver credentials changed to ${newCredentials?.fcm?.token}`)
|
||||
updateNotificationsToken(newCredentials)
|
||||
})
|
||||
|
||||
instance.onNotification((notification) => {
|
||||
logger.info(`PushReceiver received notification: ${JSON.stringify(notification.message.data)}`)
|
||||
const data = notification.message.data as MessagingData
|
||||
switch (data.type) {
|
||||
case "new-entry": {
|
||||
|
|
@ -191,5 +198,11 @@ const registerPushNotifications = async () => {
|
|||
store.set(persistentIdsKey, instance.persistentIds)
|
||||
})
|
||||
|
||||
await instance.connect()
|
||||
try {
|
||||
await instance.connect()
|
||||
} catch (error) {
|
||||
logger.error(`PushReceiver error: ${error instanceof Error ? error.stack : error}`)
|
||||
}
|
||||
|
||||
logger.info("PushReceiver connected")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,15 +3,26 @@ import { resolve } from "node:path"
|
|||
import { app } from "electron"
|
||||
import { JSONFileSyncPreset } from "lowdb/node"
|
||||
|
||||
const db = JSONFileSyncPreset(resolve(app.getPath("userData"), "db.json"), {}) as {
|
||||
let db: {
|
||||
data: Record<string, unknown>
|
||||
write: () => void
|
||||
read: () => void
|
||||
}
|
||||
|
||||
const createOrGetDb = () => {
|
||||
if (!db) {
|
||||
db = JSONFileSyncPreset(resolve(app.getPath("userData"), "db.json"), {}) as typeof db
|
||||
}
|
||||
return db
|
||||
}
|
||||
export const store = {
|
||||
get: (key: string) => db.data[key] as any,
|
||||
get: (key: string) => {
|
||||
const db = createOrGetDb()
|
||||
|
||||
return db.data[key] as any
|
||||
},
|
||||
set: (key: string, value: any) => {
|
||||
const db = createOrGetDb()
|
||||
db.data[key] = value
|
||||
db.write()
|
||||
},
|
||||
|
|
|
|||
|
|
@ -37,8 +37,17 @@ export const createSettingAtom = <T extends object>(
|
|||
setSettings(newSettings)
|
||||
}
|
||||
|
||||
const useSettingKey = <T extends keyof ReturnType<typeof getSettings>>(key: T) =>
|
||||
useAtomValue(useMemo(() => selectAtom(atom, (s) => s[key]), [key]))
|
||||
const selectAtomCacheMap = {} as Record<keyof ReturnType<typeof getSettings>, any>
|
||||
|
||||
const useSettingKey = <T extends keyof ReturnType<typeof getSettings>>(key: T) => {
|
||||
let selectedAtom = selectAtomCacheMap[key]
|
||||
if (!selectedAtom) {
|
||||
selectedAtom = selectAtom(atom, (s) => s[key])
|
||||
selectAtomCacheMap[key] = selectedAtom
|
||||
}
|
||||
|
||||
return useAtomValue(selectedAtom) as ReturnType<typeof getSettings>[T]
|
||||
}
|
||||
|
||||
const useSettingSelector = <
|
||||
T extends keyof ReturnType<typeof getSettings>,
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ const ContextMenuSubContent = React.forwardRef<
|
|||
<ContextMenuPrimitive.SubContent
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"z-[1001] min-w-32 overflow-hidden rounded-md border bg-theme-modal-background-opaque p-1 text-theme-foreground/90 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:shadow-zinc-800/60",
|
||||
"min-w-32 overflow-hidden rounded-md border bg-theme-modal-background-opaque p-1 text-theme-foreground/90 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:shadow-zinc-800/60",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,7 @@ import { jotaiStore } from "~/lib/jotai"
|
|||
import { cn } from "~/lib/utils"
|
||||
|
||||
import { modalStackAtom } from "./atom"
|
||||
import { MODAL_STACK_Z_INDEX } from "./constants"
|
||||
import { ModalInternal } from "./modal"
|
||||
import { ModalOverlay } from "./overlay"
|
||||
import type { ModalProps } from "./types"
|
||||
|
||||
export interface DeclarativeModalProps extends Omit<ModalProps, "content"> {
|
||||
|
|
@ -40,12 +38,9 @@ const DeclarativeModalImpl: FC<DeclarativeModalProps> = ({
|
|||
return (
|
||||
<AnimatePresence>
|
||||
{open && (
|
||||
<>
|
||||
<ModalInternal isTop onClose={onOpenChange} index={index} item={item}>
|
||||
{children}
|
||||
</ModalInternal>
|
||||
<ModalOverlay zIndex={MODAL_STACK_Z_INDEX - 1 + index} />
|
||||
</>
|
||||
<ModalInternal isTop onClose={onOpenChange} index={index} item={item}>
|
||||
{children}
|
||||
</ModalInternal>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
)
|
||||
|
|
|
|||
|
|
@ -34,11 +34,12 @@ import { Divider } from "../../divider"
|
|||
import { RootPortalProvider } from "../../portal/provider"
|
||||
import { EllipsisHorizontalTextWithTooltip } from "../../typography"
|
||||
import { modalStackAtom } from "./atom"
|
||||
import { MODAL_STACK_Z_INDEX, modalMontionConfig } from "./constants"
|
||||
import { modalMontionConfig } from "./constants"
|
||||
import type { CurrentModalContentProps, ModalActionsInternal } from "./context"
|
||||
import { CurrentModalContext } from "./context"
|
||||
import { useResizeableModal } from "./hooks"
|
||||
import type { ModalProps } from "./types"
|
||||
import { ModalOverlay } from "./overlay"
|
||||
import type { ModalOverlayOptions, ModalProps } from "./types"
|
||||
|
||||
const DragBar = isElectronBuild ? (
|
||||
<span className="drag-region fixed left-0 right-36 top-0 h-8" />
|
||||
|
|
@ -51,9 +52,10 @@ export const ModalInternal = memo(
|
|||
index: number
|
||||
|
||||
isTop: boolean
|
||||
overlayOptions?: ModalOverlayOptions
|
||||
onClose?: (open: boolean) => void
|
||||
} & PropsWithChildren
|
||||
>(function Modal({ item, index, onClose: onPropsClose, children, isTop }, ref) {
|
||||
>(function Modal({ item, overlayOptions, onClose: onPropsClose, children, isTop }, ref) {
|
||||
const {
|
||||
CustomModalComponent,
|
||||
modalClassName,
|
||||
|
|
@ -96,8 +98,8 @@ export const ModalInternal = memo(
|
|||
)
|
||||
|
||||
const opaque = useUISettingKey("modalOpaque")
|
||||
const modalSettingOverlay = useUISettingKey("modalOverlay")
|
||||
|
||||
const zIndexStyle = useMemo(() => ({ zIndex: MODAL_STACK_Z_INDEX + index + 1 }), [index])
|
||||
const dismiss = useCallback(
|
||||
(e: SyntheticEvent) => {
|
||||
e.stopPropagation()
|
||||
|
|
@ -224,10 +226,7 @@ export const ModalInternal = memo(
|
|||
}
|
||||
}, [switchHotkeyScope])
|
||||
|
||||
const modalStyle = useMemo(
|
||||
() => ({ ...zIndexStyle, ...resizeableStyle }),
|
||||
[resizeableStyle, zIndexStyle],
|
||||
)
|
||||
const modalStyle = resizeableStyle
|
||||
const isSelectingRef = useRef(false)
|
||||
const handleSelectStart = useCallback(() => {
|
||||
isSelectingRef.current = true
|
||||
|
|
@ -269,17 +268,27 @@ export const ModalInternal = memo(
|
|||
}, [])
|
||||
|
||||
useImperativeHandle(ref, () => modalElementRef.current!)
|
||||
|
||||
const Overlay = (
|
||||
<ModalOverlay
|
||||
blur={overlayOptions?.blur}
|
||||
className={cn(overlayOptions?.className, {
|
||||
hidden: item.overlay ? false : !modalSettingOverlay,
|
||||
})}
|
||||
/>
|
||||
)
|
||||
if (CustomModalComponent) {
|
||||
return (
|
||||
<Wrapper>
|
||||
<Dialog.Root open onOpenChange={onClose} modal={modal}>
|
||||
<Dialog.Portal>
|
||||
{Overlay}
|
||||
<Dialog.DialogTitle className="sr-only">{title}</Dialog.DialogTitle>
|
||||
<Dialog.Content asChild onOpenAutoFocus={openAutoFocus}>
|
||||
<Dialog.Content asChild aria-describedby={undefined} onOpenAutoFocus={openAutoFocus}>
|
||||
<div
|
||||
ref={edgeElementRef}
|
||||
className={cn(
|
||||
"no-drag-region fixed z-20",
|
||||
"no-drag-region fixed",
|
||||
modal ? "inset-0 overflow-auto" : "left-0 top-0",
|
||||
currentIsClosing ? "!pointer-events-none" : "!pointer-events-auto",
|
||||
modalContainerClassName,
|
||||
|
|
@ -287,7 +296,6 @@ export const ModalInternal = memo(
|
|||
onPointerUp={handleDetectSelectEnd}
|
||||
onClick={handleClickOutsideToDismiss}
|
||||
onFocus={stopPropagation}
|
||||
style={zIndexStyle}
|
||||
>
|
||||
{DragBar}
|
||||
<div
|
||||
|
|
@ -315,12 +323,12 @@ export const ModalInternal = memo(
|
|||
<Wrapper>
|
||||
<Dialog.Root modal={modal} open onOpenChange={onClose}>
|
||||
<Dialog.Portal>
|
||||
<Dialog.Content asChild onOpenAutoFocus={openAutoFocus}>
|
||||
{Overlay}
|
||||
<Dialog.Content asChild aria-describedby={undefined} onOpenAutoFocus={openAutoFocus}>
|
||||
<div
|
||||
ref={edgeElementRef}
|
||||
style={zIndexStyle}
|
||||
className={cn(
|
||||
"fixed z-20 flex",
|
||||
"fixed flex",
|
||||
modal ? "inset-0 overflow-auto" : "left-0 top-0",
|
||||
currentIsClosing && "!pointer-events-none",
|
||||
modalContainerClassName,
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import * as Dialog from "@radix-ui/react-dialog"
|
||||
import type { ForwardedRef } from "react"
|
||||
import { forwardRef } from "react"
|
||||
|
||||
import { m } from "~/components/common/Motion"
|
||||
import { stopPropagation } from "~/lib/dom"
|
||||
import { cn } from "~/lib/utils"
|
||||
|
||||
import { RootPortal } from "../../portal"
|
||||
import { softSpringPreset } from "../../constants/spring"
|
||||
|
||||
export const ModalOverlay = forwardRef(
|
||||
(
|
||||
|
|
@ -20,21 +20,22 @@ export const ModalOverlay = forwardRef(
|
|||
},
|
||||
ref: ForwardedRef<HTMLDivElement>,
|
||||
) => (
|
||||
<RootPortal>
|
||||
<Dialog.Overlay asChild>
|
||||
<m.div
|
||||
ref={ref}
|
||||
id="modal-overlay"
|
||||
className={cn(
|
||||
"fixed inset-0 z-[11] rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80",
|
||||
// NOTE: pointer-events-none is required, if remove this, when modal is closing, you can not click element behind the modal
|
||||
"!pointer-events-none fixed inset-0 rounded-[var(--fo-window-radius)] bg-zinc-50/80 dark:bg-neutral-900/80",
|
||||
blur && "backdrop-blur-sm",
|
||||
className,
|
||||
)}
|
||||
transition={softSpringPreset}
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
style={{ zIndex }}
|
||||
onClick={stopPropagation}
|
||||
/>
|
||||
</RootPortal>
|
||||
</Dialog.Overlay>
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,12 +2,8 @@ import { AnimatePresence } from "framer-motion"
|
|||
import { useAtomValue } from "jotai"
|
||||
import type { FC, PropsWithChildren } from "react"
|
||||
|
||||
import { useUISettingKey } from "~/atoms/settings/ui"
|
||||
|
||||
import { modalStackAtom } from "./atom"
|
||||
import { MODAL_STACK_Z_INDEX } from "./constants"
|
||||
import { ModalInternal } from "./modal"
|
||||
import { ModalOverlay } from "./overlay"
|
||||
|
||||
export const ModalStackProvider: FC<PropsWithChildren> = ({ children }) => (
|
||||
<>
|
||||
|
|
@ -19,11 +15,6 @@ export const ModalStackProvider: FC<PropsWithChildren> = ({ children }) => (
|
|||
const ModalStack = () => {
|
||||
const stack = useAtomValue(modalStackAtom)
|
||||
|
||||
const modalSettingOverlay = useUISettingKey("modalOverlay")
|
||||
|
||||
const forceOverlay = stack.some((item) => item.overlay)
|
||||
const allForceHideOverlay = stack.every((item) => item.overlay === false)
|
||||
|
||||
const topModalIndex = stack.findLastIndex((item) => item.modal)
|
||||
const overlayIndex = stack.findLastIndex((item) => item.overlay || item.modal)
|
||||
const overlayOptions = stack[overlayIndex]?.overlayOptions
|
||||
|
|
@ -35,15 +26,9 @@ const ModalStack = () => {
|
|||
item={item}
|
||||
index={index * 2}
|
||||
isTop={index === topModalIndex * 2}
|
||||
overlayOptions={overlayOptions}
|
||||
/>
|
||||
))}
|
||||
{stack.length > 0 && (modalSettingOverlay || forceOverlay) && !allForceHideOverlay && (
|
||||
<ModalOverlay
|
||||
zIndex={MODAL_STACK_Z_INDEX + overlayIndex * 2 - 2}
|
||||
blur={overlayOptions?.blur}
|
||||
className={overlayOptions?.className}
|
||||
/>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ const SelectContent = React.forwardRef<
|
|||
<SelectPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"shadow-perfect relative z-[1000] max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground",
|
||||
"shadow-perfect relative max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground",
|
||||
position === "popper" && [
|
||||
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
||||
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ export const parseHtml = (
|
|||
(tag) => tag !== "img" && tag !== "picture",
|
||||
)
|
||||
} else {
|
||||
rehypeSchema.tagNames = [...rehypeSchema.tagNames!, "video", "style"]
|
||||
rehypeSchema.tagNames = [...rehypeSchema.tagNames!, "video", "style", "figure"]
|
||||
rehypeSchema.attributes = {
|
||||
...rehypeSchema.attributes,
|
||||
"*": renderInlineStyle
|
||||
|
|
@ -181,7 +181,7 @@ export const parseHtml = (
|
|||
? propsChildren.find((i) => i.type === "code")
|
||||
: propsChildren
|
||||
|
||||
if (!children) return null
|
||||
if (!children) return createElement("pre", props, props.children)
|
||||
|
||||
if (
|
||||
"type" in children &&
|
||||
|
|
@ -191,7 +191,7 @@ export const parseHtml = (
|
|||
language = children.props.className.replace("language-", "")
|
||||
}
|
||||
const code = "props" in children && children.props.children
|
||||
if (!code) return null
|
||||
if (!code) createElement("pre", props, props.children)
|
||||
|
||||
try {
|
||||
codeString = extractCodeFromHtml(renderToString(code))
|
||||
|
|
@ -203,7 +203,7 @@ export const parseHtml = (
|
|||
}
|
||||
}
|
||||
|
||||
if (!codeString) return null
|
||||
if (!codeString) return createElement("pre", props, props.children)
|
||||
|
||||
return createElement(ShikiHighLighter, {
|
||||
code: codeString.trimEnd(),
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import {
|
|||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "~/components/ui/select"
|
||||
import { EllipsisHorizontalTextWithTooltip } from "~/components/ui/typography"
|
||||
import { nextFrame } from "~/lib/dom"
|
||||
import type { FeedViewType } from "~/lib/enum"
|
||||
import {
|
||||
|
|
@ -84,16 +85,28 @@ const FeedDescription = ({ description }: { description?: string }) => {
|
|||
)
|
||||
}
|
||||
|
||||
const routeParamsKeyPrefix = "route-params-"
|
||||
|
||||
export type RouteParams = Record<
|
||||
string,
|
||||
{
|
||||
description: string
|
||||
default?: string
|
||||
}
|
||||
>
|
||||
|
||||
export const DiscoverFeedForm = ({
|
||||
route,
|
||||
routePrefix,
|
||||
noDescription,
|
||||
submitButtonClassName,
|
||||
routeParams,
|
||||
}: {
|
||||
route: RSSHubRoute
|
||||
routePrefix: string
|
||||
noDescription?: boolean
|
||||
submitButtonClassName?: string
|
||||
routeParams?: RouteParams
|
||||
}) => {
|
||||
const { t } = useTranslation()
|
||||
const keys = useMemo(
|
||||
|
|
@ -121,13 +134,22 @@ export const DiscoverFeedForm = ({
|
|||
() =>
|
||||
z.object({
|
||||
...Object.fromEntries(
|
||||
keys.map((keyItem) => [
|
||||
keyItem.name,
|
||||
keyItem.optional ? z.string().optional().nullable() : z.string().min(1),
|
||||
]),
|
||||
keys
|
||||
.map((keyItem) => [
|
||||
keyItem.name,
|
||||
keyItem.optional ? z.string().optional().nullable() : z.string().min(1),
|
||||
])
|
||||
.concat(
|
||||
routeParams
|
||||
? Object.entries(routeParams).map(([key]) => [
|
||||
`${routeParamsKeyPrefix}${key}`,
|
||||
z.string(),
|
||||
])
|
||||
: [],
|
||||
),
|
||||
),
|
||||
}),
|
||||
[keys],
|
||||
[keys, routeParams],
|
||||
)
|
||||
|
||||
const defaultValue = useMemo(() => {
|
||||
|
|
@ -150,10 +172,30 @@ export const DiscoverFeedForm = ({
|
|||
const { present, dismissAll } = useModalStack()
|
||||
|
||||
const onSubmit = useCallback(
|
||||
(data: Record<string, string>) => {
|
||||
(_data: Record<string, string>) => {
|
||||
const data = Object.fromEntries(
|
||||
Object.entries(_data).filter(([key]) => !key.startsWith(routeParamsKeyPrefix)),
|
||||
)
|
||||
|
||||
try {
|
||||
const fillRegexpPath = regexpPathToPath(route.path, data)
|
||||
const routeParamsPath = encodeURIComponent(
|
||||
Object.entries(_data)
|
||||
.filter(([key, value]) => key.startsWith(routeParamsKeyPrefix) && value)
|
||||
.map(([key, value]) => [key.slice(routeParamsKeyPrefix.length), value])
|
||||
.map(([key, value]) => `${key}=${value}`)
|
||||
.join("&"),
|
||||
)
|
||||
|
||||
const fillRegexpPath = regexpPathToPath(
|
||||
routeParams && routeParamsPath
|
||||
? route.path.slice(0, route.path.indexOf("/:routeParams"))
|
||||
: route.path,
|
||||
data,
|
||||
)
|
||||
const url = `rsshub://${routePrefix}${fillRegexpPath}`
|
||||
|
||||
const finalUrl = routeParams && routeParamsPath ? `${url}/${routeParamsPath}` : url
|
||||
|
||||
const defaultView = getViewFromRoute(route) || (getSidebarActiveView() as FeedViewType)
|
||||
|
||||
present({
|
||||
|
|
@ -161,7 +203,7 @@ export const DiscoverFeedForm = ({
|
|||
content: () => (
|
||||
<FeedForm
|
||||
asWidget
|
||||
url={url}
|
||||
url={finalUrl}
|
||||
defaultValues={{
|
||||
view: defaultView.toString(),
|
||||
}}
|
||||
|
|
@ -180,7 +222,7 @@ export const DiscoverFeedForm = ({
|
|||
}
|
||||
}
|
||||
},
|
||||
[dismissAll, form, keys, present, route.path, routePrefix],
|
||||
[dismissAll, form, keys, present, route, routeParams, routePrefix],
|
||||
)
|
||||
|
||||
const formElRef = useRef<HTMLFormElement>(null)
|
||||
|
|
@ -259,6 +301,26 @@ export const DiscoverFeedForm = ({
|
|||
</FormItem>
|
||||
)
|
||||
})}
|
||||
{routeParams && (
|
||||
<div className="grid grid-cols-2 gap-3">
|
||||
{Object.entries(routeParams).map(([key, value]) => (
|
||||
<FormItem key={`${routeParamsKeyPrefix}${key}`} className="flex flex-col space-y-2">
|
||||
<FormLabel className="capitalize">{key}</FormLabel>
|
||||
<Input
|
||||
{...form.register(`${routeParamsKeyPrefix}${key}`)}
|
||||
placeholder={value.default}
|
||||
/>
|
||||
{!!value.description && (
|
||||
<EllipsisHorizontalTextWithTooltip>
|
||||
<Markdown className="text-xs text-theme-foreground/50">
|
||||
{value.description}
|
||||
</Markdown>
|
||||
</EllipsisHorizontalTextWithTooltip>
|
||||
)}
|
||||
</FormItem>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{!noDescription && (
|
||||
<>
|
||||
<FeedDescription description={route.description} />
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ const FeedInnerForm = ({
|
|||
|
||||
onSuccess?.()
|
||||
},
|
||||
async onError(err) {
|
||||
onError(err) {
|
||||
toastFetchError(err)
|
||||
},
|
||||
})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
import { LoadingCircle } from "~/components/ui/loading"
|
||||
import { useAuthQuery } from "~/hooks/common"
|
||||
import { Queries } from "~/queries"
|
||||
|
||||
import type { RouteParams } from "./DiscoverFeedForm"
|
||||
import { DiscoverFeedForm } from "./DiscoverFeedForm"
|
||||
|
||||
const transformRouteParams: RouteParams = {
|
||||
title: { description: "The title of the RSS", default: "Extract from <title>" },
|
||||
item: { description: "The HTML elements as item using CSS selector", default: "html" },
|
||||
itemTitle: {
|
||||
description: "The HTML elements as title in item using CSS selector",
|
||||
default: "item element",
|
||||
},
|
||||
itemTitleAttr: {
|
||||
description: "The attributes of title element as title",
|
||||
default: "Element text",
|
||||
},
|
||||
itemLink: {
|
||||
description: "The HTML elements as link in item using CSS selector",
|
||||
default: "item element",
|
||||
},
|
||||
itemLinkAttr: { description: "The attributes of link element as link", default: "href" },
|
||||
itemDesc: {
|
||||
description: "The HTML elements as description in item using CSS selector",
|
||||
default: "item element",
|
||||
},
|
||||
itemDescAttr: {
|
||||
description: "The attributes of description element as description",
|
||||
default: "Element html",
|
||||
},
|
||||
itemPubDate: {
|
||||
description: "The HTML elements as pubDate in item using CSS selector",
|
||||
default: "item element",
|
||||
},
|
||||
itemPubDateAttr: {
|
||||
description: "The attributes of pubDate element as pubDate",
|
||||
default: "Element html",
|
||||
},
|
||||
}
|
||||
|
||||
export function DiscoverTransform() {
|
||||
const { data, isLoading } = useAuthQuery(
|
||||
Queries.discover.rsshubNamespace({
|
||||
namespace: "rsshub",
|
||||
}),
|
||||
{
|
||||
meta: {
|
||||
persist: true,
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<div className="center mt-12 flex w-full flex-col gap-8">
|
||||
<LoadingCircle size="large" />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{data?.rsshub.routes && (
|
||||
<div className="w-[512px]">
|
||||
<DiscoverFeedForm
|
||||
routePrefix="rsshub"
|
||||
route={data?.rsshub.routes["/transform/html/:url/:routeParams"]}
|
||||
routeParams={transformRouteParams}
|
||||
noDescription
|
||||
submitButtonClassName="justify-center"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
|
@ -9,7 +9,7 @@ import { useOnClickOutside } from "usehooks-ts"
|
|||
import { ActionButton, Button, IconButton } from "~/components/ui/button"
|
||||
import { Kbd, KbdCombined } from "~/components/ui/kbd/Kbd"
|
||||
import { RootPortal } from "~/components/ui/portal"
|
||||
import { ElECTRON_CUSTOM_TITLEBAR_HEIGHT, HotKeyScopeMap } from "~/constants"
|
||||
import { ElECTRON_CUSTOM_TITLEBAR_HEIGHT, HotKeyScopeMap, isElectronBuild } from "~/constants"
|
||||
import { shortcuts } from "~/constants/shortcuts"
|
||||
import { useI18n } from "~/hooks/common"
|
||||
import { cn, getOS } from "~/lib/utils"
|
||||
|
|
@ -51,7 +51,9 @@ export const MarkAllReadWithOverlay = forwardRef<
|
|||
<m.div
|
||||
ref={setPopoverRef}
|
||||
initial={{ y: -70 }}
|
||||
animate={{ y: getOS() === "Windows" ? -ElECTRON_CUSTOM_TITLEBAR_HEIGHT : 0 }}
|
||||
animate={{
|
||||
y: isElectronBuild && getOS() === "Windows" ? -ElECTRON_CUSTOM_TITLEBAR_HEIGHT : 0,
|
||||
}}
|
||||
exit={{ y: -70 }}
|
||||
transition={{ type: "spring", damping: 20, stiffness: 300 }}
|
||||
className="shadow-modal absolute z-50 bg-theme-modal-background-opaque shadow"
|
||||
|
|
|
|||
|
|
@ -261,7 +261,9 @@ const WideModeButton = () => {
|
|||
: t("entry_list_header.switch_to_normalmode")
|
||||
}
|
||||
>
|
||||
<i className={cn(!isWideMode ? "i-mgc-align-justify-cute-re" : "i-mgc-layout-4-cute-re")} />
|
||||
<i
|
||||
className={cn(isWideMode ? "i-mgc-align-justify-cute-re" : "i-mgc-align-left-cute-re")}
|
||||
/>
|
||||
</ActionButton>
|
||||
</ImpressionView>
|
||||
)
|
||||
|
|
|
|||
|
|
@ -14,12 +14,12 @@ export const EntryPlaceholderLogo = () => {
|
|||
<div
|
||||
onContextMenu={stopPropagation}
|
||||
className={cn(
|
||||
"flex w-full min-w-0 flex-col items-center justify-center gap-1 text-balance px-12 pb-6 text-center text-lg font-medium text-zinc-400 duration-500",
|
||||
"flex w-full min-w-0 flex-col items-center justify-center gap-1 px-12 pb-6 text-center text-lg font-medium text-zinc-400 duration-500",
|
||||
!logoShow && "translate-y-[-50px] opacity-0",
|
||||
)}
|
||||
>
|
||||
<Logo className="size-16 opacity-40 grayscale" />
|
||||
<span className="max-w-[60ch]">{title}</span>
|
||||
<div className="line-clamp-3 w-[60ch] max-w-full">{title}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,11 @@ import { showNativeMenu } from "~/lib/native-menu"
|
|||
import { cn, sortByAlphabet } from "~/lib/utils"
|
||||
import { getPreferredTitle, useAddFeedToFeedList, useFeedStore } from "~/store/feed"
|
||||
import { useOwnedList } from "~/store/list"
|
||||
import { subscriptionActions, useSubscriptionByFeedId } from "~/store/subscription"
|
||||
import {
|
||||
subscriptionActions,
|
||||
subscriptionCategoryExist,
|
||||
useSubscriptionByFeedId,
|
||||
} from "~/store/subscription"
|
||||
import { useFeedUnreadStore } from "~/store/unread"
|
||||
|
||||
import { useModalStack } from "../../components/ui/modal/stacked/hooks"
|
||||
|
|
@ -219,7 +223,8 @@ function FeedCategoryImpl({ data: ids, view, categoryOpenStateData }: FeedCatego
|
|||
{
|
||||
type: "text",
|
||||
label: t("sidebar.feed_column.context_menu.delete_category"),
|
||||
click: async () => {
|
||||
hide: !folderName || !subscriptionCategoryExist(folderName),
|
||||
click: () => {
|
||||
present({
|
||||
title: t("sidebar.feed_column.context_menu.delete_category_confirmation", {
|
||||
folderName,
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ function FeedListImpl({ className, view }: { className?: string; view: number })
|
|||
className="font-bold"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation()
|
||||
if (!document.hasFocus()) return
|
||||
if (view !== undefined) {
|
||||
navigateEntry({
|
||||
entryId: null,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react
|
|||
import { useDebounceCallback, useEventCallback } from "usehooks-ts"
|
||||
|
||||
import { softSpringPreset } from "~/components/ui/constants/spring"
|
||||
import { RootPortal } from "~/components/ui/portal"
|
||||
import { useInputComposition, useRefValue } from "~/hooks/common"
|
||||
import { tipcClient } from "~/lib/client"
|
||||
import { nextFrame } from "~/lib/dom"
|
||||
|
|
@ -117,7 +118,7 @@ const CmdFImpl: FC<{
|
|||
e.preventDefault()
|
||||
nativeSearch(value)
|
||||
}}
|
||||
className="center shadow-perfect fixed right-8 top-12 z-[1000] size-9 w-64 gap-2 rounded-2xl border bg-zinc-50/90 pl-3 pr-2 backdrop-blur duration-200 focus-within:border-accent dark:bg-neutral-800/80"
|
||||
className="center shadow-perfect fixed right-8 top-12 size-9 w-64 gap-2 rounded-2xl border bg-zinc-50/90 pl-3 pr-2 backdrop-blur duration-200 focus-within:border-accent dark:bg-neutral-800/80"
|
||||
>
|
||||
<div className="relative h-full grow">
|
||||
<input
|
||||
|
|
@ -238,22 +239,24 @@ export const CmdF = () => {
|
|||
setShow(true)
|
||||
})
|
||||
return (
|
||||
<AnimatePresence>
|
||||
{show && (
|
||||
<m.div
|
||||
className="relative z-[1000]"
|
||||
initial={{ opacity: 0.8, y: -150 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: -150 }}
|
||||
transition={softSpringPreset}
|
||||
>
|
||||
<CmdFImpl
|
||||
onClose={() => {
|
||||
setShow(false)
|
||||
}}
|
||||
/>
|
||||
</m.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
<RootPortal>
|
||||
<AnimatePresence>
|
||||
{show && (
|
||||
<m.div
|
||||
className="fixed top-0 w-full"
|
||||
initial={{ opacity: 0.8, y: -150 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: -150 }}
|
||||
transition={softSpringPreset}
|
||||
>
|
||||
<CmdFImpl
|
||||
onClose={() => {
|
||||
setShow(false)
|
||||
}}
|
||||
/>
|
||||
</m.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</RootPortal>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ export const TransactionsSection: Component = ({ className }) => {
|
|||
</Tabs>
|
||||
<div className={cn("w-fit min-w-0 grow overflow-x-auto", className)}>
|
||||
<Table className="w-full table-fixed">
|
||||
<TableHeader className="sticky top-0 z-10 bg-theme-background">
|
||||
<TableHeader className="sticky top-0 bg-theme-background">
|
||||
<TableRow className="[&_*]:!pl-0 [&_*]:!font-semibold">
|
||||
<TableHead>{t("wallet.transactions.type")}</TableHead>
|
||||
<TableHead>{t("wallet.transactions.amount")}</TableHead>
|
||||
|
|
|
|||
|
|
@ -397,7 +397,7 @@ const SubscriptionItem: FC<{
|
|||
!isLoose && "flex items-center",
|
||||
)}
|
||||
>
|
||||
<div className="truncate font-medium leading-none">{subscription.feeds?.title}</div>
|
||||
<div className="truncate font-medium leading-tight">{subscription.feeds?.title}</div>
|
||||
{isLoose && (
|
||||
<div className="mt-1 line-clamp-1 text-xs text-zinc-500">
|
||||
{subscription.feeds?.description}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { from } from "dnum"
|
||||
import type { FC } from "react"
|
||||
import { useState } from "react"
|
||||
import { useNavigate } from "react-router-dom"
|
||||
|
||||
import { Button } from "~/components/ui/button"
|
||||
import { Divider } from "~/components/ui/divider"
|
||||
|
|
@ -14,7 +15,6 @@ import { UserAvatar } from "~/modules/user/UserAvatar"
|
|||
import { useWallet, useWalletTipMutation } from "~/queries/wallet"
|
||||
|
||||
import { useFeedClaimModal } from "../claim"
|
||||
import { useSettingModal } from "../settings/modal/hooks-hack"
|
||||
import { Balance } from "./balance"
|
||||
|
||||
const DEFAULT_RECOMMENDED_TIP = 10
|
||||
|
|
@ -65,12 +65,12 @@ const TipModalContent_: FC<{
|
|||
|
||||
const { dismiss } = useCurrentModal()
|
||||
|
||||
const settingModalPresent = useSettingModal()
|
||||
|
||||
const claimFeed = useFeedClaimModal({
|
||||
feedId,
|
||||
})
|
||||
|
||||
const navigate = useNavigate()
|
||||
|
||||
if (myWallet.isPending) {
|
||||
return <Loading />
|
||||
}
|
||||
|
|
@ -80,7 +80,7 @@ const TipModalContent_: FC<{
|
|||
<div className="flex w-[80vw] max-w-[350px] flex-col gap-5">
|
||||
<p className="text-sm text-theme-foreground/80">{t("tip_modal.no_wallet")}</p>
|
||||
<div className="flex justify-end">
|
||||
<Button variant="primary" onClick={() => nextFrame(() => settingModalPresent("wallet"))}>
|
||||
<Button variant="primary" onClick={() => nextFrame(() => navigate("/power"))}>
|
||||
{t("tip_modal.create_wallet")}
|
||||
</Button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ export function Component() {
|
|||
{t("feed.followsAndFeeds", {
|
||||
subscriptionCount: list.data?.subscriptionCount,
|
||||
subscriptionNoun: t("feed.follower", { count: list.data?.subscriptionCount }),
|
||||
feedsCount: "feedCount" in listData ? listData.feedCount : 0,
|
||||
feedsCount: list.data?.feedCount || 0,
|
||||
feedsNoun: t("feed.feeds", { count: listData?.feedIds?.length }),
|
||||
appName: APP_NAME,
|
||||
})}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import { DiscoverImport } from "~/modules/discover/import"
|
|||
import { DiscoverInboxList } from "~/modules/discover/inbox-list-form"
|
||||
import { Recommendations } from "~/modules/discover/recommendations"
|
||||
import { DiscoverRSS3 } from "~/modules/discover/rss3-form"
|
||||
import { DiscoverTransform } from "~/modules/discover/transform-form"
|
||||
import { DiscoverUser } from "~/modules/discover/user-form"
|
||||
import { Trend } from "~/modules/trending"
|
||||
|
||||
|
|
@ -42,6 +43,10 @@ const tabs: {
|
|||
name: "words.user",
|
||||
value: "user",
|
||||
},
|
||||
{
|
||||
name: "words.transform",
|
||||
value: "transform",
|
||||
},
|
||||
{
|
||||
name: "words.import",
|
||||
value: "import",
|
||||
|
|
@ -93,4 +98,5 @@ const TabComponent: Record<string, React.FC<{ type?: string }>> = {
|
|||
inbox: DiscoverInboxList,
|
||||
user: DiscoverUser,
|
||||
default: DiscoverForm,
|
||||
transform: DiscoverTransform,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,9 +48,9 @@ import { AppLayoutGridContainerProvider } from "~/providers/app-grid-layout-cont
|
|||
const FooterInfo = () => {
|
||||
const { t } = useTranslation()
|
||||
return (
|
||||
<div className="relative">
|
||||
<div className="relative !mt-0">
|
||||
{APP_VERSION?.[0] === "0" && (
|
||||
<div className="pointer-events-none !mt-0 w-full py-3 text-center text-xs opacity-20">
|
||||
<div className="pointer-events-none w-full py-3 text-center text-xs opacity-20">
|
||||
{t("early_access")}{" "}
|
||||
{GIT_COMMIT_SHA ? `(${GIT_COMMIT_SHA.slice(0, 7).toUpperCase()})` : ""}
|
||||
</div>
|
||||
|
|
@ -123,10 +123,6 @@ export function Component() {
|
|||
</AppErrorBoundary>
|
||||
</main>
|
||||
|
||||
<SearchCmdK />
|
||||
<CmdNTrigger />
|
||||
{ELECTRON && <CmdF />}
|
||||
|
||||
{isAuthFail && !user && (
|
||||
<RootPortal>
|
||||
<DeclarativeModal
|
||||
|
|
@ -141,6 +137,10 @@ export function Component() {
|
|||
</DeclarativeModal>
|
||||
</RootPortal>
|
||||
)}
|
||||
|
||||
<SearchCmdK />
|
||||
<CmdNTrigger />
|
||||
{ELECTRON && <CmdF />}
|
||||
</RootContainer>
|
||||
)
|
||||
}
|
||||
|
|
@ -155,7 +155,7 @@ const RootContainer = forwardRef<HTMLDivElement, PropsWithChildren>(({ children
|
|||
"--fo-feed-col-w": `${feedColWidth}px`,
|
||||
} as any
|
||||
}
|
||||
className="flex h-screen overflow-hidden"
|
||||
className="relative z-0 flex h-screen overflow-hidden"
|
||||
onContextMenu={preventDefault}
|
||||
>
|
||||
{children}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ export const AppLayoutGridContainerProvider: FC<PropsWithChildren> = ({ children
|
|||
|
||||
return (
|
||||
<AppLayoutGridContainerWidthContext.Provider value={width}>
|
||||
<div ref={ref} className="contents">
|
||||
<div ref={ref} className="relative z-0 contents">
|
||||
{children}
|
||||
</div>
|
||||
</AppLayoutGridContainerWidthContext.Provider>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
export { ContextMenuProvider as LazyContextMenuProvider } from "../context-menu-provider"
|
||||
export { ExtensionExposeProvider as LazyExtensionExposeProvider } from "../extension-expose-provider"
|
||||
export { LottieRenderContainer as LazyLottieRenderContainer } from "~/components/ui/lottie-container"
|
||||
export { ModalStackProvider as LazyModalStackProvider } from "~/components/ui/modal"
|
||||
export { FeatureFlagDebugger as LazyFeatureFlagDebugger } from "~/modules/ab/providers"
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import { lazy } from "react"
|
||||
|
||||
const LazyLottieRenderContainer = lazy(() =>
|
||||
import("../../components/ui/lottie-container").then((res) => ({
|
||||
default: res.LottieRenderContainer,
|
||||
})),
|
||||
)
|
||||
const LazyContextMenuProvider = lazy(() =>
|
||||
import("./../context-menu-provider").then((res) => ({
|
||||
default: res.ContextMenuProvider,
|
||||
})),
|
||||
)
|
||||
const LazyModalStackProvider = lazy(() =>
|
||||
import("../../components/ui/modal/stacked/provider").then((res) => ({
|
||||
default: res.ModalStackProvider,
|
||||
})),
|
||||
)
|
||||
|
||||
const LazyExtensionExposeProvider = lazy(() =>
|
||||
import("./../extension-expose-provider").then((res) => ({
|
||||
default: res.ExtensionExposeProvider,
|
||||
})),
|
||||
)
|
||||
const LazyFeatureFlagDebugger = lazy(() =>
|
||||
import("../../modules/ab/providers").then((res) => ({
|
||||
default: res.FeatureFlagDebugger,
|
||||
})),
|
||||
)
|
||||
export {
|
||||
LazyContextMenuProvider,
|
||||
LazyExtensionExposeProvider,
|
||||
LazyFeatureFlagDebugger,
|
||||
LazyLottieRenderContainer,
|
||||
LazyModalStackProvider,
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@ import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client
|
|||
import { LazyMotion, MotionConfig } from "framer-motion"
|
||||
import { Provider } from "jotai"
|
||||
import type { FC, PropsWithChildren } from "react"
|
||||
import { lazy, Suspense } from "react"
|
||||
import { Suspense } from "react"
|
||||
import { HotkeysProvider } from "react-hotkeys-hook"
|
||||
|
||||
import { Toaster } from "~/components/ui/sonner"
|
||||
|
|
@ -15,36 +15,18 @@ import { persistConfig, queryClient } from "~/lib/query-client"
|
|||
import { EventProvider } from "./event-provider"
|
||||
import { I18nProvider } from "./i18n-provider"
|
||||
import { InvalidateQueryProvider } from "./invalidate-query-provider"
|
||||
import {
|
||||
LazyContextMenuProvider,
|
||||
LazyExtensionExposeProvider,
|
||||
LazyFeatureFlagDebugger,
|
||||
LazyLottieRenderContainer,
|
||||
LazyModalStackProvider,
|
||||
// specific import should add `index` postfix
|
||||
} from "./lazy/index"
|
||||
import { SettingSync } from "./setting-sync"
|
||||
import { StableRouterProvider } from "./stable-router-provider"
|
||||
import { UserProvider } from "./user-provider"
|
||||
|
||||
const LazyLottieRenderContainer = lazy(() =>
|
||||
import("../components/ui/lottie-container").then((res) => ({
|
||||
default: res.LottieRenderContainer,
|
||||
})),
|
||||
)
|
||||
const LazyContextMenuProvider = lazy(() =>
|
||||
import("./context-menu-provider").then((res) => ({
|
||||
default: res.ContextMenuProvider,
|
||||
})),
|
||||
)
|
||||
const LazyModalStackProvider = lazy(() =>
|
||||
import("../components/ui/modal/stacked/provider").then((res) => ({
|
||||
default: res.ModalStackProvider,
|
||||
})),
|
||||
)
|
||||
|
||||
const LazyExtensionExposeProvider = lazy(() =>
|
||||
import("./extension-expose-provider").then((res) => ({
|
||||
default: res.ExtensionExposeProvider,
|
||||
})),
|
||||
)
|
||||
const LazyFeatureFlagDebugger = lazy(() =>
|
||||
import("../modules/ab/providers").then((res) => ({
|
||||
default: res.FeatureFlagDebugger,
|
||||
})),
|
||||
)
|
||||
const loadFeatures = () => import("../framer-lazy-feature").then((res) => res.default)
|
||||
export const RootProviders: FC<PropsWithChildren> = ({ children }) => (
|
||||
<LazyMotion features={loadFeatures} strict key="framer">
|
||||
|
|
@ -62,6 +44,13 @@ export const RootProviders: FC<PropsWithChildren> = ({ children }) => (
|
|||
<EventProvider />
|
||||
|
||||
<UserProvider />
|
||||
|
||||
<StableRouterProvider />
|
||||
<SettingSync />
|
||||
|
||||
{import.meta.env.DEV && <Devtools />}
|
||||
{children}
|
||||
|
||||
<Suspense>
|
||||
<LazyExtensionExposeProvider />
|
||||
<LazyModalStackProvider />
|
||||
|
|
@ -69,12 +58,6 @@ export const RootProviders: FC<PropsWithChildren> = ({ children }) => (
|
|||
<LazyLottieRenderContainer />
|
||||
<LazyFeatureFlagDebugger />
|
||||
</Suspense>
|
||||
|
||||
<StableRouterProvider />
|
||||
<SettingSync />
|
||||
|
||||
{import.meta.env.DEV && <Devtools />}
|
||||
{children}
|
||||
<Toaster />
|
||||
</I18nProvider>
|
||||
</Provider>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import { useMutation } from "@tanstack/react-query"
|
||||
import { useNavigate } from "react-router-dom"
|
||||
import { toast } from "sonner"
|
||||
|
||||
import { useAuthQuery } from "~/hooks/common"
|
||||
import { apiClient } from "~/lib/api-fetch"
|
||||
import { defineQuery } from "~/lib/defineQuery"
|
||||
import { getFetchErrorMessage, toastFetchError } from "~/lib/error-parser"
|
||||
import { useSettingModal } from "~/modules/settings/modal/hooks"
|
||||
|
||||
export const wallet = {
|
||||
get: ({ userId }: { userId?: string } = {}) =>
|
||||
|
|
@ -68,7 +68,7 @@ export const useClaimCheck = () =>
|
|||
})
|
||||
|
||||
export const useClaimWalletDailyRewardMutation = () => {
|
||||
const settingModalPresent = useSettingModal()
|
||||
const navigate = useNavigate()
|
||||
|
||||
return useMutation({
|
||||
mutationKey: ["claimWalletDailyReward"],
|
||||
|
|
@ -82,10 +82,7 @@ export const useClaimWalletDailyRewardMutation = () => {
|
|||
window.posthog?.capture("daily_reward_claimed")
|
||||
|
||||
toast(
|
||||
<div
|
||||
className="flex items-center gap-1 text-lg"
|
||||
onClick={() => settingModalPresent("wallet")}
|
||||
>
|
||||
<div className="flex items-center gap-1 text-lg" onClick={() => navigate("/power")}>
|
||||
<i className="i-mgc-power text-accent animate-flip" />
|
||||
</div>,
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
import { IN_ELECTRON } from "@follow/shared/constants"
|
||||
import { wrapCreateBrowserRouter } from "@sentry/react"
|
||||
import { createBrowserRouter, createHashRouter } from "react-router-dom"
|
||||
|
||||
import { ErrorElement } from "./components/common/ErrorElement"
|
||||
import { NotFound } from "./components/common/NotFound"
|
||||
import { buildGlobRoutes } from "./lib/route-builder"
|
||||
|
||||
const globTree = import.meta.glob("./pages/**/*.tsx")
|
||||
const tree = buildGlobRoutes(globTree)
|
||||
|
||||
let routerCreator =
|
||||
IN_ELECTRON || globalThis["__DEBUG_PROXY__"] ? createHashRouter : createBrowserRouter
|
||||
if (window.SENTRY_RELEASE) {
|
||||
routerCreator = wrapCreateBrowserRouter(routerCreator)
|
||||
}
|
||||
|
||||
export const router = routerCreator([
|
||||
{
|
||||
path: "/",
|
||||
lazy: () => import("./App"),
|
||||
children: tree,
|
||||
errorElement: <ErrorElement />,
|
||||
},
|
||||
{
|
||||
path: "*",
|
||||
element: <NotFound />,
|
||||
},
|
||||
])
|
||||
|
|
@ -7,9 +7,6 @@ import { useSubscriptionStore } from "../subscription"
|
|||
import { useEntryStore } from "./store"
|
||||
import type { EntryFilter } from "./types"
|
||||
|
||||
type EntryId = string
|
||||
type FeedId = string
|
||||
|
||||
export const getFilteredFeedIds = (feedIds: string[], filter?: EntryFilter) => {
|
||||
const state = useEntryStore.getState()
|
||||
const ids = [] as string[]
|
||||
|
|
@ -33,11 +30,18 @@ export const getFilteredFeedIds = (feedIds: string[], filter?: EntryFilter) => {
|
|||
}
|
||||
|
||||
const unread = create({
|
||||
fetcher: async (ids: ([FeedId, EntryId, boolean] | [FeedId, EntryId])[]) => {
|
||||
fetcher: async (
|
||||
ids: {
|
||||
entryId: string
|
||||
isInbox: boolean
|
||||
isPrivate?: boolean
|
||||
}[],
|
||||
) => {
|
||||
await apiClient.reads.$post({
|
||||
json: {
|
||||
entryIds: ids.map((i) => i[1]),
|
||||
isInbox: ids[0][2],
|
||||
entryIds: ids.map((i) => i.entryId),
|
||||
isInbox: ids[0].isInbox,
|
||||
readHistories: ids.filter((i) => !i.isPrivate).map((i) => i.entryId),
|
||||
},
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import { EntryService } from "~/services"
|
|||
import { feedActions } from "../feed"
|
||||
import { imageActions } from "../image"
|
||||
import { inboxActions } from "../inbox"
|
||||
import { getSubscriptionByFeedId } from "../subscription"
|
||||
import { feedUnreadActions } from "../unread"
|
||||
import { createZustandStore, doMutationAndTransaction } from "../utils/helper"
|
||||
import { internal_batchMarkRead } from "./helper"
|
||||
|
|
@ -349,6 +350,7 @@ class EntryActions {
|
|||
async markRead({ feedId, entryId, read }: { feedId: string; entryId: string; read: boolean }) {
|
||||
const entry = get().flatMapEntries[entryId]
|
||||
const isInbox = entry?.entries && "inboxHandle" in entry.entries
|
||||
const subscription = getSubscriptionByFeedId(feedId)
|
||||
|
||||
if (read && entry?.read) {
|
||||
return
|
||||
|
|
@ -364,7 +366,11 @@ class EntryActions {
|
|||
// Send api request
|
||||
async () => {
|
||||
if (read) {
|
||||
await internal_batchMarkRead([feedId, entryId, isInbox])
|
||||
await internal_batchMarkRead({
|
||||
entryId,
|
||||
isInbox,
|
||||
isPrivate: subscription?.isPrivate,
|
||||
})
|
||||
} else {
|
||||
await apiClient.reads.$delete({
|
||||
json: {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { FEED_COLLECTION_LIST, ROUTE_FEED_IN_FOLDER } from "~/constants"
|
||||
import { FeedViewType } from "~/lib/enum"
|
||||
|
||||
import { useSubscriptionStore } from "../subscription"
|
||||
import { subscriptionCategoryExistSelector, useSubscriptionStore } from "../subscription"
|
||||
|
||||
type FeedId = string
|
||||
export const useFeedIdByView = (view: FeedViewType) =>
|
||||
|
|
@ -64,3 +64,6 @@ export const useFeedSubscriptionCount = () =>
|
|||
(s) => !!s.feedId && !s.listId && !s.inboxId && state.subscriptionIdSet.has(s.feedId),
|
||||
).length,
|
||||
)
|
||||
|
||||
export const useSubscriptionCategoryExist = (name: string) =>
|
||||
useSubscriptionStore(subscriptionCategoryExistSelector(name))
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
export * from "./hooks"
|
||||
export * from "./selector"
|
||||
export * from "./store"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
import type { useSubscriptionStore } from "./store"
|
||||
|
||||
type State = ReturnType<typeof useSubscriptionStore.getState>
|
||||
export const subscriptionCategoryExistSelector = (name: string) => (state: State) =>
|
||||
state.categories.has(name)
|
||||
|
|
@ -17,6 +17,7 @@ import { inboxActions } from "../inbox"
|
|||
import { listActions } from "../list"
|
||||
import { feedUnreadActions } from "../unread"
|
||||
import { createImmerSetter, createZustandStore, doMutationAndTransaction } from "../utils/helper"
|
||||
import { subscriptionCategoryExistSelector } from "./selector"
|
||||
|
||||
export type SubscriptionFlatModel = Omit<SubscriptionModel, "feeds"> & {
|
||||
defaultCategory?: string
|
||||
|
|
@ -41,7 +42,11 @@ interface SubscriptionState {
|
|||
*/
|
||||
categoryOpenStateByView: Record<FeedViewType, Record<string, boolean>>
|
||||
/**
|
||||
* Store the subscription ids that current user followed.
|
||||
* All named categories names set
|
||||
*/
|
||||
categories: Set<string>
|
||||
/**
|
||||
* All subscription ids set
|
||||
*/
|
||||
subscriptionIdSet: Set<string>
|
||||
}
|
||||
|
|
@ -90,7 +95,8 @@ export const useSubscriptionStore = createZustandStore<SubscriptionState>("subsc
|
|||
data: {},
|
||||
feedIdByView: { ...emptyDataIdByView },
|
||||
categoryOpenStateByView: { ...emptyCategoryOpenStateByView },
|
||||
subscriptionIdSet: new Set<string>(),
|
||||
categories: new Set(),
|
||||
subscriptionIdSet: new Set(),
|
||||
}))
|
||||
|
||||
const set = useSubscriptionStore.setState
|
||||
|
|
@ -118,6 +124,19 @@ class SubscriptionActions {
|
|||
})
|
||||
}
|
||||
})
|
||||
|
||||
useSubscriptionStore.subscribe((state, prev) => {
|
||||
if (state.data === prev.data) return
|
||||
|
||||
const categories = new Set<string>()
|
||||
for (const subscription of Object.values(state.data)) {
|
||||
subscription.category && categories.add(subscription.category)
|
||||
}
|
||||
set((state) => ({
|
||||
...state,
|
||||
categories,
|
||||
}))
|
||||
})
|
||||
}
|
||||
async fetchByView(view?: FeedViewType) {
|
||||
const res = await apiClient.subscriptions.$get({
|
||||
|
|
@ -453,7 +472,6 @@ class SubscriptionActions {
|
|||
}),
|
||||
async () =>
|
||||
// Db
|
||||
|
||||
SubscriptionService.renameCategory(whoami()!.id, subscriptionIds, newCategory),
|
||||
)
|
||||
}
|
||||
|
|
@ -472,3 +490,6 @@ export const isListSubscription = (feedId?: FeedId) => {
|
|||
if (!subscription) return false
|
||||
return "listId" in subscription && !!subscription.listId
|
||||
}
|
||||
|
||||
export const subscriptionCategoryExist = (name: string) =>
|
||||
subscriptionCategoryExistSelector(name)(get())
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
export default {
|
||||
tagFilter: (tag: string) => tag.startsWith("v") && !tag.includes("nightly"),
|
||||
dry: true,
|
||||
dry: !process.env.CI,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { resolve } from "node:path"
|
|||
import { defineConfig } from "electron-vite"
|
||||
|
||||
import { viteRenderBaseConfig } from "./configs/vite.render.config"
|
||||
import { createPlatformSpecificImportPlugin } from "./plugins/vite/specific-import"
|
||||
|
||||
export default defineConfig({
|
||||
main: {
|
||||
|
|
@ -41,6 +42,8 @@ export default defineConfig({
|
|||
renderer: {
|
||||
...viteRenderBaseConfig,
|
||||
|
||||
plugins: [...viteRenderBaseConfig.plugins, createPlatformSpecificImportPlugin(true)],
|
||||
|
||||
root: "apps/renderer",
|
||||
build: {
|
||||
outDir: "dist/renderer",
|
||||
|
|
|
|||
|
|
@ -154,6 +154,7 @@ const config: ForgeConfig = {
|
|||
new MakerSquirrel({
|
||||
name: "Follow",
|
||||
setupIcon: "resources/icon.ico",
|
||||
iconUrl: "https://app.follow.is/favicon.ico",
|
||||
}),
|
||||
new MakerAppImage({
|
||||
options: {
|
||||
|
|
|
|||
|
|
@ -287,6 +287,7 @@
|
|||
"words.search": "Search",
|
||||
"words.starred": "Starred",
|
||||
"words.title": "Title",
|
||||
"words.transform": "Transform",
|
||||
"words.trending": "Trending",
|
||||
"words.undo": "Undo",
|
||||
"words.unread": "Unread",
|
||||
|
|
|
|||
|
|
@ -54,9 +54,9 @@
|
|||
"entry_actions.copied_notify": "{{which}}已複製到剪貼板",
|
||||
"entry_actions.copy_link": "複製連結",
|
||||
"entry_actions.copy_title": "複製標題",
|
||||
"entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle。",
|
||||
"entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper。",
|
||||
"entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise。",
|
||||
"entry_actions.failed_to_save_to_eagle": "無法保存至 Eagle",
|
||||
"entry_actions.failed_to_save_to_instapaper": "無法保存至 Instapaper",
|
||||
"entry_actions.failed_to_save_to_readwise": "無法保存至 Readwise",
|
||||
"entry_actions.mark_as_read": "標記為已讀",
|
||||
"entry_actions.mark_as_unread": "標記為未讀",
|
||||
"entry_actions.open_in_browser": "在{{which}}中開啟",
|
||||
|
|
@ -64,17 +64,17 @@
|
|||
"entry_actions.save_media_to_eagle": "保存媒體至 Eagle",
|
||||
"entry_actions.save_to_instapaper": "保存至 Instapaper",
|
||||
"entry_actions.save_to_readwise": "保存至 Readwise",
|
||||
"entry_actions.saved_to_eagle": "已保存至 Eagle。",
|
||||
"entry_actions.saved_to_instapaper": "已保存至 Instapaper。",
|
||||
"entry_actions.saved_to_readwise": "已保存至 Readwise。",
|
||||
"entry_actions.saved_to_eagle": "已保存至 Eagle",
|
||||
"entry_actions.saved_to_instapaper": "已保存至 Instapaper",
|
||||
"entry_actions.saved_to_readwise": "已保存至 Readwise",
|
||||
"entry_actions.share": "分享",
|
||||
"entry_actions.star": "收藏",
|
||||
"entry_actions.starred": "已收藏。",
|
||||
"entry_actions.starred": "已收藏",
|
||||
"entry_actions.tip": "贊助",
|
||||
"entry_actions.unstar": "取消收藏",
|
||||
"entry_actions.unstarred": "已取消收藏。",
|
||||
"entry_actions.unstarred": "已取消收藏",
|
||||
"entry_actions.view_source_content": "查看原始內容",
|
||||
"entry_column.filtered_content_tip": "你已隱藏篩選內容。",
|
||||
"entry_column.filtered_content_tip": "你已隱藏篩選內容",
|
||||
"entry_column.filtered_content_tip_2": "除了以上顯示的條目,還有一些已篩選的內容。",
|
||||
"entry_column.refreshing": "刷新新條目中...",
|
||||
"entry_content.ai_summary": "AI 摘要",
|
||||
|
|
@ -85,12 +85,12 @@
|
|||
"entry_content.readability_notice": "此內容由 Readability 提供。如果你發現排版異常,請到來源網站查看原始內容。",
|
||||
"entry_content.render_error": "渲染錯誤:",
|
||||
"entry_content.report_issue": "報告問題",
|
||||
"entry_content.support_amount": "{{amount}} 人支持了此訂閱源的創作者。",
|
||||
"entry_content.support_amount": "{{amount}} 人支持了此訂閱源的創作者",
|
||||
"entry_content.support_creator": "支持創作者",
|
||||
"entry_content.web_app_notice": "網頁應用可能不支持此內容類型。你可以下載桌面應用程式。",
|
||||
"entry_list.zero_unread": "全部已讀",
|
||||
"entry_list_header.daily_report": "每日報告",
|
||||
"entry_list_header.hide_no_image_items": "隱藏沒有圖片的條目。",
|
||||
"entry_list_header.hide_no_image_items": "隱藏沒有圖片的條目",
|
||||
"entry_list_header.items": "項目",
|
||||
"entry_list_header.new_entries_available": "有新條目可用",
|
||||
"entry_list_header.refetch": "重新抓取",
|
||||
|
|
@ -105,12 +105,12 @@
|
|||
"entry_list_header.unread": "未讀",
|
||||
"feed_claim_modal.choose_verification_method": "有三種驗證方法可選,你可以選擇其中一種進行驗證。",
|
||||
"feed_claim_modal.claim_button": "認領",
|
||||
"feed_claim_modal.content_instructions": "複製以下內容並貼到你最新的 RSS 訂閱源中。",
|
||||
"feed_claim_modal.content_instructions": "複製以下內容並貼到你最新的 RSS 訂閱源中",
|
||||
"feed_claim_modal.description_current": "當前描述:",
|
||||
"feed_claim_modal.description_instructions": "複製以下內容並貼到你的 RSS 訂閱源中的 <code /> 欄位。",
|
||||
"feed_claim_modal.description_instructions": "複製以下內容並貼到你的 RSS 訂閱源中的 <code /> 欄位",
|
||||
"feed_claim_modal.failed_to_load": "無法加載認領信息",
|
||||
"feed_claim_modal.rss_format_choice": "RSS 生成器通常有兩種格式可選。請根據需要複製以下的 XML 和 JSON 格式。",
|
||||
"feed_claim_modal.rss_instructions": "複製以下代碼並貼到你的 RSS 生成器中。",
|
||||
"feed_claim_modal.rss_instructions": "複製以下代碼並貼到你的 RSS 生成器中",
|
||||
"feed_claim_modal.rss_json_format": "JSON 格式",
|
||||
"feed_claim_modal.rss_xml_format": "XML 格式",
|
||||
"feed_claim_modal.rsshub_notice": "此訂閱源由 RSSHub 提供,緩存時間為 1 小時。發布內容後,請等待最多 1 小時更改才能生效。",
|
||||
|
|
@ -122,23 +122,23 @@
|
|||
"feed_form.add_follow": "新增關注",
|
||||
"feed_form.category": "分類",
|
||||
"feed_form.category_description": "默認情況下,你的關注會按網站分組。",
|
||||
"feed_form.error_fetching_feed": "獲取訂閱源時出錯。",
|
||||
"feed_form.error_fetching_feed": "獲取訂閱源時出錯",
|
||||
"feed_form.fee": "跟隨費用",
|
||||
"feed_form.fee_description": "要跟隨此清單,您必須向清單創建者支付費用。",
|
||||
"feed_form.feed_not_found": "未找到相關資訊流。",
|
||||
"feed_form.feed_not_found": "未找到相關資訊流",
|
||||
"feed_form.feedback": "反饋",
|
||||
"feed_form.follow": "關注",
|
||||
"feed_form.follow_with_fee": "跟隨需要 {{fee}} Power",
|
||||
"feed_form.followed": "🎉 已關注。",
|
||||
"feed_form.followed": "🎉 已關注",
|
||||
"feed_form.private_follow": "私人關注",
|
||||
"feed_form.private_follow_description": "此關注是否在你的個人資料頁面上公開可見。",
|
||||
"feed_form.private_follow_description": "此關注是否在你的個人資料頁面上公開可見",
|
||||
"feed_form.retry": "重試",
|
||||
"feed_form.title": "標題",
|
||||
"feed_form.title_description": "此資訊流的自定義標題。留空則使用默認標題。",
|
||||
"feed_form.unfollow": "取消關注",
|
||||
"feed_form.update": "更新",
|
||||
"feed_form.update_follow": "更新關注",
|
||||
"feed_form.updated": "🎉 已更新。",
|
||||
"feed_form.updated": "🎉 已更新",
|
||||
"feed_form.view": "視圖",
|
||||
"feed_item.claimed_by_owner": "訂閲源所有者",
|
||||
"feed_item.claimed_by_unknown": "未知所有者",
|
||||
|
|
@ -152,7 +152,7 @@
|
|||
"feed_view_type.pictures": "圖片",
|
||||
"feed_view_type.social_media": "社交媒體",
|
||||
"feed_view_type.videos": "視頻",
|
||||
"mark_all_read_button.auto_confirm_info": "將在 3 秒後自動確認。",
|
||||
"mark_all_read_button.auto_confirm_info": "將在 3 秒後自動確認",
|
||||
"mark_all_read_button.confirm": "確認",
|
||||
"mark_all_read_button.confirm_mark_all": "確定將 <which /> 標記為已讀?",
|
||||
"mark_all_read_button.confirm_mark_all_info": "確定將所有標記為已讀?",
|
||||
|
|
@ -163,7 +163,7 @@
|
|||
"notify.unSupportWidth": "{{app_name}} 目前尚未支援流動裝置",
|
||||
"notify.unSupportWidth_1": "您的裝置寬度為 <b>{{width}}</b>,低於支援的最小寬度 {{minWidth}}",
|
||||
"notify.unSupportWidth_2": "請切換至桌面應用程式繼續使用 {{app_name}} <br /> 下載連結:<url />",
|
||||
"notify.unfollow_feed": "已取消關注 <FeedItem />。",
|
||||
"notify.unfollow_feed": "已取消關注 <FeedItem />",
|
||||
"notify.update_info": "{{app_name}} 已準備好更新!",
|
||||
"notify.update_info_1": "點擊以重新啟動",
|
||||
"player.back_10s": "倒退 10 秒",
|
||||
|
|
@ -181,7 +181,7 @@
|
|||
"player.volume": "音量",
|
||||
"resize.tooltip.double_click_to_collapse": "<b>雙擊</b>以摺疊",
|
||||
"resize.tooltip.drag_to_resize": "<b>拖曳</b>以調整大小",
|
||||
"search.empty.no_results": "未找到結果。",
|
||||
"search.empty.no_results": "未找到結果",
|
||||
"search.group.entries": "條目",
|
||||
"search.group.feeds": "訂閱源",
|
||||
"search.options.all": "所有",
|
||||
|
|
@ -239,7 +239,7 @@
|
|||
"tip_modal.feed_owner": "訂閱源擁有者",
|
||||
"tip_modal.low_balance": "你的餘額不足以覆蓋此贊助。請調整金額。",
|
||||
"tip_modal.no_wallet": "你尚未擁有錢包。請創建一個錢包以進行贊助。",
|
||||
"tip_modal.tip_amount_sent": "已經發送給作者。",
|
||||
"tip_modal.tip_amount_sent": "已經發送給作者",
|
||||
"tip_modal.tip_now": "立刻贊助",
|
||||
"tip_modal.tip_sent": "贊助成功!感謝你的支持。",
|
||||
"tip_modal.tip_support": "⭐ 贊助以顯示你的支持!",
|
||||
|
|
@ -284,6 +284,7 @@
|
|||
"words.search": "搜尋",
|
||||
"words.starred": "收藏",
|
||||
"words.title": "標題",
|
||||
"words.transform": "轉換",
|
||||
"words.trending": "熱門",
|
||||
"words.undo": "撤銷",
|
||||
"words.unread": "未讀",
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
"words.back": "返回",
|
||||
"words.copy": "複製",
|
||||
"words.create": "創建",
|
||||
"words.delete": "刪除",
|
||||
"words.edit": "編輯",
|
||||
"words.entry": "條目",
|
||||
"words.id": "ID",
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
"feed.follower_one": "follower",
|
||||
"feed.follower_other": "followers",
|
||||
"feed.followsAndFeeds": "{{subscriptionCount}} {{subscriptionNoun}} and {{feedsCount}} {{feedsNoun}} on {{appName}}",
|
||||
"feed.followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} {{readNoun}} on {{appName}}",
|
||||
"feed.followsAndReads": "{{subscriptionCount}} {{subscriptionNoun}} with {{readCount}} recent {{readNoun}} on {{appName}}",
|
||||
"feed.read_one": "read",
|
||||
"feed.read_other": "reads",
|
||||
"feed.view_feed_url": "View Feed URL",
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@
|
|||
"feed.follower_one": "关注者",
|
||||
"feed.follower_other": "关注者",
|
||||
"feed.followsAndFeeds": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}}和 {{feedsCount}} 个{{feedsNoun}}",
|
||||
"feed.followsAndReads": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}},{{readCount}} 篇{{readNoun}}",
|
||||
"feed.read_one": "文章",
|
||||
"feed.read_other": "文章",
|
||||
"feed.followsAndReads": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}},{{readCount}} 次近期{{readNoun}}",
|
||||
"feed.read_one": "阅读",
|
||||
"feed.read_other": "阅读",
|
||||
"feed.view_feed_url": "查看链接",
|
||||
"header.app": "应用",
|
||||
"header.download": "下载",
|
||||
|
|
|
|||
|
|
@ -89,6 +89,9 @@
|
|||
"general.app": "应用程序",
|
||||
"general.data_persist.description": "在本地保留数据以启用离线访问和本地搜索",
|
||||
"general.data_persist.label": "保留数据以供离线使用",
|
||||
"general.export.button": "导出",
|
||||
"general.export.description": "将你的订阅源导出到 OPML 文件。",
|
||||
"general.export.label": "导出订阅源",
|
||||
"general.group_by_date.description": "按日期对条目进行分组",
|
||||
"general.group_by_date.label": "按日期分组",
|
||||
"general.language": "语言",
|
||||
|
|
|
|||
|
|
@ -89,6 +89,9 @@
|
|||
"general.app": "應用程式",
|
||||
"general.data_persist.description": "本地保存數據以啟用離線存取和本地搜尋。",
|
||||
"general.data_persist.label": "離線使用時保留數據",
|
||||
"general.export.button": "匯出",
|
||||
"general.export.description": "匯出你的訂閱到 OPML 文件",
|
||||
"general.export.label": "匯出訂閱",
|
||||
"general.group_by_date.description": "按日期分組條目。",
|
||||
"general.group_by_date.label": "按日期分組",
|
||||
"general.language": "語言",
|
||||
|
|
@ -159,6 +162,8 @@
|
|||
"lists.create": "建立新清單",
|
||||
"lists.created.error": "建立清單失敗。",
|
||||
"lists.created.success": "成功建立清單!",
|
||||
"lists.delete.error": "刪除清單失敗。",
|
||||
"lists.delete.success": "成功刪除清單!",
|
||||
"lists.description": "描述",
|
||||
"lists.earnings": "收益",
|
||||
"lists.edit.error": "編輯清單失敗。",
|
||||
|
|
@ -184,7 +189,7 @@
|
|||
"lists.submit": "提交",
|
||||
"lists.subscriptions": "訂閱",
|
||||
"lists.title": "標題",
|
||||
"lists.view": "查看",
|
||||
"lists.view": "視圖",
|
||||
"profile.avatar.label": "頭像",
|
||||
"profile.handle.description": "你的唯一識別符。",
|
||||
"profile.handle.label": "識別符",
|
||||
|
|
@ -226,6 +231,7 @@
|
|||
"wallet.transactions.to": "發送至",
|
||||
"wallet.transactions.tx": "交易",
|
||||
"wallet.transactions.type": "類型",
|
||||
"wallet.transactions.types.all": "全部",
|
||||
"wallet.transactions.types.burn": "銷燬",
|
||||
"wallet.transactions.types.mint": "鑄造",
|
||||
"wallet.transactions.types.purchase": "購買",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "Follow",
|
||||
"type": "module",
|
||||
"version": "0.0.1-alpha.19",
|
||||
"version": "0.0.1-alpha.21",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@9.11.0",
|
||||
"description": "Next generation information browser",
|
||||
|
|
|
|||
|
|
@ -11,27 +11,7 @@ export const env = createEnv({
|
|||
VITE_SENTRY_DSN: z.string().optional(),
|
||||
VITE_POSTHOG_KEY: z.string().optional(),
|
||||
VITE_INBOXES_EMAIL: z.string().default("@follow.re"),
|
||||
VITE_FIREBASE_CONFIG: z
|
||||
.string()
|
||||
.transform((content) => {
|
||||
try {
|
||||
return JSON.parse(content)
|
||||
} catch {
|
||||
return z.NEVER
|
||||
}
|
||||
})
|
||||
.pipe(
|
||||
z.object({
|
||||
apiKey: z.string(),
|
||||
authDomain: z.string(),
|
||||
projectId: z.string(),
|
||||
storageBucket: z.string(),
|
||||
messagingSenderId: z.string(),
|
||||
appId: z.string(),
|
||||
measurementId: z.string(),
|
||||
}),
|
||||
)
|
||||
.optional(),
|
||||
VITE_FIREBASE_CONFIG: z.string().optional(),
|
||||
},
|
||||
|
||||
emptyStringAsUndefined: true,
|
||||
|
|
|
|||
|
|
@ -5174,6 +5174,7 @@ declare const _routes: hono_hono_base.HonoBase<Env, {
|
|||
json: {
|
||||
entryIds: string[];
|
||||
isInbox?: boolean | undefined;
|
||||
readHistories?: string[] | undefined;
|
||||
};
|
||||
};
|
||||
output: {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import type { Plugin, UserConfig } from "vite"
|
||||
|
||||
export function createDependencyChunksPlugin(dependencies: string[] | string[][]): Plugin {
|
||||
export function createDependencyChunksPlugin(dependencies: string[][]): Plugin {
|
||||
return {
|
||||
name: "dependency-chunks",
|
||||
config(config: UserConfig) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
import type { Plugin } from "vite"
|
||||
|
||||
export function createPlatformSpecificImportPlugin(isElectron = false): Plugin {
|
||||
return {
|
||||
name: "platform-specific-import",
|
||||
enforce: "pre",
|
||||
async resolveId(source, importer) {
|
||||
if (!importer) {
|
||||
return null
|
||||
}
|
||||
|
||||
const allowExts = [".js", ".jsx", ".ts", ".tsx"]
|
||||
|
||||
if (!allowExts.some((ext) => importer.endsWith(ext))) return null
|
||||
|
||||
if (importer.includes("node_modules")) return null
|
||||
const [path, query] = source.split("?")
|
||||
|
||||
if (path.startsWith(".") || path.startsWith("/")) {
|
||||
const priorities = isElectron
|
||||
? [".electron.ts", ".electron.tsx", ".electron.js", ".electron.jsx"]
|
||||
: [".web.ts", ".web.tsx", ".web.js", ".web.jsx"]
|
||||
|
||||
for (const ext of priorities) {
|
||||
const resolvedPath = await this.resolve(
|
||||
`${path}${ext}${query ? `?${query}` : ""}`,
|
||||
importer,
|
||||
{
|
||||
skipSelf: true,
|
||||
},
|
||||
)
|
||||
|
||||
if (resolvedPath) {
|
||||
return resolvedPath.id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ interface ImportMetaEnv {
|
|||
VITE_IMGPROXY_URL: string
|
||||
VITE_SENTRY_DSN: string
|
||||
VITE_POSTHOG_KEY: string
|
||||
VITE_FIREBASE_CONFIG: string
|
||||
}
|
||||
|
||||
interface ImportMeta {
|
||||
|
|
|
|||
37
vercel.json
37
vercel.json
|
|
@ -9,7 +9,7 @@
|
|||
"destination": "/__debug_proxy.html"
|
||||
},
|
||||
{
|
||||
"source": "/(.*)",
|
||||
"source": "/((?!assets|vendor|locales/).*)",
|
||||
"destination": "/index.html"
|
||||
}
|
||||
],
|
||||
|
|
@ -19,7 +19,40 @@
|
|||
"headers": [
|
||||
{
|
||||
"key": "Cache-Control",
|
||||
"value": "public, max-age=31536000, immutable"
|
||||
"value": "public, max-age=604800, immutable"
|
||||
},
|
||||
{
|
||||
"key": "CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
},
|
||||
{
|
||||
"key": "Vercel-CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
},
|
||||
{
|
||||
"key": "Cloudflare-CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "/assets/(.*)",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Cache-Control",
|
||||
"value": "public, max-age=604800, immutable"
|
||||
},
|
||||
{
|
||||
"key": "CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
},
|
||||
{
|
||||
"key": "Vercel-CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
},
|
||||
{
|
||||
"key": "Cloudflare-CDN-Cache-Control",
|
||||
"value": "max-age=604800"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import { viteRenderBaseConfig } from "./configs/vite.render.config"
|
|||
import type { env as EnvType } from "./packages/shared/src/env"
|
||||
import { createDependencyChunksPlugin } from "./plugins/vite/deps"
|
||||
import { htmlInjectPlugin } from "./plugins/vite/html-inject"
|
||||
import { createPlatformSpecificImportPlugin } from "./plugins/vite/specific-import"
|
||||
|
||||
const __dirname = fileURLToPath(new URL(".", import.meta.url))
|
||||
const isCI = process.env.CI === "true" || process.env.CI === "1"
|
||||
|
|
@ -75,7 +76,8 @@ export default ({ mode }) => {
|
|||
devPrint(),
|
||||
createDependencyChunksPlugin([
|
||||
// React framework
|
||||
["react", "react-dom", "react-router-dom", "react-error-boundary", "react-dom/server"],
|
||||
["react", "react-dom"],
|
||||
["react-error-boundary", "react-dom/server", "react-router-dom"],
|
||||
// Data Statement
|
||||
["zustand", "jotai", "use-context-selector", "immer", "dexie"],
|
||||
// Remark
|
||||
|
|
@ -131,7 +133,6 @@ export default ({ mode }) => {
|
|||
"@tanstack/react-query-persist-client",
|
||||
"@tanstack/query-sync-storage-persister",
|
||||
],
|
||||
["blurhash", "react-blurhash"],
|
||||
["tldts"],
|
||||
["shiki", "@shikijs/transformers"],
|
||||
["@sentry/react", "posthog-js"],
|
||||
|
|
@ -139,6 +140,8 @@ export default ({ mode }) => {
|
|||
|
||||
["swiper"],
|
||||
]),
|
||||
|
||||
createPlatformSpecificImportPlugin(false),
|
||||
],
|
||||
|
||||
define: {
|
||||
|
|
|
|||
Loading…
Reference in New Issue