import { html, LitElement, PropertyDeclaration, PropertyValueMap, TemplateResult, } from "lit"; import { customElement, property, query, state } from "lit/decorators.js"; import { LitElementWw } from "@webwriter/lit"; import { styles } from "./styles/styles"; import SlButton from "@shoelace-style/shoelace/dist/components/button/button.component.js"; import SlDetails from "@shoelace-style/shoelace/dist/components/details/details.component.js"; import SlInput from "@shoelace-style/shoelace/dist/components/input/input.component.js"; import SlCheckbox from "@shoelace-style/shoelace/dist/components/checkbox/checkbox.component.js"; import SlTooltip from "@shoelace-style/shoelace/dist/components/tooltip/tooltip.component.js"; import SlButtonGroup from "@shoelace-style/shoelace/dist/components/button-group/button-group.component.js"; import SlAlert from "@shoelace-style/shoelace/dist/components/alert/alert.component.js"; import SlSelect from "@shoelace-style/shoelace/dist/components/select/select.component.js"; import SlOption from "@shoelace-style/shoelace/dist/components/option/option.component.js"; import SlIcon from "@shoelace-style/shoelace/dist/components/icon/icon.component.js"; import SlIconButton from "@shoelace-style/shoelace/dist/components/icon-button/icon-button.component.js"; import SlPopup from "@shoelace-style/shoelace/dist/components/popup/popup.component.js"; import SlTag from "@shoelace-style/shoelace/dist/components/tag/tag.component.js"; import SlDialog from "@shoelace-style/shoelace/dist/components/dialog/dialog.component.js"; import SlRange from "@shoelace-style/shoelace/dist/components/range/range.component.js"; import SlSwitch from "@shoelace-style/shoelace/dist/components/switch/switch.component.js"; import SlDivider from "@shoelace-style/shoelace/dist/components/divider/divider.component.js"; import "@shoelace-style/shoelace/dist/themes/light.css"; import { DFA } from "./automata/dfa"; import { Automaton, Node, Transition } from "./automata"; import { Graph } from "./graph"; import { Logger } from "./utils/logger"; import { TopMenu } from "./components/TopMenu"; import { ToolMenu } from "./components/ToolMenu"; import { InfoMenu } from "./components/InfoMenu"; import { SimulatorMenu } from "./components/SimulatorMenu"; import { Settings } from "./components/Settings"; import { biBoxes, biExclamationTriangle, biPencil } from "./styles/icons"; import { styleMap } from "lit/directives/style-map.js"; import { guard } from "lit/directives/guard.js"; import { SlChangeEvent } from "@shoelace-style/shoelace"; import { checkIfNodesUpdated, checkIfTransitionsUpdated, stripNode, stripTransition, } from "./utils/updates"; import { NFA } from "./automata/nfa"; import { PDA, StackExtension } from "./automata/pda"; import { debounce } from "lodash"; // @ts-ignore import LOCALIZE from "../localization/generated"; import { localized, msg } from "@lit/localize"; import { ATTRIBUTE_CONVERTERS } from "@u/attributeConverters"; export type AutomatonType = "dfa" | "nfa" | "pda"; /** * Represents an Automaton Component. * This component is responsible for rendering and managing the automaton editor and simulator. */ @customElement("webwriter-automaton") @localized() export class AutomatonComponent extends LitElementWw { @query("#graphCanvas") private accessor graphCanvas!: HTMLElement; @query("#toolMenu") private accessor toolMenu!: ToolMenu; @query("#simulatorMenu") private accessor simulatorMenu!: SimulatorMenu; @query("#infoMenu") private accessor infoMenu!: InfoMenu; @query("#topMenu") private accessor topMenu!: TopMenu; protected localize = LOCALIZE; /** * Each automaton state is encoded as a string using the following format:
`[#][%][