From b2a4ddae60964041584dbeb0912071f33ff95988 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 18 Jun 2025 19:17:18 +0800 Subject: [PATCH] feat: show annotation create time and various other UI fixes (#1412) --- apps/readest-app/package.json | 1 + .../app/reader/components/FootnotePopup.tsx | 5 +- .../src/app/reader/components/Reader.tsx | 3 + .../reader/components/annotator/Annotator.tsx | 21 +- .../components/annotator/HighlightOptions.tsx | 12 +- .../app/reader/components/notebook/Header.tsx | 5 +- .../reader/components/settings/LangPanel.tsx | 5 +- .../components/sidebar/BooknoteItem.tsx | 66 +++--- .../src/app/reader/hooks/useTextSelector.ts | 1 + apps/readest-app/src/utils/time.ts | 33 +++ pnpm-lock.yaml | 209 +++++------------- 11 files changed, 159 insertions(+), 202 deletions(-) create mode 100644 apps/readest-app/src/utils/time.ts diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json index e9b44f06..bbacb7b0 100644 --- a/apps/readest-app/package.json +++ b/apps/readest-app/package.json @@ -63,6 +63,7 @@ "clsx": "^2.1.1", "cors": "^2.8.5", "cssbeautify": "^0.3.1", + "dayjs": "^1.11.13", "foliate-js": "workspace:*", "highlight.js": "^11.11.1", "i18next": "^24.2.0", diff --git a/apps/readest-app/src/app/reader/components/FootnotePopup.tsx b/apps/readest-app/src/app/reader/components/FootnotePopup.tsx index 91355288..e174da37 100644 --- a/apps/readest-app/src/app/reader/components/FootnotePopup.tsx +++ b/apps/readest-app/src/app/reader/components/FootnotePopup.tsx @@ -66,7 +66,10 @@ const FootnotePopup: React.FC = ({ bookKey, bookDoc }) => { footnoteRef.current?.replaceChildren(view); const { renderer } = view; renderer.setAttribute('flow', 'scrolled'); - renderer.setAttribute('margin', '0px'); + renderer.setAttribute('margin-top', '0px'); + renderer.setAttribute('margin-right', '0px'); + renderer.setAttribute('margin-bottom', '0px'); + renderer.setAttribute('margin-left', '0px'); renderer.setAttribute('gap', '0%'); const viewSettings = getViewSettings(bookKey)!; const themeCode = getThemeCode(); diff --git a/apps/readest-app/src/app/reader/components/Reader.tsx b/apps/readest-app/src/app/reader/components/Reader.tsx index b5d1fbb6..f9b7470b 100644 --- a/apps/readest-app/src/app/reader/components/Reader.tsx +++ b/apps/readest-app/src/app/reader/components/Reader.tsx @@ -22,6 +22,8 @@ import { getSysFontsList, setSystemUIVisibility } from '@/utils/bridge'; import { AboutWindow } from '@/components/AboutWindow'; import { UpdaterWindow } from '@/components/UpdaterWindow'; import { Toast } from '@/components/Toast'; +import { getLocale } from '@/utils/misc'; +import { initDayjs } from '@/utils/time'; import ReaderContent from './ReaderContent'; const Reader: React.FC<{ ids?: string }> = ({ ids }) => { @@ -45,6 +47,7 @@ const Reader: React.FC<{ ids?: string }> = ({ ids }) => { if (isTauriAppPlatform()) { setTimeout(getSysFontsList, 3000); } + initDayjs(getLocale()); }, []); useEffect(() => { diff --git a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx index 4e805b9d..de22a553 100644 --- a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { FiSearch } from 'react-icons/fi'; import { FiCopy } from 'react-icons/fi'; import { PiHighlighterFill } from 'react-icons/pi'; @@ -26,6 +26,7 @@ import { useTextSelector } from '../../hooks/useTextSelector'; import { getPopupPosition, getPosition, Position, TextSelection } from '@/utils/sel'; import { eventDispatcher } from '@/utils/event'; import { findTocItemBS } from '@/utils/toc'; +import { throttle } from '@/utils/throttle'; import { HIGHLIGHT_COLOR_HEX } from '@/services/constants'; import AnnotationPopup from './AnnotationPopup'; import WiktionaryPopup from './WiktionaryPopup'; @@ -78,13 +79,17 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { const annotPopupHeight = useResponsiveSize(44); const androidSelectionHandlerHeight = 0; - const handleDismissPopup = () => { - setSelection(null); - setShowAnnotPopup(false); - setShowWiktionaryPopup(false); - setShowWikipediaPopup(false); - setShowDeepLPopup(false); - }; + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleDismissPopup = useCallback( + throttle(() => { + setSelection(null); + setShowAnnotPopup(false); + setShowWiktionaryPopup(false); + setShowWikipediaPopup(false); + setShowDeepLPopup(false); + }, 500), + [], + ); const handleDismissPopupAndSelection = () => { handleDismissPopup(); diff --git a/apps/readest-app/src/app/reader/components/annotator/HighlightOptions.tsx b/apps/readest-app/src/app/reader/components/annotator/HighlightOptions.tsx index dbe480b6..b0963a46 100644 --- a/apps/readest-app/src/app/reader/components/annotator/HighlightOptions.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/HighlightOptions.tsx @@ -69,16 +69,18 @@ const HighlightOptions: React.FC = ({ className={clsx( 'w-4 p-0 text-center leading-none', style === 'highlight' && - (selectedStyle === 'highlight' ? `bg-${selectedColor}-400` : `bg-gray-300`), + (selectedStyle === 'highlight' + ? `bg-${selectedColor}-300 pt-[2px]` + : `bg-gray-300 pt-[2px]`), (style === 'underline' || style === 'squiggly') && 'text-gray-300 underline decoration-2', style === 'underline' && (selectedStyle === 'underline' - ? `decoration-${selectedColor}-400` + ? `decoration-${selectedColor}-300` : `decoration-gray-300`), style === 'squiggly' && (selectedStyle === 'squiggly' - ? `decoration-wavy decoration-${selectedColor}-400` + ? `decoration-wavy decoration-${selectedColor}-300` : `decoration-gray-300 decoration-wavy`), )} > @@ -100,10 +102,10 @@ const HighlightOptions: React.FC = ({ key={color} onClick={() => handleSelectColor(color)} style={{ width: size16, height: size16 }} - className={clsx(`rounded-full p-0`, selectedColor !== color && `bg-${color}-400`)} + className={clsx(`rounded-full p-0`, selectedColor !== color && `bg-${color}-300`)} > {selectedColor === color && ( - + )} ))} diff --git a/apps/readest-app/src/app/reader/components/notebook/Header.tsx b/apps/readest-app/src/app/reader/components/notebook/Header.tsx index 8e2fd03f..0c8a3654 100644 --- a/apps/readest-app/src/app/reader/components/notebook/Header.tsx +++ b/apps/readest-app/src/app/reader/components/notebook/Header.tsx @@ -16,10 +16,11 @@ const NotebookHeader: React.FC<{ }> = ({ isPinned, isSearchBarVisible, handleClose, handleTogglePin, handleToggleSearchBar }) => { const _ = useTranslation(); const iconSize14 = useResponsiveSize(14); + const iconSize18 = useResponsiveSize(18); return (
- +
{_('Notebook')}
@@ -44,7 +45,7 @@ const NotebookHeader: React.FC<{ onClick={handleToggleSearchBar} className={clsx('btn btn-ghost h-8 min-h-8 w-8 p-0', isSearchBarVisible && 'bg-base-300')} > - +
diff --git a/apps/readest-app/src/app/reader/components/settings/LangPanel.tsx b/apps/readest-app/src/app/reader/components/settings/LangPanel.tsx index 8bd40aa2..d8737b81 100644 --- a/apps/readest-app/src/app/reader/components/settings/LangPanel.tsx +++ b/apps/readest-app/src/app/reader/components/settings/LangPanel.tsx @@ -8,6 +8,7 @@ import { useTranslation } from '@/hooks/useTranslation'; import { saveViewSettings } from '../../utils/viewSettingsHelper'; import { getTranslators } from '@/services/translators'; import { TRANSLATED_LANGS } from '@/services/constants'; +import { initDayjs } from '@/utils/time'; import Select from '@/components/Select'; const LangPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { @@ -43,7 +44,9 @@ const LangPanel: React.FC<{ bookKey: string }> = ({ bookKey }) => { const handleSelectUILang = (event: React.ChangeEvent) => { const option = event.target.value; saveViewSettings(envConfig, bookKey, 'uiLanguage', option, false, false); - i18n.changeLanguage(option ? option : navigator.language); + const locale = option ? option : navigator.language; + i18n.changeLanguage(locale); + initDayjs(locale); }; const getTranslationProviderOptions = () => { diff --git a/apps/readest-app/src/app/reader/components/sidebar/BooknoteItem.tsx b/apps/readest-app/src/app/reader/components/sidebar/BooknoteItem.tsx index f1fdde54..03a70632 100644 --- a/apps/readest-app/src/app/reader/components/sidebar/BooknoteItem.tsx +++ b/apps/readest-app/src/app/reader/components/sidebar/BooknoteItem.tsx @@ -1,4 +1,5 @@ import clsx from 'clsx'; +import dayjs from 'dayjs'; import React from 'react'; import { marked } from 'marked'; @@ -103,7 +104,7 @@ const BooknoteItem: React.FC = ({ bookKey, item }) => {
= ({ bookKey, item }) => { } onClick={(e) => e.stopPropagation()} > -
- {item.note && ( - - )} - +
diff --git a/apps/readest-app/src/app/reader/hooks/useTextSelector.ts b/apps/readest-app/src/app/reader/hooks/useTextSelector.ts index 1f8e0780..bb5c0740 100644 --- a/apps/readest-app/src/app/reader/hooks/useTextSelector.ts +++ b/apps/readest-app/src/app/reader/hooks/useTextSelector.ts @@ -113,6 +113,7 @@ export const useTextSelector = ( // Prevent the container from scrolling when text is selected in paginated mode // FIXME: this is a workaround for issue #873 // TODO: support text selection across pages + handleDismissPopup(); const viewSettings = getViewSettings(bookKey); if ( appService?.isAndroidApp && diff --git a/apps/readest-app/src/utils/time.ts b/apps/readest-app/src/utils/time.ts new file mode 100644 index 00000000..38cb3fca --- /dev/null +++ b/apps/readest-app/src/utils/time.ts @@ -0,0 +1,33 @@ +import dayjs from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +import 'dayjs/locale/en'; +import 'dayjs/locale/zh'; +import 'dayjs/locale/de'; +import 'dayjs/locale/ja'; +import 'dayjs/locale/ko'; +import 'dayjs/locale/ru'; +import 'dayjs/locale/fr'; +import 'dayjs/locale/el'; +import 'dayjs/locale/es'; +import 'dayjs/locale/it'; +import 'dayjs/locale/pt'; +import 'dayjs/locale/pt-br'; +import 'dayjs/locale/ar'; +import 'dayjs/locale/id'; +import 'dayjs/locale/hi'; +import 'dayjs/locale/th'; +import 'dayjs/locale/tr'; +import 'dayjs/locale/vi'; +import 'dayjs/locale/uk'; +import 'dayjs/locale/pl'; +import 'dayjs/locale/fi'; +import 'dayjs/locale/nl'; +import 'dayjs/locale/ro'; +import 'dayjs/locale/zh-tw'; +import 'dayjs/locale/zh-cn'; + +export const initDayjs = (locale: string) => { + dayjs.locale(locale); + dayjs.extend(relativeTime); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f91c4f3..f35b90ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 3.3.1 '@eslint/js': specifier: ^9.9.1 - version: 9.16.0 + version: 9.28.0 '@sindresorhus/tsconfig': specifier: ^6.0.0 version: 6.0.0 @@ -116,6 +116,9 @@ importers: cssbeautify: specifier: ^0.3.1 version: 0.3.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 foliate-js: specifier: workspace:* version: link:../../packages/foliate-js @@ -224,10 +227,10 @@ importers: version: 7.4.4 eslint: specifier: ^9.16.0 - version: 9.16.0(jiti@1.21.6) + version: 9.28.0(jiti@1.21.6) eslint-config-next: specifier: 15.0.3 - version: 15.0.3(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + version: 15.0.3(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) i18next-scanner: specifier: ^4.6.0 version: 4.6.0(typescript@5.7.2) @@ -267,7 +270,7 @@ importers: devDependencies: '@eslint/js': specifier: ^9.9.1 - version: 9.16.0 + version: 9.28.0 '@rollup/plugin-node-resolve': specifier: ^15.2.3 version: 15.3.0(rollup@4.28.0) @@ -1439,10 +1442,6 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-array@0.20.1': resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1459,34 +1458,18 @@ packages: resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.16.0': - resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.28.0': resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.2': resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1518,10 +1501,6 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -3421,6 +3400,9 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debounce@2.2.0: resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} engines: {node: '>=18'} @@ -3734,10 +3716,6 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3750,16 +3728,6 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.16.0: - resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - eslint@9.28.0: resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8143,11 +8111,6 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@1.21.6))': - dependencies: - eslint: 9.16.0(jiti@1.21.6) - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.28.0(jiti@1.21.6))': dependencies: eslint: 9.28.0(jiti@1.21.6) @@ -8155,14 +8118,6 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.0': - dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@eslint/config-array@0.20.1': dependencies: '@eslint/object-schema': 2.1.6 @@ -8181,8 +8136,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.9.0': {} - '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -8197,18 +8150,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.16.0': {} - '@eslint/js@9.28.0': {} - '@eslint/object-schema@2.1.4': {} - '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.3': - dependencies: - levn: 0.4.1 - '@eslint/plugin-kit@0.3.2': dependencies: '@eslint/core': 0.15.0 @@ -8235,8 +8180,6 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} - '@humanwhocodes/retry@0.4.3': {} '@icons/material@0.2.4(react@19.0.0)': @@ -9703,15 +9646,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.16.0 - '@typescript-eslint/type-utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.16.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9721,14 +9664,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.4.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -9739,12 +9682,12 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) debug: 4.4.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 @@ -9768,13 +9711,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/utils@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.28.0(jiti@1.21.6)) '@typescript-eslint/scope-manager': 8.16.0 '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -10378,6 +10321,8 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + dayjs@1.11.13: {} + debounce@2.2.0: {} debug@3.2.7: @@ -10640,19 +10585,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.0.3(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2): + eslint-config-next@15.0.3(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2): dependencies: '@next/eslint-plugin-next': 15.0.3 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) + eslint: 9.28.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-react: 7.37.2(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-react-hooks: 5.0.0(eslint@9.16.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@1.21.6)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.28.0(jiti@1.21.6)) + eslint-plugin-react: 7.37.2(eslint@9.28.0(jiti@1.21.6)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.28.0(jiti@1.21.6)) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -10672,37 +10617,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@1.21.6)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@1.21.6)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 enhanced-resolve: 5.17.1 - eslint: 9.16.0(jiti@1.21.6) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.28.0(jiti@1.21.6) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) + eslint: 9.28.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.28.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -10711,9 +10656,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@1.21.6)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.28.0(jiti@1.21.6)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -10725,13 +10670,13 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.16.0(eslint@9.28.0(jiti@1.21.6))(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.16.0(jiti@1.21.6)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.28.0(jiti@1.21.6)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -10741,7 +10686,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -10750,11 +10695,11 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0(eslint@9.16.0(jiti@1.21.6)): + eslint-plugin-react-hooks@5.0.0(eslint@9.28.0(jiti@1.21.6)): dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) - eslint-plugin-react@7.37.2(eslint@9.16.0(jiti@1.21.6)): + eslint-plugin-react@7.37.2(eslint@9.28.0(jiti@1.21.6)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -10762,7 +10707,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.28.0(jiti@1.21.6) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -10781,11 +10726,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.2.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -10795,47 +10735,6 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.16.0(jiti@1.21.6): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 - '@eslint/core': 0.9.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.16.0 - '@eslint/plugin-kit': 0.2.3 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.3.7 - escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 1.21.6 - transitivePeerDependencies: - - supports-color - eslint@9.28.0(jiti@1.21.6): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.28.0(jiti@1.21.6)) @@ -10849,12 +10748,12 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.0