@atom-forge/brickee 0.0.1 → 0.0.3
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/CHANGELOG.md +59 -1
- package/README-AI.md +34 -28
- package/dist/Editor.svelte +713 -867
- package/dist/Editor.svelte.d.ts +0 -3
- package/dist/LinkPrompt.svelte +1 -14
- package/dist/Preview.svelte +27 -58
- package/dist/Preview.svelte.d.ts +2 -7
- package/dist/PropsBar.svelte +75 -249
- package/dist/PropsBar.svelte.d.ts +0 -3
- package/dist/code.d.ts +12 -0
- package/dist/code.js +15 -0
- package/dist/dom.d.ts +8 -0
- package/dist/dom.js +9 -0
- package/dist/editor/BlockMenu.svelte +102 -0
- package/dist/editor/BlockMenu.svelte.d.ts +32 -0
- package/dist/editor/FormatBar.svelte +41 -0
- package/dist/editor/FormatBar.svelte.d.ts +16 -0
- package/dist/editor/drag.svelte.d.ts +63 -0
- package/dist/editor/drag.svelte.js +95 -0
- package/dist/editor/history.d.ts +24 -0
- package/dist/editor/history.js +86 -0
- package/dist/editor/sweep.svelte.d.ts +21 -0
- package/dist/editor/sweep.svelte.js +56 -0
- package/dist/html.d.ts +12 -0
- package/dist/html.js +206 -0
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -3
- package/dist/kit/Empty.svelte +4 -15
- package/dist/kit/Frame.svelte +7 -37
- package/dist/locales/hu.js +6 -8
- package/dist/markdown.d.ts +20 -6
- package/dist/markdown.js +380 -85
- package/dist/model.js +2 -3
- package/dist/plugins/Gap.svelte +5 -8
- package/dist/plugins/GapPreview.svelte +4 -6
- package/dist/plugins/Map.svelte +2 -17
- package/dist/plugins/MapPreview.svelte +8 -10
- package/dist/plugins/Table.svelte +233 -282
- package/dist/plugins/TablePreview.svelte +28 -28
- package/dist/plugins/YouTube.svelte +3 -31
- package/dist/plugins/YouTubePreview.svelte +45 -43
- package/dist/plugins/index.js +15 -2
- package/dist/schema.js +1 -1
- package/dist/types.d.ts +27 -10
- package/dist/types.js +8 -1
- package/dist/view.js +1 -1
- package/docs/en/bundled-plugins.md +1 -1
- package/docs/en/documents-and-markdown.md +24 -19
- package/docs/en/editor-and-preview.md +7 -10
- package/docs/en/getting-started.md +14 -2
- package/docs/en/host-contexts.md +26 -132
- package/docs/en/index.md +5 -5
- package/docs/en/recipes-and-pitfalls.md +12 -11
- package/docs/en/server-side.md +0 -17
- package/docs/en/upgrading.md +34 -4
- package/docs/en/writing-plugins.md +147 -21
- package/docs/hu/bundled-plugins.md +1 -1
- package/docs/hu/documents-and-markdown.md +24 -19
- package/docs/hu/editor-and-preview.md +7 -10
- package/docs/hu/getting-started.md +14 -2
- package/docs/hu/host-contexts.md +26 -132
- package/docs/hu/index.md +5 -5
- package/docs/hu/recipes-and-pitfalls.md +12 -11
- package/docs/hu/server-side.md +0 -17
- package/docs/hu/upgrading.md +34 -4
- package/docs/hu/writing-plugins.md +147 -21
- package/package.json +14 -2
- package/dist/ImagePicker.svelte +0 -131
- package/dist/ImagePicker.svelte.d.ts +0 -13
- package/dist/media.d.ts +0 -17
- package/dist/media.js +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -7,9 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.0.3] - 2026-11-11
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Table cells show their text formatted (bold, italic, code, links…) while they are not edited, instead of the raw markdown; while editing, `Ctrl/Cmd` + `B`, `I`, `E`, `Shift+X` and `K` wrap the selected text in the mark (a link with its address selected to type over).
|
|
15
|
+
- Touch and keyboard: *Move up* / *Move down* in the Turn-into menu (moving without dragging); the Turn-into menu opens from the keyboard (`/`, `Ctrl/Cmd+/`, the menu key or `Shift+F10` on selected blocks, `Ctrl/Cmd+/` in a block's text); on a touch screen a tapped block shows its actions beside its handle; the handle is a button (with a label for screen readers) and its actions also show on focus.
|
|
16
|
+
- Files pasted into the editor or dropped on it from outside the page go to a plugin that takes them: the new optional `BlockPlugin.fromFiles(files)` returns the block's props (or a promise of them, after its own upload) or `null` for the next plugin. A drop line shows where a dropped file lands; the step is undoable.
|
|
17
|
+
- Formatted paste: text pasted from a web page, Google Docs or Word keeps its headings, paragraphs, lists (nested, numbered, to-dos), quotes, code, rules, tables (for a plugin that takes them) and inline marks, instead of arriving as plain text. Exported as `fromHtml(html, { plugins })` (browser only); it reads the HTML through markdown, so the result is as safe as any other text.
|
|
18
|
+
- Pasting or importing a GFM table: `fromMarkdown(text, { plugins })` gives it to the first plugin with the new `BlockPlugin.fromTable(table: MarkdownTable)`, which returns the block's props; the bundled `table` takes them, so a table pasted into an editor that offers it becomes a table block.
|
|
19
|
+
- A numbered list keeps its start number (`props.start` on its first `md:ol` item): read from markdown (`5. …`), numbered from it in the editor and the preview (`<ol start>`), and written back.
|
|
20
|
+
- Tests for the markdown conversions (`bun run test`, vitest), run by the release checks, the publish workflow and a new test workflow on every push and pull request (type check, tests, package).
|
|
21
|
+
- Code review findings and a staged fix plan in `notes/` (not shipped), linked from `TODO.md`.
|
|
22
|
+
- Development tools (not shipped): `scripts/shots.mjs` and `scripts/shots-diff.mjs` photograph the editor's looks in light and dark mode from the dev pages (`/dev/states`, `/dev/perf`) and compare two sets pixel by pixel; `<style lang="scss">` is enabled (compiled at build time, so `dist/` holds plain CSS).
|
|
23
|
+
|
|
10
24
|
### Changed
|
|
11
|
-
- Configure releases with Ship.
|
|
12
25
|
|
|
26
|
+
- The undo history shares unchanged blocks between its steps: a step costs only the blocks that changed, not a copy of the whole document (in a 2000-block document about 320 KB a step before, 300 steps kept).
|
|
27
|
+
- The editor's accent (selection, active menu row, checked to-do, links, the focused table cell, the toggles) follows the `@atom-forge/ui` theme's accent colour instead of a fixed blue (blue remains the fallback), and the editor and the table use the page's typeface (the editor keeps its 17px size), so they read like the preview beside them.
|
|
28
|
+
- **Breaking:** the editor is styled with Tailwind classes (with the `@atom-forge/ui` theme's colours) and SCSS instead of scoped CSS, so a host must add the package's `dist` folder as a Tailwind `@source`, like the `@atom-forge/ui` one; otherwise the editor loses its look. The preview is unaffected (its styles still travel with its markup). The slash and turn-into menus and the formatting bar are their own components, and the undo history its own class. See the upgrading chapter.
|
|
29
|
+
- The editor's internal context keys are `brickee:*` (were `block-editor:*`); an "Unknown block" note is translatable (`Unknown block: {type}`, also in the Hungarian locale).
|
|
30
|
+
- `fromMarkdown` reads much more of CommonMark and GFM: fences of any length and `~~~` (closed only by a fence at least as long), indented code, setext headings and closing `#`s, nested quotes, list nesting by the items' markers (also under `1. ` and with four-space indents), reference links, footnotes (as superscripts), and the lines of a paragraph, list item or quote as one block with line breaks instead of one block per line.
|
|
31
|
+
- `inline` reads `_italic_`, `__bold__` and `***both***` (now valid HTML), code spans of any backtick length, link targets with balanced parentheses and titles, `<https://…>` autolinks, images (as links), every ASCII punctuation escape, and inline HTML (marks kept, other tags dropped). A stored text with a word wrapped in single underscores (`_word_`) now shows it in italics.
|
|
32
|
+
- Typing converts only the edited block to its stored form: the other blocks keep their objects in `value`, so the editor and a `<Preview>` beside it do much less work per keystroke (a 2000-block document with a preview: about 50 ms → 33 ms per keystroke). A document from outside is reloaded when `value` is replaced with a new array that differs from the current one; changing the array in place is not picked up.
|
|
33
|
+
- `toMarkdown` writes markdown other readers read the same way: items nested under a numbered item indented to its content, code fenced longer than any backtick run in it, consecutive quotes as one quote, line breaks as a backslash at the line's end, `_` and line starts that would read as markup escaped.
|
|
34
|
+
|
|
35
|
+
### Removed
|
|
36
|
+
|
|
37
|
+
- **Breaking:** gate blocks — gating content is the application's concept, not the editor's. Removed: `BlockPlugin.gate`, the `Preview`'s `markGated` prop and its "For supporters only" section (`.supporters`, `.supporters-label`), and that text in the Hungarian locale; the `Preview` renders every block. `unique` stays. See the upgrading chapter.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- The slash menu, the turn-into menu, the formatting bar and the link prompt open where they belong when the editor sits in a transformed parent (an animated drawer or dialog); they live in the body now, placed against the viewport.
|
|
42
|
+
- The table block fills the width of the editor on pages that use Tailwind: its root's class `table` collided with Tailwind's `table` utility (`display: table`), which shrank it to its content.
|
|
43
|
+
- A server-rendered editor shows its blocks' text (it was empty until the page's script ran, so a read-only editor showed nothing without JavaScript). A test renders the editor and the preview on the server, and the test workflow builds the showcase site (which prerenders every page).
|
|
44
|
+
- An editor or a table removed in the middle of a block sweep, a drag or typing leaves no window listener or timer behind.
|
|
45
|
+
- Copying and pasting blocks keeps plugin blocks: the clipboard carries the blocks themselves (`application/x-brickee+json`) beside their markdown, so a copied video, table, gap or box is pasted back as that block instead of a link or nothing; an editor that does not offer the plugin (or already has a unique one) gets its markdown form. An empty block takes pasted plugin blocks in its place, and pasting while blocks are selected inserts after them.
|
|
46
|
+
- Changes made in a plugin's view are undoable: table cells, rows and columns, and the blocks of a nested editor (a box) are undo steps of the editor around them, and Ctrl+Z / Ctrl+Shift+Z in a table cell undo and redo there instead of the cell's own short-lived history. A document loaded from outside starts a fresh history.
|
|
47
|
+
- A read-only editor no longer writes its normalized document back into `value` on mount, so a host does not see a change nobody made.
|
|
48
|
+
- Inline markdown and `fromMarkdown` stay fast on hostile text: many unclosed HTML tags, a long run of `[`, unclosed `**` or `_`, or long runs of spaces could freeze the tab for seconds to minutes; every pattern is now linear (100 000 characters take milliseconds). Limits that come with it: a marked span is at most 2000 characters, a link label has no brackets of its own (at most 1000 characters), a link target at most 2000. Inline HTML marks are now always balanced (an unclosed `<b>` is closed, a stray closing tag dropped).
|
|
49
|
+
|
|
50
|
+
## [0.0.2] - 2026-11-10
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- Showcase site in `src/routes` (`bun run dev`), styled like the `@atom-forge/ui` site: a playground (editor beside its preview, stored JSON and markdown), the guide (editor and preview, split view, markdown, stored form and schema), a page per bundled plugin, writing, nesting and overriding plugins, image blocks, and the host contexts (per-view values, code languages, localisation), each with live examples and their code. It resolves `@atom-forge/brickee` to the local source and prerenders to `build/` (`@sveltejs/adapter-static`); it is not part of the npm package.
|
|
55
|
+
- A `toggles` field kind (`PropField`): a row of icon buttons, each switching one of `options` on or off (`options[].icon` is the button, `label` its tooltip), stored as the list of the ones on.
|
|
56
|
+
- `provideCodeLanguages(() => list)` (with `useCodeLanguages` and the `CodeLanguage` type): a host context that turns a code block's language field into a dropdown of the given languages, with *None* first; without it the language stays free text. Nested editors inherit the list, and a stored language missing from it stays an option.
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
|
|
60
|
+
- The fields bar is more compact: smaller controls and type, text fields show their label as the placeholder (with the field's own placeholder after it), the other fields a short label beside the control.
|
|
61
|
+
- The table's header and footer rows are two icon toggles in its fields bar (a `toggles` field), like any plugin field; the toolbar above the table holds only the row and column tools of the cell being edited, and says to click a cell while none is. The info icon with the keyboard hint is gone.
|
|
62
|
+
- The editor follows the host's light and dark mode: its colours (block fields, popups, frames, the table editor, the block actions) come from the `@atom-forge/ui` theme tokens with the former colours as fallbacks, and the props bar and the link prompt no longer force the light theme. The previews' table borders, video captions and the gap's stripes are drawn from the text colour.
|
|
63
|
+
- A code block's language is edited in the same fields bar as a plugin's (its header shows `code · <language>`), instead of a small input in its corner; read-only, the corner still shows the language.
|
|
64
|
+
- The block handles keep 1px free above and below, so the handles of neighbouring blocks do not touch.
|
|
65
|
+
- The docs note that the block handles are drawn about 22 px left of the editor's box, so the element around it needs that much left padding.
|
|
66
|
+
- Releases are configured with `ship-it init`: the publish workflow comes from Ship's template, `package.json` gains `pub-validate` and `publishConfig`, and npm Trusted Publishing lets CI publish the next versions.
|
|
67
|
+
|
|
68
|
+
### Removed
|
|
69
|
+
|
|
70
|
+
- **Breaking:** images and media are no longer the library's concept — whether a block stores a URL or an id, how the user picks an image and how it is resolved is the application's decision. Removed: the `image` and `images` field kinds with their picker, the `media` prop of `Editor` and `Preview`, `provideMedia`, `useMedia`, `findMedia`, the `MediaItem` type, `toMarkdown`'s `media` option and `MarkdownContext.media`. An image block is an app plugin that picks in its own view or dialog and resolves with the app's own data; stored documents are unaffected. See the upgrading chapter.
|
|
13
71
|
|
|
14
72
|
## [0.0.1] - 2026-11-10
|
|
15
73
|
|
package/README-AI.md
CHANGED
|
@@ -6,14 +6,16 @@ Brickee is a block editor. Its core is a markdown block editor (`md:p`, `md:h1`
|
|
|
6
6
|
|
|
7
7
|
## Rules
|
|
8
8
|
|
|
9
|
-
- Peers: `svelte` 5, `@atom-forge/ui` (popups and field controls), `@lucide/svelte`; `zod` only for `@atom-forge/brickee/schema`. The app must set up `@atom-forge/ui` (Tailwind 4, its theme CSS and `@source`, the app beneath its `Root`).
|
|
10
|
-
- Store the editor's `value` (`StoredBlock[]`) as it is. Built-in types start with `md:`; any other `type` is a plugin's. Never rename a plugin's `type`: stored documents refer to it.
|
|
9
|
+
- Peers: `svelte` 5, `@atom-forge/ui` (popups and field controls), `@lucide/svelte`; `zod` only for `@atom-forge/brickee/schema`. The app must set up `@atom-forge/ui` (Tailwind 4, its theme CSS and `@source`, the app beneath its `Root`) and add `@atom-forge/brickee/dist` as a Tailwind `@source` too (the editor is styled with Tailwind classes); the preview needs no Tailwind.
|
|
10
|
+
- Store the editor's `value` (`StoredBlock[]`) as it is. To change it from outside, assign a new array (an in-place change is not picked up); a read-only editor never writes it. Built-in types start with `md:`; any other `type` is a plugin's. Never rename a plugin's `type`: stored documents refer to it.
|
|
11
11
|
- Pass the same `plugins` to the `Editor` and the `Preview` of a document type. Restrict what an editor offers with `palette` (palette ids: `md:*` kinds and plugin types), not by dropping plugins.
|
|
12
|
-
-
|
|
13
|
-
-
|
|
12
|
+
- The editor's colours come from the `@atom-forge/ui` theme tokens (light/dark follow the host). Its block handles sit ~22 px left of its box: leave that much left padding around it.
|
|
13
|
+
- No app-specific editor props: app data reaches plugins through contexts (`provideView`, `provideCodeLanguages`, `messages` / `provideText`), plugin fields, or the app's own modules and contexts.
|
|
14
|
+
- No image concept: no image field, picker or media list. An image block is an app plugin that stores what the app chooses (a URL, or an id of its own media library), picks it in its view or the app's own dialog, and resolves ids with the app's own data.
|
|
15
|
+
- Plugin props are untrusted user input. Previews sanitize: `safeColor` for colours, check links and image addresses (`http(s)` or site-relative), clamp numbers, never `{@html}` with props.
|
|
14
16
|
- A plugin view declares both `props` and `blocks` with `$bindable()`, even if unused.
|
|
15
17
|
- Containers (`content: 'blocks'`) nest one level only; nested editors never offer containers or unique plugins. `accepts` narrows their content (`'md:*'` = every built-in).
|
|
16
|
-
- `unique`: one per document, top level; not enforced by the schema.
|
|
18
|
+
- `unique`: one per document, top level; not enforced by the schema.
|
|
17
19
|
- `toMarkdown` and `toStored` use the DOM: browser only. `fromMarkdown`, `fromStored`, `inline`, the schema and `./model` run anywhere.
|
|
18
20
|
- Validate saved documents on the server with `blocksSchemaFor(plugins)`; it checks shape and `accepts`, not known types, uniqueness or prop contents.
|
|
19
21
|
- Scroll sync is proportional (same scroll fraction), one way, editor → preview; it needs no markup and shows roughly the same place, not the same block.
|
|
@@ -24,10 +26,10 @@ Brickee is a block editor. Its core is a markdown block editor (`md:p`, `md:h1`
|
|
|
24
26
|
|
|
25
27
|
```ts
|
|
26
28
|
// @atom-forge/brickee — components
|
|
27
|
-
// <Editor bind:value={StoredBlock[]} plugins?={BlockPlugin[]} palette?={string[]}
|
|
28
|
-
//
|
|
29
|
-
// <Preview blocks={StoredBlock[]} plugins={BlockPlugin[]}
|
|
30
|
-
//
|
|
29
|
+
// <Editor bind:value={StoredBlock[]} plugins?={BlockPlugin[]} palette?={string[]} messages?={Messages}
|
|
30
|
+
// readonly?={boolean} placeholder?={string} /> // `nested` is for Frame only
|
|
31
|
+
// <Preview blocks={StoredBlock[]} plugins={BlockPlugin[]} messages?={Messages}
|
|
32
|
+
// nested?={boolean} />
|
|
31
33
|
// <Frame bind:blocks {readonly} {palette} {plugins} heading?={string} empty?={string} image?={string} placeholder?={string} />
|
|
32
34
|
// <Empty icon={Icon} text={string} />
|
|
33
35
|
|
|
@@ -42,16 +44,16 @@ function blocksToPlainText(blocks: StoredBlock[]): string;
|
|
|
42
44
|
function inline(md: string): string; // inline markdown -> safe inline HTML
|
|
43
45
|
function fromStored(s: StoredBlock): Block;
|
|
44
46
|
function toStored(b: Block): StoredBlock; // browser only
|
|
45
|
-
function fromMarkdown(src: string): Block[];
|
|
46
|
-
function
|
|
47
|
+
function fromMarkdown(src: string, opts?: { plugins?: BlockPlugin[] }): Block[]; // CommonMark/GFM blocks; a paragraph's lines stay one block; a GFM table goes to the first plugin with fromTable
|
|
48
|
+
function fromHtml(html: string, opts?: { plugins?: BlockPlugin[] }): Block[]; // browser only; formatted paste (web, Google Docs, Word) via markdown
|
|
49
|
+
function toMarkdown(blocks: Block[], opts?: { plugins?: BlockPlugin[] }): string; // browser only
|
|
47
50
|
|
|
48
51
|
// contexts (call provide* in component init, above the editor/preview; use* in plugin components)
|
|
49
|
-
interface MediaItem { id: string; name: string; url: string; group?: string }
|
|
50
|
-
function provideMedia(own: () => MediaItem[] | undefined): void;
|
|
51
|
-
function useMedia(): () => MediaItem[];
|
|
52
|
-
function findMedia(list: MediaItem[], id: unknown): MediaItem | undefined;
|
|
53
52
|
function provideView(get: () => string | undefined): void;
|
|
54
53
|
function useView(): () => string | undefined;
|
|
54
|
+
interface CodeLanguage { value: string; label?: string } // value: stored as the code block's props.lang
|
|
55
|
+
function provideCodeLanguages(own: () => (string | CodeLanguage)[] | undefined): void; // list: the language field is a dropdown
|
|
56
|
+
function useCodeLanguages(): () => CodeLanguage[]; // empty: free text
|
|
55
57
|
type Messages = Record<string, string>;
|
|
56
58
|
type Translate = (text: string, vars?: Record<string, string | number>) => string; // fills {name}
|
|
57
59
|
function provideText(own: () => Messages | undefined): void;
|
|
@@ -94,17 +96,19 @@ interface BlockPlugin<P extends Props = Props> {
|
|
|
94
96
|
preview?: Component<PluginPreviewProps<any>>; // optional: without it <Preview> renders nothing for the block
|
|
95
97
|
accepts?: string[]; // container content as palette ids; 'md:*'
|
|
96
98
|
markdown?(props: P, ctx: MarkdownContext): string; // '' = left out
|
|
99
|
+
fromTable?(table: MarkdownTable): P; // takes a pasted/imported GFM table (bundled `table` does)
|
|
100
|
+
fromFiles?(files: File[]): P | null | Promise<P | null>; // takes pasted/dropped files; null = next plugin; upload is yours
|
|
97
101
|
unique?: boolean;
|
|
98
|
-
gate?: boolean;
|
|
99
102
|
}
|
|
100
103
|
interface PluginViewProps<P> { props: P; blocks: StoredBlock[]; readonly: boolean; palette: string[]; plugins: BlockPlugin[] }
|
|
101
104
|
interface PluginPreviewProps<P> { props: P; blocks: StoredBlock[]; plugins: BlockPlugin[] }
|
|
102
|
-
interface MarkdownContext { inner: string
|
|
105
|
+
interface MarkdownContext { inner: string }
|
|
106
|
+
interface MarkdownTable { rows: string[][] /* inline markdown, first row = header */; align: ('left' | 'center' | 'right')[] }
|
|
103
107
|
interface PropField {
|
|
104
108
|
key: string; label: string;
|
|
105
|
-
kind: 'text' | 'textarea' | 'color' | 'select' | 'slider' | '
|
|
109
|
+
kind: 'text' | 'textarea' | 'color' | 'select' | 'slider' | 'toggles'; // toggles: icon buttons, stores the list of the ones on
|
|
106
110
|
placeholder?: string;
|
|
107
|
-
options?: { value: string; label: string }[]; // select; stepped slider
|
|
111
|
+
options?: { value: string; label: string; icon?: Icon }[]; // select; stepped slider (label may use {n}); toggles (icon + tooltip)
|
|
108
112
|
min?: number; max?: number; step?: number; unit?: string; // number slider (stored as string)
|
|
109
113
|
none?: string; // unset label (number slider notch, optional colour)
|
|
110
114
|
views?: { key: string; label: string }[]; // per-view slider values
|
|
@@ -113,10 +117,10 @@ interface PropField {
|
|
|
113
117
|
}
|
|
114
118
|
|
|
115
119
|
// @atom-forge/brickee/plugins
|
|
116
|
-
// table, youtube, map, gap — the only bundled plugins (none holds nested blocks or
|
|
120
|
+
// table, youtube, map, gap — the only bundled plugins (none holds nested blocks or images); PLUGINS = [table, youtube, map, gap]
|
|
117
121
|
// types: TableProps, YouTubeProps, MapProps, GapProps, Head
|
|
118
122
|
// helpers: youtubeId, mapSrc, gapLines, GAP_LINES, GAP_MAX, tableHeads, rowHead, HEADS, square
|
|
119
|
-
// Image blocks, boxes and other containers are app plugins you write yourself (see docs/en/writing-plugins.md
|
|
123
|
+
// Image blocks, boxes and other containers are app plugins you write yourself (see docs/en/writing-plugins.md).
|
|
120
124
|
|
|
121
125
|
// @atom-forge/brickee/schema (zod)
|
|
122
126
|
const blocksSchema: ZodType<StoredBlock[]>;
|
|
@@ -130,16 +134,15 @@ function blocksSchemaFor(plugins: readonly { type: string; accepts?: readonly st
|
|
|
130
134
|
|
|
131
135
|
```svelte
|
|
132
136
|
<script lang="ts">
|
|
133
|
-
import { Editor, Preview, type
|
|
137
|
+
import { Editor, Preview, type StoredBlock } from '@atom-forge/brickee';
|
|
134
138
|
import { PLUGINS } from '@atom-forge/brickee/plugins';
|
|
135
139
|
import { hu } from '@atom-forge/brickee/locales/hu';
|
|
136
140
|
|
|
137
|
-
let { media = [] }: { media?: MediaItem[] } = $props();
|
|
138
141
|
let value = $state<StoredBlock[]>([]);
|
|
139
142
|
</script>
|
|
140
143
|
|
|
141
|
-
<Editor bind:value plugins={PLUGINS}
|
|
142
|
-
<Preview blocks={value} plugins={PLUGINS}
|
|
144
|
+
<Editor bind:value plugins={PLUGINS} messages={hu} />
|
|
145
|
+
<Preview blocks={value} plugins={PLUGINS} messages={hu} />
|
|
143
146
|
```
|
|
144
147
|
|
|
145
148
|
## Common extensions
|
|
@@ -214,7 +217,7 @@ export const plugins: BlockPlugin[] = [
|
|
|
214
217
|
];
|
|
215
218
|
```
|
|
216
219
|
|
|
217
|
-
**Markdown form and conversion** — `markdown(props, { inner
|
|
220
|
+
**Markdown form and conversion** — `markdown(props, { inner })` returns markdown or `''`; use `mdText`, `mdJoin`, `mdQuote`. Whole document: `toMarkdown(doc.map(fromStored), { plugins })`; import: `fromMarkdown(text).map(toStored)` (both in the browser).
|
|
218
221
|
|
|
219
222
|
**Per-view fields** — add `views` to a slider field and provide the current view:
|
|
220
223
|
|
|
@@ -256,12 +259,15 @@ const result = blocksSchemaFor(plugins).safeParse(input); // or pass [{ type, ac
|
|
|
256
259
|
| Symptom | Cause | Fix |
|
|
257
260
|
|---|---|---|
|
|
258
261
|
| Fields and popups unstyled | `@atom-forge/ui` theme CSS / `@source` missing | Set up `@atom-forge/ui`; render beneath its `Root`. |
|
|
262
|
+
| Editor rows, menus or table unstyled / shrunk | `@atom-forge/brickee/dist` not a Tailwind `@source` | `@source "../node_modules/@atom-forge/brickee/dist";` |
|
|
263
|
+
| Block handles stick out on the left | Handles are drawn ~22 px left of the editor's box | Give the editor's container ~22 px left padding. |
|
|
259
264
|
| Context errors with a linked local copy | Duplicate `svelte` / `@atom-forge/ui` | Vite `resolve.dedupe: ['svelte', '@atom-forge/ui', '@lucide/svelte', 'zod']`. |
|
|
260
265
|
| A block is missing from `<Preview>` | Its plugin has no `preview` | Add one (bundled plugins have a default) or render it yourself. |
|
|
261
|
-
| "Unknown block" in the editor, block missing on the site | Plugin missing from `plugins
|
|
266
|
+
| "Unknown block" in the editor, block missing on the site | Plugin missing from `plugins` | Same plugins for editor and preview. |
|
|
267
|
+
| Image block renders nothing | Preview rejects the stored address, or the app's lookup lacks the id | Store `http(s)` / site-relative addresses; resolve ids from the same app data everywhere. |
|
|
268
|
+
| `media` prop, `useMedia`, `findMedia`, `kind: 'image'` missing | Removed: images are the app's business | Own picking and lookup in the app's image plugin (see `docs/en/upgrading.md`). |
|
|
262
269
|
| Box not offered inside a box | One nesting level | By design. |
|
|
263
270
|
| Block not offered inside a container | `accepts` or host `palette` excludes it | Add its palette id (or `'md:*'`). |
|
|
264
|
-
| Gated content visible to all | `gate` only marks | Cut the document on the server. |
|
|
265
271
|
| `document is not defined` | `toMarkdown` / `toStored` during SSR | Call in the browser. |
|
|
266
272
|
| Injected colour / link | Props rendered unchecked | `safeColor`, link checks, no `{@html}`. |
|
|
267
273
|
| Override loses its blocks | `type` changed | Keep `type`. |
|