@amiriel/core 0.0.1-beta.7

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Amiriel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ <p align="center">
2
+ <img src="https://amiriel.com/logo/amiriel_256x256.webp" alt="Amiriel logo" width="96" height="96" />
3
+ </p>
4
+
5
+ <h1 align="center">@amiriel/core</h1>
6
+
7
+ <p align="center">
8
+ Framework-agnostic TypeScript core for Amiriel letter documents.
9
+ </p>
10
+
11
+ `@amiriel/core` is the shared model and rules layer used by framework packages such as
12
+ [`@amiriel/vue`](https://github.com/Amirieljs/Amiriel-Vue) for Vue and
13
+ [`@amiriel/react`](https://github.com/Amirieljs/Amiriel-React) for React. It
14
+ contains no UI framework, DOM, storage, authentication, routing, or database
15
+ code.
16
+
17
+ [![npm version (beta)](https://img.shields.io/npm/v/@amiriel/core/beta?style=flat-square)](https://www.npmjs.com/package/@amiriel/core)
18
+ [![license](https://img.shields.io/npm/l/@amiriel/core?style=flat-square)](https://www.npmjs.com/package/@amiriel/core)
19
+ [![TypeScript](https://img.shields.io/badge/typescript-ready-3178C6?style=flat-square&logo=typescript&logoColor=white)]()
20
+
21
+ Prefer the short package name? Install [`amiriel`](https://www.npmjs.com/package/amiriel) instead — it re-exports everything from this package.
22
+
23
+ ## Features
24
+
25
+ - Shared Amiriel document types
26
+ - Document normalization helpers
27
+ - Paper size constraints and media placement math
28
+ - Built-in themes and CSS variable generation
29
+ - English and Chinese UI label helpers
30
+ - Font, text color, and video duration utilities
31
+ - Framework-agnostic ESM package with TypeScript declarations
32
+
33
+ ## Install
34
+
35
+ ```bash
36
+ npm install @amiriel/core@beta
37
+ pnpm add @amiriel/core@beta
38
+ yarn add @amiriel/core@beta
39
+ bun add @amiriel/core@beta
40
+ ```
41
+
42
+ Or use the meta package:
43
+
44
+ ```bash
45
+ npm install amiriel@beta
46
+ ```
47
+
48
+ ## Usage
49
+
50
+ ```ts
51
+ import {
52
+ normalizeDocument,
53
+ type AmirielDocument,
54
+ } from "@amiriel/core";
55
+
56
+ const document: AmirielDocument = normalizeDocument({
57
+ theme: "midnight",
58
+ media: [],
59
+ pages: [],
60
+ });
61
+ ```
62
+
63
+ ### Custom id generation
64
+
65
+ `normalizeDocument` may assign page or placement ids when input omits them.
66
+ In modern Node.js and browsers it uses `crypto.randomUUID()` when available.
67
+ You can also pass your own id factory:
68
+
69
+ ```ts
70
+ import { normalizeDocument } from "@amiriel/core";
71
+
72
+ const document = normalizeDocument(input, {
73
+ createId: () => `doc-${Date.now()}`,
74
+ });
75
+ ```
76
+
77
+ ### Themes
78
+
79
+ Built-in themes: `midnight`, `paper`, `memorial`.
80
+
81
+ ```ts
82
+ import {
83
+ amirielThemeCssVars,
84
+ findAmirielThemeDefinition,
85
+ } from "@amiriel/core";
86
+
87
+ const theme = findAmirielThemeDefinition("paper");
88
+ const cssVars = amirielThemeCssVars(theme);
89
+ ```
90
+
91
+ ### Labels
92
+
93
+ ```ts
94
+ import { resolveAmirielLabels } from "@amiriel/core";
95
+
96
+ const labels = resolveAmirielLabels("zh", {
97
+ uploadMedia: "选择照片或视频",
98
+ });
99
+ ```
100
+
101
+ ## Main Exports
102
+
103
+ | Export | Description |
104
+ | --- | --- |
105
+ | Document types | `AmirielDocument`, `AmirielPage`, `AmirielMedia`, and related shapes |
106
+ | `normalizeDocument` | Normalize document input into the shared Amiriel shape |
107
+ | Theme helpers | Built-in theme definitions, CSS variable generation, and merge utilities |
108
+ | Label helpers | Built-in English and Chinese UI labels with partial overrides |
109
+ | Placement math | Paper sizing, media placement, and text block normalization utilities |
110
+
111
+ ## Package Architecture
112
+
113
+ | npm package | Repository | Role |
114
+ | --- | --- | --- |
115
+ | `@amiriel/core` | [Amirieljs/Amiriel-Core](https://github.com/Amirieljs/Amiriel-Core) | Framework-agnostic core (this repo) |
116
+ | `amiriel` | [Amirieljs/Amiriel](https://github.com/Amirieljs/Amiriel) | Meta package re-exporting `@amiriel/core` |
117
+ | `@amiriel/vue` | [Amirieljs/Amiriel-Vue](https://github.com/Amirieljs/Amiriel-Vue) | Vue 3 implementation |
118
+ | `@amiriel/react` | [Amirieljs/Amiriel-React](https://github.com/Amirieljs/Amiriel-React) | React implementation |
119
+ | `@amiriel/vanilla` | [Amirieljs/Amiriel-Vanilla](https://github.com/Amirieljs/Amiriel-Vanilla) | Vanilla JS implementation |
120
+
121
+ Framework packages depend on `@amiriel/core` for document normalization, theme
122
+ definitions, labels, and placement math.
123
+
124
+ The full hosted product lives at [amiriel.com](https://amiriel.com).
125
+
126
+ ## License
127
+
128
+ MIT. The core package is open source and can be used commercially. The official
129
+ hosted Amiriel product at [amiriel.com](https://amiriel.com) may still provide
130
+ paid services around storage, accounts, delivery, hosting, collaboration, or
131
+ other product workflows.
@@ -0,0 +1,6 @@
1
+ export type { AmirielBuiltinTheme, AmirielDocument, AmirielEditorLimits, AmirielFont, AmirielIdFactory, AmirielLabels, AmirielLocale, AmirielMedia, AmirielMediaPlacement, AmirielMediaRequest, AmirielMediaUploadProgress, AmirielNormalizeOptions, AmirielPage, AmirielPaperSize, AmirielPaperSizeLimits, AmirielTextBlock, AmirielTextColor, AmirielTheme, } from "./types";
2
+ export type { AmirielPaperThemeVars, AmirielThemeDefinition } from "./themes";
3
+ export { AMIRIEL_DEFAULT_LABELS, formatAmirielLabel, resolveAmirielLabels, } from "./labels";
4
+ export { AMIRIEL_BUILTIN_THEME_DEFINITIONS, AMIRIEL_BUILTIN_THEME_IDS, amirielThemeCssVars, findAmirielThemeDefinition, mergeAmirielThemeDefinitions, themeDefaultTextColorFor, } from "./themes";
5
+ export { AMIRIEL_DEFAULT_PAPER_SIZE, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS, AMIRIEL_FONT_OPTIONS, AMIRIEL_FONT_STACKS, AMIRIEL_TEXT_COLORS, AMIRIEL_TEXT_COLOR_OPTIONS, AMIRIEL_THEME_DEFAULT_TEXT_COLOR, AMIRIEL_THEME_OPTIONS, clamp, combinedPageText, createAmirielId, fallbackHeightPercent, formatVideoDuration, heightPercentForWidth, mediaAspectRatio, mediaSizeWithinPaper, normalizeDocument, normalizeMediaPlacements, normalizePaperSize, normalizePaperSizeLimits, normalizePlacement, normalizeTextBlock, normalizeTextBlocks, safeAspectRatio, sortAmirielPages, syncPageText, themeDefaultTextBlockColor, widthPercentForHeight, } from "./utils";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,gCAAgC,EAChC,qBAAqB,EACrB,KAAK,EACL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { AMIRIEL_DEFAULT_LABELS, formatAmirielLabel, resolveAmirielLabels, } from "./labels";
2
+ export { AMIRIEL_BUILTIN_THEME_DEFINITIONS, AMIRIEL_BUILTIN_THEME_IDS, amirielThemeCssVars, findAmirielThemeDefinition, mergeAmirielThemeDefinitions, themeDefaultTextColorFor, } from "./themes";
3
+ export { AMIRIEL_DEFAULT_PAPER_SIZE, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS, AMIRIEL_FONT_OPTIONS, AMIRIEL_FONT_STACKS, AMIRIEL_TEXT_COLORS, AMIRIEL_TEXT_COLOR_OPTIONS, AMIRIEL_THEME_DEFAULT_TEXT_COLOR, AMIRIEL_THEME_OPTIONS, clamp, combinedPageText, createAmirielId, fallbackHeightPercent, formatVideoDuration, heightPercentForWidth, mediaAspectRatio, mediaSizeWithinPaper, normalizeDocument, normalizeMediaPlacements, normalizePaperSize, normalizePaperSizeLimits, normalizePlacement, normalizeTextBlock, normalizeTextBlocks, safeAspectRatio, sortAmirielPages, syncPageText, themeDefaultTextBlockColor, widthPercentForHeight, } from "./utils";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,gCAAgC,EAChC,qBAAqB,EACrB,KAAK,EACL,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AmirielLabels, AmirielLocale } from "./types";
2
+ export declare const AMIRIEL_DEFAULT_LABELS: Record<AmirielLocale, AmirielLabels>;
3
+ export declare function resolveAmirielLabels(locale?: AmirielLocale, labels?: Partial<AmirielLabels>): AmirielLabels;
4
+ export declare function formatAmirielLabel(template: string, values: Record<string, string | number>): string;
5
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,aAAa,CAuHvE,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,aAAoB,EAC5B,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAClC,aAAa,CAQf;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,UAE3F"}
package/dist/labels.js ADDED
@@ -0,0 +1,133 @@
1
+ export const AMIRIEL_DEFAULT_LABELS = {
2
+ en: {
3
+ themeLabel: "Reading atmosphere",
4
+ themes: { midnight: "Midnight envelope", paper: "Warm paper", memorial: "Quiet memorial" },
5
+ fonts: { system: "System", serif: "Serif", handwritten: "Handwritten" },
6
+ pagesCount: "Pages {count} / {max}",
7
+ paperSizeTitle: "Paper size",
8
+ paperWidth: "Width",
9
+ paperHeight: "Height",
10
+ paperSizeUnit: "px",
11
+ addPage: "Add page",
12
+ removePage: "Remove page",
13
+ pagePlaceholder: "Write to them, and to the part of you that is not ready to leave...",
14
+ textBlockPlaceholder: "Start writing...",
15
+ tapPaperHint: "Click blank paper to place a text block.",
16
+ textBlocksTitle: "Text blocks",
17
+ addTextBlock: "Add text block",
18
+ moveTextBlock: "Move text",
19
+ resizeTextBlock: "Resize text",
20
+ deleteTextBlock: "Delete text",
21
+ deleteTextBlockConfirm: "Deleted text cannot be recovered. Delete this text block?",
22
+ textBlockFont: "Block font",
23
+ textBlockFontSize: "Text size",
24
+ textBlockBold: "Bold",
25
+ textBlockItalic: "Italic",
26
+ textBlockUnderline: "Underline",
27
+ textBlockColor: "Text color",
28
+ textBlockOverflowHint: "Text exceeds the visible area. Enlarge the block or reduce the font size.",
29
+ textBlockLimit: "Text blocks {count} / {max}",
30
+ charCount: "{count} characters",
31
+ allMediaTitle: "Media",
32
+ uploadMedia: "Upload",
33
+ uploading: "Uploading",
34
+ compressingMedia: "Compressing",
35
+ uploadFailed: "Upload failed",
36
+ retryUpload: "Retry",
37
+ dismissFailedUpload: "Remove",
38
+ mediaUploadMissing: "No media upload handler is connected.",
39
+ mediaEmpty: "No photos or video yet.",
40
+ imageQuota: "Images {count} / {max}",
41
+ videoQuota: "Videos {count} / {max}",
42
+ pageMediaHint: "Use + in media to place a photo or video on this page.",
43
+ detachMedia: "Remove from this page",
44
+ removeMedia: "Delete media",
45
+ addMediaToPage: "Add to page",
46
+ resizeMedia: "Resize media",
47
+ viewFullscreen: "View fullscreen",
48
+ playMedia: "Play",
49
+ close: "Close",
50
+ image: "Image",
51
+ video: "Video",
52
+ prevPage: "Previous page",
53
+ nextPage: "Next page",
54
+ viewMedia: "View media",
55
+ viewOnGithub: "View on GitHub",
56
+ },
57
+ zh: {
58
+ themeLabel: "\u9605\u8bfb\u6c1b\u56f4",
59
+ themes: {
60
+ midnight: "\u6df1\u591c\u4fe1\u5c01",
61
+ paper: "\u6696\u7eb8\u706f\u5149",
62
+ memorial: "\u5b89\u9759\u7eaa\u5ff5",
63
+ },
64
+ fonts: {
65
+ system: "\u7cfb\u7edf\u5b57\u4f53",
66
+ serif: "\u886c\u7ebf\u5b57\u4f53",
67
+ handwritten: "\u624b\u5199\u611f\u5b57\u4f53",
68
+ },
69
+ pagesCount: "\u9875\u9762 {count} / {max}",
70
+ paperSizeTitle: "\u7eb8\u5f20\u5c3a\u5bf8",
71
+ paperWidth: "\u5bbd\u5ea6",
72
+ paperHeight: "\u9ad8\u5ea6",
73
+ paperSizeUnit: "px",
74
+ addPage: "\u6dfb\u52a0\u9875\u9762",
75
+ removePage: "\u5220\u9664\u9875\u9762",
76
+ pagePlaceholder: "\u5199\u7ed9\u4ed6\u4eec\uff0c\u4e5f\u5199\u7ed9\u90a3\u4e2a\u8fd8\u820d\u4e0d\u5f97\u79bb\u5f00\u7684\u81ea\u5df1...",
77
+ textBlockPlaceholder: "\u5728\u6b64\u8f93\u5165...",
78
+ tapPaperHint: "\u70b9\u51fb\u7eb8\u5f20\u7a7a\u767d\u5904\u653e\u7f6e\u6587\u5b57\u5757\u3002",
79
+ textBlocksTitle: "\u6587\u5b57\u5757",
80
+ addTextBlock: "\u6dfb\u52a0\u6587\u5b57\u5757",
81
+ moveTextBlock: "\u79fb\u52a8\u6587\u5b57",
82
+ resizeTextBlock: "\u7f29\u653e\u6587\u5b57",
83
+ deleteTextBlock: "\u5220\u9664\u6587\u5b57",
84
+ deleteTextBlockConfirm: "\u5220\u9664\u540e\u6587\u5b57\u65e0\u6cd5\u6062\u590d\uff0c\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u6587\u5b57\u5757\u5417\uff1f",
85
+ textBlockFont: "\u6587\u5b57\u5757\u5b57\u4f53",
86
+ textBlockFontSize: "\u6587\u5b57\u5927\u5c0f",
87
+ textBlockBold: "\u52a0\u7c97",
88
+ textBlockItalic: "\u659c\u4f53",
89
+ textBlockUnderline: "\u4e0b\u5212\u7ebf",
90
+ textBlockColor: "\u6587\u5b57\u989c\u8272",
91
+ textBlockOverflowHint: "\u6587\u5b57\u8d85\u51fa\u53ef\u89c6\u533a\u57df\uff0c\u8bf7\u6269\u5927\u6587\u5b57\u5757\u6216\u8c03\u6574\u5b57\u53f7",
92
+ textBlockLimit: "\u6587\u5b57\u5757 {count} / {max}",
93
+ charCount: "{count} \u5b57",
94
+ allMediaTitle: "\u5a92\u4f53",
95
+ uploadMedia: "\u4e0a\u4f20",
96
+ uploading: "\u4e0a\u4f20\u4e2d",
97
+ compressingMedia: "\u538b\u7f29\u4e2d",
98
+ uploadFailed: "\u4e0a\u4f20\u5931\u8d25",
99
+ retryUpload: "\u91cd\u8bd5",
100
+ dismissFailedUpload: "\u79fb\u9664",
101
+ mediaUploadMissing: "\u6ca1\u6709\u8fde\u63a5\u5a92\u4f53\u4e0a\u4f20\u5904\u7406\u5668\u3002",
102
+ mediaEmpty: "\u8fd8\u6ca1\u6709\u56fe\u7247\u6216\u89c6\u9891\u3002",
103
+ imageQuota: "\u56fe\u7247 {count} / {max}",
104
+ videoQuota: "\u89c6\u9891 {count} / {max}",
105
+ pageMediaHint: "\u5728\u5a92\u4f53\u91cc\u70b9\u51fb +\uff0c\u628a\u7167\u7247\u6216\u89c6\u9891\u653e\u5230\u8fd9\u4e00\u9875\u3002",
106
+ detachMedia: "\u4ece\u672c\u9875\u79fb\u9664",
107
+ removeMedia: "\u5220\u9664\u5a92\u4f53",
108
+ addMediaToPage: "\u6dfb\u52a0\u5230\u672c\u9875",
109
+ resizeMedia: "\u7f29\u653e\u5a92\u4f53",
110
+ viewFullscreen: "\u5168\u5c4f\u67e5\u770b",
111
+ playMedia: "\u64ad\u653e",
112
+ close: "\u5173\u95ed",
113
+ image: "\u56fe\u7247",
114
+ video: "\u89c6\u9891",
115
+ prevPage: "\u4e0a\u4e00\u9875",
116
+ nextPage: "\u4e0b\u4e00\u9875",
117
+ viewMedia: "\u67e5\u770b\u5a92\u4f53",
118
+ viewOnGithub: "\u5728 GitHub \u67e5\u770b",
119
+ },
120
+ };
121
+ export function resolveAmirielLabels(locale = "en", labels = {}) {
122
+ const base = AMIRIEL_DEFAULT_LABELS[locale] ?? AMIRIEL_DEFAULT_LABELS.en;
123
+ return {
124
+ ...base,
125
+ ...labels,
126
+ themes: { ...base.themes, ...labels.themes },
127
+ fonts: { ...base.fonts, ...labels.fonts },
128
+ };
129
+ }
130
+ export function formatAmirielLabel(template, values) {
131
+ return template.replace(/\{(\w+)\}/g, (_, key) => String(values[key] ?? ""));
132
+ }
133
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { AmirielTextColor, AmirielTheme } from "./types";
2
+ /** Paper surface CSS variables applied to framework renderers/editors. */
3
+ export interface AmirielPaperThemeVars {
4
+ paperBorder: string;
5
+ paperBg: string;
6
+ paperText: string;
7
+ paperDivider: string;
8
+ paperAccent: string;
9
+ paperHead?: string;
10
+ paperShadow?: string;
11
+ paperMediaBorder?: string;
12
+ paperMediaBg?: string;
13
+ }
14
+ export interface AmirielThemeDefinition {
15
+ id: string;
16
+ label?: string;
17
+ /** CSS `background` value for the theme swatch button. */
18
+ swatch: string;
19
+ defaultTextColor: AmirielTextColor;
20
+ vars: AmirielPaperThemeVars;
21
+ }
22
+ export declare const AMIRIEL_BUILTIN_THEME_DEFINITIONS: AmirielThemeDefinition[];
23
+ export declare const AMIRIEL_BUILTIN_THEME_IDS: AmirielTheme[];
24
+ export declare function amirielThemeCssVars(def: AmirielThemeDefinition): Record<string, string>;
25
+ export declare function mergeAmirielThemeDefinitions(custom?: AmirielThemeDefinition[]): AmirielThemeDefinition[];
26
+ export declare function findAmirielThemeDefinition(themeId: string | undefined, custom?: AmirielThemeDefinition[]): AmirielThemeDefinition;
27
+ export declare function themeDefaultTextColorFor(themeId: string | undefined, custom?: AmirielThemeDefinition[]): AmirielTextColor;
28
+ //# sourceMappingURL=themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,eAAO,MAAM,iCAAiC,EAAE,sBAAsB,EAoDrE,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAiE,YAAY,EAAE,CAAC;AAEtH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAavF;AAED,wBAAgB,4BAA4B,CAAC,MAAM,GAAE,sBAAsB,EAAO,GAAG,sBAAsB,EAAE,CAY5G;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,sBAAsB,EAAO,GACpC,sBAAsB,CAGxB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,GAAE,sBAAsB,EAAO,GACpC,gBAAgB,CAElB"}
package/dist/themes.js ADDED
@@ -0,0 +1,87 @@
1
+ export const AMIRIEL_BUILTIN_THEME_DEFINITIONS = [
2
+ {
3
+ id: "midnight",
4
+ swatch: "linear-gradient(135deg, #373737, #050505)",
5
+ defaultTextColor: "white",
6
+ vars: {
7
+ paperBorder: "rgba(214, 170, 103, 0.24)",
8
+ paperBg: "radial-gradient(circle at 12% 0%, rgba(214, 170, 103, 0.1), transparent 38%), linear-gradient(180deg, #171718 0%, #09090a 100%)",
9
+ paperText: "#eadfce",
10
+ paperHead: "rgba(241, 234, 220, 0.92)",
11
+ paperDivider: "rgba(214, 170, 103, 0.2)",
12
+ paperAccent: "rgba(214, 170, 103, 0.8)",
13
+ paperShadow: "0 20px 48px rgba(0, 0, 0, 0.46), inset 0 1px 0 rgba(255, 255, 255, 0.06)",
14
+ paperMediaBorder: "rgba(255, 255, 255, 0.1)",
15
+ paperMediaBg: "rgba(0, 0, 0, 0.28)",
16
+ },
17
+ },
18
+ {
19
+ id: "paper",
20
+ swatch: "linear-gradient(135deg, #ece8df, #d6aa67)",
21
+ defaultTextColor: "black",
22
+ vars: {
23
+ paperBorder: "rgba(180, 140, 80, 0.34)",
24
+ paperBg: "radial-gradient(circle at 12% 0%, rgba(214, 170, 103, 0.14), transparent 38%), linear-gradient(180deg, #f7f2e8 0%, #ebe3d4 100%)",
25
+ paperText: "#3a3228",
26
+ paperHead: "rgba(62, 48, 32, 0.92)",
27
+ paperDivider: "rgba(180, 140, 80, 0.24)",
28
+ paperAccent: "rgba(122, 88, 42, 0.88)",
29
+ paperShadow: "0 20px 48px rgba(72, 54, 32, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.42)",
30
+ paperMediaBorder: "rgba(110, 82, 48, 0.16)",
31
+ paperMediaBg: "rgba(255, 255, 255, 0.28)",
32
+ },
33
+ },
34
+ {
35
+ id: "memorial",
36
+ swatch: "linear-gradient(135deg, #9fb27a, #252525)",
37
+ defaultTextColor: "white",
38
+ vars: {
39
+ paperBorder: "rgba(159, 178, 122, 0.28)",
40
+ paperBg: "radial-gradient(circle at 12% 0%, rgba(159, 178, 122, 0.1), transparent 38%), linear-gradient(180deg, #1e2822 0%, #121916 100%)",
41
+ paperText: "#dde5d4",
42
+ paperHead: "rgba(221, 229, 212, 0.92)",
43
+ paperDivider: "rgba(159, 178, 122, 0.2)",
44
+ paperAccent: "rgba(159, 178, 122, 0.88)",
45
+ paperShadow: "0 20px 48px rgba(0, 0, 0, 0.46), inset 0 1px 0 rgba(159, 178, 122, 0.08)",
46
+ paperMediaBorder: "rgba(159, 178, 122, 0.16)",
47
+ paperMediaBg: "rgba(0, 0, 0, 0.24)",
48
+ },
49
+ },
50
+ ];
51
+ export const AMIRIEL_BUILTIN_THEME_IDS = AMIRIEL_BUILTIN_THEME_DEFINITIONS.map((theme) => theme.id);
52
+ export function amirielThemeCssVars(def) {
53
+ const vars = def.vars;
54
+ return {
55
+ "--amiriel-paper-border": vars.paperBorder,
56
+ "--amiriel-paper-bg": vars.paperBg,
57
+ "--amiriel-paper-text": vars.paperText,
58
+ "--amiriel-paper-divider": vars.paperDivider,
59
+ "--amiriel-paper-accent": vars.paperAccent,
60
+ ...(vars.paperHead ? { "--amiriel-paper-head": vars.paperHead } : {}),
61
+ ...(vars.paperShadow ? { "--amiriel-paper-shadow": vars.paperShadow } : {}),
62
+ ...(vars.paperMediaBorder ? { "--amiriel-paper-media-border": vars.paperMediaBorder } : {}),
63
+ ...(vars.paperMediaBg ? { "--amiriel-paper-media-bg": vars.paperMediaBg } : {}),
64
+ };
65
+ }
66
+ export function mergeAmirielThemeDefinitions(custom = []) {
67
+ const map = new Map();
68
+ for (const def of AMIRIEL_BUILTIN_THEME_DEFINITIONS)
69
+ map.set(def.id, def);
70
+ for (const def of custom) {
71
+ const base = map.get(def.id);
72
+ map.set(def.id, {
73
+ ...base,
74
+ ...def,
75
+ vars: { ...base?.vars, ...def.vars },
76
+ });
77
+ }
78
+ return Array.from(map.values());
79
+ }
80
+ export function findAmirielThemeDefinition(themeId, custom = []) {
81
+ const resolved = mergeAmirielThemeDefinitions(custom);
82
+ return resolved.find((theme) => theme.id === themeId) ?? resolved[0];
83
+ }
84
+ export function themeDefaultTextColorFor(themeId, custom = []) {
85
+ return findAmirielThemeDefinition(themeId, custom).defaultTextColor;
86
+ }
87
+ //# sourceMappingURL=themes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,MAAM,iCAAiC,GAA6B;IACzE;QACE,EAAE,EAAE,UAAU;QACd,MAAM,EAAE,2CAA2C;QACnD,gBAAgB,EAAE,OAAO;QACzB,IAAI,EAAE;YACJ,WAAW,EAAE,2BAA2B;YACxC,OAAO,EACL,iIAAiI;YACnI,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,2BAA2B;YACtC,YAAY,EAAE,0BAA0B;YACxC,WAAW,EAAE,0BAA0B;YACvC,WAAW,EAAE,0EAA0E;YACvF,gBAAgB,EAAE,0BAA0B;YAC5C,YAAY,EAAE,qBAAqB;SACpC;KACF;IACD;QACE,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,2CAA2C;QACnD,gBAAgB,EAAE,OAAO;QACzB,IAAI,EAAE;YACJ,WAAW,EAAE,0BAA0B;YACvC,OAAO,EACL,kIAAkI;YACpI,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,wBAAwB;YACnC,YAAY,EAAE,0BAA0B;YACxC,WAAW,EAAE,yBAAyB;YACtC,WAAW,EAAE,6EAA6E;YAC1F,gBAAgB,EAAE,yBAAyB;YAC3C,YAAY,EAAE,2BAA2B;SAC1C;KACF;IACD;QACE,EAAE,EAAE,UAAU;QACd,MAAM,EAAE,2CAA2C;QACnD,gBAAgB,EAAE,OAAO;QACzB,IAAI,EAAE;YACJ,WAAW,EAAE,2BAA2B;YACxC,OAAO,EACL,iIAAiI;YACnI,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,2BAA2B;YACtC,YAAY,EAAE,0BAA0B;YACxC,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE,0EAA0E;YACvF,gBAAgB,EAAE,2BAA2B;YAC7C,YAAY,EAAE,qBAAqB;SACpC;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAmB,CAAC;AAEtH,MAAM,UAAU,mBAAmB,CAAC,GAA2B;IAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,OAAO;QACL,wBAAwB,EAAE,IAAI,CAAC,WAAW;QAC1C,oBAAoB,EAAE,IAAI,CAAC,OAAO;QAClC,sBAAsB,EAAE,IAAI,CAAC,SAAS;QACtC,yBAAyB,EAAE,IAAI,CAAC,YAAY;QAC5C,wBAAwB,EAAE,IAAI,CAAC,WAAW;QAC1C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,8BAA8B,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,SAAmC,EAAE;IAChF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,iCAAiC;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1E,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;YACd,GAAG,IAAI;YACP,GAAG,GAAG;YACN,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAA2B,EAC3B,SAAmC,EAAE;IAErC,MAAM,QAAQ,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAA2B,EAC3B,SAAmC,EAAE;IAErC,OAAO,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,gBAAgB,CAAC;AACtE,CAAC"}
@@ -0,0 +1,151 @@
1
+ export type AmirielLocale = "en" | "zh";
2
+ export type AmirielBuiltinTheme = "midnight" | "paper" | "memorial";
3
+ /** Built-in ids or any custom theme id supplied by a host package. */
4
+ export type AmirielTheme = AmirielBuiltinTheme | (string & {});
5
+ export type AmirielFont = "system" | "serif" | "handwritten";
6
+ export type AmirielTextColor = "red" | "orange" | "yellow" | "green" | "cyan" | "blue" | "purple" | "pink" | "brown" | "gray" | "black" | "white";
7
+ export type AmirielIdFactory = () => string;
8
+ export interface AmirielPaperSize {
9
+ width: number;
10
+ height: number;
11
+ }
12
+ export interface AmirielPaperSizeLimits {
13
+ minWidth?: number;
14
+ maxWidth?: number;
15
+ minHeight?: number;
16
+ maxHeight?: number;
17
+ }
18
+ export interface AmirielNormalizeOptions {
19
+ defaultPaperSize?: AmirielPaperSize;
20
+ paperSizeLimits?: AmirielPaperSizeLimits;
21
+ paperResizable?: boolean;
22
+ createId?: AmirielIdFactory;
23
+ }
24
+ export interface AmirielMediaPlacement {
25
+ id: string;
26
+ mediaId: string;
27
+ x: number;
28
+ y: number;
29
+ width: number;
30
+ height: number;
31
+ aspectRatio?: number;
32
+ z: number;
33
+ }
34
+ export interface AmirielTextBlock {
35
+ id: string;
36
+ x: number;
37
+ y: number;
38
+ width: number;
39
+ height?: number;
40
+ text: string;
41
+ z: number;
42
+ font?: AmirielFont;
43
+ fontSize?: number;
44
+ bold?: boolean;
45
+ italic?: boolean;
46
+ underline?: boolean;
47
+ color?: AmirielTextColor;
48
+ }
49
+ export interface AmirielPage {
50
+ id: string;
51
+ order: number;
52
+ text: string;
53
+ font?: AmirielFont;
54
+ mediaIds?: string[];
55
+ mediaPlacements?: AmirielMediaPlacement[];
56
+ textBlocks?: AmirielTextBlock[];
57
+ }
58
+ export interface AmirielMedia {
59
+ id: string;
60
+ type: "image" | "video";
61
+ url: string;
62
+ objectKey?: string;
63
+ thumbnailUrl?: string;
64
+ storage?: "local" | "r2";
65
+ size?: number;
66
+ width?: number;
67
+ height?: number;
68
+ duration?: number;
69
+ createdAt?: string;
70
+ }
71
+ export interface AmirielDocument {
72
+ theme: AmirielTheme;
73
+ pages: AmirielPage[];
74
+ media: AmirielMedia[];
75
+ paper?: AmirielPaperSize;
76
+ }
77
+ export interface AmirielEditorLimits {
78
+ maxPages?: number;
79
+ maxTextBlocksPerPage?: number;
80
+ maxImages?: number;
81
+ maxVideos?: number;
82
+ }
83
+ export interface AmirielLabels {
84
+ themeLabel: string;
85
+ themes: Partial<Record<AmirielBuiltinTheme, string>> & Record<string, string>;
86
+ fonts: Record<AmirielFont, string>;
87
+ pagesCount: string;
88
+ paperSizeTitle: string;
89
+ paperWidth: string;
90
+ paperHeight: string;
91
+ paperSizeUnit: string;
92
+ addPage: string;
93
+ removePage: string;
94
+ pagePlaceholder: string;
95
+ /** Placeholder shown inside empty text-block editors. */
96
+ textBlockPlaceholder: string;
97
+ tapPaperHint: string;
98
+ textBlocksTitle: string;
99
+ addTextBlock: string;
100
+ moveTextBlock: string;
101
+ resizeTextBlock: string;
102
+ deleteTextBlock: string;
103
+ deleteTextBlockConfirm: string;
104
+ textBlockFont: string;
105
+ textBlockFontSize: string;
106
+ textBlockBold: string;
107
+ textBlockItalic: string;
108
+ textBlockUnderline: string;
109
+ textBlockColor: string;
110
+ textBlockOverflowHint: string;
111
+ textBlockLimit: string;
112
+ charCount: string;
113
+ allMediaTitle: string;
114
+ uploadMedia: string;
115
+ uploading: string;
116
+ compressingMedia: string;
117
+ uploadFailed: string;
118
+ retryUpload: string;
119
+ dismissFailedUpload: string;
120
+ mediaUploadMissing: string;
121
+ mediaEmpty: string;
122
+ imageQuota: string;
123
+ videoQuota: string;
124
+ pageMediaHint: string;
125
+ detachMedia: string;
126
+ removeMedia: string;
127
+ addMediaToPage: string;
128
+ resizeMedia: string;
129
+ viewFullscreen: string;
130
+ playMedia: string;
131
+ close: string;
132
+ image: string;
133
+ video: string;
134
+ prevPage: string;
135
+ nextPage: string;
136
+ viewMedia: string;
137
+ viewOnGithub: string;
138
+ }
139
+ export interface AmirielMediaUploadProgress {
140
+ phase: "preparing" | "uploading";
141
+ progress: number | null;
142
+ }
143
+ export interface AmirielMediaRequest<TFile = unknown> {
144
+ file: TFile;
145
+ pageId: string;
146
+ handled?: boolean;
147
+ onProgress?: (info: AmirielMediaUploadProgress) => void;
148
+ resolve: (media: AmirielMedia) => void;
149
+ reject: (message?: string) => void;
150
+ }
151
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AACxC,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;AACpE,sEAAsE;AACtE,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC/D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GACxB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC1C,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9E,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK,GAAG,OAAO;IAClD,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { AmirielDocument, AmirielFont, AmirielIdFactory, AmirielMedia, AmirielMediaPlacement, AmirielNormalizeOptions, AmirielPage, AmirielPaperSize, AmirielPaperSizeLimits, AmirielTextBlock, AmirielTextColor, AmirielTheme } from "./types";
2
+ export declare const AMIRIEL_TEXT_COLORS: Record<AmirielTextColor, string>;
3
+ export declare const AMIRIEL_TEXT_COLOR_OPTIONS: AmirielTextColor[];
4
+ export declare const AMIRIEL_FONT_OPTIONS: AmirielFont[];
5
+ export declare const AMIRIEL_THEME_OPTIONS: AmirielTheme[];
6
+ export declare const AMIRIEL_DEFAULT_PAPER_SIZE: AmirielPaperSize;
7
+ export declare const AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS: Required<AmirielPaperSizeLimits>;
8
+ export declare const AMIRIEL_THEME_DEFAULT_TEXT_COLOR: {
9
+ readonly midnight: "white";
10
+ readonly paper: "black";
11
+ readonly memorial: "white";
12
+ };
13
+ export declare const AMIRIEL_FONT_STACKS: Record<AmirielFont, string>;
14
+ export declare function createAmirielId(prefix?: string): string;
15
+ export declare function themeDefaultTextBlockColor(theme?: AmirielTheme): AmirielTextColor;
16
+ export declare function clamp(value: number, min: number, max: number): number;
17
+ export declare function normalizePaperSizeLimits(limits?: AmirielPaperSizeLimits): Required<AmirielPaperSizeLimits>;
18
+ export declare function normalizePaperSize(value?: Partial<AmirielPaperSize>, options?: AmirielNormalizeOptions): AmirielPaperSize;
19
+ export declare function safeAspectRatio(width?: number, height?: number): number;
20
+ export declare function mediaAspectRatio(media?: AmirielMedia): number;
21
+ export declare function fallbackHeightPercent(width: number, aspectRatio: number): number;
22
+ export declare function heightPercentForWidth(width: number, aspectRatio: number, paperWidth: number, paperHeight: number): number;
23
+ export declare function widthPercentForHeight(height: number, aspectRatio: number, paperWidth: number, paperHeight: number): number;
24
+ export declare function mediaSizeWithinPaper(preferredWidth: number, aspectRatio: number, paperWidth: number, paperHeight: number, maxWidth: number, maxHeight: number): {
25
+ width: number;
26
+ height: number;
27
+ };
28
+ export declare function normalizeTextBlock(block: AmirielTextBlock, index?: number): AmirielTextBlock;
29
+ export declare function normalizeTextBlocks(page: AmirielPage): AmirielTextBlock[];
30
+ export declare function normalizePlacement(placement: AmirielMediaPlacement, media?: AmirielMedia, paperSize?: AmirielPaperSize): AmirielMediaPlacement;
31
+ export declare function normalizeMediaPlacements(page: AmirielPage, mediaList: AmirielMedia[], paperSize?: AmirielPaperSize, createId?: AmirielIdFactory): AmirielMediaPlacement[];
32
+ export declare function combinedPageText(page?: AmirielPage): string;
33
+ export declare function syncPageText(page: AmirielPage): void;
34
+ export declare function sortAmirielPages(pages: AmirielPage[]): AmirielPage[];
35
+ export declare function normalizeDocument(value: Partial<AmirielDocument> | null | undefined, options?: AmirielNormalizeOptions): AmirielDocument;
36
+ export declare function formatVideoDuration(seconds: number): string;
37
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js ADDED
@@ -0,0 +1,263 @@
1
+ import { AMIRIEL_BUILTIN_THEME_IDS, themeDefaultTextColorFor } from "./themes";
2
+ let fallbackIdCounter = 0;
3
+ export const AMIRIEL_TEXT_COLORS = {
4
+ red: "#ef4444",
5
+ orange: "#f97316",
6
+ yellow: "#ca8a04",
7
+ green: "#16a34a",
8
+ cyan: "#0891b2",
9
+ blue: "#2563eb",
10
+ purple: "#9333ea",
11
+ pink: "#ec4899",
12
+ brown: "#92400e",
13
+ gray: "#6b7280",
14
+ black: "#000000",
15
+ white: "#ffffff",
16
+ };
17
+ export const AMIRIEL_TEXT_COLOR_OPTIONS = Object.keys(AMIRIEL_TEXT_COLORS);
18
+ export const AMIRIEL_FONT_OPTIONS = ["system", "serif", "handwritten"];
19
+ export const AMIRIEL_THEME_OPTIONS = AMIRIEL_BUILTIN_THEME_IDS;
20
+ export const AMIRIEL_DEFAULT_PAPER_SIZE = { width: 720, height: 520 };
21
+ export const AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS = {
22
+ minWidth: 320,
23
+ maxWidth: 1600,
24
+ minHeight: 240,
25
+ maxHeight: 2200,
26
+ };
27
+ export const AMIRIEL_THEME_DEFAULT_TEXT_COLOR = {
28
+ midnight: "white",
29
+ paper: "black",
30
+ memorial: "white",
31
+ };
32
+ export const AMIRIEL_FONT_STACKS = {
33
+ system: "Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
34
+ serif: "Georgia, 'Times New Roman', 'Noto Serif', 'Noto Serif CJK SC', serif",
35
+ handwritten: "'Segoe Print', 'Bradley Hand', 'Kaiti SC', STKaiti, KaiTi, 'Noto Serif CJK SC', cursive, serif",
36
+ };
37
+ function globalCrypto() {
38
+ return globalThis.crypto;
39
+ }
40
+ function randomHex(bytes = 8) {
41
+ const crypto = globalCrypto();
42
+ if (crypto?.getRandomValues) {
43
+ const values = crypto.getRandomValues(new Uint8Array(bytes));
44
+ return Array.from(values, (value) => value.toString(16).padStart(2, "0")).join("");
45
+ }
46
+ fallbackIdCounter += 1;
47
+ return `${Date.now().toString(36)}-${fallbackIdCounter.toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
48
+ }
49
+ export function createAmirielId(prefix = "amiriel") {
50
+ const crypto = globalCrypto();
51
+ if (crypto?.randomUUID)
52
+ return crypto.randomUUID();
53
+ return `${prefix}-${randomHex()}`;
54
+ }
55
+ export function themeDefaultTextBlockColor(theme) {
56
+ return themeDefaultTextColorFor(theme);
57
+ }
58
+ export function clamp(value, min, max) {
59
+ return Math.min(max, Math.max(min, value));
60
+ }
61
+ function positiveInteger(value, fallback) {
62
+ const next = Number(value);
63
+ if (!Number.isFinite(next) || next <= 0)
64
+ return fallback;
65
+ return Math.round(next);
66
+ }
67
+ function normalizeRawPaperSize(value, fallback) {
68
+ return {
69
+ width: positiveInteger(value?.width, fallback.width),
70
+ height: positiveInteger(value?.height, fallback.height),
71
+ };
72
+ }
73
+ export function normalizePaperSizeLimits(limits) {
74
+ const minWidth = positiveInteger(limits?.minWidth, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS.minWidth);
75
+ const minHeight = positiveInteger(limits?.minHeight, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS.minHeight);
76
+ const maxWidth = Math.max(minWidth, positiveInteger(limits?.maxWidth, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS.maxWidth));
77
+ const maxHeight = Math.max(minHeight, positiveInteger(limits?.maxHeight, AMIRIEL_DEFAULT_PAPER_SIZE_LIMITS.maxHeight));
78
+ return { minWidth, maxWidth, minHeight, maxHeight };
79
+ }
80
+ export function normalizePaperSize(value, options = {}) {
81
+ const fallback = normalizeRawPaperSize(options.defaultPaperSize, AMIRIEL_DEFAULT_PAPER_SIZE);
82
+ if (options.paperResizable === false)
83
+ return fallback;
84
+ const limits = normalizePaperSizeLimits(options.paperSizeLimits);
85
+ const paper = normalizeRawPaperSize(value, fallback);
86
+ return {
87
+ width: clamp(paper.width, limits.minWidth, limits.maxWidth),
88
+ height: clamp(paper.height, limits.minHeight, limits.maxHeight),
89
+ };
90
+ }
91
+ export function safeAspectRatio(width, height) {
92
+ if (width && height && width > 0 && height > 0)
93
+ return clamp(width / height, 0.1, 10);
94
+ return 4 / 3;
95
+ }
96
+ export function mediaAspectRatio(media) {
97
+ return safeAspectRatio(media?.width, media?.height);
98
+ }
99
+ export function fallbackHeightPercent(width, aspectRatio) {
100
+ return clamp(width / aspectRatio, 8, 100);
101
+ }
102
+ export function heightPercentForWidth(width, aspectRatio, paperWidth, paperHeight) {
103
+ if (paperWidth <= 0 || paperHeight <= 0)
104
+ return fallbackHeightPercent(width, aspectRatio);
105
+ return clamp((width * paperWidth) / (paperHeight * aspectRatio), 8, 100);
106
+ }
107
+ export function widthPercentForHeight(height, aspectRatio, paperWidth, paperHeight) {
108
+ if (paperWidth <= 0 || paperHeight <= 0)
109
+ return clamp(height * aspectRatio, 8, 100);
110
+ return clamp((height * paperHeight * aspectRatio) / paperWidth, 8, 100);
111
+ }
112
+ export function mediaSizeWithinPaper(preferredWidth, aspectRatio, paperWidth, paperHeight, maxWidth, maxHeight) {
113
+ let width = clamp(preferredWidth, 8, Math.max(8, maxWidth));
114
+ let height = heightPercentForWidth(width, aspectRatio, paperWidth, paperHeight);
115
+ if (height > maxHeight) {
116
+ height = Math.max(8, maxHeight);
117
+ width = clamp(widthPercentForHeight(height, aspectRatio, paperWidth, paperHeight), 8, Math.max(8, maxWidth));
118
+ height = heightPercentForWidth(width, aspectRatio, paperWidth, paperHeight);
119
+ }
120
+ return { width, height };
121
+ }
122
+ export function normalizeTextBlock(block, index = 0) {
123
+ return {
124
+ id: block.id,
125
+ x: clamp(block.x, 0, 92),
126
+ y: clamp(block.y, 0, 92),
127
+ width: clamp(block.width || 88, 12, 96),
128
+ height: clamp(block.height || 22, 8, 100),
129
+ text: block.text || "",
130
+ z: Math.max(1, Math.round(block.z || index + 1)),
131
+ ...(block.font && AMIRIEL_FONT_OPTIONS.includes(block.font) ? { font: block.font } : {}),
132
+ ...(block.fontSize ? { fontSize: clamp(block.fontSize, 10, 48) } : {}),
133
+ ...(block.bold ? { bold: true } : {}),
134
+ ...(block.italic ? { italic: true } : {}),
135
+ ...(block.underline ? { underline: true } : {}),
136
+ ...(block.color && AMIRIEL_TEXT_COLOR_OPTIONS.includes(block.color) ? { color: block.color } : {}),
137
+ };
138
+ }
139
+ export function normalizeTextBlocks(page) {
140
+ const existing = (page.textBlocks ?? []).filter((block) => Boolean(block.id));
141
+ if (existing.length)
142
+ return existing.map((block, index) => normalizeTextBlock(block, index));
143
+ if (!page.text?.trim())
144
+ return [];
145
+ return [{
146
+ id: `legacy-${page.id}`,
147
+ x: 4,
148
+ y: 16,
149
+ width: 88,
150
+ height: 28,
151
+ text: page.text,
152
+ z: 1,
153
+ }];
154
+ }
155
+ export function normalizePlacement(placement, media, paperSize = AMIRIEL_DEFAULT_PAPER_SIZE) {
156
+ const aspectRatio = placement.aspectRatio || mediaAspectRatio(media) || safeAspectRatio(placement.width, placement.height);
157
+ const x = clamp(placement.x, 0, 92);
158
+ const y = clamp(placement.y, 0, 92);
159
+ const width = clamp(placement.width, 8, 100 - x);
160
+ const height = clamp(heightPercentForWidth(width, aspectRatio, paperSize.width, paperSize.height), 8, 100 - y);
161
+ return {
162
+ id: placement.id,
163
+ mediaId: placement.mediaId,
164
+ x,
165
+ y,
166
+ width,
167
+ height,
168
+ aspectRatio,
169
+ z: Math.max(1, Math.round(placement.z || 1)),
170
+ };
171
+ }
172
+ export function normalizeMediaPlacements(page, mediaList, paperSize = AMIRIEL_DEFAULT_PAPER_SIZE, createId = createAmirielId) {
173
+ const existing = (page.mediaPlacements ?? []).filter((placement) => Boolean(placement.id && placement.mediaId));
174
+ if (existing.length) {
175
+ return existing.map((placement) => normalizePlacement(placement, mediaList.find((item) => item.id === placement.mediaId), paperSize));
176
+ }
177
+ return (page.mediaIds ?? []).map((mediaId, index) => {
178
+ const media = mediaList.find((item) => item.id === mediaId);
179
+ const aspectRatio = mediaAspectRatio(media);
180
+ const width = 38;
181
+ return normalizePlacement({
182
+ id: createId(),
183
+ mediaId,
184
+ x: 10 + (index % 2) * 42,
185
+ y: 28 + Math.floor(index / 2) * 28,
186
+ width,
187
+ height: heightPercentForWidth(width, aspectRatio, paperSize.width, paperSize.height),
188
+ aspectRatio,
189
+ z: index + 1,
190
+ }, media, paperSize);
191
+ });
192
+ }
193
+ export function combinedPageText(page) {
194
+ if (!page)
195
+ return "";
196
+ const blocks = page.textBlocks ?? [];
197
+ if (blocks.length)
198
+ return blocks.map((block) => block.text).join("\n");
199
+ return page.text || "";
200
+ }
201
+ export function syncPageText(page) {
202
+ page.text = combinedPageText(page);
203
+ }
204
+ function clonePlainDeep(value) {
205
+ if (value === null || typeof value !== "object")
206
+ return value;
207
+ if (Array.isArray(value))
208
+ return value.map((item) => clonePlainDeep(item));
209
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clonePlainDeep(entry)]));
210
+ }
211
+ export function sortAmirielPages(pages) {
212
+ return [...pages].sort((a, b) => a.order - b.order);
213
+ }
214
+ export function normalizeDocument(value, options = {}) {
215
+ const createId = options.createId ?? createAmirielId;
216
+ const raw = clonePlainDeep(value ?? {});
217
+ const media = (raw.media ?? []).filter((item) => Boolean(item.id && item.type && item.url));
218
+ const paper = normalizePaperSize(raw.paper, options);
219
+ const fallbackPages = [{
220
+ id: createId(),
221
+ order: 0,
222
+ text: "",
223
+ font: "handwritten",
224
+ mediaIds: [],
225
+ mediaPlacements: [],
226
+ textBlocks: [],
227
+ }];
228
+ const pages = raw.pages?.length ? raw.pages : fallbackPages;
229
+ const normalized = {
230
+ theme: raw.theme || "midnight",
231
+ media,
232
+ paper,
233
+ pages: pages.map((page, index) => {
234
+ const normalizedPage = {
235
+ ...page,
236
+ id: page.id || createId(),
237
+ order: index,
238
+ text: page.text || "",
239
+ font: page.font && AMIRIEL_FONT_OPTIONS.includes(page.font) ? page.font : "handwritten",
240
+ mediaIds: page.mediaIds || [],
241
+ mediaPlacements: page.mediaPlacements || [],
242
+ textBlocks: page.textBlocks || [],
243
+ };
244
+ normalizedPage.mediaPlacements = normalizeMediaPlacements(normalizedPage, media, paper, createId);
245
+ normalizedPage.textBlocks = normalizeTextBlocks(normalizedPage);
246
+ syncPageText(normalizedPage);
247
+ return normalizedPage;
248
+ }),
249
+ };
250
+ return normalized;
251
+ }
252
+ export function formatVideoDuration(seconds) {
253
+ if (!Number.isFinite(seconds) || seconds <= 0)
254
+ return "";
255
+ const total = Math.floor(seconds);
256
+ const hours = Math.floor(total / 3600);
257
+ const minutes = Math.floor((total % 3600) / 60);
258
+ const secs = total % 60;
259
+ if (hours > 0)
260
+ return `${hours}:${String(minutes).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
261
+ return `${minutes}:${String(secs).padStart(2, "0")}`;
262
+ }
263
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAO/E,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B,MAAM,CAAC,MAAM,mBAAmB,GAAqC;IACnE,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAuB,CAAC;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxF,MAAM,CAAC,MAAM,iCAAiC,GAAqC;IACjF,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,OAAO;CACkC,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D,MAAM,EAAE,4FAA4F;IACpG,KAAK,EAAE,sEAAsE;IAC7E,WAAW,EAAE,gGAAgG;CAC9G,CAAC;AAEF,SAAS,YAAY;IACnB,OAAQ,UAA0D,CAAC,MAAM,CAAC;AAC5E,CAAC;AAED,SAAS,SAAS,CAAC,KAAK,GAAG,CAAC;IAC1B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,EAAE,eAAe,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,iBAAiB,IAAI,CAAC,CAAC;IACvB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAM,GAAG,SAAS;IAChD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,EAAE,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IACnD,OAAO,GAAG,MAAM,IAAI,SAAS,EAAE,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAoB;IAC7D,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,QAAgB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA4C,EAAE,QAA0B;IACrG,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACpD,MAAM,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA+B;IACtE,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,iCAAiC,CAAC,QAAQ,CAAC,CAAC;IAC/F,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,iCAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAC,CAAC;IACvH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAiC,EACjC,UAAmC,EAAE;IAErC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IAEtD,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC3D,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,MAAe;IAC7D,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,WAAmB;IACtE,OAAO,KAAK,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,WAAmB,EAAE,UAAkB,EAAE,WAAmB;IAC/G,IAAI,UAAU,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,WAAmB,EAAE,UAAkB,EAAE,WAAmB;IAChH,IAAI,UAAU,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,cAAsB,EACtB,WAAmB,EACnB,UAAkB,EAClB,WAAmB,EACnB,QAAgB,EAChB,SAAiB;IAEjB,IAAI,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5D,IAAI,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAChF,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAChC,KAAK,GAAG,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7G,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAuB,EAAE,KAAK,GAAG,CAAC;IACnE,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;QACzC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QACtB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,0BAA0B,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiB;IACnD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC;YACN,EAAE,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE;YACvB,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,EAAE;YACL,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,CAAC,EAAE,CAAC;SACL,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAgC,EAChC,KAAoB,EACpB,YAA8B,0BAA0B;IAExD,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3H,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/G,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,CAAC;QACD,CAAC;QACD,KAAK;QACL,MAAM;QACN,WAAW;QACX,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAiB,EACjB,SAAyB,EACzB,YAA8B,0BAA0B,EACxD,WAA6B,eAAe;IAE5C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChH,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,kBAAkB,CACnD,SAAS,EACT,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,EACvD,SAAS,CACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,OAAO,kBAAkB,CAAC;YACxB,EAAE,EAAE,QAAQ,EAAE;YACd,OAAO;YACP,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;YACxB,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;YAClC,KAAK;YACL,MAAM,EAAE,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;YACpF,WAAW;YACX,CAAC,EAAE,KAAK,GAAG,CAAC;SACb,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACrC,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAI,KAAQ;IACjC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAM,CAAC;IAChF,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAChG,CAAC;AACT,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAkD,EAClD,UAAmC,EAAE;IAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC;IACrD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,IAAI,EAAE,CAA6B,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,aAAa,GAAkB,CAAC;YACpC,EAAE,EAAE,QAAQ,EAAE;YACd,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IAE5D,MAAM,UAAU,GAAoB;QAClC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,UAAU;QAC9B,KAAK;QACL,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,cAAc,GAAgB;gBAClC,GAAG,IAAI;gBACP,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,QAAQ,EAAE;gBACzB,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa;gBACvF,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;gBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;gBAC3C,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;aAClC,CAAC;YACF,cAAc,CAAC,eAAe,GAAG,wBAAwB,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClG,cAAc,CAAC,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAChE,YAAY,CAAC,cAAc,CAAC,CAAC;YAC7B,OAAO,cAAc,CAAC;QACxB,CAAC,CAAC;KACH,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;IACxB,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACtG,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@amiriel/core",
3
+ "version": "0.0.1-beta.7",
4
+ "description": "Framework-agnostic TypeScript core for Amiriel letter documents.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "homepage": "https://amiriel.com",
8
+ "packageManager": "pnpm@11.7.0",
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/Amirieljs/Amiriel-Core.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/Amirieljs/Amiriel-Core/issues"
18
+ },
19
+ "keywords": [
20
+ "amiriel",
21
+ "letter-editor",
22
+ "document-model",
23
+ "typescript",
24
+ "framework-agnostic"
25
+ ],
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js",
32
+ "default": "./dist/index.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "LICENSE",
38
+ "README.md"
39
+ ],
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit"
43
+ },
44
+ "sideEffects": false,
45
+ "devDependencies": {
46
+ "typescript": "^5.9.3"
47
+ }
48
+ }