├── .github ├── FUNDING.yml └── workflows │ └── publish.yml ├── .gitignore ├── .prettierrc ├── LICENSE.md ├── README.md ├── eslint.config.mjs ├── icon.svg ├── index.html ├── package.json ├── pnpm-lock.yaml ├── screenshots ├── blockref-demo.gif ├── boardwidth.gif ├── demo.gif ├── demo2.gif ├── demo3.gif ├── dnd.gif ├── img-demo.gif ├── queries.gif └── widthdemo.gif ├── src ├── components │ ├── Column.tsx │ └── SortableItem.tsx ├── features │ ├── drag-and-drop │ │ ├── dnd.css │ │ └── index.tsx │ └── kanban │ │ └── index.tsx ├── helpers │ ├── create-normal-board.ts │ ├── create-normal-query-board.ts │ ├── create-query-board.ts │ └── create-task-board.ts ├── index.tsx ├── kanban.ts ├── libs │ ├── check-params.ts │ ├── get-block-content.ts │ ├── handle-styles.ts │ ├── process-content.tsx │ ├── process-content │ │ ├── handle-block-reference.tsx │ │ ├── handle-bold.tsx │ │ ├── handle-image.tsx │ │ ├── handle-italics.tsx │ │ ├── handle-link.tsx │ │ ├── handle-markdown-link.tsx │ │ ├── handle-page-reference.tsx │ │ ├── handle-tag.tsx │ │ └── remove-markers.ts │ └── sort-query-markers.ts ├── react-kanban.d.ts └── types.ts ├── tsconfig.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [hkgnp] 2 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Build Logseq Plugin 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" 7 | paths-ignore: 8 | - 'README.md' 9 | workflow_dispatch: 10 | 11 | env: 12 | PLUGIN_NAME: ${{ github.event.repository.name }} 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - name: Use Node.js 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: "20.x" # You might need to adjust this value to your own version 25 | 26 | - uses: pnpm/action-setup@v4 27 | with: 28 | version: 9.4.0 29 | 30 | - name: Build 31 | id: build 32 | run: | 33 | pnpm i && pnpm run build 34 | mkdir ${{ env.PLUGIN_NAME }} 35 | cp README.md package.json icon.svg ${{ env.PLUGIN_NAME }} 36 | mv dist ${{ env.PLUGIN_NAME }} 37 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 38 | ls 39 | echo "tag_name=git tag --sort version:refname | tail -n 1" >> $GITHUB_OUTPUT 40 | 41 | - name: Release 42 | run: npx semantic-release 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | lerna-debug.log* 11 | .pnpm-debug.log* 12 | 13 | # Diagnostic reports (https://nodejs.org/api/report.html) 14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | *.lcov 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | node_modules/ 46 | jspm_packages/ 47 | 48 | # Snowpack dependency directory (https://snowpack.dev/) 49 | web_modules/ 50 | 51 | # TypeScript cache 52 | *.tsbuildinfo 53 | 54 | # Optional npm cache directory 55 | .npm 56 | 57 | # Optional eslint cache 58 | .eslintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variables file 76 | .env 77 | .env.test 78 | .env.production 79 | 80 | # parcel-bundler cache (https://parceljs.org/) 81 | .cache 82 | .parcel-cache 83 | 84 | # Next.js build output 85 | .next 86 | out 87 | 88 | # Nuxt.js build / generate output 89 | .nuxt 90 | dist 91 | 92 | # Gatsby files 93 | .cache/ 94 | # Comment in the public line in if your project uses Gatsby and not Next.js 95 | # https://nextjs.org/blog/next-9-1#public-directory-support 96 | # public 97 | 98 | # vuepress build output 99 | .vuepress/dist 100 | 101 | # Serverless directories 102 | .serverless/ 103 | 104 | # FuseBox cache 105 | .fusebox/ 106 | 107 | # DynamoDB Local files 108 | .dynamodb/ 109 | 110 | # TernJS port file 111 | .tern-port 112 | 113 | # Stores VSCode versions used for testing VSCode extensions 114 | .vscode-test 115 | 116 | # yarn v2 117 | .yarn/cache 118 | .yarn/unplugged 119 | .yarn/build-state.yml 120 | .yarn/install-state.gz 121 | .pnp.* 122 | -------------------------------------------------------------------------------- /.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) 2021 hkgnp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /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 | # New 4 | 5 | Use `/Kanban (DND)` if you want to create a Kanban board with drag and drop functionality. When you drag and drop, the blocks are automatically updated. I am still considering merging the functions below but am concerned about breaking people's graphs. 6 | 7 | ![](/screenshots/dnd.gif) 8 | 9 | # Overview 10 | 11 | Draw kanban board based on your blocks. Type `/Kanban` to start. Images, linkes, block references, etc. are supported. There are 3 ways to do so: 12 | 13 | ### Normal 14 | 15 | Use your parent blocks as headers. For example, the below blocks will give you 3 columns in your kanban respectively: Column 1, Column 2, Column 3 16 | 17 | ```md 18 | - {{renderer :kanban_651a3832-a06f-4dee-8c77-bc15908765e8}} 19 | - data 20 | - Column 1 21 | - The quick brown fox 22 | - Column 2 23 | - Jumped over 24 | - Column 3 25 | - The lazy dog 26 | ``` 27 | 28 | ### Normal with Queries 29 | 30 | Use your parent blocks as headers, and use `/query` function as child blocks. Advanced queries may not work. 31 | 32 | ```md 33 | - {{renderer :kanban_651ae900-af3c-4bef-973a-77731a060b29}} 34 | - query 35 | - Column 1 36 | - {{query [[Cards for Column 1]]}} 37 | - Column 2 38 | - {{query [[Cards for Column 2]]}} 39 | ``` 40 | 41 | ### Tasks 42 | 43 | Use tasks to populate the Kanban board. 44 | 45 | ```md 46 | - {{renderer :kanban_651a3832-a06f-4dee-8c77-bc15908765e8}} 47 | - tasks 48 | - TODO The quick brown fox 49 | - DOING Jumped over 50 | - DONE The lazy dog 51 | ``` 52 | 53 | ### Query Tasks 54 | 55 | Use simple queries to populate the Kanban board. Use the `/query` function. Advanced queries may not work. 56 | 57 | ```md 58 | - {{renderer :kanban_651a3832-a06f-4dee-8c77-bc15908765e8}} 59 | - query-tasks 60 | - {{query (task DOING DONE TODO)}} 61 | ``` 62 | 63 | # Adjust card or board width 64 | 65 | You can adjust the widths of the board or cards using the parameters: 66 | 67 | - card- 68 | - board- 69 | 70 | ```md 71 | - {{renderer :kanban_651a3832-a06f-4dee-8c77-bc15908765e8}} 72 | - data card-300 board-1000 73 | - Column 1 74 | - The quick brown fox 75 | - Column 2 76 | - Jumped over 77 | - Column 3 78 | - The lazy dog 79 | ``` 80 | 81 | # Credits 82 | 83 | [react-kanban by asseinfo](https://github.com/asseinfo/react-kanban) 84 | -------------------------------------------------------------------------------- /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/no-explicit-any': 'off', 22 | '@typescript-eslint/no-unused-vars': [ 23 | 'error', 24 | { varsIgnorePattern: '^_' }, 25 | ], 26 | }, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "logseq-kanban-plugin", 3 | "author": "benjypng", 4 | "description": "Simple plugin to help visualise data on a Kanban Board.", 5 | "license": "MIT", 6 | "logseq": { 7 | "id": "logseq-kanban-plugin", 8 | "title": "logseq-kanban-plugin", 9 | "icon": "./icon.svg", 10 | "main": "dist/index.html" 11 | }, 12 | "scripts": { 13 | "dev:start": "pnpm add @logseq/libs -S && pnpm add @types/eslint @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-prettier prettier vite vite-plugin-logseq vite-tsconfig-paths typescript -D", 14 | "dev:tailwind": "pnpm add tailwindcss cssnano autoprefixer -D && touch tailwind.config.js && touch .postcssrc.cjs && touch src/tailwind.css", 15 | "dev": "npx vite", 16 | "build": "npx tsc && npx vite build", 17 | "preview": "npx vite preview" 18 | }, 19 | "release": { 20 | "branches": [ 21 | "main" 22 | ], 23 | "plugins": [ 24 | [ 25 | "@semantic-release/github", 26 | { 27 | "assets": [ 28 | "logseq-kanban-plugin.zip" 29 | ] 30 | } 31 | ] 32 | ] 33 | }, 34 | "dependencies": { 35 | "@asseinfo/react-kanban": "^2.2.0", 36 | "@dnd-kit/core": "^6.1.0", 37 | "@dnd-kit/modifiers": "^7.0.0", 38 | "@dnd-kit/sortable": "^8.0.0", 39 | "@dnd-kit/utilities": "^3.2.2", 40 | "@logseq/libs": "^0.0.15", 41 | "chrono-node": "^2.7.6", 42 | "logseq-dateutils": "^0.0.26", 43 | "react": "^18.3.1", 44 | "react-dom": "^18.3.1", 45 | "react-string-replace": "github:iansinnott/react-string-replace" 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 | "prettier": "^3.3.2", 62 | "typescript": "^5.5.3", 63 | "typescript-eslint": "^7.15.0", 64 | "vite": "^4.5.3", 65 | "vite-plugin-logseq": "^1.1.2", 66 | "vite-tsconfig-paths": "^4.3.2" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@asseinfo/react-kanban': 12 | specifier: ^2.2.0 13 | version: 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 14 | '@dnd-kit/core': 15 | specifier: ^6.1.0 16 | version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 17 | '@dnd-kit/modifiers': 18 | specifier: ^7.0.0 19 | version: 7.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) 20 | '@dnd-kit/sortable': 21 | specifier: ^8.0.0 22 | 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) 23 | '@dnd-kit/utilities': 24 | specifier: ^3.2.2 25 | version: 3.2.2(react@18.3.1) 26 | '@logseq/libs': 27 | specifier: ^0.0.15 28 | version: 0.0.15 29 | chrono-node: 30 | specifier: ^2.7.6 31 | version: 2.7.6 32 | logseq-dateutils: 33 | specifier: ^0.0.26 34 | version: 0.0.26 35 | react: 36 | specifier: ^18.3.1 37 | version: 18.3.1 38 | react-dom: 39 | specifier: ^18.3.1 40 | version: 18.3.1(react@18.3.1) 41 | react-string-replace: 42 | specifier: github:iansinnott/react-string-replace 43 | version: https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e 44 | devDependencies: 45 | '@eslint/js': 46 | specifier: ^9.6.0 47 | version: 9.6.0 48 | '@types/eslint': 49 | specifier: ^8.56.10 50 | version: 8.56.10 51 | '@types/eslint-config-prettier': 52 | specifier: ^6.11.3 53 | version: 6.11.3 54 | '@types/eslint__js': 55 | specifier: ^8.42.3 56 | version: 8.42.3 57 | '@types/node': 58 | specifier: ^20.14.10 59 | version: 20.14.10 60 | '@types/react': 61 | specifier: ^18.3.3 62 | version: 18.3.3 63 | '@types/react-dom': 64 | specifier: ^18.3.0 65 | version: 18.3.0 66 | '@typescript-eslint/eslint-plugin': 67 | specifier: ^6.21.0 68 | version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) 69 | '@typescript-eslint/parser': 70 | specifier: ^6.21.0 71 | version: 6.21.0(eslint@8.57.0)(typescript@5.5.3) 72 | eslint: 73 | specifier: ^8.57.0 74 | version: 8.57.0 75 | eslint-config-prettier: 76 | specifier: ^9.1.0 77 | version: 9.1.0(eslint@8.57.0) 78 | eslint-plugin-prettier: 79 | specifier: ^5.1.3 80 | version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) 81 | eslint-plugin-simple-import-sort: 82 | specifier: ^12.1.1 83 | version: 12.1.1(eslint@8.57.0) 84 | prettier: 85 | specifier: ^3.3.2 86 | version: 3.3.2 87 | typescript: 88 | specifier: ^5.5.3 89 | version: 5.5.3 90 | typescript-eslint: 91 | specifier: ^7.15.0 92 | version: 7.15.0(eslint@8.57.0)(typescript@5.5.3) 93 | vite: 94 | specifier: ^4.5.3 95 | version: 4.5.3(@types/node@20.14.10) 96 | vite-plugin-logseq: 97 | specifier: ^1.1.2 98 | version: 1.1.2 99 | vite-tsconfig-paths: 100 | specifier: ^4.3.2 101 | version: 4.3.2(typescript@5.5.3)(vite@4.5.3(@types/node@20.14.10)) 102 | 103 | packages: 104 | 105 | '@asseinfo/react-kanban@2.2.0': 106 | resolution: {integrity: sha512-/gCigrNXRHeP9VCo8RipTOrA0vAPRIOThJhR4ibVxe6BLkaWFUEuJ1RMT4fODpRRsE3XsdrfVGKkfpRBKgvxXg==} 107 | peerDependencies: 108 | react: ^16.8.0 || ^17.0.0 109 | react-dom: ^16.8.0 || ^17.0.0 110 | 111 | '@babel/runtime@7.24.7': 112 | resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} 113 | engines: {node: '>=6.9.0'} 114 | 115 | '@dnd-kit/accessibility@3.1.0': 116 | resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} 117 | peerDependencies: 118 | react: '>=16.8.0' 119 | 120 | '@dnd-kit/core@6.1.0': 121 | resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} 122 | peerDependencies: 123 | react: '>=16.8.0' 124 | react-dom: '>=16.8.0' 125 | 126 | '@dnd-kit/modifiers@7.0.0': 127 | resolution: {integrity: sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==} 128 | peerDependencies: 129 | '@dnd-kit/core': ^6.1.0 130 | react: '>=16.8.0' 131 | 132 | '@dnd-kit/sortable@8.0.0': 133 | resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} 134 | peerDependencies: 135 | '@dnd-kit/core': ^6.1.0 136 | react: '>=16.8.0' 137 | 138 | '@dnd-kit/utilities@3.2.2': 139 | resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} 140 | peerDependencies: 141 | react: '>=16.8.0' 142 | 143 | '@esbuild/android-arm64@0.18.20': 144 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 145 | engines: {node: '>=12'} 146 | cpu: [arm64] 147 | os: [android] 148 | 149 | '@esbuild/android-arm@0.18.20': 150 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 151 | engines: {node: '>=12'} 152 | cpu: [arm] 153 | os: [android] 154 | 155 | '@esbuild/android-x64@0.18.20': 156 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 157 | engines: {node: '>=12'} 158 | cpu: [x64] 159 | os: [android] 160 | 161 | '@esbuild/darwin-arm64@0.18.20': 162 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 163 | engines: {node: '>=12'} 164 | cpu: [arm64] 165 | os: [darwin] 166 | 167 | '@esbuild/darwin-x64@0.18.20': 168 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 169 | engines: {node: '>=12'} 170 | cpu: [x64] 171 | os: [darwin] 172 | 173 | '@esbuild/freebsd-arm64@0.18.20': 174 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 175 | engines: {node: '>=12'} 176 | cpu: [arm64] 177 | os: [freebsd] 178 | 179 | '@esbuild/freebsd-x64@0.18.20': 180 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 181 | engines: {node: '>=12'} 182 | cpu: [x64] 183 | os: [freebsd] 184 | 185 | '@esbuild/linux-arm64@0.18.20': 186 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 187 | engines: {node: '>=12'} 188 | cpu: [arm64] 189 | os: [linux] 190 | 191 | '@esbuild/linux-arm@0.18.20': 192 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 193 | engines: {node: '>=12'} 194 | cpu: [arm] 195 | os: [linux] 196 | 197 | '@esbuild/linux-ia32@0.18.20': 198 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 199 | engines: {node: '>=12'} 200 | cpu: [ia32] 201 | os: [linux] 202 | 203 | '@esbuild/linux-loong64@0.18.20': 204 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 205 | engines: {node: '>=12'} 206 | cpu: [loong64] 207 | os: [linux] 208 | 209 | '@esbuild/linux-mips64el@0.18.20': 210 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 211 | engines: {node: '>=12'} 212 | cpu: [mips64el] 213 | os: [linux] 214 | 215 | '@esbuild/linux-ppc64@0.18.20': 216 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 217 | engines: {node: '>=12'} 218 | cpu: [ppc64] 219 | os: [linux] 220 | 221 | '@esbuild/linux-riscv64@0.18.20': 222 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 223 | engines: {node: '>=12'} 224 | cpu: [riscv64] 225 | os: [linux] 226 | 227 | '@esbuild/linux-s390x@0.18.20': 228 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 229 | engines: {node: '>=12'} 230 | cpu: [s390x] 231 | os: [linux] 232 | 233 | '@esbuild/linux-x64@0.18.20': 234 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 235 | engines: {node: '>=12'} 236 | cpu: [x64] 237 | os: [linux] 238 | 239 | '@esbuild/netbsd-x64@0.18.20': 240 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 241 | engines: {node: '>=12'} 242 | cpu: [x64] 243 | os: [netbsd] 244 | 245 | '@esbuild/openbsd-x64@0.18.20': 246 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 247 | engines: {node: '>=12'} 248 | cpu: [x64] 249 | os: [openbsd] 250 | 251 | '@esbuild/sunos-x64@0.18.20': 252 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 253 | engines: {node: '>=12'} 254 | cpu: [x64] 255 | os: [sunos] 256 | 257 | '@esbuild/win32-arm64@0.18.20': 258 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 259 | engines: {node: '>=12'} 260 | cpu: [arm64] 261 | os: [win32] 262 | 263 | '@esbuild/win32-ia32@0.18.20': 264 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 265 | engines: {node: '>=12'} 266 | cpu: [ia32] 267 | os: [win32] 268 | 269 | '@esbuild/win32-x64@0.18.20': 270 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 271 | engines: {node: '>=12'} 272 | cpu: [x64] 273 | os: [win32] 274 | 275 | '@eslint-community/eslint-utils@4.4.0': 276 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 277 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 278 | peerDependencies: 279 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 280 | 281 | '@eslint-community/regexpp@4.11.0': 282 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} 283 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 284 | 285 | '@eslint/eslintrc@2.1.4': 286 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 287 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 288 | 289 | '@eslint/js@8.57.0': 290 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 291 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 292 | 293 | '@eslint/js@9.6.0': 294 | resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} 295 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 296 | 297 | '@humanwhocodes/config-array@0.11.14': 298 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 299 | engines: {node: '>=10.10.0'} 300 | deprecated: Use @eslint/config-array instead 301 | 302 | '@humanwhocodes/module-importer@1.0.1': 303 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 304 | engines: {node: '>=12.22'} 305 | 306 | '@humanwhocodes/object-schema@2.0.3': 307 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 308 | deprecated: Use @eslint/object-schema instead 309 | 310 | '@logseq/libs@0.0.15': 311 | resolution: {integrity: sha512-Z4YrYGfu8Y3s9LTqVnPGkxlO+KZtP1YalH/A63zYgxP61cV5QtKlnHWNcjsKxsD5CkaSL4MlSN4mf7wNx/Fm0A==} 312 | 313 | '@nodelib/fs.scandir@2.1.5': 314 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 315 | engines: {node: '>= 8'} 316 | 317 | '@nodelib/fs.stat@2.0.5': 318 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 319 | engines: {node: '>= 8'} 320 | 321 | '@nodelib/fs.walk@1.2.8': 322 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 323 | engines: {node: '>= 8'} 324 | 325 | '@pkgr/core@0.1.1': 326 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 327 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 328 | 329 | '@types/eslint-config-prettier@6.11.3': 330 | resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} 331 | 332 | '@types/eslint@8.56.10': 333 | resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} 334 | 335 | '@types/eslint__js@8.42.3': 336 | resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} 337 | 338 | '@types/estree@1.0.5': 339 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 340 | 341 | '@types/hoist-non-react-statics@3.3.5': 342 | resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} 343 | 344 | '@types/json-schema@7.0.15': 345 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 346 | 347 | '@types/node@20.14.10': 348 | resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} 349 | 350 | '@types/prop-types@15.7.12': 351 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 352 | 353 | '@types/react-dom@18.3.0': 354 | resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 355 | 356 | '@types/react-redux@7.1.33': 357 | resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} 358 | 359 | '@types/react@18.3.3': 360 | resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} 361 | 362 | '@types/semver@7.5.8': 363 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 364 | 365 | '@typescript-eslint/eslint-plugin@6.21.0': 366 | resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} 367 | engines: {node: ^16.0.0 || >=18.0.0} 368 | peerDependencies: 369 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 370 | eslint: ^7.0.0 || ^8.0.0 371 | typescript: '*' 372 | peerDependenciesMeta: 373 | typescript: 374 | optional: true 375 | 376 | '@typescript-eslint/eslint-plugin@7.15.0': 377 | resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} 378 | engines: {node: ^18.18.0 || >=20.0.0} 379 | peerDependencies: 380 | '@typescript-eslint/parser': ^7.0.0 381 | eslint: ^8.56.0 382 | typescript: '*' 383 | peerDependenciesMeta: 384 | typescript: 385 | optional: true 386 | 387 | '@typescript-eslint/parser@6.21.0': 388 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 389 | engines: {node: ^16.0.0 || >=18.0.0} 390 | peerDependencies: 391 | eslint: ^7.0.0 || ^8.0.0 392 | typescript: '*' 393 | peerDependenciesMeta: 394 | typescript: 395 | optional: true 396 | 397 | '@typescript-eslint/parser@7.15.0': 398 | resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} 399 | engines: {node: ^18.18.0 || >=20.0.0} 400 | peerDependencies: 401 | eslint: ^8.56.0 402 | typescript: '*' 403 | peerDependenciesMeta: 404 | typescript: 405 | optional: true 406 | 407 | '@typescript-eslint/scope-manager@6.21.0': 408 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 409 | engines: {node: ^16.0.0 || >=18.0.0} 410 | 411 | '@typescript-eslint/scope-manager@7.15.0': 412 | resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} 413 | engines: {node: ^18.18.0 || >=20.0.0} 414 | 415 | '@typescript-eslint/type-utils@6.21.0': 416 | resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} 417 | engines: {node: ^16.0.0 || >=18.0.0} 418 | peerDependencies: 419 | eslint: ^7.0.0 || ^8.0.0 420 | typescript: '*' 421 | peerDependenciesMeta: 422 | typescript: 423 | optional: true 424 | 425 | '@typescript-eslint/type-utils@7.15.0': 426 | resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} 427 | engines: {node: ^18.18.0 || >=20.0.0} 428 | peerDependencies: 429 | eslint: ^8.56.0 430 | typescript: '*' 431 | peerDependenciesMeta: 432 | typescript: 433 | optional: true 434 | 435 | '@typescript-eslint/types@6.21.0': 436 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 437 | engines: {node: ^16.0.0 || >=18.0.0} 438 | 439 | '@typescript-eslint/types@7.15.0': 440 | resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} 441 | engines: {node: ^18.18.0 || >=20.0.0} 442 | 443 | '@typescript-eslint/typescript-estree@6.21.0': 444 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 445 | engines: {node: ^16.0.0 || >=18.0.0} 446 | peerDependencies: 447 | typescript: '*' 448 | peerDependenciesMeta: 449 | typescript: 450 | optional: true 451 | 452 | '@typescript-eslint/typescript-estree@7.15.0': 453 | resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} 454 | engines: {node: ^18.18.0 || >=20.0.0} 455 | peerDependencies: 456 | typescript: '*' 457 | peerDependenciesMeta: 458 | typescript: 459 | optional: true 460 | 461 | '@typescript-eslint/utils@6.21.0': 462 | resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} 463 | engines: {node: ^16.0.0 || >=18.0.0} 464 | peerDependencies: 465 | eslint: ^7.0.0 || ^8.0.0 466 | 467 | '@typescript-eslint/utils@7.15.0': 468 | resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} 469 | engines: {node: ^18.18.0 || >=20.0.0} 470 | peerDependencies: 471 | eslint: ^8.56.0 472 | 473 | '@typescript-eslint/visitor-keys@6.21.0': 474 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 475 | engines: {node: ^16.0.0 || >=18.0.0} 476 | 477 | '@typescript-eslint/visitor-keys@7.15.0': 478 | resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} 479 | engines: {node: ^18.18.0 || >=20.0.0} 480 | 481 | '@ungap/structured-clone@1.2.0': 482 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 483 | 484 | acorn-jsx@5.3.2: 485 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 486 | peerDependencies: 487 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 488 | 489 | acorn@8.12.1: 490 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 491 | engines: {node: '>=0.4.0'} 492 | hasBin: true 493 | 494 | ajv@6.12.6: 495 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 496 | 497 | ansi-regex@5.0.1: 498 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 499 | engines: {node: '>=8'} 500 | 501 | ansi-styles@4.3.0: 502 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 503 | engines: {node: '>=8'} 504 | 505 | argparse@2.0.1: 506 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 507 | 508 | array-union@2.1.0: 509 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 510 | engines: {node: '>=8'} 511 | 512 | balanced-match@1.0.2: 513 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 514 | 515 | brace-expansion@1.1.11: 516 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 517 | 518 | brace-expansion@2.0.1: 519 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 520 | 521 | braces@3.0.3: 522 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 523 | engines: {node: '>=8'} 524 | 525 | callsites@3.1.0: 526 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 527 | engines: {node: '>=6'} 528 | 529 | chalk@4.1.2: 530 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 531 | engines: {node: '>=10'} 532 | 533 | chrono-node@2.7.6: 534 | resolution: {integrity: sha512-yugKSRLHc6B6kXxm/DwNc94zhaddAjCSO9IOGH3w7NIWNM+gUoLl/2/XLndiw4I+XhU4H2LOhC5Ab2JjS6JWsA==} 535 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 536 | 537 | color-convert@2.0.1: 538 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 539 | engines: {node: '>=7.0.0'} 540 | 541 | color-name@1.1.4: 542 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 543 | 544 | concat-map@0.0.1: 545 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 546 | 547 | cross-spawn@7.0.3: 548 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 549 | engines: {node: '>= 8'} 550 | 551 | css-box-model@1.2.1: 552 | resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} 553 | 554 | csstype@3.1.0: 555 | resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} 556 | 557 | csstype@3.1.3: 558 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 559 | 560 | dayjs@1.11.11: 561 | resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} 562 | 563 | debug@4.3.4: 564 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 565 | engines: {node: '>=6.0'} 566 | peerDependencies: 567 | supports-color: '*' 568 | peerDependenciesMeta: 569 | supports-color: 570 | optional: true 571 | 572 | debug@4.3.5: 573 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} 574 | engines: {node: '>=6.0'} 575 | peerDependencies: 576 | supports-color: '*' 577 | peerDependenciesMeta: 578 | supports-color: 579 | optional: true 580 | 581 | deep-is@0.1.4: 582 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 583 | 584 | dir-glob@3.0.1: 585 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 586 | engines: {node: '>=8'} 587 | 588 | doctrine@3.0.0: 589 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 590 | engines: {node: '>=6.0.0'} 591 | 592 | dompurify@2.3.8: 593 | resolution: {integrity: sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw==} 594 | 595 | dot-case@3.0.4: 596 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 597 | 598 | esbuild@0.18.20: 599 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 600 | engines: {node: '>=12'} 601 | hasBin: true 602 | 603 | escape-string-regexp@4.0.0: 604 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 605 | engines: {node: '>=10'} 606 | 607 | eslint-config-prettier@9.1.0: 608 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 609 | hasBin: true 610 | peerDependencies: 611 | eslint: '>=7.0.0' 612 | 613 | eslint-plugin-prettier@5.1.3: 614 | resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} 615 | engines: {node: ^14.18.0 || >=16.0.0} 616 | peerDependencies: 617 | '@types/eslint': '>=8.0.0' 618 | eslint: '>=8.0.0' 619 | eslint-config-prettier: '*' 620 | prettier: '>=3.0.0' 621 | peerDependenciesMeta: 622 | '@types/eslint': 623 | optional: true 624 | eslint-config-prettier: 625 | optional: true 626 | 627 | eslint-plugin-simple-import-sort@12.1.1: 628 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 629 | peerDependencies: 630 | eslint: '>=5.0.0' 631 | 632 | eslint-scope@7.2.2: 633 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 634 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 635 | 636 | eslint-visitor-keys@3.4.3: 637 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 638 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 639 | 640 | eslint@8.57.0: 641 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 642 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 643 | hasBin: true 644 | 645 | espree@9.6.1: 646 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 647 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 648 | 649 | esquery@1.5.0: 650 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 651 | engines: {node: '>=0.10'} 652 | 653 | esrecurse@4.3.0: 654 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 655 | engines: {node: '>=4.0'} 656 | 657 | estraverse@5.3.0: 658 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 659 | engines: {node: '>=4.0'} 660 | 661 | esutils@2.0.3: 662 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 663 | engines: {node: '>=0.10.0'} 664 | 665 | eventemitter3@4.0.7: 666 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 667 | 668 | fast-deep-equal@3.1.3: 669 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 670 | 671 | fast-diff@1.3.0: 672 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 673 | 674 | fast-glob@3.3.2: 675 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 676 | engines: {node: '>=8.6.0'} 677 | 678 | fast-json-stable-stringify@2.1.0: 679 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 680 | 681 | fast-levenshtein@2.0.6: 682 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 683 | 684 | fastq@1.17.1: 685 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 686 | 687 | file-entry-cache@6.0.1: 688 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 689 | engines: {node: ^10.12.0 || >=12.0.0} 690 | 691 | fill-range@7.1.1: 692 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 693 | engines: {node: '>=8'} 694 | 695 | find-up@5.0.0: 696 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 697 | engines: {node: '>=10'} 698 | 699 | flat-cache@3.2.0: 700 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 701 | engines: {node: ^10.12.0 || >=12.0.0} 702 | 703 | flatted@3.3.1: 704 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 705 | 706 | fs.realpath@1.0.0: 707 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 708 | 709 | fsevents@2.3.3: 710 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 711 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 712 | os: [darwin] 713 | 714 | glob-parent@5.1.2: 715 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 716 | engines: {node: '>= 6'} 717 | 718 | glob-parent@6.0.2: 719 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 720 | engines: {node: '>=10.13.0'} 721 | 722 | glob@7.2.3: 723 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 724 | deprecated: Glob versions prior to v9 are no longer supported 725 | 726 | globals@13.24.0: 727 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 728 | engines: {node: '>=8'} 729 | 730 | globby@11.1.0: 731 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 732 | engines: {node: '>=10'} 733 | 734 | globrex@0.1.2: 735 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 736 | 737 | graphemer@1.4.0: 738 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 739 | 740 | has-flag@4.0.0: 741 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 742 | engines: {node: '>=8'} 743 | 744 | hoist-non-react-statics@3.3.2: 745 | resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} 746 | 747 | ignore@5.3.1: 748 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 749 | engines: {node: '>= 4'} 750 | 751 | import-fresh@3.3.0: 752 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 753 | engines: {node: '>=6'} 754 | 755 | imurmurhash@0.1.4: 756 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 757 | engines: {node: '>=0.8.19'} 758 | 759 | inflight@1.0.6: 760 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 761 | 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. 762 | 763 | inherits@2.0.3: 764 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 765 | 766 | inherits@2.0.4: 767 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 768 | 769 | is-extglob@2.1.1: 770 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 771 | engines: {node: '>=0.10.0'} 772 | 773 | is-glob@4.0.3: 774 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 775 | engines: {node: '>=0.10.0'} 776 | 777 | is-number@7.0.0: 778 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 779 | engines: {node: '>=0.12.0'} 780 | 781 | is-path-inside@3.0.3: 782 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 783 | engines: {node: '>=8'} 784 | 785 | isexe@2.0.0: 786 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 787 | 788 | js-tokens@4.0.0: 789 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 790 | 791 | js-yaml@4.1.0: 792 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 793 | hasBin: true 794 | 795 | json-buffer@3.0.1: 796 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 797 | 798 | json-schema-traverse@0.4.1: 799 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 800 | 801 | json-stable-stringify-without-jsonify@1.0.1: 802 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 803 | 804 | keyv@4.5.4: 805 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 806 | 807 | levn@0.4.1: 808 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 809 | engines: {node: '>= 0.8.0'} 810 | 811 | locate-path@6.0.0: 812 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 813 | engines: {node: '>=10'} 814 | 815 | lodash-es@4.17.21: 816 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 817 | 818 | lodash.merge@4.6.2: 819 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 820 | 821 | logseq-dateutils@0.0.26: 822 | resolution: {integrity: sha512-HUipF4ZqIq5ecrR53Rp7sstMgEQc3lkrVZ8u0uZXm5MMBTeipzFSLwifD+VE1c0Kl6G2B4JFMux360qj1JI6rg==} 823 | 824 | loose-envify@1.4.0: 825 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 826 | hasBin: true 827 | 828 | lower-case@2.0.2: 829 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 830 | 831 | magic-string@0.26.7: 832 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 833 | engines: {node: '>=12'} 834 | 835 | memoize-one@5.2.1: 836 | resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} 837 | 838 | merge2@1.4.1: 839 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 840 | engines: {node: '>= 8'} 841 | 842 | micromatch@4.0.7: 843 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 844 | engines: {node: '>=8.6'} 845 | 846 | minimatch@3.1.2: 847 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 848 | 849 | minimatch@9.0.3: 850 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 851 | engines: {node: '>=16 || 14 >=14.17'} 852 | 853 | minimatch@9.0.5: 854 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 855 | engines: {node: '>=16 || 14 >=14.17'} 856 | 857 | ms@2.1.2: 858 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 859 | 860 | nanoid@3.3.7: 861 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 862 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 863 | hasBin: true 864 | 865 | natural-compare@1.4.0: 866 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 867 | 868 | no-case@3.0.4: 869 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 870 | 871 | object-assign@4.1.1: 872 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 873 | engines: {node: '>=0.10.0'} 874 | 875 | once@1.4.0: 876 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 877 | 878 | optionator@0.9.4: 879 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 880 | engines: {node: '>= 0.8.0'} 881 | 882 | p-limit@3.1.0: 883 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 884 | engines: {node: '>=10'} 885 | 886 | p-locate@5.0.0: 887 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 888 | engines: {node: '>=10'} 889 | 890 | parent-module@1.0.1: 891 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 892 | engines: {node: '>=6'} 893 | 894 | path-exists@4.0.0: 895 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 896 | engines: {node: '>=8'} 897 | 898 | path-is-absolute@1.0.1: 899 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 900 | engines: {node: '>=0.10.0'} 901 | 902 | path-key@3.1.1: 903 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 904 | engines: {node: '>=8'} 905 | 906 | path-type@4.0.0: 907 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 908 | engines: {node: '>=8'} 909 | 910 | path@0.12.7: 911 | resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} 912 | 913 | picocolors@1.0.1: 914 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 915 | 916 | picomatch@2.3.1: 917 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 918 | engines: {node: '>=8.6'} 919 | 920 | postcss@8.4.39: 921 | resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} 922 | engines: {node: ^10 || ^12 || >=14} 923 | 924 | prelude-ls@1.2.1: 925 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 926 | engines: {node: '>= 0.8.0'} 927 | 928 | prettier-linter-helpers@1.0.0: 929 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 930 | engines: {node: '>=6.0.0'} 931 | 932 | prettier@3.3.2: 933 | resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} 934 | engines: {node: '>=14'} 935 | hasBin: true 936 | 937 | process@0.11.10: 938 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 939 | engines: {node: '>= 0.6.0'} 940 | 941 | prop-types@15.8.1: 942 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 943 | 944 | punycode@2.3.1: 945 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 946 | engines: {node: '>=6'} 947 | 948 | queue-microtask@1.2.3: 949 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 950 | 951 | raf-schd@4.0.3: 952 | resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} 953 | 954 | react-beautiful-dnd@13.1.1: 955 | resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==} 956 | peerDependencies: 957 | react: ^16.8.5 || ^17.0.0 || ^18.0.0 958 | react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 959 | 960 | react-dom@18.3.1: 961 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 962 | peerDependencies: 963 | react: ^18.3.1 964 | 965 | react-is@16.13.1: 966 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 967 | 968 | react-is@17.0.2: 969 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 970 | 971 | react-redux@7.2.9: 972 | resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} 973 | peerDependencies: 974 | react: ^16.8.3 || ^17 || ^18 975 | react-dom: '*' 976 | react-native: '*' 977 | peerDependenciesMeta: 978 | react-dom: 979 | optional: true 980 | react-native: 981 | optional: true 982 | 983 | react-string-replace@https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e: 984 | resolution: {tarball: https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e} 985 | version: 1.1.1 986 | engines: {node: '>=0.12.0'} 987 | 988 | react@18.3.1: 989 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 990 | engines: {node: '>=0.10.0'} 991 | 992 | redux@4.2.1: 993 | resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} 994 | 995 | regenerator-runtime@0.14.1: 996 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 997 | 998 | resolve-from@4.0.0: 999 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1000 | engines: {node: '>=4'} 1001 | 1002 | reusify@1.0.4: 1003 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1004 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1005 | 1006 | rimraf@3.0.2: 1007 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1008 | deprecated: Rimraf versions prior to v4 are no longer supported 1009 | hasBin: true 1010 | 1011 | rollup@3.29.4: 1012 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 1013 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1014 | hasBin: true 1015 | 1016 | run-parallel@1.2.0: 1017 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1018 | 1019 | scheduler@0.23.2: 1020 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 1021 | 1022 | semver@7.6.2: 1023 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 1024 | engines: {node: '>=10'} 1025 | hasBin: true 1026 | 1027 | shebang-command@2.0.0: 1028 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1029 | engines: {node: '>=8'} 1030 | 1031 | shebang-regex@3.0.0: 1032 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1033 | engines: {node: '>=8'} 1034 | 1035 | slash@3.0.0: 1036 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1037 | engines: {node: '>=8'} 1038 | 1039 | snake-case@3.0.4: 1040 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 1041 | 1042 | source-map-js@1.2.0: 1043 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1044 | engines: {node: '>=0.10.0'} 1045 | 1046 | sourcemap-codec@1.4.8: 1047 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1048 | deprecated: Please use @jridgewell/sourcemap-codec instead 1049 | 1050 | strip-ansi@6.0.1: 1051 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1052 | engines: {node: '>=8'} 1053 | 1054 | strip-json-comments@3.1.1: 1055 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1056 | engines: {node: '>=8'} 1057 | 1058 | supports-color@7.2.0: 1059 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1060 | engines: {node: '>=8'} 1061 | 1062 | synckit@0.8.8: 1063 | resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} 1064 | engines: {node: ^14.18.0 || >=16.0.0} 1065 | 1066 | text-table@0.2.0: 1067 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1068 | 1069 | tiny-invariant@1.3.3: 1070 | resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} 1071 | 1072 | to-regex-range@5.0.1: 1073 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1074 | engines: {node: '>=8.0'} 1075 | 1076 | ts-api-utils@1.3.0: 1077 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1078 | engines: {node: '>=16'} 1079 | peerDependencies: 1080 | typescript: '>=4.2.0' 1081 | 1082 | tsconfck@3.1.1: 1083 | resolution: {integrity: sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==} 1084 | engines: {node: ^18 || >=20} 1085 | hasBin: true 1086 | peerDependencies: 1087 | typescript: ^5.0.0 1088 | peerDependenciesMeta: 1089 | typescript: 1090 | optional: true 1091 | 1092 | tslib@2.6.3: 1093 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 1094 | 1095 | type-check@0.4.0: 1096 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1097 | engines: {node: '>= 0.8.0'} 1098 | 1099 | type-fest@0.20.2: 1100 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1101 | engines: {node: '>=10'} 1102 | 1103 | typescript-eslint@7.15.0: 1104 | resolution: {integrity: sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==} 1105 | engines: {node: ^18.18.0 || >=20.0.0} 1106 | peerDependencies: 1107 | eslint: ^8.56.0 1108 | typescript: '*' 1109 | peerDependenciesMeta: 1110 | typescript: 1111 | optional: true 1112 | 1113 | typescript@5.5.3: 1114 | resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} 1115 | engines: {node: '>=14.17'} 1116 | hasBin: true 1117 | 1118 | undici-types@5.26.5: 1119 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1120 | 1121 | uri-js@4.4.1: 1122 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1123 | 1124 | use-memo-one@1.1.3: 1125 | resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} 1126 | peerDependencies: 1127 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1128 | 1129 | util@0.10.4: 1130 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 1131 | 1132 | vite-plugin-logseq@1.1.2: 1133 | resolution: {integrity: sha512-l5YvoH3K25Zx9eqgoJFug7NfVqSPwq7/FcYYhN1TkdG8ZOiD+c+TAwdCS2dJbGgvx8GmSpbgwSZWgslB+wH53g==} 1134 | 1135 | vite-tsconfig-paths@4.3.2: 1136 | resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} 1137 | peerDependencies: 1138 | vite: '*' 1139 | peerDependenciesMeta: 1140 | vite: 1141 | optional: true 1142 | 1143 | vite@4.5.3: 1144 | resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} 1145 | engines: {node: ^14.18.0 || >=16.0.0} 1146 | hasBin: true 1147 | peerDependencies: 1148 | '@types/node': '>= 14' 1149 | less: '*' 1150 | lightningcss: ^1.21.0 1151 | sass: '*' 1152 | stylus: '*' 1153 | sugarss: '*' 1154 | terser: ^5.4.0 1155 | peerDependenciesMeta: 1156 | '@types/node': 1157 | optional: true 1158 | less: 1159 | optional: true 1160 | lightningcss: 1161 | optional: true 1162 | sass: 1163 | optional: true 1164 | stylus: 1165 | optional: true 1166 | sugarss: 1167 | optional: true 1168 | terser: 1169 | optional: true 1170 | 1171 | which@2.0.2: 1172 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1173 | engines: {node: '>= 8'} 1174 | hasBin: true 1175 | 1176 | word-wrap@1.2.5: 1177 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1178 | engines: {node: '>=0.10.0'} 1179 | 1180 | wrappy@1.0.2: 1181 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1182 | 1183 | yocto-queue@0.1.0: 1184 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1185 | engines: {node: '>=10'} 1186 | 1187 | snapshots: 1188 | 1189 | '@asseinfo/react-kanban@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1190 | dependencies: 1191 | react: 18.3.1 1192 | react-beautiful-dnd: 13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1193 | react-dom: 18.3.1(react@18.3.1) 1194 | transitivePeerDependencies: 1195 | - react-native 1196 | 1197 | '@babel/runtime@7.24.7': 1198 | dependencies: 1199 | regenerator-runtime: 0.14.1 1200 | 1201 | '@dnd-kit/accessibility@3.1.0(react@18.3.1)': 1202 | dependencies: 1203 | react: 18.3.1 1204 | tslib: 2.6.3 1205 | 1206 | '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 1207 | dependencies: 1208 | '@dnd-kit/accessibility': 3.1.0(react@18.3.1) 1209 | '@dnd-kit/utilities': 3.2.2(react@18.3.1) 1210 | react: 18.3.1 1211 | react-dom: 18.3.1(react@18.3.1) 1212 | tslib: 2.6.3 1213 | 1214 | '@dnd-kit/modifiers@7.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)': 1215 | dependencies: 1216 | '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1217 | '@dnd-kit/utilities': 3.2.2(react@18.3.1) 1218 | react: 18.3.1 1219 | tslib: 2.6.3 1220 | 1221 | '@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)': 1222 | dependencies: 1223 | '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1224 | '@dnd-kit/utilities': 3.2.2(react@18.3.1) 1225 | react: 18.3.1 1226 | tslib: 2.6.3 1227 | 1228 | '@dnd-kit/utilities@3.2.2(react@18.3.1)': 1229 | dependencies: 1230 | react: 18.3.1 1231 | tslib: 2.6.3 1232 | 1233 | '@esbuild/android-arm64@0.18.20': 1234 | optional: true 1235 | 1236 | '@esbuild/android-arm@0.18.20': 1237 | optional: true 1238 | 1239 | '@esbuild/android-x64@0.18.20': 1240 | optional: true 1241 | 1242 | '@esbuild/darwin-arm64@0.18.20': 1243 | optional: true 1244 | 1245 | '@esbuild/darwin-x64@0.18.20': 1246 | optional: true 1247 | 1248 | '@esbuild/freebsd-arm64@0.18.20': 1249 | optional: true 1250 | 1251 | '@esbuild/freebsd-x64@0.18.20': 1252 | optional: true 1253 | 1254 | '@esbuild/linux-arm64@0.18.20': 1255 | optional: true 1256 | 1257 | '@esbuild/linux-arm@0.18.20': 1258 | optional: true 1259 | 1260 | '@esbuild/linux-ia32@0.18.20': 1261 | optional: true 1262 | 1263 | '@esbuild/linux-loong64@0.18.20': 1264 | optional: true 1265 | 1266 | '@esbuild/linux-mips64el@0.18.20': 1267 | optional: true 1268 | 1269 | '@esbuild/linux-ppc64@0.18.20': 1270 | optional: true 1271 | 1272 | '@esbuild/linux-riscv64@0.18.20': 1273 | optional: true 1274 | 1275 | '@esbuild/linux-s390x@0.18.20': 1276 | optional: true 1277 | 1278 | '@esbuild/linux-x64@0.18.20': 1279 | optional: true 1280 | 1281 | '@esbuild/netbsd-x64@0.18.20': 1282 | optional: true 1283 | 1284 | '@esbuild/openbsd-x64@0.18.20': 1285 | optional: true 1286 | 1287 | '@esbuild/sunos-x64@0.18.20': 1288 | optional: true 1289 | 1290 | '@esbuild/win32-arm64@0.18.20': 1291 | optional: true 1292 | 1293 | '@esbuild/win32-ia32@0.18.20': 1294 | optional: true 1295 | 1296 | '@esbuild/win32-x64@0.18.20': 1297 | optional: true 1298 | 1299 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': 1300 | dependencies: 1301 | eslint: 8.57.0 1302 | eslint-visitor-keys: 3.4.3 1303 | 1304 | '@eslint-community/regexpp@4.11.0': {} 1305 | 1306 | '@eslint/eslintrc@2.1.4': 1307 | dependencies: 1308 | ajv: 6.12.6 1309 | debug: 4.3.5 1310 | espree: 9.6.1 1311 | globals: 13.24.0 1312 | ignore: 5.3.1 1313 | import-fresh: 3.3.0 1314 | js-yaml: 4.1.0 1315 | minimatch: 3.1.2 1316 | strip-json-comments: 3.1.1 1317 | transitivePeerDependencies: 1318 | - supports-color 1319 | 1320 | '@eslint/js@8.57.0': {} 1321 | 1322 | '@eslint/js@9.6.0': {} 1323 | 1324 | '@humanwhocodes/config-array@0.11.14': 1325 | dependencies: 1326 | '@humanwhocodes/object-schema': 2.0.3 1327 | debug: 4.3.5 1328 | minimatch: 3.1.2 1329 | transitivePeerDependencies: 1330 | - supports-color 1331 | 1332 | '@humanwhocodes/module-importer@1.0.1': {} 1333 | 1334 | '@humanwhocodes/object-schema@2.0.3': {} 1335 | 1336 | '@logseq/libs@0.0.15': 1337 | dependencies: 1338 | csstype: 3.1.0 1339 | debug: 4.3.4 1340 | dompurify: 2.3.8 1341 | eventemitter3: 4.0.7 1342 | fast-deep-equal: 3.1.3 1343 | lodash-es: 4.17.21 1344 | path: 0.12.7 1345 | snake-case: 3.0.4 1346 | transitivePeerDependencies: 1347 | - supports-color 1348 | 1349 | '@nodelib/fs.scandir@2.1.5': 1350 | dependencies: 1351 | '@nodelib/fs.stat': 2.0.5 1352 | run-parallel: 1.2.0 1353 | 1354 | '@nodelib/fs.stat@2.0.5': {} 1355 | 1356 | '@nodelib/fs.walk@1.2.8': 1357 | dependencies: 1358 | '@nodelib/fs.scandir': 2.1.5 1359 | fastq: 1.17.1 1360 | 1361 | '@pkgr/core@0.1.1': {} 1362 | 1363 | '@types/eslint-config-prettier@6.11.3': {} 1364 | 1365 | '@types/eslint@8.56.10': 1366 | dependencies: 1367 | '@types/estree': 1.0.5 1368 | '@types/json-schema': 7.0.15 1369 | 1370 | '@types/eslint__js@8.42.3': 1371 | dependencies: 1372 | '@types/eslint': 8.56.10 1373 | 1374 | '@types/estree@1.0.5': {} 1375 | 1376 | '@types/hoist-non-react-statics@3.3.5': 1377 | dependencies: 1378 | '@types/react': 18.3.3 1379 | hoist-non-react-statics: 3.3.2 1380 | 1381 | '@types/json-schema@7.0.15': {} 1382 | 1383 | '@types/node@20.14.10': 1384 | dependencies: 1385 | undici-types: 5.26.5 1386 | 1387 | '@types/prop-types@15.7.12': {} 1388 | 1389 | '@types/react-dom@18.3.0': 1390 | dependencies: 1391 | '@types/react': 18.3.3 1392 | 1393 | '@types/react-redux@7.1.33': 1394 | dependencies: 1395 | '@types/hoist-non-react-statics': 3.3.5 1396 | '@types/react': 18.3.3 1397 | hoist-non-react-statics: 3.3.2 1398 | redux: 4.2.1 1399 | 1400 | '@types/react@18.3.3': 1401 | dependencies: 1402 | '@types/prop-types': 15.7.12 1403 | csstype: 3.1.3 1404 | 1405 | '@types/semver@7.5.8': {} 1406 | 1407 | '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': 1408 | dependencies: 1409 | '@eslint-community/regexpp': 4.11.0 1410 | '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) 1411 | '@typescript-eslint/scope-manager': 6.21.0 1412 | '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) 1413 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) 1414 | '@typescript-eslint/visitor-keys': 6.21.0 1415 | debug: 4.3.5 1416 | eslint: 8.57.0 1417 | graphemer: 1.4.0 1418 | ignore: 5.3.1 1419 | natural-compare: 1.4.0 1420 | semver: 7.6.2 1421 | ts-api-utils: 1.3.0(typescript@5.5.3) 1422 | optionalDependencies: 1423 | typescript: 5.5.3 1424 | transitivePeerDependencies: 1425 | - supports-color 1426 | 1427 | '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': 1428 | dependencies: 1429 | '@eslint-community/regexpp': 4.11.0 1430 | '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 1431 | '@typescript-eslint/scope-manager': 7.15.0 1432 | '@typescript-eslint/type-utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 1433 | '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 1434 | '@typescript-eslint/visitor-keys': 7.15.0 1435 | eslint: 8.57.0 1436 | graphemer: 1.4.0 1437 | ignore: 5.3.1 1438 | natural-compare: 1.4.0 1439 | ts-api-utils: 1.3.0(typescript@5.5.3) 1440 | optionalDependencies: 1441 | typescript: 5.5.3 1442 | transitivePeerDependencies: 1443 | - supports-color 1444 | 1445 | '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3)': 1446 | dependencies: 1447 | '@typescript-eslint/scope-manager': 6.21.0 1448 | '@typescript-eslint/types': 6.21.0 1449 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) 1450 | '@typescript-eslint/visitor-keys': 6.21.0 1451 | debug: 4.3.5 1452 | eslint: 8.57.0 1453 | optionalDependencies: 1454 | typescript: 5.5.3 1455 | transitivePeerDependencies: 1456 | - supports-color 1457 | 1458 | '@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3)': 1459 | dependencies: 1460 | '@typescript-eslint/scope-manager': 7.15.0 1461 | '@typescript-eslint/types': 7.15.0 1462 | '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) 1463 | '@typescript-eslint/visitor-keys': 7.15.0 1464 | debug: 4.3.5 1465 | eslint: 8.57.0 1466 | optionalDependencies: 1467 | typescript: 5.5.3 1468 | transitivePeerDependencies: 1469 | - supports-color 1470 | 1471 | '@typescript-eslint/scope-manager@6.21.0': 1472 | dependencies: 1473 | '@typescript-eslint/types': 6.21.0 1474 | '@typescript-eslint/visitor-keys': 6.21.0 1475 | 1476 | '@typescript-eslint/scope-manager@7.15.0': 1477 | dependencies: 1478 | '@typescript-eslint/types': 7.15.0 1479 | '@typescript-eslint/visitor-keys': 7.15.0 1480 | 1481 | '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)': 1482 | dependencies: 1483 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) 1484 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) 1485 | debug: 4.3.5 1486 | eslint: 8.57.0 1487 | ts-api-utils: 1.3.0(typescript@5.5.3) 1488 | optionalDependencies: 1489 | typescript: 5.5.3 1490 | transitivePeerDependencies: 1491 | - supports-color 1492 | 1493 | '@typescript-eslint/type-utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': 1494 | dependencies: 1495 | '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) 1496 | '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 1497 | debug: 4.3.5 1498 | eslint: 8.57.0 1499 | ts-api-utils: 1.3.0(typescript@5.5.3) 1500 | optionalDependencies: 1501 | typescript: 5.5.3 1502 | transitivePeerDependencies: 1503 | - supports-color 1504 | 1505 | '@typescript-eslint/types@6.21.0': {} 1506 | 1507 | '@typescript-eslint/types@7.15.0': {} 1508 | 1509 | '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.3)': 1510 | dependencies: 1511 | '@typescript-eslint/types': 6.21.0 1512 | '@typescript-eslint/visitor-keys': 6.21.0 1513 | debug: 4.3.5 1514 | globby: 11.1.0 1515 | is-glob: 4.0.3 1516 | minimatch: 9.0.3 1517 | semver: 7.6.2 1518 | ts-api-utils: 1.3.0(typescript@5.5.3) 1519 | optionalDependencies: 1520 | typescript: 5.5.3 1521 | transitivePeerDependencies: 1522 | - supports-color 1523 | 1524 | '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': 1525 | dependencies: 1526 | '@typescript-eslint/types': 7.15.0 1527 | '@typescript-eslint/visitor-keys': 7.15.0 1528 | debug: 4.3.5 1529 | globby: 11.1.0 1530 | is-glob: 4.0.3 1531 | minimatch: 9.0.5 1532 | semver: 7.6.2 1533 | ts-api-utils: 1.3.0(typescript@5.5.3) 1534 | optionalDependencies: 1535 | typescript: 5.5.3 1536 | transitivePeerDependencies: 1537 | - supports-color 1538 | 1539 | '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)': 1540 | dependencies: 1541 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1542 | '@types/json-schema': 7.0.15 1543 | '@types/semver': 7.5.8 1544 | '@typescript-eslint/scope-manager': 6.21.0 1545 | '@typescript-eslint/types': 6.21.0 1546 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) 1547 | eslint: 8.57.0 1548 | semver: 7.6.2 1549 | transitivePeerDependencies: 1550 | - supports-color 1551 | - typescript 1552 | 1553 | '@typescript-eslint/utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': 1554 | dependencies: 1555 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1556 | '@typescript-eslint/scope-manager': 7.15.0 1557 | '@typescript-eslint/types': 7.15.0 1558 | '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) 1559 | eslint: 8.57.0 1560 | transitivePeerDependencies: 1561 | - supports-color 1562 | - typescript 1563 | 1564 | '@typescript-eslint/visitor-keys@6.21.0': 1565 | dependencies: 1566 | '@typescript-eslint/types': 6.21.0 1567 | eslint-visitor-keys: 3.4.3 1568 | 1569 | '@typescript-eslint/visitor-keys@7.15.0': 1570 | dependencies: 1571 | '@typescript-eslint/types': 7.15.0 1572 | eslint-visitor-keys: 3.4.3 1573 | 1574 | '@ungap/structured-clone@1.2.0': {} 1575 | 1576 | acorn-jsx@5.3.2(acorn@8.12.1): 1577 | dependencies: 1578 | acorn: 8.12.1 1579 | 1580 | acorn@8.12.1: {} 1581 | 1582 | ajv@6.12.6: 1583 | dependencies: 1584 | fast-deep-equal: 3.1.3 1585 | fast-json-stable-stringify: 2.1.0 1586 | json-schema-traverse: 0.4.1 1587 | uri-js: 4.4.1 1588 | 1589 | ansi-regex@5.0.1: {} 1590 | 1591 | ansi-styles@4.3.0: 1592 | dependencies: 1593 | color-convert: 2.0.1 1594 | 1595 | argparse@2.0.1: {} 1596 | 1597 | array-union@2.1.0: {} 1598 | 1599 | balanced-match@1.0.2: {} 1600 | 1601 | brace-expansion@1.1.11: 1602 | dependencies: 1603 | balanced-match: 1.0.2 1604 | concat-map: 0.0.1 1605 | 1606 | brace-expansion@2.0.1: 1607 | dependencies: 1608 | balanced-match: 1.0.2 1609 | 1610 | braces@3.0.3: 1611 | dependencies: 1612 | fill-range: 7.1.1 1613 | 1614 | callsites@3.1.0: {} 1615 | 1616 | chalk@4.1.2: 1617 | dependencies: 1618 | ansi-styles: 4.3.0 1619 | supports-color: 7.2.0 1620 | 1621 | chrono-node@2.7.6: 1622 | dependencies: 1623 | dayjs: 1.11.11 1624 | 1625 | color-convert@2.0.1: 1626 | dependencies: 1627 | color-name: 1.1.4 1628 | 1629 | color-name@1.1.4: {} 1630 | 1631 | concat-map@0.0.1: {} 1632 | 1633 | cross-spawn@7.0.3: 1634 | dependencies: 1635 | path-key: 3.1.1 1636 | shebang-command: 2.0.0 1637 | which: 2.0.2 1638 | 1639 | css-box-model@1.2.1: 1640 | dependencies: 1641 | tiny-invariant: 1.3.3 1642 | 1643 | csstype@3.1.0: {} 1644 | 1645 | csstype@3.1.3: {} 1646 | 1647 | dayjs@1.11.11: {} 1648 | 1649 | debug@4.3.4: 1650 | dependencies: 1651 | ms: 2.1.2 1652 | 1653 | debug@4.3.5: 1654 | dependencies: 1655 | ms: 2.1.2 1656 | 1657 | deep-is@0.1.4: {} 1658 | 1659 | dir-glob@3.0.1: 1660 | dependencies: 1661 | path-type: 4.0.0 1662 | 1663 | doctrine@3.0.0: 1664 | dependencies: 1665 | esutils: 2.0.3 1666 | 1667 | dompurify@2.3.8: {} 1668 | 1669 | dot-case@3.0.4: 1670 | dependencies: 1671 | no-case: 3.0.4 1672 | tslib: 2.6.3 1673 | 1674 | esbuild@0.18.20: 1675 | optionalDependencies: 1676 | '@esbuild/android-arm': 0.18.20 1677 | '@esbuild/android-arm64': 0.18.20 1678 | '@esbuild/android-x64': 0.18.20 1679 | '@esbuild/darwin-arm64': 0.18.20 1680 | '@esbuild/darwin-x64': 0.18.20 1681 | '@esbuild/freebsd-arm64': 0.18.20 1682 | '@esbuild/freebsd-x64': 0.18.20 1683 | '@esbuild/linux-arm': 0.18.20 1684 | '@esbuild/linux-arm64': 0.18.20 1685 | '@esbuild/linux-ia32': 0.18.20 1686 | '@esbuild/linux-loong64': 0.18.20 1687 | '@esbuild/linux-mips64el': 0.18.20 1688 | '@esbuild/linux-ppc64': 0.18.20 1689 | '@esbuild/linux-riscv64': 0.18.20 1690 | '@esbuild/linux-s390x': 0.18.20 1691 | '@esbuild/linux-x64': 0.18.20 1692 | '@esbuild/netbsd-x64': 0.18.20 1693 | '@esbuild/openbsd-x64': 0.18.20 1694 | '@esbuild/sunos-x64': 0.18.20 1695 | '@esbuild/win32-arm64': 0.18.20 1696 | '@esbuild/win32-ia32': 0.18.20 1697 | '@esbuild/win32-x64': 0.18.20 1698 | 1699 | escape-string-regexp@4.0.0: {} 1700 | 1701 | eslint-config-prettier@9.1.0(eslint@8.57.0): 1702 | dependencies: 1703 | eslint: 8.57.0 1704 | 1705 | eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): 1706 | dependencies: 1707 | eslint: 8.57.0 1708 | prettier: 3.3.2 1709 | prettier-linter-helpers: 1.0.0 1710 | synckit: 0.8.8 1711 | optionalDependencies: 1712 | '@types/eslint': 8.56.10 1713 | eslint-config-prettier: 9.1.0(eslint@8.57.0) 1714 | 1715 | eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.0): 1716 | dependencies: 1717 | eslint: 8.57.0 1718 | 1719 | eslint-scope@7.2.2: 1720 | dependencies: 1721 | esrecurse: 4.3.0 1722 | estraverse: 5.3.0 1723 | 1724 | eslint-visitor-keys@3.4.3: {} 1725 | 1726 | eslint@8.57.0: 1727 | dependencies: 1728 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1729 | '@eslint-community/regexpp': 4.11.0 1730 | '@eslint/eslintrc': 2.1.4 1731 | '@eslint/js': 8.57.0 1732 | '@humanwhocodes/config-array': 0.11.14 1733 | '@humanwhocodes/module-importer': 1.0.1 1734 | '@nodelib/fs.walk': 1.2.8 1735 | '@ungap/structured-clone': 1.2.0 1736 | ajv: 6.12.6 1737 | chalk: 4.1.2 1738 | cross-spawn: 7.0.3 1739 | debug: 4.3.5 1740 | doctrine: 3.0.0 1741 | escape-string-regexp: 4.0.0 1742 | eslint-scope: 7.2.2 1743 | eslint-visitor-keys: 3.4.3 1744 | espree: 9.6.1 1745 | esquery: 1.5.0 1746 | esutils: 2.0.3 1747 | fast-deep-equal: 3.1.3 1748 | file-entry-cache: 6.0.1 1749 | find-up: 5.0.0 1750 | glob-parent: 6.0.2 1751 | globals: 13.24.0 1752 | graphemer: 1.4.0 1753 | ignore: 5.3.1 1754 | imurmurhash: 0.1.4 1755 | is-glob: 4.0.3 1756 | is-path-inside: 3.0.3 1757 | js-yaml: 4.1.0 1758 | json-stable-stringify-without-jsonify: 1.0.1 1759 | levn: 0.4.1 1760 | lodash.merge: 4.6.2 1761 | minimatch: 3.1.2 1762 | natural-compare: 1.4.0 1763 | optionator: 0.9.4 1764 | strip-ansi: 6.0.1 1765 | text-table: 0.2.0 1766 | transitivePeerDependencies: 1767 | - supports-color 1768 | 1769 | espree@9.6.1: 1770 | dependencies: 1771 | acorn: 8.12.1 1772 | acorn-jsx: 5.3.2(acorn@8.12.1) 1773 | eslint-visitor-keys: 3.4.3 1774 | 1775 | esquery@1.5.0: 1776 | dependencies: 1777 | estraverse: 5.3.0 1778 | 1779 | esrecurse@4.3.0: 1780 | dependencies: 1781 | estraverse: 5.3.0 1782 | 1783 | estraverse@5.3.0: {} 1784 | 1785 | esutils@2.0.3: {} 1786 | 1787 | eventemitter3@4.0.7: {} 1788 | 1789 | fast-deep-equal@3.1.3: {} 1790 | 1791 | fast-diff@1.3.0: {} 1792 | 1793 | fast-glob@3.3.2: 1794 | dependencies: 1795 | '@nodelib/fs.stat': 2.0.5 1796 | '@nodelib/fs.walk': 1.2.8 1797 | glob-parent: 5.1.2 1798 | merge2: 1.4.1 1799 | micromatch: 4.0.7 1800 | 1801 | fast-json-stable-stringify@2.1.0: {} 1802 | 1803 | fast-levenshtein@2.0.6: {} 1804 | 1805 | fastq@1.17.1: 1806 | dependencies: 1807 | reusify: 1.0.4 1808 | 1809 | file-entry-cache@6.0.1: 1810 | dependencies: 1811 | flat-cache: 3.2.0 1812 | 1813 | fill-range@7.1.1: 1814 | dependencies: 1815 | to-regex-range: 5.0.1 1816 | 1817 | find-up@5.0.0: 1818 | dependencies: 1819 | locate-path: 6.0.0 1820 | path-exists: 4.0.0 1821 | 1822 | flat-cache@3.2.0: 1823 | dependencies: 1824 | flatted: 3.3.1 1825 | keyv: 4.5.4 1826 | rimraf: 3.0.2 1827 | 1828 | flatted@3.3.1: {} 1829 | 1830 | fs.realpath@1.0.0: {} 1831 | 1832 | fsevents@2.3.3: 1833 | optional: true 1834 | 1835 | glob-parent@5.1.2: 1836 | dependencies: 1837 | is-glob: 4.0.3 1838 | 1839 | glob-parent@6.0.2: 1840 | dependencies: 1841 | is-glob: 4.0.3 1842 | 1843 | glob@7.2.3: 1844 | dependencies: 1845 | fs.realpath: 1.0.0 1846 | inflight: 1.0.6 1847 | inherits: 2.0.4 1848 | minimatch: 3.1.2 1849 | once: 1.4.0 1850 | path-is-absolute: 1.0.1 1851 | 1852 | globals@13.24.0: 1853 | dependencies: 1854 | type-fest: 0.20.2 1855 | 1856 | globby@11.1.0: 1857 | dependencies: 1858 | array-union: 2.1.0 1859 | dir-glob: 3.0.1 1860 | fast-glob: 3.3.2 1861 | ignore: 5.3.1 1862 | merge2: 1.4.1 1863 | slash: 3.0.0 1864 | 1865 | globrex@0.1.2: {} 1866 | 1867 | graphemer@1.4.0: {} 1868 | 1869 | has-flag@4.0.0: {} 1870 | 1871 | hoist-non-react-statics@3.3.2: 1872 | dependencies: 1873 | react-is: 16.13.1 1874 | 1875 | ignore@5.3.1: {} 1876 | 1877 | import-fresh@3.3.0: 1878 | dependencies: 1879 | parent-module: 1.0.1 1880 | resolve-from: 4.0.0 1881 | 1882 | imurmurhash@0.1.4: {} 1883 | 1884 | inflight@1.0.6: 1885 | dependencies: 1886 | once: 1.4.0 1887 | wrappy: 1.0.2 1888 | 1889 | inherits@2.0.3: {} 1890 | 1891 | inherits@2.0.4: {} 1892 | 1893 | is-extglob@2.1.1: {} 1894 | 1895 | is-glob@4.0.3: 1896 | dependencies: 1897 | is-extglob: 2.1.1 1898 | 1899 | is-number@7.0.0: {} 1900 | 1901 | is-path-inside@3.0.3: {} 1902 | 1903 | isexe@2.0.0: {} 1904 | 1905 | js-tokens@4.0.0: {} 1906 | 1907 | js-yaml@4.1.0: 1908 | dependencies: 1909 | argparse: 2.0.1 1910 | 1911 | json-buffer@3.0.1: {} 1912 | 1913 | json-schema-traverse@0.4.1: {} 1914 | 1915 | json-stable-stringify-without-jsonify@1.0.1: {} 1916 | 1917 | keyv@4.5.4: 1918 | dependencies: 1919 | json-buffer: 3.0.1 1920 | 1921 | levn@0.4.1: 1922 | dependencies: 1923 | prelude-ls: 1.2.1 1924 | type-check: 0.4.0 1925 | 1926 | locate-path@6.0.0: 1927 | dependencies: 1928 | p-locate: 5.0.0 1929 | 1930 | lodash-es@4.17.21: {} 1931 | 1932 | lodash.merge@4.6.2: {} 1933 | 1934 | logseq-dateutils@0.0.26: {} 1935 | 1936 | loose-envify@1.4.0: 1937 | dependencies: 1938 | js-tokens: 4.0.0 1939 | 1940 | lower-case@2.0.2: 1941 | dependencies: 1942 | tslib: 2.6.3 1943 | 1944 | magic-string@0.26.7: 1945 | dependencies: 1946 | sourcemap-codec: 1.4.8 1947 | 1948 | memoize-one@5.2.1: {} 1949 | 1950 | merge2@1.4.1: {} 1951 | 1952 | micromatch@4.0.7: 1953 | dependencies: 1954 | braces: 3.0.3 1955 | picomatch: 2.3.1 1956 | 1957 | minimatch@3.1.2: 1958 | dependencies: 1959 | brace-expansion: 1.1.11 1960 | 1961 | minimatch@9.0.3: 1962 | dependencies: 1963 | brace-expansion: 2.0.1 1964 | 1965 | minimatch@9.0.5: 1966 | dependencies: 1967 | brace-expansion: 2.0.1 1968 | 1969 | ms@2.1.2: {} 1970 | 1971 | nanoid@3.3.7: {} 1972 | 1973 | natural-compare@1.4.0: {} 1974 | 1975 | no-case@3.0.4: 1976 | dependencies: 1977 | lower-case: 2.0.2 1978 | tslib: 2.6.3 1979 | 1980 | object-assign@4.1.1: {} 1981 | 1982 | once@1.4.0: 1983 | dependencies: 1984 | wrappy: 1.0.2 1985 | 1986 | optionator@0.9.4: 1987 | dependencies: 1988 | deep-is: 0.1.4 1989 | fast-levenshtein: 2.0.6 1990 | levn: 0.4.1 1991 | prelude-ls: 1.2.1 1992 | type-check: 0.4.0 1993 | word-wrap: 1.2.5 1994 | 1995 | p-limit@3.1.0: 1996 | dependencies: 1997 | yocto-queue: 0.1.0 1998 | 1999 | p-locate@5.0.0: 2000 | dependencies: 2001 | p-limit: 3.1.0 2002 | 2003 | parent-module@1.0.1: 2004 | dependencies: 2005 | callsites: 3.1.0 2006 | 2007 | path-exists@4.0.0: {} 2008 | 2009 | path-is-absolute@1.0.1: {} 2010 | 2011 | path-key@3.1.1: {} 2012 | 2013 | path-type@4.0.0: {} 2014 | 2015 | path@0.12.7: 2016 | dependencies: 2017 | process: 0.11.10 2018 | util: 0.10.4 2019 | 2020 | picocolors@1.0.1: {} 2021 | 2022 | picomatch@2.3.1: {} 2023 | 2024 | postcss@8.4.39: 2025 | dependencies: 2026 | nanoid: 3.3.7 2027 | picocolors: 1.0.1 2028 | source-map-js: 1.2.0 2029 | 2030 | prelude-ls@1.2.1: {} 2031 | 2032 | prettier-linter-helpers@1.0.0: 2033 | dependencies: 2034 | fast-diff: 1.3.0 2035 | 2036 | prettier@3.3.2: {} 2037 | 2038 | process@0.11.10: {} 2039 | 2040 | prop-types@15.8.1: 2041 | dependencies: 2042 | loose-envify: 1.4.0 2043 | object-assign: 4.1.1 2044 | react-is: 16.13.1 2045 | 2046 | punycode@2.3.1: {} 2047 | 2048 | queue-microtask@1.2.3: {} 2049 | 2050 | raf-schd@4.0.3: {} 2051 | 2052 | react-beautiful-dnd@13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 2053 | dependencies: 2054 | '@babel/runtime': 7.24.7 2055 | css-box-model: 1.2.1 2056 | memoize-one: 5.2.1 2057 | raf-schd: 4.0.3 2058 | react: 18.3.1 2059 | react-dom: 18.3.1(react@18.3.1) 2060 | react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 2061 | redux: 4.2.1 2062 | use-memo-one: 1.1.3(react@18.3.1) 2063 | transitivePeerDependencies: 2064 | - react-native 2065 | 2066 | react-dom@18.3.1(react@18.3.1): 2067 | dependencies: 2068 | loose-envify: 1.4.0 2069 | react: 18.3.1 2070 | scheduler: 0.23.2 2071 | 2072 | react-is@16.13.1: {} 2073 | 2074 | react-is@17.0.2: {} 2075 | 2076 | react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 2077 | dependencies: 2078 | '@babel/runtime': 7.24.7 2079 | '@types/react-redux': 7.1.33 2080 | hoist-non-react-statics: 3.3.2 2081 | loose-envify: 1.4.0 2082 | prop-types: 15.8.1 2083 | react: 18.3.1 2084 | react-is: 17.0.2 2085 | optionalDependencies: 2086 | react-dom: 18.3.1(react@18.3.1) 2087 | 2088 | react-string-replace@https://codeload.github.com/iansinnott/react-string-replace/tar.gz/ead57a2d814558a288a069b99dcf3f1ae406a71e: {} 2089 | 2090 | react@18.3.1: 2091 | dependencies: 2092 | loose-envify: 1.4.0 2093 | 2094 | redux@4.2.1: 2095 | dependencies: 2096 | '@babel/runtime': 7.24.7 2097 | 2098 | regenerator-runtime@0.14.1: {} 2099 | 2100 | resolve-from@4.0.0: {} 2101 | 2102 | reusify@1.0.4: {} 2103 | 2104 | rimraf@3.0.2: 2105 | dependencies: 2106 | glob: 7.2.3 2107 | 2108 | rollup@3.29.4: 2109 | optionalDependencies: 2110 | fsevents: 2.3.3 2111 | 2112 | run-parallel@1.2.0: 2113 | dependencies: 2114 | queue-microtask: 1.2.3 2115 | 2116 | scheduler@0.23.2: 2117 | dependencies: 2118 | loose-envify: 1.4.0 2119 | 2120 | semver@7.6.2: {} 2121 | 2122 | shebang-command@2.0.0: 2123 | dependencies: 2124 | shebang-regex: 3.0.0 2125 | 2126 | shebang-regex@3.0.0: {} 2127 | 2128 | slash@3.0.0: {} 2129 | 2130 | snake-case@3.0.4: 2131 | dependencies: 2132 | dot-case: 3.0.4 2133 | tslib: 2.6.3 2134 | 2135 | source-map-js@1.2.0: {} 2136 | 2137 | sourcemap-codec@1.4.8: {} 2138 | 2139 | strip-ansi@6.0.1: 2140 | dependencies: 2141 | ansi-regex: 5.0.1 2142 | 2143 | strip-json-comments@3.1.1: {} 2144 | 2145 | supports-color@7.2.0: 2146 | dependencies: 2147 | has-flag: 4.0.0 2148 | 2149 | synckit@0.8.8: 2150 | dependencies: 2151 | '@pkgr/core': 0.1.1 2152 | tslib: 2.6.3 2153 | 2154 | text-table@0.2.0: {} 2155 | 2156 | tiny-invariant@1.3.3: {} 2157 | 2158 | to-regex-range@5.0.1: 2159 | dependencies: 2160 | is-number: 7.0.0 2161 | 2162 | ts-api-utils@1.3.0(typescript@5.5.3): 2163 | dependencies: 2164 | typescript: 5.5.3 2165 | 2166 | tsconfck@3.1.1(typescript@5.5.3): 2167 | optionalDependencies: 2168 | typescript: 5.5.3 2169 | 2170 | tslib@2.6.3: {} 2171 | 2172 | type-check@0.4.0: 2173 | dependencies: 2174 | prelude-ls: 1.2.1 2175 | 2176 | type-fest@0.20.2: {} 2177 | 2178 | typescript-eslint@7.15.0(eslint@8.57.0)(typescript@5.5.3): 2179 | dependencies: 2180 | '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) 2181 | '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 2182 | '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) 2183 | eslint: 8.57.0 2184 | optionalDependencies: 2185 | typescript: 5.5.3 2186 | transitivePeerDependencies: 2187 | - supports-color 2188 | 2189 | typescript@5.5.3: {} 2190 | 2191 | undici-types@5.26.5: {} 2192 | 2193 | uri-js@4.4.1: 2194 | dependencies: 2195 | punycode: 2.3.1 2196 | 2197 | use-memo-one@1.1.3(react@18.3.1): 2198 | dependencies: 2199 | react: 18.3.1 2200 | 2201 | util@0.10.4: 2202 | dependencies: 2203 | inherits: 2.0.3 2204 | 2205 | vite-plugin-logseq@1.1.2: 2206 | dependencies: 2207 | magic-string: 0.26.7 2208 | 2209 | vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@4.5.3(@types/node@20.14.10)): 2210 | dependencies: 2211 | debug: 4.3.5 2212 | globrex: 0.1.2 2213 | tsconfck: 3.1.1(typescript@5.5.3) 2214 | optionalDependencies: 2215 | vite: 4.5.3(@types/node@20.14.10) 2216 | transitivePeerDependencies: 2217 | - supports-color 2218 | - typescript 2219 | 2220 | vite@4.5.3(@types/node@20.14.10): 2221 | dependencies: 2222 | esbuild: 0.18.20 2223 | postcss: 8.4.39 2224 | rollup: 3.29.4 2225 | optionalDependencies: 2226 | '@types/node': 20.14.10 2227 | fsevents: 2.3.3 2228 | 2229 | which@2.0.2: 2230 | dependencies: 2231 | isexe: 2.0.0 2232 | 2233 | word-wrap@1.2.5: {} 2234 | 2235 | wrappy@1.0.2: {} 2236 | 2237 | yocto-queue@0.1.0: {} 2238 | -------------------------------------------------------------------------------- /screenshots/blockref-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/blockref-demo.gif -------------------------------------------------------------------------------- /screenshots/boardwidth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/boardwidth.gif -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/demo.gif -------------------------------------------------------------------------------- /screenshots/demo2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/demo2.gif -------------------------------------------------------------------------------- /screenshots/demo3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/demo3.gif -------------------------------------------------------------------------------- /screenshots/dnd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/dnd.gif -------------------------------------------------------------------------------- /screenshots/img-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/img-demo.gif -------------------------------------------------------------------------------- /screenshots/queries.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/queries.gif -------------------------------------------------------------------------------- /screenshots/widthdemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benjypng/logseq-kanban-plugin/76d843951d8454ed6c905276763eb58035265094/screenshots/widthdemo.gif -------------------------------------------------------------------------------- /src/components/Column.tsx: -------------------------------------------------------------------------------- 1 | import { useDroppable } from '@dnd-kit/core' 2 | import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable' 3 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 4 | import React, { useEffect, useState } from 'react' 5 | 6 | import { SortableItem } from '../components/SortableItem' 7 | import { processContent } from '../libs/process-content' 8 | 9 | interface ColumnProps { 10 | id: string 11 | title: string 12 | tasks: BlockEntity[] 13 | } 14 | 15 | export const Column: React.FC = ({ id, title, tasks }) => { 16 | const { setNodeRef } = useDroppable({ id }) 17 | const [parsedTasks, setParsedTasks] = useState< 18 | { id: string; content: React.ReactNode }[] 19 | >([]) 20 | 21 | useEffect(() => { 22 | const parseTasks = async () => { 23 | const parsed = await Promise.all( 24 | tasks.map(async (task: BlockEntity) => { 25 | const parsedContent = await processContent(task.content) 26 | return { id: task.uuid, content: parsedContent } 27 | }), 28 | ) 29 | setParsedTasks(parsed) 30 | } 31 | 32 | parseTasks() 33 | }, [tasks]) 34 | 35 | return ( 36 |
37 |

{title}

38 |
39 | task.id)} 41 | strategy={verticalListSortingStrategy} 42 | > 43 | {parsedTasks.map((task) => ( 44 | 45 | {task.content} 46 | 47 | ))} 48 | 49 |
50 |
51 | ) 52 | } 53 | -------------------------------------------------------------------------------- /src/components/SortableItem.tsx: -------------------------------------------------------------------------------- 1 | import { useSortable } from '@dnd-kit/sortable' 2 | import { CSS } from '@dnd-kit/utilities' 3 | import React from 'react' 4 | 5 | interface SortableItemProps { 6 | id: string 7 | children: React.ReactNode 8 | } 9 | export const SortableItem: React.FC = ({ id, children }) => { 10 | const { attributes, listeners, setNodeRef, transform, transition } = 11 | useSortable({ id }) 12 | 13 | const style = { 14 | transform: CSS.Transform.toString(transform), 15 | transition, 16 | } 17 | 18 | // Handle clicks on links instead of starting drag 19 | const handleClick = (e: React.MouseEvent) => { 20 | if (e.target instanceof HTMLAnchorElement) { 21 | e.stopPropagation() 22 | } 23 | } 24 | 25 | return ( 26 |
34 | {children} 35 |
36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /src/features/drag-and-drop/dnd.css: -------------------------------------------------------------------------------- 1 | .kanban-board { 2 | display: flex; 3 | gap: 8px; 4 | overflow-x: auto; 5 | align-items: flex-start; 6 | } 7 | 8 | .kanban-tag { 9 | display: inline-block; 10 | padding: 0px 10px; 11 | background-color: #4CAF50; 12 | color: #FFFFFF; 13 | border-radius: 4px; 14 | font-size: 0.8rem; 15 | } 16 | 17 | .kanban-tag::before { 18 | content: "#"; /* Clock face emoji */ 19 | margin-right: 2px; 20 | } 21 | 22 | .kanban-board .column { 23 | background-color: #ebecf0; 24 | border-radius: 3px; 25 | width: 250px; 26 | padding: 10px; 27 | min-width: 250px; 28 | display: flex; 29 | flex-direction: column; 30 | max-height: calc(100vh - 48px); 31 | overflow-y: auto; 32 | } 33 | 34 | .kanban-board .column h2 { 35 | font-size: 14px; 36 | font-weight: 600; 37 | padding: 10px 8px; 38 | margin: 0; 39 | color: #172b4d; 40 | } 41 | 42 | .kanban-board .column-content { 43 | padding: 0 4px 8px; 44 | flex-grow: 1; 45 | } 46 | 47 | .kanban-board .task { 48 | background-color: #ffffff; 49 | border-radius: 3px; 50 | box-shadow: 0 1px 0 rgba(9, 30, 66, 0.25); 51 | cursor: pointer; 52 | margin-bottom: 8px; 53 | padding: 6px 8px; 54 | font-size: 14px; 55 | color: #172b4d; 56 | word-wrap: break-word; 57 | } 58 | 59 | .kanban-board .task:hover { 60 | background-color: #f4f5f7; 61 | } 62 | 63 | .kanban-board .task.dragging { 64 | opacity: 0.9; 65 | transform: rotate(2deg); 66 | box-shadow: 0 5px 10px rgba(9, 30, 66, 0.15); 67 | } 68 | 69 | .kanban-board .column::-webkit-scrollbar { 70 | width: 8px; 71 | } 72 | 73 | .kanban-board .column::-webkit-scrollbar-track { 74 | background: #dfe1e6; 75 | } 76 | 77 | .kanban-board .column::-webkit-scrollbar-thumb { 78 | background-color: #c1c7d0; 79 | border-radius: 4px; 80 | } 81 | 82 | .kanban-board .column::-webkit-scrollbar-thumb:hover { 83 | background: #a5aab5; 84 | } 85 | -------------------------------------------------------------------------------- /src/features/drag-and-drop/index.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | closestCenter, 3 | DndContext, 4 | DragEndEvent, 5 | DragOverlay, 6 | DragStartEvent, 7 | PointerSensor, 8 | useSensor, 9 | useSensors, 10 | } from '@dnd-kit/core' 11 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin' 12 | import React, { useState } from 'react' 13 | 14 | import { Column } from '../../components/Column' 15 | 16 | interface KanbanBoardProps { 17 | data: BlockEntity[] 18 | } 19 | 20 | export const KanbanBoard: React.FC = ({ data }) => { 21 | const [columns, setColumns] = useState(data) 22 | const [activeId, setActiveId] = useState(null) 23 | 24 | const sensors = useSensors( 25 | useSensor(PointerSensor, { 26 | activationConstraint: { 27 | delay: 100, 28 | tolerance: 5, 29 | }, 30 | }), 31 | ) 32 | 33 | const handleDragStart = (event: DragStartEvent) => { 34 | setActiveId(event.active.id as string) 35 | } 36 | 37 | const handleDragEnd = async (event: DragEndEvent) => { 38 | const { active, over } = event 39 | 40 | if (active.id !== over?.id) { 41 | try { 42 | const findColumnAndIndex = ( 43 | id: string, 44 | ): [BlockEntity | undefined, number | undefined] => { 45 | for (const column of columns) { 46 | if (column.uuid === id) return [column, -1] 47 | const index = column.children?.findIndex( 48 | (item) => 49 | (typeof item === 'object' && 'uuid' in item 50 | ? item.uuid 51 | : item[1]) === id, 52 | ) 53 | if (index !== -1 && index !== undefined) { 54 | return [column, index] 55 | } 56 | } 57 | return [undefined, undefined] 58 | } 59 | 60 | const [sourceColumn, sourceItemIndex] = findColumnAndIndex( 61 | active.id as string, 62 | ) 63 | const [destColumn, destItemIndex] = findColumnAndIndex( 64 | over?.id as string, 65 | ) 66 | 67 | if (sourceColumn && destColumn && sourceItemIndex !== undefined) { 68 | const sourceItem = sourceColumn.children?.[sourceItemIndex] 69 | const sourceUUID = 70 | typeof sourceItem === 'object' && 'uuid' in sourceItem 71 | ? sourceItem.uuid 72 | : sourceItem?.[1] 73 | 74 | let targetUUID: string 75 | let moveParams: { before: boolean; children: boolean } 76 | 77 | if (destItemIndex === -1) { 78 | // Move card to empty column or top of column 79 | targetUUID = destColumn.uuid 80 | moveParams = { before: false, children: true } 81 | } else if (destItemIndex === 0) { 82 | // Move card to first item in non-empty column 83 | const firstItem = destColumn.children?.[0] 84 | if (!firstItem) return 85 | targetUUID = 86 | typeof firstItem === 'object' && 'uuid' in firstItem 87 | ? firstItem.uuid 88 | : firstItem[1] 89 | moveParams = { before: true, children: true } 90 | } else { 91 | // Move card to specific position in a column 92 | if (!destItemIndex) return 93 | const targetItem = destColumn.children?.[destItemIndex] 94 | if (!targetItem) return 95 | targetUUID = 96 | typeof targetItem === 'object' && 'uuid' in targetItem 97 | ? targetItem.uuid 98 | : targetItem[1] 99 | moveParams = { before: false, children: false } 100 | } 101 | 102 | if (sourceUUID && targetUUID) { 103 | await logseq.Editor.moveBlock(sourceUUID, targetUUID, moveParams) 104 | 105 | const [movedItem] = 106 | sourceColumn.children?.splice(sourceItemIndex, 1) || [] 107 | if (movedItem) { 108 | if (destItemIndex === -1) { 109 | destColumn.children = destColumn.children || [] 110 | destColumn.children.unshift(movedItem) 111 | } else { 112 | destColumn.children?.splice(destItemIndex, 0, movedItem) 113 | } 114 | } 115 | setColumns(columns) 116 | } 117 | } 118 | } catch (error) { 119 | console.error('Error moving block:', error) 120 | } 121 | } 122 | setActiveId(null) 123 | } 124 | 125 | const getTaskContent = (uuid: string): string => { 126 | for (const column of columns) { 127 | if (!column.children) continue 128 | const task = column.children.find( 129 | (task) => 130 | (typeof task === 'object' && 'uuid' in task ? task.uuid : task[1]) === 131 | uuid, 132 | ) 133 | if (task) 134 | return typeof task === 'object' && 'content' in task 135 | ? task.content || '' 136 | : task[1] 137 | } 138 | return '' 139 | } 140 | 141 | return ( 142 |
150 | 156 | {columns.map((column: BlockEntity) => ( 157 | 163 | ))} 164 | 165 | {activeId ? ( 166 |
{getTaskContent(activeId)}
167 | ) : null} 168 |
169 |
170 |
171 | ) 172 | } 173 | 174 | interface KanbanDndProps { 175 | data: BlockEntity[] 176 | } 177 | 178 | export const KanbanDnd: React.FC = ({ data }) => { 179 | return ( 180 |
181 | 182 |
183 | ) 184 | } 185 | -------------------------------------------------------------------------------- /src/features/kanban/index.tsx: -------------------------------------------------------------------------------- 1 | import Board from '@asseinfo/react-kanban' 2 | 3 | import { KanbanProps } from '../../types' 4 | 5 | export const Kanban = ({ data, query }: KanbanProps) => { 6 | const { columns } = data 7 | if (!columns || columns.length === 0) { 8 | return ( 9 |
10 | Enter some parameters, data or access the README for more instructions. 11 |
12 | ) 13 | } else { 14 | return ( 15 |
16 | {data} 17 | {query && ( 18 | 21 | )} 22 |
23 | ) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/helpers/create-normal-board.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from "@logseq/libs/dist/LSPlugin.user"; 2 | 3 | import { processContent } from "../libs/process-content"; 4 | import { Card, Column } from "../types"; 5 | 6 | export const createNormalBoard = async ( 7 | board: Column[], 8 | children: BlockEntity[], 9 | ) => { 10 | for (const col of children) { 11 | const column: Column = { 12 | id: col.uuid, 13 | title: col.content, 14 | cards: [], 15 | }; 16 | if (!col.children) continue; 17 | for (const crd of col.children as BlockEntity[]) { 18 | const content = (await processContent(crd.content)) as string; 19 | const card: Card = { 20 | id: crd.uuid, 21 | description: content, 22 | }; 23 | column.cards.push(card); 24 | } 25 | board.push(column); 26 | } 27 | return board; 28 | }; 29 | -------------------------------------------------------------------------------- /src/helpers/create-normal-query-board.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 2 | 3 | import { processContent } from '../libs/process-content' 4 | import { Column } from '../types' 5 | 6 | const rxQuery = /\{\{query (.*?)\}\}/ 7 | export const createNormalBoardWithQuery = async ( 8 | board: Column[], 9 | children: BlockEntity[], 10 | ) => { 11 | for (const col of children) { 12 | const column: Column = { 13 | id: col.uuid, 14 | title: col.content, 15 | cards: [], 16 | } 17 | if (!col.children) continue 18 | for (const crd of col.children as BlockEntity[]) { 19 | const queryString = rxQuery.exec(crd.content) 20 | if (!queryString || !queryString[1]) return board 21 | 22 | const queryResults = await logseq.DB.q(queryString[1]) 23 | if (!queryResults) return board 24 | 25 | for (const r of queryResults) { 26 | const content = (await processContent( 27 | r.content ?? r.originalName, 28 | )) as string 29 | column.cards.push({ 30 | id: r.uuid, 31 | description: content, 32 | }) 33 | } 34 | } 35 | board.push(column) 36 | } 37 | return board 38 | } 39 | -------------------------------------------------------------------------------- /src/helpers/create-query-board.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 2 | 3 | import { processContent } from '../libs/process-content' 4 | import { sortQueryMarkers } from '../libs/sort-query-markers' 5 | import { Column } from '../types' 6 | 7 | const markerOrder = { 8 | NOW: 2, 9 | LATER: 5, 10 | DOING: 4, 11 | DONE: 111, 12 | CANCELLED: 8, 13 | CANCELED: 9, 14 | 'IN-PROGRESS': 7, 15 | TODO: 1, 16 | WAITING: 6, 17 | WAIT: 3, 18 | default: 999, 19 | } 20 | 21 | export const createQueryBoard = async ( 22 | content: string, 23 | board: Column[], 24 | ): Promise => { 25 | const queryString = /\{\{query (.*?)\}\}/.exec(content) 26 | if (!queryString || !queryString[1]) return board 27 | 28 | let queryResults = await logseq.DB.q(queryString[1]) 29 | if (!queryResults) return board 30 | 31 | let markers = [...new Set(queryResults.map((c: BlockEntity) => c.marker))] 32 | const order = markerOrder 33 | markers = sortQueryMarkers(markers, order) 34 | board = markers.map((m) => ({ id: m, title: m, cards: [] })) 35 | 36 | queryResults = queryResults.sort((a, b) => a.priority - b.priority) 37 | 38 | for (const r of queryResults) { 39 | const content = (await processContent(r.content)) as string 40 | const assignCol = board.filter((c) => c.id === r.marker)[0] 41 | if (!assignCol) continue 42 | assignCol?.cards.push({ id: r.uuid, description: content }) 43 | } 44 | 45 | return board 46 | } 47 | -------------------------------------------------------------------------------- /src/helpers/create-task-board.ts: -------------------------------------------------------------------------------- 1 | import { BlockEntity } from "@logseq/libs/dist/LSPlugin.user"; 2 | 3 | import { processContent } from "../libs/process-content"; 4 | import { Column } from "../types"; 5 | 6 | export const createTaskBoard = async ( 7 | workflow_one: string, 8 | workflow_two: string, 9 | board: Column[], 10 | children: BlockEntity[], 11 | ) => { 12 | board = [ 13 | { id: workflow_one, title: workflow_one, cards: [] }, 14 | { id: workflow_one, title: workflow_two, cards: [] }, 15 | { id: "DONE", title: "DONE", cards: [] }, 16 | ]; 17 | for (const c of children) { 18 | const content = (await processContent(c.content)) as string; 19 | if (c.marker === workflow_one) { 20 | board[0]?.cards.push({ description: content, id: c.uuid }); 21 | } else if (c.marker === workflow_two) { 22 | board[1]?.cards.push({ description: content, id: c.uuid }); 23 | } else { 24 | board[2]?.cards.push({ description: content, id: c.uuid }); 25 | } 26 | } 27 | 28 | return board; 29 | }; 30 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import '@logseq/libs' 2 | 3 | import { BlockEntity } from '@logseq/libs/dist/LSPlugin.user' 4 | import { createRoot } from 'react-dom/client' 5 | import { renderToString } from 'react-dom/server' 6 | 7 | import { KanbanDnd } from './features/drag-and-drop' 8 | import dndCss from './features/drag-and-drop/dnd.css?raw' 9 | import { Kanban } from './features/kanban' 10 | import { createNormalBoard } from './helpers/create-normal-board' 11 | import { createNormalBoardWithQuery } from './helpers/create-normal-query-board' 12 | import { createQueryBoard } from './helpers/create-query-board' 13 | import { createTaskBoard } from './helpers/create-task-board' 14 | import { checkParams } from './libs/check-params' 15 | import { handleStyles } from './libs/handle-styles' 16 | import { Column, ParamsProps } from './types' 17 | 18 | const main = async () => { 19 | console.log('Kanban plugin loaded') 20 | 21 | // Set up style for KanbanDND 22 | logseq.provideStyle(dndCss) 23 | 24 | // Add copy board html to clipboard feature 25 | logseq.Editor.registerBlockContextMenuItem('Copy Kanban HTML', async (e) => { 26 | const element = 27 | parent.document.querySelector(`div[id^="kanbandnd_${e.uuid}"]`) ?? 28 | parent.document.querySelector(`div[id^="kanban_${e.uuid}"]`) 29 | if (!element) return 30 | const stylesheets = [...parent.document.styleSheets] 31 | let html = `` 32 | stylesheets.forEach((stylesheet) => { 33 | if (stylesheet.href) { 34 | html += `` 35 | } else { 36 | const rules = [...stylesheet.cssRules] 37 | .map((rule) => rule.cssText) 38 | .join('\n') 39 | html += `` 40 | } 41 | }) 42 | html += `${element.outerHTML}` 43 | parent.navigator.clipboard.writeText(html.replace(/\s+/g, ' ').trim()) 44 | await logseq.UI.showMsg('Kanban HTML copied to clipboard', 'warning') 45 | }) 46 | 47 | // Insert renderer upon slash command 48 | logseq.Editor.registerSlashCommand('Kanban', async (e) => { 49 | await logseq.Editor.insertAtEditingCursor(`{{renderer :kanban_${e.uuid}}}`) 50 | }) 51 | logseq.Editor.registerSlashCommand('Kanban (DND)', async (e) => { 52 | await logseq.Editor.insertAtEditingCursor( 53 | `{{renderer :kanbandnd_${e.uuid}}}`, 54 | ) 55 | }) 56 | 57 | logseq.App.onMacroRendererSlotted(async ({ slot, payload }) => { 58 | const uuid = payload.uuid 59 | const [type] = payload.arguments 60 | if (!type) return 61 | 62 | const kanbanId = `kanbandnd_${uuid}_${slot}` 63 | if (!type.startsWith(':kanbandnd_')) return 64 | 65 | logseq.provideUI({ 66 | key: kanbanId, 67 | slot, 68 | reset: true, 69 | template: `
`, 70 | }) 71 | 72 | const rootBlk = await logseq.Editor.getBlock(uuid, { 73 | includeChildren: true, 74 | }) 75 | if (!rootBlk) return 76 | const { children: data } = rootBlk 77 | if (!data) return 78 | 79 | setTimeout(() => { 80 | const el = parent.document.getElementById(kanbanId) 81 | if (!el || !el.isConnected || !data) return 82 | const root = createRoot(el) 83 | root.render() 84 | }, 0) 85 | }) 86 | 87 | logseq.App.onMacroRendererSlotted(async ({ slot, payload }) => { 88 | // Get uuid of payload so that child blocks can be retrieved for the board 89 | const uuid = payload.uuid 90 | const [type] = payload.arguments 91 | if (!type) return 92 | 93 | const kanbanId = `kanban_${uuid}_${slot}` 94 | if (!type.startsWith(':kanban_')) return 95 | 96 | // Get block data to render 97 | const blk = await logseq.Editor.getBlock(uuid, { 98 | includeChildren: true, 99 | }) 100 | if (!blk || !blk.children || blk.children.length === 0) return 101 | 102 | const paramsBlk = blk?.children![0] 103 | if (!paramsBlk) return 104 | 105 | const { content, children } = paramsBlk as { 106 | content: string 107 | children: BlockEntity[] 108 | } 109 | if (children?.length === 0) return 110 | 111 | const params: ParamsProps = checkParams(content) 112 | 113 | let html: string 114 | let board: Column[] = [] 115 | if (params.data_type === 'tasks') { 116 | // render kanban with tasks 117 | const markers = children.map((c: BlockEntity) => c.marker) 118 | 119 | switch (true) { 120 | case markers.includes('TODO') || markers.includes('DOING'): 121 | board = await createTaskBoard('TODO', 'DOING', board, children) 122 | break 123 | default: 124 | board = await createTaskBoard('NOW', 'LATER', board, children) 125 | } 126 | } else if (params.data_type === 'query-tasks') { 127 | // render kanban with query 128 | const content = children[0]?.content 129 | if (!content) return 130 | board = await createQueryBoard(content, board) 131 | logseq.provideModel({ 132 | async render() { 133 | // Needed to re-render the block 134 | const tempBlock = await logseq.Editor.insertBlock(uuid, '', { 135 | sibling: false, 136 | }) 137 | if (!tempBlock) return 138 | await logseq.Editor.removeBlock(tempBlock.uuid) 139 | }, 140 | }) 141 | } else if (params.data_type === 'query') { 142 | // render regular kanban with queries 143 | board = await createNormalBoardWithQuery(board, children) 144 | } else { 145 | // render regular kanban 146 | board = await createNormalBoard(board, children) 147 | } 148 | 149 | // handle styles 150 | logseq.provideStyle(handleStyles(slot, params.card_w, params.board_w)) 151 | if (params.data_type === 'query') { 152 | html = renderToString() 153 | } else { 154 | html = renderToString() 155 | } 156 | 157 | logseq.provideUI({ 158 | key: `${kanbanId}`, 159 | slot, 160 | reset: true, 161 | template: html, 162 | }) 163 | }) 164 | } 165 | 166 | logseq.ready(main).catch(console.error) 167 | -------------------------------------------------------------------------------- /src/kanban.ts: -------------------------------------------------------------------------------- 1 | export const kanbanCss = ( 2 | width: number, 3 | wrapperWidth: number, 4 | kanbanId: string, 5 | ) => { 6 | return ` 7 | #${kanbanId} .wrapper { 8 | max-width: ${wrapperWidth}px; 9 | overflow-x: scroll; 10 | white-space: nowrap; 11 | } 12 | 13 | .react-kanban-board { 14 | padding: 2px; 15 | margin: 0; 16 | color: #000 17 | } 18 | 19 | #${kanbanId} .react-kanban-card { 20 | border-radius: 3px; 21 | background-color: #fff; 22 | padding: 10px; 23 | margin-bottom: 7px; 24 | width: ${width}px; 25 | } 26 | 27 | .react-kanban-card, 28 | .react-kanban-card-skeleton { 29 | box-sizing: border-box; 30 | min-width: 250px; 31 | } 32 | 33 | .react-kanban-card:hover { 34 | box-shadow: -5px 10px 15px #aaaaaa; 35 | } 36 | 37 | .react-kanban-card__description { 38 | padding-top: 0 39 | } 40 | 41 | .react-kanban-card__title { 42 | display: none; 43 | padding: 0; 44 | margin: 0 45 | } 46 | 47 | #${kanbanId} .react-kanban-column { 48 | white-space: normal; 49 | min-width: 290px; 50 | padding: 15px; 51 | border-radius: 2px; 52 | background-color: #DADADA; 53 | box-shadow: 5px 10px #888888; 54 | margin: 5px; 55 | width: ${width + 40}px; 56 | } 57 | 58 | .react-kanban-column input:focus { 59 | outline: 0 60 | } 61 | 62 | .react-kanban-column-header { 63 | padding-bottom: 10px; 64 | font-weight: 700; 65 | font-size: 120%; 66 | } 67 | 68 | .react-kanban-column:hover { 69 | transform: translateY(-8px); 70 | transition: all 0.1s; 71 | } 72 | 73 | /* Query and query button related */ 74 | .queryWrapper { 75 | display: flex; 76 | flex-direction: column; 77 | } 78 | 79 | .btnDiv { 80 | margin-top: 5px; 81 | } 82 | 83 | .updateKanbanBtn { 84 | border: 1px solid gray; 85 | padding: 0 4px; 86 | border-radius: 8px; 87 | } 88 | 89 | .updateKanbanBtn:hover { 90 | background-color: pink; 91 | color: black; 92 | } 93 | `; 94 | }; 95 | -------------------------------------------------------------------------------- /src/libs/check-params.ts: -------------------------------------------------------------------------------- 1 | import { ParamsProps } from "../types"; 2 | 3 | export const checkParams = (content: string): ParamsProps => { 4 | const rxToCheck: Record = { 5 | card_w: /card-(.*?)(\d+)/, 6 | board_w: /board-(.*?)(\d+)/, 7 | data_type: /(query-tasks|query|tasks)/i, 8 | }; 9 | 10 | const styles: ParamsProps = { card_w: "", board_w: "", data_type: "" }; 11 | for (const rx of Object.keys(rxToCheck)) { 12 | const newVal = (rxToCheck[rx] as RegExp).exec(content); 13 | if (newVal && newVal[2]) { 14 | styles[rx] = newVal[2]; 15 | } else if (newVal && newVal[0]) { 16 | styles[rx] = newVal[0]; 17 | } else { 18 | delete styles[rx]; 19 | } 20 | } 21 | 22 | return styles; 23 | }; 24 | -------------------------------------------------------------------------------- /src/libs/get-block-content.ts: -------------------------------------------------------------------------------- 1 | export const getBlockContent = async (uuid: string): Promise => { 2 | const blk = await logseq.Editor.getBlock(uuid); 3 | if (!blk) return ""; 4 | return blk.content; 5 | }; 6 | -------------------------------------------------------------------------------- /src/libs/handle-styles.ts: -------------------------------------------------------------------------------- 1 | export const handleStyles = ( 2 | slot: string, 3 | card_w: string | undefined, 4 | board_w: string | undefined, 5 | ) => { 6 | return ` 7 | #${slot} .query-btn { 8 | color: #000; 9 | border: 1px solid black; 10 | margin-top: 2px; 11 | margin-bottom: 2px; 12 | margin-left: 10px; 13 | padding: 1px 10px; 14 | border-radius: 8px; 15 | background-color: #eee; 16 | } 17 | #${slot} .wrapper { 18 | color: #000; 19 | max-width: ${board_w}px; 20 | overflow-x: scroll; 21 | white-space: nowrap; 22 | } 23 | .react-kanban-board{ 24 | padding:5px 25 | } 26 | #${slot} .react-kanban-card{ 27 | max-width:${card_w ?? 250}px; 28 | min-width:${card_w ?? 250}px 29 | } 30 | .react-kanban-card{ 31 | border-radius:3px; 32 | background-color:#fff; 33 | padding:10px; 34 | margin-bottom:7px 35 | } 36 | .react-kanban-card-skeleton,.react-kanban-card,.react-kanban-card-adder-form{ 37 | box-sizing:border-box; 38 | max-width:250px; 39 | min-width:250px 40 | } 41 | .react-kanban-card__description{ 42 | padding-top:0px 43 | } 44 | .react-kanban-column{ 45 | padding:15px; 46 | border-radius:2px; 47 | background-color:#eee; 48 | margin:5px 49 | } 50 | .react-kanban-column input:focus{ 51 | outline:none 52 | } 53 | .react-kanban-card-adder-form{ 54 | border-radius:3px; 55 | background-color:#fff; 56 | padding:10px; 57 | margin-bottom:7px 58 | } 59 | .react-kanban-card-adder-form input{ 60 | border:0px; 61 | font-family:inherit; 62 | font-size:inherit 63 | } 64 | .react-kanban-card-adder-button{ 65 | width:100%; 66 | margin-top:5px; 67 | background-color:transparent; 68 | cursor:pointer; 69 | border:1px solid #ccc; 70 | transition:0.3s; 71 | border-radius:3px; 72 | font-size:20px; 73 | margin-bottom:10px; 74 | font-weight:bold 75 | } 76 | .react-kanban-card-adder-button:hover{ 77 | box-shadow: -5px 10px 15px #aaaaaa; 78 | } 79 | .react-kanban-card-adder-form__title{ 80 | font-weight:bold; 81 | border-bottom:1px solid #eee; 82 | padding-bottom:5px; 83 | font-weight:bold; 84 | display:flex; 85 | justify-content:space-between; 86 | width:100%; 87 | padding:0px 88 | } 89 | .react-kanban-card-adder-form__title:focus{ 90 | outline:none 91 | } 92 | .react-kanban-card-adder-form__description{ 93 | width:100%; 94 | margin-top:10px 95 | } 96 | .react-kanban-card-adder-form__description:focus{ 97 | outline:none 98 | } 99 | .react-kanban-card-adder-form__button{ 100 | background-color:#eee; 101 | border:none; 102 | padding:5px; 103 | width:45%; 104 | margin-top:5px; 105 | border-radius:3px 106 | } 107 | .react-kanban-card-adder-form__button:hover{ 108 | transition:0.3s; 109 | cursor:pointer; 110 | background-color:#ccc 111 | } 112 | .react-kanban-column-header{ 113 | padding-bottom:10px; 114 | font-weight:bold 115 | } 116 | .react-kanban-column:hover { 117 | transform: translateY(-8px); 118 | transition: all 0.1s; 119 | } 120 | .react-kanban-column-header input:focus{ 121 | outline:none 122 | } 123 | .react-kanban-column-header__button{ 124 | color:#333333; 125 | background-color:#ffffff; 126 | border-color:#cccccc 127 | } 128 | .react-kanban-column-header__button:hover,.react-kanban-column-header__button:focus,.react-kanban-column-header__button:active{ 129 | background-color:#e6e6e6 130 | } 131 | .react-kanban-column-adder-button{ 132 | border:2px dashed #eee; 133 | height:132px; 134 | margin:5px 135 | } 136 | .react-kanban-column-adder-button:hover{ 137 | cursor:pointer 138 | }`; 139 | }; 140 | -------------------------------------------------------------------------------- /src/libs/process-content.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | 3 | import { handleBlockReference } from './process-content/handle-block-reference' 4 | import { handleBold } from './process-content/handle-bold' 5 | import { handleImage } from './process-content/handle-image' 6 | import { handleItalics } from './process-content/handle-italics' 7 | import { handleLink } from './process-content/handle-link' 8 | import { handleMarkdownLink } from './process-content/handle-markdown-link' 9 | import { handlePageReference } from './process-content/handle-page-reference' 10 | import { handleTag } from './process-content/handle-tag' 11 | import { removeMarkers } from './process-content/remove-markers' 12 | 13 | export const processContent = async ( 14 | content: string, 15 | ): Promise => { 16 | if (!content) return 17 | let str: ReactNode[] | string = content 18 | const { name, path } = (await logseq.App.getCurrentGraph())! 19 | 20 | // Remove markers 21 | str = removeMarkers(str) 22 | 23 | // Remove logbook 24 | if (str.includes(':LOGBOOK:')) 25 | str = str.substring(0, str.indexOf(':LOGBOOK:')) 26 | 27 | // Remove scheduled and deadline 28 | if (str.includes('SCHEDULED:') || str.includes('DEADLINE:')) 29 | str = str.replace( 30 | /(SCHEDULED|DEADLINE): <\d{4}-\d{2}-\d{2} \w{3} \d{2}:\d{2}>/g, 31 | '', 32 | ) 33 | 34 | // Check for block reference 35 | str = await handleBlockReference(str, name) 36 | 37 | // Check for tag 38 | str = handleTag(str, name) 39 | 40 | // Check for page 41 | str = await handlePageReference(str, name) 42 | 43 | // Check for image 44 | str = handleImage(str, path) 45 | 46 | // Check for markdown link 47 | str = handleMarkdownLink(str) 48 | 49 | // Check for link 50 | str = handleLink(str) 51 | 52 | // Check for bold 53 | str = handleBold(str) 54 | 55 | // Check for italics 56 | str = handleItalics(str) 57 | 58 | return str 59 | } 60 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-block-reference.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleBlockReference = async ( 5 | str: string, 6 | name: string, 7 | ): Promise => { 8 | const rxUuidRef = /\(\((.*?)\)\)/g; 9 | const matchedUuidRefArray = rxUuidRef.exec(str); 10 | 11 | if (matchedUuidRefArray) { 12 | const blk = await logseq.Editor.getBlock(matchedUuidRefArray[1] as string); 13 | if (!blk) return str; 14 | const text = blk.content.substring(0, blk.content.indexOf("id:: ")); 15 | 16 | return reactStringReplace(text, text, (match) => ( 17 | 20 | {match} 21 | 22 | )); 23 | } else { 24 | return str; 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-bold.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleBold = (str: ReactNode[]): ReactNode[] => { 5 | const rxBoldRef = /\*\*(.*?)\*\*/g; 6 | return reactStringReplace(str, rxBoldRef, (match, i) => ( 7 | {match} 8 | )); 9 | }; 10 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-image.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleImage = (str: ReactNode[], path: string): ReactNode[] => { 5 | const rxImgRef = /!\[(.*?)\}/g; 6 | return reactStringReplace(str, rxImgRef, (match, i) => { 7 | const filename = /\(\.\.\/assets\/(.*?)\)/.exec(match)![1]; 8 | const height = /:height(.*?)(\d+)/.exec(match)![2]; 9 | const width = /:width(.*?)(\d+)/.exec(match)![2]; 10 | if (height && width) { 11 | return ( 12 | 18 | ); 19 | } else { 20 | return ; 21 | } 22 | }); 23 | }; 24 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-italics.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleItalics = (str: ReactNode[]): ReactNode[] => { 5 | const rxItalicsRef = /\*(.*?)\*/g; 6 | return reactStringReplace(str, rxItalicsRef, (match, i) => ( 7 | {match} 8 | )); 9 | }; 10 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-link.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import reactStringReplace from "react-string-replace"; 3 | 4 | export const handleLink = (str: ReactNode[]): ReactNode[] => { 5 | const rxLinkRef = /(https:\/\/[\w.-]+(?:\/[\w.-]*)*)/gi; 6 | return reactStringReplace(str, rxLinkRef, (match, i) => ( 7 | 8 | {match} 9 | 10 | )); 11 | }; 12 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-markdown-link.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handleMarkdownLink = (str: ReactNode[]): ReactNode[] => { 5 | const rxLinkRef = /(https:\/\/[\w.-]+(?:\/[\w.-]*)*)/gi 6 | const rxLinkNameRef = /\[(.*?)\]/gi 7 | const newStr = rxLinkRef.exec(str as unknown as string) 8 | if (!newStr) return str 9 | 10 | const urlName = rxLinkNameRef.exec(str as unknown as string) 11 | if (!urlName) return str 12 | 13 | return reactStringReplace(newStr[0], rxLinkRef, (match, i) => ( 14 | 15 | {urlName[1]} 16 | 17 | )) 18 | } 19 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-page-reference.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handlePageReference = async ( 5 | str: ReactNode[] | string, 6 | name: string, 7 | ): Promise => { 8 | const rxPageRef = /\[\[(.*?)\]\]/g 9 | return reactStringReplace(str, rxPageRef, (match, i) => { 10 | return ( 11 | 12 | {match} 13 | 14 | ) 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /src/libs/process-content/handle-tag.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | import reactStringReplace from 'react-string-replace' 3 | 4 | export const handleTag = ( 5 | str: ReactNode[] | string, 6 | name: string, 7 | ): ReactNode[] | string => { 8 | const rxTagRef = /#(?:\[\[)?(\w+(?:\s+\w+)*)(?:\]\])?/g 9 | return reactStringReplace(str, rxTagRef, (match, i) => { 10 | if (match === '#') return str 11 | if (match === 'A' || match === 'B' || match === 'C') { 12 | return ( 13 | 14 | {match} 15 | 16 | ) 17 | } else { 18 | return ( 19 | 27 | ) 28 | } 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /src/libs/process-content/remove-markers.ts: -------------------------------------------------------------------------------- 1 | export const removeMarkers = (str: string): string => { 2 | const markers = [ 3 | "NOW", 4 | "LATER", 5 | "DOING", 6 | "DONE", 7 | "CANCELLED", 8 | "CANCELED", 9 | "IN-PROGRESS", 10 | "TODO", 11 | "WAITING", 12 | "WAIT", 13 | ]; 14 | for (const m of markers) { 15 | str = str.replace(m, ""); 16 | } 17 | return str; 18 | }; 19 | -------------------------------------------------------------------------------- /src/libs/sort-query-markers.ts: -------------------------------------------------------------------------------- 1 | export const sortQueryMarkers = (markers: any, order: any) => { 2 | return markers.sort( 3 | (a: any, b: any) => 4 | (order[a] || order.default) - (order[b] || order.default) || 5 | a > b || 6 | -(a < b), 7 | ) 8 | } 9 | -------------------------------------------------------------------------------- /src/react-kanban.d.ts: -------------------------------------------------------------------------------- 1 | declare module '@asseinfo/react-kanban' 2 | 3 | declare module '*.css?raw' { 4 | const content: string 5 | export default content 6 | } 7 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface Card { 2 | id: string; 3 | description: string; 4 | } 5 | 6 | export interface Column { 7 | id: string; 8 | title: string; 9 | cards: Card[]; 10 | } 11 | 12 | export interface ParamsProps { 13 | [key: string]: string | undefined; 14 | card_w?: string; 15 | board_w?: string; 16 | data_type?: "query" | "query-tasks" | "tasks" | ""; 17 | } 18 | 19 | export interface KanbanProps { 20 | data: { columns: Column[] }; 21 | query?: boolean; 22 | } 23 | 24 | export type Task = "TODO" | "DOING" | "NOW" | "LATER" | "DONE"; 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "target": "es2017", 5 | "lib": ["dom", "dom.iterable", "esnext"], 6 | "allowJs": true, 7 | "checkJs": true, 8 | "skipLibCheck": true, 9 | "strict": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "noEmit": true, 12 | "esModuleInterop": true, 13 | "module": "esnext", 14 | "moduleResolution": "node", 15 | "resolveJsonModule": true, 16 | "isolatedModules": true, 17 | "incremental": true, 18 | "noUncheckedIndexedAccess": true, 19 | "baseUrl": "./", 20 | "paths": { 21 | "../*": ["src/*"] 22 | } 23 | }, 24 | "include": [".eslintrc.cjs", "**/*.ts", "**/*.tsx", "**/*.cjs", "**/*.mjs"], 25 | "exclude": [ 26 | "node_modules", 27 | "./dist/**/*", 28 | "./screenshots", 29 | "tailwind.config.js" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------