├── .github
└── workflows
│ └── gh-pages.yml
├── .gitignore
├── .vitepress
├── config.mts
└── theme
│ ├── index.ts
│ └── style.css
├── .vscode
└── settings.json
├── LICENSE
├── README.md
├── changelog.md
├── cn
├── guide
│ └── getting-started.md
├── index.md
└── purchase.md
├── guide
└── getting-started.md
├── index.md
├── package.json
├── pnpm-lock.yaml
├── public
└── assets
│ ├── example.png
│ ├── logo.png
│ ├── qrcode.png
│ ├── result1.png
│ ├── result2.png
│ ├── screencast
│ └── demo.mp4
│ └── screenshot.png
├── purchase.md
└── screenshot.png
/.github/workflows/gh-pages.yml:
--------------------------------------------------------------------------------
1 | name: Move Block Docs
2 | on:
3 | push:
4 | branches:
5 | - main
6 | jobs:
7 | build-and-deploy:
8 | concurrency: ci-${{ github.ref }} # Recommended if you intend to make multiple deployments in quick succession.
9 | runs-on: ubuntu-latest
10 | steps:
11 | - name: Checkout 🛎️
12 | uses: actions/checkout@v4
13 | - name: Install pnpm
14 | run: curl -L https://unpkg.com/@pnpm/self-installer | node
15 |
16 | - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
17 | run: |
18 | pnpm install --frozen-lockfile
19 | pnpm run docs:build
20 |
21 | - name: Deploy 🚀
22 | uses: JamesIves/github-pages-deploy-action@v4.5.0
23 | with:
24 | branch: gh-pages # The branch the action should deploy to.
25 | folder: .vitepress/dist # The folder the action should deploy.
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .vitepress/cache
3 | .vitepress/dist
--------------------------------------------------------------------------------
/.vitepress/config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vitepress";
2 |
3 | // https://vitepress.dev/reference/site-config
4 | export default defineConfig({
5 | title: "Logseq Move Block",
6 | description: "Move blocks to anywhere in Logseq",
7 | base: "/logseq-plugin-move-block/",
8 | assetsDir: "assets",
9 | cleanUrls: true,
10 | locales: {
11 | root: {
12 | label: "English",
13 | lang: "en",
14 | themeConfig: {
15 | outline: {
16 | level: "deep",
17 | },
18 | nav: [
19 | { text: "Getting Started", link: "/guide/getting-started" },
20 | { text: "Changelog", link: "https://github.com/vipzhicheng/logseq-plugin-move-block/blob/main/changelog.md" },
21 | ],
22 | sidebar: {
23 | "/guide/": [
24 | {
25 | text: "Getting Started",
26 | link: "/guide/getting-started",
27 | },
28 |
29 | ],
30 | },
31 | },
32 | },
33 | cn: {
34 | label: "中文",
35 | lang: "cn", // 可选,将作为 `lang` 属性添加到 `html` 标签中
36 | link: "/cn/", // 默认 /fr/ -- 显示在导航栏翻译菜单上,可以是外部的
37 |
38 | themeConfig: {
39 | outline: {
40 | level: "deep",
41 | label: "页面导航",
42 | },
43 | docFooter: {
44 | prev: "上一页",
45 | next: "下一页",
46 | },
47 |
48 | nav: [
49 | { text: "快速开始", link: "/cn/guide/getting-started" },
50 | { text: "变更日志", link: "https://github.com/vipzhicheng/logseq-plugin-move-block/blob/main/changelog.md" },
51 | ],
52 | sidebar: {
53 | "/cn/guide/": [
54 | {
55 | text: "快速开始",
56 | link: "/cn/guide/getting-started",
57 | },
58 | ],
59 | },
60 | },
61 | },
62 | },
63 | themeConfig: {
64 | // https://vitepress.dev/reference/default-theme-config
65 | logo: "/assets/logo.png",
66 | socialLinks: [
67 | {
68 | icon: "github",
69 | link: "https://github.com/vipzhicheng/logseq-plugin-move-block",
70 | },
71 | ],
72 | search: {
73 | provider: "local",
74 | },
75 | footer: {
76 | message: "Logseq Move Block",
77 | },
78 | externalLinkIcon: true,
79 | },
80 | });
81 |
--------------------------------------------------------------------------------
/.vitepress/theme/index.ts:
--------------------------------------------------------------------------------
1 | // https://vitepress.dev/guide/custom-theme
2 | import { h } from 'vue'
3 | import type { Theme } from 'vitepress'
4 | import DefaultTheme from 'vitepress/theme'
5 | import './style.css'
6 |
7 | export default {
8 | extends: DefaultTheme,
9 | Layout: () => {
10 | return h(DefaultTheme.Layout, null, {
11 | // https://vitepress.dev/guide/extending-default-theme#layout-slots
12 | })
13 | },
14 | enhanceApp({ app, router, siteData }) {
15 | // ...
16 | }
17 | } satisfies Theme
18 |
--------------------------------------------------------------------------------
/.vitepress/theme/style.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Customize default theme styling by overriding CSS variables:
3 | * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
4 | */
5 |
6 | /**
7 | * Colors
8 | *
9 | * Each colors have exact same color scale system with 3 levels of solid
10 | * colors with different brightness, and 1 soft color.
11 | *
12 | * - `XXX-1`: The most solid color used mainly for colored text. It must
13 | * satisfy the contrast ratio against when used on top of `XXX-soft`.
14 | *
15 | * - `XXX-2`: The color used mainly for hover state of the button.
16 | *
17 | * - `XXX-3`: The color for solid background, such as bg color of the button.
18 | * It must satisfy the contrast ratio with pure white (#ffffff) text on
19 | * top of it.
20 | *
21 | * - `XXX-soft`: The color used for subtle background such as custom container
22 | * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
23 | * on top of it.
24 | *
25 | * The soft color must be semi transparent alpha channel. This is crucial
26 | * because it allows adding multiple "soft" colors on top of each other
27 | * to create a accent, such as when having inline code block inside
28 | * custom containers.
29 | *
30 | * - `default`: The color used purely for subtle indication without any
31 | * special meanings attched to it such as bg color for menu hover state.
32 | *
33 | * - `brand`: Used for primary brand colors, such as link text, button with
34 | * brand theme, etc.
35 | *
36 | * - `tip`: Used to indicate useful information. The default theme uses the
37 | * brand color for this by default.
38 | *
39 | * - `warning`: Used to indicate warning to the users. Used in custom
40 | * container, badges, etc.
41 | *
42 | * - `danger`: Used to show error, or dangerous message to the users. Used
43 | * in custom container, badges, etc.
44 | * -------------------------------------------------------------------------- */
45 |
46 | :root {
47 | --vp-c-default-1: var(--vp-c-gray-1);
48 | --vp-c-default-2: var(--vp-c-gray-2);
49 | --vp-c-default-3: var(--vp-c-gray-3);
50 | --vp-c-default-soft: var(--vp-c-gray-soft);
51 |
52 | --vp-c-brand-1: var(--vp-c-indigo-1);
53 | --vp-c-brand-2: var(--vp-c-indigo-2);
54 | --vp-c-brand-3: var(--vp-c-indigo-3);
55 | --vp-c-brand-soft: var(--vp-c-indigo-soft);
56 |
57 | --vp-c-tip-1: var(--vp-c-brand-1);
58 | --vp-c-tip-2: var(--vp-c-brand-2);
59 | --vp-c-tip-3: var(--vp-c-brand-3);
60 | --vp-c-tip-soft: var(--vp-c-brand-soft);
61 |
62 | --vp-c-warning-1: var(--vp-c-yellow-1);
63 | --vp-c-warning-2: var(--vp-c-yellow-2);
64 | --vp-c-warning-3: var(--vp-c-yellow-3);
65 | --vp-c-warning-soft: var(--vp-c-yellow-soft);
66 |
67 | --vp-c-danger-1: var(--vp-c-red-1);
68 | --vp-c-danger-2: var(--vp-c-red-2);
69 | --vp-c-danger-3: var(--vp-c-red-3);
70 | --vp-c-danger-soft: var(--vp-c-red-soft);
71 | }
72 |
73 | /**
74 | * Component: Button
75 | * -------------------------------------------------------------------------- */
76 |
77 | :root {
78 | --vp-button-brand-border: transparent;
79 | --vp-button-brand-text: var(--vp-c-white);
80 | --vp-button-brand-bg: var(--vp-c-brand-3);
81 | --vp-button-brand-hover-border: transparent;
82 | --vp-button-brand-hover-text: var(--vp-c-white);
83 | --vp-button-brand-hover-bg: var(--vp-c-brand-2);
84 | --vp-button-brand-active-border: transparent;
85 | --vp-button-brand-active-text: var(--vp-c-white);
86 | --vp-button-brand-active-bg: var(--vp-c-brand-1);
87 | }
88 |
89 | /**
90 | * Component: Home
91 | * -------------------------------------------------------------------------- */
92 |
93 | :root {
94 | --vp-home-hero-name-color: transparent;
95 | --vp-home-hero-name-background: -webkit-linear-gradient(
96 | 120deg,
97 | #bd34fe 30%,
98 | #41d1ff
99 | );
100 |
101 | --vp-home-hero-image-background-image: linear-gradient(
102 | -45deg,
103 | #bd34fe 50%,
104 | #47caff 50%
105 | );
106 | --vp-home-hero-image-filter: blur(44px);
107 | }
108 |
109 | @media (min-width: 640px) {
110 | :root {
111 | --vp-home-hero-image-filter: blur(56px);
112 | }
113 | }
114 |
115 | @media (min-width: 960px) {
116 | :root {
117 | --vp-home-hero-image-filter: blur(68px);
118 | }
119 | }
120 |
121 | /**
122 | * Component: Custom Block
123 | * -------------------------------------------------------------------------- */
124 |
125 | :root {
126 | --vp-custom-block-tip-border: transparent;
127 | --vp-custom-block-tip-text: var(--vp-c-text-1);
128 | --vp-custom-block-tip-bg: var(--vp-c-brand-soft);
129 | --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
130 | }
131 |
132 | /**
133 | * Component: Algolia
134 | * -------------------------------------------------------------------------- */
135 |
136 | .DocSearch {
137 | --docsearch-primary-color: var(--vp-c-brand-1) !important;
138 | }
139 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "ansible.python.interpreterPath": "/opt/homebrew/bin/python3"
3 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2024 Richard Yu
2 |
3 | This software is for personal use, whether in your personal computer or in a work
4 | computer. You should not distribute the license used to activate it without the
5 | explicit permission from the author.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
10 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
11 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
12 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
13 | SOFTWARE.
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Logseq Plugin Move Block
2 |
3 | [](https://github.com/vipzhicheng/logseq-plugin-move-block/releases)
4 |
5 | A Logseq plugin to help you manage block movement.
6 |
7 | https://github.com/vipzhicheng/logseq-plugin-move-block/assets/1209538/f6832d79-92a7-4113-86d8-163f4adb7f7f
8 |
9 | **Note: Move Block is a paid plugin now. I charge a fee for a few of the features in this plugin. The main features are still free to use.**
10 |
11 | ## Usage
12 |
13 | The default key-binding for the UI is: `mod+shift+m`
14 |
15 | You can learn more from the official [documentation](https://www.vipzhicheng.com/logseq-plugin-move-block/)
16 |
17 | ## Install
18 |
19 | ### Manually
20 |
21 | 1. Git clone this repo
22 | 2. Run `npm install`
23 | 3. Run `npm run build`
24 | 4. In Logseq, click `Plugins` which is in the right top dropdown menu
25 | 5. Click the `Load unpacked plugin` button and select the dist directory of this plugin directory
26 | 6. If the plugin does not work, you can try to disable and enable the plugin by clicking the switch button on the Plugins page.
27 |
28 | ### Marketplace
29 |
30 | Better choice.
31 |
32 | ## Inspiration and Thanks
33 |
34 | Part of my inspiration comes from the following plugins:
35 |
36 | - [logseq-extract-plugin](https://github.com/sidharth-panwar/logseq-extract-plugin)
37 | - [logseq-plugin-block-to-page](https://github.com/hyrijk/logseq-plugin-block-to-page)
38 |
39 | ## Notice
40 |
41 | If you want to move multiple selected blocks at once, you must use the shortcut way. The icon top right corner is not recommended. Because it will lose the selected block state.
42 |
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## v1.0.0
4 |
5 | - feat: journal action date-picker respect edn config `start-of-week`
6 | - feat: add move to block uuid, support uuid with embed or ref format.
7 | - feat: convert it to paid plugin for better maintainance.
8 | - fix: move multi blocks will not fail fast, but ignore empty blocks.
9 | - fix: cut hierarchial blocks tree.
10 | - chore: upgrade deps
11 |
12 | ## v0.1.0
13 |
14 | - feat: add move block page icon
15 | - feat: add favorites list
16 | - feat: add scenario to favorites directly
17 | - feat: make page auto complete clearable
18 | - feat: make scenario history and favorites clearable and deletable
19 | - feat: change history and favorites order from new to old
20 | - feat: make history and favorites permanent in assets
21 | - feat: favorites support drag and drop
22 | - fix: sometime enter key can not trigger submit
23 | - infra: upgrade deps.
24 |
25 | ## v0.0.13
26 |
27 | - fix: remove version indicator in the title bar.
28 | - feat: add tomorrow, yesterday option.
29 | - feat: add history panel for quick selection.
30 | - feat: add "Cut content and keep embed to target"
31 |
32 | ## v0.0.12
33 |
34 | - fix: try to fix context menu command not work
35 |
36 | ## v0.0.11
37 |
38 | - fix: try to fix console error.
39 | - feat: add a version indicator.
40 | - infra: upgrade deps.
41 |
42 | ## v0.0.10
43 |
44 | - fix: try to fix console error
45 |
46 | ## v0.0.9
47 |
48 | - fix: timezone issue
49 |
50 | ## v0.0.8
51 |
52 | - feat: add block embed action
53 |
54 | ## v0.0.7
55 |
56 | - fix: timezone issue
57 |
58 | ## v0.0.6
59 |
60 | - fix: remove copy ref to contents context command, not that useful.
61 | - fix: add copy to current page and choose at top or bottom.
62 |
63 | ## v0.0.5
64 |
65 | - fix: optimize cut content action using moveBlock
66 |
67 | ## v0.0.4
68 |
69 | - fix: adjust UI style.
70 |
71 | ## v0.0.3
72 |
73 | - infra: change build tool from Webpack to Vite
74 | - infra: add Github Actions for release
75 | - refactor: rename this plugin from `copy ref to journal` to `move block`, add a UI to control
76 |
--------------------------------------------------------------------------------
/cn/guide/getting-started.md:
--------------------------------------------------------------------------------
1 | # 快速开始
2 |
3 | 欢迎安装并尝试使用 Logseq Move Block。这是一个简单的说明,让你快速理解和开始使用。
4 |
5 | ## 是什么
6 |
7 | Logseq Move Block 是一个 Logseq 插件,用于在 Logseq 中自由的移动 Block。由于 Logseq 是一个大纲笔记软件,所以你会有越来越多的 Block。远比你的页面要多。所以你通常会有整理的需求,也就是将这些 Block 来回移动,复制,引用,或者嵌入。使用 Move Block 插件,你可以很轻松的做这些操作。
8 |
9 | 使用场景:
10 |
11 | 1. 使用 Namespace 将一个很长的页面改成嵌套页面。
12 | 2. 将部分内容从日历页面移动到某个项目页面,并在日历页面保留引用。或者反过来。
13 | 3. 将部分内容从页面的中间移动到当前页面的顶部或者底部。
14 | 4. ...
15 |
16 | ## 特性
17 |
18 | - 支持 Slash Command
19 | - 支持 Context Command
20 | - 支持快捷键
21 | - 支持页面右上角图标按钮
22 | - 支持移动到任意日历和页面
23 | - 支持移动到顶部或底部
24 | - 支持复制和移动,并保留引用或者嵌入
25 | - 支持停留在原来的页面或者跳转到目标页面
26 | - 支持保留操作历史,支持收藏常用操作
27 |
28 | ## 安装
29 |
30 | ### 插件市场
31 |
32 | 在插件市场中搜索它,并从那里进行安装。
33 |
34 | ### 手动安装
35 |
36 | 1. 从发布页面下载最新的 zip 文件。
37 | 2. 将 zip 文件解压缩到您想要存储插件的文件夹中。
38 | 3. 在 Logseq 中打开开发者模式。
39 | 4. 通过点击插件模态框上的“加载未打包插件”按钮,加载解压缩后的文件夹
40 | 5. 您现在应该能看到插件已经被安装。
41 |
42 | ## 快速开始
43 |
44 | 1. 光标放在要操作的 Block 上。
45 | 2. 通过快捷键或者 Context Command,Slash Command, 或者插件右上角图标按钮,打开配置窗口。
46 | 3. 根据需求选择合适的选项。
47 | 4. 点击 OK 执行。
48 | 5. 下次如果有类似的操作需求,直接从收藏夹或者操作历史中快速选择。
49 |
50 | ## 关于多行和嵌套的注意事项
51 |
52 | 1. 由于 Logseq 本身的限制,如果是移动多行,在选中多行以后,只能通过快捷键触发操作窗口,才能继续完成多行移动,其他方式会退化成选择时选中的第一个 Block。
53 | 2. 选择多行时,选择的顺序很重要,决定了操作的顺序,而不是实际在页面中呈现的顺序。
54 | 3. 剪切操作支持嵌套 Block,但是复制操作不支持嵌套。所以这意味着如果是剪切,只要选择了根 Block,整个 Block 树都会被剪切过去,并且维持原来的结构,而如果是复制,则不会保持原来的结构,都会被拉平,需要在新的目标页面重新手动组织结构。从视觉上,除了要关注 Logseq 高亮的区域,还需要关注区块前面的小圆点是否变色。
55 | 4. 剪切操作支持同时剪切多个嵌套 Block 树,也支持从一颗大 Block 树中剪切出多个 Block 子树,判断依据是选择高亮的 Block 之间的相互关系,只有连续的父子级关系才会认为是一颗树,如果中间断开或者本身是兄弟关系,则会被识别为是一个新的子树。小圆点未高亮的也可能因为父节点被选中而包含在剪切的树里。
56 |
57 | ### 举个例子
58 |
59 | 
60 |
61 | 这里看到高亮的区域是 `1,2,3,4,5,7,8,0`。其中小圆点高亮的只有`1,3,7,0`, 在这种情况下:
62 |
63 | 如果是复制,目标页将得到如下结果:
64 |
65 | 
66 |
67 | 如果是剪切,目标页将得到如下结果:
68 |
69 | 
70 |
71 | 可以看到,这里因为 7 和 0 之间的 8 没有被选中,所以 0 在剪切后作为了一颗新的子树,而 2,4,5 虽然没有被选中,但是,因为父节点被选中了,所以也一起被剪切了。
72 |
73 | 这个例子比较极端,是为了演示插件的处理逻辑,日常使用时,一般很少出现不连续的选择一起移动的情况。
74 |
--------------------------------------------------------------------------------
/cn/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 |
4 | hero:
5 | name: "Logseq Move Block"
6 | text: "移动 Block 到任何地方"
7 | tagline: "Logseq 移动 Block 解决方案"
8 | image:
9 | src: /assets/logo.png
10 | alt: Logseq Move Block
11 | actions:
12 | - theme: brand
13 | text: 开始使用
14 | link: /cn/guide/getting-started
15 | - theme: alt
16 | text: 购买Pro版本
17 | link: /cn/purchase
18 |
19 | features:
20 | - title: 易于使用
21 | details: 选中要移动的行,点击插件图标即可打开配置窗口。
22 | icon: ☕️
23 | - title: 配置多样
24 | details: 可以移动到不同的页面,不同的位置,以不同的方式。可以记录操作历史和收藏常用操作。
25 | icon: 🛠️
26 | - title: 支持多行和嵌套
27 | details: 多行是指选中了多个Block,可以是连续的也可以不连续。嵌套是指以合理方式组织好的Block树。
28 | icon: 📚
29 | ---
30 |
31 |
32 |
33 | ## 示例
34 |
35 |
--------------------------------------------------------------------------------
/cn/purchase.md:
--------------------------------------------------------------------------------
1 | # 购买
2 |
3 | 这个插件可以免费使用大部分功能,为了插件的健康发展,我还是决定设置一个收费模式。
4 |
5 | 购买后,我会通过电子邮件向您发送许可证密钥。
6 |
7 | 您可以在 48 小时内在任意多的设备上激活许可证。请不要清除 Logseq 缓存,因为这将导致激活丢失。只要您的激活存在,就没有时间限制。
8 |
9 | 国内用户,您可以加好友咨询,许可证密钥将在您付款后,通过微信发给您:
10 |
11 |
12 |

13 |
14 |
15 |
22 |
--------------------------------------------------------------------------------
/guide/getting-started.md:
--------------------------------------------------------------------------------
1 | # Getting Started
2 |
3 | Welcome to the installation and usage for Logseq Move Block. This is a simple guide to help you quickly understand and start using it.
4 |
5 | ## What is it
6 |
7 | Logseq Move Block is a Logseq plugin that allows you to freely move blocks within Logseq. As Logseq is an outlining note-taking software, you will have more and more blocks over time, far more than your pages. Therefore, you often have the need to organize these blocks by moving them back and forth, copying them, referencing them, or embedding them. With the Move Block plugin, you can easily perform these operations.
8 |
9 | Use cases:
10 |
11 | 1. Use Namespace to convert a long page into nested pages.
12 | 2. Move content from a journal page to a project page while retaining references on the journal page, or vice versa.
13 | 3. Move content from the middle of a page to the top or bottom of the current page.
14 | 4. ...
15 |
16 | ## Features
17 |
18 | - Supports Slash Command
19 | - Supports Context Command
20 | - Supports keyboard shortcuts
21 | - Supports icon button at the top right corner of the page
22 | - Supports moving to any journal and page
23 | - Supports moving to the top or bottom
24 | - Supports copying and moving, and retaining references or embedding
25 | - Supports staying on the original page or navigating to the target page
26 | - Supports preserving operation history and adding frequently used operations to favorites
27 |
28 | ## Installation
29 |
30 | ### Plugin Marketplace
31 |
32 | Search for it in the plugin marketplace and install it from there.
33 |
34 | ### Manual Installation
35 |
36 | 1. Download the latest zip file from the release page.
37 | 2. Unzip the zip file into the folder where you want to store the plugin.
38 | 3. Enable developer mode in Logseq.
39 | 4. Load the unzipped folder by clicking the "Load unpacked plugin" button on the plugin modal.
40 | 5. You should now see that the plugin has been installed.
41 |
42 | ## Quick Start
43 |
44 | 1. Place the cursor on the block you want to operate on.
45 | 2. Open the configuration window using keyboard shortcuts, Context Command, Slash Command, or the icon button at the top right corner of the page.
46 | 3. Select the appropriate options according to your needs.
47 | 4. Click OK to execute.
48 | 5. For similar operation requirements in the future, quickly select from the favorite list or operation history.
49 |
50 | ## Notes on Multiple Lines and Nesting
51 |
52 | 1. Due to the limitations of Logseq itself, if you are moving multiple lines, after selecting multiple lines, you can only continue with the multi-line movement by triggering the operation window using keyboard shortcuts. Other methods will degrade to selecting the first block that was selected during the selection.
53 | 2. The order of selection when selecting multiple lines is important, as it determines the order of operations, not the order as they appear on the page.
54 | 3. Cut operations support nested blocks, but copy operations do not support nesting. This means that if you cut, as long as you select the root block, the entire block tree will be cut and maintain the original structure. However, if you copy, the original structure will not be preserved and they will be flattened, requiring manual reorganization of the structure on the new target page. Visually, in addition to paying attention to the highlighted area in Logseq, you also need to pay attention to whether the small circle in front of the block changes color.
55 | 4. Cut operations support cutting multiple nested block trees at the same time. They also support cutting multiple block subtrees from a large block tree. The judgment is based on the relationship between the highlighted blocks. Only continuous parent-child relationships will be recognized as a tree. If there is a break in between or if they are siblings, they will be recognized as a new subtree. Blocks with unhighlighted small circles may also be included in the cut tree if their parent nodes are selected.
56 |
57 | ### Example
58 |
59 | 
60 |
61 | Here, the highlighted area is `1,2,3,4,5,7,8,0`. Among them, only `1,3,7,0` have highlighted small circles. In this case:
62 |
63 | If it is copying, the target page will have the following result:
64 |
65 | 
66 |
67 | If it is cutting, the target page will have the following result:
68 |
69 | 
70 |
71 | As can be seen, here, because the 8 between 7 and 0 was not selected, 0 is treated as a new subtree after the cut, while 2, 4, and 5 were not selected, but because their parent node was selected, they were also cut together.
72 |
73 | This example is extreme and is intended to demonstrate the plugin's handling logic. In daily use, it is rare to have discontinuous selections that need to be moved together.
--------------------------------------------------------------------------------
/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 |
4 | hero:
5 | name: "Logseq Move Block"
6 | text: "Move block to any place"
7 | tagline: "Logseq block moving solution"
8 | image:
9 | src: /assets/logo.png
10 | alt: Logseq Move Block
11 | actions:
12 | - theme: brand
13 | text: Getting started
14 | link: /guide/getting-started
15 | - theme: alt
16 | text: Purchase Pro
17 | link: /purchase
18 |
19 | features:
20 | - title: Easy to use
21 | details: Choose the block you want to move, click the plugin icon to open the configuration window.
22 | icon: ☕️
23 | - title: Configurable and flexible
24 | details: Ability to move to different pages, different positions, in different ways, record operation history and add commonly used operations to favorites.
25 | icon: 🛠️
26 | - title: Support multiple lines and nested
27 | details: Multi-line means that you have selected multiple blocks, which can be continuous or not. Nesting means that the blocks are organized in a reasonable blocks tree.
28 | icon: 📚
29 | ---
30 |
31 |
32 |
33 | ## A screencast
34 |
35 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "logseq-plugin-move-block",
3 | "version": "1.0.0",
4 | "description": "Move blocks to anywhere in Logseq",
5 | "main": "index.js",
6 | "scripts": {
7 | "docs:dev": "vitepress dev",
8 | "docs:build": "vitepress build",
9 | "docs:preview": "vitepress preview"
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "devDependencies": {
14 | "vitepress": "^1.0.1",
15 | "vue": "^3.4.21"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | devDependencies:
8 | vitepress:
9 | specifier: ^1.0.1
10 | version: 1.0.1(@algolia/client-search@4.23.2)(search-insights@2.13.0)
11 | vue:
12 | specifier: ^3.4.21
13 | version: 3.4.21
14 |
15 | packages:
16 |
17 | /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0):
18 | resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==}
19 | dependencies:
20 | '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0)
21 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)
22 | transitivePeerDependencies:
23 | - '@algolia/client-search'
24 | - algoliasearch
25 | - search-insights
26 | dev: true
27 |
28 | /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0):
29 | resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==}
30 | peerDependencies:
31 | search-insights: '>= 1 < 3'
32 | dependencies:
33 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)
34 | search-insights: 2.13.0
35 | transitivePeerDependencies:
36 | - '@algolia/client-search'
37 | - algoliasearch
38 | dev: true
39 |
40 | /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2):
41 | resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==}
42 | peerDependencies:
43 | '@algolia/client-search': '>= 4.9.1 < 6'
44 | algoliasearch: '>= 4.9.1 < 6'
45 | dependencies:
46 | '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)
47 | '@algolia/client-search': 4.23.2
48 | algoliasearch: 4.23.2
49 | dev: true
50 |
51 | /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2):
52 | resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==}
53 | peerDependencies:
54 | '@algolia/client-search': '>= 4.9.1 < 6'
55 | algoliasearch: '>= 4.9.1 < 6'
56 | dependencies:
57 | '@algolia/client-search': 4.23.2
58 | algoliasearch: 4.23.2
59 | dev: true
60 |
61 | /@algolia/cache-browser-local-storage@4.23.2:
62 | resolution: {integrity: sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==}
63 | dependencies:
64 | '@algolia/cache-common': 4.23.2
65 | dev: true
66 |
67 | /@algolia/cache-common@4.23.2:
68 | resolution: {integrity: sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==}
69 | dev: true
70 |
71 | /@algolia/cache-in-memory@4.23.2:
72 | resolution: {integrity: sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==}
73 | dependencies:
74 | '@algolia/cache-common': 4.23.2
75 | dev: true
76 |
77 | /@algolia/client-account@4.23.2:
78 | resolution: {integrity: sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==}
79 | dependencies:
80 | '@algolia/client-common': 4.23.2
81 | '@algolia/client-search': 4.23.2
82 | '@algolia/transporter': 4.23.2
83 | dev: true
84 |
85 | /@algolia/client-analytics@4.23.2:
86 | resolution: {integrity: sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==}
87 | dependencies:
88 | '@algolia/client-common': 4.23.2
89 | '@algolia/client-search': 4.23.2
90 | '@algolia/requester-common': 4.23.2
91 | '@algolia/transporter': 4.23.2
92 | dev: true
93 |
94 | /@algolia/client-common@4.23.2:
95 | resolution: {integrity: sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==}
96 | dependencies:
97 | '@algolia/requester-common': 4.23.2
98 | '@algolia/transporter': 4.23.2
99 | dev: true
100 |
101 | /@algolia/client-personalization@4.23.2:
102 | resolution: {integrity: sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==}
103 | dependencies:
104 | '@algolia/client-common': 4.23.2
105 | '@algolia/requester-common': 4.23.2
106 | '@algolia/transporter': 4.23.2
107 | dev: true
108 |
109 | /@algolia/client-search@4.23.2:
110 | resolution: {integrity: sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==}
111 | dependencies:
112 | '@algolia/client-common': 4.23.2
113 | '@algolia/requester-common': 4.23.2
114 | '@algolia/transporter': 4.23.2
115 | dev: true
116 |
117 | /@algolia/logger-common@4.23.2:
118 | resolution: {integrity: sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==}
119 | dev: true
120 |
121 | /@algolia/logger-console@4.23.2:
122 | resolution: {integrity: sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==}
123 | dependencies:
124 | '@algolia/logger-common': 4.23.2
125 | dev: true
126 |
127 | /@algolia/recommend@4.23.2:
128 | resolution: {integrity: sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==}
129 | dependencies:
130 | '@algolia/cache-browser-local-storage': 4.23.2
131 | '@algolia/cache-common': 4.23.2
132 | '@algolia/cache-in-memory': 4.23.2
133 | '@algolia/client-common': 4.23.2
134 | '@algolia/client-search': 4.23.2
135 | '@algolia/logger-common': 4.23.2
136 | '@algolia/logger-console': 4.23.2
137 | '@algolia/requester-browser-xhr': 4.23.2
138 | '@algolia/requester-common': 4.23.2
139 | '@algolia/requester-node-http': 4.23.2
140 | '@algolia/transporter': 4.23.2
141 | dev: true
142 |
143 | /@algolia/requester-browser-xhr@4.23.2:
144 | resolution: {integrity: sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==}
145 | dependencies:
146 | '@algolia/requester-common': 4.23.2
147 | dev: true
148 |
149 | /@algolia/requester-common@4.23.2:
150 | resolution: {integrity: sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==}
151 | dev: true
152 |
153 | /@algolia/requester-node-http@4.23.2:
154 | resolution: {integrity: sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==}
155 | dependencies:
156 | '@algolia/requester-common': 4.23.2
157 | dev: true
158 |
159 | /@algolia/transporter@4.23.2:
160 | resolution: {integrity: sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==}
161 | dependencies:
162 | '@algolia/cache-common': 4.23.2
163 | '@algolia/logger-common': 4.23.2
164 | '@algolia/requester-common': 4.23.2
165 | dev: true
166 |
167 | /@babel/helper-string-parser@7.24.1:
168 | resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
169 | engines: {node: '>=6.9.0'}
170 | dev: true
171 |
172 | /@babel/helper-validator-identifier@7.22.20:
173 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
174 | engines: {node: '>=6.9.0'}
175 | dev: true
176 |
177 | /@babel/parser@7.24.1:
178 | resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==}
179 | engines: {node: '>=6.0.0'}
180 | hasBin: true
181 | dependencies:
182 | '@babel/types': 7.24.0
183 | dev: true
184 |
185 | /@babel/types@7.24.0:
186 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
187 | engines: {node: '>=6.9.0'}
188 | dependencies:
189 | '@babel/helper-string-parser': 7.24.1
190 | '@babel/helper-validator-identifier': 7.22.20
191 | to-fast-properties: 2.0.0
192 | dev: true
193 |
194 | /@docsearch/css@3.6.0:
195 | resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==}
196 | dev: true
197 |
198 | /@docsearch/js@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0):
199 | resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==}
200 | dependencies:
201 | '@docsearch/react': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0)
202 | preact: 10.20.1
203 | transitivePeerDependencies:
204 | - '@algolia/client-search'
205 | - '@types/react'
206 | - react
207 | - react-dom
208 | - search-insights
209 | dev: true
210 |
211 | /@docsearch/react@3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0):
212 | resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==}
213 | peerDependencies:
214 | '@types/react': '>= 16.8.0 < 19.0.0'
215 | react: '>= 16.8.0 < 19.0.0'
216 | react-dom: '>= 16.8.0 < 19.0.0'
217 | search-insights: '>= 1 < 3'
218 | peerDependenciesMeta:
219 | '@types/react':
220 | optional: true
221 | react:
222 | optional: true
223 | react-dom:
224 | optional: true
225 | search-insights:
226 | optional: true
227 | dependencies:
228 | '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0)
229 | '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)
230 | '@docsearch/css': 3.6.0
231 | algoliasearch: 4.23.2
232 | search-insights: 2.13.0
233 | transitivePeerDependencies:
234 | - '@algolia/client-search'
235 | dev: true
236 |
237 | /@esbuild/aix-ppc64@0.20.2:
238 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
239 | engines: {node: '>=12'}
240 | cpu: [ppc64]
241 | os: [aix]
242 | requiresBuild: true
243 | dev: true
244 | optional: true
245 |
246 | /@esbuild/android-arm64@0.20.2:
247 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
248 | engines: {node: '>=12'}
249 | cpu: [arm64]
250 | os: [android]
251 | requiresBuild: true
252 | dev: true
253 | optional: true
254 |
255 | /@esbuild/android-arm@0.20.2:
256 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
257 | engines: {node: '>=12'}
258 | cpu: [arm]
259 | os: [android]
260 | requiresBuild: true
261 | dev: true
262 | optional: true
263 |
264 | /@esbuild/android-x64@0.20.2:
265 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
266 | engines: {node: '>=12'}
267 | cpu: [x64]
268 | os: [android]
269 | requiresBuild: true
270 | dev: true
271 | optional: true
272 |
273 | /@esbuild/darwin-arm64@0.20.2:
274 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
275 | engines: {node: '>=12'}
276 | cpu: [arm64]
277 | os: [darwin]
278 | requiresBuild: true
279 | dev: true
280 | optional: true
281 |
282 | /@esbuild/darwin-x64@0.20.2:
283 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
284 | engines: {node: '>=12'}
285 | cpu: [x64]
286 | os: [darwin]
287 | requiresBuild: true
288 | dev: true
289 | optional: true
290 |
291 | /@esbuild/freebsd-arm64@0.20.2:
292 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
293 | engines: {node: '>=12'}
294 | cpu: [arm64]
295 | os: [freebsd]
296 | requiresBuild: true
297 | dev: true
298 | optional: true
299 |
300 | /@esbuild/freebsd-x64@0.20.2:
301 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
302 | engines: {node: '>=12'}
303 | cpu: [x64]
304 | os: [freebsd]
305 | requiresBuild: true
306 | dev: true
307 | optional: true
308 |
309 | /@esbuild/linux-arm64@0.20.2:
310 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
311 | engines: {node: '>=12'}
312 | cpu: [arm64]
313 | os: [linux]
314 | requiresBuild: true
315 | dev: true
316 | optional: true
317 |
318 | /@esbuild/linux-arm@0.20.2:
319 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
320 | engines: {node: '>=12'}
321 | cpu: [arm]
322 | os: [linux]
323 | requiresBuild: true
324 | dev: true
325 | optional: true
326 |
327 | /@esbuild/linux-ia32@0.20.2:
328 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
329 | engines: {node: '>=12'}
330 | cpu: [ia32]
331 | os: [linux]
332 | requiresBuild: true
333 | dev: true
334 | optional: true
335 |
336 | /@esbuild/linux-loong64@0.20.2:
337 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
338 | engines: {node: '>=12'}
339 | cpu: [loong64]
340 | os: [linux]
341 | requiresBuild: true
342 | dev: true
343 | optional: true
344 |
345 | /@esbuild/linux-mips64el@0.20.2:
346 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
347 | engines: {node: '>=12'}
348 | cpu: [mips64el]
349 | os: [linux]
350 | requiresBuild: true
351 | dev: true
352 | optional: true
353 |
354 | /@esbuild/linux-ppc64@0.20.2:
355 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
356 | engines: {node: '>=12'}
357 | cpu: [ppc64]
358 | os: [linux]
359 | requiresBuild: true
360 | dev: true
361 | optional: true
362 |
363 | /@esbuild/linux-riscv64@0.20.2:
364 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
365 | engines: {node: '>=12'}
366 | cpu: [riscv64]
367 | os: [linux]
368 | requiresBuild: true
369 | dev: true
370 | optional: true
371 |
372 | /@esbuild/linux-s390x@0.20.2:
373 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
374 | engines: {node: '>=12'}
375 | cpu: [s390x]
376 | os: [linux]
377 | requiresBuild: true
378 | dev: true
379 | optional: true
380 |
381 | /@esbuild/linux-x64@0.20.2:
382 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
383 | engines: {node: '>=12'}
384 | cpu: [x64]
385 | os: [linux]
386 | requiresBuild: true
387 | dev: true
388 | optional: true
389 |
390 | /@esbuild/netbsd-x64@0.20.2:
391 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
392 | engines: {node: '>=12'}
393 | cpu: [x64]
394 | os: [netbsd]
395 | requiresBuild: true
396 | dev: true
397 | optional: true
398 |
399 | /@esbuild/openbsd-x64@0.20.2:
400 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
401 | engines: {node: '>=12'}
402 | cpu: [x64]
403 | os: [openbsd]
404 | requiresBuild: true
405 | dev: true
406 | optional: true
407 |
408 | /@esbuild/sunos-x64@0.20.2:
409 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
410 | engines: {node: '>=12'}
411 | cpu: [x64]
412 | os: [sunos]
413 | requiresBuild: true
414 | dev: true
415 | optional: true
416 |
417 | /@esbuild/win32-arm64@0.20.2:
418 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
419 | engines: {node: '>=12'}
420 | cpu: [arm64]
421 | os: [win32]
422 | requiresBuild: true
423 | dev: true
424 | optional: true
425 |
426 | /@esbuild/win32-ia32@0.20.2:
427 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
428 | engines: {node: '>=12'}
429 | cpu: [ia32]
430 | os: [win32]
431 | requiresBuild: true
432 | dev: true
433 | optional: true
434 |
435 | /@esbuild/win32-x64@0.20.2:
436 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
437 | engines: {node: '>=12'}
438 | cpu: [x64]
439 | os: [win32]
440 | requiresBuild: true
441 | dev: true
442 | optional: true
443 |
444 | /@jridgewell/sourcemap-codec@1.4.15:
445 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
446 | dev: true
447 |
448 | /@rollup/rollup-android-arm-eabi@4.13.2:
449 | resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==}
450 | cpu: [arm]
451 | os: [android]
452 | requiresBuild: true
453 | dev: true
454 | optional: true
455 |
456 | /@rollup/rollup-android-arm64@4.13.2:
457 | resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==}
458 | cpu: [arm64]
459 | os: [android]
460 | requiresBuild: true
461 | dev: true
462 | optional: true
463 |
464 | /@rollup/rollup-darwin-arm64@4.13.2:
465 | resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==}
466 | cpu: [arm64]
467 | os: [darwin]
468 | requiresBuild: true
469 | dev: true
470 | optional: true
471 |
472 | /@rollup/rollup-darwin-x64@4.13.2:
473 | resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==}
474 | cpu: [x64]
475 | os: [darwin]
476 | requiresBuild: true
477 | dev: true
478 | optional: true
479 |
480 | /@rollup/rollup-linux-arm-gnueabihf@4.13.2:
481 | resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==}
482 | cpu: [arm]
483 | os: [linux]
484 | requiresBuild: true
485 | dev: true
486 | optional: true
487 |
488 | /@rollup/rollup-linux-arm64-gnu@4.13.2:
489 | resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==}
490 | cpu: [arm64]
491 | os: [linux]
492 | requiresBuild: true
493 | dev: true
494 | optional: true
495 |
496 | /@rollup/rollup-linux-arm64-musl@4.13.2:
497 | resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==}
498 | cpu: [arm64]
499 | os: [linux]
500 | requiresBuild: true
501 | dev: true
502 | optional: true
503 |
504 | /@rollup/rollup-linux-powerpc64le-gnu@4.13.2:
505 | resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==}
506 | cpu: [ppc64le]
507 | os: [linux]
508 | requiresBuild: true
509 | dev: true
510 | optional: true
511 |
512 | /@rollup/rollup-linux-riscv64-gnu@4.13.2:
513 | resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==}
514 | cpu: [riscv64]
515 | os: [linux]
516 | requiresBuild: true
517 | dev: true
518 | optional: true
519 |
520 | /@rollup/rollup-linux-s390x-gnu@4.13.2:
521 | resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==}
522 | cpu: [s390x]
523 | os: [linux]
524 | requiresBuild: true
525 | dev: true
526 | optional: true
527 |
528 | /@rollup/rollup-linux-x64-gnu@4.13.2:
529 | resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==}
530 | cpu: [x64]
531 | os: [linux]
532 | requiresBuild: true
533 | dev: true
534 | optional: true
535 |
536 | /@rollup/rollup-linux-x64-musl@4.13.2:
537 | resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==}
538 | cpu: [x64]
539 | os: [linux]
540 | requiresBuild: true
541 | dev: true
542 | optional: true
543 |
544 | /@rollup/rollup-win32-arm64-msvc@4.13.2:
545 | resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==}
546 | cpu: [arm64]
547 | os: [win32]
548 | requiresBuild: true
549 | dev: true
550 | optional: true
551 |
552 | /@rollup/rollup-win32-ia32-msvc@4.13.2:
553 | resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==}
554 | cpu: [ia32]
555 | os: [win32]
556 | requiresBuild: true
557 | dev: true
558 | optional: true
559 |
560 | /@rollup/rollup-win32-x64-msvc@4.13.2:
561 | resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==}
562 | cpu: [x64]
563 | os: [win32]
564 | requiresBuild: true
565 | dev: true
566 | optional: true
567 |
568 | /@shikijs/core@1.2.1:
569 | resolution: {integrity: sha512-KaIS0H4EQ3KI2d++TjYqRNgwp8E3M/68e9veR4QtInzA7kKFgcjeiJqb80fuXW+blDy5fmd11PN9g9soz/3ANQ==}
570 | dev: true
571 |
572 | /@shikijs/transformers@1.2.1:
573 | resolution: {integrity: sha512-H7cVtrdv6BW2kx83t2IQgP5ri1IA50mE3QnzgJ0AvOKCGtCEieXu0JIP3245cgjNLrL+LBwb8DtTXdky1iQL9Q==}
574 | dependencies:
575 | shiki: 1.2.1
576 | dev: true
577 |
578 | /@types/estree@1.0.5:
579 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
580 | dev: true
581 |
582 | /@types/linkify-it@3.0.5:
583 | resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==}
584 | dev: true
585 |
586 | /@types/markdown-it@13.0.7:
587 | resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==}
588 | dependencies:
589 | '@types/linkify-it': 3.0.5
590 | '@types/mdurl': 1.0.5
591 | dev: true
592 |
593 | /@types/mdurl@1.0.5:
594 | resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==}
595 | dev: true
596 |
597 | /@types/web-bluetooth@0.0.20:
598 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
599 | dev: true
600 |
601 | /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(vue@3.4.21):
602 | resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==}
603 | engines: {node: ^18.0.0 || >=20.0.0}
604 | peerDependencies:
605 | vite: ^5.0.0
606 | vue: ^3.2.25
607 | dependencies:
608 | vite: 5.2.7
609 | vue: 3.4.21
610 | dev: true
611 |
612 | /@vue/compiler-core@3.4.21:
613 | resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==}
614 | dependencies:
615 | '@babel/parser': 7.24.1
616 | '@vue/shared': 3.4.21
617 | entities: 4.5.0
618 | estree-walker: 2.0.2
619 | source-map-js: 1.2.0
620 | dev: true
621 |
622 | /@vue/compiler-dom@3.4.21:
623 | resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==}
624 | dependencies:
625 | '@vue/compiler-core': 3.4.21
626 | '@vue/shared': 3.4.21
627 | dev: true
628 |
629 | /@vue/compiler-sfc@3.4.21:
630 | resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==}
631 | dependencies:
632 | '@babel/parser': 7.24.1
633 | '@vue/compiler-core': 3.4.21
634 | '@vue/compiler-dom': 3.4.21
635 | '@vue/compiler-ssr': 3.4.21
636 | '@vue/shared': 3.4.21
637 | estree-walker: 2.0.2
638 | magic-string: 0.30.8
639 | postcss: 8.4.38
640 | source-map-js: 1.2.0
641 | dev: true
642 |
643 | /@vue/compiler-ssr@3.4.21:
644 | resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==}
645 | dependencies:
646 | '@vue/compiler-dom': 3.4.21
647 | '@vue/shared': 3.4.21
648 | dev: true
649 |
650 | /@vue/devtools-api@7.0.25(vue@3.4.21):
651 | resolution: {integrity: sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==}
652 | dependencies:
653 | '@vue/devtools-kit': 7.0.25(vue@3.4.21)
654 | transitivePeerDependencies:
655 | - vue
656 | dev: true
657 |
658 | /@vue/devtools-kit@7.0.25(vue@3.4.21):
659 | resolution: {integrity: sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==}
660 | peerDependencies:
661 | vue: ^3.0.0
662 | dependencies:
663 | '@vue/devtools-shared': 7.0.25
664 | hookable: 5.5.3
665 | mitt: 3.0.1
666 | perfect-debounce: 1.0.0
667 | speakingurl: 14.0.1
668 | vue: 3.4.21
669 | dev: true
670 |
671 | /@vue/devtools-shared@7.0.25:
672 | resolution: {integrity: sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==}
673 | dependencies:
674 | rfdc: 1.3.1
675 | dev: true
676 |
677 | /@vue/reactivity@3.4.21:
678 | resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==}
679 | dependencies:
680 | '@vue/shared': 3.4.21
681 | dev: true
682 |
683 | /@vue/runtime-core@3.4.21:
684 | resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==}
685 | dependencies:
686 | '@vue/reactivity': 3.4.21
687 | '@vue/shared': 3.4.21
688 | dev: true
689 |
690 | /@vue/runtime-dom@3.4.21:
691 | resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==}
692 | dependencies:
693 | '@vue/runtime-core': 3.4.21
694 | '@vue/shared': 3.4.21
695 | csstype: 3.1.3
696 | dev: true
697 |
698 | /@vue/server-renderer@3.4.21(vue@3.4.21):
699 | resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==}
700 | peerDependencies:
701 | vue: 3.4.21
702 | dependencies:
703 | '@vue/compiler-ssr': 3.4.21
704 | '@vue/shared': 3.4.21
705 | vue: 3.4.21
706 | dev: true
707 |
708 | /@vue/shared@3.4.21:
709 | resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==}
710 | dev: true
711 |
712 | /@vueuse/core@10.9.0(vue@3.4.21):
713 | resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==}
714 | dependencies:
715 | '@types/web-bluetooth': 0.0.20
716 | '@vueuse/metadata': 10.9.0
717 | '@vueuse/shared': 10.9.0(vue@3.4.21)
718 | vue-demi: 0.14.7(vue@3.4.21)
719 | transitivePeerDependencies:
720 | - '@vue/composition-api'
721 | - vue
722 | dev: true
723 |
724 | /@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.21):
725 | resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==}
726 | peerDependencies:
727 | async-validator: '*'
728 | axios: '*'
729 | change-case: '*'
730 | drauu: '*'
731 | focus-trap: '*'
732 | fuse.js: '*'
733 | idb-keyval: '*'
734 | jwt-decode: '*'
735 | nprogress: '*'
736 | qrcode: '*'
737 | sortablejs: '*'
738 | universal-cookie: '*'
739 | peerDependenciesMeta:
740 | async-validator:
741 | optional: true
742 | axios:
743 | optional: true
744 | change-case:
745 | optional: true
746 | drauu:
747 | optional: true
748 | focus-trap:
749 | optional: true
750 | fuse.js:
751 | optional: true
752 | idb-keyval:
753 | optional: true
754 | jwt-decode:
755 | optional: true
756 | nprogress:
757 | optional: true
758 | qrcode:
759 | optional: true
760 | sortablejs:
761 | optional: true
762 | universal-cookie:
763 | optional: true
764 | dependencies:
765 | '@vueuse/core': 10.9.0(vue@3.4.21)
766 | '@vueuse/shared': 10.9.0(vue@3.4.21)
767 | focus-trap: 7.5.4
768 | vue-demi: 0.14.7(vue@3.4.21)
769 | transitivePeerDependencies:
770 | - '@vue/composition-api'
771 | - vue
772 | dev: true
773 |
774 | /@vueuse/metadata@10.9.0:
775 | resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==}
776 | dev: true
777 |
778 | /@vueuse/shared@10.9.0(vue@3.4.21):
779 | resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==}
780 | dependencies:
781 | vue-demi: 0.14.7(vue@3.4.21)
782 | transitivePeerDependencies:
783 | - '@vue/composition-api'
784 | - vue
785 | dev: true
786 |
787 | /algoliasearch@4.23.2:
788 | resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==}
789 | dependencies:
790 | '@algolia/cache-browser-local-storage': 4.23.2
791 | '@algolia/cache-common': 4.23.2
792 | '@algolia/cache-in-memory': 4.23.2
793 | '@algolia/client-account': 4.23.2
794 | '@algolia/client-analytics': 4.23.2
795 | '@algolia/client-common': 4.23.2
796 | '@algolia/client-personalization': 4.23.2
797 | '@algolia/client-search': 4.23.2
798 | '@algolia/logger-common': 4.23.2
799 | '@algolia/logger-console': 4.23.2
800 | '@algolia/recommend': 4.23.2
801 | '@algolia/requester-browser-xhr': 4.23.2
802 | '@algolia/requester-common': 4.23.2
803 | '@algolia/requester-node-http': 4.23.2
804 | '@algolia/transporter': 4.23.2
805 | dev: true
806 |
807 | /csstype@3.1.3:
808 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
809 | dev: true
810 |
811 | /entities@4.5.0:
812 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
813 | engines: {node: '>=0.12'}
814 | dev: true
815 |
816 | /esbuild@0.20.2:
817 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
818 | engines: {node: '>=12'}
819 | hasBin: true
820 | requiresBuild: true
821 | optionalDependencies:
822 | '@esbuild/aix-ppc64': 0.20.2
823 | '@esbuild/android-arm': 0.20.2
824 | '@esbuild/android-arm64': 0.20.2
825 | '@esbuild/android-x64': 0.20.2
826 | '@esbuild/darwin-arm64': 0.20.2
827 | '@esbuild/darwin-x64': 0.20.2
828 | '@esbuild/freebsd-arm64': 0.20.2
829 | '@esbuild/freebsd-x64': 0.20.2
830 | '@esbuild/linux-arm': 0.20.2
831 | '@esbuild/linux-arm64': 0.20.2
832 | '@esbuild/linux-ia32': 0.20.2
833 | '@esbuild/linux-loong64': 0.20.2
834 | '@esbuild/linux-mips64el': 0.20.2
835 | '@esbuild/linux-ppc64': 0.20.2
836 | '@esbuild/linux-riscv64': 0.20.2
837 | '@esbuild/linux-s390x': 0.20.2
838 | '@esbuild/linux-x64': 0.20.2
839 | '@esbuild/netbsd-x64': 0.20.2
840 | '@esbuild/openbsd-x64': 0.20.2
841 | '@esbuild/sunos-x64': 0.20.2
842 | '@esbuild/win32-arm64': 0.20.2
843 | '@esbuild/win32-ia32': 0.20.2
844 | '@esbuild/win32-x64': 0.20.2
845 | dev: true
846 |
847 | /estree-walker@2.0.2:
848 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
849 | dev: true
850 |
851 | /focus-trap@7.5.4:
852 | resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==}
853 | dependencies:
854 | tabbable: 6.2.0
855 | dev: true
856 |
857 | /fsevents@2.3.3:
858 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
859 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
860 | os: [darwin]
861 | requiresBuild: true
862 | dev: true
863 | optional: true
864 |
865 | /hookable@5.5.3:
866 | resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
867 | dev: true
868 |
869 | /magic-string@0.30.8:
870 | resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
871 | engines: {node: '>=12'}
872 | dependencies:
873 | '@jridgewell/sourcemap-codec': 1.4.15
874 | dev: true
875 |
876 | /mark.js@8.11.1:
877 | resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
878 | dev: true
879 |
880 | /minisearch@6.3.0:
881 | resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==}
882 | dev: true
883 |
884 | /mitt@3.0.1:
885 | resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
886 | dev: true
887 |
888 | /nanoid@3.3.7:
889 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
890 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
891 | hasBin: true
892 | dev: true
893 |
894 | /perfect-debounce@1.0.0:
895 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
896 | dev: true
897 |
898 | /picocolors@1.0.0:
899 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
900 | dev: true
901 |
902 | /postcss@8.4.38:
903 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
904 | engines: {node: ^10 || ^12 || >=14}
905 | dependencies:
906 | nanoid: 3.3.7
907 | picocolors: 1.0.0
908 | source-map-js: 1.2.0
909 | dev: true
910 |
911 | /preact@10.20.1:
912 | resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==}
913 | dev: true
914 |
915 | /rfdc@1.3.1:
916 | resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
917 | dev: true
918 |
919 | /rollup@4.13.2:
920 | resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==}
921 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
922 | hasBin: true
923 | dependencies:
924 | '@types/estree': 1.0.5
925 | optionalDependencies:
926 | '@rollup/rollup-android-arm-eabi': 4.13.2
927 | '@rollup/rollup-android-arm64': 4.13.2
928 | '@rollup/rollup-darwin-arm64': 4.13.2
929 | '@rollup/rollup-darwin-x64': 4.13.2
930 | '@rollup/rollup-linux-arm-gnueabihf': 4.13.2
931 | '@rollup/rollup-linux-arm64-gnu': 4.13.2
932 | '@rollup/rollup-linux-arm64-musl': 4.13.2
933 | '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2
934 | '@rollup/rollup-linux-riscv64-gnu': 4.13.2
935 | '@rollup/rollup-linux-s390x-gnu': 4.13.2
936 | '@rollup/rollup-linux-x64-gnu': 4.13.2
937 | '@rollup/rollup-linux-x64-musl': 4.13.2
938 | '@rollup/rollup-win32-arm64-msvc': 4.13.2
939 | '@rollup/rollup-win32-ia32-msvc': 4.13.2
940 | '@rollup/rollup-win32-x64-msvc': 4.13.2
941 | fsevents: 2.3.3
942 | dev: true
943 |
944 | /search-insights@2.13.0:
945 | resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==}
946 | dev: true
947 |
948 | /shiki@1.2.1:
949 | resolution: {integrity: sha512-u+XW6o0vCkUNlneZb914dLO+AayEIwK5tI62WeS//R5HIXBFiYaj/Hc5xcq27Yh83Grr4JbNtUBV8W6zyK4hWg==}
950 | dependencies:
951 | '@shikijs/core': 1.2.1
952 | dev: true
953 |
954 | /source-map-js@1.2.0:
955 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
956 | engines: {node: '>=0.10.0'}
957 | dev: true
958 |
959 | /speakingurl@14.0.1:
960 | resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
961 | engines: {node: '>=0.10.0'}
962 | dev: true
963 |
964 | /tabbable@6.2.0:
965 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
966 | dev: true
967 |
968 | /to-fast-properties@2.0.0:
969 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
970 | engines: {node: '>=4'}
971 | dev: true
972 |
973 | /vite@5.2.7:
974 | resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==}
975 | engines: {node: ^18.0.0 || >=20.0.0}
976 | hasBin: true
977 | peerDependencies:
978 | '@types/node': ^18.0.0 || >=20.0.0
979 | less: '*'
980 | lightningcss: ^1.21.0
981 | sass: '*'
982 | stylus: '*'
983 | sugarss: '*'
984 | terser: ^5.4.0
985 | peerDependenciesMeta:
986 | '@types/node':
987 | optional: true
988 | less:
989 | optional: true
990 | lightningcss:
991 | optional: true
992 | sass:
993 | optional: true
994 | stylus:
995 | optional: true
996 | sugarss:
997 | optional: true
998 | terser:
999 | optional: true
1000 | dependencies:
1001 | esbuild: 0.20.2
1002 | postcss: 8.4.38
1003 | rollup: 4.13.2
1004 | optionalDependencies:
1005 | fsevents: 2.3.3
1006 | dev: true
1007 |
1008 | /vitepress@1.0.1(@algolia/client-search@4.23.2)(search-insights@2.13.0):
1009 | resolution: {integrity: sha512-eNr5pOBppYUUjEhv8S0S2t9Tv95LQ6mMeHj6ivaGwfHxpov70Vduuwl/QQMDRznKDSaP0WKV7a82Pb4JVOaqEw==}
1010 | hasBin: true
1011 | peerDependencies:
1012 | markdown-it-mathjax3: ^4
1013 | postcss: ^8
1014 | peerDependenciesMeta:
1015 | markdown-it-mathjax3:
1016 | optional: true
1017 | postcss:
1018 | optional: true
1019 | dependencies:
1020 | '@docsearch/css': 3.6.0
1021 | '@docsearch/js': 3.6.0(@algolia/client-search@4.23.2)(search-insights@2.13.0)
1022 | '@shikijs/core': 1.2.1
1023 | '@shikijs/transformers': 1.2.1
1024 | '@types/markdown-it': 13.0.7
1025 | '@vitejs/plugin-vue': 5.0.4(vite@5.2.7)(vue@3.4.21)
1026 | '@vue/devtools-api': 7.0.25(vue@3.4.21)
1027 | '@vueuse/core': 10.9.0(vue@3.4.21)
1028 | '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.21)
1029 | focus-trap: 7.5.4
1030 | mark.js: 8.11.1
1031 | minisearch: 6.3.0
1032 | shiki: 1.2.1
1033 | vite: 5.2.7
1034 | vue: 3.4.21
1035 | transitivePeerDependencies:
1036 | - '@algolia/client-search'
1037 | - '@types/node'
1038 | - '@types/react'
1039 | - '@vue/composition-api'
1040 | - async-validator
1041 | - axios
1042 | - change-case
1043 | - drauu
1044 | - fuse.js
1045 | - idb-keyval
1046 | - jwt-decode
1047 | - less
1048 | - lightningcss
1049 | - nprogress
1050 | - qrcode
1051 | - react
1052 | - react-dom
1053 | - sass
1054 | - search-insights
1055 | - sortablejs
1056 | - stylus
1057 | - sugarss
1058 | - terser
1059 | - typescript
1060 | - universal-cookie
1061 | dev: true
1062 |
1063 | /vue-demi@0.14.7(vue@3.4.21):
1064 | resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==}
1065 | engines: {node: '>=12'}
1066 | hasBin: true
1067 | requiresBuild: true
1068 | peerDependencies:
1069 | '@vue/composition-api': ^1.0.0-rc.1
1070 | vue: ^3.0.0-0 || ^2.6.0
1071 | peerDependenciesMeta:
1072 | '@vue/composition-api':
1073 | optional: true
1074 | dependencies:
1075 | vue: 3.4.21
1076 | dev: true
1077 |
1078 | /vue@3.4.21:
1079 | resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==}
1080 | peerDependencies:
1081 | typescript: '*'
1082 | peerDependenciesMeta:
1083 | typescript:
1084 | optional: true
1085 | dependencies:
1086 | '@vue/compiler-dom': 3.4.21
1087 | '@vue/compiler-sfc': 3.4.21
1088 | '@vue/runtime-dom': 3.4.21
1089 | '@vue/server-renderer': 3.4.21(vue@3.4.21)
1090 | '@vue/shared': 3.4.21
1091 | dev: true
1092 |
--------------------------------------------------------------------------------
/public/assets/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/example.png
--------------------------------------------------------------------------------
/public/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/logo.png
--------------------------------------------------------------------------------
/public/assets/qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/qrcode.png
--------------------------------------------------------------------------------
/public/assets/result1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/result1.png
--------------------------------------------------------------------------------
/public/assets/result2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/result2.png
--------------------------------------------------------------------------------
/public/assets/screencast/demo.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/screencast/demo.mp4
--------------------------------------------------------------------------------
/public/assets/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/public/assets/screenshot.png
--------------------------------------------------------------------------------
/purchase.md:
--------------------------------------------------------------------------------
1 | # Purchase
2 |
3 | You can use this plugin to move blocks in Logseq easily and efficiently.
4 |
5 | You can use most of the features for free. But for better maintenance, I decided to set a fee for a few of the features.
6 |
7 | After purchasing, I will send you an email with the license key. The key will expire in 48 hours.
8 |
9 | The license can be activated on as many devices as you want within 48 hours. Do not clean the Logseq cache because it will lose the activation. No time limitation exists only if your activation exists.
10 |
11 | For users out of China Mainland, you can purchase the the plugin here:
12 |
13 |
16 |
17 |
28 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vipzhicheng/logseq-plugin-move-block/b24c8cb396028ab8c3e34615b635d7012ff5e171/screenshot.png
--------------------------------------------------------------------------------