@owomark/view 0.1.4 → 0.1.5

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/dist/static.d.ts DELETED
@@ -1,220 +0,0 @@
1
- import * as react from 'react';
2
- import { ReactNode } from 'react';
3
- import { BlockContent, Root } from 'mdast';
4
- import { Root as Root$1 } from 'hast';
5
-
6
- /**
7
- * Rehype plugin: unwrap display math from `<pre><code>` wrappers.
8
- *
9
- * remark-math + remark-rehype produce `<pre><code class="language-math math-display">`.
10
- * rehype-katex renders the KaTeX HTML inside that `<code>`, but the outer
11
- * `<pre>` triggers code-block styling and suppresses block-level math display.
12
- * This plugin hoists the rendered KaTeX content out of `<pre><code>`.
13
- */
14
- declare function rehypeMathDisplayFix(): (tree: any) => void;
15
-
16
- /**
17
- * Remark plugin: convert paragraph-level soft line breaks into hard break nodes.
18
- *
19
- * Only rewrites inline phrasing content inside paragraphs, so fenced code,
20
- * tables, math blocks, and other block structures keep their original
21
- * Markdown semantics.
22
- */
23
- declare function remarkConvertSoftBreaksToHardBreaks(): (tree: any) => void;
24
-
25
- /**
26
- * remark-side-annotation — OwoMark Side Annotation syntax plugin.
27
- *
28
- * Parses four tiers of side annotation syntax and produces SideAnnotation
29
- * container nodes in the mdast tree:
30
- *
31
- * - Tier 1: `text (>} annotation)` — single-block inline
32
- * - Tier 1+: `text (>} anno)` + `(>+)` — 2-3 block continuation
33
- * - Tier 2: `:::side (>} anno) ... :::` — 4+ block container
34
- * - Tier 3: `:::side [>id] ... :::` + def — long-content reference
35
- *
36
- * @see docs/pitch/owomark-side-annotation.md
37
- * @see docs/adr/ADR-010-owomark-side-annotation-syntax-design.md
38
- */
39
-
40
- /**
41
- * Custom mdast node for side annotations.
42
- * Discriminant: `type: 'sideAnnotation'` — use this for type guards
43
- * (e.g. `node.type === 'sideAnnotation'`).
44
- * Bridged to rehype via `data.hName`/`data.hProperties`.
45
- */
46
- interface SideAnnotationNode {
47
- /** Discriminant — always `'sideAnnotation'`. */
48
- type: 'sideAnnotation';
49
- data: {
50
- hName: 'div';
51
- hProperties: {
52
- className: string[];
53
- 'data-side-type': string;
54
- 'data-side-text'?: string;
55
- 'data-side-orphan'?: string;
56
- };
57
- };
58
- sideType: string;
59
- sideTypeSymbol: string;
60
- noteRef: string | null;
61
- inlineText: string | null;
62
- orphan?: boolean;
63
- children: BlockContent[];
64
- }
65
- declare function remarkSideAnnotation(): (tree: Root) => void;
66
-
67
- /**
68
- * rehype-side-annotation — Transforms remark-side-annotation output into
69
- * full HTML structure with CSS Grid layout and SVG decorations.
70
- *
71
- * After remark-rehype, SideAnnotation nodes become `<div>` elements with
72
- * `data-side-type` attributes. This plugin detects them and injects the
73
- * two-column grid structure (main content + annotation aside).
74
- *
75
- * SVG decorations use segmented rendering (ADR-014): fixed-height SVG
76
- * caps/beaks + flex-stretch line divs. This prevents curve distortion
77
- * at any container height.
78
- *
79
- * @see docs/adr/ADR-014-side-annotation-segmented-svg-rendering.md
80
- * @see docs/pitch/owomark-side-annotation.md §R4
81
- */
82
-
83
- declare function rehypeSideAnnotation(): (tree: Root$1) => void;
84
-
85
- type ProcessorMode = 'preview' | 'production';
86
- /** A single plugin or a [plugin, ...options] tuple accepted by unified. */
87
- type PluginEntry = unknown | [unknown, ...unknown[]];
88
- /** Minimal processor contract shared by unified and MDX engines. */
89
- interface OwoMarkProcessor {
90
- process(source: string): Promise<{
91
- toString(): string;
92
- value: string;
93
- }>;
94
- }
95
- /** React component map for MDX rendering. */
96
- type MdxComponentMap = Record<string, React.ComponentType<any>>;
97
- type OwoMarkProcessorOptions = {
98
- /** Rendering mode. Defaults to 'preview'. */
99
- mode?: ProcessorMode;
100
- /**
101
- * When false (default), plain newlines in paragraphs become `<br>`.
102
- * When true, CommonMark soft-break semantics are preserved.
103
- */
104
- preserveSoftLineBreaks?: boolean;
105
- /** Shiki theme for code highlighting. Defaults to 'vitesse-light'. */
106
- codeTheme?: string;
107
- /**
108
- * Additional rehype plugins injected after the core chain but before
109
- * rehype-stringify. Use this for host-specific plugins like
110
- * rehypeSourceLines (scroll-sync anchors).
111
- */
112
- extraRehypePlugins?: PluginEntry[];
113
- /**
114
- * Additional remark plugins injected after the core remark chain but
115
- * before remark-rehype. Use for host-specific remark transformations.
116
- */
117
- extraRemarkPlugins?: PluginEntry[];
118
- /** Enable side annotation syntax. Defaults to true. */
119
- enableSideAnnotation?: boolean;
120
- /** Enable math (KaTeX) rendering. Defaults to true. */
121
- enableMath?: boolean;
122
- /** Enable fenced markdown sandbox rendering. Defaults to true. */
123
- enableMarkdownSandbox?: boolean;
124
- /** Markdown sandbox configuration. */
125
- markdownSandbox?: {
126
- outerFenceTicks?: number;
127
- };
128
- /**
129
- * Enable MDX rendering via @mdx-js/mdx evaluate().
130
- * When true, the processor delegates to evaluate() + renderToStaticMarkup()
131
- * instead of the unified pipeline. Defaults to false.
132
- */
133
- enableMdx?: boolean;
134
- /**
135
- * Additional or override React components for MDX rendering.
136
- * Merged on top of the built-in defaults (Callout, CodeDemo).
137
- * Only used when enableMdx is true.
138
- */
139
- mdxComponents?: MdxComponentMap;
140
- };
141
- /**
142
- * Create a fully configured processor (Gold Processor).
143
- *
144
- * When `enableMdx` is false (default), returns a unified Processor.
145
- * When `enableMdx` is true, returns an MDX-aware processor that delegates to
146
- * `@mdx-js/mdx` evaluate() + renderToStaticMarkup(). Both share the same
147
- * `process(source) → HTML string` contract.
148
- */
149
- declare function createOwoMarkProcessor(options?: OwoMarkProcessorOptions): OwoMarkProcessor;
150
- declare function getOwoMarkPlugins(options?: OwoMarkProcessorOptions): {
151
- remarkPlugins: PluginEntry[];
152
- rehypePlugins: PluginEntry[];
153
- };
154
-
155
- declare function Callout({ type, children }: {
156
- type?: string;
157
- children?: ReactNode;
158
- }): react.DetailedReactHTMLElement<{
159
- className: string;
160
- 'data-callout-type': string;
161
- }, HTMLElement>;
162
-
163
- declare function CodeDemo({ title, language, code }: {
164
- title?: string;
165
- language?: string;
166
- code: string;
167
- }): react.DetailedReactHTMLElement<{
168
- className: string;
169
- 'data-code-demo': string;
170
- }, HTMLElement>;
171
-
172
- declare function Steps({ children }: {
173
- children?: ReactNode;
174
- }): react.DetailedReactHTMLElement<{
175
- className: string;
176
- }, HTMLElement>;
177
- declare function Step({ title, children }: {
178
- title?: string;
179
- children?: ReactNode;
180
- }): react.DetailedReactHTMLElement<{
181
- className: string;
182
- }, HTMLElement>;
183
-
184
- declare function Tabs({ children }: {
185
- children?: ReactNode;
186
- }): react.DetailedReactHTMLElement<{
187
- className: string;
188
- }, HTMLElement>;
189
- declare function Tab({ label: _label, children }: {
190
- label?: string;
191
- children?: ReactNode;
192
- }): react.DetailedReactHTMLElement<react.HTMLAttributes<HTMLElement>, HTMLElement>;
193
-
194
- declare function FileTree({ children }: {
195
- children?: ReactNode;
196
- }): react.DetailedReactHTMLElement<{
197
- className: string;
198
- }, HTMLElement>;
199
-
200
- declare function Kbd({ children }: {
201
- children?: ReactNode;
202
- }): react.DetailedReactHTMLElement<{
203
- className: string;
204
- }, HTMLElement>;
205
-
206
- /**
207
- * Built-in MDX components shipped with owomark-view.
208
- *
209
- * These are the default components available when `enableMdx: true`.
210
- * Users can override any of these or add new ones via the `mdxComponents` option.
211
- */
212
-
213
- declare const DEFAULT_MDX_COMPONENTS: MdxComponentMap;
214
-
215
- declare const THEME_LIGHT_CLASS = "owo-theme-light";
216
- declare const THEME_DARK_CLASS = "owo-theme-dark";
217
- type OwoMarkThemeName = 'light' | 'dark' | string;
218
- declare function getThemeClassName(theme: OwoMarkThemeName): string;
219
-
220
- export { Callout, CodeDemo, DEFAULT_MDX_COMPONENTS, FileTree, Kbd, type MdxComponentMap, type OwoMarkProcessor, type OwoMarkProcessorOptions, type OwoMarkThemeName, type PluginEntry, type ProcessorMode, type SideAnnotationNode, Step, Steps, THEME_DARK_CLASS, THEME_LIGHT_CLASS, Tab, Tabs, createOwoMarkProcessor, getOwoMarkPlugins, getThemeClassName, rehypeMathDisplayFix, rehypeSideAnnotation, remarkConvertSoftBreaksToHardBreaks, remarkSideAnnotation };
package/dist/static.js DELETED
@@ -1,40 +0,0 @@
1
- import {
2
- Callout,
3
- CodeDemo,
4
- DEFAULT_MDX_COMPONENTS,
5
- FileTree,
6
- Kbd,
7
- Step,
8
- Steps,
9
- THEME_DARK_CLASS,
10
- THEME_LIGHT_CLASS,
11
- Tab,
12
- Tabs,
13
- createOwoMarkProcessor,
14
- getOwoMarkPlugins,
15
- getThemeClassName,
16
- rehypeMathDisplayFix,
17
- rehypeSideAnnotation,
18
- remarkConvertSoftBreaksToHardBreaks,
19
- remarkSideAnnotation
20
- } from "./chunk-DHRAXGIK.js";
21
- export {
22
- Callout,
23
- CodeDemo,
24
- DEFAULT_MDX_COMPONENTS,
25
- FileTree,
26
- Kbd,
27
- Step,
28
- Steps,
29
- THEME_DARK_CLASS,
30
- THEME_LIGHT_CLASS,
31
- Tab,
32
- Tabs,
33
- createOwoMarkProcessor,
34
- getOwoMarkPlugins,
35
- getThemeClassName,
36
- rehypeMathDisplayFix,
37
- rehypeSideAnnotation,
38
- remarkConvertSoftBreaksToHardBreaks,
39
- remarkSideAnnotation
40
- };
@@ -1,336 +0,0 @@
1
- /* @owomark/view built-in MDX component styles.
2
- * Import this in your app: import '@owomark/view/mdx-components.css'
3
- * All classes are prefixed with `mdx-` to avoid collisions.
4
- * Colors reference --owo-* base tokens with hardcoded fallbacks for zero-config use. */
5
-
6
- /* --- Callout --- */
7
-
8
- .mdx-callout {
9
- display: flex;
10
- gap: 0.75rem;
11
- padding: 0.875rem 1rem;
12
- border-radius: 8px;
13
- border: 1px solid;
14
- margin-bottom: 1.25rem;
15
- }
16
-
17
- .mdx-callout-icon {
18
- flex-shrink: 0;
19
- display: flex;
20
- align-items: center;
21
- justify-content: center;
22
- width: 1.5rem;
23
- height: 1.5rem;
24
- border-radius: 9999px;
25
- font-weight: 700;
26
- font-size: 0.8rem;
27
- line-height: 1;
28
- }
29
-
30
- .mdx-callout-content > :first-child { margin-top: 0; }
31
- .mdx-callout-content > :last-child { margin-bottom: 0; }
32
-
33
- .mdx-callout-info {
34
- background-color: color-mix(in srgb, var(--owo-brand, #3b82f6) 6%, transparent);
35
- border-color: color-mix(in srgb, var(--owo-brand, #3b82f6) 24%, transparent);
36
- }
37
- .mdx-callout-info .mdx-callout-icon { background-color: var(--owo-brand, #3b82f6); color: white; }
38
-
39
- .mdx-callout-warn {
40
- background-color: color-mix(in srgb, var(--owo-warning, #f59e0b) 6%, transparent);
41
- border-color: color-mix(in srgb, var(--owo-warning, #f59e0b) 24%, transparent);
42
- }
43
- .mdx-callout-warn .mdx-callout-icon { background-color: var(--owo-warning, #f59e0b); color: white; }
44
-
45
- .mdx-callout-error {
46
- background-color: color-mix(in srgb, var(--owo-error, #ef4444) 6%, transparent);
47
- border-color: color-mix(in srgb, var(--owo-error, #ef4444) 24%, transparent);
48
- }
49
- .mdx-callout-error .mdx-callout-icon { background-color: var(--owo-error, #ef4444); color: white; }
50
-
51
- .mdx-callout-success {
52
- background-color: color-mix(in srgb, var(--owo-success, #22c55e) 6%, transparent);
53
- border-color: color-mix(in srgb, var(--owo-success, #22c55e) 24%, transparent);
54
- }
55
- .mdx-callout-success .mdx-callout-icon { background-color: var(--owo-success, #22c55e); color: white; }
56
-
57
- /* --- CodeDemo --- */
58
-
59
- .mdx-code-demo { margin-bottom: 1.5rem; }
60
- .mdx-code-demo figcaption {
61
- font-size: 0.85rem;
62
- opacity: 0.7;
63
- margin-bottom: 0.5rem;
64
- font-weight: 500;
65
- }
66
-
67
- /* --- Steps --- */
68
-
69
- .mdx-steps { margin-bottom: 1.5rem; }
70
-
71
- .mdx-steps-item {
72
- display: flex;
73
- gap: 1rem;
74
- }
75
-
76
- .mdx-steps-indicator {
77
- display: flex;
78
- flex-direction: column;
79
- align-items: center;
80
- flex-shrink: 0;
81
- }
82
-
83
- .mdx-steps-number {
84
- display: flex;
85
- align-items: center;
86
- justify-content: center;
87
- width: 1.75rem;
88
- height: 1.75rem;
89
- border-radius: 9999px;
90
- background-color: var(--owo-brand, #3b82f6);
91
- color: white;
92
- font-weight: 700;
93
- font-size: 0.8rem;
94
- line-height: 1;
95
- flex-shrink: 0;
96
- }
97
-
98
- .mdx-steps-line {
99
- width: 2px;
100
- flex: 1;
101
- background-color: var(--owo-border, #e2e8f0);
102
- min-height: 1rem;
103
- }
104
-
105
- .mdx-steps-content {
106
- flex: 1;
107
- padding-bottom: 1.5rem;
108
- min-width: 0;
109
- }
110
-
111
- .mdx-steps-item:last-child .mdx-steps-content { padding-bottom: 0; }
112
-
113
- .mdx-step-title {
114
- font-size: 1rem;
115
- font-weight: 600;
116
- margin: 0 0 0.5rem;
117
- }
118
-
119
- .mdx-step-body > :first-child { margin-top: 0; }
120
- .mdx-step-body > :last-child { margin-bottom: 0; }
121
-
122
- /* --- Tabs --- */
123
-
124
- .mdx-tabs {
125
- margin-bottom: 1.5rem;
126
- border: 1px solid var(--owo-border, #e2e8f0);
127
- border-radius: 8px;
128
- overflow: hidden;
129
- }
130
-
131
- .mdx-tabs-list {
132
- display: flex;
133
- border-bottom: 1px solid var(--owo-border, #e2e8f0);
134
- background-color: var(--owo-surface-raised, #f8fafc);
135
- }
136
-
137
- .mdx-tabs-trigger {
138
- padding: 0.5rem 1rem;
139
- font-size: 0.875rem;
140
- font-weight: 500;
141
- cursor: pointer;
142
- color: var(--owo-text-muted, #64748b);
143
- border-bottom: 2px solid transparent;
144
- margin-bottom: -1px;
145
- transition: color 0.15s, border-color 0.15s;
146
- }
147
-
148
- .mdx-tabs-radio { display: none; }
149
-
150
- .mdx-tabs-trigger:has(.mdx-tabs-radio:checked) {
151
- border-bottom-color: var(--owo-brand, #3b82f6);
152
- color: var(--owo-brand, #3b82f6);
153
- }
154
-
155
- .mdx-tabs-panel {
156
- display: none;
157
- padding: 1rem;
158
- }
159
-
160
- .mdx-tabs-panel > :first-child { margin-top: 0; }
161
- .mdx-tabs-panel > :last-child { margin-bottom: 0; }
162
-
163
- /* CSS-only tab switching via :has() */
164
- .mdx-tabs-list:has(.mdx-tabs-trigger:nth-child(1) .mdx-tabs-radio:checked) ~ .mdx-tabs-panel:nth-of-type(1),
165
- .mdx-tabs-list:has(.mdx-tabs-trigger:nth-child(2) .mdx-tabs-radio:checked) ~ .mdx-tabs-panel:nth-of-type(2),
166
- .mdx-tabs-list:has(.mdx-tabs-trigger:nth-child(3) .mdx-tabs-radio:checked) ~ .mdx-tabs-panel:nth-of-type(3),
167
- .mdx-tabs-list:has(.mdx-tabs-trigger:nth-child(4) .mdx-tabs-radio:checked) ~ .mdx-tabs-panel:nth-of-type(4),
168
- .mdx-tabs-list:has(.mdx-tabs-trigger:nth-child(5) .mdx-tabs-radio:checked) ~ .mdx-tabs-panel:nth-of-type(5) {
169
- display: block;
170
- }
171
-
172
- /* --- FileTree --- */
173
-
174
- .mdx-file-tree {
175
- font-family: var(--owo-font-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace);
176
- font-size: 0.875rem;
177
- background-color: var(--owo-surface-raised, #f8fafc);
178
- border: 1px solid var(--owo-border, #e2e8f0);
179
- border-radius: 8px;
180
- padding: 0.75rem 0;
181
- margin-bottom: 1.5rem;
182
- overflow-x: auto;
183
- }
184
-
185
- .mdx-file-tree-entry {
186
- display: flex;
187
- align-items: center;
188
- gap: 0.5rem;
189
- padding: 0.15rem 0.75rem;
190
- line-height: 1.6;
191
- }
192
-
193
- .mdx-file-tree-icon { flex-shrink: 0; font-size: 0.85em; }
194
- .mdx-file-tree-dir .mdx-file-tree-name { font-weight: 600; }
195
-
196
- /* --- Kbd --- */
197
-
198
- .mdx-kbd {
199
- display: inline-block;
200
- padding: 0.1em 0.45em;
201
- font-family: var(--owo-font-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace);
202
- font-size: 0.85em;
203
- line-height: 1.4;
204
- color: var(--owo-text, #1e293b);
205
- background-color: var(--owo-surface-raised, #f1f5f9);
206
- border: 1px solid var(--owo-border-strong, #cbd5e1);
207
- border-bottom-width: 2px;
208
- border-radius: 4px;
209
- box-shadow: 0 1px 0 var(--owo-border, #e2e8f0);
210
- vertical-align: baseline;
211
- }
212
-
213
- /* --- Unregistered component fallback --- */
214
-
215
- [data-mdx-missing] {
216
- padding: 0.5rem 1rem;
217
- background-color: color-mix(in srgb, var(--owo-warning, #f59e0b) 8%, transparent);
218
- border: 1px dashed color-mix(in srgb, var(--owo-warning, #f59e0b) 40%, transparent);
219
- border-radius: 4px;
220
- margin-bottom: 1rem;
221
- }
222
-
223
- [data-mdx-missing]::before {
224
- content: "Missing component: " attr(data-mdx-missing);
225
- display: block;
226
- font-size: 0.75rem;
227
- color: var(--owo-warning, #f59e0b);
228
- font-weight: 600;
229
- margin-bottom: 0.25rem;
230
- }
231
-
232
- /* --- Markdown Sandbox --- */
233
-
234
- .owo-markdown-sandbox {
235
- margin: 1.5rem 0;
236
- border: 1px solid color-mix(in srgb, var(--owo-border, #e2e8f0) 88%, white);
237
- border-radius: 12px;
238
- overflow: clip;
239
- background:
240
- linear-gradient(180deg, color-mix(in srgb, var(--owo-surface-raised, #f8fafc) 92%, white), #ffffff);
241
- box-shadow: 0 10px 30px color-mix(in srgb, #0f172a 8%, transparent);
242
- }
243
-
244
- .owo-markdown-sandbox__header {
245
- display: flex;
246
- align-items: center;
247
- justify-content: space-between;
248
- gap: 0.75rem;
249
- padding: 0.85rem 1rem;
250
- border-bottom: 1px solid color-mix(in srgb, var(--owo-border, #e2e8f0) 88%, white);
251
- background: color-mix(in srgb, var(--owo-surface-raised, #f8fafc) 72%, white);
252
- list-style: none;
253
- cursor: default;
254
- }
255
-
256
- .owo-markdown-sandbox__details > .owo-markdown-sandbox__header::-webkit-details-marker {
257
- display: none;
258
- }
259
-
260
- .owo-markdown-sandbox__title {
261
- font-size: 0.95rem;
262
- font-weight: 600;
263
- color: var(--owo-text, #0f172a);
264
- }
265
-
266
- .owo-markdown-sandbox__status {
267
- flex-shrink: 0;
268
- padding: 0.2rem 0.55rem;
269
- border-radius: 999px;
270
- font-size: 0.72rem;
271
- font-weight: 600;
272
- letter-spacing: 0.04em;
273
- text-transform: uppercase;
274
- color: var(--owo-brand, #2563eb);
275
- background: color-mix(in srgb, var(--owo-brand, #2563eb) 10%, white);
276
- }
277
-
278
- .owo-markdown-sandbox__body {
279
- isolation: isolate;
280
- padding: 1.1rem 1.15rem;
281
- color: var(--owo-text, #0f172a);
282
- font-family: var(--owo-font-sans, "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif);
283
- line-height: 1.75;
284
- }
285
-
286
- .owo-markdown-sandbox__body :where(h1, h2, h3, h4, h5, h6, p, ul, ol, blockquote, pre, table, figure) {
287
- margin-block: 0 1rem;
288
- }
289
-
290
- .owo-markdown-sandbox__body :where(h1, h2, h3, h4, h5, h6) {
291
- color: var(--owo-text, #0f172a);
292
- line-height: 1.25;
293
- }
294
-
295
- .owo-markdown-sandbox__body :where(pre) {
296
- overflow-x: auto;
297
- }
298
-
299
- .owo-markdown-sandbox__body :where(code, pre code) {
300
- font-family: var(--owo-font-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace);
301
- }
302
-
303
- .owo-markdown-sandbox__source-panel {
304
- border-top: 1px solid color-mix(in srgb, var(--owo-border, #e2e8f0) 88%, white);
305
- background: color-mix(in srgb, var(--owo-surface-raised, #f8fafc) 55%, white);
306
- }
307
-
308
- .owo-markdown-sandbox__source-panel > summary {
309
- cursor: pointer;
310
- padding: 0.8rem 1rem;
311
- font-size: 0.82rem;
312
- font-weight: 600;
313
- color: var(--owo-text-muted, #475569);
314
- }
315
-
316
- .owo-markdown-sandbox__source {
317
- margin: 0;
318
- padding: 0 1rem 1rem;
319
- overflow-x: auto;
320
- font-size: 0.88rem;
321
- }
322
-
323
- .owo-markdown-sandbox__source code {
324
- font-family: var(--owo-font-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace);
325
- }
326
-
327
- .owo-markdown-sandbox--error .owo-markdown-sandbox__status {
328
- color: var(--owo-error, #dc2626);
329
- background: color-mix(in srgb, var(--owo-error, #dc2626) 10%, white);
330
- }
331
-
332
- .owo-markdown-sandbox__error-message {
333
- margin: 0 0 0.85rem;
334
- color: var(--owo-error, #b91c1c);
335
- font-weight: 500;
336
- }