import React from "react"; import type * as std from "../../law/std"; import type { HTMLComponentProps } from "../common/html"; import { elProps, wrapHTMLComponent } from "../common/html"; import { HTMLSentenceChildrenRun } from "../../renderer/rules/sentenceChildrenRun"; import { NotImplementedError } from "../../util"; import type { SentenceChildEL } from "../../node/cst/inline"; import { withKey } from "../common"; export const HTMLControlRunCSS = /*css*/` .control-parentheses { transition: background-color 0.3s; } .control-parentheses:hover, .paragraph-item-Paragraph:hover .control-parentheses { background-color: hsla(60, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="1"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="1"] { background-color: hsla(60, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="2"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="2"] { background-color: hsla(30, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="3"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="3"] { background-color: hsla(0, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="4"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="4"] { background-color: hsl(330, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="5"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="5"] { background-color: hsl(300, 100%, 50%, 0.1); } .control-parentheses[data-parentheses_depth="6"]:hover, .paragraph-item-Paragraph:hover .control-parentheses[data-parentheses_depth="6"] { background-color: hsl(270, 100%, 50%, 0.1); } .control-start-parenthesis, .control-end-parenthesis { border: 1px solid transparent; margin: -1px; transition: border-color 0.3s; } .control-parentheses:hover > .control-start-parenthesis, .control-parentheses:hover > .control-end-parenthesis { border-color: gray; } .control-mismatch-start-parenthesis { color: red; } .control-mismatch-end-parenthesis { color: red; } `; export interface HTMLControlRunProps { el: std.__EL } // const isControlRunProps = (props: HTMLComponentProps): props is ControlRunProps => props.el.isControl; export const HTMLControlRun = wrapHTMLComponent("HTMLControlRun", ((props: HTMLComponentProps & HTMLControlRunProps) => { const { el, htmlOptions } = props; if (el.tag === "__Parentheses") { return <__Parentheses el={el} {...{ htmlOptions }} />; } else if (el.tag === "__PStart") { return <__PStart el={el} {...{ htmlOptions }} />; } else if (el.tag === "__PContent") { return <__PContent el={el} {...{ htmlOptions }} />; } else if (el.tag === "__PEnd") { return <__PEnd el={el} {...{ htmlOptions }} />; } else if (el.tag === "__MismatchStartParenthesis") { return <__MismatchStartParenthesis el={el} {...{ htmlOptions }} />; } else if (el.tag === "__MismatchEndParenthesis") { return <__MismatchEndParenthesis el={el} {...{ htmlOptions }} />; } else { return ; } })); interface __ParenthesesProps { el: std.__EL } const __Parentheses = (props: HTMLComponentProps & __ParenthesesProps) => { const { el, htmlOptions } = props; const blocks: React.JSX.Element[] = []; for (const child of el.children) { if (typeof child === "string" || child instanceof String) { throw new NotImplementedError("string"); } else if (child.tag === "__PStart") { blocks.push(<__PStart el={child as std.__EL} {...{ htmlOptions }} />); } else if (child.tag === "__PContent") { blocks.push(<__PContent el={child as std.__EL} {...{ htmlOptions }} />); } else if (child.tag === "__PEnd") { blocks.push(<__PEnd el={child as std.__EL} {...{ htmlOptions }} />); } else { throw new NotImplementedError(child.tag); } } return ( {withKey(blocks)} ); }; interface __PStartProps { el: std.__EL } const __PStart = (props: HTMLComponentProps & __PStartProps) => { const { el, htmlOptions } = props; return ( ); }; interface __PContentProps { el: std.__EL } const __PContent = (props: HTMLComponentProps & __PContentProps) => { const { el, htmlOptions } = props; return ( ); }; interface __PEndProps { el: std.__EL } const __PEnd = (props: HTMLComponentProps & __PEndProps) => { const { el, htmlOptions } = props; return ( ); }; interface __MismatchStartParenthesisProps { el: std.__EL } const __MismatchStartParenthesis = (props: HTMLComponentProps & __MismatchStartParenthesisProps) => { const { el, htmlOptions } = props; return ( ); }; interface __MismatchEndParenthesisProps { el: std.__EL } const __MismatchEndParenthesis = (props: HTMLComponentProps & __MismatchEndParenthesisProps) => { const { el, htmlOptions } = props; return ( ); };