@dxos/react-ui-syntax-highlighter 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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 (43) hide show
  1. package/dist/lib/browser/index.mjs +186 -133
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +186 -133
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/JsonHighlighter/JsonHighlighter.d.ts +23 -0
  8. package/dist/types/src/JsonHighlighter/JsonHighlighter.d.ts.map +1 -0
  9. package/dist/types/src/JsonHighlighter/JsonHighlighter.stories.d.ts +14 -0
  10. package/dist/types/src/JsonHighlighter/JsonHighlighter.stories.d.ts.map +1 -0
  11. package/dist/types/src/JsonHighlighter/index.d.ts +2 -0
  12. package/dist/types/src/JsonHighlighter/index.d.ts.map +1 -0
  13. package/dist/types/src/Syntax/Syntax.d.ts +49 -0
  14. package/dist/types/src/Syntax/Syntax.d.ts.map +1 -0
  15. package/dist/types/src/Syntax/Syntax.stories.d.ts +23 -0
  16. package/dist/types/src/Syntax/Syntax.stories.d.ts.map +1 -0
  17. package/dist/types/src/Syntax/index.d.ts +2 -0
  18. package/dist/types/src/Syntax/index.d.ts.map +1 -0
  19. package/dist/types/src/SyntaxHighlighter/SyntaxHighlighter.d.ts +12 -4
  20. package/dist/types/src/SyntaxHighlighter/SyntaxHighlighter.d.ts.map +1 -1
  21. package/dist/types/src/SyntaxHighlighter/SyntaxHighlighter.stories.d.ts +6 -1
  22. package/dist/types/src/SyntaxHighlighter/SyntaxHighlighter.stories.d.ts.map +1 -1
  23. package/dist/types/src/index.d.ts +2 -1
  24. package/dist/types/src/index.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +25 -23
  27. package/src/JsonHighlighter/JsonHighlighter.stories.tsx +65 -0
  28. package/src/JsonHighlighter/JsonHighlighter.tsx +47 -0
  29. package/src/JsonHighlighter/index.ts +5 -0
  30. package/src/Syntax/Syntax.stories.tsx +99 -0
  31. package/src/Syntax/Syntax.tsx +229 -0
  32. package/src/{Json → Syntax}/index.ts +1 -1
  33. package/src/SyntaxHighlighter/SyntaxHighlighter.stories.tsx +11 -10
  34. package/src/SyntaxHighlighter/SyntaxHighlighter.tsx +96 -41
  35. package/src/index.ts +2 -1
  36. package/dist/types/src/Json/Json.d.ts +0 -20
  37. package/dist/types/src/Json/Json.d.ts.map +0 -1
  38. package/dist/types/src/Json/Json.stories.d.ts +0 -16
  39. package/dist/types/src/Json/Json.stories.d.ts.map +0 -1
  40. package/dist/types/src/Json/index.d.ts +0 -2
  41. package/dist/types/src/Json/index.d.ts.map +0 -1
  42. package/src/Json/Json.stories.tsx +0 -96
  43. package/src/Json/Json.tsx +0 -130
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-syntax-highlighter",
3
- "version": "0.8.4-main.a4bbb77",
3
+ "version": "0.8.4-main.abd8ff62ef",
4
4
  "description": "A syntax highlighter wrapper.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "DXOS.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
@@ -17,37 +21,35 @@
17
21
  }
18
22
  },
19
23
  "types": "dist/types/src/index.d.ts",
20
- "typesVersions": {
21
- "*": {}
22
- },
23
24
  "files": [
24
25
  "dist",
25
26
  "src"
26
27
  ],
27
28
  "dependencies": {
28
- "@preact-signals/safe-react": "^0.9.0",
29
- "jsonpath": "^1.1.1",
30
- "react-syntax-highlighter": "^15.6.1"
29
+ "@radix-ui/react-context": "1.1.1",
30
+ "jsonpath-plus": "^10.3.0",
31
+ "react-syntax-highlighter": "^15.6.1",
32
+ "@dxos/util": "0.8.4-main.abd8ff62ef",
33
+ "@dxos/ui-types": "0.8.4-main.abd8ff62ef"
31
34
  },
32
35
  "devDependencies": {
33
- "@types/jsonpath": "^0.2.4",
34
- "@types/react": "~19.2.0",
35
- "@types/react-dom": "~19.2.0",
36
+ "@types/react": "~19.2.7",
37
+ "@types/react-dom": "~19.2.3",
36
38
  "@types/react-syntax-highlighter": "^15.5.13",
37
- "react": "~19.2.0",
38
- "react-dom": "~19.2.0",
39
- "vite": "7.1.9",
40
- "@dxos/random": "0.8.4-main.a4bbb77",
41
- "@dxos/react-ui": "0.8.4-main.a4bbb77",
42
- "@dxos/react-ui-theme": "0.8.4-main.a4bbb77",
43
- "@dxos/storybook-utils": "0.8.4-main.a4bbb77",
44
- "@dxos/util": "0.8.4-main.a4bbb77"
39
+ "react": "~19.2.3",
40
+ "react-dom": "~19.2.3",
41
+ "vite": "^8.0.10",
42
+ "@dxos/storybook-utils": "0.8.4-main.abd8ff62ef",
43
+ "@dxos/react-ui": "0.8.4-main.abd8ff62ef",
44
+ "@dxos/util": "0.8.4-main.abd8ff62ef",
45
+ "@dxos/ui-theme": "0.8.4-main.abd8ff62ef",
46
+ "@dxos/random": "0.8.4-main.abd8ff62ef"
45
47
  },
46
48
  "peerDependencies": {
47
- "react": "^19.0.0",
48
- "react-dom": "^19.0.0",
49
- "@dxos/react-ui": "0.8.4-main.a4bbb77",
50
- "@dxos/react-ui-theme": "0.8.4-main.a4bbb77"
49
+ "react": "~19.2.3",
50
+ "react-dom": "~19.2.3",
51
+ "@dxos/react-ui": "0.8.4-main.abd8ff62ef",
52
+ "@dxos/ui-theme": "0.8.4-main.abd8ff62ef"
51
53
  },
52
54
  "publishConfig": {
53
55
  "access": "public"
@@ -0,0 +1,65 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+
7
+ import { random } from '@dxos/random';
8
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
9
+
10
+ import { JsonHighlighter } from './JsonHighlighter';
11
+
12
+ random.seed(0);
13
+
14
+ const createNode = () => {
15
+ const data: Record<string, any> = {};
16
+ const keys = [...Array(random.number.int({ min: 1, max: 5 }))].map(() => random.lorem.word());
17
+ keys.forEach((key) => {
18
+ switch (random.helpers.arrayElement(['object', 'string', 'number', 'boolean', 'null'])) {
19
+ case 'object':
20
+ data[key] = createNode();
21
+ break;
22
+ case 'string':
23
+ data[key] = random.lorem.word();
24
+ break;
25
+ case 'number':
26
+ data[key] = random.number.int();
27
+ break;
28
+ case 'boolean':
29
+ data[key] = random.datatype.boolean();
30
+ break;
31
+ case 'null':
32
+ data[key] = null;
33
+ break;
34
+ }
35
+ });
36
+ return data;
37
+ };
38
+
39
+ const createCycle = () => {
40
+ const data: any = { a: 1, b: [] };
41
+ data.b.push(data);
42
+ return data;
43
+ };
44
+
45
+ const meta = {
46
+ title: 'ui/react-ui-syntax-highlighter/JsonHighlighter',
47
+ component: JsonHighlighter,
48
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
49
+ } satisfies Meta<typeof JsonHighlighter>;
50
+
51
+ export default meta;
52
+
53
+ type Story = StoryObj<typeof JsonHighlighter>;
54
+
55
+ export const Default: Story = {
56
+ args: {
57
+ data: createNode(),
58
+ },
59
+ };
60
+
61
+ export const Cycle: Story = {
62
+ args: {
63
+ data: createCycle(),
64
+ },
65
+ };
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { composable } from '@dxos/ui-theme';
8
+ import { type CreateReplacerProps, createReplacer, safeStringify } from '@dxos/util';
9
+
10
+ import { SyntaxHighlighter, type SyntaxHighlighterProps } from '../SyntaxHighlighter';
11
+
12
+ export type JsonReplacer = CreateReplacerProps | ((key: string, value: any) => any);
13
+
14
+ export type JsonHighlighterProps = Omit<SyntaxHighlighterProps, 'children' | 'language'> & {
15
+ data?: any;
16
+ replacer?: JsonReplacer;
17
+ /** Indentation passed to `JSON.stringify`. Default: `2` (pretty-printed). Pass `0` for single-line output. */
18
+ indent?: number;
19
+ testId?: string;
20
+ };
21
+
22
+ const resolveReplacer = (replacer?: JsonReplacer) => {
23
+ if (!replacer) {
24
+ return undefined;
25
+ }
26
+ return typeof replacer === 'function' ? replacer : createReplacer(replacer);
27
+ };
28
+
29
+ /**
30
+ * Inline, non-scrolling JSON renderer.
31
+ *
32
+ * Thin wrapper around `SyntaxHighlighter` that stringifies `data` with an optional replacer.
33
+ * `replacer` accepts either `CreateReplacerProps` (declarative truncation) or a raw
34
+ * `JSON.stringify`-compatible function (for bespoke serialization).
35
+ * For filtering and scroll behaviour, compose with the `Syntax.*` namespace.
36
+ */
37
+ export const JsonHighlighter = composable<HTMLDivElement, JsonHighlighterProps>(
38
+ ({ data, replacer, indent = 2, testId, ...props }, forwardedRef) => {
39
+ return (
40
+ <SyntaxHighlighter {...props} language='json' data-testid={testId} ref={forwardedRef}>
41
+ {safeStringify(data, resolveReplacer(replacer), indent)}
42
+ </SyntaxHighlighter>
43
+ );
44
+ },
45
+ );
46
+
47
+ JsonHighlighter.displayName = 'JsonHighlighter';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './JsonHighlighter';
@@ -0,0 +1,99 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { random } from '@dxos/random';
9
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
10
+ import { trim } from '@dxos/util';
11
+
12
+ import { Syntax } from './Syntax';
13
+
14
+ random.seed(0);
15
+
16
+ const createNode = () => {
17
+ const data: Record<string, any> = {};
18
+ const keys = [...Array(random.number.int({ min: 1, max: 5 }))].map(() => random.lorem.word());
19
+ keys.forEach((key) => {
20
+ switch (random.helpers.arrayElement(['object', 'string', 'number', 'boolean', 'null'])) {
21
+ case 'object':
22
+ data[key] = createNode();
23
+ break;
24
+ case 'string':
25
+ data[key] = random.lorem.word();
26
+ break;
27
+ case 'number':
28
+ data[key] = random.number.int();
29
+ break;
30
+ case 'boolean':
31
+ data[key] = random.datatype.boolean();
32
+ break;
33
+ case 'null':
34
+ data[key] = null;
35
+ break;
36
+ }
37
+ });
38
+ return data;
39
+ };
40
+
41
+ const createData = ({ depth = 2, children = 3 } = {}): any => {
42
+ const createChildren = (root: any, d = 0) => {
43
+ if (d < depth) {
44
+ const num = random.number.int({ min: 1, max: Math.round(Math.log(depth + 1 - d) * children) });
45
+ root.children = [...new Array(num)].map(() => createChildren(createNode(), d + 1));
46
+ }
47
+ return root;
48
+ };
49
+ return createChildren(createNode());
50
+ };
51
+
52
+ const meta = {
53
+ title: 'ui/react-ui-syntax-highlighter/Syntax',
54
+ component: Syntax.Root,
55
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
56
+ } satisfies Meta;
57
+
58
+ export default meta;
59
+
60
+ type Story = StoryObj<typeof meta>;
61
+
62
+ /** JSON composite with filter and scrolling viewport. */
63
+ export const Json: Story = {
64
+ render: (args) => (
65
+ <Syntax.Root {...args}>
66
+ <Syntax.Content>
67
+ <Syntax.Filter />
68
+ <Syntax.Viewport>
69
+ <Syntax.Code />
70
+ </Syntax.Viewport>
71
+ </Syntax.Content>
72
+ </Syntax.Root>
73
+ ),
74
+ args: {
75
+ data: createData({ depth: 5 }),
76
+ replacer: { maxDepth: 3, maxArrayLen: 10, maxStringLen: 10 },
77
+ } as any,
78
+ };
79
+
80
+ /** Text composite (TypeScript source) with scrolling viewport and no filter. */
81
+ export const Text: Story = {
82
+ render: (args) => (
83
+ <Syntax.Root {...args}>
84
+ <Syntax.Viewport>
85
+ <Syntax.Code />
86
+ </Syntax.Viewport>
87
+ </Syntax.Root>
88
+ ),
89
+ args: {
90
+ language: 'tsx',
91
+ source: trim`
92
+ import React from 'react'
93
+
94
+ const Test = () => {
95
+ return <div>Test</div>
96
+ }
97
+ `,
98
+ } as any,
99
+ };
@@ -0,0 +1,229 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContextScope, type Scope } from '@radix-ui/react-context';
6
+ import { JSONPath } from 'jsonpath-plus';
7
+ import React, { type FC, type PropsWithChildren, forwardRef, useMemo, useState } from 'react';
8
+
9
+ import { Input, ScrollArea } from '@dxos/react-ui';
10
+ import { composable, composableProps } from '@dxos/ui-theme';
11
+ import { type ComposableProps } from '@dxos/ui-types';
12
+
13
+ import { JsonHighlighter, type JsonReplacer } from '../JsonHighlighter';
14
+ import { SyntaxHighlighter } from '../SyntaxHighlighter';
15
+
16
+ //
17
+ // Context
18
+ //
19
+
20
+ const SYNTAX_NAME = 'Syntax';
21
+
22
+ type SyntaxContextValue = {
23
+ mode: 'text' | 'json';
24
+ // Text mode.
25
+ source?: string;
26
+ language?: string;
27
+ // JSON mode.
28
+ data?: any;
29
+ filteredData?: any;
30
+ filterText: string;
31
+ setFilterText: (text: string) => void;
32
+ filterError: Error | null;
33
+ replacer?: JsonReplacer;
34
+ };
35
+
36
+ type ScopedProps<P> = P & { __scopeSyntax?: Scope };
37
+
38
+ const [createSyntaxContext, createSyntaxScope] = createContextScope(SYNTAX_NAME);
39
+ const [SyntaxProvider, useSyntaxContext] = createSyntaxContext<SyntaxContextValue>(SYNTAX_NAME);
40
+
41
+ //
42
+ // Root
43
+ //
44
+
45
+ const SYNTAX_ROOT_NAME = 'Syntax.Root';
46
+
47
+ type SyntaxRootProps = PropsWithChildren<{
48
+ // Text mode.
49
+ language?: string;
50
+ source?: string;
51
+ // JSON mode (presence of the `data` prop selects JSON mode; `undefined` is still JSON).
52
+ data?: any;
53
+ /**
54
+ * `JSON.stringify` replacer applied to `data`. Use the function form to follow domain
55
+ * references (e.g. ECHO refs) by returning a transformed value at the root call. Keeps
56
+ * this package free of any domain-specific knowledge.
57
+ */
58
+ replacer?: JsonReplacer;
59
+ }>;
60
+
61
+ /**
62
+ * Headless context provider. Selects JSON mode when the `data` prop is passed at all — even
63
+ * `data={undefined}` — so loading states render an empty JSON view rather than flipping to
64
+ * text mode (which would trip `Syntax.Filter`'s JSON-only guard). Mode is chosen by prop
65
+ * presence, not value.
66
+ */
67
+ const SyntaxRoot: FC<ScopedProps<SyntaxRootProps>> = (props) => {
68
+ const { __scopeSyntax, children, language, source, replacer } = props;
69
+ const isJson = 'data' in props;
70
+ const data = props.data;
71
+ const [filterText, setFilterText] = useState('');
72
+
73
+ const { filteredData, filterError } = useMemo<{ filteredData: any; filterError: Error | null }>(() => {
74
+ if (!isJson || !filterText.trim().length) {
75
+ return { filteredData: data, filterError: null };
76
+ }
77
+ try {
78
+ return { filteredData: JSONPath({ path: filterText, json: data }), filterError: null };
79
+ } catch (err) {
80
+ return { filteredData: data, filterError: err as Error };
81
+ }
82
+ }, [isJson, data, filterText]);
83
+
84
+ return (
85
+ <SyntaxProvider
86
+ scope={__scopeSyntax}
87
+ mode={isJson ? 'json' : 'text'}
88
+ source={source}
89
+ language={language}
90
+ data={data}
91
+ filteredData={filteredData}
92
+ filterText={filterText}
93
+ setFilterText={setFilterText}
94
+ filterError={filterError}
95
+ replacer={replacer}
96
+ >
97
+ {children}
98
+ </SyntaxProvider>
99
+ );
100
+ };
101
+
102
+ SyntaxRoot.displayName = SYNTAX_ROOT_NAME;
103
+
104
+ //
105
+ // Content
106
+ //
107
+
108
+ const SYNTAX_CONTENT_NAME = 'Syntax.Content';
109
+
110
+ type SyntaxContentProps = ComposableProps;
111
+
112
+ /** Flex-column layout container for composite parts. */
113
+ const SyntaxContent = composable<HTMLDivElement, SyntaxContentProps>(({ children, ...props }, forwardedRef) => {
114
+ return (
115
+ <div {...composableProps(props, { classNames: 'flex flex-col h-full min-h-0 overflow-hidden' })} ref={forwardedRef}>
116
+ {children}
117
+ </div>
118
+ );
119
+ });
120
+
121
+ SyntaxContent.displayName = SYNTAX_CONTENT_NAME;
122
+
123
+ //
124
+ // Filter
125
+ //
126
+
127
+ const SYNTAX_FILTER_NAME = 'Syntax.Filter';
128
+
129
+ type SyntaxFilterProps = ComposableProps<{
130
+ placeholder?: string;
131
+ }>;
132
+
133
+ /** JSONPath filter input. Only meaningful when `Syntax.Root` is in JSON mode. */
134
+ const SyntaxFilter = forwardRef<HTMLInputElement, ScopedProps<SyntaxFilterProps>>(
135
+ ({ __scopeSyntax, classNames, placeholder = 'JSONPath (e.g., $.graph.nodes)' }, forwardedRef) => {
136
+ const { mode, filterText, setFilterText, filterError } = useSyntaxContext(SYNTAX_FILTER_NAME, __scopeSyntax);
137
+ if (mode !== 'json') {
138
+ throw new Error(`\`${SYNTAX_FILTER_NAME}\` requires \`Syntax.Root\` to be in JSON mode (pass \`data\`).`);
139
+ }
140
+
141
+ return (
142
+ <Input.Root validationValence={filterError ? 'error' : 'success'}>
143
+ <Input.TextInput
144
+ classNames={['p-1 px-2 font-mono', filterError && 'border-rose-500', classNames]}
145
+ variant='subdued'
146
+ value={filterText}
147
+ placeholder={placeholder}
148
+ onChange={(event) => setFilterText(event.target.value)}
149
+ ref={forwardedRef}
150
+ />
151
+ </Input.Root>
152
+ );
153
+ },
154
+ );
155
+
156
+ SyntaxFilter.displayName = SYNTAX_FILTER_NAME;
157
+
158
+ //
159
+ // Viewport
160
+ //
161
+
162
+ const SYNTAX_VIEWPORT_NAME = 'Syntax.Viewport';
163
+
164
+ type SyntaxViewportProps = ComposableProps;
165
+
166
+ /** Optional scroll wrapper. Compose around `Syntax.Code` to make it scrollable. */
167
+ const SyntaxViewport = composable<HTMLDivElement, SyntaxViewportProps>(({ children, ...props }, forwardedRef) => {
168
+ return (
169
+ <ScrollArea.Root {...composableProps(props)} thin ref={forwardedRef}>
170
+ <ScrollArea.Viewport>{children}</ScrollArea.Viewport>
171
+ </ScrollArea.Root>
172
+ );
173
+ });
174
+
175
+ SyntaxViewport.displayName = SYNTAX_VIEWPORT_NAME;
176
+
177
+ //
178
+ // Code
179
+ //
180
+
181
+ const SYNTAX_CODE_NAME = 'Syntax.Code';
182
+
183
+ type SyntaxCodeProps = ComposableProps<{
184
+ testId?: string;
185
+ }>;
186
+
187
+ /** Highlighted code leaf. Reads source/data from `Syntax.Root` context. */
188
+ const SyntaxCode = composable<HTMLDivElement, ScopedProps<SyntaxCodeProps>>(
189
+ ({ __scopeSyntax, testId, ...props }, forwardedRef) => {
190
+ const context = useSyntaxContext(SYNTAX_CODE_NAME, __scopeSyntax);
191
+ const merged = composableProps(props, { classNames: 'py-1 px-2 text-sm' });
192
+
193
+ if (context.mode === 'json') {
194
+ return (
195
+ <JsonHighlighter
196
+ {...merged}
197
+ data={context.filteredData}
198
+ replacer={context.replacer}
199
+ testId={testId}
200
+ ref={forwardedRef}
201
+ />
202
+ );
203
+ }
204
+
205
+ return (
206
+ <SyntaxHighlighter {...merged} language={context.language} data-testid={testId} ref={forwardedRef}>
207
+ {context.source ?? ''}
208
+ </SyntaxHighlighter>
209
+ );
210
+ },
211
+ );
212
+
213
+ SyntaxCode.displayName = SYNTAX_CODE_NAME;
214
+
215
+ //
216
+ // Syntax
217
+ //
218
+
219
+ export const Syntax = {
220
+ Root: SyntaxRoot,
221
+ Content: SyntaxContent,
222
+ Filter: SyntaxFilter,
223
+ Viewport: SyntaxViewport,
224
+ Code: SyntaxCode,
225
+ };
226
+
227
+ export { createSyntaxScope };
228
+
229
+ export type { SyntaxRootProps, SyntaxContentProps, SyntaxFilterProps, SyntaxViewportProps, SyntaxCodeProps };
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './Json';
5
+ export * from './Syntax';
@@ -4,15 +4,20 @@
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
 
7
- import { withTheme } from '@dxos/react-ui/testing';
7
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
8
  import { trim } from '@dxos/util';
9
9
 
10
+ // @ts-ignore - Vite raw import.
11
+ import TEXT from '../../package.json?raw';
10
12
  import { SyntaxHighlighter } from './SyntaxHighlighter';
11
13
 
12
14
  const meta = {
13
15
  title: 'ui/react-ui-syntax-highlighter/SyntaxHighlighter',
14
16
  component: SyntaxHighlighter,
15
- decorators: [withTheme],
17
+ decorators: [withTheme(), withLayout({ layout: 'column', scroll: true })],
18
+ parameters: {
19
+ layout: 'fullscreen',
20
+ },
16
21
  } satisfies Meta<typeof SyntaxHighlighter>;
17
22
 
18
23
  export default meta;
@@ -22,8 +27,8 @@ type Story = StoryObj<typeof SyntaxHighlighter>;
22
27
  export const Default: Story = {
23
28
  args: {
24
29
  language: 'json',
25
- classNames: 'text-sm',
26
- children: JSON.stringify({ message: 'DXOS', initialized: true }, null, 2),
30
+ children: TEXT,
31
+ copyButton: true,
27
32
  },
28
33
  };
29
34
 
@@ -32,7 +37,7 @@ export const Typescript: Story = {
32
37
  language: 'tsx',
33
38
  children: trim`
34
39
  import React from 'react'
35
-
40
+
36
41
  const Test = () => {
37
42
  return <div>Test</div>
38
43
  }
@@ -40,8 +45,4 @@ export const Typescript: Story = {
40
45
  },
41
46
  };
42
47
 
43
- export const Empty: Story = {
44
- args: {
45
- children: false,
46
- },
47
- };
48
+ export const Empty: Story = {};