legal-doc-editor 0.3.0 → 0.4.0
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.
- package/README.md +17 -1
- package/dist/LegalEditor.d.ts +4 -1
- package/dist/clauses.d.ts +8 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +204 -116
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
- 저장은 `.docx`와 `.hwpx`예요. `.hwpx`는 한글 2014 이상에서 열리고, 한글에서 `.hwp`로 다시 저장할 수 있어요
|
|
11
11
|
- 파일 변환 라이브러리는 필요할 때만 불러와서 에디터 본체 번들은 가벼워요
|
|
12
12
|
- **판례·법령 인용 링크**: 본문의 `민법 제750조`, `대법원 2016. 4. 28. 선고 2015다12345 판결`, `2024가단157033` 같은 인용을 알아보고 [국가법령정보센터](https://www.law.go.kr) 링크를 붙여요 (API 키가 필요 없어요)
|
|
13
|
+
- **조항 라이브러리**: 비밀유지·계약해지·관할법원 같은 자주 쓰는 조항을 골라 커서 위치에 넣어요. 조 번호는 알아서 다시 매겨져요
|
|
13
14
|
- **문서 템플릿**: 소장(대여금)·고소장(사기)·내용증명·지급명령 신청서를 `{{변수}}` 빈칸이 들어간 상태로 바로 시작해요
|
|
14
15
|
- **금액 표기**: 선택한 숫자를 `금 37,200,000원`이나 `금 삼천칠백이십만 원정(₩37,200,000)`으로 바꿔요
|
|
15
16
|
- **인쇄·PDF**: 비어 있는 변수는 손으로 쓰는 밑줄 칸으로 인쇄돼요
|
|
@@ -67,6 +68,20 @@ export default function Page() {
|
|
|
67
68
|
|
|
68
69
|
날짜(`2026. 9. 2.`), 전화번호, 계좌번호는 인용으로 보지 않아요. 다만 인용 인식은 글자 모양만 보는 것이라 놓치거나 잘못 잡을 수 있고, 링크가 가리키는 조문이 실제로 맞는지는 직접 확인해 주세요.
|
|
69
70
|
|
|
71
|
+
### 조항 라이브러리
|
|
72
|
+
|
|
73
|
+
`clauses`를 넘기면 오른쪽 패널에 조항 목록이 생겨요. 검색칸에서 제목이나 분류로 찾고, 누르면 커서 위치에 조항이 들어가요. 조항 안의 `{{변수}}`는 입력칸에 바로 나타나고 뒤쪽 조 번호는 알아서 밀려요.
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
import { LegalEditor, clauses } from 'legal-doc-editor'
|
|
77
|
+
|
|
78
|
+
<LegalEditor clauses={clauses} />
|
|
79
|
+
// 내 조항 더하기
|
|
80
|
+
<LegalEditor clauses={[...clauses, { id: 'my-sla', title: '서비스 수준', category: '의무', html: '<h2>(서비스 수준)</h2><p>…</p>' }]} />
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
기본 조항: 목적, 계약기간(자동 연장), 비밀유지, 손해배상, 계약의 해제·해지, 불가항력, 권리·의무의 양도 금지, 통지, 분쟁 해결(관할법원), 완전합의 및 계약의 변경, 계약의 해석. 일반적인 경우를 위한 예시 문장이니 계약에 맞게 고쳐 쓰세요.
|
|
84
|
+
|
|
70
85
|
### 판례 검색
|
|
71
86
|
|
|
72
87
|
`searchCases`에 검색 함수를 넘기면 오른쪽 패널에 **판례 검색** 칸이 생겨요. 결과를 누르면 커서 위치에 `대법원 2016. 4. 28. 선고 2015다12345 판결` 같은 인용 문구가 들어가고, 인용 링크도 자동으로 붙어요.
|
|
@@ -108,7 +123,8 @@ export default function Page() {
|
|
|
108
123
|
|
|
109
124
|
| 이름 | 설명 |
|
|
110
125
|
| --- | --- |
|
|
111
|
-
| `<LegalEditor content values onChange onValuesChange editable autoFees searchCases />` | 에디터 컴포넌트 |
|
|
126
|
+
| `<LegalEditor content values onChange onValuesChange editable autoFees searchCases clauses />` | 에디터 컴포넌트 |
|
|
127
|
+
| `clauses` | 기본 조항 목록 `{ id, title, category, html }[]` |
|
|
112
128
|
| `formatCaseCitation(result)` | 판례 검색 결과 → `대법원 2016. 4. 28. 선고 2015다12345 판결` |
|
|
113
129
|
| `calcStampFee(소가, { electronic })` | 소장 인지액(원) |
|
|
114
130
|
| `calcPaymentOrderStampFee(청구금액)` | 지급명령 신청서 인지대(원) — 종이 신청 기준 |
|
package/dist/LegalEditor.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Values } from './variable';
|
|
2
2
|
import { type CaseResult } from './citation';
|
|
3
|
+
import type { Clause } from './clauses';
|
|
3
4
|
import { type CourtFeeOptions } from './fees';
|
|
4
5
|
import './legal.css';
|
|
5
6
|
export interface LegalEditorProps {
|
|
@@ -14,5 +15,7 @@ export interface LegalEditorProps {
|
|
|
14
15
|
autoFees?: boolean | CourtFeeOptions;
|
|
15
16
|
/** 판례 검색 함수. 넘기면 오른쪽에 판례 검색 칸이 생기고, 결과를 누르면 인용 문구가 커서 위치에 들어감 */
|
|
16
17
|
searchCases?: (query: string) => Promise<CaseResult[]>;
|
|
18
|
+
/** 조항 목록. 넘기면 오른쪽에 조항 라이브러리가 생기고, 누르면 커서 위치에 조항이 들어감 (기본 제공 목록: `clauses`) */
|
|
19
|
+
clauses?: Clause[];
|
|
17
20
|
}
|
|
18
|
-
export declare function LegalEditor({ content, values: initial, onChange, onValuesChange, editable, autoFees, searchCases }: LegalEditorProps): import("react").JSX.Element;
|
|
21
|
+
export declare function LegalEditor({ content, values: initial, onChange, onValuesChange, editable, autoFees, searchCases, clauses }: LegalEditorProps): import("react").JSX.Element;
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export { calcStampFee, calcPaymentOrderStampFee, calcServiceFee, withCourtFees,
|
|
|
8
8
|
export type { CourtFeeOptions, Procedure } from './fees';
|
|
9
9
|
export { toKoreanAmount, formatAmount, parseAmount } from './amount';
|
|
10
10
|
export { templates } from './templates';
|
|
11
|
+
export { clauses } from './clauses';
|
|
12
|
+
export type { Clause } from './clauses';
|
|
11
13
|
export type { Template } from './templates';
|
|
12
14
|
export type { Values } from './variable';
|
|
13
15
|
export { toDocx, toHwpx, toPlainHtml, fromDocx, fromHwp, fromFile, normalizeLegalHtml } from './io';
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Plugin as u, PluginKey as d } from "@tiptap/pm/state";
|
|
|
7
7
|
import { Decoration as f, DecorationSet as p } from "@tiptap/pm/view";
|
|
8
8
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
9
|
//#region src/variable.ts
|
|
10
|
-
var
|
|
10
|
+
var g = s.create({
|
|
11
11
|
name: "variable",
|
|
12
12
|
group: "inline",
|
|
13
13
|
inline: !0,
|
|
@@ -61,9 +61,9 @@ var ee = s.create({
|
|
|
61
61
|
getAttributes: (e) => ({ name: e[0].slice(2, -2).trim() })
|
|
62
62
|
})];
|
|
63
63
|
}
|
|
64
|
-
}),
|
|
65
|
-
function
|
|
66
|
-
let n = new DOMParser().parseFromString(
|
|
64
|
+
}), _ = (e) => e.replace(/\{\{([^{}<>"]+)\}\}/g, (e, t) => `<span data-var="${t.trim().replace(/&/g, "&")}"></span>`);
|
|
65
|
+
function v(e, t) {
|
|
66
|
+
let n = new DOMParser().parseFromString(_(e), "text/html");
|
|
67
67
|
return n.querySelectorAll("span[data-var]").forEach((e) => {
|
|
68
68
|
let n = e.getAttribute("data-var");
|
|
69
69
|
e.replaceWith(t[n] || `[${n}]`);
|
|
@@ -71,7 +71,7 @@ function _(e, t) {
|
|
|
71
71
|
}
|
|
72
72
|
//#endregion
|
|
73
73
|
//#region src/numbering.ts
|
|
74
|
-
var
|
|
74
|
+
var y = 4, b = o.create({
|
|
75
75
|
name: "numbering",
|
|
76
76
|
priority: 1e3,
|
|
77
77
|
addGlobalAttributes() {
|
|
@@ -81,7 +81,7 @@ var v = 4, y = o.create({
|
|
|
81
81
|
default: null,
|
|
82
82
|
parseHTML: (e) => {
|
|
83
83
|
let t = Number(e.getAttribute("data-num"));
|
|
84
|
-
return t >= 1 && t <=
|
|
84
|
+
return t >= 1 && t <= y ? t : null;
|
|
85
85
|
},
|
|
86
86
|
renderHTML: (e) => e.num ? { "data-num": e.num } : {}
|
|
87
87
|
} }
|
|
@@ -93,7 +93,7 @@ var v = 4, y = o.create({
|
|
|
93
93
|
addKeyboardShortcuts() {
|
|
94
94
|
let e = () => this.editor.getAttributes("paragraph").num, t = (t) => () => {
|
|
95
95
|
let n = e();
|
|
96
|
-
return !!n && this.editor.commands.setNumbering(Math.min(
|
|
96
|
+
return !!n && this.editor.commands.setNumbering(Math.min(y, Math.max(1, n + t)));
|
|
97
97
|
};
|
|
98
98
|
return {
|
|
99
99
|
Tab: t(1),
|
|
@@ -105,7 +105,7 @@ var v = 4, y = o.create({
|
|
|
105
105
|
Enter: () => !!e() && this.editor.state.selection.$from.parent.content.size === 0 && this.editor.commands.setNumbering(null)
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
|
-
}),
|
|
108
|
+
}), x = String.raw`(?<!\d)\d{4}(?![만억천년월일원])[가-힣]{1,3}\d{1,6}(?!\d)`, S = String.raw`(?:[가-힣]{0,6}법원(?:\s*[가-힣]{2,6}지원)?|헌법재판소)`, C = String.raw`\d{4}\.\s*\d{1,2}\.\s*\d{1,2}\.`, ee = String.raw`${S}\s*${C}\s*(?:선고|자)\s*(?<caseNo>${x})(?:\s*[,·]\s*${x})*\s*(?:전원합의체\s*)?(?:판결|결정|명령)`, w = String.raw`(?:[가-힣]+(?<![은는이가을를와과로며고여하한된])\s+){0,4}[가-힣]+에\s*관한\s*[가-힣]*법률?|[가-힣]+법률?`, T = String.raw`(?<lawName>${w})\s*제\s*(?<jo>\d+)\s*조(?:\s*의\s*(?<ui>\d+))?(?:\s*제\s*\d+\s*(?:항|호))*`, E = new RegExp(String.raw`${ee}|${T}|(?<bare>${x})`, "g"), D = /^[방불합위적탈편문어용수요기비사입공]법$/, O = (...e) => `https://www.law.go.kr/${e.map(encodeURIComponent).join("/")}`;
|
|
109
109
|
function k(e) {
|
|
110
110
|
let t = [];
|
|
111
111
|
for (let n of e.matchAll(E)) {
|
|
@@ -138,7 +138,7 @@ var j = new d("citation"), M = (e) => {
|
|
|
138
138
|
rel: "noopener noreferrer"
|
|
139
139
|
}));
|
|
140
140
|
}), p.create(e, t);
|
|
141
|
-
},
|
|
141
|
+
}, N = o.create({
|
|
142
142
|
name: "citationLink",
|
|
143
143
|
addProseMirrorPlugins() {
|
|
144
144
|
return [new u({
|
|
@@ -159,21 +159,21 @@ var j = new d("citation"), M = (e) => {
|
|
|
159
159
|
});
|
|
160
160
|
//#endregion
|
|
161
161
|
//#region src/fees.ts
|
|
162
|
-
function
|
|
162
|
+
function P(e, t = {}) {
|
|
163
163
|
if (!(e > 0)) return 0;
|
|
164
|
-
let n =
|
|
164
|
+
let n = F(e);
|
|
165
165
|
return t.electronic ? n < 1e7 ? 900 : Math.floor(n * 9 / 1e7) * 100 : n < 1e7 ? 1e3 : Math.floor(n / 1e6) * 100;
|
|
166
166
|
}
|
|
167
|
-
function
|
|
167
|
+
function F(e) {
|
|
168
168
|
let [t, n] = e < 1e7 ? [50, 0] : e < 1e8 ? [45, 5e3] : e < 1e9 ? [40, 55e3] : [35, 555e3];
|
|
169
169
|
return e * t + n * 1e4;
|
|
170
170
|
}
|
|
171
|
-
function
|
|
171
|
+
function I(e) {
|
|
172
172
|
if (!(e > 0)) return 0;
|
|
173
|
-
let t =
|
|
173
|
+
let t = F(e);
|
|
174
174
|
return t < 1e8 ? 1e3 : Math.floor(t / 1e7) * 100;
|
|
175
175
|
}
|
|
176
|
-
var
|
|
176
|
+
var L = {
|
|
177
177
|
소액: 10,
|
|
178
178
|
단독: 15,
|
|
179
179
|
합의: 15,
|
|
@@ -181,23 +181,23 @@ var I = {
|
|
|
181
181
|
상고: 8,
|
|
182
182
|
조정: 5,
|
|
183
183
|
독촉: 6
|
|
184
|
-
},
|
|
185
|
-
function
|
|
186
|
-
return e *
|
|
184
|
+
}, R = 5500;
|
|
185
|
+
function z({ parties: e, procedure: t, unitFee: n = R }) {
|
|
186
|
+
return e * L[t] * n;
|
|
187
187
|
}
|
|
188
|
-
var
|
|
189
|
-
function
|
|
190
|
-
let r = (n) =>
|
|
191
|
-
for (let a of e) n.test(a) && !t[a]?.trim() && (i[a] =
|
|
188
|
+
var te = 3e7, B = (e) => `${e.toLocaleString("ko-KR")}원`, ne = (e = "") => Number(e.replace(/[^\d]/g, "")) || 0;
|
|
189
|
+
function re(e, t, n = {}) {
|
|
190
|
+
let r = (n) => ne(t[e.find((e) => n.test(e)) ?? ""]), i = { ...t }, a = (n, r) => {
|
|
191
|
+
for (let a of e) n.test(a) && !t[a]?.trim() && (i[a] = B(r));
|
|
192
192
|
}, o = n.parties ?? 2, s = r(/^(소가|소송목적의\s*값)/);
|
|
193
|
-
s && (a(/^인지(액|대)/,
|
|
193
|
+
s && (a(/^인지(액|대)/, P(s, n)), a(/^송달료/, z({
|
|
194
194
|
parties: o,
|
|
195
195
|
procedure: s <= 3e7 ? "소액" : "단독",
|
|
196
196
|
unitFee: n.unitFee
|
|
197
197
|
})));
|
|
198
198
|
let c = r(/^청구금액/);
|
|
199
199
|
if (c && e.some((e) => /^독촉절차/.test(e))) {
|
|
200
|
-
let e = /^독촉절차\s*인지(액|대)/, t = /^독촉절차\s*송달료/, i =
|
|
200
|
+
let e = /^독촉절차\s*인지(액|대)/, t = /^독촉절차\s*송달료/, i = I(c), s = z({
|
|
201
201
|
parties: o,
|
|
202
202
|
procedure: "독촉",
|
|
203
203
|
unitFee: n.unitFee
|
|
@@ -208,50 +208,50 @@ function ae(e, t, n = {}) {
|
|
|
208
208
|
}
|
|
209
209
|
//#endregion
|
|
210
210
|
//#region src/amount.ts
|
|
211
|
-
var
|
|
211
|
+
var ie = "영일이삼사오육칠팔구", ae = [
|
|
212
212
|
"천",
|
|
213
213
|
"백",
|
|
214
214
|
"십",
|
|
215
215
|
""
|
|
216
|
-
],
|
|
216
|
+
], oe = [
|
|
217
217
|
"",
|
|
218
218
|
"만",
|
|
219
219
|
"억",
|
|
220
220
|
"조",
|
|
221
221
|
"경"
|
|
222
222
|
];
|
|
223
|
-
function
|
|
223
|
+
function V(e) {
|
|
224
224
|
if (!Number.isSafeInteger(e)) throw RangeError(`금액은 정수여야 해요: ${e}`);
|
|
225
225
|
if (e === 0) return "영";
|
|
226
|
-
if (e < 0) return `마이너스 ${
|
|
226
|
+
if (e < 0) return `마이너스 ${V(-e)}`;
|
|
227
227
|
let t = "", n = String(e).padStart(Math.ceil(String(e).length / 4) * 4, "0");
|
|
228
228
|
for (let e = 0; e < n.length / 4; e++) {
|
|
229
229
|
let r = n.slice(e * 4, e * 4 + 4);
|
|
230
230
|
if (r !== "0000") {
|
|
231
|
-
for (let e = 0; e < 4; e++) r[e] !== "0" && (t +=
|
|
232
|
-
t +=
|
|
231
|
+
for (let e = 0; e < 4; e++) r[e] !== "0" && (t += ie[+r[e]] + ae[e]);
|
|
232
|
+
t += oe[n.length / 4 - 1 - e];
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
return t;
|
|
236
236
|
}
|
|
237
|
-
var
|
|
238
|
-
function
|
|
237
|
+
var H = (e) => Number(e.replace(/[^\d]/g, "")) || 0;
|
|
238
|
+
function U(e, t = "소장") {
|
|
239
239
|
let n = e.toLocaleString("ko-KR");
|
|
240
|
-
return t === "소장" ? `금 ${n}원` : `금 ${
|
|
240
|
+
return t === "소장" ? `금 ${n}원` : `금 ${V(e)} 원정(₩${n})`;
|
|
241
241
|
}
|
|
242
242
|
//#endregion
|
|
243
243
|
//#region src/io.ts
|
|
244
|
-
var
|
|
244
|
+
var se = (e) => e < 20 ? String.fromCharCode(9312 + e) : `${e + 1}.`, W = "가나다라마바사아자차카타파하", G = (e) => {
|
|
245
245
|
let t = "";
|
|
246
|
-
for (; e > 0; e = Math.floor(e / 14)) t =
|
|
246
|
+
for (; e > 0; e = Math.floor(e / 14)) t = W[--e % 14] + t;
|
|
247
247
|
return t;
|
|
248
|
-
},
|
|
248
|
+
}, ce = (e, t) => [
|
|
249
249
|
`${t}.`,
|
|
250
|
-
`${
|
|
250
|
+
`${G(t)}.`,
|
|
251
251
|
`(${t})`,
|
|
252
|
-
`(${
|
|
252
|
+
`(${G(t)})`
|
|
253
253
|
][e - 1];
|
|
254
|
-
function
|
|
254
|
+
function K(e, t) {
|
|
255
255
|
let n = [], r = 0, i = (e = []) => e.map((e) => {
|
|
256
256
|
if (e.type === "hardBreak") return {
|
|
257
257
|
text: "",
|
|
@@ -271,7 +271,7 @@ function W(e, t) {
|
|
|
271
271
|
bold: !0
|
|
272
272
|
})), o = (e, t) => e.content?.forEach((r, a) => r.content?.forEach((r, s) => {
|
|
273
273
|
if (r.type === "orderedList" || r.type === "bulletList") return o(r, t + 1);
|
|
274
|
-
let c = a + (e.attrs?.start ?? 1), l = s > 0 ? "" : e.type === "bulletList" ? "•" : t === 0 ?
|
|
274
|
+
let c = a + (e.attrs?.start ?? 1), l = s > 0 ? "" : e.type === "bulletList" ? "•" : t === 0 ? se(c - 1) : `${c}.`;
|
|
275
275
|
n.push({
|
|
276
276
|
kind: "para",
|
|
277
277
|
label: l,
|
|
@@ -304,7 +304,7 @@ function W(e, t) {
|
|
|
304
304
|
runs: a(i(t.content))
|
|
305
305
|
}) : t.type === "orderedList" || t.type === "bulletList" ? o(t, 0) : l ? (s[l]++, s.fill(0, l + 1), n.push({
|
|
306
306
|
kind: "para",
|
|
307
|
-
label:
|
|
307
|
+
label: ce(l, s[l]),
|
|
308
308
|
depth: l,
|
|
309
309
|
runs: i(t.content)
|
|
310
310
|
})) : t.type === "paragraph" ? n.push({
|
|
@@ -327,26 +327,26 @@ function W(e, t) {
|
|
|
327
327
|
};
|
|
328
328
|
return c(e.content), n;
|
|
329
329
|
}
|
|
330
|
-
var
|
|
330
|
+
var le = (e) => e.replace(/[&<>"]/g, (e) => `&#${e.charCodeAt(0)};`), q = (e) => e.map((e) => {
|
|
331
331
|
if (e.br) return "<br>";
|
|
332
|
-
let t =
|
|
332
|
+
let t = le(e.text);
|
|
333
333
|
return e.bold && (t = `<b>${t}</b>`), e.italics && (t = `<i>${t}</i>`), e.underline && (t = `<u>${t}</u>`), e.strike && (t = `<s>${t}</s>`), t;
|
|
334
334
|
}).join("");
|
|
335
|
-
function
|
|
336
|
-
return
|
|
335
|
+
function ue(e, t) {
|
|
336
|
+
return K(e, t).map((e) => {
|
|
337
337
|
if (e.kind === "table") {
|
|
338
|
-
let t = (e) => `<td${e.colspan > 1 ? ` colspan="${e.colspan}"` : ""}${e.rowspan > 1 ? ` rowspan="${e.rowspan}"` : ""}>${
|
|
338
|
+
let t = (e) => `<td${e.colspan > 1 ? ` colspan="${e.colspan}"` : ""}${e.rowspan > 1 ? ` rowspan="${e.rowspan}"` : ""}>${q(e.runs)}</td>`;
|
|
339
339
|
return `<table>${e.rows.map((e) => `<tr>${e.map(t).join("")}</tr>`).join("")}</table>`;
|
|
340
340
|
}
|
|
341
|
-
let t = (e.label ? e.kind === "article" ? `<b>${e.label}</b> ` : `${e.label} ` : "") +
|
|
341
|
+
let t = (e.label ? e.kind === "article" ? `<b>${e.label}</b> ` : `${e.label} ` : "") + q(e.runs);
|
|
342
342
|
if (e.kind === "title") return `<h1>${t}</h1>`;
|
|
343
343
|
if (e.kind === "section") return `<h3>${t}</h3>`;
|
|
344
344
|
let n = e.label ? e.depth - 1 : e.depth;
|
|
345
345
|
return n > 0 ? `<p style="margin-left:${n * 2}em">${t}</p>` : `<p>${t}</p>`;
|
|
346
346
|
}).join("\n");
|
|
347
347
|
}
|
|
348
|
-
function
|
|
349
|
-
for (let n of
|
|
348
|
+
function de(e, t) {
|
|
349
|
+
for (let n of K(e, t)) if (n.kind === "title") return n.runs.map((e) => e.text).join("").trim() || "문서";
|
|
350
350
|
return "문서";
|
|
351
351
|
}
|
|
352
352
|
async function fe(e, t) {
|
|
@@ -357,7 +357,7 @@ async function fe(e, t) {
|
|
|
357
357
|
italics: e.italics,
|
|
358
358
|
strike: e.strike,
|
|
359
359
|
underline: e.underline ? {} : void 0
|
|
360
|
-
}), p =
|
|
360
|
+
}), p = K(e, t).map((e) => e.kind === "table" ? new s({
|
|
361
361
|
width: {
|
|
362
362
|
size: 100,
|
|
363
363
|
type: d.PERCENTAGE
|
|
@@ -381,7 +381,7 @@ async function fe(e, t) {
|
|
|
381
381
|
})] : [], ...e.runs.map(f)]
|
|
382
382
|
}));
|
|
383
383
|
return a.toBlob(new r({
|
|
384
|
-
title:
|
|
384
|
+
title: de(e, t),
|
|
385
385
|
styles: {
|
|
386
386
|
default: { document: { run: {
|
|
387
387
|
font: "바탕",
|
|
@@ -407,14 +407,14 @@ async function fe(e, t) {
|
|
|
407
407
|
}));
|
|
408
408
|
}
|
|
409
409
|
async function pe(e, t) {
|
|
410
|
-
let { htmlToHwpx: n } = await import("hwp-convert"), r = await n(
|
|
410
|
+
let { htmlToHwpx: n } = await import("hwp-convert"), r = await n(ue(e, t), { title: de(e, t) });
|
|
411
411
|
return new Blob([r], { type: "application/hwp+zip" });
|
|
412
412
|
}
|
|
413
413
|
var J = /^\s*제\s*\d+\s*조(?:의\s*\d+)?\s*/, me = /^\s*[①-⑳]\s*/, Y = /^\s*(\d+)\.\s*/, he = /^(청구취지|청구원인|신청취지|신청이유|고소취지|고소이유|고발취지|고발이유|입증방법|증명방법|증거방법|증거서류|첨부서류|당사자관계|사건개요|고소인|피고소인|범죄사실|증거자료|관련사건의수사및재판여부|기타)$/, ge = (e) => e.length <= 20 && (/^[가-힣](\s+[가-힣]){3,7}$/.test(e) || he.test(e.replace(/\s/g, ""))), _e = /\[\s*([^[\]{}<>"\d=]{1,20}?)\s*\]/g, ve = [
|
|
414
414
|
[/^\s*(\d{1,2})\.(?!\d)\s*/, Number],
|
|
415
|
-
[/^\s*([가나다라마바사아자차카타파하])\.\s*/, (e) =>
|
|
415
|
+
[/^\s*([가나다라마바사아자차카타파하])\.\s*/, (e) => W.indexOf(e) + 1],
|
|
416
416
|
[/^\s*\((\d{1,2})\)\s*/, Number],
|
|
417
|
-
[/^\s*\(([가나다라마바사아자차카타파하])\)\s*/, (e) =>
|
|
417
|
+
[/^\s*\(([가나다라마바사아자차카타파하])\)\s*/, (e) => W.indexOf(e) + 1]
|
|
418
418
|
];
|
|
419
419
|
function ye(e) {
|
|
420
420
|
for (let [t, [n, r]] of ve.entries()) {
|
|
@@ -516,8 +516,8 @@ function Ce(e, t) {
|
|
|
516
516
|
let n = document.createElement("a");
|
|
517
517
|
n.href = URL.createObjectURL(e), n.download = t, n.click(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
|
|
518
518
|
}
|
|
519
|
-
function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, editable: u = !0, autoFees: d, searchCases: f }) {
|
|
520
|
-
let [
|
|
519
|
+
function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, editable: u = !0, autoFees: d, searchCases: f, clauses: p }) {
|
|
520
|
+
let [v, y] = t(s), [x, S] = t([]), [C, ee] = t(""), [w, T] = t(null), [E, D] = t(""), [O, k] = t(""), j = d ? re(x, v, d === !0 ? {} : d) : v, M = r({
|
|
521
521
|
extensions: [
|
|
522
522
|
i.configure({ heading: { levels: [
|
|
523
523
|
1,
|
|
@@ -525,81 +525,81 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
525
525
|
3
|
|
526
526
|
] } }),
|
|
527
527
|
a,
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
528
|
+
g,
|
|
529
|
+
b,
|
|
530
|
+
N
|
|
531
531
|
],
|
|
532
|
-
content:
|
|
532
|
+
content: _(o),
|
|
533
533
|
editable: u,
|
|
534
534
|
immediatelyRender: !1,
|
|
535
535
|
editorProps: { attributes: { class: "legal-doc" } },
|
|
536
|
-
onCreate: ({ editor: e }) =>
|
|
536
|
+
onCreate: ({ editor: e }) => S($(e)),
|
|
537
537
|
onUpdate: ({ editor: e }) => {
|
|
538
|
-
|
|
538
|
+
S($(e)), c?.(e.getHTML());
|
|
539
539
|
}
|
|
540
540
|
});
|
|
541
541
|
e(() => {
|
|
542
|
-
|
|
543
|
-
}, [
|
|
544
|
-
let
|
|
542
|
+
M && (M.storage.variable.values = j, M.storage.variable.views.forEach((e) => e()));
|
|
543
|
+
}, [M, j]);
|
|
544
|
+
let P = (e, t) => {
|
|
545
545
|
let n = {
|
|
546
|
-
...
|
|
546
|
+
...v,
|
|
547
547
|
[e]: t
|
|
548
548
|
};
|
|
549
|
-
|
|
550
|
-
},
|
|
549
|
+
y(n), l?.(n);
|
|
550
|
+
}, F = () => {
|
|
551
551
|
let e = window.prompt("변수 이름 (예: 갑, 계약일)")?.replace(/[{}<>"]/g, "").trim();
|
|
552
|
-
e &&
|
|
552
|
+
e && M?.chain().focus().insertContent({
|
|
553
553
|
type: "variable",
|
|
554
554
|
attrs: { name: e }
|
|
555
555
|
}).run();
|
|
556
|
-
},
|
|
556
|
+
}, I = async (e) => {
|
|
557
557
|
let t = e.target.files?.[0];
|
|
558
|
-
if (e.target.value = "", t &&
|
|
559
|
-
|
|
558
|
+
if (e.target.value = "", t && M) try {
|
|
559
|
+
M.commands.setContent(_(await Q(t)), { emitUpdate: !0 });
|
|
560
560
|
} catch (e) {
|
|
561
561
|
window.alert(`파일을 열 수 없어요: ${e.message}`);
|
|
562
562
|
}
|
|
563
|
-
},
|
|
564
|
-
let n =
|
|
565
|
-
Ce(await e(
|
|
566
|
-
},
|
|
567
|
-
let e =
|
|
563
|
+
}, L = async (e, t) => {
|
|
564
|
+
let n = M.state.doc.firstChild?.textContent.trim() || "문서";
|
|
565
|
+
Ce(await e(M.getJSON(), j), `${n}.${t}`);
|
|
566
|
+
}, R = async () => {
|
|
567
|
+
let e = C.trim();
|
|
568
568
|
if (f && e) {
|
|
569
|
-
|
|
569
|
+
D("검색 중…");
|
|
570
570
|
try {
|
|
571
|
-
|
|
571
|
+
T(await f(e)), D("");
|
|
572
572
|
} catch (e) {
|
|
573
|
-
|
|
573
|
+
T(null), D(`검색하지 못했어요: ${e.message}`);
|
|
574
574
|
}
|
|
575
575
|
}
|
|
576
|
-
},
|
|
577
|
-
let { from: t, to: n } =
|
|
578
|
-
r &&
|
|
576
|
+
}, z = () => M.chain().focus(), te = (e) => z().setNumbering(M.getAttributes("paragraph").num === e ? null : e).run(), B = (e) => {
|
|
577
|
+
let { from: t, to: n } = M.state.selection, r = H(M.state.doc.textBetween(t, n));
|
|
578
|
+
r && z().insertContentAt({
|
|
579
579
|
from: t,
|
|
580
580
|
to: n
|
|
581
|
-
},
|
|
581
|
+
}, U(r, e)).run();
|
|
582
582
|
};
|
|
583
583
|
return /* @__PURE__ */ h("div", {
|
|
584
584
|
className: "le-root",
|
|
585
585
|
children: [/* @__PURE__ */ h("div", {
|
|
586
586
|
className: "le-main",
|
|
587
|
-
children: [u &&
|
|
587
|
+
children: [u && M && /* @__PURE__ */ h("div", {
|
|
588
588
|
className: "le-toolbar",
|
|
589
589
|
children: [
|
|
590
590
|
/* @__PURE__ */ m("button", {
|
|
591
591
|
type: "button",
|
|
592
|
-
onClick: () =>
|
|
592
|
+
onClick: () => z().toggleHeading({ level: 1 }).run(),
|
|
593
593
|
children: "제목"
|
|
594
594
|
}),
|
|
595
595
|
/* @__PURE__ */ m("button", {
|
|
596
596
|
type: "button",
|
|
597
|
-
onClick: () =>
|
|
597
|
+
onClick: () => z().toggleHeading({ level: 3 }).run(),
|
|
598
598
|
children: "소제목"
|
|
599
599
|
}),
|
|
600
600
|
/* @__PURE__ */ m("button", {
|
|
601
601
|
type: "button",
|
|
602
|
-
onClick: () =>
|
|
602
|
+
onClick: () => z().toggleHeading({ level: 2 }).run(),
|
|
603
603
|
children: "조"
|
|
604
604
|
}),
|
|
605
605
|
[
|
|
@@ -610,37 +610,37 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
610
610
|
].map((e, t) => /* @__PURE__ */ m("button", {
|
|
611
611
|
type: "button",
|
|
612
612
|
title: "번호 문단 — Tab·Shift+Tab 단계 변경, 맨 앞 Backspace 해제",
|
|
613
|
-
onClick: () =>
|
|
613
|
+
onClick: () => te(t + 1),
|
|
614
614
|
children: e
|
|
615
615
|
}, e)),
|
|
616
616
|
/* @__PURE__ */ m("button", {
|
|
617
617
|
type: "button",
|
|
618
|
-
onClick: () =>
|
|
618
|
+
onClick: () => z().toggleOrderedList().run(),
|
|
619
619
|
children: "항"
|
|
620
620
|
}),
|
|
621
621
|
/* @__PURE__ */ m("button", {
|
|
622
622
|
type: "button",
|
|
623
|
-
onClick: () =>
|
|
623
|
+
onClick: () => z().sinkListItem("listItem").run(),
|
|
624
624
|
children: "호 →"
|
|
625
625
|
}),
|
|
626
626
|
/* @__PURE__ */ m("button", {
|
|
627
627
|
type: "button",
|
|
628
|
-
onClick: () =>
|
|
628
|
+
onClick: () => z().liftListItem("listItem").run(),
|
|
629
629
|
children: "← 내어쓰기"
|
|
630
630
|
}),
|
|
631
631
|
/* @__PURE__ */ m("button", {
|
|
632
632
|
type: "button",
|
|
633
|
-
onClick: () =>
|
|
633
|
+
onClick: () => z().toggleBold().run(),
|
|
634
634
|
children: /* @__PURE__ */ m("b", { children: "B" })
|
|
635
635
|
}),
|
|
636
636
|
/* @__PURE__ */ h("button", {
|
|
637
637
|
type: "button",
|
|
638
|
-
onClick:
|
|
638
|
+
onClick: F,
|
|
639
639
|
children: ["{{ }}", " 변수"]
|
|
640
640
|
}),
|
|
641
641
|
/* @__PURE__ */ m("button", {
|
|
642
642
|
type: "button",
|
|
643
|
-
onClick: () =>
|
|
643
|
+
onClick: () => z().insertTable({
|
|
644
644
|
rows: 3,
|
|
645
645
|
cols: 3,
|
|
646
646
|
withHeaderRow: !1
|
|
@@ -650,13 +650,13 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
650
650
|
/* @__PURE__ */ m("button", {
|
|
651
651
|
type: "button",
|
|
652
652
|
title: "선택한 금액 → 금 37,200,000원",
|
|
653
|
-
onClick: () =>
|
|
653
|
+
onClick: () => B("소장"),
|
|
654
654
|
children: "금액"
|
|
655
655
|
}),
|
|
656
656
|
/* @__PURE__ */ m("button", {
|
|
657
657
|
type: "button",
|
|
658
658
|
title: "선택한 금액 → 금 삼천칠백이십만 원정(₩37,200,000)",
|
|
659
|
-
onClick: () =>
|
|
659
|
+
onClick: () => B("계약서"),
|
|
660
660
|
children: "금액(한글)"
|
|
661
661
|
}),
|
|
662
662
|
/* @__PURE__ */ m("span", { className: "le-spacer" }),
|
|
@@ -666,17 +666,17 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
666
666
|
type: "file",
|
|
667
667
|
accept: ".docx,.hwp,.hwpx",
|
|
668
668
|
hidden: !0,
|
|
669
|
-
onChange:
|
|
669
|
+
onChange: I
|
|
670
670
|
})]
|
|
671
671
|
}),
|
|
672
672
|
/* @__PURE__ */ m("button", {
|
|
673
673
|
type: "button",
|
|
674
|
-
onClick: () =>
|
|
674
|
+
onClick: () => L(fe, "docx"),
|
|
675
675
|
children: "Word 저장"
|
|
676
676
|
}),
|
|
677
677
|
/* @__PURE__ */ m("button", {
|
|
678
678
|
type: "button",
|
|
679
|
-
onClick: () =>
|
|
679
|
+
onClick: () => L(pe, "hwpx"),
|
|
680
680
|
children: "한글 저장"
|
|
681
681
|
}),
|
|
682
682
|
/* @__PURE__ */ m("button", {
|
|
@@ -685,12 +685,12 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
685
685
|
children: "인쇄 · PDF"
|
|
686
686
|
})
|
|
687
687
|
]
|
|
688
|
-
}), /* @__PURE__ */ m(n, { editor:
|
|
688
|
+
}), /* @__PURE__ */ m(n, { editor: M })]
|
|
689
689
|
}), /* @__PURE__ */ h("aside", {
|
|
690
690
|
className: "le-panel",
|
|
691
691
|
children: [
|
|
692
692
|
/* @__PURE__ */ m("h3", { children: "입력값" }),
|
|
693
|
-
|
|
693
|
+
x.length === 0 && /* @__PURE__ */ h("p", {
|
|
694
694
|
className: "le-hint",
|
|
695
695
|
children: [
|
|
696
696
|
"본문에 ",
|
|
@@ -698,11 +698,32 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
698
698
|
"처럼 입력하면 변수가 생겨요."
|
|
699
699
|
]
|
|
700
700
|
}),
|
|
701
|
-
|
|
702
|
-
value:
|
|
703
|
-
placeholder:
|
|
704
|
-
onChange: (t) =>
|
|
701
|
+
x.map((e) => /* @__PURE__ */ h("label", { children: [e, /* @__PURE__ */ m("input", {
|
|
702
|
+
value: v[e] ?? "",
|
|
703
|
+
placeholder: v[e] ? void 0 : j[e],
|
|
704
|
+
onChange: (t) => P(e, t.target.value)
|
|
705
705
|
})] }, e)),
|
|
706
|
+
p && /* @__PURE__ */ h("section", {
|
|
707
|
+
className: "le-clauses",
|
|
708
|
+
children: [
|
|
709
|
+
/* @__PURE__ */ m("h3", { children: "조항 라이브러리" }),
|
|
710
|
+
/* @__PURE__ */ m("input", {
|
|
711
|
+
value: O,
|
|
712
|
+
placeholder: "조항 찾기 (예: 해지)",
|
|
713
|
+
onChange: (e) => k(e.target.value)
|
|
714
|
+
}),
|
|
715
|
+
/* @__PURE__ */ m("ul", {
|
|
716
|
+
className: "le-clause-list",
|
|
717
|
+
children: p.filter((e) => `${e.category} ${e.title}`.includes(O.trim())).map((e) => /* @__PURE__ */ m("li", { children: /* @__PURE__ */ h("button", {
|
|
718
|
+
type: "button",
|
|
719
|
+
disabled: !u,
|
|
720
|
+
title: "커서 위치에 조항 넣기",
|
|
721
|
+
onClick: () => M?.chain().focus().insertContent(_(e.html), { parseOptions: { preserveWhitespace: !1 } }).run(),
|
|
722
|
+
children: [/* @__PURE__ */ m("small", { children: e.category }), e.title]
|
|
723
|
+
}) }, e.id))
|
|
724
|
+
})
|
|
725
|
+
]
|
|
726
|
+
}),
|
|
706
727
|
f && /* @__PURE__ */ h("section", {
|
|
707
728
|
className: "le-cases",
|
|
708
729
|
children: [
|
|
@@ -710,33 +731,33 @@ function we({ content: o = "", values: s = {}, onChange: c, onValuesChange: l, e
|
|
|
710
731
|
/* @__PURE__ */ h("div", {
|
|
711
732
|
className: "le-cases-bar",
|
|
712
733
|
children: [/* @__PURE__ */ m("input", {
|
|
713
|
-
value:
|
|
734
|
+
value: C,
|
|
714
735
|
placeholder: "사건명·사건번호·키워드",
|
|
715
|
-
onChange: (e) =>
|
|
736
|
+
onChange: (e) => ee(e.target.value),
|
|
716
737
|
onKeyDown: (e) => {
|
|
717
|
-
e.key === "Enter" && !e.nativeEvent.isComposing && (e.preventDefault(),
|
|
738
|
+
e.key === "Enter" && !e.nativeEvent.isComposing && (e.preventDefault(), R());
|
|
718
739
|
}
|
|
719
740
|
}), /* @__PURE__ */ m("button", {
|
|
720
741
|
type: "button",
|
|
721
|
-
onClick:
|
|
742
|
+
onClick: R,
|
|
722
743
|
children: "검색"
|
|
723
744
|
})]
|
|
724
745
|
}),
|
|
725
|
-
|
|
746
|
+
E && /* @__PURE__ */ m("p", {
|
|
726
747
|
className: "le-hint",
|
|
727
|
-
children:
|
|
748
|
+
children: E
|
|
728
749
|
}),
|
|
729
|
-
!
|
|
750
|
+
!E && w?.length === 0 && /* @__PURE__ */ m("p", {
|
|
730
751
|
className: "le-hint",
|
|
731
752
|
children: "결과가 없어요."
|
|
732
753
|
}),
|
|
733
754
|
/* @__PURE__ */ m("ul", {
|
|
734
755
|
className: "le-case-list",
|
|
735
|
-
children:
|
|
756
|
+
children: w?.map((e) => /* @__PURE__ */ h("li", { children: [/* @__PURE__ */ h("button", {
|
|
736
757
|
type: "button",
|
|
737
758
|
disabled: !u,
|
|
738
759
|
title: "커서 위치에 인용 넣기",
|
|
739
|
-
onClick: () =>
|
|
760
|
+
onClick: () => M?.chain().focus().insertContent(A(e)).run(),
|
|
740
761
|
children: [
|
|
741
762
|
/* @__PURE__ */ m("strong", { children: e.title }),
|
|
742
763
|
/* @__PURE__ */ m("span", { children: A(e) }),
|
|
@@ -782,6 +803,73 @@ var Te = [
|
|
|
782
803
|
description: "재판 없이 법원의 지급명령을 받는 독촉절차 신청서. 인지대는 소장의 10분의 1, 송달료는 당사자 수 × 6회분",
|
|
783
804
|
html: "\n<h1>지 급 명 령 신 청 서</h1>\n<p>채 권 자 {{채권자 이름}}</p>\n<p>주소 {{채권자 주소}}</p>\n<p>연락처 {{채권자 연락처}}</p>\n<p>채 무 자 {{채무자 이름}}</p>\n<p>주소 {{채무자 주소}}</p>\n<p>대여금 청구 독촉사건</p>\n<p>청구금액 {{청구금액}}</p>\n<h3>신 청 취 지</h3>\n<p>채무자는 채권자에게 아래 청구금액 및 독촉절차비용을 지급하라는 명령을 구합니다.</p>\n<p data-num=\"1\">{{청구금액}}</p>\n<p data-num=\"1\">위 금액에 대하여 {{변제기 다음 날}}부터 이 사건 지급명령정본을 송달받은 날까지는 연 5%의, 그 다음 날부터 다 갚는 날까지는 연 12%의 각 비율로 계산한 돈</p>\n<p data-num=\"1\">독촉절차비용 {{독촉절차비용}} (인지대 {{독촉절차 인지대}}, 송달료 {{독촉절차 송달료}})</p>\n<h3>신 청 이 유</h3>\n<p data-num=\"1\">채권자는 {{대여일}} 채무자에게 {{청구금액}}을 변제기 {{변제기}}로 정하여 빌려주었습니다.</p>\n<p data-num=\"1\">그러나 채무자는 변제기가 지났는데도 위 돈을 갚지 않고 있습니다.</p>\n<p data-num=\"1\">따라서 채권자는 채무자에게 위 청구금액과 지연손해금 및 독촉절차비용의 지급을 구하기 위하여 이 신청에 이르렀습니다.</p>\n<h3>첨 부 서 류</h3>\n<p data-num=\"1\">차용증 사본 1통</p>\n<p data-num=\"1\">송달료 납부서 1통</p>\n<p>{{작성일}}</p>\n<p>채권자 {{채권자 이름}} (서명 또는 날인)</p>\n<p>{{관할 법원}} 귀중</p>\n"
|
|
784
805
|
}
|
|
806
|
+
], Ee = [
|
|
807
|
+
{
|
|
808
|
+
id: "purpose",
|
|
809
|
+
title: "목적",
|
|
810
|
+
category: "일반",
|
|
811
|
+
html: "<h2>(목적)</h2>\n<p>이 계약은 {{갑}}과 {{을}} 사이의 {{계약 대상}}에 관한 권리와 의무를 정하는 것을 목적으로 한다.</p>"
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
id: "term",
|
|
815
|
+
title: "계약기간",
|
|
816
|
+
category: "기간",
|
|
817
|
+
html: "<h2>(계약기간)</h2>\n<ol>\n <li><p>이 계약의 기간은 {{시작일}}부터 {{종료일}}까지로 한다.</p></li>\n <li><p>기간 만료 {{통지 기한}} 전까지 어느 당사자도 서면으로 종료 의사를 알리지 않으면, 이 계약은 같은 조건으로 {{연장 기간}} 연장된 것으로 본다.</p></li>\n</ol>"
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
id: "confidentiality",
|
|
821
|
+
title: "비밀유지",
|
|
822
|
+
category: "의무",
|
|
823
|
+
html: "<h2>(비밀유지)</h2>\n<ol>\n <li><p>각 당사자는 이 계약과 관련하여 알게 된 상대방의 기술상·경영상 정보를 상대방의 사전 서면 동의 없이 제3자에게 공개하거나 이 계약의 목적 외에 사용하지 아니한다.</p></li>\n <li><p>제1항의 의무는 이 계약이 끝난 뒤에도 {{비밀유지 기간}} 동안 유지된다.</p></li>\n</ol>"
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
id: "damages",
|
|
827
|
+
title: "손해배상",
|
|
828
|
+
category: "책임",
|
|
829
|
+
html: "<h2>(손해배상)</h2>\n<p>어느 당사자가 이 계약을 위반하여 상대방에게 손해를 입힌 경우 그 손해를 배상하여야 한다.</p>"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
id: "termination",
|
|
833
|
+
title: "계약의 해제·해지",
|
|
834
|
+
category: "종료",
|
|
835
|
+
html: "<h2>(계약의 해제·해지)</h2>\n<ol>\n <li><p>어느 당사자가 이 계약을 위반한 경우 상대방은 {{시정 기간}} 이상의 기간을 정하여 서면으로 시정을 요구하고, 그 기간 안에 시정되지 않으면 이 계약을 해제 또는 해지할 수 있다.</p></li>\n <li><p>다음 각 호의 어느 하나에 해당하면 상대방은 최고 없이 이 계약을 해제 또는 해지할 수 있다.</p>\n <ol>\n <li><p>어음·수표가 부도 처리되거나 파산·회생절차 개시 신청이 있는 경우</p></li>\n <li><p>강제집행, 가압류 또는 가처분을 받아 이 계약을 이행하기 어려운 경우</p></li>\n </ol>\n </li>\n <li><p>제1항 및 제2항에 따른 해제 또는 해지는 손해배상 청구에 영향을 미치지 아니한다.</p></li>\n</ol>"
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
id: "force-majeure",
|
|
839
|
+
title: "불가항력",
|
|
840
|
+
category: "책임",
|
|
841
|
+
html: "<h2>(불가항력)</h2>\n<p>천재지변, 전쟁, 감염병 확산, 정부의 조치 등 당사자가 통제할 수 없는 사유로 이 계약을 이행하지 못한 경우 그 당사자는 이행 지체나 불이행에 대한 책임을 지지 아니한다. 다만, 그 사유가 생긴 사실을 지체 없이 상대방에게 알려야 한다.</p>"
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
id: "no-assignment",
|
|
845
|
+
title: "권리·의무의 양도 금지",
|
|
846
|
+
category: "일반",
|
|
847
|
+
html: "<h2>(권리·의무의 양도 금지)</h2>\n<p>어느 당사자도 상대방의 사전 서면 동의 없이 이 계약상의 권리나 의무의 전부 또는 일부를 제3자에게 양도하거나 담보로 제공할 수 없다.</p>"
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
id: "notice",
|
|
851
|
+
title: "통지",
|
|
852
|
+
category: "일반",
|
|
853
|
+
html: "<h2>(통지)</h2>\n<ol>\n <li><p>이 계약에 따른 통지는 서면으로 하며, 각 당사자가 이 계약서에 적은 주소나 {{통지 받을 이메일}}로 보내어 상대방에게 도달한 때에 효력이 생긴다.</p></li>\n <li><p>주소나 연락처가 바뀐 당사자는 지체 없이 상대방에게 알려야 한다.</p></li>\n</ol>"
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
id: "dispute",
|
|
857
|
+
title: "분쟁 해결 (관할법원)",
|
|
858
|
+
category: "분쟁",
|
|
859
|
+
html: "<h2>(분쟁 해결)</h2>\n<ol>\n <li><p>이 계약과 관련하여 분쟁이 생기면 당사자는 먼저 성실히 협의하여 해결한다.</p></li>\n <li><p>협의로 해결되지 않은 분쟁에 관한 소송은 {{관할 법원}}을 제1심 관할법원으로 한다.</p></li>\n</ol>"
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
id: "entire-agreement",
|
|
863
|
+
title: "완전합의 및 계약의 변경",
|
|
864
|
+
category: "일반",
|
|
865
|
+
html: "<h2>(완전합의 및 계약의 변경)</h2>\n<ol>\n <li><p>이 계약은 계약 대상에 관한 당사자 사이의 완전한 합의이며, 이 계약 전에 있었던 구두 또는 서면의 합의보다 우선한다.</p></li>\n <li><p>이 계약의 변경은 당사자가 서명 또는 날인한 서면으로만 할 수 있다.</p></li>\n</ol>"
|
|
866
|
+
},
|
|
867
|
+
{
|
|
868
|
+
id: "interpretation",
|
|
869
|
+
title: "계약의 해석",
|
|
870
|
+
category: "일반",
|
|
871
|
+
html: "<h2>(계약의 해석)</h2>\n<p>이 계약에서 정하지 않은 사항이나 해석에 다툼이 있는 사항은 당사자가 서로 협의하여 정하고, 협의가 되지 않으면 관계 법령과 일반 거래 관행에 따른다.</p>"
|
|
872
|
+
}
|
|
785
873
|
];
|
|
786
874
|
//#endregion
|
|
787
|
-
export {
|
|
875
|
+
export { N as CitationLink, we as LegalEditor, b as Numbering, L as SERVICE_ROUNDS, R as SERVICE_UNIT_FEE, te as SMALL_CLAIM_LIMIT, g as Variable, I as calcPaymentOrderStampFee, z as calcServiceFee, P as calcStampFee, Ee as clauses, v as fillTemplate, k as findCitations, U as formatAmount, A as formatCaseCitation, be as fromDocx, Q as fromFile, xe as fromHwp, Z as normalizeLegalHtml, H as parseAmount, Te as templates, _ as toChips, fe as toDocx, pe as toHwpx, V as toKoreanAmount, ue as toPlainHtml, re as withCourtFees };
|
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
@counter-style le-circled{system:fixed;symbols:"①" "②" "③" "④" "⑤" "⑥" "⑦" "⑧" "⑨" "⑩" "⑪" "⑫" "⑬" "⑭" "⑮" "⑯" "⑰" "⑱" "⑲" "⑳";suffix:" "}.legal-doc{counter-reset:le-article le-n1 le-n2 le-n3 le-n4;color:#111;background:#fff;outline:none;max-width:760px;margin:0 auto;padding:56px 64px;font-family:Noto Serif KR,Nanum Myeongjo,Batang,serif;font-size:15px;line-height:1.85}.legal-doc h1{text-align:center;letter-spacing:.25em;margin:0 0 1.6em;font-size:1.6em}.legal-doc h2{counter-increment:le-article;margin:1.6em 0 .3em;font-size:1em}.legal-doc h2:before{content:"제" counter(le-article) "조 "}.legal-doc p{margin:0 0 .4em}.legal-doc ol{margin:0 0 .4em;padding-left:1.8em;list-style:le-circled}.legal-doc ol ol{list-style:decimal}.legal-doc li p{margin:0}.legal-doc h3{text-align:center;letter-spacing:.3em;margin:1.8em 0 .8em;font-size:1.05em}.legal-doc>h1,.legal-doc>h2,.legal-doc>h3{counter-set:le-n1 le-n2 le-n3 le-n4}.legal-doc>p[data-num]{padding-left:calc(var(--le-num-indent,0em) + 2em);text-indent:-2em}.legal-doc>p[data-num]:before{text-indent:0;min-width:2em;display:inline-block}.legal-doc>p[data-num="1"]{counter-increment:le-n1;counter-set:le-n2 le-n3 le-n4}.legal-doc>p[data-num="2"]{counter-increment:le-n2;counter-set:le-n3 le-n4;--le-num-indent:1.2em}.legal-doc>p[data-num="3"]{counter-increment:le-n3;counter-set:le-n4;--le-num-indent:2.4em}.legal-doc>p[data-num="4"]{counter-increment:le-n4;--le-num-indent:3.6em}.legal-doc>p[data-num="1"]:before{content:counter(le-n1) "."}.legal-doc>p[data-num="2"]:before{content:counter(le-n2, hangul) "."}.legal-doc>p[data-num="3"]:before{content:"(" counter(le-n3) ")"}.legal-doc>p[data-num="4"]:before{content:"(" counter(le-n4, hangul) ")"}.legal-doc .le-cite{color:inherit;text-underline-offset:3px;cursor:pointer;-webkit-text-decoration:underline dotted #3a56b4;text-decoration:underline dotted #3a56b4}.legal-doc .le-cite:hover{background:#eef2ff}.legal-doc .tableWrapper{overflow-x:auto}.legal-doc table{border-collapse:collapse;width:100%;margin:.6em 0;font-size:.93em}.legal-doc td,.legal-doc th{vertical-align:top;border:1px solid #555;padding:3px 6px}.legal-doc td p,.legal-doc th p{margin:0}.legal-doc .selectedCell{background:#e5edff}.le-root{background:#eef0f3;grid-template-columns:minmax(0,1fr) 260px;gap:16px;padding:16px;font:14px/1.5 system-ui,sans-serif;display:grid}.le-main{min-width:0}.le-toolbar{z-index:1;background:#fff;border-radius:8px;flex-wrap:wrap;gap:4px;max-width:760px;margin:0 auto 8px;padding:6px;display:flex;position:sticky;top:0;box-shadow:0 1px 2px #0001}.le-toolbar button,.le-toolbar .le-btn{cursor:pointer;font:inherit;background:#fff;border:1px solid #d0d4da;border-radius:6px;padding:4px 10px}.le-toolbar button:hover{background:#f3f5f8}.le-spacer{flex:1}.le-main .legal-doc{min-height:900px;box-shadow:0 1px 4px #0002}.le-var{color:#1d3f94;background:#e5edff;border-radius:3px;padding:0 3px}.le-var--empty{color:#8a5a00;background:#fff1c2}.le-panel{background:#fff;border-radius:8px;align-self:start;padding:14px;position:sticky;top:16px;box-shadow:0 1px 2px #0001}.le-panel h3{margin:0 0 10px;font-size:14px}.le-panel label{color:#444;gap:3px;margin-bottom:10px;font-size:13px;display:grid}.le-panel input{font:inherit;border:1px solid #d0d4da;border-radius:6px;padding:6px 8px}.le-hint{color:#777;margin:0;font-size:13px}.le-cases{border-top:1px solid #e3e6ea;margin-top:16px;padding-top:12px}.le-cases-bar{gap:4px;margin-bottom:8px;display:flex}.le-cases-bar input{flex:1;min-width:0}.le-cases-bar button,.le-case-list button{cursor:pointer;font:inherit;background:#fff;border:1px solid #d0d4da;border-radius:6px;padding:4px 8px}.le-case-list{gap:6px;margin:8px 0 0;padding:0;list-style:none;display:grid}.le-case-list li{gap:2px;display:grid}.le-case-list button{text-align:left;gap:2px;font-size:12px;display:grid}.le-case-list button:hover:not(:disabled){background:#f3f5f8}.le-case-list span,.le-case-list small{color:#555}.le-case-list a{color:#3a56b4;justify-self:end;font-size:12px}@media (width<=800px){.le-root{grid-template-columns:1fr}.legal-doc{padding:32px 24px}}@media print{.le-printing body *{visibility:hidden}.le-printing .legal-doc,.le-printing .legal-doc *{visibility:visible}.le-printing .legal-doc{width:100%;max-width:none;box-shadow:none;padding:0;position:absolute;top:0;left:0}.le-printing .le-var{color:inherit;background:0 0;padding:0}.le-printing .le-cite{background:0 0;text-decoration:none}.le-printing .le-var--empty{color:#0000;border-bottom:1px solid #000}}
|
|
1
|
+
@counter-style le-circled{system:fixed;symbols:"①" "②" "③" "④" "⑤" "⑥" "⑦" "⑧" "⑨" "⑩" "⑪" "⑫" "⑬" "⑭" "⑮" "⑯" "⑰" "⑱" "⑲" "⑳";suffix:" "}.legal-doc{counter-reset:le-article le-n1 le-n2 le-n3 le-n4;color:#111;background:#fff;outline:none;max-width:760px;margin:0 auto;padding:56px 64px;font-family:Noto Serif KR,Nanum Myeongjo,Batang,serif;font-size:15px;line-height:1.85}.legal-doc h1{text-align:center;letter-spacing:.25em;margin:0 0 1.6em;font-size:1.6em}.legal-doc h2{counter-increment:le-article;margin:1.6em 0 .3em;font-size:1em}.legal-doc h2:before{content:"제" counter(le-article) "조 "}.legal-doc p{margin:0 0 .4em}.legal-doc ol{margin:0 0 .4em;padding-left:1.8em;list-style:le-circled}.legal-doc ol ol{list-style:decimal}.legal-doc li p{margin:0}.legal-doc h3{text-align:center;letter-spacing:.3em;margin:1.8em 0 .8em;font-size:1.05em}.legal-doc>h1,.legal-doc>h2,.legal-doc>h3{counter-set:le-n1 le-n2 le-n3 le-n4}.legal-doc>p[data-num]{padding-left:calc(var(--le-num-indent,0em) + 2em);text-indent:-2em}.legal-doc>p[data-num]:before{text-indent:0;min-width:2em;display:inline-block}.legal-doc>p[data-num="1"]{counter-increment:le-n1;counter-set:le-n2 le-n3 le-n4}.legal-doc>p[data-num="2"]{counter-increment:le-n2;counter-set:le-n3 le-n4;--le-num-indent:1.2em}.legal-doc>p[data-num="3"]{counter-increment:le-n3;counter-set:le-n4;--le-num-indent:2.4em}.legal-doc>p[data-num="4"]{counter-increment:le-n4;--le-num-indent:3.6em}.legal-doc>p[data-num="1"]:before{content:counter(le-n1) "."}.legal-doc>p[data-num="2"]:before{content:counter(le-n2, hangul) "."}.legal-doc>p[data-num="3"]:before{content:"(" counter(le-n3) ")"}.legal-doc>p[data-num="4"]:before{content:"(" counter(le-n4, hangul) ")"}.legal-doc .le-cite{color:inherit;text-underline-offset:3px;cursor:pointer;-webkit-text-decoration:underline dotted #3a56b4;text-decoration:underline dotted #3a56b4}.legal-doc .le-cite:hover{background:#eef2ff}.legal-doc .tableWrapper{overflow-x:auto}.legal-doc table{border-collapse:collapse;width:100%;margin:.6em 0;font-size:.93em}.legal-doc td,.legal-doc th{vertical-align:top;border:1px solid #555;padding:3px 6px}.legal-doc td p,.legal-doc th p{margin:0}.legal-doc .selectedCell{background:#e5edff}.le-root{background:#eef0f3;grid-template-columns:minmax(0,1fr) 260px;gap:16px;padding:16px;font:14px/1.5 system-ui,sans-serif;display:grid}.le-main{min-width:0}.le-toolbar{z-index:1;background:#fff;border-radius:8px;flex-wrap:wrap;gap:4px;max-width:760px;margin:0 auto 8px;padding:6px;display:flex;position:sticky;top:0;box-shadow:0 1px 2px #0001}.le-toolbar button,.le-toolbar .le-btn{cursor:pointer;font:inherit;background:#fff;border:1px solid #d0d4da;border-radius:6px;padding:4px 10px}.le-toolbar button:hover{background:#f3f5f8}.le-spacer{flex:1}.le-main .legal-doc{min-height:900px;box-shadow:0 1px 4px #0002}.le-var{color:#1d3f94;background:#e5edff;border-radius:3px;padding:0 3px}.le-var--empty{color:#8a5a00;background:#fff1c2}.le-panel{background:#fff;border-radius:8px;align-self:start;padding:14px;position:sticky;top:16px;box-shadow:0 1px 2px #0001}.le-panel h3{margin:0 0 10px;font-size:14px}.le-panel label{color:#444;gap:3px;margin-bottom:10px;font-size:13px;display:grid}.le-panel input{font:inherit;border:1px solid #d0d4da;border-radius:6px;padding:6px 8px}.le-hint{color:#777;margin:0;font-size:13px}.le-cases{border-top:1px solid #e3e6ea;margin-top:16px;padding-top:12px}.le-cases-bar{gap:4px;margin-bottom:8px;display:flex}.le-cases-bar input{flex:1;min-width:0}.le-cases-bar button,.le-case-list button{cursor:pointer;font:inherit;background:#fff;border:1px solid #d0d4da;border-radius:6px;padding:4px 8px}.le-case-list{gap:6px;margin:8px 0 0;padding:0;list-style:none;display:grid}.le-case-list li{gap:2px;display:grid}.le-case-list button{text-align:left;gap:2px;font-size:12px;display:grid}.le-case-list button:hover:not(:disabled){background:#f3f5f8}.le-case-list span,.le-case-list small{color:#555}.le-case-list a{color:#3a56b4;justify-self:end;font-size:12px}.le-clauses{border-top:1px solid #e3e6ea;margin-top:16px;padding-top:12px}.le-clauses>input{box-sizing:border-box;width:100%;margin-bottom:6px}.le-clause-list{gap:4px;max-height:280px;margin:0;padding:0;list-style:none;display:grid;overflow-y:auto}.le-clause-list button{cursor:pointer;text-align:left;width:100%;font:inherit;background:#fff;border:1px solid #d0d4da;border-radius:6px;padding:4px 8px;font-size:12px}.le-clause-list button:hover:not(:disabled){background:#f3f5f8}.le-clause-list small{color:#3a56b4;margin-right:6px}@media (width<=800px){.le-root{grid-template-columns:1fr}.legal-doc{padding:32px 24px}}@media print{.le-printing body *{visibility:hidden}.le-printing .legal-doc,.le-printing .legal-doc *{visibility:visible}.le-printing .legal-doc{width:100%;max-width:none;box-shadow:none;padding:0;position:absolute;top:0;left:0}.le-printing .le-var{color:inherit;background:0 0;padding:0}.le-printing .le-cite{background:0 0;text-decoration:none}.le-printing .le-var--empty{color:#0000;border-bottom:1px solid #000}}
|
|
2
2
|
/*$vite$:1*/
|