├── .github ├── FUNDING.yml └── workflows │ └── publish.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierrc ├── LICENSE.md ├── README.md ├── eslint.config.mjs ├── icon.svg ├── index.html ├── package.json ├── pnpm-lock.yaml ├── screenshots ├── demo.gif └── dynamic-variables.gif ├── src ├── components │ ├── SortableItem.tsx │ ├── TagManagement.tsx │ └── TagProperties.tsx ├── constants.ts ├── features │ ├── create-tag │ │ └── index.tsx │ ├── index.css │ ├── index.tsx │ └── manage-tags │ │ └── index.tsx ├── global.d.ts ├── handle-popup.ts ├── index.tsx ├── observerCallback.ts ├── services │ ├── core │ │ ├── query-blocks-with-tag.ts │ │ ├── update-blocks.ts │ │ └── update-settings.ts │ ├── handle-dynamic-variables.ts │ ├── handle-power-tag.ts │ └── re-ordering │ │ ├── index.ts │ │ ├── insert-ordered-properties.ts │ │ ├── remove-all-properties.ts │ │ └── reorder-properties.ts └── settings.ts ├── tsconfig.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [hkgnp] 2 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Build Logseq Plugin 3 | 4 | on: 5 | push: 6 | branches: 7 | - "main" 8 | paths-ignore: 9 | - 'README.md' 10 | workflow_dispatch: 11 | 12 | env: 13 | PLUGIN_NAME: ${{ github.event.repository.name }} 14 | 15 | jobs: 16 | build: 17 | runs-on: ubuntu-latest 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | 22 | - name: Use Node.js 23 | uses: actions/setup-node@v3 24 | with: 25 | node-version: "20.x" # You might need to adjust this value to your own version 26 | 27 | - uses: pnpm/action-setup@v4 28 | with: 29 | version: 9.4.0 30 | 31 | - name: Build 32 | id: build 33 | run: | 34 | pnpm i && pnpm run build 35 | mkdir ${{ env.PLUGIN_NAME }} 36 | cp README.md package.json icon.svg ${{ env.PLUGIN_NAME }} 37 | mv dist ${{ env.PLUGIN_NAME }} 38 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 39 | ls 40 | echo "tag_name=git tag --sort version:refname | tail -n 1" >> $GITHUB_OUTPUT 41 | 42 | - name: Release 43 | run: npx semantic-release 44 | env: 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | .env.production 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | .parcel-cache 80 | 81 | # Next.js build output 82 | .next 83 | out 84 | 85 | # Nuxt.js build / generate output 86 | .nuxt 87 | dist 88 | 89 | # Gatsby files 90 | .cache/ 91 | # Comment in the public line in if your project uses Gatsby and not Next.js 92 | # https://nextjs.org/blog/next-9-1#public-directory-support 93 | # public 94 | 95 | # vuepress build output 96 | .vuepress/dist 97 | 98 | # Serverless directories 99 | .serverless/ 100 | 101 | # FuseBox cache 102 | .fusebox/ 103 | 104 | # DynamoDB Local files 105 | .dynamodb/ 106 | 107 | # TernJS port file 108 | .tern-port 109 | 110 | # Stores VSCode versions used for testing VSCode extensions 111 | .vscode-test 112 | 113 | # yarn v2 114 | .yarn/cache 115 | .yarn/unplugged 116 | .yarn/build-state.yml 117 | .yarn/install-state.gz 118 | .pnp.* 119 | .DS_Store 120 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | echo 'Running eslint' 2 | npx eslint . --fix 3 | echo 'Running tsc' 4 | tsc 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 https://github.com/benjypng 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [:gift_heart: Sponsor this project on Github](https://github.com/sponsors/hkgnp) or [:coffee: Get me a coffee](https://www.buymeacoffee.com/hkgnp.dev) if you like this plugin! 2 | 3 | # Introduction 4 | 5 | Designate selected hashtags as PowerTags, and see them auto-create properties are you use them. 6 | 7 | This only applies to tags created using `#` and does not apply to page references, block references without the `#` and blocks that have the `tag` property. 8 | 9 | ![](/screenshots/demo.gif) 10 | 11 | # Usage 12 | 13 | ## Creating Power Tags 14 | 15 | 1. Click on the plugin icon. 16 | 2. Enter your PowerTag, followed by the properties to assign to the PowerTag. You may also assign a default value. 17 | 3. You may use *dynamic variables* in your default values. This will then be automatically populated when using your PowerTag. You may refer to the [Dynamic Variables](https://github.com/benjypng/logseq-powertags-plugin?tab=readme-ov-file#dynamic-variables) section for available variables. 18 | 4. Now the next time you use the tag, your properties will be auto-added. 19 | 20 | ## Managing Your Tags 21 | 22 | 1. Click on the plugin icon. 23 | 2. You will see a list of your created power tags. 24 | 3. Any actions performed here will affect past blocks created with the tag. For example, 25 | - Creating a new PowerTag 26 | - Does not affect past blocks with the tag. 27 | - Deleting a PowerTag 28 | - Removes all properties from blocks that have the tag, even those not created with this plugin. 29 | - Deleting a property of a PowerTag 30 | - Removes the property from blocks that have the tag, even those not created with this plugin. 31 | - Adding a property to an existing PowerTag 32 | - Adds the property to all blocks that have the tag, even those not created with this plugin. 33 | 34 | > Important Note: PowerTags are stored in the plugin settings. If the plugin settings file (found in `.logseq`) is deleted, you will need to manually create your power tags again. 35 | 36 | ## Using Power Tags 37 | 38 | ### Option 1 39 | 40 | By default, PowerTags are automatically parse when you presss `Enter` to create a new block. You can turn this behaviour off in the plugin settings. 41 | 42 | ### Option 2 43 | 44 | If you turn off auto-parse, you may trigger the parsing manually by using the slash command at the end of your block with the PowerTag, i.e. `/Parse PowerTag` 45 | 46 | # Dynamic Variables 47 | 48 | ![](/screenshots/dynamic-variables.gif) 49 | 50 | The following are available to use in your default values: 51 | 52 | |Dynamic Variable|Remarks| 53 | |----------------|-------| 54 | |<% today %>|Inserts the date today based on your preferred date format| 55 | |<% yesterday %>|Inserts the date yesterday based on your preferred date format| 56 | |<% tomorrow %>|Inserts the date tomorrow based on your preferred date format| 57 | |<% time %>|Inserts the current time| 58 | |<% current page %>|Inserts the current page name| 59 | 60 | # Installation 61 | 62 | If not available from the marketplace, download the release and manually load it into Logseq after unzipping it. 63 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js' 2 | import prettierConfig from 'eslint-config-prettier' 3 | import simpleImportSort from 'eslint-plugin-simple-import-sort' 4 | import tseslint from 'typescript-eslint' 5 | 6 | export default tseslint.config( 7 | eslint.configs.recommended, 8 | ...tseslint.configs.stylistic, 9 | ...tseslint.configs.recommended, 10 | prettierConfig, 11 | { 12 | ignores: ['**/dist/'], 13 | }, 14 | { 15 | plugins: { 16 | 'simple-import-sort': simpleImportSort, 17 | }, 18 | rules: { 19 | 'simple-import-sort/imports': 'error', 20 | 'simple-import-sort/exports': 'error', 21 | '@typescript-eslint/consistent-indexed-object-style': 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | '@typescript-eslint/no-unused-vars': [ 24 | 'error', 25 | { varsIgnorePattern: '^_' }, 26 | ], 27 | }, 28 | }, 29 | ) 30 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | logseq-plugin 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "logseq-powertags-plugin", 3 | "author": "benjypng", 4 | "description": "Automatically create block properties based on specified tags.", 5 | "license": "MIT", 6 | "logseq": { 7 | "id": "logseq-powertags-plugin", 8 | "title": "logseq-powertags-plugin", 9 | "icon": "./icon.svg", 10 | "main": "dist/index.html" 11 | }, 12 | "scripts": { 13 | "dev": "npx vite", 14 | "build": "npx eslint . --fix && npx tsc && npx vite build", 15 | "preview": "npx vite preview", 16 | "prepare": "husky" 17 | }, 18 | "release": { 19 | "branches": [ 20 | "main" 21 | ], 22 | "plugins": [ 23 | [ 24 | "@semantic-release/github", 25 | { 26 | "assets": [ 27 | "logseq-powertags-plugin.zip" 28 | ] 29 | } 30 | ] 31 | ] 32 | }, 33 | "dependencies": { 34 | "@dnd-kit/core": "^6.1.0", 35 | "@dnd-kit/sortable": "^8.0.0", 36 | "@dnd-kit/utilities": "^3.2.2", 37 | "@logseq/libs": "^0.0.15", 38 | "@mantine/core": "^7.12.2", 39 | "@mantine/hooks": "^7.12.2", 40 | "date-fns": "^3.6.0", 41 | "logseq-dateutils": "^2.1.2", 42 | "lucide-react": "^0.437.0", 43 | "react": "^18.3.1", 44 | "react-dom": "^18.3.1", 45 | "react-hook-form": "^7.52.2" 46 | }, 47 | "devDependencies": { 48 | "@eslint/js": "^9.6.0", 49 | "@types/eslint": "^8.56.10", 50 | "@types/eslint-config-prettier": "^6.11.3", 51 | "@types/eslint__js": "^8.42.3", 52 | "@types/node": "^20.14.10", 53 | "@types/react": "^18.3.3", 54 | "@types/react-dom": "^18.3.0", 55 | "@typescript-eslint/eslint-plugin": "^6.21.0", 56 | "@typescript-eslint/parser": "^6.21.0", 57 | "eslint": "^8.57.0", 58 | "eslint-config-prettier": "^9.1.0", 59 | "eslint-plugin-prettier": "^5.1.3", 60 | "eslint-plugin-simple-import-sort": "^12.1.1", 61 | "husky": "^9.1.5", 62 | "postcss": "^8.4.42", 63 | "postcss-preset-mantine": "^1.17.0", 64 | "postcss-simple-vars": "^7.0.1", 65 | "prettier": "^3.3.2", 66 | "typescript": "^5.5.3", 67 | "typescript-eslint": "^7.15.0", 68 | "vite": "^4.5.3", 69 | "vite-plugin-logseq": "^1.1.2", 70 | "vite-tsconfig-paths": "^4.3.2" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@dnd-kit/core': 12 | specifier: ^6.1.0 13 | version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 14 | '@dnd-kit/sortable': 15 | specifier: ^8.0.0 16 | version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) 17 | '@dnd-kit/utilities': 18 | specifier: ^3.2.2 19 | version: 3.2.2(react@18.3.1) 20 | '@logseq/libs': 21 | specifier: ^0.0.15 22 | version: 0.0.15 23 | '@mantine/core': 24 | specifier: ^7.12.2 25 | version: 7.12.2(@mantine/hooks@7.12.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 26 | '@mantine/hooks': 27 | specifier: ^7.12.2 28 | version: 7.12.2(react@18.3.1) 29 | date-fns: 30 | specifier: ^3.6.0 31 | version: 3.6.0 32 | logseq-dateutils: 33 | specifier: ^2.1.2 34 | version: 2.1.2 35 | lucide-react: 36 | specifier: ^0.437.0 37 | version: 0.437.0(react@18.3.1) 38 | react: 39 | specifier: ^18.3.1 40 | version: 18.3.1 41 | react-dom: 42 | specifier: ^18.3.1 43 | version: 18.3.1(react@18.3.1) 44 | react-hook-form: 45 | specifier: ^7.52.2 46 | version: 7.52.2(react@18.3.1) 47 | devDependencies: 48 | '@eslint/js': 49 | specifier: ^9.6.0 50 | version: 9.8.0 51 | '@types/eslint': 52 | specifier: ^8.56.10 53 | version: 8.56.11 54 | '@types/eslint-config-prettier': 55 | specifier: ^6.11.3 56 | version: 6.11.3 57 | '@types/eslint__js': 58 | specifier: ^8.42.3 59 | version: 8.42.3 60 | '@types/node': 61 | specifier: ^20.14.10 62 | version: 20.14.14 63 | '@types/react': 64 | specifier: ^18.3.3 65 | version: 18.3.3 66 | '@types/react-dom': 67 | specifier: ^18.3.0 68 | version: 18.3.0 69 | '@typescript-eslint/eslint-plugin': 70 | specifier: ^6.21.0 71 | version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) 72 | '@typescript-eslint/parser': 73 | specifier: ^6.21.0 74 | version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) 75 | eslint: 76 | specifier: ^8.57.0 77 | version: 8.57.0 78 | eslint-config-prettier: 79 | specifier: ^9.1.0 80 | version: 9.1.0(eslint@8.57.0) 81 | eslint-plugin-prettier: 82 | specifier: ^5.1.3 83 | version: 5.2.1(@types/eslint@8.56.11)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3) 84 | eslint-plugin-simple-import-sort: 85 | specifier: ^12.1.1 86 | version: 12.1.1(eslint@8.57.0) 87 | husky: 88 | specifier: ^9.1.5 89 | version: 9.1.5 90 | postcss: 91 | specifier: ^8.4.42 92 | version: 8.4.42 93 | postcss-preset-mantine: 94 | specifier: ^1.17.0 95 | version: 1.17.0(postcss@8.4.42) 96 | postcss-simple-vars: 97 | specifier: ^7.0.1 98 | version: 7.0.1(postcss@8.4.42) 99 | prettier: 100 | specifier: ^3.3.2 101 | version: 3.3.3 102 | typescript: 103 | specifier: ^5.5.3 104 | version: 5.5.4 105 | typescript-eslint: 106 | specifier: ^7.15.0 107 | version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) 108 | vite: 109 | specifier: ^4.5.3 110 | version: 4.5.3(@types/node@20.14.14)(sugarss@4.0.1(postcss@8.4.42)) 111 | vite-plugin-logseq: 112 | specifier: ^1.1.2 113 | version: 1.1.2 114 | vite-tsconfig-paths: 115 | specifier: ^4.3.2 116 | version: 4.3.2(typescript@5.5.4)(vite@4.5.3(@types/node@20.14.14)(sugarss@4.0.1(postcss@8.4.42))) 117 | 118 | packages: 119 | 120 | '@babel/runtime@7.25.0': 121 | resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} 122 | engines: {node: '>=6.9.0'} 123 | 124 | '@dnd-kit/accessibility@3.1.0': 125 | resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} 126 | peerDependencies: 127 | react: '>=16.8.0' 128 | 129 | '@dnd-kit/core@6.1.0': 130 | resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} 131 | peerDependencies: 132 | react: '>=16.8.0' 133 | react-dom: '>=16.8.0' 134 | 135 | '@dnd-kit/sortable@8.0.0': 136 | resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} 137 | peerDependencies: 138 | '@dnd-kit/core': ^6.1.0 139 | react: '>=16.8.0' 140 | 141 | '@dnd-kit/utilities@3.2.2': 142 | resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} 143 | peerDependencies: 144 | react: '>=16.8.0' 145 | 146 | '@esbuild/android-arm64@0.18.20': 147 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 148 | engines: {node: '>=12'} 149 | cpu: [arm64] 150 | os: [android] 151 | 152 | '@esbuild/android-arm@0.18.20': 153 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 154 | engines: {node: '>=12'} 155 | cpu: [arm] 156 | os: [android] 157 | 158 | '@esbuild/android-x64@0.18.20': 159 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 160 | engines: {node: '>=12'} 161 | cpu: [x64] 162 | os: [android] 163 | 164 | '@esbuild/darwin-arm64@0.18.20': 165 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 166 | engines: {node: '>=12'} 167 | cpu: [arm64] 168 | os: [darwin] 169 | 170 | '@esbuild/darwin-x64@0.18.20': 171 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 172 | engines: {node: '>=12'} 173 | cpu: [x64] 174 | os: [darwin] 175 | 176 | '@esbuild/freebsd-arm64@0.18.20': 177 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 178 | engines: {node: '>=12'} 179 | cpu: [arm64] 180 | os: [freebsd] 181 | 182 | '@esbuild/freebsd-x64@0.18.20': 183 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 184 | engines: {node: '>=12'} 185 | cpu: [x64] 186 | os: [freebsd] 187 | 188 | '@esbuild/linux-arm64@0.18.20': 189 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 190 | engines: {node: '>=12'} 191 | cpu: [arm64] 192 | os: [linux] 193 | 194 | '@esbuild/linux-arm@0.18.20': 195 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 196 | engines: {node: '>=12'} 197 | cpu: [arm] 198 | os: [linux] 199 | 200 | '@esbuild/linux-ia32@0.18.20': 201 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 202 | engines: {node: '>=12'} 203 | cpu: [ia32] 204 | os: [linux] 205 | 206 | '@esbuild/linux-loong64@0.18.20': 207 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 208 | engines: {node: '>=12'} 209 | cpu: [loong64] 210 | os: [linux] 211 | 212 | '@esbuild/linux-mips64el@0.18.20': 213 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 214 | engines: {node: '>=12'} 215 | cpu: [mips64el] 216 | os: [linux] 217 | 218 | '@esbuild/linux-ppc64@0.18.20': 219 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 220 | engines: {node: '>=12'} 221 | cpu: [ppc64] 222 | os: [linux] 223 | 224 | '@esbuild/linux-riscv64@0.18.20': 225 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 226 | engines: {node: '>=12'} 227 | cpu: [riscv64] 228 | os: [linux] 229 | 230 | '@esbuild/linux-s390x@0.18.20': 231 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 232 | engines: {node: '>=12'} 233 | cpu: [s390x] 234 | os: [linux] 235 | 236 | '@esbuild/linux-x64@0.18.20': 237 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [linux] 241 | 242 | '@esbuild/netbsd-x64@0.18.20': 243 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 244 | engines: {node: '>=12'} 245 | cpu: [x64] 246 | os: [netbsd] 247 | 248 | '@esbuild/openbsd-x64@0.18.20': 249 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 250 | engines: {node: '>=12'} 251 | cpu: [x64] 252 | os: [openbsd] 253 | 254 | '@esbuild/sunos-x64@0.18.20': 255 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [sunos] 259 | 260 | '@esbuild/win32-arm64@0.18.20': 261 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 262 | engines: {node: '>=12'} 263 | cpu: [arm64] 264 | os: [win32] 265 | 266 | '@esbuild/win32-ia32@0.18.20': 267 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 268 | engines: {node: '>=12'} 269 | cpu: [ia32] 270 | os: [win32] 271 | 272 | '@esbuild/win32-x64@0.18.20': 273 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 274 | engines: {node: '>=12'} 275 | cpu: [x64] 276 | os: [win32] 277 | 278 | '@eslint-community/eslint-utils@4.4.0': 279 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 280 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 281 | peerDependencies: 282 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 283 | 284 | '@eslint-community/regexpp@4.11.0': 285 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 286 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 287 | 288 | '@eslint/eslintrc@2.1.4': 289 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 290 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 291 | 292 | '@eslint/js@8.57.0': 293 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 294 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 295 | 296 | '@eslint/js@9.8.0': 297 | resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} 298 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 299 | 300 | '@floating-ui/core@1.6.7': 301 | resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} 302 | 303 | '@floating-ui/dom@1.6.10': 304 | resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} 305 | 306 | '@floating-ui/react-dom@2.1.1': 307 | resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} 308 | peerDependencies: 309 | react: '>=16.8.0' 310 | react-dom: '>=16.8.0' 311 | 312 | '@floating-ui/react@0.26.23': 313 | resolution: {integrity: sha512-9u3i62fV0CFF3nIegiWiRDwOs7OW/KhSUJDNx2MkQM3LbE5zQOY01sL3nelcVBXvX7Ovvo3A49I8ql+20Wg/Hw==} 314 | peerDependencies: 315 | react: '>=16.8.0' 316 | react-dom: '>=16.8.0' 317 | 318 | '@floating-ui/utils@0.2.7': 319 | resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} 320 | 321 | '@humanwhocodes/config-array@0.11.14': 322 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 323 | engines: {node: '>=10.10.0'} 324 | deprecated: Use @eslint/config-array instead 325 | 326 | '@humanwhocodes/module-importer@1.0.1': 327 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 328 | engines: {node: '>=12.22'} 329 | 330 | '@humanwhocodes/object-schema@2.0.3': 331 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 332 | deprecated: Use @eslint/object-schema instead 333 | 334 | '@logseq/libs@0.0.15': 335 | resolution: {integrity: sha512-Z4YrYGfu8Y3s9LTqVnPGkxlO+KZtP1YalH/A63zYgxP61cV5QtKlnHWNcjsKxsD5CkaSL4MlSN4mf7wNx/Fm0A==} 336 | 337 | '@mantine/core@7.12.2': 338 | resolution: {integrity: sha512-FrMHOKq4s3CiPIxqZ9xnVX7H4PEGNmbtHMvWO/0YlfPgoV0Er/N/DNJOFW1ys4WSnidPTayYeB41riyxxGOpRQ==} 339 | peerDependencies: 340 | '@mantine/hooks': 7.12.2 341 | react: ^18.2.0 342 | react-dom: ^18.2.0 343 | 344 | '@mantine/hooks@7.12.2': 345 | resolution: {integrity: sha512-dVMw8jpM0hAzc8e7/GNvzkk9N0RN/m+PKycETB3H6lJGuXJJSRR4wzzgQKpEhHwPccktDpvb4rkukKDq2jA8Fg==} 346 | peerDependencies: 347 | react: ^18.2.0 348 | 349 | '@nodelib/fs.scandir@2.1.5': 350 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 351 | engines: {node: '>= 8'} 352 | 353 | '@nodelib/fs.stat@2.0.5': 354 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 355 | engines: {node: '>= 8'} 356 | 357 | '@nodelib/fs.walk@1.2.8': 358 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 359 | engines: {node: '>= 8'} 360 | 361 | '@pkgr/core@0.1.1': 362 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 363 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 364 | 365 | '@types/eslint-config-prettier@6.11.3': 366 | resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} 367 | 368 | '@types/eslint@8.56.11': 369 | resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} 370 | 371 | '@types/eslint__js@8.42.3': 372 | resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} 373 | 374 | '@types/estree@1.0.5': 375 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 376 | 377 | '@types/json-schema@7.0.15': 378 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 379 | 380 | '@types/node@20.14.14': 381 | resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} 382 | 383 | '@types/prop-types@15.7.12': 384 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 385 | 386 | '@types/react-dom@18.3.0': 387 | resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 388 | 389 | '@types/react@18.3.3': 390 | resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} 391 | 392 | '@types/semver@7.5.8': 393 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 394 | 395 | '@typescript-eslint/eslint-plugin@6.21.0': 396 | resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} 397 | engines: {node: ^16.0.0 || >=18.0.0} 398 | peerDependencies: 399 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 400 | eslint: ^7.0.0 || ^8.0.0 401 | typescript: '*' 402 | peerDependenciesMeta: 403 | typescript: 404 | optional: true 405 | 406 | '@typescript-eslint/eslint-plugin@7.18.0': 407 | resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} 408 | engines: {node: ^18.18.0 || >=20.0.0} 409 | peerDependencies: 410 | '@typescript-eslint/parser': ^7.0.0 411 | eslint: ^8.56.0 412 | typescript: '*' 413 | peerDependenciesMeta: 414 | typescript: 415 | optional: true 416 | 417 | '@typescript-eslint/parser@6.21.0': 418 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 419 | engines: {node: ^16.0.0 || >=18.0.0} 420 | peerDependencies: 421 | eslint: ^7.0.0 || ^8.0.0 422 | typescript: '*' 423 | peerDependenciesMeta: 424 | typescript: 425 | optional: true 426 | 427 | '@typescript-eslint/parser@7.18.0': 428 | resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} 429 | engines: {node: ^18.18.0 || >=20.0.0} 430 | peerDependencies: 431 | eslint: ^8.56.0 432 | typescript: '*' 433 | peerDependenciesMeta: 434 | typescript: 435 | optional: true 436 | 437 | '@typescript-eslint/scope-manager@6.21.0': 438 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 439 | engines: {node: ^16.0.0 || >=18.0.0} 440 | 441 | '@typescript-eslint/scope-manager@7.18.0': 442 | resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} 443 | engines: {node: ^18.18.0 || >=20.0.0} 444 | 445 | '@typescript-eslint/type-utils@6.21.0': 446 | resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} 447 | engines: {node: ^16.0.0 || >=18.0.0} 448 | peerDependencies: 449 | eslint: ^7.0.0 || ^8.0.0 450 | typescript: '*' 451 | peerDependenciesMeta: 452 | typescript: 453 | optional: true 454 | 455 | '@typescript-eslint/type-utils@7.18.0': 456 | resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} 457 | engines: {node: ^18.18.0 || >=20.0.0} 458 | peerDependencies: 459 | eslint: ^8.56.0 460 | typescript: '*' 461 | peerDependenciesMeta: 462 | typescript: 463 | optional: true 464 | 465 | '@typescript-eslint/types@6.21.0': 466 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 467 | engines: {node: ^16.0.0 || >=18.0.0} 468 | 469 | '@typescript-eslint/types@7.18.0': 470 | resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} 471 | engines: {node: ^18.18.0 || >=20.0.0} 472 | 473 | '@typescript-eslint/typescript-estree@6.21.0': 474 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 475 | engines: {node: ^16.0.0 || >=18.0.0} 476 | peerDependencies: 477 | typescript: '*' 478 | peerDependenciesMeta: 479 | typescript: 480 | optional: true 481 | 482 | '@typescript-eslint/typescript-estree@7.18.0': 483 | resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} 484 | engines: {node: ^18.18.0 || >=20.0.0} 485 | peerDependencies: 486 | typescript: '*' 487 | peerDependenciesMeta: 488 | typescript: 489 | optional: true 490 | 491 | '@typescript-eslint/utils@6.21.0': 492 | resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} 493 | engines: {node: ^16.0.0 || >=18.0.0} 494 | peerDependencies: 495 | eslint: ^7.0.0 || ^8.0.0 496 | 497 | '@typescript-eslint/utils@7.18.0': 498 | resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} 499 | engines: {node: ^18.18.0 || >=20.0.0} 500 | peerDependencies: 501 | eslint: ^8.56.0 502 | 503 | '@typescript-eslint/visitor-keys@6.21.0': 504 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 505 | engines: {node: ^16.0.0 || >=18.0.0} 506 | 507 | '@typescript-eslint/visitor-keys@7.18.0': 508 | resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} 509 | engines: {node: ^18.18.0 || >=20.0.0} 510 | 511 | '@ungap/structured-clone@1.2.0': 512 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 513 | 514 | acorn-jsx@5.3.2: 515 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 516 | peerDependencies: 517 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 518 | 519 | acorn@8.12.1: 520 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 521 | engines: {node: '>=0.4.0'} 522 | hasBin: true 523 | 524 | ajv@6.12.6: 525 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 526 | 527 | ansi-regex@5.0.1: 528 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 529 | engines: {node: '>=8'} 530 | 531 | ansi-styles@4.3.0: 532 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 533 | engines: {node: '>=8'} 534 | 535 | argparse@2.0.1: 536 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 537 | 538 | array-union@2.1.0: 539 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 540 | engines: {node: '>=8'} 541 | 542 | balanced-match@1.0.2: 543 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 544 | 545 | brace-expansion@1.1.11: 546 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 547 | 548 | brace-expansion@2.0.1: 549 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 550 | 551 | braces@3.0.3: 552 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 553 | engines: {node: '>=8'} 554 | 555 | callsites@3.1.0: 556 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 557 | engines: {node: '>=6'} 558 | 559 | camelcase-css@2.0.1: 560 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 561 | engines: {node: '>= 6'} 562 | 563 | chalk@4.1.2: 564 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 565 | engines: {node: '>=10'} 566 | 567 | clsx@2.1.1: 568 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 569 | engines: {node: '>=6'} 570 | 571 | color-convert@2.0.1: 572 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 573 | engines: {node: '>=7.0.0'} 574 | 575 | color-name@1.1.4: 576 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 577 | 578 | concat-map@0.0.1: 579 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 580 | 581 | cross-spawn@7.0.3: 582 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 583 | engines: {node: '>= 8'} 584 | 585 | cssesc@3.0.0: 586 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 587 | engines: {node: '>=4'} 588 | hasBin: true 589 | 590 | csstype@3.1.0: 591 | resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} 592 | 593 | csstype@3.1.3: 594 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 595 | 596 | date-fns@2.30.0: 597 | resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} 598 | engines: {node: '>=0.11'} 599 | 600 | date-fns@3.6.0: 601 | resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} 602 | 603 | debug@4.3.4: 604 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 605 | engines: {node: '>=6.0'} 606 | peerDependencies: 607 | supports-color: '*' 608 | peerDependenciesMeta: 609 | supports-color: 610 | optional: true 611 | 612 | debug@4.3.6: 613 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 614 | engines: {node: '>=6.0'} 615 | peerDependencies: 616 | supports-color: '*' 617 | peerDependenciesMeta: 618 | supports-color: 619 | optional: true 620 | 621 | deep-is@0.1.4: 622 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 623 | 624 | detect-node-es@1.1.0: 625 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} 626 | 627 | dir-glob@3.0.1: 628 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 629 | engines: {node: '>=8'} 630 | 631 | doctrine@3.0.0: 632 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 633 | engines: {node: '>=6.0.0'} 634 | 635 | dompurify@2.3.8: 636 | resolution: {integrity: sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==} 637 | 638 | dot-case@3.0.4: 639 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 640 | 641 | esbuild@0.18.20: 642 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 643 | engines: {node: '>=12'} 644 | hasBin: true 645 | 646 | escape-string-regexp@4.0.0: 647 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 648 | engines: {node: '>=10'} 649 | 650 | eslint-config-prettier@9.1.0: 651 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 652 | hasBin: true 653 | peerDependencies: 654 | eslint: '>=7.0.0' 655 | 656 | eslint-plugin-prettier@5.2.1: 657 | resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} 658 | engines: {node: ^14.18.0 || >=16.0.0} 659 | peerDependencies: 660 | '@types/eslint': '>=8.0.0' 661 | eslint: '>=8.0.0' 662 | eslint-config-prettier: '*' 663 | prettier: '>=3.0.0' 664 | peerDependenciesMeta: 665 | '@types/eslint': 666 | optional: true 667 | eslint-config-prettier: 668 | optional: true 669 | 670 | eslint-plugin-simple-import-sort@12.1.1: 671 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 672 | peerDependencies: 673 | eslint: '>=5.0.0' 674 | 675 | eslint-scope@7.2.2: 676 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 677 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 678 | 679 | eslint-visitor-keys@3.4.3: 680 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 681 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 682 | 683 | eslint@8.57.0: 684 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 685 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 686 | hasBin: true 687 | 688 | espree@9.6.1: 689 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 690 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 691 | 692 | esquery@1.6.0: 693 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 694 | engines: {node: '>=0.10'} 695 | 696 | esrecurse@4.3.0: 697 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 698 | engines: {node: '>=4.0'} 699 | 700 | estraverse@5.3.0: 701 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 702 | engines: {node: '>=4.0'} 703 | 704 | esutils@2.0.3: 705 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 706 | engines: {node: '>=0.10.0'} 707 | 708 | eventemitter3@4.0.7: 709 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 710 | 711 | fast-deep-equal@3.1.3: 712 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 713 | 714 | fast-diff@1.3.0: 715 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 716 | 717 | fast-glob@3.3.2: 718 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 719 | engines: {node: '>=8.6.0'} 720 | 721 | fast-json-stable-stringify@2.1.0: 722 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 723 | 724 | fast-levenshtein@2.0.6: 725 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 726 | 727 | fastq@1.17.1: 728 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 729 | 730 | file-entry-cache@6.0.1: 731 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 732 | engines: {node: ^10.12.0 || >=12.0.0} 733 | 734 | fill-range@7.1.1: 735 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 736 | engines: {node: '>=8'} 737 | 738 | find-up@5.0.0: 739 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 740 | engines: {node: '>=10'} 741 | 742 | flat-cache@3.2.0: 743 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 744 | engines: {node: ^10.12.0 || >=12.0.0} 745 | 746 | flatted@3.3.1: 747 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 748 | 749 | fs.realpath@1.0.0: 750 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 751 | 752 | fsevents@2.3.3: 753 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 754 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 755 | os: [darwin] 756 | 757 | get-nonce@1.0.1: 758 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} 759 | engines: {node: '>=6'} 760 | 761 | glob-parent@5.1.2: 762 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 763 | engines: {node: '>= 6'} 764 | 765 | glob-parent@6.0.2: 766 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 767 | engines: {node: '>=10.13.0'} 768 | 769 | glob@7.2.3: 770 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 771 | deprecated: Glob versions prior to v9 are no longer supported 772 | 773 | globals@13.24.0: 774 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 775 | engines: {node: '>=8'} 776 | 777 | globby@11.1.0: 778 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 779 | engines: {node: '>=10'} 780 | 781 | globrex@0.1.2: 782 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 783 | 784 | graphemer@1.4.0: 785 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 786 | 787 | has-flag@4.0.0: 788 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 789 | engines: {node: '>=8'} 790 | 791 | husky@9.1.5: 792 | resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} 793 | engines: {node: '>=18'} 794 | hasBin: true 795 | 796 | ignore@5.3.1: 797 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 798 | engines: {node: '>= 4'} 799 | 800 | import-fresh@3.3.0: 801 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 802 | engines: {node: '>=6'} 803 | 804 | imurmurhash@0.1.4: 805 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 806 | engines: {node: '>=0.8.19'} 807 | 808 | inflight@1.0.6: 809 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 810 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 811 | 812 | inherits@2.0.3: 813 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 814 | 815 | inherits@2.0.4: 816 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 817 | 818 | invariant@2.2.4: 819 | resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} 820 | 821 | is-extglob@2.1.1: 822 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 823 | engines: {node: '>=0.10.0'} 824 | 825 | is-glob@4.0.3: 826 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 827 | engines: {node: '>=0.10.0'} 828 | 829 | is-number@7.0.0: 830 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 831 | engines: {node: '>=0.12.0'} 832 | 833 | is-path-inside@3.0.3: 834 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 835 | engines: {node: '>=8'} 836 | 837 | isexe@2.0.0: 838 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 839 | 840 | js-tokens@4.0.0: 841 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 842 | 843 | js-yaml@4.1.0: 844 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 845 | hasBin: true 846 | 847 | json-buffer@3.0.1: 848 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 849 | 850 | json-schema-traverse@0.4.1: 851 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 852 | 853 | json-stable-stringify-without-jsonify@1.0.1: 854 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 855 | 856 | keyv@4.5.4: 857 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 858 | 859 | levn@0.4.1: 860 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 861 | engines: {node: '>= 0.8.0'} 862 | 863 | locate-path@6.0.0: 864 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 865 | engines: {node: '>=10'} 866 | 867 | lodash-es@4.17.21: 868 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 869 | 870 | lodash.merge@4.6.2: 871 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 872 | 873 | logseq-dateutils@2.1.2: 874 | resolution: {integrity: sha512-N4WD6VynVC+rMQr4+BSLu/bvLhYnLc9/DBjNASIZroC0Rf7Ymwxm/G84unVxVi6iR7Y21T/4UhJEEtzfIIOQaw==} 875 | engines: {node: '>=12'} 876 | 877 | loose-envify@1.4.0: 878 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 879 | hasBin: true 880 | 881 | lower-case@2.0.2: 882 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 883 | 884 | lucide-react@0.437.0: 885 | resolution: {integrity: sha512-RXQq6tnm1FlXDUtOwLaoXET2TOEGpQULrQlPOjGHgIVsPhicHNat9sWF33OAe2UCLMFiWF1oL+FtAg43BqVY4Q==} 886 | peerDependencies: 887 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc 888 | 889 | magic-string@0.26.7: 890 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 891 | engines: {node: '>=12'} 892 | 893 | merge2@1.4.1: 894 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 895 | engines: {node: '>= 8'} 896 | 897 | micromatch@4.0.7: 898 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 899 | engines: {node: '>=8.6'} 900 | 901 | minimatch@3.1.2: 902 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 903 | 904 | minimatch@9.0.3: 905 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 906 | engines: {node: '>=16 || 14 >=14.17'} 907 | 908 | minimatch@9.0.5: 909 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 910 | engines: {node: '>=16 || 14 >=14.17'} 911 | 912 | ms@2.1.2: 913 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 914 | 915 | nanoid@3.3.7: 916 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 917 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 918 | hasBin: true 919 | 920 | natural-compare@1.4.0: 921 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 922 | 923 | no-case@3.0.4: 924 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 925 | 926 | once@1.4.0: 927 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 928 | 929 | optionator@0.9.4: 930 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 931 | engines: {node: '>= 0.8.0'} 932 | 933 | p-limit@3.1.0: 934 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 935 | engines: {node: '>=10'} 936 | 937 | p-locate@5.0.0: 938 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 939 | engines: {node: '>=10'} 940 | 941 | parent-module@1.0.1: 942 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 943 | engines: {node: '>=6'} 944 | 945 | path-exists@4.0.0: 946 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 947 | engines: {node: '>=8'} 948 | 949 | path-is-absolute@1.0.1: 950 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 951 | engines: {node: '>=0.10.0'} 952 | 953 | path-key@3.1.1: 954 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 955 | engines: {node: '>=8'} 956 | 957 | path-type@4.0.0: 958 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 959 | engines: {node: '>=8'} 960 | 961 | path@0.12.7: 962 | resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} 963 | 964 | picocolors@1.0.1: 965 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 966 | 967 | picomatch@2.3.1: 968 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 969 | engines: {node: '>=8.6'} 970 | 971 | postcss-js@4.0.1: 972 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 973 | engines: {node: ^12 || ^14 || >= 16} 974 | peerDependencies: 975 | postcss: ^8.4.21 976 | 977 | postcss-mixins@9.0.4: 978 | resolution: {integrity: sha512-XVq5jwQJDRu5M1XGkdpgASqLk37OqkH4JCFDXl/Dn7janOJjCTEKL+36cnRVy7bMtoBzALfO7bV7nTIsFnUWLA==} 979 | engines: {node: '>=14.0'} 980 | peerDependencies: 981 | postcss: ^8.2.14 982 | 983 | postcss-nested@6.2.0: 984 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 985 | engines: {node: '>=12.0'} 986 | peerDependencies: 987 | postcss: ^8.2.14 988 | 989 | postcss-preset-mantine@1.17.0: 990 | resolution: {integrity: sha512-ji1PMDBUf2Vsx/HE5faMSs1+ff6qE6YRulTr4Ja+6HD3gop8rSMTCYdpN7KrdsEg079kfBKkO/PaKhG9uR0zwQ==} 991 | peerDependencies: 992 | postcss: '>=8.0.0' 993 | 994 | postcss-selector-parser@6.1.2: 995 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 996 | engines: {node: '>=4'} 997 | 998 | postcss-simple-vars@7.0.1: 999 | resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} 1000 | engines: {node: '>=14.0'} 1001 | peerDependencies: 1002 | postcss: ^8.2.1 1003 | 1004 | postcss@8.4.42: 1005 | resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==} 1006 | engines: {node: ^10 || ^12 || >=14} 1007 | 1008 | prelude-ls@1.2.1: 1009 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1010 | engines: {node: '>= 0.8.0'} 1011 | 1012 | prettier-linter-helpers@1.0.0: 1013 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 1014 | engines: {node: '>=6.0.0'} 1015 | 1016 | prettier@3.3.3: 1017 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1018 | engines: {node: '>=14'} 1019 | hasBin: true 1020 | 1021 | process@0.11.10: 1022 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1023 | engines: {node: '>= 0.6.0'} 1024 | 1025 | punycode@2.3.1: 1026 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1027 | engines: {node: '>=6'} 1028 | 1029 | queue-microtask@1.2.3: 1030 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1031 | 1032 | react-dom@18.3.1: 1033 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 1034 | peerDependencies: 1035 | react: ^18.3.1 1036 | 1037 | react-hook-form@7.52.2: 1038 | resolution: {integrity: sha512-pqfPEbERnxxiNMPd0bzmt1tuaPcVccywFDpyk2uV5xCIBphHV5T8SVnX9/o3kplPE1zzKt77+YIoq+EMwJp56A==} 1039 | engines: {node: '>=18.0.0'} 1040 | peerDependencies: 1041 | react: ^16.8.0 || ^17 || ^18 || ^19 1042 | 1043 | react-number-format@5.4.1: 1044 | resolution: {integrity: sha512-NICOjo/70dcAiwVmH6zMWoZrTQDlBrEXV/f7S0t/ewlpzp4z00pasg5G1yBX6NHLafwOF3QZ+VvK/XApwSKxdA==} 1045 | peerDependencies: 1046 | react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 1047 | react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 1048 | 1049 | react-remove-scroll-bar@2.3.6: 1050 | resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} 1051 | engines: {node: '>=10'} 1052 | peerDependencies: 1053 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1054 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1055 | peerDependenciesMeta: 1056 | '@types/react': 1057 | optional: true 1058 | 1059 | react-remove-scroll@2.5.10: 1060 | resolution: {integrity: sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==} 1061 | engines: {node: '>=10'} 1062 | peerDependencies: 1063 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1064 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1065 | peerDependenciesMeta: 1066 | '@types/react': 1067 | optional: true 1068 | 1069 | react-style-singleton@2.2.1: 1070 | resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} 1071 | engines: {node: '>=10'} 1072 | peerDependencies: 1073 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1074 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1075 | peerDependenciesMeta: 1076 | '@types/react': 1077 | optional: true 1078 | 1079 | react-textarea-autosize@8.5.3: 1080 | resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} 1081 | engines: {node: '>=10'} 1082 | peerDependencies: 1083 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1084 | 1085 | react@18.3.1: 1086 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 1087 | engines: {node: '>=0.10.0'} 1088 | 1089 | regenerator-runtime@0.14.1: 1090 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1091 | 1092 | resolve-from@4.0.0: 1093 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1094 | engines: {node: '>=4'} 1095 | 1096 | reusify@1.0.4: 1097 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1098 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1099 | 1100 | rimraf@3.0.2: 1101 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1102 | deprecated: Rimraf versions prior to v4 are no longer supported 1103 | hasBin: true 1104 | 1105 | rollup@3.29.4: 1106 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 1107 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1108 | hasBin: true 1109 | 1110 | run-parallel@1.2.0: 1111 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1112 | 1113 | scheduler@0.23.2: 1114 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 1115 | 1116 | semver@7.6.3: 1117 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1118 | engines: {node: '>=10'} 1119 | hasBin: true 1120 | 1121 | shebang-command@2.0.0: 1122 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1123 | engines: {node: '>=8'} 1124 | 1125 | shebang-regex@3.0.0: 1126 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1127 | engines: {node: '>=8'} 1128 | 1129 | slash@3.0.0: 1130 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1131 | engines: {node: '>=8'} 1132 | 1133 | snake-case@3.0.4: 1134 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 1135 | 1136 | source-map-js@1.2.0: 1137 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1138 | engines: {node: '>=0.10.0'} 1139 | 1140 | sourcemap-codec@1.4.8: 1141 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1142 | deprecated: Please use @jridgewell/sourcemap-codec instead 1143 | 1144 | strip-ansi@6.0.1: 1145 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1146 | engines: {node: '>=8'} 1147 | 1148 | strip-json-comments@3.1.1: 1149 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1150 | engines: {node: '>=8'} 1151 | 1152 | sugarss@4.0.1: 1153 | resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} 1154 | engines: {node: '>=12.0'} 1155 | peerDependencies: 1156 | postcss: ^8.3.3 1157 | 1158 | supports-color@7.2.0: 1159 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1160 | engines: {node: '>=8'} 1161 | 1162 | synckit@0.9.1: 1163 | resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} 1164 | engines: {node: ^14.18.0 || >=16.0.0} 1165 | 1166 | tabbable@6.2.0: 1167 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 1168 | 1169 | text-table@0.2.0: 1170 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1171 | 1172 | to-regex-range@5.0.1: 1173 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1174 | engines: {node: '>=8.0'} 1175 | 1176 | ts-api-utils@1.3.0: 1177 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1178 | engines: {node: '>=16'} 1179 | peerDependencies: 1180 | typescript: '>=4.2.0' 1181 | 1182 | tsconfck@3.1.1: 1183 | resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} 1184 | engines: {node: ^18 || >=20} 1185 | hasBin: true 1186 | peerDependencies: 1187 | typescript: ^5.0.0 1188 | peerDependenciesMeta: 1189 | typescript: 1190 | optional: true 1191 | 1192 | tslib@2.6.3: 1193 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 1194 | 1195 | type-check@0.4.0: 1196 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1197 | engines: {node: '>= 0.8.0'} 1198 | 1199 | type-fest@0.20.2: 1200 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1201 | engines: {node: '>=10'} 1202 | 1203 | type-fest@4.26.0: 1204 | resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} 1205 | engines: {node: '>=16'} 1206 | 1207 | typescript-eslint@7.18.0: 1208 | resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} 1209 | engines: {node: ^18.18.0 || >=20.0.0} 1210 | peerDependencies: 1211 | eslint: ^8.56.0 1212 | typescript: '*' 1213 | peerDependenciesMeta: 1214 | typescript: 1215 | optional: true 1216 | 1217 | typescript@5.5.4: 1218 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 1219 | engines: {node: '>=14.17'} 1220 | hasBin: true 1221 | 1222 | undici-types@5.26.5: 1223 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1224 | 1225 | uri-js@4.4.1: 1226 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1227 | 1228 | use-callback-ref@1.3.2: 1229 | resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} 1230 | engines: {node: '>=10'} 1231 | peerDependencies: 1232 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1233 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1234 | peerDependenciesMeta: 1235 | '@types/react': 1236 | optional: true 1237 | 1238 | use-composed-ref@1.3.0: 1239 | resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} 1240 | peerDependencies: 1241 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1242 | 1243 | use-isomorphic-layout-effect@1.1.2: 1244 | resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} 1245 | peerDependencies: 1246 | '@types/react': '*' 1247 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1248 | peerDependenciesMeta: 1249 | '@types/react': 1250 | optional: true 1251 | 1252 | use-latest@1.2.1: 1253 | resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} 1254 | peerDependencies: 1255 | '@types/react': '*' 1256 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1257 | peerDependenciesMeta: 1258 | '@types/react': 1259 | optional: true 1260 | 1261 | use-sidecar@1.1.2: 1262 | resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} 1263 | engines: {node: '>=10'} 1264 | peerDependencies: 1265 | '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 1266 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1267 | peerDependenciesMeta: 1268 | '@types/react': 1269 | optional: true 1270 | 1271 | util-deprecate@1.0.2: 1272 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1273 | 1274 | util@0.10.4: 1275 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 1276 | 1277 | vite-plugin-logseq@1.1.2: 1278 | resolution: {integrity: sha512-l5YvoH3K25Zx9eqgoJFug7NfVqSPwq7/FcYYhN1TkdG8ZOiD+c+TAwdCS2dJbGgvx8GmSpbgwSZWgslB+wH53g==} 1279 | 1280 | vite-tsconfig-paths@4.3.2: 1281 | resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} 1282 | peerDependencies: 1283 | vite: '*' 1284 | peerDependenciesMeta: 1285 | vite: 1286 | optional: true 1287 | 1288 | vite@4.5.3: 1289 | resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} 1290 | engines: {node: ^14.18.0 || >=16.0.0} 1291 | hasBin: true 1292 | peerDependencies: 1293 | '@types/node': '>= 14' 1294 | less: '*' 1295 | lightningcss: ^1.21.0 1296 | sass: '*' 1297 | stylus: '*' 1298 | sugarss: '*' 1299 | terser: ^5.4.0 1300 | peerDependenciesMeta: 1301 | '@types/node': 1302 | optional: true 1303 | less: 1304 | optional: true 1305 | lightningcss: 1306 | optional: true 1307 | sass: 1308 | optional: true 1309 | stylus: 1310 | optional: true 1311 | sugarss: 1312 | optional: true 1313 | terser: 1314 | optional: true 1315 | 1316 | which@2.0.2: 1317 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1318 | engines: {node: '>= 8'} 1319 | hasBin: true 1320 | 1321 | word-wrap@1.2.5: 1322 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1323 | engines: {node: '>=0.10.0'} 1324 | 1325 | wrappy@1.0.2: 1326 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1327 | 1328 | yocto-queue@0.1.0: 1329 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1330 | engines: {node: '>=10'} 1331 | 1332 | snapshots: 1333 | 1334 | '@babel/runtime@7.25.0': 1335 | dependencies: 1336 | regenerator-runtime: 0.14.1 1337 | 1338 | '@dnd-kit/accessibility@3.1.0(react@18.3.1)': 1339 | dependencies: 1340 | react: 18.3.1 1341 | tslib: 2.6.3 1342 | 1343 | '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1344 | dependencies: 1345 | '@dnd-kit/accessibility': 3.1.0(react@18.3.1) 1346 | '@dnd-kit/utilities': 3.2.2(react@18.3.1) 1347 | react: 18.3.1 1348 | react-dom: 18.3.1(react@18.3.1) 1349 | tslib: 2.6.3 1350 | 1351 | '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': 1352 | dependencies: 1353 | '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1354 | '@dnd-kit/utilities': 3.2.2(react@18.3.1) 1355 | react: 18.3.1 1356 | tslib: 2.6.3 1357 | 1358 | '@dnd-kit/utilities@3.2.2(react@18.3.1)': 1359 | dependencies: 1360 | react: 18.3.1 1361 | tslib: 2.6.3 1362 | 1363 | '@esbuild/android-arm64@0.18.20': 1364 | optional: true 1365 | 1366 | '@esbuild/android-arm@0.18.20': 1367 | optional: true 1368 | 1369 | '@esbuild/android-x64@0.18.20': 1370 | optional: true 1371 | 1372 | '@esbuild/darwin-arm64@0.18.20': 1373 | optional: true 1374 | 1375 | '@esbuild/darwin-x64@0.18.20': 1376 | optional: true 1377 | 1378 | '@esbuild/freebsd-arm64@0.18.20': 1379 | optional: true 1380 | 1381 | '@esbuild/freebsd-x64@0.18.20': 1382 | optional: true 1383 | 1384 | '@esbuild/linux-arm64@0.18.20': 1385 | optional: true 1386 | 1387 | '@esbuild/linux-arm@0.18.20': 1388 | optional: true 1389 | 1390 | '@esbuild/linux-ia32@0.18.20': 1391 | optional: true 1392 | 1393 | '@esbuild/linux-loong64@0.18.20': 1394 | optional: true 1395 | 1396 | '@esbuild/linux-mips64el@0.18.20': 1397 | optional: true 1398 | 1399 | '@esbuild/linux-ppc64@0.18.20': 1400 | optional: true 1401 | 1402 | '@esbuild/linux-riscv64@0.18.20': 1403 | optional: true 1404 | 1405 | '@esbuild/linux-s390x@0.18.20': 1406 | optional: true 1407 | 1408 | '@esbuild/linux-x64@0.18.20': 1409 | optional: true 1410 | 1411 | '@esbuild/netbsd-x64@0.18.20': 1412 | optional: true 1413 | 1414 | '@esbuild/openbsd-x64@0.18.20': 1415 | optional: true 1416 | 1417 | '@esbuild/sunos-x64@0.18.20': 1418 | optional: true 1419 | 1420 | '@esbuild/win32-arm64@0.18.20': 1421 | optional: true 1422 | 1423 | '@esbuild/win32-ia32@0.18.20': 1424 | optional: true 1425 | 1426 | '@esbuild/win32-x64@0.18.20': 1427 | optional: true 1428 | 1429 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': 1430 | dependencies: 1431 | eslint: 8.57.0 1432 | eslint-visitor-keys: 3.4.3 1433 | 1434 | '@eslint-community/regexpp@4.11.0': {} 1435 | 1436 | '@eslint/eslintrc@2.1.4': 1437 | dependencies: 1438 | ajv: 6.12.6 1439 | debug: 4.3.6 1440 | espree: 9.6.1 1441 | globals: 13.24.0 1442 | ignore: 5.3.1 1443 | import-fresh: 3.3.0 1444 | js-yaml: 4.1.0 1445 | minimatch: 3.1.2 1446 | strip-json-comments: 3.1.1 1447 | transitivePeerDependencies: 1448 | - supports-color 1449 | 1450 | '@eslint/js@8.57.0': {} 1451 | 1452 | '@eslint/js@9.8.0': {} 1453 | 1454 | '@floating-ui/core@1.6.7': 1455 | dependencies: 1456 | '@floating-ui/utils': 0.2.7 1457 | 1458 | '@floating-ui/dom@1.6.10': 1459 | dependencies: 1460 | '@floating-ui/core': 1.6.7 1461 | '@floating-ui/utils': 0.2.7 1462 | 1463 | '@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1464 | dependencies: 1465 | '@floating-ui/dom': 1.6.10 1466 | react: 18.3.1 1467 | react-dom: 18.3.1(react@18.3.1) 1468 | 1469 | '@floating-ui/react@0.26.23(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1470 | dependencies: 1471 | '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1472 | '@floating-ui/utils': 0.2.7 1473 | react: 18.3.1 1474 | react-dom: 18.3.1(react@18.3.1) 1475 | tabbable: 6.2.0 1476 | 1477 | '@floating-ui/utils@0.2.7': {} 1478 | 1479 | '@humanwhocodes/config-array@0.11.14': 1480 | dependencies: 1481 | '@humanwhocodes/object-schema': 2.0.3 1482 | debug: 4.3.6 1483 | minimatch: 3.1.2 1484 | transitivePeerDependencies: 1485 | - supports-color 1486 | 1487 | '@humanwhocodes/module-importer@1.0.1': {} 1488 | 1489 | '@humanwhocodes/object-schema@2.0.3': {} 1490 | 1491 | '@logseq/libs@0.0.15': 1492 | dependencies: 1493 | csstype: 3.1.0 1494 | debug: 4.3.4 1495 | dompurify: 2.3.8 1496 | eventemitter3: 4.0.7 1497 | fast-deep-equal: 3.1.3 1498 | lodash-es: 4.17.21 1499 | path: 0.12.7 1500 | snake-case: 3.0.4 1501 | transitivePeerDependencies: 1502 | - supports-color 1503 | 1504 | '@mantine/core@7.12.2(@mantine/hooks@7.12.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1505 | dependencies: 1506 | '@floating-ui/react': 0.26.23(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1507 | '@mantine/hooks': 7.12.2(react@18.3.1) 1508 | clsx: 2.1.1 1509 | react: 18.3.1 1510 | react-dom: 18.3.1(react@18.3.1) 1511 | react-number-format: 5.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1512 | react-remove-scroll: 2.5.10(@types/react@18.3.3)(react@18.3.1) 1513 | react-textarea-autosize: 8.5.3(@types/react@18.3.3)(react@18.3.1) 1514 | type-fest: 4.26.0 1515 | transitivePeerDependencies: 1516 | - '@types/react' 1517 | 1518 | '@mantine/hooks@7.12.2(react@18.3.1)': 1519 | dependencies: 1520 | react: 18.3.1 1521 | 1522 | '@nodelib/fs.scandir@2.1.5': 1523 | dependencies: 1524 | '@nodelib/fs.stat': 2.0.5 1525 | run-parallel: 1.2.0 1526 | 1527 | '@nodelib/fs.stat@2.0.5': {} 1528 | 1529 | '@nodelib/fs.walk@1.2.8': 1530 | dependencies: 1531 | '@nodelib/fs.scandir': 2.1.5 1532 | fastq: 1.17.1 1533 | 1534 | '@pkgr/core@0.1.1': {} 1535 | 1536 | '@types/eslint-config-prettier@6.11.3': {} 1537 | 1538 | '@types/eslint@8.56.11': 1539 | dependencies: 1540 | '@types/estree': 1.0.5 1541 | '@types/json-schema': 7.0.15 1542 | 1543 | '@types/eslint__js@8.42.3': 1544 | dependencies: 1545 | '@types/eslint': 8.56.11 1546 | 1547 | '@types/estree@1.0.5': {} 1548 | 1549 | '@types/json-schema@7.0.15': {} 1550 | 1551 | '@types/node@20.14.14': 1552 | dependencies: 1553 | undici-types: 5.26.5 1554 | 1555 | '@types/prop-types@15.7.12': {} 1556 | 1557 | '@types/react-dom@18.3.0': 1558 | dependencies: 1559 | '@types/react': 18.3.3 1560 | 1561 | '@types/react@18.3.3': 1562 | dependencies: 1563 | '@types/prop-types': 15.7.12 1564 | csstype: 3.1.3 1565 | 1566 | '@types/semver@7.5.8': {} 1567 | 1568 | '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': 1569 | dependencies: 1570 | '@eslint-community/regexpp': 4.11.0 1571 | '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) 1572 | '@typescript-eslint/scope-manager': 6.21.0 1573 | '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) 1574 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) 1575 | '@typescript-eslint/visitor-keys': 6.21.0 1576 | debug: 4.3.6 1577 | eslint: 8.57.0 1578 | graphemer: 1.4.0 1579 | ignore: 5.3.1 1580 | natural-compare: 1.4.0 1581 | semver: 7.6.3 1582 | ts-api-utils: 1.3.0(typescript@5.5.4) 1583 | optionalDependencies: 1584 | typescript: 5.5.4 1585 | transitivePeerDependencies: 1586 | - supports-color 1587 | 1588 | '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': 1589 | dependencies: 1590 | '@eslint-community/regexpp': 4.11.0 1591 | '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1592 | '@typescript-eslint/scope-manager': 7.18.0 1593 | '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1594 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1595 | '@typescript-eslint/visitor-keys': 7.18.0 1596 | eslint: 8.57.0 1597 | graphemer: 1.4.0 1598 | ignore: 5.3.1 1599 | natural-compare: 1.4.0 1600 | ts-api-utils: 1.3.0(typescript@5.5.4) 1601 | optionalDependencies: 1602 | typescript: 5.5.4 1603 | transitivePeerDependencies: 1604 | - supports-color 1605 | 1606 | '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4)': 1607 | dependencies: 1608 | '@typescript-eslint/scope-manager': 6.21.0 1609 | '@typescript-eslint/types': 6.21.0 1610 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) 1611 | '@typescript-eslint/visitor-keys': 6.21.0 1612 | debug: 4.3.6 1613 | eslint: 8.57.0 1614 | optionalDependencies: 1615 | typescript: 5.5.4 1616 | transitivePeerDependencies: 1617 | - supports-color 1618 | 1619 | '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': 1620 | dependencies: 1621 | '@typescript-eslint/scope-manager': 7.18.0 1622 | '@typescript-eslint/types': 7.18.0 1623 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 1624 | '@typescript-eslint/visitor-keys': 7.18.0 1625 | debug: 4.3.6 1626 | eslint: 8.57.0 1627 | optionalDependencies: 1628 | typescript: 5.5.4 1629 | transitivePeerDependencies: 1630 | - supports-color 1631 | 1632 | '@typescript-eslint/scope-manager@6.21.0': 1633 | dependencies: 1634 | '@typescript-eslint/types': 6.21.0 1635 | '@typescript-eslint/visitor-keys': 6.21.0 1636 | 1637 | '@typescript-eslint/scope-manager@7.18.0': 1638 | dependencies: 1639 | '@typescript-eslint/types': 7.18.0 1640 | '@typescript-eslint/visitor-keys': 7.18.0 1641 | 1642 | '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': 1643 | dependencies: 1644 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) 1645 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) 1646 | debug: 4.3.6 1647 | eslint: 8.57.0 1648 | ts-api-utils: 1.3.0(typescript@5.5.4) 1649 | optionalDependencies: 1650 | typescript: 5.5.4 1651 | transitivePeerDependencies: 1652 | - supports-color 1653 | 1654 | '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': 1655 | dependencies: 1656 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 1657 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 1658 | debug: 4.3.6 1659 | eslint: 8.57.0 1660 | ts-api-utils: 1.3.0(typescript@5.5.4) 1661 | optionalDependencies: 1662 | typescript: 5.5.4 1663 | transitivePeerDependencies: 1664 | - supports-color 1665 | 1666 | '@typescript-eslint/types@6.21.0': {} 1667 | 1668 | '@typescript-eslint/types@7.18.0': {} 1669 | 1670 | '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': 1671 | dependencies: 1672 | '@typescript-eslint/types': 6.21.0 1673 | '@typescript-eslint/visitor-keys': 6.21.0 1674 | debug: 4.3.6 1675 | globby: 11.1.0 1676 | is-glob: 4.0.3 1677 | minimatch: 9.0.3 1678 | semver: 7.6.3 1679 | ts-api-utils: 1.3.0(typescript@5.5.4) 1680 | optionalDependencies: 1681 | typescript: 5.5.4 1682 | transitivePeerDependencies: 1683 | - supports-color 1684 | 1685 | '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': 1686 | dependencies: 1687 | '@typescript-eslint/types': 7.18.0 1688 | '@typescript-eslint/visitor-keys': 7.18.0 1689 | debug: 4.3.6 1690 | globby: 11.1.0 1691 | is-glob: 4.0.3 1692 | minimatch: 9.0.5 1693 | semver: 7.6.3 1694 | ts-api-utils: 1.3.0(typescript@5.5.4) 1695 | optionalDependencies: 1696 | typescript: 5.5.4 1697 | transitivePeerDependencies: 1698 | - supports-color 1699 | 1700 | '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': 1701 | dependencies: 1702 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1703 | '@types/json-schema': 7.0.15 1704 | '@types/semver': 7.5.8 1705 | '@typescript-eslint/scope-manager': 6.21.0 1706 | '@typescript-eslint/types': 6.21.0 1707 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) 1708 | eslint: 8.57.0 1709 | semver: 7.6.3 1710 | transitivePeerDependencies: 1711 | - supports-color 1712 | - typescript 1713 | 1714 | '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': 1715 | dependencies: 1716 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1717 | '@typescript-eslint/scope-manager': 7.18.0 1718 | '@typescript-eslint/types': 7.18.0 1719 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) 1720 | eslint: 8.57.0 1721 | transitivePeerDependencies: 1722 | - supports-color 1723 | - typescript 1724 | 1725 | '@typescript-eslint/visitor-keys@6.21.0': 1726 | dependencies: 1727 | '@typescript-eslint/types': 6.21.0 1728 | eslint-visitor-keys: 3.4.3 1729 | 1730 | '@typescript-eslint/visitor-keys@7.18.0': 1731 | dependencies: 1732 | '@typescript-eslint/types': 7.18.0 1733 | eslint-visitor-keys: 3.4.3 1734 | 1735 | '@ungap/structured-clone@1.2.0': {} 1736 | 1737 | acorn-jsx@5.3.2(acorn@8.12.1): 1738 | dependencies: 1739 | acorn: 8.12.1 1740 | 1741 | acorn@8.12.1: {} 1742 | 1743 | ajv@6.12.6: 1744 | dependencies: 1745 | fast-deep-equal: 3.1.3 1746 | fast-json-stable-stringify: 2.1.0 1747 | json-schema-traverse: 0.4.1 1748 | uri-js: 4.4.1 1749 | 1750 | ansi-regex@5.0.1: {} 1751 | 1752 | ansi-styles@4.3.0: 1753 | dependencies: 1754 | color-convert: 2.0.1 1755 | 1756 | argparse@2.0.1: {} 1757 | 1758 | array-union@2.1.0: {} 1759 | 1760 | balanced-match@1.0.2: {} 1761 | 1762 | brace-expansion@1.1.11: 1763 | dependencies: 1764 | balanced-match: 1.0.2 1765 | concat-map: 0.0.1 1766 | 1767 | brace-expansion@2.0.1: 1768 | dependencies: 1769 | balanced-match: 1.0.2 1770 | 1771 | braces@3.0.3: 1772 | dependencies: 1773 | fill-range: 7.1.1 1774 | 1775 | callsites@3.1.0: {} 1776 | 1777 | camelcase-css@2.0.1: {} 1778 | 1779 | chalk@4.1.2: 1780 | dependencies: 1781 | ansi-styles: 4.3.0 1782 | supports-color: 7.2.0 1783 | 1784 | clsx@2.1.1: {} 1785 | 1786 | color-convert@2.0.1: 1787 | dependencies: 1788 | color-name: 1.1.4 1789 | 1790 | color-name@1.1.4: {} 1791 | 1792 | concat-map@0.0.1: {} 1793 | 1794 | cross-spawn@7.0.3: 1795 | dependencies: 1796 | path-key: 3.1.1 1797 | shebang-command: 2.0.0 1798 | which: 2.0.2 1799 | 1800 | cssesc@3.0.0: {} 1801 | 1802 | csstype@3.1.0: {} 1803 | 1804 | csstype@3.1.3: {} 1805 | 1806 | date-fns@2.30.0: 1807 | dependencies: 1808 | '@babel/runtime': 7.25.0 1809 | 1810 | date-fns@3.6.0: {} 1811 | 1812 | debug@4.3.4: 1813 | dependencies: 1814 | ms: 2.1.2 1815 | 1816 | debug@4.3.6: 1817 | dependencies: 1818 | ms: 2.1.2 1819 | 1820 | deep-is@0.1.4: {} 1821 | 1822 | detect-node-es@1.1.0: {} 1823 | 1824 | dir-glob@3.0.1: 1825 | dependencies: 1826 | path-type: 4.0.0 1827 | 1828 | doctrine@3.0.0: 1829 | dependencies: 1830 | esutils: 2.0.3 1831 | 1832 | dompurify@2.3.8: {} 1833 | 1834 | dot-case@3.0.4: 1835 | dependencies: 1836 | no-case: 3.0.4 1837 | tslib: 2.6.3 1838 | 1839 | esbuild@0.18.20: 1840 | optionalDependencies: 1841 | '@esbuild/android-arm': 0.18.20 1842 | '@esbuild/android-arm64': 0.18.20 1843 | '@esbuild/android-x64': 0.18.20 1844 | '@esbuild/darwin-arm64': 0.18.20 1845 | '@esbuild/darwin-x64': 0.18.20 1846 | '@esbuild/freebsd-arm64': 0.18.20 1847 | '@esbuild/freebsd-x64': 0.18.20 1848 | '@esbuild/linux-arm': 0.18.20 1849 | '@esbuild/linux-arm64': 0.18.20 1850 | '@esbuild/linux-ia32': 0.18.20 1851 | '@esbuild/linux-loong64': 0.18.20 1852 | '@esbuild/linux-mips64el': 0.18.20 1853 | '@esbuild/linux-ppc64': 0.18.20 1854 | '@esbuild/linux-riscv64': 0.18.20 1855 | '@esbuild/linux-s390x': 0.18.20 1856 | '@esbuild/linux-x64': 0.18.20 1857 | '@esbuild/netbsd-x64': 0.18.20 1858 | '@esbuild/openbsd-x64': 0.18.20 1859 | '@esbuild/sunos-x64': 0.18.20 1860 | '@esbuild/win32-arm64': 0.18.20 1861 | '@esbuild/win32-ia32': 0.18.20 1862 | '@esbuild/win32-x64': 0.18.20 1863 | 1864 | escape-string-regexp@4.0.0: {} 1865 | 1866 | eslint-config-prettier@9.1.0(eslint@8.57.0): 1867 | dependencies: 1868 | eslint: 8.57.0 1869 | 1870 | eslint-plugin-prettier@5.2.1(@types/eslint@8.56.11)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3): 1871 | dependencies: 1872 | eslint: 8.57.0 1873 | prettier: 3.3.3 1874 | prettier-linter-helpers: 1.0.0 1875 | synckit: 0.9.1 1876 | optionalDependencies: 1877 | '@types/eslint': 8.56.11 1878 | eslint-config-prettier: 9.1.0(eslint@8.57.0) 1879 | 1880 | eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.0): 1881 | dependencies: 1882 | eslint: 8.57.0 1883 | 1884 | eslint-scope@7.2.2: 1885 | dependencies: 1886 | esrecurse: 4.3.0 1887 | estraverse: 5.3.0 1888 | 1889 | eslint-visitor-keys@3.4.3: {} 1890 | 1891 | eslint@8.57.0: 1892 | dependencies: 1893 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1894 | '@eslint-community/regexpp': 4.11.0 1895 | '@eslint/eslintrc': 2.1.4 1896 | '@eslint/js': 8.57.0 1897 | '@humanwhocodes/config-array': 0.11.14 1898 | '@humanwhocodes/module-importer': 1.0.1 1899 | '@nodelib/fs.walk': 1.2.8 1900 | '@ungap/structured-clone': 1.2.0 1901 | ajv: 6.12.6 1902 | chalk: 4.1.2 1903 | cross-spawn: 7.0.3 1904 | debug: 4.3.6 1905 | doctrine: 3.0.0 1906 | escape-string-regexp: 4.0.0 1907 | eslint-scope: 7.2.2 1908 | eslint-visitor-keys: 3.4.3 1909 | espree: 9.6.1 1910 | esquery: 1.6.0 1911 | esutils: 2.0.3 1912 | fast-deep-equal: 3.1.3 1913 | file-entry-cache: 6.0.1 1914 | find-up: 5.0.0 1915 | glob-parent: 6.0.2 1916 | globals: 13.24.0 1917 | graphemer: 1.4.0 1918 | ignore: 5.3.1 1919 | imurmurhash: 0.1.4 1920 | is-glob: 4.0.3 1921 | is-path-inside: 3.0.3 1922 | js-yaml: 4.1.0 1923 | json-stable-stringify-without-jsonify: 1.0.1 1924 | levn: 0.4.1 1925 | lodash.merge: 4.6.2 1926 | minimatch: 3.1.2 1927 | natural-compare: 1.4.0 1928 | optionator: 0.9.4 1929 | strip-ansi: 6.0.1 1930 | text-table: 0.2.0 1931 | transitivePeerDependencies: 1932 | - supports-color 1933 | 1934 | espree@9.6.1: 1935 | dependencies: 1936 | acorn: 8.12.1 1937 | acorn-jsx: 5.3.2(acorn@8.12.1) 1938 | eslint-visitor-keys: 3.4.3 1939 | 1940 | esquery@1.6.0: 1941 | dependencies: 1942 | estraverse: 5.3.0 1943 | 1944 | esrecurse@4.3.0: 1945 | dependencies: 1946 | estraverse: 5.3.0 1947 | 1948 | estraverse@5.3.0: {} 1949 | 1950 | esutils@2.0.3: {} 1951 | 1952 | eventemitter3@4.0.7: {} 1953 | 1954 | fast-deep-equal@3.1.3: {} 1955 | 1956 | fast-diff@1.3.0: {} 1957 | 1958 | fast-glob@3.3.2: 1959 | dependencies: 1960 | '@nodelib/fs.stat': 2.0.5 1961 | '@nodelib/fs.walk': 1.2.8 1962 | glob-parent: 5.1.2 1963 | merge2: 1.4.1 1964 | micromatch: 4.0.7 1965 | 1966 | fast-json-stable-stringify@2.1.0: {} 1967 | 1968 | fast-levenshtein@2.0.6: {} 1969 | 1970 | fastq@1.17.1: 1971 | dependencies: 1972 | reusify: 1.0.4 1973 | 1974 | file-entry-cache@6.0.1: 1975 | dependencies: 1976 | flat-cache: 3.2.0 1977 | 1978 | fill-range@7.1.1: 1979 | dependencies: 1980 | to-regex-range: 5.0.1 1981 | 1982 | find-up@5.0.0: 1983 | dependencies: 1984 | locate-path: 6.0.0 1985 | path-exists: 4.0.0 1986 | 1987 | flat-cache@3.2.0: 1988 | dependencies: 1989 | flatted: 3.3.1 1990 | keyv: 4.5.4 1991 | rimraf: 3.0.2 1992 | 1993 | flatted@3.3.1: {} 1994 | 1995 | fs.realpath@1.0.0: {} 1996 | 1997 | fsevents@2.3.3: 1998 | optional: true 1999 | 2000 | get-nonce@1.0.1: {} 2001 | 2002 | glob-parent@5.1.2: 2003 | dependencies: 2004 | is-glob: 4.0.3 2005 | 2006 | glob-parent@6.0.2: 2007 | dependencies: 2008 | is-glob: 4.0.3 2009 | 2010 | glob@7.2.3: 2011 | dependencies: 2012 | fs.realpath: 1.0.0 2013 | inflight: 1.0.6 2014 | inherits: 2.0.4 2015 | minimatch: 3.1.2 2016 | once: 1.4.0 2017 | path-is-absolute: 1.0.1 2018 | 2019 | globals@13.24.0: 2020 | dependencies: 2021 | type-fest: 0.20.2 2022 | 2023 | globby@11.1.0: 2024 | dependencies: 2025 | array-union: 2.1.0 2026 | dir-glob: 3.0.1 2027 | fast-glob: 3.3.2 2028 | ignore: 5.3.1 2029 | merge2: 1.4.1 2030 | slash: 3.0.0 2031 | 2032 | globrex@0.1.2: {} 2033 | 2034 | graphemer@1.4.0: {} 2035 | 2036 | has-flag@4.0.0: {} 2037 | 2038 | husky@9.1.5: {} 2039 | 2040 | ignore@5.3.1: {} 2041 | 2042 | import-fresh@3.3.0: 2043 | dependencies: 2044 | parent-module: 1.0.1 2045 | resolve-from: 4.0.0 2046 | 2047 | imurmurhash@0.1.4: {} 2048 | 2049 | inflight@1.0.6: 2050 | dependencies: 2051 | once: 1.4.0 2052 | wrappy: 1.0.2 2053 | 2054 | inherits@2.0.3: {} 2055 | 2056 | inherits@2.0.4: {} 2057 | 2058 | invariant@2.2.4: 2059 | dependencies: 2060 | loose-envify: 1.4.0 2061 | 2062 | is-extglob@2.1.1: {} 2063 | 2064 | is-glob@4.0.3: 2065 | dependencies: 2066 | is-extglob: 2.1.1 2067 | 2068 | is-number@7.0.0: {} 2069 | 2070 | is-path-inside@3.0.3: {} 2071 | 2072 | isexe@2.0.0: {} 2073 | 2074 | js-tokens@4.0.0: {} 2075 | 2076 | js-yaml@4.1.0: 2077 | dependencies: 2078 | argparse: 2.0.1 2079 | 2080 | json-buffer@3.0.1: {} 2081 | 2082 | json-schema-traverse@0.4.1: {} 2083 | 2084 | json-stable-stringify-without-jsonify@1.0.1: {} 2085 | 2086 | keyv@4.5.4: 2087 | dependencies: 2088 | json-buffer: 3.0.1 2089 | 2090 | levn@0.4.1: 2091 | dependencies: 2092 | prelude-ls: 1.2.1 2093 | type-check: 0.4.0 2094 | 2095 | locate-path@6.0.0: 2096 | dependencies: 2097 | p-locate: 5.0.0 2098 | 2099 | lodash-es@4.17.21: {} 2100 | 2101 | lodash.merge@4.6.2: {} 2102 | 2103 | logseq-dateutils@2.1.2: 2104 | dependencies: 2105 | date-fns: 2.30.0 2106 | 2107 | loose-envify@1.4.0: 2108 | dependencies: 2109 | js-tokens: 4.0.0 2110 | 2111 | lower-case@2.0.2: 2112 | dependencies: 2113 | tslib: 2.6.3 2114 | 2115 | lucide-react@0.437.0(react@18.3.1): 2116 | dependencies: 2117 | react: 18.3.1 2118 | 2119 | magic-string@0.26.7: 2120 | dependencies: 2121 | sourcemap-codec: 1.4.8 2122 | 2123 | merge2@1.4.1: {} 2124 | 2125 | micromatch@4.0.7: 2126 | dependencies: 2127 | braces: 3.0.3 2128 | picomatch: 2.3.1 2129 | 2130 | minimatch@3.1.2: 2131 | dependencies: 2132 | brace-expansion: 1.1.11 2133 | 2134 | minimatch@9.0.3: 2135 | dependencies: 2136 | brace-expansion: 2.0.1 2137 | 2138 | minimatch@9.0.5: 2139 | dependencies: 2140 | brace-expansion: 2.0.1 2141 | 2142 | ms@2.1.2: {} 2143 | 2144 | nanoid@3.3.7: {} 2145 | 2146 | natural-compare@1.4.0: {} 2147 | 2148 | no-case@3.0.4: 2149 | dependencies: 2150 | lower-case: 2.0.2 2151 | tslib: 2.6.3 2152 | 2153 | once@1.4.0: 2154 | dependencies: 2155 | wrappy: 1.0.2 2156 | 2157 | optionator@0.9.4: 2158 | dependencies: 2159 | deep-is: 0.1.4 2160 | fast-levenshtein: 2.0.6 2161 | levn: 0.4.1 2162 | prelude-ls: 1.2.1 2163 | type-check: 0.4.0 2164 | word-wrap: 1.2.5 2165 | 2166 | p-limit@3.1.0: 2167 | dependencies: 2168 | yocto-queue: 0.1.0 2169 | 2170 | p-locate@5.0.0: 2171 | dependencies: 2172 | p-limit: 3.1.0 2173 | 2174 | parent-module@1.0.1: 2175 | dependencies: 2176 | callsites: 3.1.0 2177 | 2178 | path-exists@4.0.0: {} 2179 | 2180 | path-is-absolute@1.0.1: {} 2181 | 2182 | path-key@3.1.1: {} 2183 | 2184 | path-type@4.0.0: {} 2185 | 2186 | path@0.12.7: 2187 | dependencies: 2188 | process: 0.11.10 2189 | util: 0.10.4 2190 | 2191 | picocolors@1.0.1: {} 2192 | 2193 | picomatch@2.3.1: {} 2194 | 2195 | postcss-js@4.0.1(postcss@8.4.42): 2196 | dependencies: 2197 | camelcase-css: 2.0.1 2198 | postcss: 8.4.42 2199 | 2200 | postcss-mixins@9.0.4(postcss@8.4.42): 2201 | dependencies: 2202 | fast-glob: 3.3.2 2203 | postcss: 8.4.42 2204 | postcss-js: 4.0.1(postcss@8.4.42) 2205 | postcss-simple-vars: 7.0.1(postcss@8.4.42) 2206 | sugarss: 4.0.1(postcss@8.4.42) 2207 | 2208 | postcss-nested@6.2.0(postcss@8.4.42): 2209 | dependencies: 2210 | postcss: 8.4.42 2211 | postcss-selector-parser: 6.1.2 2212 | 2213 | postcss-preset-mantine@1.17.0(postcss@8.4.42): 2214 | dependencies: 2215 | postcss: 8.4.42 2216 | postcss-mixins: 9.0.4(postcss@8.4.42) 2217 | postcss-nested: 6.2.0(postcss@8.4.42) 2218 | 2219 | postcss-selector-parser@6.1.2: 2220 | dependencies: 2221 | cssesc: 3.0.0 2222 | util-deprecate: 1.0.2 2223 | 2224 | postcss-simple-vars@7.0.1(postcss@8.4.42): 2225 | dependencies: 2226 | postcss: 8.4.42 2227 | 2228 | postcss@8.4.42: 2229 | dependencies: 2230 | nanoid: 3.3.7 2231 | picocolors: 1.0.1 2232 | source-map-js: 1.2.0 2233 | 2234 | prelude-ls@1.2.1: {} 2235 | 2236 | prettier-linter-helpers@1.0.0: 2237 | dependencies: 2238 | fast-diff: 1.3.0 2239 | 2240 | prettier@3.3.3: {} 2241 | 2242 | process@0.11.10: {} 2243 | 2244 | punycode@2.3.1: {} 2245 | 2246 | queue-microtask@1.2.3: {} 2247 | 2248 | react-dom@18.3.1(react@18.3.1): 2249 | dependencies: 2250 | loose-envify: 1.4.0 2251 | react: 18.3.1 2252 | scheduler: 0.23.2 2253 | 2254 | react-hook-form@7.52.2(react@18.3.1): 2255 | dependencies: 2256 | react: 18.3.1 2257 | 2258 | react-number-format@5.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 2259 | dependencies: 2260 | react: 18.3.1 2261 | react-dom: 18.3.1(react@18.3.1) 2262 | 2263 | react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): 2264 | dependencies: 2265 | react: 18.3.1 2266 | react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) 2267 | tslib: 2.6.3 2268 | optionalDependencies: 2269 | '@types/react': 18.3.3 2270 | 2271 | react-remove-scroll@2.5.10(@types/react@18.3.3)(react@18.3.1): 2272 | dependencies: 2273 | react: 18.3.1 2274 | react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) 2275 | react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) 2276 | tslib: 2.6.3 2277 | use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) 2278 | use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) 2279 | optionalDependencies: 2280 | '@types/react': 18.3.3 2281 | 2282 | react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): 2283 | dependencies: 2284 | get-nonce: 1.0.1 2285 | invariant: 2.2.4 2286 | react: 18.3.1 2287 | tslib: 2.6.3 2288 | optionalDependencies: 2289 | '@types/react': 18.3.3 2290 | 2291 | react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1): 2292 | dependencies: 2293 | '@babel/runtime': 7.25.0 2294 | react: 18.3.1 2295 | use-composed-ref: 1.3.0(react@18.3.1) 2296 | use-latest: 1.2.1(@types/react@18.3.3)(react@18.3.1) 2297 | transitivePeerDependencies: 2298 | - '@types/react' 2299 | 2300 | react@18.3.1: 2301 | dependencies: 2302 | loose-envify: 1.4.0 2303 | 2304 | regenerator-runtime@0.14.1: {} 2305 | 2306 | resolve-from@4.0.0: {} 2307 | 2308 | reusify@1.0.4: {} 2309 | 2310 | rimraf@3.0.2: 2311 | dependencies: 2312 | glob: 7.2.3 2313 | 2314 | rollup@3.29.4: 2315 | optionalDependencies: 2316 | fsevents: 2.3.3 2317 | 2318 | run-parallel@1.2.0: 2319 | dependencies: 2320 | queue-microtask: 1.2.3 2321 | 2322 | scheduler@0.23.2: 2323 | dependencies: 2324 | loose-envify: 1.4.0 2325 | 2326 | semver@7.6.3: {} 2327 | 2328 | shebang-command@2.0.0: 2329 | dependencies: 2330 | shebang-regex: 3.0.0 2331 | 2332 | shebang-regex@3.0.0: {} 2333 | 2334 | slash@3.0.0: {} 2335 | 2336 | snake-case@3.0.4: 2337 | dependencies: 2338 | dot-case: 3.0.4 2339 | tslib: 2.6.3 2340 | 2341 | source-map-js@1.2.0: {} 2342 | 2343 | sourcemap-codec@1.4.8: {} 2344 | 2345 | strip-ansi@6.0.1: 2346 | dependencies: 2347 | ansi-regex: 5.0.1 2348 | 2349 | strip-json-comments@3.1.1: {} 2350 | 2351 | sugarss@4.0.1(postcss@8.4.42): 2352 | dependencies: 2353 | postcss: 8.4.42 2354 | 2355 | supports-color@7.2.0: 2356 | dependencies: 2357 | has-flag: 4.0.0 2358 | 2359 | synckit@0.9.1: 2360 | dependencies: 2361 | '@pkgr/core': 0.1.1 2362 | tslib: 2.6.3 2363 | 2364 | tabbable@6.2.0: {} 2365 | 2366 | text-table@0.2.0: {} 2367 | 2368 | to-regex-range@5.0.1: 2369 | dependencies: 2370 | is-number: 7.0.0 2371 | 2372 | ts-api-utils@1.3.0(typescript@5.5.4): 2373 | dependencies: 2374 | typescript: 5.5.4 2375 | 2376 | tsconfck@3.1.1(typescript@5.5.4): 2377 | optionalDependencies: 2378 | typescript: 5.5.4 2379 | 2380 | tslib@2.6.3: {} 2381 | 2382 | type-check@0.4.0: 2383 | dependencies: 2384 | prelude-ls: 1.2.1 2385 | 2386 | type-fest@0.20.2: {} 2387 | 2388 | type-fest@4.26.0: {} 2389 | 2390 | typescript-eslint@7.18.0(eslint@8.57.0)(typescript@5.5.4): 2391 | dependencies: 2392 | '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) 2393 | '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2394 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) 2395 | eslint: 8.57.0 2396 | optionalDependencies: 2397 | typescript: 5.5.4 2398 | transitivePeerDependencies: 2399 | - supports-color 2400 | 2401 | typescript@5.5.4: {} 2402 | 2403 | undici-types@5.26.5: {} 2404 | 2405 | uri-js@4.4.1: 2406 | dependencies: 2407 | punycode: 2.3.1 2408 | 2409 | use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): 2410 | dependencies: 2411 | react: 18.3.1 2412 | tslib: 2.6.3 2413 | optionalDependencies: 2414 | '@types/react': 18.3.3 2415 | 2416 | use-composed-ref@1.3.0(react@18.3.1): 2417 | dependencies: 2418 | react: 18.3.1 2419 | 2420 | use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1): 2421 | dependencies: 2422 | react: 18.3.1 2423 | optionalDependencies: 2424 | '@types/react': 18.3.3 2425 | 2426 | use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1): 2427 | dependencies: 2428 | react: 18.3.1 2429 | use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1) 2430 | optionalDependencies: 2431 | '@types/react': 18.3.3 2432 | 2433 | use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): 2434 | dependencies: 2435 | detect-node-es: 1.1.0 2436 | react: 18.3.1 2437 | tslib: 2.6.3 2438 | optionalDependencies: 2439 | '@types/react': 18.3.3 2440 | 2441 | util-deprecate@1.0.2: {} 2442 | 2443 | util@0.10.4: 2444 | dependencies: 2445 | inherits: 2.0.3 2446 | 2447 | vite-plugin-logseq@1.1.2: 2448 | dependencies: 2449 | magic-string: 0.26.7 2450 | 2451 | vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@4.5.3(@types/node@20.14.14)(sugarss@4.0.1(postcss@8.4.42))): 2452 | dependencies: 2453 | debug: 4.3.6 2454 | globrex: 0.1.2 2455 | tsconfck: 3.1.1(typescript@5.5.4) 2456 | optionalDependencies: 2457 | vite: 4.5.3(@types/node@20.14.14)(sugarss@4.0.1(postcss@8.4.42)) 2458 | transitivePeerDependencies: 2459 | - supports-color 2460 | - typescript 2461 | 2462 | vite@4.5.3(@types/node@20.14.14)(sugarss@4.0.1(postcss@8.4.42)): 2463 | dependencies: 2464 | esbuild: 0.18.20 2465 | postcss: 8.4.42 2466 | rollup: 3.29.4 2467 | optionalDependencies: 2468 | '@types/node': 20.14.14 2469 | fsevents: 2.3.3 2470 | sugarss: 4.0.1(postcss@8.4.42) 2471 | 2472 | which@2.0.2: 2473 | dependencies: 2474 | isexe: 2.0.0 2475 | 2476 | word-wrap@1.2.5: {} 2477 | 2478 | wrappy@1.0.2: {} 2479 | 2480 | yocto-queue@0.1.0: {} 2481 | -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-powertags-plugin/14ddadda4e8fbd59e987cd9b567e33ca596d0699/screenshots/demo.gif -------------------------------------------------------------------------------- /screenshots/dynamic-variables.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-powertags-plugin/14ddadda4e8fbd59e987cd9b567e33ca596d0699/screenshots/dynamic-variables.gif -------------------------------------------------------------------------------- /src/components/SortableItem.tsx: -------------------------------------------------------------------------------- 1 | import { useSortable } from '@dnd-kit/sortable' 2 | import { CSS } from '@dnd-kit/utilities' 3 | 4 | interface SortableItemProps { 5 | id: string 6 | index: string 7 | children: ( 8 | attributes: ReturnType['attributes'], 9 | listeners: ReturnType['listeners'], 10 | ) => React.ReactNode 11 | } 12 | 13 | export const SortableItem: React.FC = ({ id, children }) => { 14 | const { attributes, listeners, setNodeRef, transform, transition } = 15 | useSortable({ id }) 16 | 17 | const style: React.CSSProperties = { 18 | transform: CSS.Transform.toString(transform), 19 | transition, 20 | } 21 | 22 | return ( 23 |
24 | {children(attributes, listeners)} 25 |
26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /src/components/TagManagement.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Group, Input, Paper, Space, Title } from '@mantine/core' 2 | import { useCallback } from 'react' 3 | import { Controller, useForm } from 'react-hook-form' 4 | 5 | import { updateBlocks } from '../services/core/update-blocks' 6 | import { updateSettings } from '../services/core/update-settings' 7 | import { handleDynamicVariables } from '../services/handle-dynamic-variables' 8 | import { 9 | PropertiesProps, 10 | TagProperties, 11 | TagPropertiesProps, 12 | } from './TagProperties' 13 | 14 | interface FormData { 15 | [key: string]: { 16 | newProp: string 17 | defaultValue: string 18 | } 19 | } 20 | 21 | export const TagManagement = ({ 22 | index, 23 | setLocalTags, 24 | properties, 25 | tags, 26 | }: TagPropertiesProps) => { 27 | const { control, handleSubmit, reset } = useForm() 28 | 29 | const deletePowertag = useCallback( 30 | async (index: string) => { 31 | updateSettings((currSavedTags) => { 32 | const { [index]: _, ...rest } = currSavedTags 33 | return rest 34 | }) 35 | await updateBlocks(index, async (block) => { 36 | const props = await logseq.Editor.getBlockProperties(block.uuid) 37 | await Promise.all( 38 | Object.keys(props).map((propKey) => 39 | logseq.Editor.removeBlockProperty(block.uuid, propKey), 40 | ), 41 | ) 42 | await logseq.UI.showMsg( 43 | `PowerTag ${index} deleted. Properties removed from ${block.uuid}`, 44 | 'success', 45 | ) 46 | }) 47 | }, 48 | [tags], 49 | ) 50 | 51 | const addNewProp = useCallback( 52 | async (data: FormData) => { 53 | const index = Object.keys(data)[0] 54 | if (!index || !data[index]) return 55 | const tag = data[index] 56 | 57 | updateSettings((currSavedTags) => { 58 | const properties = currSavedTags[index] 59 | if (!properties) return 60 | if ( 61 | properties.some( 62 | (property: PropertiesProps) => property.name === tag.newProp, 63 | ) 64 | ) { 65 | logseq.UI.showMsg(`${tag.newProp} already exists`, 'error') 66 | return currSavedTags 67 | } 68 | return { 69 | ...currSavedTags, 70 | [index]: [ 71 | ...properties, 72 | { name: tag.newProp, value: tag.defaultValue }, 73 | ], 74 | } 75 | }) 76 | 77 | reset() 78 | 79 | await updateBlocks(index, async (block) => { 80 | const propValue = await handleDynamicVariables(tag.defaultValue) 81 | await logseq.Editor.upsertBlockProperty( 82 | block.uuid, 83 | tag.newProp, 84 | propValue, 85 | ) 86 | await logseq.UI.showMsg( 87 | `New property added to ${index}. ${block.uuid} updated with new property`, 88 | 'success', 89 | ) 90 | }) 91 | }, 92 | [tags], 93 | ) 94 | 95 | return ( 96 | 97 | 98 | #{index} 99 | 102 | 103 | 104 | 110 | 111 |
112 | 113 | ( 118 | 119 | )} 120 | /> 121 | ( 126 | 127 | )} 128 | /> 129 | 132 | 133 |
134 |
135 | ) 136 | } 137 | -------------------------------------------------------------------------------- /src/components/TagProperties.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | DndContext, 3 | DragEndEvent, 4 | PointerSensor, 5 | useSensor, 6 | useSensors, 7 | } from '@dnd-kit/core' 8 | import { 9 | arrayMove, 10 | SortableContext, 11 | verticalListSortingStrategy, 12 | } from '@dnd-kit/sortable' 13 | import { ActionIcon, Flex, Stack, Text } from '@mantine/core' 14 | import { ArrowDownUp, Trash } from 'lucide-react' 15 | import { Dispatch, SetStateAction, useCallback } from 'react' 16 | 17 | import { Tag } from '../features' 18 | import { updateBlocks } from '../services/core/update-blocks' 19 | import { updateSettings } from '../services/core/update-settings' 20 | import { reorderBlockProperties } from '../services/re-ordering' 21 | import { SortableItem } from './SortableItem' 22 | 23 | export interface PropertiesProps { 24 | name: string 25 | value: string 26 | } 27 | 28 | export interface TagPropertiesProps { 29 | setLocalTags: Dispatch> 30 | index: string 31 | properties: PropertiesProps[] 32 | tags: Tag 33 | } 34 | 35 | export const TagProperties = ({ 36 | setLocalTags, 37 | index, 38 | properties, 39 | tags, 40 | }: TagPropertiesProps) => { 41 | const sensors = useSensors( 42 | useSensor(PointerSensor, { 43 | activationConstraint: { 44 | distance: 8, 45 | }, 46 | }), 47 | ) 48 | 49 | const handleDragEnd = useCallback( 50 | async (event: DragEndEvent) => { 51 | let localProps 52 | const { active, over } = event 53 | 54 | if (active.id !== over?.id) { 55 | setLocalTags((prevTags) => { 56 | if (!prevTags) return prevTags 57 | 58 | const newTags = { ...prevTags } 59 | const tagIndex = Object.keys(prevTags).find((key) => 60 | prevTags[key]!.some((prop) => prop.name === active.id), 61 | ) 62 | 63 | if (!tagIndex) return prevTags 64 | 65 | const activeIndex = prevTags[tagIndex]!.findIndex( 66 | (prop) => prop.name === active.id, 67 | ) 68 | const overIndex = prevTags[tagIndex]!.findIndex( 69 | (prop) => prop.name === over?.id, 70 | ) 71 | if (activeIndex === -1 || overIndex === -1) return prevTags 72 | newTags[tagIndex] = arrayMove( 73 | prevTags[tagIndex]!, 74 | activeIndex, 75 | overIndex, 76 | ) 77 | 78 | // Save to settings 79 | updateSettings((currSavedTags) => ({ 80 | ...currSavedTags, 81 | [index]: newTags[tagIndex], 82 | })) 83 | localProps = newTags[tagIndex] 84 | 85 | return newTags 86 | }) 87 | reorderBlockProperties(index, localProps!) 88 | } 89 | }, 90 | [tags], 91 | ) 92 | 93 | const deleteProperty = useCallback( 94 | async (index: string, name: string) => { 95 | updateSettings((currSavedTags) => ({ 96 | ...currSavedTags, 97 | [index]: currSavedTags[index]?.filter( 98 | (property: { name: string }) => property.name !== name, 99 | ), 100 | })) 101 | 102 | await updateBlocks(index, async (block) => { 103 | await logseq.Editor.removeBlockProperty(block.uuid, name) 104 | await logseq.UI.showMsg( 105 | `Property ${name} deleted from #${index}. Block ${block.uuid} updated`, 106 | 'success', 107 | ) 108 | }) 109 | }, 110 | [tags], 111 | ) 112 | 113 | return ( 114 | 115 | prop.name)} 117 | strategy={verticalListSortingStrategy} 118 | > 119 | 120 | {properties.map(({ name, value }) => ( 121 | 122 | {(attributes, listeners) => ( 123 | 129 | 136 | 137 | 138 | {name}:: {value} 139 | 140 | 141 | {properties.length > 1 && ( 142 | deleteProperty(index, name)} 144 | variant="outline" 145 | color="red" 146 | > 147 | 148 | 149 | )} 150 | 151 | )} 152 | 153 | ))} 154 | 155 | 156 | 157 | ) 158 | } 159 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | import { createTheme } from '@mantine/core' 2 | 3 | export const THEME = createTheme({ 4 | primaryColor: 'darkTeal', 5 | primaryShade: 9, 6 | colors: { 7 | darkTeal: [ 8 | '#ecfbfd', 9 | '#daf4f8', 10 | '#b0e8f2', 11 | '#85dded', 12 | '#66d3e9', 13 | '#56cde6', 14 | '#4ccae6', 15 | '#3eb2cd', 16 | '#2f9eb7', 17 | '#0d89a0', 18 | ], 19 | }, 20 | }) 21 | -------------------------------------------------------------------------------- /src/features/create-tag/index.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ActionIcon, 3 | Button, 4 | Flex, 5 | Group, 6 | Input, 7 | Space, 8 | Title, 9 | } from '@mantine/core' 10 | import { useCallback } from 'react' 11 | import { Controller, useFieldArray, useForm } from 'react-hook-form' 12 | 13 | interface PowerTag { 14 | tagName: string 15 | properties: { 16 | name: string 17 | value: string 18 | }[] 19 | } 20 | 21 | export const CreateTag = () => { 22 | const { control, handleSubmit, watch, reset } = useForm({ 23 | defaultValues: { 24 | tagName: '', 25 | properties: [{ name: '', value: '' }], 26 | }, 27 | }) 28 | 29 | const { fields, append, remove } = useFieldArray({ 30 | control, 31 | name: 'properties', 32 | rules: { 33 | minLength: 1, 34 | }, 35 | }) 36 | 37 | const onSubmit = useCallback(async (data: PowerTag) => { 38 | // Check if tag already exists 39 | const currSavedTags = logseq.settings!.savedTags 40 | if (currSavedTags[data.tagName]) { 41 | await logseq.UI.showMsg(`#${data.tagName} already exists`, 'error') 42 | return 43 | } 44 | 45 | logseq.updateSettings({ 46 | savedTags: { 47 | [data.tagName.toLowerCase()]: data.properties, 48 | }, 49 | }) 50 | reset() 51 | logseq.hideMainUI() 52 | await logseq.UI.showMsg('PowerTag saved!', 'success') 53 | }, []) 54 | 55 | return ( 56 | 57 | Create 58 | 59 | 60 |
61 | 62 | ( 67 | 73 | )} 74 | /> 75 | 76 | 77 | 78 | 79 | {fields.map((field, index) => ( 80 | 81 | ( 86 | 91 | )} 92 | /> 93 | ( 97 | 98 | )} 99 | /> 100 | append({ name: '', value: '' })} 104 | > 105 | + 106 | 107 | {watch('properties').length > 1 && ( 108 | remove(index)} 112 | > 113 | - 114 | 115 | )} 116 | 117 | ))} 118 | 119 | 120 | 121 | 122 | 123 |
124 |
125 | ) 126 | } 127 | -------------------------------------------------------------------------------- /src/features/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: none !important; 3 | } 4 | -------------------------------------------------------------------------------- /src/features/index.tsx: -------------------------------------------------------------------------------- 1 | import './index.css' 2 | import '@mantine/core/styles.css' 3 | 4 | import { 5 | CloseButton, 6 | Flex, 7 | Group, 8 | MantineProvider, 9 | Space, 10 | Title, 11 | } from '@mantine/core' 12 | import { useEffect, useState } from 'react' 13 | 14 | import { THEME } from '../constants' 15 | import { CreateTag } from './create-tag' 16 | import { ManageTags } from './manage-tags' 17 | 18 | export interface Tag { 19 | [key: string]: { name: string; value: string }[] 20 | } 21 | 22 | const PowerTags = () => { 23 | const [tags, setTags] = useState({}) 24 | 25 | useEffect(() => { 26 | setTags(logseq.settings!.savedTags) 27 | }) 28 | 29 | const closeModal = () => { 30 | logseq.hideMainUI() 31 | } 32 | 33 | return ( 34 | 35 | 36 | 45 | 46 | PowerTags Menu 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ) 56 | } 57 | 58 | export default PowerTags 59 | -------------------------------------------------------------------------------- /src/features/manage-tags/index.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, Space, Text, Title } from '@mantine/core' 2 | import { useEffect, useState } from 'react' 3 | 4 | import { TagManagement } from '../../components/TagManagement' 5 | import { Tag } from '..' 6 | 7 | export const ManageTags = ({ tags }: { tags: Tag }) => { 8 | const [localTags, setLocalTags] = useState({}) 9 | 10 | useEffect(() => { 11 | setLocalTags(tags) 12 | }, [tags]) 13 | 14 | if (!localTags) return

Error in plugin settings...

15 | 16 | return ( 17 | 18 | Manage 19 | 20 | Deleting a PowerTag or property will affect all blocks that reference 21 | this PowerTag, even if they were not created with this plugin. 22 | 23 | 24 | 25 | {Object.entries(localTags).map(([index, properties]) => ( 26 | 33 | ))} 34 | 35 | 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css?raw' { 2 | const content: string 3 | export default content 4 | } 5 | -------------------------------------------------------------------------------- /src/handle-popup.ts: -------------------------------------------------------------------------------- 1 | export const handlePopup = () => { 2 | // Hit 'Esc' to close pop-up 3 | document.addEventListener( 4 | 'keydown', 5 | (e: KeyboardEvent) => { 6 | if (e.key === 'Escape') { 7 | logseq.hideMainUI({ restoreEditingCursor: true }) 8 | } 9 | e.stopPropagation() 10 | }, 11 | false, 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import '@logseq/libs' 2 | 3 | import { createRoot } from 'react-dom/client' 4 | 5 | import PowerTags from './features' 6 | import { handlePopup } from './handle-popup' 7 | import { observerCallback } from './observerCallback' 8 | import { handlePowerTag } from './services/handle-power-tag' 9 | import settings from './settings' 10 | 11 | const main = () => { 12 | console.log('logseq-powertags-plugin loaded') 13 | handlePopup() 14 | 15 | // Create a savedTags object in settings if it doesn't exist 16 | if (!logseq.settings!.savedTags) { 17 | logseq.updateSettings({ savedTags: {} }) 18 | } 19 | 20 | const el = document.getElementById('app') 21 | if (!el) return 22 | const root = createRoot(el) 23 | 24 | logseq.provideModel({ 25 | async managePowerTags() { 26 | root.render() 27 | logseq.showMainUI() 28 | }, 29 | }) 30 | logseq.App.registerUIItem('toolbar', { 31 | key: 'logseq-powertags-plugin', 32 | template: ``, 33 | }) 34 | 35 | if (logseq.settings!.autoParse) { 36 | //@ts-expect-error need to access Logseq parent 37 | const observer = new parent.MutationObserver(observerCallback) 38 | observer.observe(parent.document.getElementById('app-container'), { 39 | attributes: false, 40 | childList: true, 41 | subtree: true, 42 | }) 43 | } 44 | 45 | logseq.Editor.registerSlashCommand('Parse PowerTag', async (e) => { 46 | await handlePowerTag(e.uuid) 47 | }) 48 | } 49 | 50 | logseq.useSettingsSchema(settings).ready(main).catch(console.error) 51 | -------------------------------------------------------------------------------- /src/observerCallback.ts: -------------------------------------------------------------------------------- 1 | import { handlePowerTag } from './services/handle-power-tag' 2 | 3 | export const observerCallback = async (mutationsList: any[]) => { 4 | for (const mutation of mutationsList) { 5 | if ( 6 | mutation.type === 'childList' && 7 | mutation.removedNodes.length > 0 && 8 | mutation.removedNodes[0].className === 'editor-inner block-editor' 9 | ) { 10 | const uuid = mutation.target 11 | .closest('div[id^="ls-block"]') 12 | ?.getAttribute('blockid') 13 | 14 | await handlePowerTag(uuid) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/services/core/query-blocks-with-tag.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 2 | 3 | export const queryBlocksWithTag = async ( 4 | tag: string, 5 | ): Promise => { 6 | let blocks = await logseq.DB.q(`[[${tag}]]`) 7 | if (!blocks || blocks.length === 0) { 8 | await logseq.UI.showMsg(`No blocks with PowerTag: ${tag} found`) 9 | logseq.hideMainUI() 10 | return null 11 | } 12 | // Only retrieve blocks where its parent is the page so that child blocks are not selected and properties are being added to child blocks 13 | blocks = blocks.filter( 14 | (block: BlockEntity) => block.page.id === block.parent.id, 15 | ) 16 | return blocks 17 | } 18 | -------------------------------------------------------------------------------- /src/services/core/update-blocks.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 2 | 3 | import { queryBlocksWithTag } from './query-blocks-with-tag' 4 | 5 | export const updateBlocks = async ( 6 | tag: string, 7 | operation: (block: BlockEntity) => Promise, 8 | ) => { 9 | const blocks = await queryBlocksWithTag(tag) 10 | if (!blocks) return 11 | 12 | await Promise.all(blocks.map(operation)) 13 | logseq.hideMainUI() 14 | } 15 | -------------------------------------------------------------------------------- /src/services/core/update-settings.ts: -------------------------------------------------------------------------------- 1 | import { PropertiesProps } from '../../components/TagProperties' 2 | 3 | export const updateSettings = ( 4 | updateFn: (currSettings: { [key: string]: PropertiesProps[] }) => void, 5 | ) => { 6 | const currSavedTags = logseq.settings!.savedTags 7 | const updatedSettings = updateFn(currSavedTags) 8 | 9 | logseq.updateSettings({ 10 | savedTags: 'Need to add some arbitrary string first', 11 | }) 12 | logseq.updateSettings({ savedTags: updatedSettings }) 13 | } 14 | -------------------------------------------------------------------------------- /src/services/handle-dynamic-variables.ts: -------------------------------------------------------------------------------- 1 | import { format, startOfTomorrow, startOfYesterday } from 'date-fns' 2 | import { getDateForPage } from 'logseq-dateutils' 3 | 4 | type DynamicVariable = 5 | | 'today' 6 | | 'yesterday' 7 | | 'tomorrow' 8 | | 'time' 9 | | 'current page' 10 | 11 | const getPreferredDateFormat = async (): Promise => { 12 | return (await logseq.App.getUserConfigs()).preferredDateFormat 13 | } 14 | 15 | const dynamicVariableHandlers: Record Promise> = 16 | { 17 | today: async () => 18 | getDateForPage(new Date(), await getPreferredDateFormat()), 19 | yesterday: async () => 20 | getDateForPage(startOfYesterday(), await getPreferredDateFormat()), 21 | tomorrow: async () => 22 | getDateForPage(startOfTomorrow(), await getPreferredDateFormat()), 23 | time: async () => format(new Date(), 'HH:mm'), 24 | 'current page': async () => { 25 | const currBlock = await logseq.Editor.getCurrentBlock() 26 | if (!currBlock) return '' 27 | const currPage = await logseq.Editor.getPage(currBlock.page.id) 28 | if (!currPage) return '' 29 | return `[[${currPage.name}]]` 30 | }, 31 | } 32 | 33 | export const handleDynamicVariables = async ( 34 | propValue: string, 35 | ): Promise => { 36 | const match = propValue.match(/<%\s*(.*?)\s*%>/) 37 | if (!match || !match[1]) return propValue 38 | 39 | const dVar = match[1] as DynamicVariable 40 | const handler = dynamicVariableHandlers[dVar] 41 | return handler ? await handler() : propValue 42 | } 43 | -------------------------------------------------------------------------------- /src/services/handle-power-tag.ts: -------------------------------------------------------------------------------- 1 | import { handleDynamicVariables } from './handle-dynamic-variables' 2 | 3 | export const handlePowerTag = async (uuid: string) => { 4 | const blk = await logseq.Editor.getBlock(uuid) 5 | if (!blk) return 6 | const tagMatch = /#(?:\[\[(.*?)\]\]|(\w+))/.exec(blk.content) 7 | if (!tagMatch) return 8 | 9 | // Check whether tag is a PowerTag 10 | const tag = tagMatch[1] ?? tagMatch[2] 11 | if (!tag) return 12 | 13 | const powerTag = logseq.settings!.savedTags[tag.toLowerCase()] 14 | if (!powerTag) return 15 | 16 | //****RULES OF ENGAGEMENT****// 17 | // Ignore if properties already exist 18 | // Handle partial properties 19 | // Handle no properties exist 20 | //**************************// 21 | 22 | for (const property of powerTag) { 23 | const currProperty = await logseq.Editor.getBlockProperty( 24 | uuid, 25 | property.name, 26 | ) 27 | if (currProperty) continue 28 | 29 | // Handle dynamic variables 30 | const propValue = await handleDynamicVariables(property.value) 31 | 32 | await logseq.Editor.upsertBlockProperty(uuid, property.name, propValue) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/services/re-ordering/index.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 2 | 3 | import { PropertiesProps } from '../../components/TagProperties' 4 | import { updateBlocks } from '../core/update-blocks' 5 | import { insertOrderedProps } from './insert-ordered-properties' 6 | import { removeAllProperties } from './remove-all-properties' 7 | import { reorderProperties } from './reorder-properties' 8 | 9 | export const reorderBlockProperties = async ( 10 | index: string, 11 | localProps: PropertiesProps[], 12 | ) => { 13 | const newOrder = localProps.map((prop) => prop.name) 14 | 15 | await updateBlocks(index, async (block: BlockEntity) => { 16 | const blockProps = await logseq.Editor.getBlockProperties(block.uuid) 17 | const newOrderBlockProps = reorderProperties(blockProps, newOrder) 18 | if (!newOrderBlockProps) return 19 | 20 | await removeAllProperties(block.uuid, Object.keys(blockProps)) 21 | await insertOrderedProps(block.uuid, newOrderBlockProps) 22 | 23 | await logseq.UI.showMsg( 24 | `Properties rearranged for ${block.uuid}`, 25 | 'success', 26 | ) 27 | }) 28 | 29 | logseq.hideMainUI() 30 | } 31 | -------------------------------------------------------------------------------- /src/services/re-ordering/insert-ordered-properties.ts: -------------------------------------------------------------------------------- 1 | import { GenericProperty } from './reorder-properties' 2 | 3 | export const insertOrderedProps = async ( 4 | uuid: string, 5 | properties: GenericProperty, 6 | ) => { 7 | await Promise.all( 8 | Object.entries(properties).map(([key, value]) => 9 | logseq.Editor.upsertBlockProperty(uuid, key, value), 10 | ), 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /src/services/re-ordering/remove-all-properties.ts: -------------------------------------------------------------------------------- 1 | export const removeAllProperties = async (uuid: string, propKeys: string[]) => { 2 | await Promise.all( 3 | propKeys.map((propKey) => logseq.Editor.removeBlockProperty(uuid, propKey)), 4 | ) 5 | } 6 | -------------------------------------------------------------------------------- /src/services/re-ordering/reorder-properties.ts: -------------------------------------------------------------------------------- 1 | export interface GenericProperty { 2 | [key: string]: any 3 | } 4 | 5 | export const reorderProperties = ( 6 | properties: { [key: string]: any }, 7 | order: string[], 8 | ) => { 9 | const newProperties: GenericProperty = {} 10 | order.forEach((key) => { 11 | if (Object.prototype.hasOwnProperty.call(properties, key)) { 12 | newProperties[key] = properties[key] 13 | } 14 | }) 15 | return newProperties 16 | } 17 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import { SettingSchemaDesc } from '@logseq/libs/dist/LSPlugin.user' 2 | 3 | const settings: SettingSchemaDesc[] = [ 4 | { 5 | key: 'autoParse', 6 | type: 'boolean', 7 | default: true, 8 | title: 'Auto Parse', 9 | description: `If set to true, blocks containing a #powertag will automatically have its properties added.`, 10 | }, 11 | ] 12 | 13 | export default settings 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "target": "es2017", 5 | "lib": [ 6 | "dom", 7 | "dom.iterable", 8 | "esnext" 9 | ], 10 | "allowJs": true, 11 | "checkJs": true, 12 | "skipLibCheck": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noEmit": true, 16 | "esModuleInterop": true, 17 | "module": "esnext", 18 | "moduleResolution": "node", 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "incremental": true, 22 | "noUncheckedIndexedAccess": true, 23 | "baseUrl": "./", 24 | "paths": { 25 | "../*": [ 26 | "src/*" 27 | ] 28 | } 29 | }, 30 | "include": [ 31 | "**/*.ts", 32 | "**/*.tsx", 33 | "**/*.cjs", 34 | "**/*.mjs" 35 | ], 36 | "exclude": [ 37 | "node_modules", 38 | "./dist/**/*", 39 | "./screenshots", 40 | "tailwind.config.js" 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import logseqDevPlugin from 'vite-plugin-logseq' 3 | 4 | export default defineConfig({ 5 | plugins: [logseqDevPlugin()], 6 | }) 7 | --------------------------------------------------------------------------------