texlite 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/DESIGN.md +7 -4
  2. package/NPM_TESTING.md +8 -2
  3. package/OPERATIONS.md +21 -6
  4. package/README.md +42 -15
  5. package/README.zh-CN.md +39 -15
  6. package/dist/client/assets/{GitDialog-DdLrbz_H.js → GitDialog-ULwrGkKd.js} +1 -1
  7. package/dist/client/assets/{HistoryDialog-AlF9iozX.js → HistoryDialog-BE7jyWWP.js} +3 -3
  8. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  9. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  10. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  11. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  12. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  13. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  14. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  15. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  16. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  17. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  18. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  19. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  20. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  21. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  22. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  23. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  24. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  25. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  26. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  27. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  28. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  29. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  30. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  31. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  32. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  33. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  34. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  35. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  36. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  37. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  38. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  39. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  40. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  44. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  45. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  46. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  47. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  48. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  49. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  50. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  51. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  52. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  53. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  54. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  55. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  56. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  57. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  58. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  59. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  60. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  61. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  62. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  63. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  64. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  65. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  66. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  67. package/dist/client/assets/LatexEditor-DbU8fMFZ.js +65 -0
  68. package/dist/client/assets/{PdfPreview-CanYnyfJ.js → PdfPreview-BputjYeR.js} +1 -1
  69. package/dist/client/assets/{ProjectNavigationDialogs-DiXtkTj1.js → ProjectNavigationDialogs-BVE1JsHd.js} +1 -1
  70. package/dist/client/assets/{SystemMetricsDialog-DimBI7er.js → SystemMetricsDialog-DxQsGcIH.js} +1 -1
  71. package/dist/client/assets/{editor-DMLs-XWi.js → editor-CiK7TK0p.js} +13 -13
  72. package/dist/client/assets/index-Dx9UqMyC.js +64 -0
  73. package/dist/client/assets/index-DzzqNm9b.css +1 -0
  74. package/dist/client/assets/katex-CEK31ho9.css +1 -0
  75. package/dist/client/assets/katex-COYOr4nK.js +257 -0
  76. package/dist/client/assets/{minus-DR-ttrx3.js → minus-B08vgSQJ.js} +1 -1
  77. package/dist/client/assets/{spellCheck-Wn7_eF9j.js → spellCheck-9fdyhJtV.js} +1 -1
  78. package/dist/client/index.html +2 -2
  79. package/dist/server/app.js +5 -0
  80. package/dist/server/cli.js +170 -32
  81. package/dist/server/db.js +4 -0
  82. package/dist/server/environment.js +168 -38
  83. package/dist/server/i18n.js +12 -0
  84. package/dist/server/lucideIcons.js +46 -0
  85. package/dist/server/projectIcons.js +96 -0
  86. package/dist/server/routes/projectShared.js +1 -0
  87. package/dist/server/routes/projects.js +114 -7
  88. package/dist/server/routes/wordCount.js +83 -0
  89. package/dist/server/texcount.js +244 -0
  90. package/package.json +4 -2
  91. package/preview-1.png +0 -0
  92. package/preview-2.png +0 -0
  93. package/dist/client/assets/LatexEditor-DH9v1wgS.js +0 -59
  94. package/dist/client/assets/index-CdiutUgf.css +0 -1
  95. package/dist/client/assets/index-vpWlpUOr.js +0 -64
  96. package/preview.png +0 -0
package/DESIGN.md CHANGED
@@ -107,10 +107,13 @@ listener. Validation covers paths, limits, engines, timeout/queue settings,
107
107
  URLs, and cross-field constraints such as the default engine being present in
108
108
  the allowed-engine list.
109
109
 
110
- Startup and `doctor` check `latexmk` and every configured LaTeX engine. Git is
111
- optional: a host without Git can run the editor and compiler, while Git is
112
- checked on demand when an owner opens or uses Git integration (or explicitly
113
- with `texlite doctor --git`). Formatting is also optional: the browser loads
110
+ Startup checks Node.js, `latexmk`, and every configured LaTeX engine.
111
+ `texlite requirements` performs a configuration-free preflight over the
112
+ default host commands, requiring Node.js, `latexmk`, and at least one supported
113
+ LaTeX engine. `texlite doctor` also reports optional host tools in a
114
+ requirement/status/version table: Git, TeXcount, bibliography/index tools,
115
+ Harper CLI, and `harper-ls`. A host without Git can run the editor and compiler;
116
+ Git is checked on demand when an owner opens or uses Git integration. Formatting is also optional: the browser loads
114
117
  the bundled npm `tex-fmt` WASM module and `bibtex-tidy` only when formatting is
115
118
  requested. TexLite never installs or updates TeX packages.
116
119
 
package/NPM_TESTING.md CHANGED
@@ -45,6 +45,8 @@ work after a version bump.
45
45
  Use temporary XDG directories and a non-interactive administrator account:
46
46
 
47
47
  ~~~bash
48
+ "$TEST_ROOT/prefix/bin/texlite" requirements
49
+
48
50
  XDG_CONFIG_HOME="$TEST_ROOT/config" \
49
51
  XDG_DATA_HOME="$TEST_ROOT/data" \
50
52
  TEXLITE_SITE_NAME='TexLite Package Test' \
@@ -64,8 +66,12 @@ XDG_DATA_HOME="$TEST_ROOT/data" \
64
66
  ~~~
65
67
 
66
68
  The `config` output should show the temporary configuration and data paths.
67
- `doctor` verifies the configuration, database, administrator, and host LaTeX
68
- commands. Git is optional; add `--git` when Git integration should be checked.
69
+ `requirements` is safe before initialization: it checks only default host
70
+ commands on `PATH` and does not read the temporary configuration or data.
71
+ `doctor` verifies the configuration, database, administrator, and required
72
+ host software in a table. It also reports optional Git, TeXcount,
73
+ bibliography/index, and Harper tools without treating their absence as a
74
+ failure to start TexLite.
69
75
 
70
76
  To verify the configurable data directory explicitly:
71
77
 
package/OPERATIONS.md CHANGED
@@ -15,18 +15,32 @@ For the product's intended use and editor comparison, start with the
15
15
  Check a host before initialization:
16
16
 
17
17
  ~~~bash
18
+ texlite requirements
19
+
20
+ # Equivalent individual checks:
18
21
  node --version
19
22
  npm --version
20
23
  latexmk --version
21
24
  xelatex --version
22
- # Optional, for Git/GitHub integration:
25
+ # Optional tools:
23
26
  git --version
27
+ texcount -version
28
+ harper-cli --version
29
+ harper-ls --version
24
30
  ~~~
25
31
 
26
- `texlite init`, `texlite start`, and `texlite doctor` validate `latexmk` and
27
- every engine named in `latex.allowedEngines`. Git is intentionally excluded
28
- from the core check, so a host without Git can run TexLite normally; use
29
- `texlite doctor --git` to check it explicitly.
32
+ `texlite init` and `texlite start` validate Node.js, `latexmk`, and every
33
+ engine named in `latex.allowedEngines`. `texlite requirements` can be run
34
+ before initialization: it checks only the default commands on `PATH`, without
35
+ reading a configuration file or any TexLite data. It requires Node.js and
36
+ `latexmk`, and requires at least one of the three supported LaTeX engines.
37
+ `texlite doctor` presents the configured deployment checks and optional host
38
+ tools in a table with their requirement level, installation state, and
39
+ detected version. Missing optional tools never stop the editor:
40
+ Git enables GitHub backup, TeXcount enables document statistics, and
41
+ `harper-cli` enables spelling and grammar diagnostics. `harper-ls` is shown
42
+ for host diagnosis and external editor integrations; TexLite itself invokes
43
+ `harper-cli`.
30
44
 
31
45
  Formatting does not require a host binary. The browser uses bundled `tex-fmt`
32
46
  WASM for `.tex`, `.cls`, and `.sty`, and browser-side `bibtex-tidy` for `.bib`.
@@ -119,7 +133,8 @@ Avoid putting a password into shell history on a shared host.
119
133
  | `texlite start` / `stop` / `restart` | Manage the bundled-PM2 service. |
120
134
  | `texlite status` | Show a colored, systemctl-style status view; add `--json` for scripts. |
121
135
  | `texlite logs` | Stream PM2-managed logs. |
122
- | `texlite doctor` | Validate configuration, paths, LaTeX, and administrator state; add `--git` for optional Git. |
136
+ | `texlite requirements` | Check default host commands on `PATH` without loading TexLite configuration or data. |
137
+ | `texlite doctor` | Show configuration/application checks and a table of required and optional host software. Add `--json` for scripts. |
123
138
  | `texlite config` | Print effective configuration and paths without changing them. |
124
139
 
125
140
  `start`, `stop`, `restart`, `status`, and `logs` use the PM2 runtime bundled
package/README.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # TexLite
2
2
 
3
- A lightweight self-hosted alternative to Overleaf for *small, trusted* research
3
+ A lightweight self-hosted alternative to Overleaf for _small, trusted_ research
4
4
  teams. Use your existing LaTeX distribution, with no heavyweight service stack.
5
5
 
6
6
  [![CI](https://github.com/SWUFE-DB-Group/TexLite/actions/workflows/ci.yml/badge.svg)](https://github.com/SWUFE-DB-Group/TexLite/actions/workflows/ci.yml)
7
7
  [![npm version](https://img.shields.io/npm/v/texlite?logo=npm&label=npm)](https://www.npmjs.com/package/texlite)
8
+ [![Docker Hub](https://img.shields.io/docker/v/zhongpu/texlite?logo=docker&label=Docker%20Hub)](https://hub.docker.com/r/zhongpu/texlite)
8
9
 
9
10
  **Documentation:** English (this file) · [Operations](OPERATIONS.md) · [Design](DESIGN.md) · [简体中文](README.zh-CN.md)
10
11
 
11
12
  **Website:** [TexLite GitHub Pages](https://swufe-db-group.github.io/TexLite/)
12
13
 
13
- ![TexLite preview](preview.png)
14
+ ![TexLite workspace](preview-1.png)
15
+ ![TexLite project view](preview-2.png)
14
16
 
15
17
  ## Why TexLite
16
18
 
@@ -29,9 +31,8 @@ a narrower self-hosted use case:
29
31
  - A shared hosted service can queue, slow down, or time out at usage peaks.
30
32
  - Overleaf's open-source [Community Edition](https://github.com/overleaf/overleaf)
31
33
  follows a more involved [Docker deployment path](https://docs.overleaf.com/on-premises/getting-started/what-is-the-overleaf-toolkit), and
32
- [source comments are a Server Pro feature](https://docs.overleaf.com/on-premises/user-and-project-management/roles-and-permissions).
33
- - TexLite uses the server's existing TeX environment, runs as a small
34
- single-host stack, and includes real-time source comments and replies.
34
+ several functionalities, such as source comments, are [Server Pro features](https://docs.overleaf.com/on-premises/user-and-project-management/roles-and-permissions).
35
+ _If you do not mind a heftier Docker image, [we have one ready too](#docker-deployment) :)_
35
36
 
36
37
  Self-hosting does not make every document compile faster: that still depends on
37
38
  the host and the document. It does give the team control over capacity, TeX
@@ -64,36 +65,62 @@ Install Node.js 24 or newer, `latexmk`, and at least one TeX engine such as
64
65
  `pdflatex`, `xelatex`, or `lualatex`. Git is needed only for the optional
65
66
  Git/GitHub integration.
66
67
 
67
- ~~~bash
68
+ After installation, `texlite requirements` checks the relevant host software
69
+ and versions before initialization.
70
+
71
+ ```bash
68
72
  npm install --global texlite
73
+ texlite requirements
69
74
  texlite init
70
75
  texlite start
71
76
  texlite status
72
- ~~~
77
+ ```
73
78
 
74
79
  Open <http://127.0.0.1:3000>. `texlite init` creates the configuration and the
75
80
  first administrator; public registration is deliberately unavailable.
76
81
 
77
82
  For upgrades and routine management:
78
83
 
79
- ~~~bash
84
+ ```bash
80
85
  npm update --global texlite
81
86
  texlite restart
82
87
  texlite logs
83
- ~~~
88
+ ```
84
89
 
85
90
  `texlite serve` runs in the foreground for debugging, Docker, or systemd.
86
91
  `start`, `stop`, `restart`, `status`, and `logs` use the PM2 runtime bundled
87
92
  with the npm package. Run `texlite help` for the complete command list.
88
93
 
94
+ <a id="docker-deployment"></a>
95
+
96
+ ### Docker deployment
97
+
98
+ If the host does not have—or you do not want to maintain—Node.js, TeX Live,
99
+ Git, and Harper locally, use the heavier
100
+ [TexLite-Docker](https://github.com/SWUFE-DB-Group/TexLite-Docker) deployment.
101
+ Its published image bundles those runtime dependencies for you.
102
+
103
+ ```bash
104
+ git clone https://github.com/SWUFE-DB-Group/TexLite-Docker.git
105
+ cd texlite-docker
106
+ cp deployment.example.json deployment.json
107
+ # Edit deployment.json before the first start.
108
+ ./scripts/compose.sh pull
109
+ ./scripts/compose.sh up -d
110
+ # Open <http://127.0.0.1:3040>
111
+ ```
112
+
113
+ See the [TexLite-Docker README](https://github.com/SWUFE-DB-Group/TexLite-Docker#readme)
114
+ for its user-facing configuration and operations guide.
115
+
89
116
  ## Documentation map
90
117
 
91
- | Need | Read |
92
- | --- | --- |
93
- | Installation, configuration paths, effective defaults, environment overrides, service management, backups, and security boundaries | [Operations guide](OPERATIONS.md) |
94
- | Collaboration, source persistence, compilation isolation, history, and design trade-offs | [Design](DESIGN.md) |
95
- | Testing an npm package before publication | [NPM testing guide](NPM_TESTING.md) |
96
- | Complete configuration starting point | [texlite.config.example.json](texlite.config.example.json) |
118
+ | Need | Read |
119
+ | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
120
+ | Installation, configuration paths, effective defaults, environment overrides, service management, backups, and security boundaries | [Operations guide](OPERATIONS.md) |
121
+ | Collaboration, source persistence, compilation isolation, history, and design trade-offs | [Design](DESIGN.md) |
122
+ | Testing an npm package before publication | [NPM testing guide](NPM_TESTING.md) |
123
+ | Complete configuration starting point | [texlite.config.example.json](texlite.config.example.json) |
97
124
 
98
125
  ## Scope and security
99
126
 
package/README.zh-CN.md CHANGED
@@ -5,12 +5,14 @@
5
5
 
6
6
  [![CI](https://github.com/SWUFE-DB-Group/TexLite/actions/workflows/ci.yml/badge.svg)](https://github.com/SWUFE-DB-Group/TexLite/actions/workflows/ci.yml)
7
7
  [![npm version](https://img.shields.io/npm/v/texlite?logo=npm&label=npm)](https://www.npmjs.com/package/texlite)
8
+ [![Docker Hub](https://img.shields.io/docker/v/zhongpu/texlite?logo=docker&label=Docker%20Hub)](https://hub.docker.com/r/zhongpu/texlite)
8
9
 
9
10
  **文档:** [English](README.md) · [运维指南(英文)](OPERATIONS.md) · [设计文档(英文)](DESIGN.md) · 简体中文(当前文件)
10
11
 
11
12
  **网站:** [TexLite GitHub Pages](https://swufe-db-group.github.io/TexLite/)
12
13
 
13
- ![TexLite 预览](preview.png)
14
+ ![TexLite 工作区](preview-1.png)
15
+ ![TexLite 项目视图](preview-2.png)
14
16
 
15
17
  ## 为什么选择 TexLite
16
18
 
@@ -26,10 +28,8 @@
26
28
 
27
29
  - 共享托管服务在使用高峰期可能排队、变慢或出现编译超时。
28
30
  - Overleaf 开源 [Community Edition](https://github.com/overleaf/overleaf) 的
29
- [Docker 部署路径](https://docs.overleaf.com/on-premises/getting-started/what-is-the-overleaf-toolkit) 更复杂,且
30
- [源码批注仅限 Server Pro](https://docs.overleaf.com/on-premises/user-and-project-management/roles-and-permissions)。
31
- - TexLite 直接使用服务器已有的 TeX 环境,以较小的单机栈运行,同时提供实时源码批注
32
- 与回复。
31
+ [Docker 部署路径](https://docs.overleaf.com/on-premises/getting-started/what-is-the-overleaf-toolkit) 更复杂,且源码批注等高级功能 [仅限 Server Pro](https://docs.overleaf.com/on-premises/user-and-project-management/roles-and-permissions)。
32
+ *如果不介意一个更庞大的 Docker 镜像,[我们也准备好了](#docker-deployment) :)*
33
33
 
34
34
  自托管并不保证每份文档都编译得更快,速度仍取决于宿主机和文档本身;它带来的是对容量、
35
35
  TeX 更新、数据位置与协作工作流的掌控。
@@ -55,36 +55,60 @@ TeX 更新、数据位置与协作工作流的掌控。
55
55
  安装 Node.js 24 或更高版本、`latexmk`,以及至少一个 TeX 引擎,例如 `pdflatex`、
56
56
  `xelatex` 或 `lualatex`。只有使用可选 Git/GitHub 集成时才需要 Git。
57
57
 
58
- ~~~bash
58
+ 安装后可先执行 `texlite requirements`,检查相关宿主机软件及版本。
59
+
60
+ ```bash
59
61
  npm install --global texlite
62
+ texlite requirements
60
63
  texlite init
61
64
  texlite start
62
65
  texlite status
63
- ~~~
66
+ ```
64
67
 
65
68
  访问 <http://127.0.0.1:3000>。`texlite init` 会创建配置并建立第一个管理员;TexLite
66
69
  不开放公众注册。
67
70
 
68
71
  升级与日常管理:
69
72
 
70
- ~~~bash
73
+ ```bash
71
74
  npm update --global texlite
72
75
  texlite restart
73
76
  texlite logs
74
- ~~~
77
+ ```
75
78
 
76
79
  `texlite serve` 会以前台方式运行,适合调试、Docker 或 systemd。`start`、`stop`、
77
80
  `restart`、`status`、`logs` 使用 npm 包内置的 PM2 运行时;完整命令请执行
78
81
  `texlite help`。
79
82
 
83
+ <a id="docker-deployment"></a>
84
+
85
+ ### Docker 部署
86
+
87
+ 如果宿主机没有,或不希望自行维护 Node.js、TeX Live、Git 和 Harper 等软件,可使用更重的
88
+ [TexLite-Docker](https://github.com/SWUFE-DB-Group/TexLite-Docker) 部署。其已发布镜像会
89
+ 一并提供这些运行时依赖。
90
+
91
+ ```bash
92
+ git clone https://github.com/SWUFE-DB-Group/TexLite-Docker.git
93
+ cd texlite-docker
94
+ cp deployment.example.json deployment.json
95
+ # 首次启动前请编辑 deployment.json。
96
+ ./scripts/compose.sh pull
97
+ ./scripts/compose.sh up -d
98
+ # 访问 <http://127.0.0.1:3040>
99
+ ```
100
+
101
+ Docker 版的用户配置和日常运维请参见
102
+ [TexLite-Docker README](https://github.com/SWUFE-DB-Group/TexLite-Docker#readme)。
103
+
80
104
  ## 文档导航
81
105
 
82
- | 需要了解 | 阅读 |
83
- | --- | --- |
84
- | 安装、配置路径、生效默认值、环境变量、服务管理、备份与安全边界 | [运维指南(英文)](OPERATIONS.md) |
85
- | 协作、源码持久化、编译隔离、历史版本和设计权衡 | [设计文档(英文)](DESIGN.md) |
86
- | 发布前测试 npm 包 | [NPM 测试指南(英文)](NPM_TESTING.md) |
87
- | 完整配置起点 | [texlite.config.example.json](texlite.config.example.json) |
106
+ | 需要了解 | 阅读 |
107
+ | -------------------------------------------------------------- | ---------------------------------------------------------- |
108
+ | 安装、配置路径、生效默认值、环境变量、服务管理、备份与安全边界 | [运维指南(英文)](OPERATIONS.md) |
109
+ | 协作、源码持久化、编译隔离、历史版本和设计权衡 | [设计文档(英文)](DESIGN.md) |
110
+ | 发布前测试 npm 包 | [NPM 测试指南(英文)](NPM_TESTING.md) |
111
+ | 完整配置起点 | [texlite.config.example.json](texlite.config.example.json) |
88
112
 
89
113
  ## 范围与安全
90
114
 
@@ -1,3 +1,3 @@
1
- import{u as ye,r as n,j as e}from"./react-BoEjKzFZ.js";import{j as u,M as H,L as p,G as q,K as ke,C as ie,k as ne,T as be,l as ve,P as Ce,a as l}from"./index-vpWlpUOr.js";import{M as Ne,a as we}from"./minus-DR-ttrx3.js";const ze=u("CloudUpload",[["path",{d:"M12 13v8",key:"1l5pq0"}],["path",{d:"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242",key:"1pljnt"}],["path",{d:"m8 17 4-4 4 4",key:"1quai1"}]]);const ae=u("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);const G=u("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);const oe=u("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);const W=u("Github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);const Se=u("Minimize2",[["polyline",{points:"4 14 10 14 10 20",key:"11kfnr"}],["polyline",{points:"20 10 14 10 14 4",key:"rlmsce"}],["line",{x1:"14",x2:"21",y1:"10",y2:"3",key:"o5lafz"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);const Ee=u("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]);const Te=u("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);function $e({open:h,project:o,onOpenChange:y,onBeforeMutation:r}){const{t:s,i18n:E}=ye(),[i,m]=n.useState(null),[J,K]=n.useState([]),[T,k]=n.useState(""),[F,V]=n.useState(()=>re(o.name)),[_,ce]=n.useState(!0),[D,Z]=n.useState(""),[b,M]=n.useState(null),[f,j]=n.useState(null),[U,$]=n.useState(!1),[le,v]=n.useState(!1),[R,L]=n.useState(!0),[P,A]=n.useState(!0),[a,C]=n.useState(""),[Q,N]=n.useState(""),[X,B]=n.useState(""),[g,x]=n.useState(!1),[w,Y]=n.useState(10),O=n.useRef(null),z=async(t=!1)=>{const c=await l(`/api/projects/${o.id}/git`);if(m(c.status),t&&(L(!c.status.tokenConfigured),A(!c.status.remoteUrl)),c.status.initialized&&c.status.latestCommit){const S=await l(`/api/projects/${o.id}/git/history`);K(S.commits)}else K([])};n.useEffect(()=>{if(!h){document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),x(!1),k("");return}N(""),B(""),M(null),x(!1),V(re(o.name)),C("load"),r().then(()=>z(!0)).catch(t=>N(t instanceof Error?t.message:s("errors.generic"))).finally(()=>C(""))},[h,o.id]),n.useEffect(()=>{const t=()=>x(document.fullscreenElement===O.current);return document.addEventListener("fullscreenchange",t),()=>document.removeEventListener("fullscreenchange",t)},[]),n.useEffect(()=>{if(!g)return;const t=c=>{c.key==="Escape"&&!document.fullscreenElement&&x(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[g]);const d=async(t,c,S,ee)=>{C(t),N(""),B("");try{await c(),S&&B(S)}catch(se){const te=se instanceof Error?se.message:s("errors.generic");N(ee?`${ee}: ${te}`:te)}finally{C("")}},de=()=>d("token",async()=>{const t=await l(`/api/projects/${o.id}/git/token`,{method:"PUT",body:JSON.stringify({token:T})});m(t.status),k(""),L(!1)},s("git.tokenSaved")),he=()=>d("remove-token",async()=>{const t=await l(`/api/projects/${o.id}/git/token`,{method:"DELETE"});m(t.status),k("")},s("git.tokenRemoved")),ge=()=>d("repository",async()=>{const t=await l(`/api/projects/${o.id}/git/repository`,{method:"POST",body:JSON.stringify({name:F,private:_})});m(t.status),A(!1)},s("git.repositoryCreated")),ue=()=>d("commit",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const t=await l(`/api/projects/${o.id}/git/commit`,{method:"POST",body:JSON.stringify({message:D})});m(t.status),Z(""),M(null),await z()},s("git.committed")),me=()=>d("push",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const t=await l(`/api/projects/${o.id}/git/push`,{method:"POST"});m(t.status),await z()},s("git.pushed"),s("git.pushFailed")),I=t=>d("diff",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const c=t?`?revision=${encodeURIComponent(t)}`:"";M(await l(`/api/projects/${o.id}/git/diff${c}`))}),fe=async()=>{if(g){document.fullscreenElement&&await document.exitFullscreen().catch(()=>{}),x(!1);return}const t=O.current;if(t?.requestFullscreen)try{await t.requestFullscreen()}catch{}x(!0)},xe=()=>{const t=f;t&&(j(null),d("checkout",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));await l(`/api/projects/${o.id}/git/checkout`,{method:"POST",body:JSON.stringify({revision:t==="branch"?null:t.sha,force:U})}),window.location.reload()}))},pe=()=>{v(!1),d("discard",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));await l(`/api/projects/${o.id}/git/discard`,{method:"POST"}),window.location.reload()})},je=a==="load"&&!i;return e.jsxs(e.Fragment,{children:[e.jsx(H,{open:h,extraWide:!0,className:g?"git-dialog-modal-fullscreen":void 0,title:s("git.title"),description:s("git.description"),onOpenChange:y,footer:e.jsx("button",{onClick:()=>y(!1),children:s("common.close")}),children:e.jsxs("div",{className:"git-dialog",children:[je&&e.jsxs("div",{className:"git-loading",children:[e.jsx(p,{className:"spin",size:22}),s("common.loading")]}),Q&&e.jsx("p",{className:"git-message error",children:Q}),X&&e.jsxs("p",{className:"git-message success",children:[e.jsx(q,{size:14}),X]}),i&&e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"git-section",children:[e.jsxs("button",{className:"git-section-toggle",type:"button","aria-expanded":R,onClick:()=>L(t=>!t),children:[e.jsxs("span",{className:"git-section-heading",children:[e.jsx(ke,{size:16}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.authentication")}),e.jsx("small",{children:i.tokenConfigured?s("git.connectedAs",{login:i.githubLogin}):s("git.authenticationHint")})]})]}),R?e.jsx(ie,{size:16}):e.jsx(ne,{size:16})]}),R&&e.jsxs("div",{className:"git-section-content",children:[e.jsxs("div",{className:"git-token-guidance",children:[e.jsx("strong",{children:s("git.recommendedAccessTitle")}),e.jsx("span",{children:s("git.recommendedAccess")})]}),i.tokenConfigured&&e.jsxs("div",{className:"git-account",children:[e.jsx(W,{size:17}),e.jsx("span",{children:s("git.connectedAs",{login:i.githubLogin})}),e.jsxs("button",{className:"danger-text",disabled:!!a,onClick:he,children:[e.jsx(be,{size:14}),s("git.removeToken")]})]}),e.jsxs("label",{className:"form-field",children:[i.tokenConfigured?s("git.replaceToken"):s("git.token"),e.jsx("input",{type:"password",autoComplete:"new-password",spellCheck:!1,autoCapitalize:"none",autoCorrect:"off",value:T,placeholder:s("git.tokenPlaceholder"),onChange:t=>k(t.target.value)})]}),e.jsxs("div",{className:"git-inline-actions",children:[e.jsxs("a",{href:"https://github.com/settings/personal-access-tokens/new",target:"_blank",rel:"noreferrer",children:[s("git.createToken"),e.jsx(ae,{size:12})]}),e.jsxs("button",{disabled:!!a||T.trim().length<20,onClick:de,children:[a==="token"&&e.jsx(p,{className:"spin",size:13}),s("git.saveToken")]})]})]})]}),e.jsxs("section",{className:"git-section",children:[e.jsxs("button",{className:"git-section-toggle",type:"button","aria-expanded":P,onClick:()=>A(t=>!t),children:[e.jsxs("span",{className:"git-section-heading",children:[e.jsx(W,{size:16}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.repository")}),e.jsx("small",{children:i.remoteUrl?i.repositoryName??i.remoteUrl:i.initialized?s("git.localReady"):s("git.localPending")})]})]}),P?e.jsx(ie,{size:16}):e.jsx(ne,{size:16})]}),P&&e.jsx("div",{className:"git-section-content",children:i.remoteUrl?e.jsxs("div",{className:"git-repository-card",children:[e.jsxs("div",{children:[e.jsx("strong",{children:i.repositoryName??s("git.origin")}),e.jsxs("small",{children:[i.branch??s("git.detachedAt",{revision:i.latestCommit?.shortSha??"HEAD"})," · ",i.dirty?s("git.changedFiles",{count:i.changedFiles}):s("git.clean")]})]}),i.repositoryHtmlUrl&&e.jsxs("a",{href:i.repositoryHtmlUrl,target:"_blank",rel:"noreferrer",children:[e.jsx(ae,{size:14}),s("git.openGitHub")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"form-field",children:[s("git.repositoryName"),e.jsx("input",{value:F,onChange:t=>V(t.target.value)})]}),e.jsxs("label",{className:"checkbox-field",children:[e.jsx("input",{type:"checkbox",checked:_,onChange:t=>ce(t.target.checked)}),s("git.privateRepository")]}),e.jsxs("button",{className:"git-primary-action",disabled:!!a||!i.tokenConfigured||!F.trim(),onClick:ge,children:[a==="repository"?e.jsx(p,{className:"spin",size:14}):e.jsx(W,{size:14}),s("git.createRepository")]})]})})]}),i.initialized&&e.jsxs("section",{className:"git-section",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(oe,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.commitAndPush")}),e.jsx("small",{children:i.branch?s("git.identity",{username:o.ownerUsername}):s("git.detachedHead")})]})]}),e.jsxs("label",{className:"form-field",children:[s("git.commitMessage"),e.jsx("textarea",{rows:3,value:D,placeholder:s("git.commitPlaceholder"),onChange:t=>Z(t.target.value)})]}),e.jsxs("div",{className:"git-action-row",children:[e.jsxs("button",{title:i.dirty?void 0:s("git.noChangesToCommit"),disabled:!!a||!i.branch||!i.dirty||!D.trim(),onClick:ue,children:[a==="commit"?e.jsx(p,{className:"spin",size:14}):e.jsx(oe,{size:14}),s("git.commit")]}),e.jsxs("button",{disabled:!!a||!i.branch||!i.tokenConfigured||!i.remoteUrl||!i.latestCommit,onClick:me,children:[a==="push"?e.jsx(p,{className:"spin",size:14}):e.jsx(ze,{size:14}),s("git.push"),i.ahead>0&&e.jsx("span",{className:"git-count",children:i.ahead})]}),e.jsxs("button",{disabled:!!a||!i.latestCommit,onClick:()=>{I()},children:[a==="diff"?e.jsx(p,{className:"spin",size:14}):e.jsx(G,{size:14}),s("git.workingDiff")]}),e.jsxs("button",{className:"git-discard-button",title:i.restorable?s("git.discardChanges"):s("git.noChangesToDiscard"),disabled:!!a||!i.latestCommit||!i.restorable,onClick:()=>v(!0),children:[e.jsx(ve,{size:14}),s("git.discardChanges")]}),!i.branch&&e.jsxs("button",{disabled:!!a,onClick:()=>{$(!1),j("branch")},children:[e.jsx(q,{size:14}),s("git.returnToBranch",{branch:i.defaultBranch})]}),e.jsxs("button",{disabled:!!a,onClick:()=>{d("refresh",z)},children:[e.jsx(Ee,{className:a==="refresh"?"spin":"",size:14}),s("git.refresh")]})]})]}),b&&e.jsxs("section",{ref:O,className:`git-section git-diff-section${g?" is-fullscreen":""}`,children:[e.jsxs("div",{className:"git-diff-heading",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(G,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.diffTitle")}),e.jsxs("small",{children:[b.title,b.truncated?` · ${s("git.diffTruncated")}`:""]})]})]}),e.jsxs("div",{className:"git-diff-controls",children:[e.jsxs("div",{className:"git-diff-font-controls",role:"group","aria-label":s("git.diffFontSize"),children:[e.jsx("button",{type:"button",className:"git-diff-font-button",disabled:w<=8,title:s("git.diffFontDecrease"),"aria-label":s("git.diffFontDecrease"),onClick:()=>Y(t=>Math.max(8,t-1)),children:e.jsx(Ne,{size:14})}),e.jsxs("span",{className:"git-diff-font-value","aria-live":"polite",children:[w,"px"]}),e.jsx("button",{type:"button",className:"git-diff-font-button",disabled:w>=24,title:s("git.diffFontIncrease"),"aria-label":s("git.diffFontIncrease"),onClick:()=>Y(t=>Math.min(24,t+1)),children:e.jsx(Ce,{size:14})})]}),e.jsx("button",{type:"button",className:"git-diff-fullscreen",title:s(g?"git.exitFullscreenDiff":"git.fullscreenDiff"),"aria-label":s(g?"git.exitFullscreenDiff":"git.fullscreenDiff"),onClick:()=>{fe()},children:g?e.jsx(Se,{size:15}):e.jsx(we,{size:15})})]})]}),e.jsx(Fe,{content:b.diff,empty:s("git.noChanges"),fontSize:w})]}),i.initialized&&e.jsxs("section",{className:"git-section",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(q,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.history")}),e.jsx("small",{children:s("git.historyHint")})]})]}),e.jsxs("div",{className:"git-history",children:[J.map(t=>e.jsxs("article",{children:[e.jsx("code",{children:t.shortSha}),e.jsxs("div",{children:[e.jsx("strong",{children:t.message}),e.jsxs("small",{children:[t.authorName," · ",new Date(t.authoredAt).toLocaleString(E.resolvedLanguage)]})]}),e.jsxs("span",{children:[e.jsx("button",{title:s("git.viewCommitDiff"),disabled:!!a,onClick:()=>{I(t.sha)},children:e.jsx(G,{size:14})}),e.jsx("button",{title:s("git.checkoutVersion"),disabled:!!a,onClick:()=>{$(!1),j(t)},children:e.jsx(Te,{size:14})})]})]},t.sha)),J.length===0&&e.jsx("p",{className:"muted",children:s("git.noCommits")})]})]})]})]})}),e.jsx(H,{open:!!f,title:s(f==="branch"?"git.returnTitle":"git.checkoutTitle"),description:f==="branch"?s("git.returnDescription",{branch:i?.defaultBranch??"main"}):s("git.checkoutDescription",{revision:f?.shortSha??"",message:f?.message??""}),onOpenChange:t=>{t||j(null)},footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>j(null),children:s("common.cancel")}),e.jsx("button",{className:U?"danger":"primary",onClick:xe,children:s("git.checkout")})]}),children:e.jsxs("label",{className:"git-force-checkout",children:[e.jsx("input",{type:"checkbox",checked:U,onChange:t=>$(t.target.checked)}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.forceCheckout")}),e.jsx("small",{children:s("git.forceCheckoutDescription")})]})]})}),e.jsx(H,{open:le,title:s("git.discardTitle"),description:s("git.discardDescription"),onOpenChange:v,footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>v(!1),children:s("common.cancel")}),e.jsx("button",{className:"danger",onClick:pe,children:s("git.discardConfirm")})]}),children:e.jsx(e.Fragment,{})})]})}function Fe({content:h,empty:o,fontSize:y}){return h.trim()?e.jsx("pre",{className:"git-diff",style:{fontSize:`${y}px`},children:h.split(`
1
+ import{u as ye,r as n,j as e}from"./react-BoEjKzFZ.js";import{j as u,M as H,L as p,G as q,K as ke,C as ie,k as ne,T as be,l as ve,P as Ce,a as l}from"./index-Dx9UqMyC.js";import{M as Ne,a as we}from"./minus-B08vgSQJ.js";const ze=u("CloudUpload",[["path",{d:"M12 13v8",key:"1l5pq0"}],["path",{d:"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242",key:"1pljnt"}],["path",{d:"m8 17 4-4 4 4",key:"1quai1"}]]);const ae=u("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);const G=u("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);const oe=u("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);const W=u("Github",[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4",key:"tonef"}],["path",{d:"M9 18c-4.51 2-5-2-7-2",key:"9comsn"}]]);const Se=u("Minimize2",[["polyline",{points:"4 14 10 14 10 20",key:"11kfnr"}],["polyline",{points:"20 10 14 10 14 4",key:"rlmsce"}],["line",{x1:"14",x2:"21",y1:"10",y2:"3",key:"o5lafz"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);const Ee=u("RefreshCcw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]);const Te=u("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);function $e({open:h,project:o,onOpenChange:y,onBeforeMutation:r}){const{t:s,i18n:E}=ye(),[i,m]=n.useState(null),[J,K]=n.useState([]),[T,k]=n.useState(""),[F,V]=n.useState(()=>re(o.name)),[_,ce]=n.useState(!0),[D,Z]=n.useState(""),[b,M]=n.useState(null),[f,j]=n.useState(null),[U,$]=n.useState(!1),[le,v]=n.useState(!1),[R,L]=n.useState(!0),[P,A]=n.useState(!0),[a,C]=n.useState(""),[Q,N]=n.useState(""),[X,B]=n.useState(""),[g,x]=n.useState(!1),[w,Y]=n.useState(10),O=n.useRef(null),z=async(t=!1)=>{const c=await l(`/api/projects/${o.id}/git`);if(m(c.status),t&&(L(!c.status.tokenConfigured),A(!c.status.remoteUrl)),c.status.initialized&&c.status.latestCommit){const S=await l(`/api/projects/${o.id}/git/history`);K(S.commits)}else K([])};n.useEffect(()=>{if(!h){document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),x(!1),k("");return}N(""),B(""),M(null),x(!1),V(re(o.name)),C("load"),r().then(()=>z(!0)).catch(t=>N(t instanceof Error?t.message:s("errors.generic"))).finally(()=>C(""))},[h,o.id]),n.useEffect(()=>{const t=()=>x(document.fullscreenElement===O.current);return document.addEventListener("fullscreenchange",t),()=>document.removeEventListener("fullscreenchange",t)},[]),n.useEffect(()=>{if(!g)return;const t=c=>{c.key==="Escape"&&!document.fullscreenElement&&x(!1)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[g]);const d=async(t,c,S,ee)=>{C(t),N(""),B("");try{await c(),S&&B(S)}catch(se){const te=se instanceof Error?se.message:s("errors.generic");N(ee?`${ee}: ${te}`:te)}finally{C("")}},de=()=>d("token",async()=>{const t=await l(`/api/projects/${o.id}/git/token`,{method:"PUT",body:JSON.stringify({token:T})});m(t.status),k(""),L(!1)},s("git.tokenSaved")),he=()=>d("remove-token",async()=>{const t=await l(`/api/projects/${o.id}/git/token`,{method:"DELETE"});m(t.status),k("")},s("git.tokenRemoved")),ge=()=>d("repository",async()=>{const t=await l(`/api/projects/${o.id}/git/repository`,{method:"POST",body:JSON.stringify({name:F,private:_})});m(t.status),A(!1)},s("git.repositoryCreated")),ue=()=>d("commit",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const t=await l(`/api/projects/${o.id}/git/commit`,{method:"POST",body:JSON.stringify({message:D})});m(t.status),Z(""),M(null),await z()},s("git.committed")),me=()=>d("push",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const t=await l(`/api/projects/${o.id}/git/push`,{method:"POST"});m(t.status),await z()},s("git.pushed"),s("git.pushFailed")),I=t=>d("diff",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));const c=t?`?revision=${encodeURIComponent(t)}`:"";M(await l(`/api/projects/${o.id}/git/diff${c}`))}),fe=async()=>{if(g){document.fullscreenElement&&await document.exitFullscreen().catch(()=>{}),x(!1);return}const t=O.current;if(t?.requestFullscreen)try{await t.requestFullscreen()}catch{}x(!0)},xe=()=>{const t=f;t&&(j(null),d("checkout",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));await l(`/api/projects/${o.id}/git/checkout`,{method:"POST",body:JSON.stringify({revision:t==="branch"?null:t.sha,force:U})}),window.location.reload()}))},pe=()=>{v(!1),d("discard",async()=>{if(!await r())throw new Error(s("errors.collaborationUnavailable"));await l(`/api/projects/${o.id}/git/discard`,{method:"POST"}),window.location.reload()})},je=a==="load"&&!i;return e.jsxs(e.Fragment,{children:[e.jsx(H,{open:h,extraWide:!0,className:g?"git-dialog-modal-fullscreen":void 0,title:s("git.title"),description:s("git.description"),onOpenChange:y,footer:e.jsx("button",{onClick:()=>y(!1),children:s("common.close")}),children:e.jsxs("div",{className:"git-dialog",children:[je&&e.jsxs("div",{className:"git-loading",children:[e.jsx(p,{className:"spin",size:22}),s("common.loading")]}),Q&&e.jsx("p",{className:"git-message error",children:Q}),X&&e.jsxs("p",{className:"git-message success",children:[e.jsx(q,{size:14}),X]}),i&&e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"git-section",children:[e.jsxs("button",{className:"git-section-toggle",type:"button","aria-expanded":R,onClick:()=>L(t=>!t),children:[e.jsxs("span",{className:"git-section-heading",children:[e.jsx(ke,{size:16}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.authentication")}),e.jsx("small",{children:i.tokenConfigured?s("git.connectedAs",{login:i.githubLogin}):s("git.authenticationHint")})]})]}),R?e.jsx(ie,{size:16}):e.jsx(ne,{size:16})]}),R&&e.jsxs("div",{className:"git-section-content",children:[e.jsxs("div",{className:"git-token-guidance",children:[e.jsx("strong",{children:s("git.recommendedAccessTitle")}),e.jsx("span",{children:s("git.recommendedAccess")})]}),i.tokenConfigured&&e.jsxs("div",{className:"git-account",children:[e.jsx(W,{size:17}),e.jsx("span",{children:s("git.connectedAs",{login:i.githubLogin})}),e.jsxs("button",{className:"danger-text",disabled:!!a,onClick:he,children:[e.jsx(be,{size:14}),s("git.removeToken")]})]}),e.jsxs("label",{className:"form-field",children:[i.tokenConfigured?s("git.replaceToken"):s("git.token"),e.jsx("input",{type:"password",autoComplete:"new-password",spellCheck:!1,autoCapitalize:"none",autoCorrect:"off",value:T,placeholder:s("git.tokenPlaceholder"),onChange:t=>k(t.target.value)})]}),e.jsxs("div",{className:"git-inline-actions",children:[e.jsxs("a",{href:"https://github.com/settings/personal-access-tokens/new",target:"_blank",rel:"noreferrer",children:[s("git.createToken"),e.jsx(ae,{size:12})]}),e.jsxs("button",{disabled:!!a||T.trim().length<20,onClick:de,children:[a==="token"&&e.jsx(p,{className:"spin",size:13}),s("git.saveToken")]})]})]})]}),e.jsxs("section",{className:"git-section",children:[e.jsxs("button",{className:"git-section-toggle",type:"button","aria-expanded":P,onClick:()=>A(t=>!t),children:[e.jsxs("span",{className:"git-section-heading",children:[e.jsx(W,{size:16}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.repository")}),e.jsx("small",{children:i.remoteUrl?i.repositoryName??i.remoteUrl:i.initialized?s("git.localReady"):s("git.localPending")})]})]}),P?e.jsx(ie,{size:16}):e.jsx(ne,{size:16})]}),P&&e.jsx("div",{className:"git-section-content",children:i.remoteUrl?e.jsxs("div",{className:"git-repository-card",children:[e.jsxs("div",{children:[e.jsx("strong",{children:i.repositoryName??s("git.origin")}),e.jsxs("small",{children:[i.branch??s("git.detachedAt",{revision:i.latestCommit?.shortSha??"HEAD"})," · ",i.dirty?s("git.changedFiles",{count:i.changedFiles}):s("git.clean")]})]}),i.repositoryHtmlUrl&&e.jsxs("a",{href:i.repositoryHtmlUrl,target:"_blank",rel:"noreferrer",children:[e.jsx(ae,{size:14}),s("git.openGitHub")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"form-field",children:[s("git.repositoryName"),e.jsx("input",{value:F,onChange:t=>V(t.target.value)})]}),e.jsxs("label",{className:"checkbox-field",children:[e.jsx("input",{type:"checkbox",checked:_,onChange:t=>ce(t.target.checked)}),s("git.privateRepository")]}),e.jsxs("button",{className:"git-primary-action",disabled:!!a||!i.tokenConfigured||!F.trim(),onClick:ge,children:[a==="repository"?e.jsx(p,{className:"spin",size:14}):e.jsx(W,{size:14}),s("git.createRepository")]})]})})]}),i.initialized&&e.jsxs("section",{className:"git-section",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(oe,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.commitAndPush")}),e.jsx("small",{children:i.branch?s("git.identity",{username:o.ownerUsername}):s("git.detachedHead")})]})]}),e.jsxs("label",{className:"form-field",children:[s("git.commitMessage"),e.jsx("textarea",{rows:3,value:D,placeholder:s("git.commitPlaceholder"),onChange:t=>Z(t.target.value)})]}),e.jsxs("div",{className:"git-action-row",children:[e.jsxs("button",{title:i.dirty?void 0:s("git.noChangesToCommit"),disabled:!!a||!i.branch||!i.dirty||!D.trim(),onClick:ue,children:[a==="commit"?e.jsx(p,{className:"spin",size:14}):e.jsx(oe,{size:14}),s("git.commit")]}),e.jsxs("button",{disabled:!!a||!i.branch||!i.tokenConfigured||!i.remoteUrl||!i.latestCommit,onClick:me,children:[a==="push"?e.jsx(p,{className:"spin",size:14}):e.jsx(ze,{size:14}),s("git.push"),i.ahead>0&&e.jsx("span",{className:"git-count",children:i.ahead})]}),e.jsxs("button",{disabled:!!a||!i.latestCommit,onClick:()=>{I()},children:[a==="diff"?e.jsx(p,{className:"spin",size:14}):e.jsx(G,{size:14}),s("git.workingDiff")]}),e.jsxs("button",{className:"git-discard-button",title:i.restorable?s("git.discardChanges"):s("git.noChangesToDiscard"),disabled:!!a||!i.latestCommit||!i.restorable,onClick:()=>v(!0),children:[e.jsx(ve,{size:14}),s("git.discardChanges")]}),!i.branch&&e.jsxs("button",{disabled:!!a,onClick:()=>{$(!1),j("branch")},children:[e.jsx(q,{size:14}),s("git.returnToBranch",{branch:i.defaultBranch})]}),e.jsxs("button",{disabled:!!a,onClick:()=>{d("refresh",z)},children:[e.jsx(Ee,{className:a==="refresh"?"spin":"",size:14}),s("git.refresh")]})]})]}),b&&e.jsxs("section",{ref:O,className:`git-section git-diff-section${g?" is-fullscreen":""}`,children:[e.jsxs("div",{className:"git-diff-heading",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(G,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.diffTitle")}),e.jsxs("small",{children:[b.title,b.truncated?` · ${s("git.diffTruncated")}`:""]})]})]}),e.jsxs("div",{className:"git-diff-controls",children:[e.jsxs("div",{className:"git-diff-font-controls",role:"group","aria-label":s("git.diffFontSize"),children:[e.jsx("button",{type:"button",className:"git-diff-font-button",disabled:w<=8,title:s("git.diffFontDecrease"),"aria-label":s("git.diffFontDecrease"),onClick:()=>Y(t=>Math.max(8,t-1)),children:e.jsx(Ne,{size:14})}),e.jsxs("span",{className:"git-diff-font-value","aria-live":"polite",children:[w,"px"]}),e.jsx("button",{type:"button",className:"git-diff-font-button",disabled:w>=24,title:s("git.diffFontIncrease"),"aria-label":s("git.diffFontIncrease"),onClick:()=>Y(t=>Math.min(24,t+1)),children:e.jsx(Ce,{size:14})})]}),e.jsx("button",{type:"button",className:"git-diff-fullscreen",title:s(g?"git.exitFullscreenDiff":"git.fullscreenDiff"),"aria-label":s(g?"git.exitFullscreenDiff":"git.fullscreenDiff"),onClick:()=>{fe()},children:g?e.jsx(Se,{size:15}):e.jsx(we,{size:15})})]})]}),e.jsx(Fe,{content:b.diff,empty:s("git.noChanges"),fontSize:w})]}),i.initialized&&e.jsxs("section",{className:"git-section",children:[e.jsxs("div",{className:"git-section-heading",children:[e.jsx(q,{size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:s("git.history")}),e.jsx("small",{children:s("git.historyHint")})]})]}),e.jsxs("div",{className:"git-history",children:[J.map(t=>e.jsxs("article",{children:[e.jsx("code",{children:t.shortSha}),e.jsxs("div",{children:[e.jsx("strong",{children:t.message}),e.jsxs("small",{children:[t.authorName," · ",new Date(t.authoredAt).toLocaleString(E.resolvedLanguage)]})]}),e.jsxs("span",{children:[e.jsx("button",{title:s("git.viewCommitDiff"),disabled:!!a,onClick:()=>{I(t.sha)},children:e.jsx(G,{size:14})}),e.jsx("button",{title:s("git.checkoutVersion"),disabled:!!a,onClick:()=>{$(!1),j(t)},children:e.jsx(Te,{size:14})})]})]},t.sha)),J.length===0&&e.jsx("p",{className:"muted",children:s("git.noCommits")})]})]})]})]})}),e.jsx(H,{open:!!f,title:s(f==="branch"?"git.returnTitle":"git.checkoutTitle"),description:f==="branch"?s("git.returnDescription",{branch:i?.defaultBranch??"main"}):s("git.checkoutDescription",{revision:f?.shortSha??"",message:f?.message??""}),onOpenChange:t=>{t||j(null)},footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>j(null),children:s("common.cancel")}),e.jsx("button",{className:U?"danger":"primary",onClick:xe,children:s("git.checkout")})]}),children:e.jsxs("label",{className:"git-force-checkout",children:[e.jsx("input",{type:"checkbox",checked:U,onChange:t=>$(t.target.checked)}),e.jsxs("span",{children:[e.jsx("strong",{children:s("git.forceCheckout")}),e.jsx("small",{children:s("git.forceCheckoutDescription")})]})]})}),e.jsx(H,{open:le,title:s("git.discardTitle"),description:s("git.discardDescription"),onOpenChange:v,footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>v(!1),children:s("common.cancel")}),e.jsx("button",{className:"danger",onClick:pe,children:s("git.discardConfirm")})]}),children:e.jsx(e.Fragment,{})})]})}function Fe({content:h,empty:o,fontSize:y}){return h.trim()?e.jsx("pre",{className:"git-diff",style:{fontSize:`${y}px`},children:h.split(`
2
2
  `).map((r,s)=>{const E=r.startsWith("+")&&!r.startsWith("+++")?"addition":r.startsWith("-")&&!r.startsWith("---")?"deletion":r.startsWith("@@")?"hunk":r.startsWith("diff ")?"header":"";return e.jsxs("span",{className:E,children:[r,`
3
3
  `]},s)})}):e.jsx("div",{className:"git-diff-empty",children:o})}function re(h){return h.trim().replace(/\s+/g,"-").replace(/[^A-Za-z0-9._-]/g,"-").replace(/-+/g,"-").replace(/^[.-]+|[.-]+$/g,"").slice(0,100)||"texlite-project"}export{$e as GitDialog};
@@ -1,5 +1,5 @@
1
- import{g as re,u as ne,r as I,j as u}from"./react-BoEjKzFZ.js";import{j as z,a as R,M as ie,L as O,T as J,l as Q,S as se,F as ae,n as G}from"./index-vpWlpUOr.js";const te=z("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);const V=z("FileClock",[["path",{d:"M16 22h2a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3",key:"37hlfg"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["circle",{cx:"8",cy:"16",r:"6",key:"10v15b"}],["path",{d:"M9.5 17.5 8 16.25V14",key:"1o80t2"}]]);const le=z("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);const he=z("Tag",[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]]);var H={exports:{}},K;function oe(){return K||(K=1,(function(C){var o=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},k=-1,A=1,f=0;o.Diff=function(e,r){return[e,r]},o.prototype.diff_main=function(e,r,n,s){typeof s>"u"&&(this.Diff_Timeout<=0?s=Number.MAX_VALUE:s=new Date().getTime()+this.Diff_Timeout*1e3);var a=s;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new o.Diff(f,e)]:[];typeof n>"u"&&(n=!0);var i=n,t=this.diff_commonPrefix(e,r),l=e.substring(0,t);e=e.substring(t),r=r.substring(t),t=this.diff_commonSuffix(e,r);var h=e.substring(e.length-t);e=e.substring(0,e.length-t),r=r.substring(0,r.length-t);var g=this.diff_compute_(e,r,i,a);return l&&g.unshift(new o.Diff(f,l)),h&&g.push(new o.Diff(f,h)),this.diff_cleanupMerge(g),g},o.prototype.diff_compute_=function(e,r,n,s){var a;if(!e)return[new o.Diff(A,r)];if(!r)return[new o.Diff(k,e)];var i=e.length>r.length?e:r,t=e.length>r.length?r:e,l=i.indexOf(t);if(l!=-1)return a=[new o.Diff(A,i.substring(0,l)),new o.Diff(f,t),new o.Diff(A,i.substring(l+t.length))],e.length>r.length&&(a[0][0]=a[2][0]=k),a;if(t.length==1)return[new o.Diff(k,e),new o.Diff(A,r)];var h=this.diff_halfMatch_(e,r);if(h){var g=h[0],c=h[1],v=h[2],m=h[3],b=h[4],p=this.diff_main(g,v,n,s),M=this.diff_main(c,m,n,s);return p.concat([new o.Diff(f,b)],M)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,s):this.diff_bisect_(e,r,s)},o.prototype.diff_lineMode_=function(e,r,n){var s=this.diff_linesToChars_(e,r);e=s.chars1,r=s.chars2;var a=s.lineArray,i=this.diff_main(e,r,!1,n);this.diff_charsToLines_(i,a),this.diff_cleanupSemantic(i),i.push(new o.Diff(f,""));for(var t=0,l=0,h=0,g="",c="";t<i.length;){switch(i[t][0]){case A:h++,c+=i[t][1];break;case k:l++,g+=i[t][1];break;case f:if(l>=1&&h>=1){i.splice(t-l-h,l+h),t=t-l-h;for(var v=this.diff_main(g,c,!1,n),m=v.length-1;m>=0;m--)i.splice(t,0,v[m]);t=t+v.length}h=0,l=0,g="",c="";break}t++}return i.pop(),i},o.prototype.diff_bisect_=function(e,r,n){for(var s=e.length,a=r.length,i=Math.ceil((s+a)/2),t=i,l=2*i,h=new Array(l),g=new Array(l),c=0;c<l;c++)h[c]=-1,g[c]=-1;h[t+1]=0,g[t+1]=0;for(var v=s-a,m=v%2!=0,b=0,p=0,M=0,E=0,_=0;_<i&&!(new Date().getTime()>n);_++){for(var S=-_+b;S<=_-p;S+=2){var D=t+S,w;S==-_||S!=_&&h[D-1]<h[D+1]?w=h[D+1]:w=h[D-1]+1;for(var N=w-S;w<s&&N<a&&e.charAt(w)==r.charAt(N);)w++,N++;if(h[D]=w,w>s)p+=2;else if(N>a)b+=2;else if(m){var j=t+v-S;if(j>=0&&j<l&&g[j]!=-1){var T=s-g[j];if(w>=T)return this.diff_bisectSplit_(e,r,w,N,n)}}}for(var P=-_+M;P<=_-E;P+=2){var j=t+P,T;P==-_||P!=_&&g[j-1]<g[j+1]?T=g[j+1]:T=g[j-1]+1;for(var B=T-P;T<s&&B<a&&e.charAt(s-T-1)==r.charAt(a-B-1);)T++,B++;if(g[j]=T,T>s)E+=2;else if(B>a)M+=2;else if(!m){var D=t+v-P;if(D>=0&&D<l&&h[D]!=-1){var w=h[D],N=t+w-D;if(T=s-T,w>=T)return this.diff_bisectSplit_(e,r,w,N,n)}}}}return[new o.Diff(k,e),new o.Diff(A,r)]},o.prototype.diff_bisectSplit_=function(e,r,n,s,a){var i=e.substring(0,n),t=r.substring(0,s),l=e.substring(n),h=r.substring(s),g=this.diff_main(i,t,!1,a),c=this.diff_main(l,h,!1,a);return g.concat(c)},o.prototype.diff_linesToChars_=function(e,r){var n=[],s={};n[0]="";function a(h){for(var g="",c=0,v=-1,m=n.length;v<h.length-1;){v=h.indexOf(`
2
- `,c),v==-1&&(v=h.length-1);var b=h.substring(c,v+1);(s.hasOwnProperty?s.hasOwnProperty(b):s[b]!==void 0)?g+=String.fromCharCode(s[b]):(m==i&&(b=h.substring(c),v=h.length),g+=String.fromCharCode(m),s[b]=m,n[m++]=b),c=v+1}return g}var i=4e4,t=a(e);i=65535;var l=a(r);return{chars1:t,chars2:l,lineArray:n}},o.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var s=e[n][1],a=[],i=0;i<s.length;i++)a[i]=r[s.charCodeAt(i)];e[n][1]=a.join("")}},o.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,s=Math.min(e.length,r.length),a=s,i=0;n<a;)e.substring(i,a)==r.substring(i,a)?(n=a,i=n):s=a,a=Math.floor((s-n)/2+n);return a},o.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,s=Math.min(e.length,r.length),a=s,i=0;n<a;)e.substring(e.length-a,e.length-i)==r.substring(r.length-a,r.length-i)?(n=a,i=n):s=a,a=Math.floor((s-n)/2+n);return a},o.prototype.diff_commonOverlap_=function(e,r){var n=e.length,s=r.length;if(n==0||s==0)return 0;n>s?e=e.substring(n-s):n<s&&(r=r.substring(0,n));var a=Math.min(n,s);if(e==r)return a;for(var i=0,t=1;;){var l=e.substring(a-t),h=r.indexOf(l);if(h==-1)return i;t+=h,(h==0||e.substring(a-t)==r.substring(0,t))&&(i=t,t++)}},o.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,s=e.length>r.length?r:e;if(n.length<4||s.length*2<n.length)return null;var a=this;function i(p,M,E){for(var _=p.substring(E,E+Math.floor(p.length/4)),S=-1,D="",w,N,j,T;(S=M.indexOf(_,S+1))!=-1;){var P=a.diff_commonPrefix(p.substring(E),M.substring(S)),B=a.diff_commonSuffix(p.substring(0,E),M.substring(0,S));D.length<B+P&&(D=M.substring(S-B,S)+M.substring(S,S+P),w=p.substring(0,E-B),N=p.substring(E+P),j=M.substring(0,S-B),T=M.substring(S+P))}return D.length*2>=p.length?[w,N,j,T,D]:null}var t=i(n,s,Math.ceil(n.length/4)),l=i(n,s,Math.ceil(n.length/2)),h;if(!t&&!l)return null;l?t?h=t[4].length>l[4].length?t:l:h=l:h=t;var g,c,v,m;e.length>r.length?(g=h[0],c=h[1],v=h[2],m=h[3]):(v=h[0],m=h[1],g=h[2],c=h[3]);var b=h[4];return[g,c,v,m,b]},o.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],s=0,a=null,i=0,t=0,l=0,h=0,g=0;i<e.length;)e[i][0]==f?(n[s++]=i,t=h,l=g,h=0,g=0,a=e[i][1]):(e[i][0]==A?h+=e[i][1].length:g+=e[i][1].length,a&&a.length<=Math.max(t,l)&&a.length<=Math.max(h,g)&&(e.splice(n[s-1],0,new o.Diff(k,a)),e[n[s-1]+1][0]=A,s--,s--,i=s>0?n[s-1]:-1,t=0,l=0,h=0,g=0,a=null,r=!0)),i++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),i=1;i<e.length;){if(e[i-1][0]==k&&e[i][0]==A){var c=e[i-1][1],v=e[i][1],m=this.diff_commonOverlap_(c,v),b=this.diff_commonOverlap_(v,c);m>=b?(m>=c.length/2||m>=v.length/2)&&(e.splice(i,0,new o.Diff(f,v.substring(0,m))),e[i-1][1]=c.substring(0,c.length-m),e[i+1][1]=v.substring(m),i++):(b>=c.length/2||b>=v.length/2)&&(e.splice(i,0,new o.Diff(f,c.substring(0,b))),e[i-1][0]=A,e[i-1][1]=v.substring(0,v.length-b),e[i+1][0]=k,e[i+1][1]=c.substring(b),i++),i++}i++}},o.prototype.diff_cleanupSemanticLossless=function(e){function r(b,p){if(!b||!p)return 6;var M=b.charAt(b.length-1),E=p.charAt(0),_=M.match(o.nonAlphaNumericRegex_),S=E.match(o.nonAlphaNumericRegex_),D=_&&M.match(o.whitespaceRegex_),w=S&&E.match(o.whitespaceRegex_),N=D&&M.match(o.linebreakRegex_),j=w&&E.match(o.linebreakRegex_),T=N&&b.match(o.blanklineEndRegex_),P=j&&p.match(o.blanklineStartRegex_);return T||P?5:N||j?4:_&&!D&&w?3:D||w?2:_||S?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==f&&e[n+1][0]==f){var s=e[n-1][1],a=e[n][1],i=e[n+1][1],t=this.diff_commonSuffix(s,a);if(t){var l=a.substring(a.length-t);s=s.substring(0,s.length-t),a=l+a.substring(0,a.length-t),i=l+i}for(var h=s,g=a,c=i,v=r(s,a)+r(a,i);a.charAt(0)===i.charAt(0);){s+=a.charAt(0),a=a.substring(1)+i.charAt(0),i=i.substring(1);var m=r(s,a)+r(a,i);m>=v&&(v=m,h=s,g=a,c=i)}e[n-1][1]!=h&&(h?e[n-1][1]=h:(e.splice(n-1,1),n--),e[n][1]=g,c?e[n+1][1]=c:(e.splice(n+1,1),n--))}n++}},o.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,o.whitespaceRegex_=/\s/,o.linebreakRegex_=/[\r\n]/,o.blanklineEndRegex_=/\n\r?\n$/,o.blanklineStartRegex_=/^\r?\n\r?\n/,o.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],s=0,a=null,i=0,t=!1,l=!1,h=!1,g=!1;i<e.length;)e[i][0]==f?(e[i][1].length<this.Diff_EditCost&&(h||g)?(n[s++]=i,t=h,l=g,a=e[i][1]):(s=0,a=null),h=g=!1):(e[i][0]==k?g=!0:h=!0,a&&(t&&l&&h&&g||a.length<this.Diff_EditCost/2&&t+l+h+g==3)&&(e.splice(n[s-1],0,new o.Diff(k,a)),e[n[s-1]+1][0]=A,s--,a=null,t&&l?(h=g=!0,s=0):(s--,i=s>0?n[s-1]:-1,h=g=!1),r=!0)),i++;r&&this.diff_cleanupMerge(e)},o.prototype.diff_cleanupMerge=function(e){e.push(new o.Diff(f,""));for(var r=0,n=0,s=0,a="",i="",t;r<e.length;)switch(e[r][0]){case A:s++,i+=e[r][1],r++;break;case k:n++,a+=e[r][1],r++;break;case f:n+s>1?(n!==0&&s!==0&&(t=this.diff_commonPrefix(i,a),t!==0&&(r-n-s>0&&e[r-n-s-1][0]==f?e[r-n-s-1][1]+=i.substring(0,t):(e.splice(0,0,new o.Diff(f,i.substring(0,t))),r++),i=i.substring(t),a=a.substring(t)),t=this.diff_commonSuffix(i,a),t!==0&&(e[r][1]=i.substring(i.length-t)+e[r][1],i=i.substring(0,i.length-t),a=a.substring(0,a.length-t))),r-=n+s,e.splice(r,n+s),a.length&&(e.splice(r,0,new o.Diff(k,a)),r++),i.length&&(e.splice(r,0,new o.Diff(A,i)),r++),r++):r!==0&&e[r-1][0]==f?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,s=0,n=0,a="",i="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==f&&e[r+1][0]==f&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},o.prototype.diff_xIndex=function(e,r){var n=0,s=0,a=0,i=0,t;for(t=0;t<e.length&&(e[t][0]!==A&&(n+=e[t][1].length),e[t][0]!==k&&(s+=e[t][1].length),!(n>r));t++)a=n,i=s;return e.length!=t&&e[t][0]===k?i:i+(r-a)},o.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,s=/</g,a=/>/g,i=/\n/g,t=0;t<e.length;t++){var l=e[t][0],h=e[t][1],g=h.replace(n,"&amp;").replace(s,"&lt;").replace(a,"&gt;").replace(i,"&para;<br>");switch(l){case A:r[t]='<ins style="background:#e6ffe6;">'+g+"</ins>";break;case k:r[t]='<del style="background:#ffe6e6;">'+g+"</del>";break;case f:r[t]="<span>"+g+"</span>";break}}return r.join("")},o.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==A&&(r[n]=e[n][1]);return r.join("")},o.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==k&&(r[n]=e[n][1]);return r.join("")},o.prototype.diff_levenshtein=function(e){for(var r=0,n=0,s=0,a=0;a<e.length;a++){var i=e[a][0],t=e[a][1];switch(i){case A:n+=t.length;break;case k:s+=t.length;break;case f:r+=Math.max(n,s),n=0,s=0;break}}return r+=Math.max(n,s),r},o.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case A:r[n]="+"+encodeURI(e[n][1]);break;case k:r[n]="-"+e[n][1].length;break;case f:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},o.prototype.diff_fromDelta=function(e,r){for(var n=[],s=0,a=0,i=r.split(/\t/g),t=0;t<i.length;t++){var l=i[t].substring(1);switch(i[t].charAt(0)){case"+":try{n[s++]=new o.Diff(A,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var h=parseInt(l,10);if(isNaN(h)||h<0)throw new Error("Invalid number in diff_fromDelta: "+l);var g=e.substring(a,a+=h);i[t].charAt(0)=="="?n[s++]=new o.Diff(f,g):n[s++]=new o.Diff(k,g);break;default:if(i[t])throw new Error("Invalid diff operation in diff_fromDelta: "+i[t])}}if(a!=e.length)throw new Error("Delta length ("+a+") does not equal source text length ("+e.length+").");return n},o.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},o.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var s=this.match_alphabet_(r),a=this;function i(w,N){var j=w/r.length,T=Math.abs(n-N);return a.Match_Distance?j+T/a.Match_Distance:T?1:j}var t=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(t=Math.min(i(0,l),t),l=e.lastIndexOf(r,n+r.length),l!=-1&&(t=Math.min(i(0,l),t)));var h=1<<r.length-1;l=-1;for(var g,c,v=r.length+e.length,m,b=0;b<r.length;b++){for(g=0,c=v;g<c;)i(b,n+c)<=t?g=c:v=c,c=Math.floor((v-g)/2+g);v=c;var p=Math.max(1,n-c+1),M=Math.min(n+c,e.length)+r.length,E=Array(M+2);E[M+1]=(1<<b)-1;for(var _=M;_>=p;_--){var S=s[e.charAt(_-1)];if(b===0?E[_]=(E[_+1]<<1|1)&S:E[_]=(E[_+1]<<1|1)&S|((m[_+1]|m[_])<<1|1)|m[_+1],E[_]&h){var D=i(b,_-1);if(D<=t)if(t=D,l=_-1,l>n)p=Math.max(1,2*n-l);else break}}if(i(b+1,n)>t)break;m=E}return l},o.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},o.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),s=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)s+=this.Patch_Margin,n=r.substring(e.start2-s,e.start2+e.length1+s);s+=this.Patch_Margin;var a=r.substring(e.start2-s,e.start2);a&&e.diffs.unshift(new o.Diff(f,a));var i=r.substring(e.start2+e.length1,e.start2+e.length1+s);i&&e.diffs.push(new o.Diff(f,i)),e.start1-=a.length,e.start2-=a.length,e.length1+=a.length+i.length,e.length2+=a.length+i.length}},o.prototype.patch_make=function(e,r,n){var s,a;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")s=e,a=this.diff_main(s,r,!0),a.length>2&&(this.diff_cleanupSemantic(a),this.diff_cleanupEfficiency(a));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")a=e,s=this.diff_text1(a);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")s=e,a=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")s=e,a=n;else throw new Error("Unknown call format to patch_make.");if(a.length===0)return[];for(var i=[],t=new o.patch_obj,l=0,h=0,g=0,c=s,v=s,m=0;m<a.length;m++){var b=a[m][0],p=a[m][1];switch(!l&&b!==f&&(t.start1=h,t.start2=g),b){case A:t.diffs[l++]=a[m],t.length2+=p.length,v=v.substring(0,g)+p+v.substring(g);break;case k:t.length1+=p.length,t.diffs[l++]=a[m],v=v.substring(0,g)+v.substring(g+p.length);break;case f:p.length<=2*this.Patch_Margin&&l&&a.length!=m+1?(t.diffs[l++]=a[m],t.length1+=p.length,t.length2+=p.length):p.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(t,c),i.push(t),t=new o.patch_obj,l=0,c=v,h=g);break}b!==A&&(h+=p.length),b!==k&&(g+=p.length)}return l&&(this.patch_addContext_(t,c),i.push(t)),i},o.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var s=e[n],a=new o.patch_obj;a.diffs=[];for(var i=0;i<s.diffs.length;i++)a.diffs[i]=new o.Diff(s.diffs[i][0],s.diffs[i][1]);a.start1=s.start1,a.start2=s.start2,a.length1=s.length1,a.length2=s.length2,r[n]=a}return r},o.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var s=0,a=[],i=0;i<e.length;i++){var t=e[i].start2+s,l=this.diff_text1(e[i].diffs),h,g=-1;if(l.length>this.Match_MaxBits?(h=this.match_main(r,l.substring(0,this.Match_MaxBits),t),h!=-1&&(g=this.match_main(r,l.substring(l.length-this.Match_MaxBits),t+l.length-this.Match_MaxBits),(g==-1||h>=g)&&(h=-1))):h=this.match_main(r,l,t),h==-1)a[i]=!1,s-=e[i].length2-e[i].length1;else{a[i]=!0,s=h-t;var c;if(g==-1?c=r.substring(h,h+l.length):c=r.substring(h,g+this.Match_MaxBits),l==c)r=r.substring(0,h)+this.diff_text2(e[i].diffs)+r.substring(h+l.length);else{var v=this.diff_main(l,c,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(v)/l.length>this.Patch_DeleteThreshold)a[i]=!1;else{this.diff_cleanupSemanticLossless(v);for(var m=0,b,p=0;p<e[i].diffs.length;p++){var M=e[i].diffs[p];M[0]!==f&&(b=this.diff_xIndex(v,m)),M[0]===A?r=r.substring(0,h+b)+M[1]+r.substring(h+b):M[0]===k&&(r=r.substring(0,h+b)+r.substring(h+this.diff_xIndex(v,m+M[1].length))),M[0]!==k&&(m+=M[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,a]},o.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",s=1;s<=r;s++)n+=String.fromCharCode(s);for(var s=0;s<e.length;s++)e[s].start1+=r,e[s].start2+=r;var a=e[0],i=a.diffs;if(i.length==0||i[0][0]!=f)i.unshift(new o.Diff(f,n)),a.start1-=r,a.start2-=r,a.length1+=r,a.length2+=r;else if(r>i[0][1].length){var t=r-i[0][1].length;i[0][1]=n.substring(i[0][1].length)+i[0][1],a.start1-=t,a.start2-=t,a.length1+=t,a.length2+=t}if(a=e[e.length-1],i=a.diffs,i.length==0||i[i.length-1][0]!=f)i.push(new o.Diff(f,n)),a.length1+=r,a.length2+=r;else if(r>i[i.length-1][1].length){var t=r-i[i.length-1][1].length;i[i.length-1][1]+=n.substring(0,t),a.length1+=t,a.length2+=t}return n},o.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var s=e[n];e.splice(n--,1);for(var a=s.start1,i=s.start2,t="";s.diffs.length!==0;){var l=new o.patch_obj,h=!0;for(l.start1=a-t.length,l.start2=i-t.length,t!==""&&(l.length1=l.length2=t.length,l.diffs.push(new o.Diff(f,t)));s.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var g=s.diffs[0][0],c=s.diffs[0][1];g===A?(l.length2+=c.length,i+=c.length,l.diffs.push(s.diffs.shift()),h=!1):g===k&&l.diffs.length==1&&l.diffs[0][0]==f&&c.length>2*r?(l.length1+=c.length,a+=c.length,h=!1,l.diffs.push(new o.Diff(g,c)),s.diffs.shift()):(c=c.substring(0,r-l.length1-this.Patch_Margin),l.length1+=c.length,a+=c.length,g===f?(l.length2+=c.length,i+=c.length):h=!1,l.diffs.push(new o.Diff(g,c)),c==s.diffs[0][1]?s.diffs.shift():s.diffs[0][1]=s.diffs[0][1].substring(c.length))}t=this.diff_text2(l.diffs),t=t.substring(t.length-this.Patch_Margin);var v=this.diff_text1(s.diffs).substring(0,this.Patch_Margin);v!==""&&(l.length1+=v.length,l.length2+=v.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===f?l.diffs[l.diffs.length-1][1]+=v:l.diffs.push(new o.Diff(f,v))),h||e.splice(++n,0,l)}}},o.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},o.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(`
1
+ import{g as re,u as ne,r as I,j as u}from"./react-BoEjKzFZ.js";import{j as H,a as R,M as ie,L as U,H as se,T as J,l as Q,S as ae,F as te,n as G}from"./index-Dx9UqMyC.js";const le=H("Clock3",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16.5 12",key:"1aq6pp"}]]);const O=H("FileClock",[["path",{d:"M16 22h2a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3",key:"37hlfg"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["circle",{cx:"8",cy:"16",r:"6",key:"10v15b"}],["path",{d:"M9.5 17.5 8 16.25V14",key:"1o80t2"}]]);const he=H("Tag",[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]]);var V={exports:{}},K;function oe(){return K||(K=1,(function(C){var o=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},k=-1,A=1,f=0;o.Diff=function(e,r){return[e,r]},o.prototype.diff_main=function(e,r,n,s){typeof s>"u"&&(this.Diff_Timeout<=0?s=Number.MAX_VALUE:s=new Date().getTime()+this.Diff_Timeout*1e3);var a=s;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new o.Diff(f,e)]:[];typeof n>"u"&&(n=!0);var i=n,t=this.diff_commonPrefix(e,r),l=e.substring(0,t);e=e.substring(t),r=r.substring(t),t=this.diff_commonSuffix(e,r);var h=e.substring(e.length-t);e=e.substring(0,e.length-t),r=r.substring(0,r.length-t);var g=this.diff_compute_(e,r,i,a);return l&&g.unshift(new o.Diff(f,l)),h&&g.push(new o.Diff(f,h)),this.diff_cleanupMerge(g),g},o.prototype.diff_compute_=function(e,r,n,s){var a;if(!e)return[new o.Diff(A,r)];if(!r)return[new o.Diff(k,e)];var i=e.length>r.length?e:r,t=e.length>r.length?r:e,l=i.indexOf(t);if(l!=-1)return a=[new o.Diff(A,i.substring(0,l)),new o.Diff(f,t),new o.Diff(A,i.substring(l+t.length))],e.length>r.length&&(a[0][0]=a[2][0]=k),a;if(t.length==1)return[new o.Diff(k,e),new o.Diff(A,r)];var h=this.diff_halfMatch_(e,r);if(h){var g=h[0],c=h[1],v=h[2],m=h[3],b=h[4],p=this.diff_main(g,v,n,s),M=this.diff_main(c,m,n,s);return p.concat([new o.Diff(f,b)],M)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,s):this.diff_bisect_(e,r,s)},o.prototype.diff_lineMode_=function(e,r,n){var s=this.diff_linesToChars_(e,r);e=s.chars1,r=s.chars2;var a=s.lineArray,i=this.diff_main(e,r,!1,n);this.diff_charsToLines_(i,a),this.diff_cleanupSemantic(i),i.push(new o.Diff(f,""));for(var t=0,l=0,h=0,g="",c="";t<i.length;){switch(i[t][0]){case A:h++,c+=i[t][1];break;case k:l++,g+=i[t][1];break;case f:if(l>=1&&h>=1){i.splice(t-l-h,l+h),t=t-l-h;for(var v=this.diff_main(g,c,!1,n),m=v.length-1;m>=0;m--)i.splice(t,0,v[m]);t=t+v.length}h=0,l=0,g="",c="";break}t++}return i.pop(),i},o.prototype.diff_bisect_=function(e,r,n){for(var s=e.length,a=r.length,i=Math.ceil((s+a)/2),t=i,l=2*i,h=new Array(l),g=new Array(l),c=0;c<l;c++)h[c]=-1,g[c]=-1;h[t+1]=0,g[t+1]=0;for(var v=s-a,m=v%2!=0,b=0,p=0,M=0,E=0,_=0;_<i&&!(new Date().getTime()>n);_++){for(var S=-_+b;S<=_-p;S+=2){var D=t+S,y;S==-_||S!=_&&h[D-1]<h[D+1]?y=h[D+1]:y=h[D-1]+1;for(var N=y-S;y<s&&N<a&&e.charAt(y)==r.charAt(N);)y++,N++;if(h[D]=y,y>s)p+=2;else if(N>a)b+=2;else if(m){var j=t+v-S;if(j>=0&&j<l&&g[j]!=-1){var T=s-g[j];if(y>=T)return this.diff_bisectSplit_(e,r,y,N,n)}}}for(var P=-_+M;P<=_-E;P+=2){var j=t+P,T;P==-_||P!=_&&g[j-1]<g[j+1]?T=g[j+1]:T=g[j-1]+1;for(var B=T-P;T<s&&B<a&&e.charAt(s-T-1)==r.charAt(a-B-1);)T++,B++;if(g[j]=T,T>s)E+=2;else if(B>a)M+=2;else if(!m){var D=t+v-P;if(D>=0&&D<l&&h[D]!=-1){var y=h[D],N=t+y-D;if(T=s-T,y>=T)return this.diff_bisectSplit_(e,r,y,N,n)}}}}return[new o.Diff(k,e),new o.Diff(A,r)]},o.prototype.diff_bisectSplit_=function(e,r,n,s,a){var i=e.substring(0,n),t=r.substring(0,s),l=e.substring(n),h=r.substring(s),g=this.diff_main(i,t,!1,a),c=this.diff_main(l,h,!1,a);return g.concat(c)},o.prototype.diff_linesToChars_=function(e,r){var n=[],s={};n[0]="";function a(h){for(var g="",c=0,v=-1,m=n.length;v<h.length-1;){v=h.indexOf(`
2
+ `,c),v==-1&&(v=h.length-1);var b=h.substring(c,v+1);(s.hasOwnProperty?s.hasOwnProperty(b):s[b]!==void 0)?g+=String.fromCharCode(s[b]):(m==i&&(b=h.substring(c),v=h.length),g+=String.fromCharCode(m),s[b]=m,n[m++]=b),c=v+1}return g}var i=4e4,t=a(e);i=65535;var l=a(r);return{chars1:t,chars2:l,lineArray:n}},o.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var s=e[n][1],a=[],i=0;i<s.length;i++)a[i]=r[s.charCodeAt(i)];e[n][1]=a.join("")}},o.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,s=Math.min(e.length,r.length),a=s,i=0;n<a;)e.substring(i,a)==r.substring(i,a)?(n=a,i=n):s=a,a=Math.floor((s-n)/2+n);return a},o.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,s=Math.min(e.length,r.length),a=s,i=0;n<a;)e.substring(e.length-a,e.length-i)==r.substring(r.length-a,r.length-i)?(n=a,i=n):s=a,a=Math.floor((s-n)/2+n);return a},o.prototype.diff_commonOverlap_=function(e,r){var n=e.length,s=r.length;if(n==0||s==0)return 0;n>s?e=e.substring(n-s):n<s&&(r=r.substring(0,n));var a=Math.min(n,s);if(e==r)return a;for(var i=0,t=1;;){var l=e.substring(a-t),h=r.indexOf(l);if(h==-1)return i;t+=h,(h==0||e.substring(a-t)==r.substring(0,t))&&(i=t,t++)}},o.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,s=e.length>r.length?r:e;if(n.length<4||s.length*2<n.length)return null;var a=this;function i(p,M,E){for(var _=p.substring(E,E+Math.floor(p.length/4)),S=-1,D="",y,N,j,T;(S=M.indexOf(_,S+1))!=-1;){var P=a.diff_commonPrefix(p.substring(E),M.substring(S)),B=a.diff_commonSuffix(p.substring(0,E),M.substring(0,S));D.length<B+P&&(D=M.substring(S-B,S)+M.substring(S,S+P),y=p.substring(0,E-B),N=p.substring(E+P),j=M.substring(0,S-B),T=M.substring(S+P))}return D.length*2>=p.length?[y,N,j,T,D]:null}var t=i(n,s,Math.ceil(n.length/4)),l=i(n,s,Math.ceil(n.length/2)),h;if(!t&&!l)return null;l?t?h=t[4].length>l[4].length?t:l:h=l:h=t;var g,c,v,m;e.length>r.length?(g=h[0],c=h[1],v=h[2],m=h[3]):(v=h[0],m=h[1],g=h[2],c=h[3]);var b=h[4];return[g,c,v,m,b]},o.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],s=0,a=null,i=0,t=0,l=0,h=0,g=0;i<e.length;)e[i][0]==f?(n[s++]=i,t=h,l=g,h=0,g=0,a=e[i][1]):(e[i][0]==A?h+=e[i][1].length:g+=e[i][1].length,a&&a.length<=Math.max(t,l)&&a.length<=Math.max(h,g)&&(e.splice(n[s-1],0,new o.Diff(k,a)),e[n[s-1]+1][0]=A,s--,s--,i=s>0?n[s-1]:-1,t=0,l=0,h=0,g=0,a=null,r=!0)),i++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),i=1;i<e.length;){if(e[i-1][0]==k&&e[i][0]==A){var c=e[i-1][1],v=e[i][1],m=this.diff_commonOverlap_(c,v),b=this.diff_commonOverlap_(v,c);m>=b?(m>=c.length/2||m>=v.length/2)&&(e.splice(i,0,new o.Diff(f,v.substring(0,m))),e[i-1][1]=c.substring(0,c.length-m),e[i+1][1]=v.substring(m),i++):(b>=c.length/2||b>=v.length/2)&&(e.splice(i,0,new o.Diff(f,c.substring(0,b))),e[i-1][0]=A,e[i-1][1]=v.substring(0,v.length-b),e[i+1][0]=k,e[i+1][1]=c.substring(b),i++),i++}i++}},o.prototype.diff_cleanupSemanticLossless=function(e){function r(b,p){if(!b||!p)return 6;var M=b.charAt(b.length-1),E=p.charAt(0),_=M.match(o.nonAlphaNumericRegex_),S=E.match(o.nonAlphaNumericRegex_),D=_&&M.match(o.whitespaceRegex_),y=S&&E.match(o.whitespaceRegex_),N=D&&M.match(o.linebreakRegex_),j=y&&E.match(o.linebreakRegex_),T=N&&b.match(o.blanklineEndRegex_),P=j&&p.match(o.blanklineStartRegex_);return T||P?5:N||j?4:_&&!D&&y?3:D||y?2:_||S?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==f&&e[n+1][0]==f){var s=e[n-1][1],a=e[n][1],i=e[n+1][1],t=this.diff_commonSuffix(s,a);if(t){var l=a.substring(a.length-t);s=s.substring(0,s.length-t),a=l+a.substring(0,a.length-t),i=l+i}for(var h=s,g=a,c=i,v=r(s,a)+r(a,i);a.charAt(0)===i.charAt(0);){s+=a.charAt(0),a=a.substring(1)+i.charAt(0),i=i.substring(1);var m=r(s,a)+r(a,i);m>=v&&(v=m,h=s,g=a,c=i)}e[n-1][1]!=h&&(h?e[n-1][1]=h:(e.splice(n-1,1),n--),e[n][1]=g,c?e[n+1][1]=c:(e.splice(n+1,1),n--))}n++}},o.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,o.whitespaceRegex_=/\s/,o.linebreakRegex_=/[\r\n]/,o.blanklineEndRegex_=/\n\r?\n$/,o.blanklineStartRegex_=/^\r?\n\r?\n/,o.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],s=0,a=null,i=0,t=!1,l=!1,h=!1,g=!1;i<e.length;)e[i][0]==f?(e[i][1].length<this.Diff_EditCost&&(h||g)?(n[s++]=i,t=h,l=g,a=e[i][1]):(s=0,a=null),h=g=!1):(e[i][0]==k?g=!0:h=!0,a&&(t&&l&&h&&g||a.length<this.Diff_EditCost/2&&t+l+h+g==3)&&(e.splice(n[s-1],0,new o.Diff(k,a)),e[n[s-1]+1][0]=A,s--,a=null,t&&l?(h=g=!0,s=0):(s--,i=s>0?n[s-1]:-1,h=g=!1),r=!0)),i++;r&&this.diff_cleanupMerge(e)},o.prototype.diff_cleanupMerge=function(e){e.push(new o.Diff(f,""));for(var r=0,n=0,s=0,a="",i="",t;r<e.length;)switch(e[r][0]){case A:s++,i+=e[r][1],r++;break;case k:n++,a+=e[r][1],r++;break;case f:n+s>1?(n!==0&&s!==0&&(t=this.diff_commonPrefix(i,a),t!==0&&(r-n-s>0&&e[r-n-s-1][0]==f?e[r-n-s-1][1]+=i.substring(0,t):(e.splice(0,0,new o.Diff(f,i.substring(0,t))),r++),i=i.substring(t),a=a.substring(t)),t=this.diff_commonSuffix(i,a),t!==0&&(e[r][1]=i.substring(i.length-t)+e[r][1],i=i.substring(0,i.length-t),a=a.substring(0,a.length-t))),r-=n+s,e.splice(r,n+s),a.length&&(e.splice(r,0,new o.Diff(k,a)),r++),i.length&&(e.splice(r,0,new o.Diff(A,i)),r++),r++):r!==0&&e[r-1][0]==f?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,s=0,n=0,a="",i="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==f&&e[r+1][0]==f&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},o.prototype.diff_xIndex=function(e,r){var n=0,s=0,a=0,i=0,t;for(t=0;t<e.length&&(e[t][0]!==A&&(n+=e[t][1].length),e[t][0]!==k&&(s+=e[t][1].length),!(n>r));t++)a=n,i=s;return e.length!=t&&e[t][0]===k?i:i+(r-a)},o.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,s=/</g,a=/>/g,i=/\n/g,t=0;t<e.length;t++){var l=e[t][0],h=e[t][1],g=h.replace(n,"&amp;").replace(s,"&lt;").replace(a,"&gt;").replace(i,"&para;<br>");switch(l){case A:r[t]='<ins style="background:#e6ffe6;">'+g+"</ins>";break;case k:r[t]='<del style="background:#ffe6e6;">'+g+"</del>";break;case f:r[t]="<span>"+g+"</span>";break}}return r.join("")},o.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==A&&(r[n]=e[n][1]);return r.join("")},o.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==k&&(r[n]=e[n][1]);return r.join("")},o.prototype.diff_levenshtein=function(e){for(var r=0,n=0,s=0,a=0;a<e.length;a++){var i=e[a][0],t=e[a][1];switch(i){case A:n+=t.length;break;case k:s+=t.length;break;case f:r+=Math.max(n,s),n=0,s=0;break}}return r+=Math.max(n,s),r},o.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case A:r[n]="+"+encodeURI(e[n][1]);break;case k:r[n]="-"+e[n][1].length;break;case f:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},o.prototype.diff_fromDelta=function(e,r){for(var n=[],s=0,a=0,i=r.split(/\t/g),t=0;t<i.length;t++){var l=i[t].substring(1);switch(i[t].charAt(0)){case"+":try{n[s++]=new o.Diff(A,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var h=parseInt(l,10);if(isNaN(h)||h<0)throw new Error("Invalid number in diff_fromDelta: "+l);var g=e.substring(a,a+=h);i[t].charAt(0)=="="?n[s++]=new o.Diff(f,g):n[s++]=new o.Diff(k,g);break;default:if(i[t])throw new Error("Invalid diff operation in diff_fromDelta: "+i[t])}}if(a!=e.length)throw new Error("Delta length ("+a+") does not equal source text length ("+e.length+").");return n},o.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},o.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var s=this.match_alphabet_(r),a=this;function i(y,N){var j=y/r.length,T=Math.abs(n-N);return a.Match_Distance?j+T/a.Match_Distance:T?1:j}var t=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(t=Math.min(i(0,l),t),l=e.lastIndexOf(r,n+r.length),l!=-1&&(t=Math.min(i(0,l),t)));var h=1<<r.length-1;l=-1;for(var g,c,v=r.length+e.length,m,b=0;b<r.length;b++){for(g=0,c=v;g<c;)i(b,n+c)<=t?g=c:v=c,c=Math.floor((v-g)/2+g);v=c;var p=Math.max(1,n-c+1),M=Math.min(n+c,e.length)+r.length,E=Array(M+2);E[M+1]=(1<<b)-1;for(var _=M;_>=p;_--){var S=s[e.charAt(_-1)];if(b===0?E[_]=(E[_+1]<<1|1)&S:E[_]=(E[_+1]<<1|1)&S|((m[_+1]|m[_])<<1|1)|m[_+1],E[_]&h){var D=i(b,_-1);if(D<=t)if(t=D,l=_-1,l>n)p=Math.max(1,2*n-l);else break}}if(i(b+1,n)>t)break;m=E}return l},o.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},o.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),s=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)s+=this.Patch_Margin,n=r.substring(e.start2-s,e.start2+e.length1+s);s+=this.Patch_Margin;var a=r.substring(e.start2-s,e.start2);a&&e.diffs.unshift(new o.Diff(f,a));var i=r.substring(e.start2+e.length1,e.start2+e.length1+s);i&&e.diffs.push(new o.Diff(f,i)),e.start1-=a.length,e.start2-=a.length,e.length1+=a.length+i.length,e.length2+=a.length+i.length}},o.prototype.patch_make=function(e,r,n){var s,a;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")s=e,a=this.diff_main(s,r,!0),a.length>2&&(this.diff_cleanupSemantic(a),this.diff_cleanupEfficiency(a));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")a=e,s=this.diff_text1(a);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")s=e,a=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")s=e,a=n;else throw new Error("Unknown call format to patch_make.");if(a.length===0)return[];for(var i=[],t=new o.patch_obj,l=0,h=0,g=0,c=s,v=s,m=0;m<a.length;m++){var b=a[m][0],p=a[m][1];switch(!l&&b!==f&&(t.start1=h,t.start2=g),b){case A:t.diffs[l++]=a[m],t.length2+=p.length,v=v.substring(0,g)+p+v.substring(g);break;case k:t.length1+=p.length,t.diffs[l++]=a[m],v=v.substring(0,g)+v.substring(g+p.length);break;case f:p.length<=2*this.Patch_Margin&&l&&a.length!=m+1?(t.diffs[l++]=a[m],t.length1+=p.length,t.length2+=p.length):p.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(t,c),i.push(t),t=new o.patch_obj,l=0,c=v,h=g);break}b!==A&&(h+=p.length),b!==k&&(g+=p.length)}return l&&(this.patch_addContext_(t,c),i.push(t)),i},o.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var s=e[n],a=new o.patch_obj;a.diffs=[];for(var i=0;i<s.diffs.length;i++)a.diffs[i]=new o.Diff(s.diffs[i][0],s.diffs[i][1]);a.start1=s.start1,a.start2=s.start2,a.length1=s.length1,a.length2=s.length2,r[n]=a}return r},o.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var s=0,a=[],i=0;i<e.length;i++){var t=e[i].start2+s,l=this.diff_text1(e[i].diffs),h,g=-1;if(l.length>this.Match_MaxBits?(h=this.match_main(r,l.substring(0,this.Match_MaxBits),t),h!=-1&&(g=this.match_main(r,l.substring(l.length-this.Match_MaxBits),t+l.length-this.Match_MaxBits),(g==-1||h>=g)&&(h=-1))):h=this.match_main(r,l,t),h==-1)a[i]=!1,s-=e[i].length2-e[i].length1;else{a[i]=!0,s=h-t;var c;if(g==-1?c=r.substring(h,h+l.length):c=r.substring(h,g+this.Match_MaxBits),l==c)r=r.substring(0,h)+this.diff_text2(e[i].diffs)+r.substring(h+l.length);else{var v=this.diff_main(l,c,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(v)/l.length>this.Patch_DeleteThreshold)a[i]=!1;else{this.diff_cleanupSemanticLossless(v);for(var m=0,b,p=0;p<e[i].diffs.length;p++){var M=e[i].diffs[p];M[0]!==f&&(b=this.diff_xIndex(v,m)),M[0]===A?r=r.substring(0,h+b)+M[1]+r.substring(h+b):M[0]===k&&(r=r.substring(0,h+b)+r.substring(h+this.diff_xIndex(v,m+M[1].length))),M[0]!==k&&(m+=M[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,a]},o.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",s=1;s<=r;s++)n+=String.fromCharCode(s);for(var s=0;s<e.length;s++)e[s].start1+=r,e[s].start2+=r;var a=e[0],i=a.diffs;if(i.length==0||i[0][0]!=f)i.unshift(new o.Diff(f,n)),a.start1-=r,a.start2-=r,a.length1+=r,a.length2+=r;else if(r>i[0][1].length){var t=r-i[0][1].length;i[0][1]=n.substring(i[0][1].length)+i[0][1],a.start1-=t,a.start2-=t,a.length1+=t,a.length2+=t}if(a=e[e.length-1],i=a.diffs,i.length==0||i[i.length-1][0]!=f)i.push(new o.Diff(f,n)),a.length1+=r,a.length2+=r;else if(r>i[i.length-1][1].length){var t=r-i[i.length-1][1].length;i[i.length-1][1]+=n.substring(0,t),a.length1+=t,a.length2+=t}return n},o.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var s=e[n];e.splice(n--,1);for(var a=s.start1,i=s.start2,t="";s.diffs.length!==0;){var l=new o.patch_obj,h=!0;for(l.start1=a-t.length,l.start2=i-t.length,t!==""&&(l.length1=l.length2=t.length,l.diffs.push(new o.Diff(f,t)));s.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var g=s.diffs[0][0],c=s.diffs[0][1];g===A?(l.length2+=c.length,i+=c.length,l.diffs.push(s.diffs.shift()),h=!1):g===k&&l.diffs.length==1&&l.diffs[0][0]==f&&c.length>2*r?(l.length1+=c.length,a+=c.length,h=!1,l.diffs.push(new o.Diff(g,c)),s.diffs.shift()):(c=c.substring(0,r-l.length1-this.Patch_Margin),l.length1+=c.length,a+=c.length,g===f?(l.length2+=c.length,i+=c.length):h=!1,l.diffs.push(new o.Diff(g,c)),c==s.diffs[0][1]?s.diffs.shift():s.diffs[0][1]=s.diffs[0][1].substring(c.length))}t=this.diff_text2(l.diffs),t=t.substring(t.length-this.Patch_Margin);var v=this.diff_text1(s.diffs).substring(0,this.Patch_Margin);v!==""&&(l.length1+=v.length,l.length2+=v.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===f?l.diffs[l.diffs.length-1][1]+=v:l.diffs.push(new o.Diff(f,v))),h||e.splice(++n,0,l)}}},o.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},o.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(`
3
3
  `),s=0,a=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;s<n.length;){var i=n[s].match(a);if(!i)throw new Error("Invalid patch string: "+n[s]);var t=new o.patch_obj;for(r.push(t),t.start1=parseInt(i[1],10),i[2]===""?(t.start1--,t.length1=1):i[2]=="0"?t.length1=0:(t.start1--,t.length1=parseInt(i[2],10)),t.start2=parseInt(i[3],10),i[4]===""?(t.start2--,t.length2=1):i[4]=="0"?t.length2=0:(t.start2--,t.length2=parseInt(i[4],10)),s++;s<n.length;){var l=n[s].charAt(0);try{var h=decodeURI(n[s].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+h)}if(l=="-")t.diffs.push(new o.Diff(k,h));else if(l=="+")t.diffs.push(new o.Diff(A,h));else if(l==" ")t.diffs.push(new o.Diff(f,h));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+h)}s++}}return r},o.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},o.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@
4
4
  `],s,a=0;a<this.diffs.length;a++){switch(this.diffs[a][0]){case A:s="+";break;case k:s="-";break;case f:s=" ";break}n[a+1]=s+encodeURI(this.diffs[a][1])+`
5
- `}return n.join("").replace(/%20/g," ")},C.exports=o,C.exports.diff_match_patch=o,C.exports.DIFF_DELETE=k,C.exports.DIFF_INSERT=A,C.exports.DIFF_EQUAL=f})(H)),H.exports}var ge=oe();const fe=re(ge);function ve({open:C,project:o,onOpenChange:k,onBeforeMutation:A}){const{t:f,i18n:e}=ne(),[r,n]=I.useState([]),[s,a]=I.useState(null),[i,t]=I.useState(""),[l,h]=I.useState(null),[g,c]=I.useState(""),[v,m]=I.useState(null),[b,p]=I.useState(""),[M,E]=I.useState(null),[_,S]=I.useState(null),[D,w]=I.useState(""),[N,j]=I.useState(""),T=o.permission!=="read",P=o.permission==="owner";I.useEffect(()=>{if(!C)return;const d=new AbortController;return w("load"),j(""),m(null),R(`/api/projects/${o.id}/history`,{signal:d.signal}).then(y=>{n(y.versions),a(y.stats),t(L=>y.versions.some(F=>F.id===L)?L:y.versions[0]?.id??"")}).catch(y=>{X(y)||j($(y))}).finally(()=>{d.signal.aborted||w("")}),()=>d.abort()},[C,o.id]),I.useEffect(()=>{if(!C||!i){h(null);return}const d=new AbortController;return w("detail"),m(null),R(`/api/projects/${o.id}/history/${i}`,{signal:d.signal}).then(y=>{h(y),p(y.version.label??"");const L=y.version.changedPaths.find(F=>y.files.some(U=>U.path===F))??y.files[0]?.path??"";c(L)}).catch(y=>{X(y)||j($(y))}).finally(()=>{d.signal.aborted||w("")}),()=>d.abort()},[C,o.id,i]);const B=async(d=g)=>{if(d){w("compare"),j("");try{m(await R(`/api/projects/${o.id}/history/${i}/file?path=${encodeURIComponent(d)}`))}catch(y){j($(y))}finally{w("")}}},Z=async()=>{if(l){w("label"),j("");try{const d=await R(`/api/projects/${o.id}/history/${l.version.id}`,{method:"PATCH",body:JSON.stringify({label:b.trim()||null})});h(y=>y&&{...y,version:d.version}),n(y=>y.map(L=>L.id===d.version.id?d.version:L)),a(d.stats)}catch(d){j($(d))}finally{w("")}}},Y=async()=>{const d=_;if(d){S(null),w("delete"),j("");try{if(!await A())throw new Error(f("errors.collaborationUnavailable"));const y=d==="all"?`/api/projects/${o.id}/history`:`/api/projects/${o.id}/history/${d.id}`,L=await R(y,{method:"DELETE"});if(a(L.stats),d==="all")n([]),t(""),h(null),m(null);else{const F=r.filter(U=>U.id!==d.id);n(F),i===d.id&&(t(F[0]?.id??""),h(null),m(null))}}catch(y){j($(y))}finally{w("")}}},q=async()=>{const d=M;if(!(!d||!l)){E(null),w("restore"),j("");try{if(!await A())throw new Error(f("errors.collaborationUnavailable"));await R(`/api/projects/${o.id}/history/${l.version.id}/restore`,{method:"POST",body:JSON.stringify(d==="project"?{}:{path:d})}),window.location.reload()}catch(y){j($(y)),w("")}}},x=I.useMemo(()=>{if(!v)return[];const d=new fe;d.Diff_Timeout=1;const y=d.diff_main(v.historical,v.comparison,!0);return d.diff_cleanupSemantic(y),y},[v]),ee=_&&_!=="all"?_.label||new Date(_.createdAt).toLocaleString(e.resolvedLanguage):"";return u.jsxs(u.Fragment,{children:[u.jsx(ie,{open:C,extraWide:!0,className:"history-dialog-modal",title:f("history.title"),description:f("history.description"),onOpenChange:k,footer:u.jsx("button",{onClick:()=>k(!1),children:f("common.close")}),children:u.jsxs("div",{className:"history-dialog",children:[N&&u.jsx("p",{className:"error history-message",children:N}),D==="load"&&r.length===0?u.jsxs("div",{className:"history-loading",children:[u.jsx(O,{className:"spin",size:22}),f("common.loading")]}):u.jsxs(u.Fragment,{children:[u.jsxs("aside",{className:"history-timeline",children:[P&&s&&u.jsxs("div",{className:`history-stats${s.storageLimitExceeded?" exceeded":""}`,children:[u.jsxs("header",{children:[u.jsxs("span",{children:[u.jsx(le,{size:14}),f("history.storage")]}),u.jsx("button",{type:"button",disabled:!!D||r.length===0,title:f("history.clearAll"),"aria-label":f("history.clearAll"),onClick:()=>S("all"),children:u.jsx(J,{size:13})})]}),u.jsx("strong",{children:f("history.storageUsage",{used:W(s.objectBytes),limit:W(s.maxStorageBytes)})}),u.jsx("progress",{max:s.maxStorageBytes,value:Math.min(s.objectBytes,s.maxStorageBytes)}),u.jsxs("small",{children:[f("history.versionUsage",{count:s.ordinaryVersionCount,limit:s.maxVersions}),s.labeledVersionCount>0?` · ${f("history.protectedVersions",{count:s.labeledVersionCount})}`:""]}),s.storageLimitExceeded&&u.jsx("small",{className:"history-storage-warning",children:f("history.storageExceeded")})]}),r.map(d=>u.jsxs("button",{className:d.id===i?"active":"",onClick:()=>t(d.id),children:[u.jsx(V,{size:15}),u.jsxs("span",{children:[u.jsx("strong",{children:d.label||f(`history.reasons.${d.reason}`)}),u.jsx("small",{children:new Date(d.createdAt).toLocaleString(e.resolvedLanguage)}),u.jsxs("small",{children:[d.author?.name??f("editor.deletedUser")," · ",f("history.changedCount",{count:d.changedPaths.length})]})]})]},d.id)),r.length===0&&u.jsx("p",{className:"muted padded",children:f("history.empty")})]}),u.jsx("section",{className:"history-detail",children:l&&u.jsxs(u.Fragment,{children:[u.jsxs("header",{className:"history-detail-header",children:[u.jsxs("div",{children:[u.jsx("strong",{children:l.version.label||f(`history.reasons.${l.version.reason}`)}),u.jsxs("small",{children:[u.jsx(te,{size:12}),new Date(l.version.createdAt).toLocaleString(e.resolvedLanguage)," · ",f("history.fileCount",{count:l.version.fileCount})]})]}),u.jsxs("span",{className:"history-detail-actions",children:[P&&u.jsxs("button",{className:"danger-text",disabled:!!D,onClick:()=>S(l.version),children:[u.jsx(J,{size:14}),f("history.deleteVersion")]}),T&&u.jsxs("button",{className:"danger-text",disabled:!!D,onClick:()=>E("project"),children:[u.jsx(Q,{size:14}),f("history.restoreProject")]})]})]}),T&&u.jsxs("div",{className:"history-label",children:[u.jsxs("label",{children:[u.jsx(he,{size:14}),u.jsx("input",{value:b,maxLength:80,placeholder:f("history.labelPlaceholder"),onChange:d=>p(d.target.value)})]}),u.jsxs("button",{disabled:D==="label"||b.trim()===(l.version.label??""),onClick:()=>{Z()},children:[D==="label"?u.jsx(O,{className:"spin",size:13}):u.jsx(se,{size:13}),f("history.saveLabel")]})]}),u.jsxs("div",{className:"history-files",children:[u.jsx("div",{className:"history-file-list",children:l.files.map(d=>{const y=l.version.changedPaths.includes(d.path);return u.jsxs("button",{className:d.path===g?"active":"",title:d.path,onClick:()=>{c(d.path),m(null)},children:[u.jsx(ae,{size:13}),u.jsx("span",{children:d.path}),y&&u.jsx("small",{children:f("history.changed")})]},d.path)})}),u.jsxs("div",{className:"history-file-actions",children:[u.jsxs("button",{disabled:!g||!!D,onClick:()=>{B()},children:[D==="compare"?u.jsx(O,{className:"spin",size:13}):u.jsx(V,{size:13}),f("history.compareCurrent")]}),T&&u.jsxs("button",{disabled:!g||!!D,onClick:()=>E(g),children:[u.jsx(Q,{size:13}),f("history.restoreFile")]})]})]}),u.jsx("div",{className:"history-comparison",children:v?u.jsxs(u.Fragment,{children:[u.jsxs("header",{children:[u.jsx("strong",{children:v.path}),u.jsx("small",{children:f("history.comparingCurrent")})]}),u.jsx("pre",{children:x.map(([d,y],L)=>u.jsx("span",{className:d<0?"history-removed":d>0?"history-added":"",children:y},L))})]}):u.jsxs("div",{className:"history-comparison-empty",children:[u.jsx(V,{size:25}),u.jsx("span",{children:f("history.chooseFile")})]})})]})})]})]})}),u.jsx(G,{open:!!M,title:f(M==="project"?"history.restoreProjectTitle":"history.restoreFileTitle"),description:M==="project"?f("history.restoreProjectDescription"):f("history.restoreFileDescription",{path:M??""}),confirmLabel:f("history.restore"),danger:!0,onCancel:()=>E(null),onConfirm:()=>{q()}}),u.jsx(G,{open:!!_,title:f(_==="all"?"history.clearAllTitle":"history.deleteVersionTitle"),description:_==="all"?f("history.clearAllDescription"):f("history.deleteVersionDescription",{name:ee}),confirmLabel:f(_==="all"?"history.clearAll":"history.deleteVersion"),danger:!0,onCancel:()=>S(null),onConfirm:()=>{Y()}})]})}function W(C){return C<1024?`${C} B`:C<1024*1024?`${Math.round(C/102.4)/10} KB`:C<1024*1024*1024?`${Math.round(C/(1024*1024)*10)/10} MB`:`${Math.round(C/(1024*1024*1024)*10)/10} GB`}function $(C){return C instanceof Error?C.message:String(C)}function X(C){return C instanceof Error&&C.name==="AbortError"}export{ve as HistoryDialog};
5
+ `}return n.join("").replace(/%20/g," ")},C.exports=o,C.exports.diff_match_patch=o,C.exports.DIFF_DELETE=k,C.exports.DIFF_INSERT=A,C.exports.DIFF_EQUAL=f})(V)),V.exports}var ge=oe();const fe=re(ge);function ve({open:C,project:o,onOpenChange:k,onBeforeMutation:A}){const{t:f,i18n:e}=ne(),[r,n]=I.useState([]),[s,a]=I.useState(null),[i,t]=I.useState(""),[l,h]=I.useState(null),[g,c]=I.useState(""),[v,m]=I.useState(null),[b,p]=I.useState(""),[M,E]=I.useState(null),[_,S]=I.useState(null),[D,y]=I.useState(""),[N,j]=I.useState(""),T=o.permission!=="read",P=o.permission==="owner";I.useEffect(()=>{if(!C)return;const d=new AbortController;return y("load"),j(""),m(null),R(`/api/projects/${o.id}/history`,{signal:d.signal}).then(w=>{n(w.versions),a(w.stats),t(L=>w.versions.some(F=>F.id===L)?L:w.versions[0]?.id??"")}).catch(w=>{X(w)||j($(w))}).finally(()=>{d.signal.aborted||y("")}),()=>d.abort()},[C,o.id]),I.useEffect(()=>{if(!C||!i){h(null);return}const d=new AbortController;return y("detail"),m(null),R(`/api/projects/${o.id}/history/${i}`,{signal:d.signal}).then(w=>{h(w),p(w.version.label??"");const L=w.version.changedPaths.find(F=>w.files.some(z=>z.path===F))??w.files[0]?.path??"";c(L)}).catch(w=>{X(w)||j($(w))}).finally(()=>{d.signal.aborted||y("")}),()=>d.abort()},[C,o.id,i]);const B=async(d=g)=>{if(d){y("compare"),j("");try{m(await R(`/api/projects/${o.id}/history/${i}/file?path=${encodeURIComponent(d)}`))}catch(w){j($(w))}finally{y("")}}},Z=async()=>{if(l){y("label"),j("");try{const d=await R(`/api/projects/${o.id}/history/${l.version.id}`,{method:"PATCH",body:JSON.stringify({label:b.trim()||null})});h(w=>w&&{...w,version:d.version}),n(w=>w.map(L=>L.id===d.version.id?d.version:L)),a(d.stats)}catch(d){j($(d))}finally{y("")}}},Y=async()=>{const d=_;if(d){S(null),y("delete"),j("");try{if(!await A())throw new Error(f("errors.collaborationUnavailable"));const w=d==="all"?`/api/projects/${o.id}/history`:`/api/projects/${o.id}/history/${d.id}`,L=await R(w,{method:"DELETE"});if(a(L.stats),d==="all")n([]),t(""),h(null),m(null);else{const F=r.filter(z=>z.id!==d.id);n(F),i===d.id&&(t(F[0]?.id??""),h(null),m(null))}}catch(w){j($(w))}finally{y("")}}},q=async()=>{const d=M;if(!(!d||!l)){E(null),y("restore"),j("");try{if(!await A())throw new Error(f("errors.collaborationUnavailable"));await R(`/api/projects/${o.id}/history/${l.version.id}/restore`,{method:"POST",body:JSON.stringify(d==="project"?{}:{path:d})}),window.location.reload()}catch(w){j($(w)),y("")}}},x=I.useMemo(()=>{if(!v)return[];const d=new fe;d.Diff_Timeout=1;const w=d.diff_main(v.historical,v.comparison,!0);return d.diff_cleanupSemantic(w),w},[v]),ee=_&&_!=="all"?_.label||new Date(_.createdAt).toLocaleString(e.resolvedLanguage):"";return u.jsxs(u.Fragment,{children:[u.jsx(ie,{open:C,extraWide:!0,className:"history-dialog-modal",title:f("history.title"),description:f("history.description"),onOpenChange:k,footer:u.jsx("button",{onClick:()=>k(!1),children:f("common.close")}),children:u.jsxs("div",{className:"history-dialog",children:[N&&u.jsx("p",{className:"error history-message",children:N}),D==="load"&&r.length===0?u.jsxs("div",{className:"history-loading",children:[u.jsx(U,{className:"spin",size:22}),f("common.loading")]}):u.jsxs(u.Fragment,{children:[u.jsxs("aside",{className:"history-timeline",children:[P&&s&&u.jsxs("div",{className:`history-stats${s.storageLimitExceeded?" exceeded":""}`,children:[u.jsxs("header",{children:[u.jsxs("span",{children:[u.jsx(se,{size:14}),f("history.storage")]}),u.jsx("button",{type:"button",disabled:!!D||r.length===0,title:f("history.clearAll"),"aria-label":f("history.clearAll"),onClick:()=>S("all"),children:u.jsx(J,{size:13})})]}),u.jsx("strong",{children:f("history.storageUsage",{used:W(s.objectBytes),limit:W(s.maxStorageBytes)})}),u.jsx("progress",{max:s.maxStorageBytes,value:Math.min(s.objectBytes,s.maxStorageBytes)}),u.jsxs("small",{children:[f("history.versionUsage",{count:s.ordinaryVersionCount,limit:s.maxVersions}),s.labeledVersionCount>0?` · ${f("history.protectedVersions",{count:s.labeledVersionCount})}`:""]}),s.storageLimitExceeded&&u.jsx("small",{className:"history-storage-warning",children:f("history.storageExceeded")})]}),r.map(d=>u.jsxs("button",{className:d.id===i?"active":"",onClick:()=>t(d.id),children:[u.jsx(O,{size:15}),u.jsxs("span",{children:[u.jsx("strong",{children:d.label||f(`history.reasons.${d.reason}`)}),u.jsx("small",{children:new Date(d.createdAt).toLocaleString(e.resolvedLanguage)}),u.jsxs("small",{children:[d.author?.name??f("editor.deletedUser")," · ",f("history.changedCount",{count:d.changedPaths.length})]})]})]},d.id)),r.length===0&&u.jsx("p",{className:"muted padded",children:f("history.empty")})]}),u.jsx("section",{className:"history-detail",children:l&&u.jsxs(u.Fragment,{children:[u.jsxs("header",{className:"history-detail-header",children:[u.jsxs("div",{children:[u.jsx("strong",{children:l.version.label||f(`history.reasons.${l.version.reason}`)}),u.jsxs("small",{children:[u.jsx(le,{size:12}),new Date(l.version.createdAt).toLocaleString(e.resolvedLanguage)," · ",f("history.fileCount",{count:l.version.fileCount})]})]}),u.jsxs("span",{className:"history-detail-actions",children:[P&&u.jsxs("button",{className:"danger-text",disabled:!!D,onClick:()=>S(l.version),children:[u.jsx(J,{size:14}),f("history.deleteVersion")]}),T&&u.jsxs("button",{className:"danger-text",disabled:!!D,onClick:()=>E("project"),children:[u.jsx(Q,{size:14}),f("history.restoreProject")]})]})]}),T&&u.jsxs("div",{className:"history-label",children:[u.jsxs("label",{children:[u.jsx(he,{size:14}),u.jsx("input",{value:b,maxLength:80,placeholder:f("history.labelPlaceholder"),onChange:d=>p(d.target.value)})]}),u.jsxs("button",{disabled:D==="label"||b.trim()===(l.version.label??""),onClick:()=>{Z()},children:[D==="label"?u.jsx(U,{className:"spin",size:13}):u.jsx(ae,{size:13}),f("history.saveLabel")]})]}),u.jsxs("div",{className:"history-files",children:[u.jsx("div",{className:"history-file-list",children:l.files.map(d=>{const w=l.version.changedPaths.includes(d.path);return u.jsxs("button",{className:d.path===g?"active":"",title:d.path,onClick:()=>{c(d.path),m(null)},children:[u.jsx(te,{size:13}),u.jsx("span",{children:d.path}),w&&u.jsx("small",{children:f("history.changed")})]},d.path)})}),u.jsxs("div",{className:"history-file-actions",children:[u.jsxs("button",{disabled:!g||!!D,onClick:()=>{B()},children:[D==="compare"?u.jsx(U,{className:"spin",size:13}):u.jsx(O,{size:13}),f("history.compareCurrent")]}),T&&u.jsxs("button",{disabled:!g||!!D,onClick:()=>E(g),children:[u.jsx(Q,{size:13}),f("history.restoreFile")]})]})]}),u.jsx("div",{className:"history-comparison",children:v?u.jsxs(u.Fragment,{children:[u.jsxs("header",{children:[u.jsx("strong",{children:v.path}),u.jsx("small",{children:f("history.comparingCurrent")})]}),u.jsx("pre",{children:x.map(([d,w],L)=>u.jsx("span",{className:d<0?"history-removed":d>0?"history-added":"",children:w},L))})]}):u.jsxs("div",{className:"history-comparison-empty",children:[u.jsx(O,{size:25}),u.jsx("span",{children:f("history.chooseFile")})]})})]})})]})]})}),u.jsx(G,{open:!!M,title:f(M==="project"?"history.restoreProjectTitle":"history.restoreFileTitle"),description:M==="project"?f("history.restoreProjectDescription"):f("history.restoreFileDescription",{path:M??""}),confirmLabel:f("history.restore"),danger:!0,onCancel:()=>E(null),onConfirm:()=>{q()}}),u.jsx(G,{open:!!_,title:f(_==="all"?"history.clearAllTitle":"history.deleteVersionTitle"),description:_==="all"?f("history.clearAllDescription"):f("history.deleteVersionDescription",{name:ee}),confirmLabel:f(_==="all"?"history.clearAll":"history.deleteVersion"),danger:!0,onCancel:()=>S(null),onConfirm:()=>{Y()}})]})}function W(C){return C<1024?`${C} B`:C<1024*1024?`${Math.round(C/102.4)/10} KB`:C<1024*1024*1024?`${Math.round(C/(1024*1024)*10)/10} MB`:`${Math.round(C/(1024*1024*1024)*10)/10} GB`}function $(C){return C instanceof Error?C.message:String(C)}function X(C){return C instanceof Error&&C.name==="AbortError"}export{ve as HistoryDialog};