@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.
Files changed (41) hide show
  1. package/README.md +53 -33
  2. package/dist/RichTextEditor.d.ts +246 -0
  3. package/dist/RichTextEditor.d.ts.map +1 -0
  4. package/dist/RichTextEditor.js +557 -0
  5. package/dist/RichTextEditorAutoLinkPlugin.d.ts +84 -0
  6. package/dist/RichTextEditorAutoLinkPlugin.d.ts.map +1 -0
  7. package/dist/RichTextEditorAutoLinkPlugin.js +94 -0
  8. package/dist/RichTextEditorToolbar.d.ts +131 -0
  9. package/dist/RichTextEditorToolbar.d.ts.map +1 -0
  10. package/dist/RichTextEditorToolbar.js +775 -0
  11. package/dist/RichTextView.d.ts +64 -0
  12. package/dist/RichTextView.d.ts.map +1 -0
  13. package/dist/RichTextView.js +167 -0
  14. package/dist/editorNodes.d.ts +8 -0
  15. package/dist/editorNodes.d.ts.map +1 -0
  16. package/dist/editorNodes.js +23 -0
  17. package/dist/editorTheme.d.ts +7 -0
  18. package/dist/editorTheme.d.ts.map +1 -0
  19. package/dist/editorTheme.js +102 -0
  20. package/dist/index.d.ts +18 -14
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +15 -15
  23. package/dist/linkUtils.d.ts +22 -0
  24. package/dist/linkUtils.d.ts.map +1 -0
  25. package/dist/linkUtils.js +90 -0
  26. package/dist/markdownSerializers.d.ts +40 -0
  27. package/dist/markdownSerializers.d.ts.map +1 -0
  28. package/dist/markdownSerializers.js +84 -0
  29. package/dist/richtext.css +104 -0
  30. package/package.json +69 -4
  31. package/src/RichTextEditor.doc.mjs +218 -0
  32. package/src/RichTextEditor.test.tsx +1671 -0
  33. package/src/RichTextEditor.tsx +944 -0
  34. package/src/RichTextEditorAutoLinkPlugin.tsx +115 -0
  35. package/src/RichTextEditorToolbar.tsx +970 -0
  36. package/src/RichTextView.tsx +226 -0
  37. package/src/editorNodes.ts +34 -0
  38. package/src/editorTheme.ts +185 -0
  39. package/src/index.ts +48 -14
  40. package/src/linkUtils.ts +92 -0
  41. 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
- > **Status: empty scaffold.** This package is bootstrapped but does not export
6
- > anything yet. It will house the rich text editor and viewer that currently
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
- It will ship to npm **only under the `@canary` dist-tag** — there is never a
11
- stable (`latest`) release yet.
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
- ## Trying richtext in your own project (canary)
40
+ Inside the monorepo (storybook/sandbox), imports resolve via pnpm workspaces:
14
41
 
15
- Once components land, `@astryxdesign/richtext` will be published **only** under
16
- the `@canary` dist-tag, so you must request that tag explicitly. There is no
17
- `latest` version to install.
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. Move the editor/view source from `@astryxdesign/lab` into `src/` and export
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
- 3. Add a changeset (`pnpm changeset`) selecting `@astryxdesign/richtext` so the
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
- 4. The stable (`latest`) release job (`.github/workflows/release.yml`) will then
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":"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"}