diff --git a/packages/lexical-devtools/src/panel/components/App/index.css b/packages/lexical-devtools/src/panel/components/App/index.css index 1a5a26fba4d..592addd7877 100644 --- a/packages/lexical-devtools/src/panel/components/App/index.css +++ b/packages/lexical-devtools/src/panel/components/App/index.css @@ -1,20 +1,26 @@ .App { + display: grid; + grid-template-columns: auto 40em; + grid-template-areas: + 'header header' + 'tree-view inspected-element'; text-align: center; } .App-header { + align-items: center; background-color: #282c34; - font-family: monospace; + color: white; display: flex; flex-direction: column; - align-items: center; - justify-content: center; + font-family: monospace; font-size: 2em; - color: white; + grid-area: header; + justify-content: center; } .loading-view { - background: #222; + background: var(--main-dark-gray); color: #fff; font-size: 3em; } diff --git a/packages/lexical-devtools/src/panel/components/App/index.tsx b/packages/lexical-devtools/src/panel/components/App/index.tsx index 81ae959f560..21e7312a6ef 100644 --- a/packages/lexical-devtools/src/panel/components/App/index.tsx +++ b/packages/lexical-devtools/src/panel/components/App/index.tsx @@ -7,15 +7,17 @@ */ import './index.css'; -import {DevToolsTree} from 'packages/lexical-devtools/types'; +import {DevToolsTree, NodeProperties} from 'packages/lexical-devtools/types'; import * as React from 'react'; import {useCallback, useEffect, useRef, useState} from 'react'; +import InspectedElementView from '../InspectedElementView'; import TreeView from '../TreeView'; function App(): JSX.Element { const [isLoading, setIsLoading] = useState(true); const [nodeMap, setNodeMap] = useState({}); + const [selectedNode, setSelectedNode] = useState(null); const port = useRef(null); const updateEditorState = (message: { @@ -88,12 +90,16 @@ function App(): JSX.Element {

Loading...

) : ( - + <> + + + )} ); diff --git a/packages/lexical-devtools/src/panel/components/Chevron/index.css b/packages/lexical-devtools/src/panel/components/Chevron/index.css index 11792339807..2aefed57584 100644 --- a/packages/lexical-devtools/src/panel/components/Chevron/index.css +++ b/packages/lexical-devtools/src/panel/components/Chevron/index.css @@ -1,5 +1,5 @@ .chevron-button { - background: #222; + background: var(--main-dark-gray); border: none; color: #fff; cursor: pointer; @@ -9,6 +9,6 @@ } .tree-node:hover > .chevron-button { - background: #77b6ff; - color: #222; + background: var(--main-blue); + color: var(--main-dark-gray); } diff --git a/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.css b/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.css new file mode 100644 index 00000000000..24931dc8d1f --- /dev/null +++ b/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.css @@ -0,0 +1,3 @@ +.inspected-element-property-name { + color: var(--main-blue); +} diff --git a/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.tsx b/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.tsx new file mode 100644 index 00000000000..20fcd12e63a --- /dev/null +++ b/packages/lexical-devtools/src/panel/components/InspectedElementRow/index.tsx @@ -0,0 +1,39 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ +import './index.css'; + +import {NodeProperty} from 'packages/lexical-devtools/types'; +import * as React from 'react'; + +function InspectedElementRow({ + propName, + property, +}: { + propName: string; + property: NodeProperty; +}): JSX.Element { + let propDisplay = property; + + if (Array.isArray(property)) { + let arrayChildren = ''; + property.forEach((element, index) => { + arrayChildren += element; + if (index !== property.length - 1) arrayChildren += ', '; + }); + propDisplay = arrayChildren; + } + + return ( +
+ {propName}:{' '} + {propDisplay} +
+ ); +} + +export default InspectedElementRow; diff --git a/packages/lexical-devtools/src/panel/components/InspectedElementView/index.css b/packages/lexical-devtools/src/panel/components/InspectedElementView/index.css new file mode 100644 index 00000000000..7dd4f0783dc --- /dev/null +++ b/packages/lexical-devtools/src/panel/components/InspectedElementView/index.css @@ -0,0 +1,11 @@ +.inspected-element-view { + align-self: start; + border: 1px solid #282c34; + color: #fff; + grid-area: inspected-element; + height: 100vh; + padding: 1em 2em; + position: sticky; + text-align: left; + top: 0em; +} diff --git a/packages/lexical-devtools/src/panel/components/InspectedElementView/index.tsx b/packages/lexical-devtools/src/panel/components/InspectedElementView/index.tsx new file mode 100644 index 00000000000..f6a9ae2fda5 --- /dev/null +++ b/packages/lexical-devtools/src/panel/components/InspectedElementView/index.tsx @@ -0,0 +1,31 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ +import './index.css'; + +import {NodeProperties} from 'packages/lexical-devtools/types'; +import * as React from 'react'; + +import InspectedElementRow from '../InspectedElementRow'; + +function InspectedElementView({ + nodeProps, +}: { + nodeProps: NodeProperties | null; +}): JSX.Element { + return ( +
+ {nodeProps + ? Object.entries(nodeProps).map(([key, value]) => ( + + )) + : ''} +
+ ); +} + +export default InspectedElementView; diff --git a/packages/lexical-devtools/src/panel/components/TreeNode/index.css b/packages/lexical-devtools/src/panel/components/TreeNode/index.css index 831ed3d93a3..d4c645a7187 100644 --- a/packages/lexical-devtools/src/panel/components/TreeNode/index.css +++ b/packages/lexical-devtools/src/panel/components/TreeNode/index.css @@ -1,7 +1,7 @@ .indentation { - background: #222; + background: var(--main-dark-gray); border: none; - color: #222; + color: var(--main-dark-gray); margin: 0; padding: 0; text-decoration: none; @@ -9,8 +9,8 @@ } .tree-node:hover { - background: #77b6ff; - color: #222; + background: var(--main-blue); + color: var(--main-dark-gray); } .tree-node-wrapper { diff --git a/packages/lexical-devtools/src/panel/components/TreeNode/index.tsx b/packages/lexical-devtools/src/panel/components/TreeNode/index.tsx index 961ab2899e0..4c3eb1f74f2 100644 --- a/packages/lexical-devtools/src/panel/components/TreeNode/index.tsx +++ b/packages/lexical-devtools/src/panel/components/TreeNode/index.tsx @@ -7,7 +7,7 @@ */ import './index.css'; -import {DevToolsNode} from 'packages/lexical-devtools/types'; +import {DevToolsNode, NodeProperties} from 'packages/lexical-devtools/types'; import * as React from 'react'; import {useState} from 'react'; @@ -19,9 +19,11 @@ function TreeNode({ children, deHighlightDOMNode, depth, + handleNodeClick, highlightDOMNode, lexicalKey, monospaceWidth, + ...rest }: DevToolsNode): JSX.Element { const [isExpanded, setIsExpanded] = useState(true); @@ -29,14 +31,22 @@ function TreeNode({ setIsExpanded(!isExpanded); }; - const handleMouseEnter: React.MouseEventHandler = (event) => { + const handleMouseEnter: React.MouseEventHandler = () => { highlightDOMNode(lexicalKey); }; - const handleMouseLeave: React.MouseEventHandler = (event) => { + const handleMouseLeave: React.MouseEventHandler = () => { deHighlightDOMNode(lexicalKey); }; + const handleClick: React.MouseEventHandler = () => { + const nodeProps: NodeProperties = {__type, ...rest}; + if (__text) { + nodeProps.__text = __text; + } + handleNodeClick(nodeProps); + }; + const nodeString = ` (${lexicalKey}) ${__type} ${ __text ? '"' + __text + '"' : '' }`; @@ -57,9 +67,12 @@ function TreeNode({
+ role="menuitem" + style={{paddingLeft: leftIndent}} + tabIndex={0}>   {children.length > 0 ? ( diff --git a/packages/lexical-devtools/src/panel/components/TreeView/index.css b/packages/lexical-devtools/src/panel/components/TreeView/index.css index e8eb04a96c7..47a476c3336 100644 --- a/packages/lexical-devtools/src/panel/components/TreeView/index.css +++ b/packages/lexical-devtools/src/panel/components/TreeView/index.css @@ -1,13 +1,13 @@ .tree-view-output { - line-height: 1.1; - background: #222; + background: var(--main-dark-gray); color: #fff; + font-size: 1.2em; + font-weight: 400; + grid-area: tree-view; + line-height: 1.1; margin: 0; padding: 1em 0; - font-size: 1.2em; overflow: auto; text-align: left; -moz-osx-font-smoothing: grayscale; - font-weight: 400; - width: max-content; } diff --git a/packages/lexical-devtools/src/panel/components/TreeView/index.tsx b/packages/lexical-devtools/src/panel/components/TreeView/index.tsx index 9229f90b551..d46a5fbeec6 100644 --- a/packages/lexical-devtools/src/panel/components/TreeView/index.tsx +++ b/packages/lexical-devtools/src/panel/components/TreeView/index.tsx @@ -7,18 +7,24 @@ */ import './index.css'; -import {DevToolsNode, DevToolsTree} from 'packages/lexical-devtools/types'; +import { + DevToolsNode, + DevToolsTree, + NodeProperties, +} from 'packages/lexical-devtools/types'; import * as React from 'react'; import TreeNode from '../TreeNode'; function TreeView({ deHighlightDOMNode, + handleNodeClick, highlightDOMNode, viewClassName, nodeMap, }: { deHighlightDOMNode: (lexicalKey: string) => void; + handleNodeClick: (props: NodeProperties) => void; highlightDOMNode: (lexicalKey: string) => void; viewClassName: string; nodeMap: DevToolsTree; @@ -49,6 +55,7 @@ function TreeView({ children, deHighlightDOMNode, depth, + handleNodeClick, highlightDOMNode, lexicalKey: node.__key, monospaceWidth, diff --git a/packages/lexical-devtools/src/panel/components/main/index.css b/packages/lexical-devtools/src/panel/components/main/index.css index f27a0f62e1e..ccbf7145007 100644 --- a/packages/lexical-devtools/src/panel/components/main/index.css +++ b/packages/lexical-devtools/src/panel/components/main/index.css @@ -1,11 +1,13 @@ :root { --monospace-character-width: 1.2em; + --main-blue: #77b6ff; + --main-dark-gray: #222; } body { margin: 0; font-family: monospace; - background: #222; + background: var(--main-dark-gray); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } diff --git a/packages/lexical-devtools/types.ts b/packages/lexical-devtools/types.ts index 5f71b849e02..2c0e75efb6c 100644 --- a/packages/lexical-devtools/types.ts +++ b/packages/lexical-devtools/types.ts @@ -19,6 +19,7 @@ export interface DevToolsNode { children: Array; deHighlightDOMNode: (lexicalKey: string) => void; depth: number; + handleNodeClick: (props: NodeProperties) => void; highlightDOMNode: (lexicalKey: string) => void; lexicalKey: string; monospaceWidth: string; @@ -31,6 +32,10 @@ export interface LexicalHTMLElement extends HTMLElement { __lexicalEditor: LexicalEditor; } +export type NodeProperties = Record; + +export type NodeProperty = string | number | boolean | Array; + export type CloneInto = ( arg: {lexicalKey: string}, arg2: Window,