Skip to content

Commit 75dc2b3

Browse files
committed
renderer
1 parent 0eabcc9 commit 75dc2b3

File tree

4 files changed

+57
-11
lines changed

4 files changed

+57
-11
lines changed
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1-
import { HtmlEditor } from '@compai/css-gui'
2-
const initialValue = {
1+
import { HtmlEditor, HtmlRenderer } from '@compai/css-gui'
2+
const initialValue: any = {
33
tagName: 'div',
44
children: [
55
'hello',
66
'world',
77
{
8-
tagName: 'div',
8+
tagName: 'span',
99
children: ['hello'],
1010
},
1111
],
1212
}
1313

1414
export default function HtmlEditorExample() {
15-
return <HtmlEditor value={initialValue} />
15+
return (
16+
<div sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr' }}>
17+
<HtmlEditor value={initialValue} />
18+
<HtmlRenderer value={initialValue} />
19+
</div>
20+
)
1621
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { toCSSObject } from '../../lib'
2+
import { ElementData } from './types'
3+
4+
interface Props {
5+
value: ElementData
6+
}
7+
8+
export function HtmlRenderer({ value }: Props) {
9+
const { tagName, attributes = {}, style = {}, children = [] } = value
10+
const Tag: any = value.tagName
11+
return (
12+
<Tag {...attributes} sx={{ ...toCSSObject(style) }}>
13+
{children.map((child) => {
14+
if (typeof child === 'string') {
15+
return child
16+
}
17+
return <HtmlRenderer value={child} />
18+
})}
19+
</Tag>
20+
)
21+
}

packages/gui/src/components/html/editor.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,24 @@ interface EditorProps {
1111
* An HTML tree-based editor that lets you add HTML nodes and mess around with their styles
1212
*/
1313
export function HtmlEditor({ value }: EditorProps) {
14+
const [selected, setSelected] = useState<ElementData | null>(null)
1415
return (
15-
<div>
16-
<TreeNode value={value} />
16+
<div sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 3 }}>
17+
<TreeNode value={value} onSelect={setSelected} />
18+
{selected && <Editor value={selected} />}
1719
</div>
1820
)
1921
}
2022

21-
function TreeNode({ value }: EditorProps) {
23+
function Editor({ value }: EditorProps) {
24+
return <div>tagName: {value.tagName}</div>
25+
}
26+
27+
interface TreeNodeProps extends EditorProps {
28+
onSelect(element: ElementData): void
29+
}
30+
31+
function TreeNode({ value, onSelect }: TreeNodeProps) {
2232
const [open, setOpen] = useState(true)
2333
return (
2434
<Collapsible.Root open={open} onOpenChange={setOpen}>
@@ -33,20 +43,29 @@ function TreeNode({ value }: EditorProps) {
3343
height: '1rem',
3444
},
3545
}}
46+
></Collapsible.Trigger>
47+
<button
48+
sx={{
49+
border: 'none',
50+
backgroundColor: 'background',
51+
color: 'text',
52+
fontSize: '1rem',
53+
}}
54+
onClick={() => onSelect(value)}
3655
>
3756
&lt;{value.tagName}
3857
{!open && '/'}&gt;
39-
</Collapsible.Trigger>
58+
</button>
4059
<Collapsible.Content>
4160
<div sx={{ ml: 4 }}>
4261
{value.children.map((child) => {
4362
if (typeof child === 'string') {
4463
return <div>"{child}"</div>
4564
}
46-
return <TreeNode value={child} />
65+
return <TreeNode value={child} onSelect={onSelect} />
4766
})}
4867
</div>
49-
&lt;/{value.tagName}&gt;
68+
<div sx={{ ml: '1rem' }}>&lt;/{value.tagName}&gt;</div>
5069
</Collapsible.Content>
5170
</Collapsible.Root>
5271
)

packages/gui/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ export {
1919
} from './components/providers/ThemeContext'
2020
export { EditorProvider } from './components/providers/EditorContext'
2121
export { Layout } from './components/ui/Layout'
22+
export { HtmlEditor } from './components/html/editor'
23+
export { HtmlRenderer } from './components/html/Renderer'
2224

2325
export { theme } from './components/ui/theme'
2426
export { supportedProperties, unsupportedProperties } from './data/properties'
2527
export { allProperties } from './data/css-properties'
2628
export { mdnProperties } from './data/mdn-properties'
27-
export { HtmlEditor } from './components/html/editor'
2829

2930
export * from './lib'
3031
export * from './types/theme'

0 commit comments

Comments
 (0)