@astryxdesign/richtext 0.4.0-canary.e144ea7 → 0.4.0-canary.faedff7
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 +53 -33
- package/dist/RichTextEditor.d.ts +246 -0
- package/dist/RichTextEditor.d.ts.map +1 -0
- package/dist/RichTextEditor.js +557 -0
- package/dist/RichTextEditorAutoLinkPlugin.d.ts +84 -0
- package/dist/RichTextEditorAutoLinkPlugin.d.ts.map +1 -0
- package/dist/RichTextEditorAutoLinkPlugin.js +94 -0
- package/dist/RichTextEditorToolbar.d.ts +131 -0
- package/dist/RichTextEditorToolbar.d.ts.map +1 -0
- package/dist/RichTextEditorToolbar.js +775 -0
- package/dist/RichTextView.d.ts +64 -0
- package/dist/RichTextView.d.ts.map +1 -0
- package/dist/RichTextView.js +167 -0
- package/dist/editorNodes.d.ts +8 -0
- package/dist/editorNodes.d.ts.map +1 -0
- package/dist/editorNodes.js +23 -0
- package/dist/editorTheme.d.ts +7 -0
- package/dist/editorTheme.d.ts.map +1 -0
- package/dist/editorTheme.js +102 -0
- package/dist/index.d.ts +18 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -15
- package/dist/linkUtils.d.ts +22 -0
- package/dist/linkUtils.d.ts.map +1 -0
- package/dist/linkUtils.js +90 -0
- package/dist/markdownSerializers.d.ts +40 -0
- package/dist/markdownSerializers.d.ts.map +1 -0
- package/dist/markdownSerializers.js +84 -0
- package/dist/richtext.css +104 -0
- package/package.json +69 -4
- package/src/RichTextEditor.doc.mjs +218 -0
- package/src/RichTextEditor.test.tsx +1671 -0
- package/src/RichTextEditor.tsx +944 -0
- package/src/RichTextEditorAutoLinkPlugin.tsx +115 -0
- package/src/RichTextEditorToolbar.tsx +970 -0
- package/src/RichTextView.tsx +226 -0
- package/src/editorNodes.ts +34 -0
- package/src/editorTheme.ts +185 -0
- package/src/index.ts +48 -14
- package/src/linkUtils.ts +92 -0
- package/src/markdownSerializers.ts +104 -0
package/README.md
CHANGED
|
@@ -1,23 +1,62 @@
|
|
|
1
1
|
# @astryxdesign/richtext
|
|
2
2
|
|
|
3
|
-
Astryx rich text — a Lexical-based rich text editor and viewer
|
|
3
|
+
Astryx rich text — a Lexical-based rich text editor and read-only viewer, styled
|
|
4
|
+
with Astryx design tokens.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> live in `@astryxdesign/lab`; that code will move here without a fresh package
|
|
8
|
-
> rollout.
|
|
6
|
+
```tsx
|
|
7
|
+
import {RichTextEditor, RichTextView} from '@astryxdesign/richtext';
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
<RichTextEditor label="Notes" onChange={setState} />;
|
|
10
|
+
<RichTextView label="Notes" value={serializedState} />;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The editor is deliberately minimal and extensible: pass `nodes` and `plugins` to
|
|
14
|
+
layer richer behaviour (toolbars, mentions, hover cards) on top without forking.
|
|
15
|
+
`RichTextEditorToolbar` is a composable formatting toolbar that drops into the
|
|
16
|
+
editor's `plugins` slot, and `markdownToEditorStateJSON` /
|
|
17
|
+
`editorStateJSONToMarkdown` convert Markdown to/from serialized editor state
|
|
18
|
+
headlessly (no mounted editor required). It consumes `@astryxdesign/core` theme
|
|
19
|
+
tokens directly (StyleX build mirrors `@astryxdesign/lab` / `@astryxdesign/charts`).
|
|
20
|
+
|
|
21
|
+
`lexical` and the `@lexical/*` packages are **optional** peer dependencies —
|
|
22
|
+
install them alongside richtext to use the editor. See the RFC:
|
|
23
|
+
[facebook/astryx#3899](https://github.com/facebook/astryx/issues/3899).
|
|
24
|
+
|
|
25
|
+
It ships to npm **only under the `@canary` dist-tag** — there is never a stable
|
|
26
|
+
(`latest`) release yet.
|
|
27
|
+
|
|
28
|
+
> Note: this package is the successor to the experimental `RichTextEditor` that
|
|
29
|
+
> used to live in `@astryxdesign/lab`; that code has moved here so it can be
|
|
30
|
+
> canaried independently (e.g. into EPS/Nest) without a fresh package rollout.
|
|
31
|
+
|
|
32
|
+
## Status
|
|
33
|
+
|
|
34
|
+
Under active development. The editor, view, composable toolbar, and Markdown
|
|
35
|
+
serializers are in place; API and visuals are still being refined. The goal is
|
|
36
|
+
graduation to `@astryxdesign/core` after the design/API stabilizes.
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
12
39
|
|
|
13
|
-
|
|
40
|
+
Inside the monorepo (storybook/sandbox), imports resolve via pnpm workspaces:
|
|
14
41
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
42
|
+
```tsx
|
|
43
|
+
import {RichTextEditor, RichTextView} from '@astryxdesign/richtext';
|
|
44
|
+
import '@astryxdesign/core/astryx.css';
|
|
45
|
+
import '@astryxdesign/richtext/richtext.css';
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Interactive examples live in the storybook app under **Lab/RichTextEditor**
|
|
49
|
+
(`apps/storybook/stories/RichTextEditor.stories.tsx`).
|
|
50
|
+
|
|
51
|
+
### Trying richtext in your own project (canary)
|
|
52
|
+
|
|
53
|
+
`@astryxdesign/richtext` is published **only** under the `@canary` dist-tag, so
|
|
54
|
+
you must request that tag explicitly. There is no `latest` version to install.
|
|
18
55
|
|
|
19
56
|
```bash
|
|
20
57
|
npm install @astryxdesign/richtext@canary @astryxdesign/core@canary
|
|
58
|
+
# plus the optional lexical peers you use:
|
|
59
|
+
npm install lexical @lexical/react @lexical/markdown @lexical/rich-text
|
|
21
60
|
```
|
|
22
61
|
|
|
23
62
|
> Canary builds track the latest commit on `main` (`0.x.y-canary.<sha>`). They
|
|
@@ -37,28 +76,9 @@ checkout only (never in git) to publish the `@canary` tag. The committed
|
|
|
37
76
|
|
|
38
77
|
When maintainers are ready to promote richtext to a stable public release:
|
|
39
78
|
|
|
40
|
-
1.
|
|
41
|
-
it from `src/index.ts`. Add the StyleX CSS build wiring (see below).
|
|
42
|
-
2. Remove `"private": true` **and** the `"astryx": { "canaryOnly": true }`
|
|
79
|
+
1. Remove `"private": true` **and** the `"astryx": { "canaryOnly": true }`
|
|
43
80
|
marker from `package.json`.
|
|
44
|
-
|
|
81
|
+
2. Add a changeset (`pnpm changeset`) selecting `@astryxdesign/richtext` so the
|
|
45
82
|
release workflow versions and publishes it to the `latest` dist-tag.
|
|
46
|
-
|
|
83
|
+
3. The stable (`latest`) release job (`.github/workflows/release.yml`) will then
|
|
47
84
|
include richtext on the next release.
|
|
48
|
-
|
|
49
|
-
### Adding the StyleX CSS build (deferred until the first component)
|
|
50
|
-
|
|
51
|
-
This scaffold intentionally omits the `build:css` step. `build-css.mjs` exits
|
|
52
|
-
with an error ("No StyleX rules found") when a package has zero StyleX
|
|
53
|
-
components, which would break CI for an empty package. When the first StyleX
|
|
54
|
-
component lands:
|
|
55
|
-
|
|
56
|
-
1. Register a `richtext` target in `scripts/build-css.mjs` (mirror the `lab` /
|
|
57
|
-
`charts` entries — same core token alias).
|
|
58
|
-
2. Add `"build:css": "node ../../scripts/build-css.mjs --package richtext"` to
|
|
59
|
-
the `scripts` block and append `&& pnpm build:css` to the `build` script
|
|
60
|
-
(before `check-no-dev-jsx`).
|
|
61
|
-
3. Add a `"./richtext.css"` entry to `exports` and add `richtext.css` under
|
|
62
|
-
`files` if needed.
|
|
63
|
-
|
|
64
|
-
The babel config is already StyleX-ready, so this is a small, mechanical add.
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file RichTextEditor.tsx
|
|
3
|
+
* @input Uses React, useId, Lexical (lexical + @lexical/react), Field,
|
|
4
|
+
* VisuallyHidden, useInputStatusIcon, mergeProps, design tokens
|
|
5
|
+
* @output Exports an accessibly labelled RichTextEditor component with a flush
|
|
6
|
+
* top toolbar slot and configurable editable-surface minimum height, RichTextEditorProps,
|
|
7
|
+
* RichTextEditorStatus, RichTextEditorStatusType, RichTextEditorSize
|
|
8
|
+
* @position Experimental (richtext) implementation; consumed by the package index.ts and
|
|
9
|
+
* re-exported from @astryxdesign/richtext. Tested by RichTextEditor.test.tsx.
|
|
10
|
+
*
|
|
11
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
12
|
+
* - /packages/richtext/src/RichTextEditor.doc.mjs (props table, features, implementation notes)
|
|
13
|
+
* - /packages/richtext/src/RichTextEditor.test.tsx (tests for new/changed behavior)
|
|
14
|
+
* - /packages/richtext/src/index.ts (exports if types change)
|
|
15
|
+
* - /apps/storybook/stories/RichTextEditor.stories.tsx (storybook stories)
|
|
16
|
+
*
|
|
17
|
+
* NOTE: This is an EXPERIMENTAL component in @astryxdesign/richtext (published only under
|
|
18
|
+
* the `@canary` dist-tag, never as stable `latest`). It is the initial landing for the
|
|
19
|
+
* OSS Lexical editor RFC; the goal is graduation to @astryxdesign/core after the
|
|
20
|
+
* Component Specification Protocol. `lexical` and `@lexical/*` are OPTIONAL peer
|
|
21
|
+
* dependencies — install them to use this component.
|
|
22
|
+
*/
|
|
23
|
+
import { type ReactNode } from 'react';
|
|
24
|
+
import { type FieldStatusVariant } from '@astryxdesign/core/Field';
|
|
25
|
+
import type { BaseProps } from '@astryxdesign/core';
|
|
26
|
+
import { type SizeValue } from '@astryxdesign/core/utils';
|
|
27
|
+
import { type Transformer } from '@lexical/markdown';
|
|
28
|
+
export type { Transformer } from '@lexical/markdown';
|
|
29
|
+
import { type EditorState, type Klass, type LexicalEditor, type LexicalNode } from 'lexical';
|
|
30
|
+
export type RichTextEditorStatusType = 'warning' | 'error' | 'success';
|
|
31
|
+
export type RichTextEditorSize = 'sm' | 'md' | 'lg';
|
|
32
|
+
export interface RichTextEditorStatus {
|
|
33
|
+
/** The type of status to display. */
|
|
34
|
+
type: RichTextEditorStatusType;
|
|
35
|
+
/** Optional message to display below the editor. */
|
|
36
|
+
message?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Imperative handle exposed via `ref`. Lets callers focus, clear, and read the
|
|
40
|
+
* editor without wiring a custom plugin. Available after mount.
|
|
41
|
+
*/
|
|
42
|
+
export interface RichTextEditorRef {
|
|
43
|
+
/**
|
|
44
|
+
* Move focus into the editor's editable surface. No-op when the editor is
|
|
45
|
+
* read-only or disabled.
|
|
46
|
+
*/
|
|
47
|
+
focus: () => void;
|
|
48
|
+
/**
|
|
49
|
+
* Remove all content, resetting the editor to a single empty paragraph.
|
|
50
|
+
* No-op when the editor is read-only or disabled.
|
|
51
|
+
*/
|
|
52
|
+
clear: () => void;
|
|
53
|
+
/** Read the current `EditorState`. Serialize with `.toJSON()` to persist. */
|
|
54
|
+
getEditorState: () => EditorState;
|
|
55
|
+
/**
|
|
56
|
+
* Serialize the current content to a Markdown string, using the same
|
|
57
|
+
* `transformers` the editor is configured with (so custom transformers
|
|
58
|
+
* layered in via the `transformers` prop are honored). Equivalent to
|
|
59
|
+
* `$convertToMarkdownString` run in a read context.
|
|
60
|
+
*/
|
|
61
|
+
getMarkdown: () => string;
|
|
62
|
+
/**
|
|
63
|
+
* Serialize the current content to an HTML string via
|
|
64
|
+
* `$generateHtmlFromNodes`. Requires a DOM (available in the browser and in
|
|
65
|
+
* jsdom-based tests). Useful for copy/paste, email, or non-Lexical consumers.
|
|
66
|
+
*/
|
|
67
|
+
getHTML: () => string;
|
|
68
|
+
/**
|
|
69
|
+
* Access the underlying `LexicalEditor` instance for advanced use cases
|
|
70
|
+
* (custom commands, listeners, node transforms).
|
|
71
|
+
*/
|
|
72
|
+
getEditor: () => LexicalEditor;
|
|
73
|
+
}
|
|
74
|
+
export interface RichTextEditorProps extends Omit<BaseProps, 'onChange' | 'defaultValue'> {
|
|
75
|
+
/** Label text for the editor (always rendered for accessibility). */
|
|
76
|
+
label: string;
|
|
77
|
+
/**
|
|
78
|
+
* Whether to visually hide the label (still accessible to screen readers).
|
|
79
|
+
* @default false
|
|
80
|
+
*/
|
|
81
|
+
isLabelHidden?: boolean;
|
|
82
|
+
/** Description text displayed between the label and editor. */
|
|
83
|
+
description?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Whether the field is optional. Mutually exclusive with isRequired.
|
|
86
|
+
* @default false
|
|
87
|
+
*/
|
|
88
|
+
isOptional?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Whether the field is required. Mutually exclusive with isOptional.
|
|
91
|
+
* @default false
|
|
92
|
+
*/
|
|
93
|
+
isRequired?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Initial serialized editor state (a JSON string produced by
|
|
96
|
+
* `JSON.stringify(editorState.toJSON())`), used to seed the editor on mount.
|
|
97
|
+
* The editor is uncontrolled: this is read once.
|
|
98
|
+
*/
|
|
99
|
+
defaultValue?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Callback fired when the editor content changes. Receives the current
|
|
102
|
+
* `EditorState` and the `LexicalEditor` instance. Serialize with
|
|
103
|
+
* `editorState.toJSON()` for persistence.
|
|
104
|
+
*/
|
|
105
|
+
onChange?: (editorState: EditorState, editor: LexicalEditor) => void;
|
|
106
|
+
/** Placeholder text shown when the editor is empty. */
|
|
107
|
+
placeholder?: string;
|
|
108
|
+
/**
|
|
109
|
+
* Whether the editor is read-only (non-editable).
|
|
110
|
+
* @default false
|
|
111
|
+
*/
|
|
112
|
+
isReadOnly?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Whether the editor is disabled (non-editable, dimmed).
|
|
115
|
+
* @default false
|
|
116
|
+
*/
|
|
117
|
+
isDisabled?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Status indicator. When set, displays a colored border. If message is
|
|
120
|
+
* provided, displays a message box below the editor.
|
|
121
|
+
*/
|
|
122
|
+
status?: RichTextEditorStatus;
|
|
123
|
+
/**
|
|
124
|
+
* How the status message is placed relative to the editor.
|
|
125
|
+
* - 'attached': message overlaps directly below the editor and the status
|
|
126
|
+
* icon remains inside the editing surface
|
|
127
|
+
* - 'detached': message floats below with its own leading status icon
|
|
128
|
+
* - 'tooltip': no message box; the in-editor status icon becomes a focusable
|
|
129
|
+
* info-tip button that reveals the message
|
|
130
|
+
* @default 'attached'
|
|
131
|
+
*/
|
|
132
|
+
statusVariant?: FieldStatusVariant;
|
|
133
|
+
/**
|
|
134
|
+
* Width of the field. Numbers are treated as pixels, strings are used as-is
|
|
135
|
+
* (e.g. `'100%'`).
|
|
136
|
+
*/
|
|
137
|
+
width?: SizeValue;
|
|
138
|
+
/**
|
|
139
|
+
* Minimum height of the editable content surface. Numbers are treated as
|
|
140
|
+
* pixels, strings are used as CSS lengths.
|
|
141
|
+
* @default '4.5rem'
|
|
142
|
+
*/
|
|
143
|
+
minHeight?: SizeValue;
|
|
144
|
+
/** Tooltip text to display in an info icon at the end of the label. */
|
|
145
|
+
labelTooltip?: string;
|
|
146
|
+
/**
|
|
147
|
+
* The size of the editor, affecting internal padding.
|
|
148
|
+
* @default 'md'
|
|
149
|
+
*/
|
|
150
|
+
size?: RichTextEditorSize;
|
|
151
|
+
/**
|
|
152
|
+
* Additional Lexical nodes to register beyond the default OSS set
|
|
153
|
+
* (Heading, Quote, List, Link, Code). Use this extension point to plug in
|
|
154
|
+
* custom nodes (e.g. mentions, images) without forking the editor.
|
|
155
|
+
*/
|
|
156
|
+
nodes?: ReadonlyArray<Klass<LexicalNode>>;
|
|
157
|
+
/**
|
|
158
|
+
* Toolbar content rendered edge-to-edge at the top of the field, before the
|
|
159
|
+
* padded editing surface. Pass `<RichTextEditorToolbar />` here so the
|
|
160
|
+
* toolbar stays inside the Lexical composer while retaining correct visual
|
|
161
|
+
* and keyboard order.
|
|
162
|
+
*/
|
|
163
|
+
toolbar?: ReactNode;
|
|
164
|
+
/**
|
|
165
|
+
* Additional Lexical plugins to render inside the composer. Use this to
|
|
166
|
+
* compose extra behaviour (mentions, autolink, etc.) on top of the base
|
|
167
|
+
* editor. Plugins receive the editor via `useLexicalComposerContext()`.
|
|
168
|
+
*/
|
|
169
|
+
plugins?: ReactNode;
|
|
170
|
+
/**
|
|
171
|
+
* Whether to enable Markdown shortcut typing (e.g. `# ` for a heading,
|
|
172
|
+
* `- ` for a list). Uses the `transformers` prop (defaults to the standard
|
|
173
|
+
* `@lexical/markdown` transformers).
|
|
174
|
+
* @default true
|
|
175
|
+
*/
|
|
176
|
+
hasMarkdownShortcuts?: boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Markdown transformers — the single source of truth for markdown behaviour.
|
|
179
|
+
* Defaults to the standard `@lexical/markdown` `TRANSFORMERS`.
|
|
180
|
+
*
|
|
181
|
+
* The same array drives all three markdown operations in Lexical (see the
|
|
182
|
+
* lexical-playground reference, where one `PLAYGROUND_TRANSFORMERS` array
|
|
183
|
+
* feeds each):
|
|
184
|
+
* - shortcut typing — `registerMarkdownShortcuts` (wired here today)
|
|
185
|
+
* - markdown -> state — `$convertFromMarkdownString` (future import API)
|
|
186
|
+
* - state -> markdown — `$convertToMarkdownString` (future `getMarkdown`)
|
|
187
|
+
*
|
|
188
|
+
* Pass a custom array to support additional node types (e.g. custom
|
|
189
|
+
* transformers layered in via the `nodes` extension point) consistently
|
|
190
|
+
* across all three. Shortcut typing is only applied when
|
|
191
|
+
* `hasMarkdownShortcuts` is true; the array is still the intended input for
|
|
192
|
+
* the serialization APIs added in later phases.
|
|
193
|
+
*/
|
|
194
|
+
transformers?: ReadonlyArray<Transformer>;
|
|
195
|
+
/** Whether to automatically focus the editor on mount. @default false */
|
|
196
|
+
hasAutoFocus?: boolean;
|
|
197
|
+
/**
|
|
198
|
+
* Screen-reader hint describing how to move focus out of the editor, since
|
|
199
|
+
* Tab is bound to indentation (press Escape, then Tab). Rendered visually
|
|
200
|
+
* hidden and referenced from the editor's `aria-describedby`. Override it
|
|
201
|
+
* to localize the text, or pass an empty string to omit the hint entirely
|
|
202
|
+
* (e.g. when the host app provides its own instructions).
|
|
203
|
+
* @default 'Press Escape then Tab to move focus out of the editor.'
|
|
204
|
+
*/
|
|
205
|
+
tabEscapeHint?: string;
|
|
206
|
+
/**
|
|
207
|
+
* Maximum number of characters. When set, a character counter
|
|
208
|
+
* (current/max) is displayed below the editor. Like TextArea, this does
|
|
209
|
+
* NOT enforce the limit natively — the counter shows error styling when the
|
|
210
|
+
* plain-text length exceeds the limit. Count is the editor's plain-text
|
|
211
|
+
* content length.
|
|
212
|
+
*/
|
|
213
|
+
maxLength?: number;
|
|
214
|
+
/**
|
|
215
|
+
* The Lexical composer namespace, used for editor identity.
|
|
216
|
+
* @default 'astryx-editor'
|
|
217
|
+
*/
|
|
218
|
+
namespace?: string;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* A WYSIWYG rich-text editor built on Lexical, styled with Astryx design
|
|
222
|
+
* tokens. Experimental — ships from `@astryxdesign/richtext` (canary). `lexical` and
|
|
223
|
+
* `@lexical/*` are optional peer dependencies — install them to use this
|
|
224
|
+
* component.
|
|
225
|
+
*
|
|
226
|
+
* The editor is intentionally minimal and extensible: pass `toolbar`, `nodes`,
|
|
227
|
+
* and `plugins` to layer richer behaviour (formatting, mentions, hover cards)
|
|
228
|
+
* on top without forking.
|
|
229
|
+
*
|
|
230
|
+
* The forwarded `RichTextEditorRef` exposes imperative `focus()` and `clear()`
|
|
231
|
+
* methods for callers that manage the editor from outside.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```
|
|
235
|
+
* import {RichTextEditor, type RichTextEditorRef} from '@astryxdesign/richtext';
|
|
236
|
+
* const ref = useRef<RichTextEditorRef>(null);
|
|
237
|
+
* <RichTextEditor
|
|
238
|
+
* ref={ref}
|
|
239
|
+
* label="Notes"
|
|
240
|
+
* placeholder="Write something..."
|
|
241
|
+
* onChange={state => save(JSON.stringify(state.toJSON()))}
|
|
242
|
+
* />
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
export declare const RichTextEditor: import("react").ForwardRefExoticComponent<RichTextEditorProps & import("react").RefAttributes<RichTextEditorRef>>;
|
|
246
|
+
//# sourceMappingURL=RichTextEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextEditor.d.ts","sourceRoot":"","sources":["../src/RichTextEditor.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAQL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AASf,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAyB,KAAK,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAiBhF,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,WAAW,EAEjB,MAAM,SAAS,CAAC;AAmJjB,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;;;OAGG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC;;;;;OAKG;IACH,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B;;;;OAIG;IACH,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,EAAE,MAAM,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAC/C,SAAS,EACT,UAAU,GAAG,cAAc,CAC5B;IACC,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACrE,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,cAAc,mHAkOzB,CAAC"}
|