import * as React from "react"; import { Button } from "../ui/Button"; import type { ElementOperation } from "./ElementOperation"; import { css } from "@emotion/css"; import { neverFunc } from "../../common/util"; export type MultiLineTextSelection = never; export type MultiLineTextValue = { readonly text: string; readonly onChange: ((newText: string) => void) | undefined; }; const selectionViewMaxLine = 20; const MultiLineTextSelectionView: ElementOperation< MultiLineTextSelection, MultiLineTextValue >["selectionView"] = React.memo(({ value }) => { if (value.text.length === 0) { return (
empty
); } const lines = value.text.split("\n"); const isOver = lines.length > selectionViewMaxLine; return (
{lines.slice(selectionViewMaxLine).map((line, index) => (
{line}
))} {isOver ? (
...
) : ( <> )}
); }); MultiLineTextSelectionView.displayName = "TextSelectionView"; export const HeadTextSelectionView: ElementOperation< MultiLineTextSelection, MultiLineTextValue >["selectionView"] = React.memo((props) => { return
{props.value.text}
; }); HeadTextSelectionView.displayName = "HeadTextSelectionView"; const MultiLineTextDetailView: ElementOperation< MultiLineTextSelection, MultiLineTextValue >["detailView"] = ({ value }) => { const copyText = (): void => { navigator.clipboard.writeText(value.text); }; return (
文字列の長さ: {[...value.text].length}
{value.onChange === undefined ? ( ) : ( )}
); }; const MultiLineTextEditorReadonly = (props: { value: string; }): React.ReactElement => { return (