@m2c2kit/addons 0.3.31 → 0.3.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/composites/grid.ts","../src/composites/button.ts","../src/composites/dialog.ts","../src/composites/draw-pad.ts","../src/composites/virtual-keyboard.ts","../src/stories/instructions.ts","../src/scenes/countdown-scene.ts","../src/composites/locale-picker.ts","../src/composites/countdown-timer.ts","../src/composites/slider.ts","../src/index.ts"],"sourcesContent":["import { Canvas } from \"canvaskit-wasm\";\nimport {\n WebColors,\n Composite,\n CompositeOptions,\n RgbaColor,\n Size,\n M2Node,\n Shape,\n IDrawable,\n M2c2KitHelpers,\n Equal,\n M2NodeConstructor,\n EventStoreMode,\n M2Error,\n} from \"@m2c2kit/core\";\n\nexport interface GridOptions extends CompositeOptions {\n /** Number of rows in the grid. Must be 1 or greater */\n rows: number;\n /** Number of columns in the grid. Must be 1 or greater */\n columns: number;\n /** Size of the grid in pixels */\n size: Size;\n /** Background color of the grid. Default is a transparent blue */\n backgroundColor?: RgbaColor;\n /** Width of the grid lines. Default is 1 */\n gridLineWidth?: number;\n /** Color of the grid lines. Default is red */\n gridLineColor?: RgbaColor;\n}\n\nexport interface GridChild {\n node: M2Node;\n row: number;\n column: number;\n}\n\ninterface SerializedGridChild {\n node: string;\n row: number;\n column: number;\n}\n\nexport class Grid extends Composite implements GridOptions {\n compositeType = \"Grid\";\n // Grid options\n private _rows = 0;\n private _columns = 0;\n // default Grid is: transparent blue, red lines, line width 1\n private _gridBackgroundColor: RgbaColor = [0, 0, 255, 0.25];\n private _gridLineColor = WebColors.Red;\n private _gridLineWidth = 1;\n\n cellWidth: number;\n cellHeight: number;\n private _gridChildren = new Array<GridChild>();\n private cellContainers = new Array<Array<Shape>>();\n private _gridBackground?: Shape;\n\n /**\n * A rectangular grid that supports placement of nodes within the grid's\n * cells.\n *\n * @remarks This composite node is composed of rectangles and lines. It\n * has convenience functions for placing and clearing nodes on the grid\n * by row and column position (zero-based indexing)\n *\n * @param options - {@link GridOptions}\n */\n constructor(options: GridOptions) {\n super(options);\n if (options.size) {\n this.size = options.size;\n } else {\n throw new M2Error(\"grid size must be specified\");\n }\n if (options.rows) {\n if (options.rows >= 1) {\n this.rows = options.rows;\n } else {\n throw new M2Error(\"grid rows must be at least 1\");\n }\n } else {\n throw new M2Error(\"grid rows must be specified\");\n }\n if (options.columns) {\n if (options.columns >= 1) {\n this.columns = options.columns;\n } else {\n throw new M2Error(\"grid columns must be at least 1\");\n }\n } else {\n throw new M2Error(\"grid columns must be specified\");\n }\n if (options.backgroundColor) {\n this.gridBackgroundColor = options.backgroundColor;\n }\n if (options.gridLineColor) {\n this.gridLineColor = options.gridLineColor;\n }\n if (options.gridLineWidth) {\n this.gridLineWidth = options.gridLineWidth;\n }\n this.cellWidth = this.size.width / this.columns;\n this.cellHeight = this.size.height / this.rows;\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n rows: this.rows,\n columns: this.columns,\n size: this.size,\n backgroundColor: this.gridBackgroundColor,\n gridLineWidth: this.gridLineWidth,\n gridLineColor: this.gridLineColor,\n };\n }\n\n override initialize(): void {\n /**\n * Remove all existing children, and recursively remove each child's\n * children so we can start fresh.\n */\n this.descendants.forEach((d) => {\n if (d.parent === this) {\n // to avoid triggering the warning in Grid.removeChild(), below\n super.removeChild(d);\n } else {\n d.parent?.removeChild(d);\n }\n });\n\n this.gridBackground = new Shape({\n name: \"__\" + this.name + \"-gridRectangle\",\n rect: { size: this.size },\n fillColor: this.gridBackgroundColor,\n strokeColor: this.gridLineColor,\n lineWidth: this.gridLineWidth,\n isUserInteractionEnabled: this.isUserInteractionEnabled,\n suppressEvents: true,\n });\n super.addChild(this.gridBackground);\n this.gridBackground.isUserInteractionEnabled =\n this.isUserInteractionEnabled;\n\n for (let col = 1; col < this.columns; col++) {\n const verticalLine = new Shape({\n name: \"__\" + this.name + \"-gridVerticalLine-\" + (col - 1),\n rect: {\n size: { width: this.gridLineWidth, height: this.size.height },\n origin: { x: -this.size.width / 2 + this.cellWidth * col, y: 0 },\n },\n fillColor: this.gridLineColor,\n suppressEvents: true,\n });\n this.gridBackground.addChild(verticalLine);\n }\n\n for (let row = 1; row < this.rows; row++) {\n const horizontalLine = new Shape({\n name: \"__\" + this.name + \"-gridHorizontalLine-\" + (row - 1),\n rect: {\n size: { width: this.size.width, height: this.gridLineWidth },\n origin: { x: 0, y: -this.size.height / 2 + this.cellHeight * row },\n },\n fillColor: this.gridLineColor,\n suppressEvents: true,\n });\n this.gridBackground.addChild(horizontalLine);\n }\n\n this.cellContainers = new Array<Array<Shape>>(this.rows)\n .fill([])\n .map(() => new Array<Shape>(this.columns));\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.columns; col++) {\n const cellContainer = new Shape({\n name: \"__\" + this.name + \"-gridCellContainer-\" + row + \"-\" + col,\n rect: {\n size: { width: this.cellWidth, height: this.cellHeight },\n origin: {\n x:\n -this.size.width / 2 +\n this.cellWidth * col +\n this.cellWidth / 2,\n y:\n -this.size.height / 2 +\n this.cellHeight * row +\n this.cellHeight / 2,\n },\n },\n fillColor: WebColors.Transparent,\n lineWidth: 0,\n suppressEvents: true,\n });\n this.gridBackground.addChild(cellContainer);\n this.cellContainers[row][col] = cellContainer;\n }\n }\n\n if (this.gridChildren.length > 0) {\n this.gridChildren.forEach((gridChild) => {\n if (!this.cellWidth || !this.cellHeight || !this.gridBackground) {\n throw new M2Error(\n \"cellWidth, cellHeight, or gridBackground undefined or null\",\n );\n }\n\n /**\n * Pay attention to the type assertions here to account for how the\n * structure of gridChildren is different in replay versus other\n * modes.\n */\n if (this.game.eventStore.mode === EventStoreMode.Replay) {\n /**\n * When in event replay, the gridChild is of type\n * SerializedGridChild, and gridChild.node is the uuid of the grid\n * child node.\n */\n const childNode = [\n ...this.game.nodes,\n ...this.game.materializedNodes,\n ].find(\n (n) =>\n // gridChild.node is the uuid of the child node here!\n n.uuid === (gridChild as unknown as SerializedGridChild).node,\n );\n if (!childNode) {\n throw new M2Error(\"grid: child node not found\");\n }\n childNode?.parent?.removeChild(childNode);\n this.cellContainers[gridChild.row][gridChild.column].addChild(\n childNode,\n );\n } else {\n // Not in replay mode, gridChild is of type GridChild\n gridChild.node.parent?.removeChild(gridChild.node);\n this.cellContainers[gridChild.row][gridChild.column].addChild(\n gridChild.node,\n );\n }\n });\n }\n this.needsInitialization = false;\n }\n\n private get gridBackground(): Shape {\n if (!this._gridBackground) {\n throw new M2Error(\"gridBackground is null or undefined\");\n }\n return this._gridBackground;\n }\n\n private set gridBackground(gridBackground: Shape) {\n this._gridBackground = gridBackground;\n }\n\n /**\n * note: below we do not have getter and setter for size because the getter\n * and setter in M2Node will handle it.\n */\n\n get rows(): number {\n return this._rows;\n }\n set rows(rows: number) {\n if (Equal.value(this._rows, rows)) {\n return;\n }\n this._rows = rows;\n this.needsInitialization = true;\n }\n\n get columns(): number {\n return this._columns;\n }\n set columns(columns: number) {\n if (Equal.value(this._columns, columns)) {\n return;\n }\n this._columns = columns;\n this.needsInitialization = true;\n }\n\n get gridBackgroundColor(): RgbaColor {\n return this._gridBackgroundColor;\n }\n set gridBackgroundColor(backgroundColor: RgbaColor) {\n if (Equal.value(this._gridBackgroundColor, backgroundColor)) {\n return;\n }\n this._gridBackgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get gridLineWidth(): number {\n return this._gridLineWidth;\n }\n set gridLineWidth(gridLineWidth: number) {\n if (Equal.value(this._gridLineWidth, gridLineWidth)) {\n return;\n }\n this._gridLineWidth = gridLineWidth;\n this.needsInitialization = true;\n }\n\n get gridLineColor(): RgbaColor {\n return this._gridLineColor;\n }\n set gridLineColor(gridLineColor: RgbaColor) {\n if (Equal.value(this._gridLineColor, gridLineColor)) {\n return;\n }\n this._gridLineColor = gridLineColor;\n this.needsInitialization = true;\n }\n\n // all nodes that make up grid are added as children, so they\n // have their own dispose methods\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n override dispose(): void {}\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Grid {\n const dest = new Grid({\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n rows: this.rows,\n columns: this.columns,\n size: this.size,\n backgroundColor: this.gridBackgroundColor,\n gridLineWidth: this.gridLineWidth,\n gridLineColor: this.gridLineColor,\n name: newName,\n });\n\n if (this.children.length > 0) {\n dest.children = this.children.map((child) => {\n const clonedChild = child.duplicate();\n clonedChild.parent = dest;\n return clonedChild;\n });\n }\n\n return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * The child nodes that have been added to the grid.\n *\n * @remarks Do not set this property directly. Use the methods for adding\n * and removing grid children, such as `addAtCell()`, `removeAllAtCell()`,\n * `removeGridChild()`, and `removeAllGridChildren()`.\n */\n get gridChildren() {\n return this._gridChildren;\n }\n set gridChildren(gridChildren: Array<GridChild>) {\n this._gridChildren = gridChildren;\n this.needsInitialization = true;\n\n /**\n * Save the gridChildren property change event. The gridChild node is not\n * serializable, so we can't pass the gridChildren object directly to\n * savePropertyChangeEvent. Instead, we pass in the SerializedGridChild\n * objects, which have the node's uuid in the node property.\n */\n this.savePropertyChangeEvent(\n \"gridChildren\",\n this.gridChildren.map(\n (gridChild) =>\n ({\n node: gridChild.node.uuid,\n row: gridChild.row,\n column: gridChild.column,\n }) as SerializedGridChild,\n ),\n );\n }\n\n /**\n * Removes all grid children from the grid.\n *\n * @remarks This retains grid lines and grid appearance.\n */\n removeAllGridChildren(): void {\n if (this.gridChildren.length === 0) {\n return;\n }\n while (this.gridChildren.length) {\n this.gridChildren = this.gridChildren.slice(0, -1);\n }\n this.needsInitialization = true;\n }\n\n /**\n * Adds a node as a grid child to the grid at the specified row and column\n * position.\n *\n * @param node - node to add to the grid\n * @param row - row position within grid to add node; zero-based indexing\n * @param column - column position within grid to add node; zero-based indexing\n */\n addAtCell(node: M2Node, row: number, column: number): void {\n if (row < 0 || row >= this.rows || column < 0 || column >= this.columns) {\n console.warn(\n `warning: addAtCell() requested to add node at row ${row}, column ${column}. This is outside the bounds of grid ${this.name}, which is size ${this.rows}x${this.columns}. Note that addAtCell() uses zero-based indexing. AddAtCell() will proceed, but may draw nodes outside the grid`,\n );\n }\n this.gridChildren = [\n ...this.gridChildren,\n { node: node, row: row, column: column },\n ];\n this.needsInitialization = true;\n }\n\n /**\n * Removes all grid child nodes at the specified row and column position.\n *\n * @param row - row position within grid at which to remove grid children; zero-based indexing\n * @param column - column position within grid at which to remove grid children; zero-based indexing\n */\n removeAllAtCell(row: number, column: number): void {\n this.gridChildren = this.gridChildren.filter(\n (gridChild) => gridChild.row !== row && gridChild.column !== column,\n );\n this.needsInitialization = true;\n }\n\n /**\n * Removes the grid child node from the grid.\n *\n * @param node - node to remove\n */\n removeGridChild(node: M2Node): void {\n this.gridChildren = this.gridChildren.filter(\n (gridChild) => gridChild.node != node,\n );\n this.needsInitialization = true;\n }\n\n // The Grid manages its own children (background, lines, and cell\n // containers). It is probably a mistake when the user tries to add or remove\n // these children. The user probably meant to add or remove grid children\n // instead. Warn the user about this.\n\n override addChild(child: M2Node): void {\n console.warn(\n \"Grid.addChild() was called -- did you mean to call addAtCell() instead?\",\n );\n super.addChild(child);\n }\n\n override removeAllChildren(): void {\n console.warn(\n \"Grid.removeAllChildren() was called -- did you mean to call removeAllGridChildren() instead?\",\n );\n super.removeAllChildren();\n }\n\n override removeChild(child: M2Node): void {\n console.warn(\n \"Grid.removeChild() was called -- did you mean to call removeGridChild() instead?\",\n );\n super.removeChild(child);\n }\n\n override removeChildren(children: M2Node[]): void {\n console.warn(\n \"Grid.removeChildren() was called -- did you mean to call removeGridChild() instead?\",\n );\n super.removeChildren(children);\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(Grid as unknown as M2NodeConstructor);\n","import { Paint, Canvas } from \"canvaskit-wasm\";\nimport {\n CanvasKitHelpers,\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n TextOptions,\n IText,\n RgbaColor,\n Size,\n IDrawable,\n StringInterpolationMap,\n Equal,\n M2c2KitHelpers,\n M2NodeConstructor,\n} from \"@m2c2kit/core\";\n\nexport interface ButtonOptions extends CompositeOptions, TextOptions {\n /** Size of button. Default is 200 wide by 50 high. */\n size?: Size;\n /** Corner radius of button; can be used to make rounded corners. Default is 9 */\n cornerRadius?: number;\n /** Background color of button. Default is WebColors.Black */\n backgroundColor?: RgbaColor;\n /** Color of button text. Default is WebColors.White */\n fontColor?: RgbaColor;\n /** Names of multiple fonts to use for text. For example, if a text font and an emoji font are to be used together. Must have been previously loaded */\n fontNames?: Array<string>;\n // Already defined in TextOptions, but redefined here to change documentation\n /** Size of button text. Default is 20. */\n fontSize?: number;\n}\n\nexport class Button extends Composite implements IText, ButtonOptions {\n compositeType = \"Button\";\n isText = true;\n // Button options\n private _backgroundColor = WebColors.Black;\n private _cornerRadius = 9;\n private _fontSize = 20;\n private _text = \"\";\n private _fontColor = WebColors.White;\n private _fontName: string | undefined;\n private _fontNames: Array<string> | undefined;\n private _interpolation: StringInterpolationMap = {};\n private _localize = true;\n private backgroundPaint?: Paint;\n\n // TODO: add default \"behaviors\" (?) like button click animation?\n\n /**\n * A simple button of rectangle with text centered inside.\n *\n * @remarks This composite node is composed of a rectangle and text. To\n * respond to user taps, the isUserInteractionEnabled property must be set\n * to true and an appropriate callback must be set to handle the tap event.\n *\n * @param options - {@link ButtonOptions}\n */\n constructor(options: ButtonOptions) {\n super(options);\n if (options.text) {\n this.text = options.text;\n }\n if (options.size) {\n this.size = options.size;\n } else {\n this.size = { width: 200, height: 50 };\n }\n if (options.cornerRadius !== undefined) {\n this.cornerRadius = options.cornerRadius;\n }\n if (options.fontName) {\n this.fontName = options.fontName;\n }\n if (options.fontNames) {\n this.fontNames = options.fontNames;\n }\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n if (options.interpolation) {\n this.interpolation = options.interpolation;\n }\n if (options.localize !== undefined) {\n this.localize = options.localize;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.getTextOptions(),\n size: this.size,\n cornerRadius: this.cornerRadius,\n backgroundColor: this.backgroundColor,\n fontNames: this.fontNames,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n this.backgroundPaint = new this.canvasKit.Paint();\n this.backgroundPaint.setColor(\n this.canvasKit.Color(\n this.backgroundColor[0],\n this.backgroundColor[1],\n this.backgroundColor[2],\n this.backgroundColor[3],\n ),\n );\n this.backgroundPaint.setStyle(this.canvasKit.PaintStyle.Fill);\n\n const buttonRectangle = new Shape({\n name: \"__\" + this.name + \"-buttonRectangle\",\n rect: { size: this.size },\n cornerRadius: this.cornerRadius,\n fillColor: this._backgroundColor,\n suppressEvents: true,\n });\n this.addChild(buttonRectangle);\n\n const buttonLabel = new Label({\n name: \"__\" + this.name + \"-buttonLabel\",\n text: this.text,\n localize: this.localize,\n interpolation: this.interpolation,\n fontName: this.fontName,\n fontNames: this.fontNames,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n suppressEvents: true,\n });\n buttonRectangle.addChild(buttonLabel);\n\n this.needsInitialization = false;\n }\n\n override dispose(): void {\n CanvasKitHelpers.Dispose([this.backgroundPaint]);\n }\n\n get text(): string {\n return this._text;\n }\n set text(text: string) {\n if (Equal.value(this._text, text)) {\n return;\n }\n this._text = text;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"text\", text);\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n if (Equal.value(this._backgroundColor, backgroundColor)) {\n return;\n }\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"backgroundColor\", backgroundColor);\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n if (Equal.value(this._fontColor, fontColor)) {\n return;\n }\n this._fontColor = fontColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontColor\", fontColor);\n }\n\n get fontName(): string | undefined {\n return this._fontName;\n }\n set fontName(fontName: string | undefined) {\n if (this._fontName === fontName) {\n return;\n }\n this._fontName = fontName;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontName\", fontName);\n }\n\n get fontNames(): Array<string> | undefined {\n return this._fontNames;\n }\n set fontNames(fontNames: Array<string> | undefined) {\n if (Equal.value(this._fontNames, fontNames)) {\n return;\n }\n this._fontNames = fontNames;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontNames\", fontNames);\n }\n\n get cornerRadius(): number {\n return this._cornerRadius;\n }\n set cornerRadius(cornerRadius: number) {\n if (Equal.value(this._cornerRadius, cornerRadius)) {\n return;\n }\n this._cornerRadius = cornerRadius;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"cornerRadius\", cornerRadius);\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n if (Equal.value(this._fontSize, fontSize)) {\n return;\n }\n this._fontSize = fontSize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontSize\", fontSize);\n }\n\n get interpolation(): StringInterpolationMap {\n return this._interpolation;\n }\n set interpolation(interpolation: StringInterpolationMap) {\n if (Equal.value(this._interpolation, interpolation)) {\n return;\n }\n /**\n * If a new interpolation object is set, then we must re-initialize the\n * label. But, we will not know if a property of the interpolation object\n * has changed. Therefore, freeze the interpolation object to prevent it\n * from being modified (attempting to modify it will throw an error).\n * If a user wants to change a property of the interpolation object, they\n * must instead create a new interpolation object and set it.\n */\n this._interpolation = interpolation;\n Object.freeze(this._interpolation);\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"interpolation\", interpolation);\n }\n\n get localize(): boolean {\n return this._localize;\n }\n set localize(localize: boolean) {\n if (Equal.value(this._localize, localize)) {\n return;\n }\n this._localize = localize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"localize\", localize);\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Button {\n const dest = new Button({\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.getTextOptions(),\n size: this.size,\n cornerRadius: this.cornerRadius,\n backgroundColor: this.backgroundColor,\n fontColor: this.fontColor,\n name: newName,\n localize: this.localize,\n interpolation: JSON.parse(JSON.stringify(this.interpolation)),\n fontName: this.fontName,\n fontNames: JSON.parse(JSON.stringify(this.fontNames)),\n });\n\n if (this.children.length > 0) {\n dest.children = this.children.map((child) => {\n const clonedChild = child.duplicate();\n clonedChild.parent = dest;\n return clonedChild;\n });\n }\n\n return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(Button as unknown as M2NodeConstructor);\n","import { Paint, Canvas } from \"canvaskit-wasm\";\nimport {\n M2NodeEvent,\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n RgbaColor,\n Size,\n IDrawable,\n M2NodeEventListener,\n M2EventType,\n CallbackOptions,\n Timer,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Button } from \"./button\";\n\nexport interface DialogOptions extends CompositeOptions {\n /** Size of dialog box */\n size?: Size;\n /** Corner radius of dialog box; can be used to make rounded corners */\n cornerRadius?: number;\n /** Background color of dialog box. Default is WebColors.White */\n backgroundColor?: RgbaColor;\n /** Color of button text. Default is WebColors.White */\n fontColor?: RgbaColor;\n overlayAlpha?: number;\n positiveButtonText?: string;\n negativeButtonText?: string;\n positiveButtonColor?: RgbaColor;\n negativeButtonColor?: RgbaColor;\n messageText?: string;\n}\n\nexport enum DialogResult {\n Dismiss = \"Dismiss\",\n Positive = \"Positive\",\n Negative = \"Negative\",\n}\n\nexport interface DialogEvent extends M2NodeEvent {\n dialogResult: DialogResult;\n}\n\nexport class Dialog extends Composite {\n compositeType = \"Dialog\";\n\n private _backgroundColor = WebColors.White;\n\n cornerRadius = 9;\n\n overlayAlpha = 0.5;\n contentText = \"\";\n positiveButtonText = \"\";\n negativeButtonText = \"\";\n\n private _fontColor = WebColors.White;\n private backgroundPaint?: Paint;\n\n // todo: add getters/setters so button can respond to changes in its options\n // todo: add default \"behaviors\" (?) like button click animation?\n constructor(options?: DialogOptions) {\n super(options);\n // set zPosition to max value so it is always on top\n this.zPosition = Number.MAX_VALUE;\n\n // by default, dialog is hidden\n this.hidden = true;\n\n if (!options) {\n return;\n }\n\n if (options.overlayAlpha) {\n this.overlayAlpha = options.overlayAlpha;\n }\n\n if (options.messageText) {\n this.contentText = options.messageText;\n }\n\n if (options.positiveButtonText) {\n this.positiveButtonText = options.positiveButtonText;\n }\n\n if (options.negativeButtonText) {\n this.negativeButtonText = options.negativeButtonText;\n }\n\n if (options.size) {\n this.size = options.size;\n }\n if (options.cornerRadius) {\n this.cornerRadius = options.cornerRadius;\n }\n // if (options.fontSize) {\n // this.fontSize = options.fontSize;\n // }\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n }\n\n show(): void {\n this.hidden = false;\n }\n\n onDialogResult(\n callback: (dialogResultEvent: DialogEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<DialogEvent> = {\n type: M2EventType.Composite,\n compositeType: \"DialogResult\",\n nodeUuid: this.uuid,\n callback: callback,\n };\n\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n const overlay = new Shape({\n rect: {\n width: m2c2Globals.canvasCssWidth,\n height: m2c2Globals.canvasCssHeight,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n fillColor: [0, 0, 0, this.overlayAlpha],\n zPosition: -1,\n isUserInteractionEnabled: true,\n });\n overlay.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Dismiss,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n this.addChild(overlay);\n\n const dialogBox = new Shape({\n rect: {\n width: 300,\n height: 150,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n cornerRadius: this.cornerRadius,\n fillColor: this.backgroundColor,\n isUserInteractionEnabled: true,\n });\n dialogBox.onTapDown((e) => {\n e.handled = true;\n });\n this.addChild(dialogBox);\n\n const dialogBoxPrimaryText = new Label({\n text: this.contentText,\n fontSize: 24,\n position: { x: 200, y: 360 },\n });\n this.addChild(dialogBoxPrimaryText);\n\n const negativeButton = new Button({\n text: this.negativeButtonText,\n position: { x: 120, y: 440 },\n size: { width: 100, height: 40 },\n isUserInteractionEnabled: true,\n zPosition: 1,\n });\n negativeButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n });\n negativeButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Negative,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n\n const positiveButton = new Button({\n text: this.positiveButtonText,\n position: { x: 280, y: 440 },\n size: { width: 100, height: 40 },\n isUserInteractionEnabled: true,\n zPosition: 1,\n });\n positiveButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Positive,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n\n this.addChild(negativeButton);\n this.addChild(positiveButton);\n\n this.needsInitialization = false;\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n this._fontColor = fontColor;\n this.needsInitialization = true;\n }\n\n get hidden(): boolean {\n return this._hidden;\n }\n set hidden(hidden: boolean) {\n this._hidden = hidden;\n this.needsInitialization = true;\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Dialog {\n throw new M2Error(`duplicate not implemented. ${newName}`);\n // const dest = new Dialog({\n // ...this.getNodeOptions(),\n // ...this.getDrawableOptions(),\n // ...this.getTextOptions(),\n // size: this.size,\n // cornerRadius: this.cornerRadius,\n // backgroundColor: this.backgroundColor,\n // fontColor: this.fontColor,\n // name: newName,\n // });\n\n // if (this.children.length > 0) {\n // dest.children = this.children.map((child) => {\n // const clonedChild = child.duplicate();\n // clonedChild.parent = dest;\n // return clonedChild;\n // });\n // }\n\n //return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n","import {\n CompositeOptions,\n Size,\n RgbaColor,\n M2NodeEvent,\n Point,\n CallbackOptions,\n Composite,\n WebColors,\n Shape,\n MutablePath,\n TapEvent,\n M2PointerEvent,\n M2Node,\n IDrawable,\n M2c2KitHelpers,\n M2NodeConstructor,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface DrawPadOptions extends CompositeOptions {\n /** Size of the DrawPad */\n size: Size;\n /** Color of drawn lines. Default is red. */\n lineColor?: RgbaColor;\n /** Width of drawn lines. Default is 1 */\n lineWidth?: number;\n /** Background color of the DrawPad. Default is transparent. */\n backgroundColor?: RgbaColor;\n /** Width of the border. Default is 1 */\n borderWidth?: number;\n /** Color of the border. Default is black */\n borderColor?: RgbaColor;\n /** Does the DrawPad respond to user interaction? Default is true. */\n isUserInteractionEnabled?: boolean;\n /** Should drawing resume when the pointer, in a down state, returns to the DrawPad area after exiting it while drawing? Default is false. */\n resumeDrawingOnReturn?: boolean;\n /** Should the user be permitted to draw only one continuous line? If so, no more drawing is allowed after the first stroke ends. */\n continuousDrawingOnly?: boolean;\n /** If `continuousDrawingOnly`, this is the maximum pixel distance from the last stroke's end point that the user is allowed to continue drawing with a new stroke. */\n continuousDrawingOnlyExceptionDistance?: number;\n}\n\nexport const DrawPadEventType = {\n StrokeStart: \"StrokeStart\",\n StrokeMove: \"StrokeMove\",\n StrokeEnd: \"StrokeEnd\",\n} as const;\nexport type DrawPadEventType =\n (typeof DrawPadEventType)[keyof typeof DrawPadEventType];\n\nexport interface DrawPadEvent extends M2NodeEvent {\n type: DrawPadEventType;\n position: Point;\n}\n\nexport const DrawPadItemEventType = {\n StrokeEnter: \"StrokeEnter\",\n StrokeLeave: \"StrokeLeave\",\n} as const;\nexport type DrawPadItemEventType =\n (typeof DrawPadItemEventType)[keyof typeof DrawPadItemEventType];\n\nexport interface DrawPadItemEvent extends M2NodeEvent {\n type: DrawPadItemEventType;\n}\n\nexport interface StrokeInteraction {\n /** Type of user interaction with the stroke: StrokeStart, StrokeMove, or StrokeEnd. */\n type: DrawPadEventType;\n /** Position on the DrawPad where the interaction occurred. In the DrawPad coordinate system, (0, 0) is the upper-left corner. */\n position: Point;\n /** Device ISO8601 Timestamp of the interaction. */\n iso8601Timestamp: string;\n /** Was the interaction's position interpolated? (clipped to DrawPad boundary) because the user drew out of bounds? @remarks Only StrokeMove and StrokeEnd can be interpolated. A StrokeStart position can never begin out of bounds. */\n interpolated: boolean;\n}\n\nexport type DrawPadStroke = Array<StrokeInteraction>;\n\nexport interface DrawPadItem {\n /**\n * Executes a callback when a DrawPad stroke begins on or enters the DrawPadItem.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeEnter(\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ): void;\n /**\n * Executes a callback when a DrawPad stroke leaves the DrawPadItem.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeLeave(\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ): void;\n /** Is a DrawPad stroke currently within the bounds of the DrawPad item? */\n isStrokeWithinBounds: boolean;\n /** Position of the DrawPadItem within the DrawPad coordinate system, in which (0, 0) is the upper-left corner. */\n drawPadPosition: Point;\n}\n\nexport class DrawPad extends Composite {\n compositeType = \"DrawPad\";\n resumeDrawingOnReturn = false;\n continuousDrawingOnly = false;\n continuousDrawingOnlyExceptionDistance: number | undefined;\n\n private _backgroundColor: RgbaColor = [0, 0, 0, 0];\n private _borderColor = WebColors.Black;\n private _borderWidth = 1;\n private _lineColor = WebColors.Red;\n private _lineWidth = 1;\n /** The rectangular \"pad\" on which to draw */\n private drawArea?: Shape;\n /** The lines that are drawn */\n private drawShape?: Shape;\n private isDrawingPointerDown = false;\n private pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n private currentStrokesNotAllowed = false;\n private originalOptions: DrawPadOptions;\n\n /** Array of strokes created on the DrawPad, with position and timestamps\n * of all interactions with each DrawPadStroke.\n */\n strokes = new Array<DrawPadStroke>();\n\n /**\n * A rectangular area on which the user can draw strokes (lines).\n *\n * @remarks This composite node is composed of a rectangle Shape and\n * another Shape that is formed from a path of points.\n *\n * @param options - {@link DrawPadOptions}\n */\n constructor(options: DrawPadOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.isUserInteractionEnabled === undefined) {\n // unlike most nodes, DrawPad is interactive by default\n this.isUserInteractionEnabled = true;\n }\n if (!options.size) {\n throw new M2Error(\"DrawPad size must be specified\");\n }\n this.size = options.size;\n\n if (options.lineColor) {\n this.lineColor = options.lineColor;\n }\n if (options.lineWidth) {\n this.lineWidth = options.lineWidth;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n if (options.borderColor) {\n this.borderColor = options.borderColor;\n }\n if (options.borderWidth) {\n this.borderWidth = options.borderWidth;\n }\n if (options.resumeDrawingOnReturn !== undefined) {\n this.resumeDrawingOnReturn = options.resumeDrawingOnReturn;\n }\n\n if (options.continuousDrawingOnly !== undefined) {\n this.continuousDrawingOnly = options.continuousDrawingOnly;\n }\n\n if (options.continuousDrawingOnlyExceptionDistance !== undefined) {\n this.continuousDrawingOnlyExceptionDistance =\n options.continuousDrawingOnlyExceptionDistance;\n }\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.initializeDrawShape();\n this.initializeDrawArea();\n this.needsInitialization = false;\n }\n\n private initializeDrawShape() {\n if (!this.drawShape) {\n const mutablePath = new MutablePath();\n this.drawShape = new Shape({\n path: mutablePath,\n size: this.size,\n });\n this.addChild(this.drawShape);\n }\n this.drawShape.strokeColor = this.lineColor;\n this.drawShape.lineWidth = this.lineWidth;\n }\n\n private initializeDrawArea() {\n if (!this.drawArea) {\n this.drawArea = new Shape({\n rect: { size: this.size },\n isUserInteractionEnabled: true,\n suppressEvents: true,\n });\n this.addChild(this.drawArea);\n\n this.drawArea.onTapDown((e) => {\n this.handleTapDown(e);\n });\n\n this.drawArea.onPointerMove((e) => {\n this.handlePointerMove(e);\n });\n\n this.drawArea.onTapUpAny(() => {\n this.handleTapUpAny();\n });\n\n this.drawArea.onTapLeave((e) => {\n this.handleTapLeave(e);\n });\n }\n this.drawArea.fillColor = this.backgroundColor;\n this.drawArea.strokeColor = this.borderColor;\n this.drawArea.lineWidth = this.borderWidth;\n }\n\n private dist(p1: Point, p2: Point): number {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n }\n\n private handleTapDown(e: TapEvent) {\n if (this.isUserInteractionEnabled) {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.handleTapDown(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n\n if (this.continuousDrawingOnly && path.subpaths.length !== 0) {\n const prevPoint =\n path.subpaths[path.subpaths.length - 1][\n path.subpaths[path.subpaths.length - 1].length - 1\n ];\n const currentPoint = e.point;\n\n if (\n this.continuousDrawingOnlyExceptionDistance === undefined ||\n this.dist(prevPoint, currentPoint) >\n this.continuousDrawingOnlyExceptionDistance\n ) {\n this.currentStrokesNotAllowed = true;\n return;\n }\n }\n\n this.currentStrokesNotAllowed = false;\n this.isDrawingPointerDown = true;\n path.move(e.point);\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeStart,\n target: this,\n handled: false,\n position: e.point,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes.push([\n {\n type: DrawPadEventType.StrokeStart,\n position: e.point,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n },\n ]);\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n private addInterpolatedStrokeMove(point: Point): Point {\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n const previousPoint =\n this.strokes[this.strokes.length - 1][strokeInteractionCount - 1]\n .position;\n const interpolatedPoint = this.interpolateToDrawPadBorder(\n point,\n previousPoint,\n this.size,\n );\n\n if (!this.drawShape?.path) {\n throw new M2Error(\n \"DrawPad.addInterpolatedStrokeMove(): no drawShape.path\",\n );\n }\n const path = this.drawShape.path as MutablePath;\n path.addLine(interpolatedPoint);\n\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeMove,\n target: this,\n handled: false,\n position: interpolatedPoint,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeMove,\n position: interpolatedPoint,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: true,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n\n return interpolatedPoint;\n }\n\n private handleTapLeave(e: TapEvent) {\n if (this.currentStrokesNotAllowed) {\n this.isDrawingPointerDown = false;\n return;\n }\n if (this.resumeDrawingOnReturn === false) {\n this.isDrawingPointerDown = false;\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n\n let pointWasInterpolated = false;\n let point = e.point;\n /**\n * If moving the pointer quickly when exiting the DrawPad area, we must\n * interpolate a point on the border of the DrawPad and add a stroke.\n * Otherwise, the stroke will end abruptly at the last point within the\n * DrawPad.\n */\n if (!this.isPointWithinDrawPad(e.point, this.size)) {\n point = this.addInterpolatedStrokeMove(e.point);\n pointWasInterpolated = true;\n }\n\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n target: this,\n handled: false,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeEnd,\n position: pointWasInterpolated\n ? point\n : this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: pointWasInterpolated,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n this.currentStrokesNotAllowed = true;\n } else {\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = true;\n }\n }\n\n private handleTapUpAny() {\n if (this.currentStrokesNotAllowed) {\n this.isDrawingPointerDown = false;\n return;\n }\n if (this.isUserInteractionEnabled) {\n this.isDrawingPointerDown = false;\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n target: this,\n handled: false,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n private handlePointerMove(e: M2PointerEvent) {\n if (this.isUserInteractionEnabled && this.isDrawingPointerDown) {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.handlePointerMove(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n if (\n this.isDrawingPointerDown &&\n !this.pointerIsDownAndPointerLeftDrawAreaWhenDown\n ) {\n path.addLine(e.point);\n }\n if (this.pointerIsDownAndPointerLeftDrawAreaWhenDown) {\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n path.move(e.point);\n }\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeMove,\n target: this,\n handled: false,\n position: e.point,\n ...M2c2KitHelpers.createTimestamps(),\n };\n const strokeCount = this.strokes.length;\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeMove,\n position: e.point,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n private raiseDrawPadEvent(event: DrawPadEvent): void {\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === event.type)\n .forEach((listener) => {\n listener.callback(event);\n });\n }\n }\n\n private raiseDrawPadItemEvent(item: M2Node, event: DrawPadItemEvent): void {\n if (item.eventListeners.length > 0) {\n item.eventListeners\n .filter((listener) => listener.type === event.type)\n .forEach((listener) => {\n listener.callback(event);\n });\n }\n }\n\n /**\n * Removes all strokes from the DrawPad.\n */\n clear(): void {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.clear(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n path.clear();\n this.strokes = new Array<DrawPadStroke>();\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * Executes a callback when the user starts a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeStart(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeStart,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Executes a callback when the user moves a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeMove(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeMove,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Executes a callback when the user ends a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeEnd(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeEnd,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Adds a node to the DrawPad.\n *\n * @remarks After the node is added to the DrawPad, its\n * position is adjusted to be relative to the DrawPad's coordinate\n * system, and it is made interactive. The method returns an object\n * which is the node as a DrawPadItem, which has additional methods,\n * properties, and events specific to it now being on a DrawPad. The node\n * now **must** be manipulated only using the DrawPadItem object. Using\n * the original node object will result in undefined behavior.\n *\n * @param node - the node to add to the DrawPad\n * @returns the node as a DrawPadItem\n */\n addItem<T extends M2Node>(node: T): T & DrawPadItem {\n Object.defineProperty(node, \"drawPadPosition\", {\n get: function () {\n const drawPad = node.parent as DrawPad;\n return {\n get x() {\n return node.position.x + drawPad.size.width / 2;\n },\n\n set x(value) {\n node.position.x = value - drawPad.size.width / 2;\n },\n get y() {\n return node.position.y + drawPad.size.height / 2;\n },\n\n set y(value) {\n node.position.y = value - drawPad.size.height / 2;\n },\n };\n },\n set: function (value: Point) {\n const drawPad = node.parent as DrawPad;\n node.position.x = value.x - drawPad.size.width / 2;\n node.position.y = value.y - drawPad.size.height / 2;\n },\n });\n Object.defineProperty(node, \"onStrokeEnter\", {\n value: function (\n this: T,\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ) {\n this.addEventListener(\n DrawPadItemEventType.StrokeEnter,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n },\n });\n Object.defineProperty(node, \"onStrokeLeave\", {\n value: function (\n this: T,\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ) {\n this.addEventListener(\n DrawPadItemEventType.StrokeLeave,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n },\n });\n Object.defineProperty(node, \"isStrokeWithinBounds\", {\n value: false,\n writable: true,\n });\n node.onPointerDown(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === false) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = true;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeEnter,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerMove(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === false) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = true;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeEnter,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerLeave(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === true) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = false;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeLeave,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerUp(() => {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === true) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = false;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeLeave,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n });\n this.addChild(node);\n /**\n * DrawPadItems must have zPosition -1 (below the DrawPadArea) so the\n * pointer events are properly processed. If this is not set, TapDown\n * event on the DrawPadArea will not set isStrokeWithinBounds = true,\n * and thus the StrokeEnter event on the item will not be raised.\n */\n (node as unknown as IDrawable).zPosition = -1;\n /**\n * Adust the node position so it is relative to the DrawPad coordinate\n * system.\n */\n node.position.x = node.position.x - this.size.width / 2;\n node.position.y = node.position.y - this.size.height / 2;\n node.isUserInteractionEnabled = true;\n return node as T & DrawPadItem;\n }\n\n /**\n * Takes a screenshot of the DrawPad.\n *\n * @returns a base64-encoded string of the DrawPad's current state in\n * PNG format.\n */\n takeScreenshot() {\n const drawArea = this.drawArea;\n if (!drawArea) {\n throw new M2Error(\"DrawPad.takeScreenshot(): no drawArea\");\n }\n const sx =\n (drawArea.absolutePosition.x - drawArea.size.width / 2) *\n m2c2Globals.canvasScale;\n const sy =\n (drawArea.absolutePosition.y - drawArea.size.height / 2) *\n m2c2Globals.canvasScale;\n const sw = drawArea.size.width * m2c2Globals.canvasScale;\n const sh = drawArea.size.height * m2c2Globals.canvasScale;\n const imageInfo = {\n alphaType: this.game.canvasKit.AlphaType.Unpremul,\n colorType: this.game.canvasKit.ColorType.RGBA_8888,\n colorSpace: this.game.canvasKit.ColorSpace.SRGB,\n width: sw,\n height: sh,\n };\n const snapshot = this.game.snapshots[0];\n const pixelData = snapshot.readPixels(sx, sy, imageInfo) as Uint8Array;\n const croppedImage = this.game.canvasKit.MakeImage(\n imageInfo,\n pixelData,\n pixelData.length / sh,\n );\n if (!croppedImage) {\n throw new M2Error(\"DrawPad.takeScreenshot(): no croppedImage\");\n }\n const bytes = croppedImage.encodeToBytes();\n if (!bytes) {\n throw new M2Error(\n \"DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed\",\n );\n }\n croppedImage.delete();\n return this.arrayBufferToBase64String(bytes);\n }\n\n /**\n * Determines whether a point is within the DrawPad.\n *\n * @param point - The point to check\n * @returns True - if the point is within the DrawPad, false otherwise\n */\n private isPointWithinDrawPad(point: Point, drawPadSize: Size): boolean {\n return (\n point.x >= 0 &&\n point.x <= drawPadSize.width &&\n point.y >= 0 &&\n point.y <= drawPadSize.height\n );\n }\n\n /**\n * Interpolates a point to the border of the DrawPad based on a line that\n * crosses the DrawPad border. The line is formed by the current \"out of\n * bounds\" point the and previous \"within bounds\" point.\n *\n * @param currentPoint - The current point\n * @param previousPoint - The previous point\n * @param drawPadSize - The size of the DrawPad\n * @returns A new point on the border of the DrawPad\n */\n private interpolateToDrawPadBorder(\n currentPoint: Point,\n previousPoint: Point,\n drawPadSize: Size,\n ): Point {\n /** Calculate the slope and intercept of the line passing through the\n * current and previous points Use the formula y = mx + b, where m\n * is the slope and b is the intercept.\n */\n const slope =\n (currentPoint.y - previousPoint.y) / (currentPoint.x - previousPoint.x);\n const intercept = currentPoint.y - slope * currentPoint.x;\n\n // Initialize the new point to be returned\n const newPoint: Point = { x: 0, y: 0 };\n\n // Check if vertical line (slope is undefined)\n if (!Number.isFinite(slope)) {\n // Use the current x value as the intersection point\n newPoint.x = currentPoint.x;\n // Check if the line segment is going from top to bottom\n if (currentPoint.y - previousPoint.y > 0) {\n // Set the new point to be the intersection point on the bottom border\n newPoint.y = drawPadSize.height;\n return newPoint;\n }\n // Check if the line segment is going from bottom to top\n if (currentPoint.y - previousPoint.y < 0) {\n // Set the new point to be the intersection point on the top border\n newPoint.y = 0;\n return newPoint;\n }\n }\n\n /**\n * Check if the line intersects the left or right border of DrawPad.\n * Use formula y = mx + b and substitute x = 0 or x = drawPadSize.width\n */\n const yLeft = slope * 0 + intercept;\n const yRight = slope * drawPadSize.width + intercept;\n // Check if the intersection point is within the DrawPad height\n if (yLeft >= 0 && yLeft <= drawPadSize.height) {\n // Check if the line segment is going from right to left\n if (currentPoint.x - previousPoint.x < 0) {\n // Set the new point to be the intersection point on the left border\n newPoint.x = 0;\n newPoint.y = yLeft;\n return newPoint;\n }\n }\n if (yRight >= 0 && yRight <= drawPadSize.height) {\n // Check if the line segment is going from left to right\n if (currentPoint.x - previousPoint.x > 0) {\n // Set the new point to be the intersection point on the right border\n newPoint.x = drawPadSize.width;\n newPoint.y = yRight;\n return newPoint;\n }\n }\n\n /**\n * Check if the line intersects the top or bottom border of DrawPad.\n * Use formula x = (y - b) / m and substitute y = 0 or y = drawPadSize.height\n */\n const xTop = (0 - intercept) / slope;\n const xBottom = (drawPadSize.height - intercept) / slope;\n // Check if the intersection point is within the DrawPad width\n if (xTop >= 0 && xTop <= drawPadSize.width) {\n // Check if the line segment is going from bottom to top\n if (currentPoint.y - previousPoint.y < 0) {\n // Set the new point to be the intersection point on the top border\n newPoint.x = xTop;\n newPoint.y = 0;\n return newPoint;\n }\n }\n if (xBottom >= 0 && xBottom <= drawPadSize.width) {\n // Check if the line segment is going from top to bottom\n if (currentPoint.y - previousPoint.y > 0) {\n // Set the new point to be the intersection point on the bottom border\n newPoint.x = xBottom;\n newPoint.y = drawPadSize.height;\n return newPoint;\n }\n }\n\n // If none of the above cases apply, return the current point as fallback\n return currentPoint;\n }\n\n private arrayBufferToBase64String(buffer: ArrayBuffer): string {\n let binary = \"\";\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get borderColor(): RgbaColor {\n return this._borderColor;\n }\n set borderColor(borderColor: RgbaColor) {\n this._borderColor = borderColor;\n this.needsInitialization = true;\n }\n\n get borderWidth(): number {\n return this._borderWidth;\n }\n set borderWidth(borderWidth: number) {\n this._borderWidth = borderWidth;\n this.needsInitialization = true;\n }\n\n get lineColor(): RgbaColor {\n return this._lineColor;\n }\n set lineColor(lineColor: RgbaColor) {\n this._lineColor = lineColor;\n this.needsInitialization = true;\n }\n\n get lineWidth(): number {\n return this._lineWidth;\n }\n set lineWidth(lineWidth: number) {\n this._lineWidth = lineWidth;\n this.needsInitialization = true;\n }\n\n override duplicate(newName?: string): DrawPad {\n throw new M2Error(\n `DrawPad.duplicate(): Method not implemented. ${newName}`,\n );\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(DrawPad as unknown as M2NodeConstructor);\n","import {\n Shape,\n Label,\n WebColors,\n Point,\n Size,\n RgbaColor,\n Composite,\n CompositeOptions,\n M2Node,\n M2NodeEvent,\n M2EventType,\n IDrawable,\n M2NodeEventListener,\n ShapeOptions,\n CallbackOptions,\n M2c2KitHelpers,\n M2NodeConstructor,\n CompositeEvent,\n EventStoreMode,\n TapEvent,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\n/**\n * Additional, optional properties for a key in the `VirtualKeyboard`.\n *\n * @remarks This is used to define special keys (e.g., Shift, Backspace),\n * keys with icons, and keys of custom size.\n */\nexport interface KeyConfiguration {\n /** Width of the key in units of a regular key width. Default is 1. */\n widthRatio?: number;\n /** Width of the key in units of a regular key height. Default is 1. */\n heightRatio?: number;\n /** Identifier for the key. */\n code: string;\n /** Label to be shown on the key. */\n labelText?: string;\n /** Label to be shown on the key when shift is activated. */\n labelTextShifted?: string;\n /** True is the key should be hidden. */\n blank?: boolean;\n /** True is the key is a shift key. */\n isShift?: boolean;\n /** ShapeOptions of the optional icon to show on the key. */\n keyIconShapeOptions?: ShapeOptions;\n}\n\n/**\n * A row in the `VirtualKeyboard`.\n *\n * @remarks Each row is an array of objects that defines a key, where each\n * object can be one of the following:\n * - a string, e.g., `a`. The string is the key in the keyboard's unshifted\n * state (`a`), and the string's value after applying `toUpperCase()` is the key\n * in the keyboard's shifted state (`A`).\n * - an array of two strings, e.g., `[\"1\", \"!\"]`. The first string is the key\n * in the keyboard's unshifted state (`1`), and the second string is the key\n * in the keyboard's shifted state (`!`).\n * - A `KeyConfiguration` object, which can be used to further customize the\n * key's appearance and behavior.\n */\nexport type VirtualKeyboardRow = Array<\n string | Array<string> | KeyConfiguration\n>;\n\nexport interface VirtualKeyboardOptions extends CompositeOptions {\n size: Size;\n /** Percent of the keyboard width that should be used for padding on the left and right sides. Default is .02 */\n keyboardHorizontalPaddingPercent?: number;\n /** Percent of the keyboard height that should be used for padding on the top and bottom sides. Default is .025 */\n keyboardVerticalPaddingPercent?: number;\n /** Percent of each key's width that should be used for padding on the left and right sides. Default is .10 */\n keyHorizontalPaddingPercent?: number;\n /** Percent of each key's height that should be used for padding on the top and bottom sides. Default is .10 */\n keyVerticalPaddingPercent?: number;\n /** Configuration of keyboard rows. Order is from top to bottom rows. */\n rows?: Array<VirtualKeyboardRow>;\n /** How many regular-sized keys should fit in a row? This is used for scaling purposes. If not provided, it will be inferred from the row configuration. */\n keysPerRow?: number;\n /** Size of font for keys. */\n fontSize?: number;\n /** The fonts for the key labels, if not the default font. */\n fontNames?: Array<string> | undefined;\n /** Comma-separated list of keys to hide. */\n hiddenKeys?: string;\n /** If true, only capital letters will be shown. */\n capitalLettersOnly?: boolean;\n /** Color of keys. */\n keyColor?: RgbaColor;\n /** Color of keys when pressed. */\n keyDownColor?: RgbaColor;\n /** Color of special keys when pressed. */\n specialKeyDownColor?: RgbaColor;\n /** Background color of keyboard. */\n backgroundColor?: RgbaColor;\n /** If true, a preview of the key that will be pressed will be shown. */\n showKeyDownPreview?: boolean;\n}\n\nexport interface VirtualKeyboardEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"VirtualKeyboard\";\n compositeEventType:\n | \"VirtualKeyboardKeyUp\"\n | \"VirtualKeyboardKeyDown\"\n | \"VirtualKeyboardKeyLeave\";\n target: VirtualKeyboard | string;\n /** String that is generated when key is pressed, with any modifiers (e.g., Shift) applied. */\n key: string;\n /** Code for the key, not taking into account any modifiers. */\n code: string;\n /** True if the Shift key is pressed. */\n shiftKey: boolean;\n /** Metadata related to the key tap. */\n keyTapMetadata: KeyTapMetadata;\n}\n\nexport interface KeyTapMetadata {\n /** Size of the key. */\n size: Size;\n /** Point on the key where the tap event occurred. */\n point: Point;\n /** Buttons pressed when the key was tapped. */\n buttons: number;\n}\n\n/**\n * `KeyConfigurationWithShape` is a `KeyConfiguration` with an optional m2c2kit\n * instantiated `Shape` for the key's icon, instead of a `ShapeOptions`\n * object.\n */\ninterface KeyConfigurationWithShape\n extends KeyConfiguration,\n Omit<KeyConfiguration, \"keyIconShapeOptions\"> {\n /** Icon to show on the key. */\n keyIcon?: Shape;\n}\n\n/**\n * The complete keyboard configuration for internal use, with all keys\n * represented as `KeyConfigurationWithShape` objects.\n */\ntype InternalKeyboardConfiguration = Array<Array<KeyConfigurationWithShape>>;\n\n/**\n * `InternalKeyboardRow` is a `VirtualKeyboardRow`, but with the optional\n * `KeyConfiguration` objects replaced with `KeyConfigurationWithShape`\n * objects. Note: keys that are strings or arrays of strings are not changed.\n */\ntype InternalKeyboardRow = Array<\n KeyConfigurationWithShape | string | Array<string>\n>;\n\nexport class VirtualKeyboard extends Composite {\n readonly compositeType = \"VirtualKeyboard\";\n private keyboardHorizontalPaddingPercent: number;\n private keyboardVerticalPaddingPercent: number;\n private keyHorizontalPaddingPercent: number;\n private keyVerticalPaddingPercent: number;\n private keyboardRows = new Array<InternalKeyboardRow>();\n private keysPerRow: number;\n private fontSize: number;\n private fontNames: Array<string> | undefined;\n private hiddenKeys: string;\n private capitalLettersOnly: boolean;\n private keyColor: RgbaColor;\n private keyDownColor: RgbaColor;\n private specialKeyDownColor: RgbaColor;\n private backgroundColor: RgbaColor;\n private showKeyDownPreview: boolean;\n private originalOptions: VirtualKeyboardOptions;\n\n private shiftActivated = false;\n private keyShapes = new Array<Shape>();\n private keyLabels = new Array<Label>();\n\n private letterCircle?: Shape;\n private letterCircleLabel?: Label;\n\n /**\n * An on-screen keyboard that can be used to enter text.\n *\n * @param options - {@link VirtualKeyboardOptions}\n */\n constructor(options: VirtualKeyboardOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.isUserInteractionEnabled === undefined) {\n // VirtualKeyboard defaults to being user interactive.\n this._isUserInteractionEnabled = true;\n }\n this.size = options.size;\n this.position = options.position ?? { x: 0, y: 0 };\n this.keyboardHorizontalPaddingPercent =\n options.keyboardHorizontalPaddingPercent ?? 0.02;\n this.keyboardVerticalPaddingPercent =\n options.keyboardVerticalPaddingPercent ?? 0.025;\n this.keyHorizontalPaddingPercent =\n options.keyHorizontalPaddingPercent ?? 0.1;\n this.keyVerticalPaddingPercent = options.keyVerticalPaddingPercent ?? 0.1;\n if (options.rows !== undefined) {\n /**\n * Map the KeyConfiguration objects to InternalKeyConfiguration objects.\n * KeyConfiguration objects are used by the user to configure the\n * keyboard. The icon, optionally, is provided as a ShapeOptions\n * object. InternalKeyConfiguration has the icon as a ready-to-use Shape\n * object.\n */\n this.keyboardRows = options.rows.map((row) => {\n const internalRow = row.map((key) => {\n if (key instanceof Object && !Array.isArray(key)) {\n const internalKeyConfig = key as KeyConfigurationWithShape;\n if (key.keyIconShapeOptions) {\n key.keyIconShapeOptions.suppressEvents = true;\n internalKeyConfig.keyIcon = new Shape(key.keyIconShapeOptions);\n (internalKeyConfig as KeyConfiguration).keyIconShapeOptions =\n undefined;\n }\n return internalKeyConfig;\n } else {\n return key;\n }\n });\n return internalRow;\n });\n }\n this.keysPerRow = options.keysPerRow ?? NaN;\n this.fontSize = options.fontSize ?? NaN;\n this.fontNames = options.fontNames;\n this.hiddenKeys = options.hiddenKeys ?? \"\";\n this.capitalLettersOnly = options.capitalLettersOnly ?? false;\n this.keyColor = options.keyColor ?? WebColors.White;\n this.keyDownColor = options.keyDownColor ?? WebColors.Transparent;\n this.specialKeyDownColor =\n options.specialKeyDownColor ?? WebColors.LightSteelBlue;\n this.backgroundColor = options.backgroundColor ?? [242, 240, 244, 1];\n this.showKeyDownPreview = options.showKeyDownPreview ?? true;\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n /**\n * VirtualKeyboard defaults to being user interactive, but disable this\n * if we are in replay mode.\n */\n if (this.game.eventStore.mode === EventStoreMode.Replay) {\n this._isUserInteractionEnabled = false;\n }\n\n if (this.keyboardRows.length === 0) {\n this.keyboardRows = this.createDefaultKeyboardRows();\n this.keysPerRow = this.keyboardRows.reduce(\n (max, row) => Math.max(max, row.length),\n 0,\n );\n this.fontSize = this.size.height / this.keyboardRows.length / 2.5;\n }\n\n const keyboardRectangle = new Shape({\n rect: { size: this.size },\n fillColor: this.backgroundColor,\n suppressEvents: true,\n });\n this.addChild(keyboardRectangle);\n\n const keyboard = this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n\n const keyboardOrigin: Point = {\n x: -keyboardRectangle.size.width / 2,\n y: -keyboardRectangle.size.height / 2,\n };\n\n const keyboardVerticalPadding =\n (this.keyboardVerticalPaddingPercent ?? 0.025) * this.size.height;\n const keyboardHorizontalPadding =\n (this.keyboardHorizontalPaddingPercent ?? 0.02) * this.size.width;\n const keyBoxHeight =\n (this.size.height - 2 * keyboardVerticalPadding) / keyboard.length;\n const keyBoxWidth =\n (this.size.width - 2 * keyboardHorizontalPadding) / this.keysPerRow;\n\n this.keyShapes = [];\n\n for (let r = 0; r < keyboard.length; r++) {\n const row = keyboard[r];\n const rowSumKeyWidths = row.reduce(\n (sum, key) => sum + (key.widthRatio ?? 1),\n 0,\n );\n\n // extraPadding is additional padding to center the keys in the row\n // if the row is not full.\n let extraPadding = 0;\n if (rowSumKeyWidths < this.keysPerRow) {\n extraPadding =\n (this.size.width -\n 2 * keyboardHorizontalPadding -\n keyBoxWidth * rowSumKeyWidths) /\n 2;\n }\n\n for (let k = 0; k < row.length; k++) {\n const key = row[k];\n if (\n this.hiddenKeys\n ?.split(\",\")\n // \" \" is a special case for the space key code\n .map((s) => (s === \" \" ? \" \" : s.trim()))\n .includes(key.code)\n ) {\n continue;\n }\n const keyBoxWidthsSoFar =\n row.slice(0, k).reduce((sum, key) => sum + (key.widthRatio ?? 1), 0) *\n keyBoxWidth;\n const keyBox = new Shape({\n rect: {\n size: {\n width: keyBoxWidth * (key.widthRatio ?? 1),\n height: keyBoxHeight,\n },\n },\n fillColor: WebColors.Transparent,\n strokeColor: WebColors.Transparent,\n lineWidth: 1,\n position: {\n x:\n extraPadding +\n keyboardOrigin.x +\n keyboardHorizontalPadding +\n keyBoxWidthsSoFar +\n ((key.widthRatio ?? 1) * keyBoxWidth) / 2,\n y:\n keyboardOrigin.y +\n keyboardVerticalPadding +\n r * keyBoxHeight +\n keyBoxHeight / 2,\n },\n suppressEvents: true,\n });\n\n const keyWidth =\n keyBoxWidth * (key.widthRatio ?? 1) -\n 2 * this.keyHorizontalPaddingPercent * keyBoxWidth;\n const keyHeight =\n keyBoxHeight -\n (key.heightRatio ?? 1) -\n 2 * this.keyVerticalPaddingPercent * keyBoxHeight;\n const keyShape = new Shape({\n rect: { size: { width: keyWidth, height: keyHeight } },\n cornerRadius: 4,\n fillColor: this.keyColor,\n lineWidth: 0,\n isUserInteractionEnabled: this.isUserInteractionEnabled,\n suppressEvents: true,\n });\n // so we can reference keyShape by key code in handleCompositeEvent()\n keyShape.userData = { code: key.code };\n keyBox.addChild(keyShape);\n this.keyShapes.push(keyShape);\n\n const keyLabel = new Label({\n text: key.labelText,\n fontSize: this.fontSize,\n fontNames: this.fontNames,\n suppressEvents: true,\n });\n // so we can reference keyLabel by key code in handleCompositeEvent()\n keyLabel.userData = { code: key.code };\n keyBox.addChild(keyLabel);\n this.keyLabels.push(keyLabel);\n\n if (key.keyIcon) {\n keyBox.addChild(key.keyIcon);\n }\n\n keyboardRectangle.addChild(keyBox);\n\n keyShape.onTapUp((tapEvent) => {\n this.handleKeyShapeTapUp(key, keyShape, tapEvent);\n });\n\n keyShape.onTapDown((tapEvent) => {\n this.handleKeyShapeTapDown(key, keyShape, tapEvent);\n });\n\n keyShape.onTapLeave((tapEvent) => {\n this.handleKeyShapeTapLeave(key, keyShape, tapEvent);\n });\n }\n }\n\n this.letterCircle = new Shape({\n circleOfRadius: 28,\n fillColor: WebColors.Silver,\n hidden: true,\n suppressEvents: true,\n });\n keyboardRectangle.addChild(this.letterCircle);\n this.letterCircleLabel = new Label({\n text: \"\",\n fontSize: this.fontSize,\n fontNames: this.fontNames,\n suppressEvents: true,\n });\n this.letterCircle.addChild(this.letterCircleLabel);\n\n this.needsInitialization = false;\n }\n\n /**\n * Executes a callback when the user presses down on a key.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyDown(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyDown\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the user releases a key.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyUp(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyUp\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the user has pressed a key with the pointer, but\n * moves the pointer outside the key bounds before releasing the pointer.\n *\n * @remarks Typically, this event will not be used, since it is a user's\n * inaccurate interaction with the keyboard. However, it can be used to\n * provide feedback to the user that they have moved the pointer outside the\n * key bounds, and thus the key stroke will not be registered.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyLeave(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyLeave\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n duplicate(newName?: string | undefined): M2Node {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n private handleKeyShapeTapDown(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n if (key.isShift) {\n this.shiftActivated = !this.shiftActivated;\n }\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyDown\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyDown\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private handleKeyShapeTapUp(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyUp\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyUp\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private handleKeyShapeTapLeave(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyLeave\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyLeave\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private getKeyAsString(key: KeyConfigurationWithShape): string {\n if (key.isShift || key.code === \" \" || key.code === \"Backspace\") {\n return key.code;\n } else {\n if (this.shiftActivated) {\n return key.labelTextShifted ?? key.code;\n } else {\n return key.labelText ?? key.code;\n }\n }\n }\n\n /**\n * Converts the keyboard rows to the internal keyboard configuration.\n *\n * @remarks This normalizes the keyboard rows so that each key is a\n * full `KeyConfigurationWithShape` object, instead of a string or array of\n * strings.\n *\n * @param keyboardRows\n * @returns the keyboard for internal use\n */\n private internalKeyboardRowsToInternalKeyboardConfiguration(\n keyboardRows: Array<InternalKeyboardRow>,\n ): InternalKeyboardConfiguration {\n return keyboardRows.map((row) => {\n return row.map((key) => {\n let widthRatio = 1;\n const heightRatio = 1;\n let code: string;\n let label: string;\n let labelShifted: string;\n let keyIcon: Shape | undefined;\n let isShift = false;\n if (typeof key === \"string\") {\n code = key;\n if (this.capitalLettersOnly) {\n label = code.toUpperCase();\n } else {\n label = code;\n }\n labelShifted = code.toUpperCase();\n } else if (Array.isArray(key)) {\n code = key[0];\n label = code;\n labelShifted = key[1];\n } else {\n code = key.code;\n label = key.labelText ?? \"\";\n labelShifted = key.labelTextShifted ?? label;\n widthRatio = key.widthRatio ?? 1;\n keyIcon = key.keyIcon;\n isShift = key.isShift ?? false;\n }\n return {\n widthRatio,\n heightRatio,\n code,\n labelText: label,\n labelTextShifted: labelShifted,\n keyIcon,\n isShift,\n } as KeyConfigurationWithShape;\n });\n });\n }\n\n override handleCompositeEvent(event: VirtualKeyboardEvent): void {\n const keyboard = this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n const keyShape = this.keyShapes.find((k) => k.userData.code === event.code);\n if (!keyShape) {\n throw new M2Error(\"keyShape is not defined\");\n }\n\n this.shiftActivated = event.shiftKey;\n\n switch (event.compositeEventType) {\n case \"VirtualKeyboardKeyDown\": {\n this.handleKeyDownEvent(event, keyboard, keyShape);\n break;\n }\n case \"VirtualKeyboardKeyUp\": {\n this.handleKeyUpEvent(event, keyboard, keyShape);\n break;\n }\n case \"VirtualKeyboardKeyLeave\": {\n this.handleKeyLeaveEvent(event, keyboard, keyShape);\n break;\n }\n default: {\n throw new M2Error(\n `Unknown VirtualKeyboardEvent: ${event.compositeEventType}`,\n );\n }\n }\n }\n\n private handleKeyDownEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n if (event.code.toLowerCase().includes(\"shift\")) {\n if (event.shiftKey) {\n this.showKeyboardShifted(keyboard);\n } else {\n this.showKeyboardNotShifted(keyboard);\n }\n } else if (event.code === \" \" || event.code === \"Backspace\") {\n keyShape.fillColor = this.specialKeyDownColor;\n } else {\n keyShape.fillColor = this.keyDownColor;\n if (this.showKeyDownPreview) {\n if (!this.letterCircle || !this.letterCircleLabel) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = false;\n const keyBox = keyShape.parent as Shape;\n this.letterCircle.position.x = keyBox.position.x;\n if (keyShape.rect?.size?.height === undefined) {\n throw new M2Error(\"keyShape.rect.height is undefined\");\n }\n this.letterCircle.position.y =\n keyBox.position.y - keyShape.rect.size.height * 1.2;\n const keyboard =\n this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n const key = keyboard.flat().find((k) => k.code === event.code);\n if (!key) {\n throw new M2Error(\"key is not defined\");\n }\n if (this.shiftActivated) {\n this.letterCircleLabel.text = key.labelTextShifted ?? key.code;\n } else {\n this.letterCircleLabel.text = key.labelText ?? key.code;\n }\n }\n }\n }\n\n private handleKeyUpEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n /**\n * If shift key was released, and shift was activated, this is a simple\n * shift key activation. Shift was activated on the key down event, so\n * do nothing.\n */\n if (event.code.toLowerCase().includes(\"shift\") && event.shiftKey) {\n return;\n }\n\n /**\n * If shift key was released, and shift was not activated, this is a simple\n * shift key deactivation.\n */\n if (event.code.toLowerCase().includes(\"shift\") && !event.shiftKey) {\n this.shiftActivated = false;\n this.showKeyboardNotShifted(keyboard);\n return;\n }\n\n keyShape.fillColor = this.keyColor;\n if (!this.letterCircle) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = true;\n\n /**\n * A non-shift key was released, and shift was activated. This means that\n * we need to deactivate shift and show the keyboard in the non-shifted\n * state. This is because our behavior is to deactivate shift when a\n * non-shift key is released.\n */\n if (!event.code.toLowerCase().includes(\"shift\") && event.shiftKey) {\n this.shiftActivated = false;\n this.showKeyboardNotShifted(keyboard);\n }\n }\n\n private handleKeyLeaveEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n if (event.code.toLowerCase().includes(\"shift\")) {\n if (event.shiftKey) {\n this.showKeyboardNotShifted(keyboard);\n this.shiftActivated = false;\n } else {\n this.showKeyboardShifted(keyboard);\n this.shiftActivated = true;\n }\n return;\n }\n keyShape.fillColor = this.keyColor;\n if (!this.letterCircle) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = true;\n }\n\n private showKeyboardShifted(keyboard: InternalKeyboardConfiguration) {\n // change shift keys to special key color\n const shiftKeyShapes = this.keyShapes.filter((shape) =>\n (shape.userData.code as string).toLowerCase().includes(\"shift\"),\n );\n shiftKeyShapes.forEach((shape) => {\n shape.fillColor = this.specialKeyDownColor;\n });\n\n // if shift keys have icons, change fill to black\n const shiftKeys = keyboard.flat().filter((k) => k.isShift);\n shiftKeys.forEach((k) => {\n if (k.keyIcon) {\n k.keyIcon.fillColor = WebColors.Black;\n }\n });\n\n // change key labels to shifted text\n keyboard\n .flatMap((k) => k)\n .forEach((k) => {\n const keyLabel = this.keyLabels.find((l) => l.userData.code === k.code);\n if (!keyLabel) {\n throw new M2Error(\"keyLabel is not defined\");\n }\n if (keyLabel.text !== undefined) {\n keyLabel.text = k.labelTextShifted ?? \"\";\n }\n });\n }\n\n private showKeyboardNotShifted(keyboard: InternalKeyboardConfiguration) {\n // change shift keys back to regular color\n const shiftKeyShapes = this.keyShapes.filter((shape) =>\n (shape.userData.code as string).toLowerCase().includes(\"shift\"),\n );\n shiftKeyShapes.forEach((shape) => {\n shape.fillColor = this.keyColor;\n });\n\n // if shift keys have icons, change fill back to transparent\n const shiftKeys = keyboard.flat().filter((k) => k.isShift);\n shiftKeys.forEach((k) => {\n if (k.keyIcon) {\n k.keyIcon.fillColor = WebColors.Transparent;\n }\n });\n\n // change key labels to regular text\n keyboard\n .flatMap((k) => k)\n .forEach((k) => {\n const keyLabel = this.keyLabels.find((l) => l.userData.code === k.code);\n if (!keyLabel) {\n throw new M2Error(\"keyLabel is not defined\");\n }\n if (keyLabel.text !== undefined) {\n keyLabel.text = k.labelText ?? \"\";\n }\n });\n }\n\n private createDefaultKeyboardRows() {\n const numKeys: InternalKeyboardRow = [\n [\"1\", \"!\"],\n [\"2\", \"@\"],\n [\"3\", \"#\"],\n [\"4\", \"$\"],\n [\"5\", \"%\"],\n [\"6\", \"^\"],\n [\"7\", \"&\"],\n [\"8\", \"*\"],\n [\"9\", \"(\"],\n [\"0\", \")\"],\n ];\n const row1: InternalKeyboardRow = [\n \"q\",\n \"w\",\n \"e\",\n \"r\",\n \"t\",\n \"y\",\n \"u\",\n \"i\",\n \"o\",\n \"p\",\n ];\n const row2: InternalKeyboardRow = [\n \"a\",\n \"s\",\n \"d\",\n \"f\",\n \"g\",\n \"h\",\n \"j\",\n \"k\",\n \"l\",\n ];\n const shiftArrowShapeOptions: ShapeOptions = {\n path: {\n // Public Domain from https://www.freesvg.org\n pathString: \"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z\",\n width: 24,\n },\n lineWidth: 2,\n strokeColor: WebColors.Black,\n fillColor: WebColors.Transparent,\n suppressEvents: true,\n };\n const backspaceShapeOptions: ShapeOptions = {\n path: {\n // CC0 from https://www.svgrepo.com\n pathString:\n \"M10.625 5.09 0 22.09l10.625 17H44.18v-34H10.625zm31.555 32H11.734l-9.375-15 9.375-15H42.18v30zm-23.293-6.293 7.293-7.293 7.293 7.293 1.414-1.414-7.293-7.293 7.293-7.293-1.414-1.414-7.293 7.293-7.293-7.293-1.414 1.414 7.293 7.293-7.293 7.293\",\n width: 24,\n },\n lineWidth: 1,\n strokeColor: WebColors.Black,\n fillColor: WebColors.Red,\n suppressEvents: true,\n };\n const row3: InternalKeyboardRow = [\n {\n code: \"Shift\",\n isShift: true,\n widthRatio: 1.5,\n keyIcon: new Shape(shiftArrowShapeOptions),\n },\n \"z\",\n \"x\",\n \"c\",\n \"v\",\n \"b\",\n \"n\",\n \"m\",\n {\n code: \"Backspace\",\n widthRatio: 1.5,\n keyIcon: new Shape(backspaceShapeOptions),\n },\n ];\n const row4: InternalKeyboardRow = [\n { code: \" \", labelText: \"SPACE\", widthRatio: 5 },\n ];\n\n const keyboardRows = [numKeys, row1, row2, row3, row4];\n return keyboardRows;\n }\n\n private addVirtualKeyboardEventListener(\n eventListener: M2NodeEventListener<VirtualKeyboardEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n /**\n * Does the `VirtualKeyboard` respond to user events? Default is true.\n */\n override get isUserInteractionEnabled(): boolean {\n return this._isUserInteractionEnabled;\n }\n /**\n * Does the `VirtualKeyboard` respond to user events? Default is true.\n */\n override set isUserInteractionEnabled(isUserInteractionEnabled: boolean) {\n this._isUserInteractionEnabled = isUserInteractionEnabled;\n /**\n * Rather than redraw of the entire keyboard, we can simply update the\n * `isUserInteractionEnabled` property of each key shape. This means we\n * handle this property change a bit differently, since we are changing\n * keyboard node properties directly, rather that changing the properties\n * of the composite and then redrawing the composite. Specifically, in\n * event playback mode, this.keyShapes may be undefined (it has not yet\n * been initialized), so we need to check for that.\n */\n this.keyShapes?.forEach((keyShape) => {\n keyShape.isUserInteractionEnabled = isUserInteractionEnabled;\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(\n VirtualKeyboard as unknown as M2NodeConstructor,\n);\n","import { Button } from \"../composites/button\";\nimport {\n WebColors,\n Transition,\n TransitionDirection,\n Easings,\n Story,\n StoryOptions,\n Scene,\n Dimensions,\n Label,\n LabelHorizontalAlignmentMode,\n Sprite,\n RgbaColor,\n StringInterpolationMap,\n} from \"@m2c2kit/core\";\n\nconst SCENE_TRANSITION_EASING = Easings.sinusoidalInOut;\nconst SCENE_TRANSITION_DURATION = 500;\n\nexport interface InstructionScene {\n /** Primary instruction text */\n text?: string;\n /** Interpolation for text */\n textInterpolation?: StringInterpolationMap;\n /** Margin from left screen edge to primary instruction text. Default is 48 */\n textMarginStart?: number;\n /** Margin from right to primary instruction text. Default is 48 */\n textMarginEnd?: number;\n /** Horizontal alignment of primary instruction text. see {@link LabelHorizontalAlignmentMode}. Default is LabelHorizontalAlignmentMode.left. */\n textAlignmentMode?: LabelHorizontalAlignmentMode;\n /** Default is to center primary instructions vertically within the scene (textVerticalBias = .5). Setting textVerticalBias less than .5 will pull the text towards the top. Setting textVerticalBias greater than .5 will pull the text towards the bottom */\n textVerticalBias?: number;\n /** Font size of primary instruction text. Default is 16 */\n textFontSize?: number;\n /** A text heading to appear at the top of the scene */\n title?: string;\n /** Interpolation for title */\n titleInterpolation?: StringInterpolationMap;\n /** Margin from top of screen edge to title text. Default is 48 */\n titleMarginTop?: number;\n /** Font size of title text. Default is 16 */\n titleFontSize?: number;\n /** Name of optional image to show */\n imageName?: string;\n /** Default is to center image vertically within the scene (imageVerticalBias = .5). Setting imageVerticalBias less than .5 will pull the image towards the top. Setting imageVerticalBias greater than .5 will pull the image towards the bottom */\n imageVerticalBias?: number;\n /** If the image appears below the primary instruction text (imageAboveText = false), this is the margin from the bottom of the primary instruction text to the top of the image */\n imageMarginTop?: number;\n /** If the image appears above the primary instruction text (imageAboveText = true), this is the margin from the bottom of the image to the top of the primary instruction text */\n imageMarginBottom?: number;\n /** If an image is provided, should it appear above the primary text? Default is true */\n imageAboveText?: boolean;\n /** Background color for instruction scene. Will override what is set in InstructionsOptions */\n backgroundColor?: RgbaColor;\n /** Button text for the back button. Will override what is set in InstructionsOptions */\n backButtonText?: string;\n /** Interpolation for back button text */\n backButtonTextInterpolation?: StringInterpolationMap;\n /** Button text for the next button. Will override what is set in InstructionsOptions */\n nextButtonText?: string;\n /** Interpolation map for next button text */\n nextButtonTextInterpolation?: StringInterpolationMap;\n /** Width of back button. Will override what is set in InstructionsOptions */\n backButtonWidth?: number;\n /** Width of next button. Will override what is set in InstructionsOptions */\n nextButtonWidth?: number;\n /** Height of back button. Will override what is set in InstructionsOptions */\n backButtonHeight?: number;\n /** Height of next button. Will override what is set in InstructionsOptions */\n nextButtonHeight?: number;\n /** Color of back button. Will override what is set in InstructionsOptions */\n backButtonBackgroundColor?: RgbaColor;\n /** Color of back button text. Will override what is set in InstructionsOptions */\n backButtonFontColor?: RgbaColor;\n /** Color of next button. Will override what is set in InstructionsOptions */\n nextButtonBackgroundColor?: RgbaColor;\n /** Color of next button text. Will override what is set in InstructionsOptions */\n nextButtonFontColor?: RgbaColor;\n /** Scene transition when advancing to the next instruction scene. Will override what is set in InstructionsOptions */\n nextSceneTransition?: Transition;\n /** Scene transition when returning to the previous instruction scene. Will override what is set in InstructionsOptions */\n backSceneTransition?: Transition;\n}\n\nexport interface InstructionsOptions extends StoryOptions {\n /** Name to prefix to each instruction scene name. Default is \"instructions.\" For example, if screenNamePrefix is \"instructions\", instruction scenes will be named \"instructions-01\", \"instructions-02\", etc. */\n sceneNamePrefix?: string;\n /** Name of scene that follows the last instruction scene. Clicking the \"next\" button on the last instruction screen will advance to this screen */\n postInstructionsScene?: string;\n /** Array of instruction scenes that form the instructions */\n instructionScenes: Array<InstructionScene>;\n /** Background color for instruction scenes. Can be overridden within a single instruction scene */\n backgroundColor?: RgbaColor;\n /** Scene transition when advancing to the next instruction scene. Default is push transition, to the left, 500 milliseconds duration. Can be overridden within a single instruction scene */\n nextSceneTransition?: Transition;\n /** Scene transition when returning to the previous instruction scene. Default is push transition, to the right, 500 milliseconds duration. Can be overridden within a single instruction scene */\n backSceneTransition?: Transition;\n /** Button text for the back button. Default is \"Back\". Can be overridden within a single instruction scene */\n backButtonText?: string;\n /** Interpolation map for back button text */\n backButtonTextInterpolation?: StringInterpolationMap;\n /** Button text for the next button. Default is \"Next\". Can be overridden within a single instruction scene */\n nextButtonText?: string;\n /** Interpolation map for next button text */\n nextButtonTextInterpolation?: StringInterpolationMap;\n /** Width of back button. Default is 125. Can be overridden within a single instruction scene */\n backButtonWidth?: number;\n /** Width of next button. Default is 125. Can be overridden within a single instruction scene */\n nextButtonWidth?: number;\n /** Height of back button. Default is 50. Can be overridden within a single instruction scene */\n backButtonHeight?: number;\n /** Height of next button. Default is 50. Can be overridden within a single instruction scene */\n nextButtonHeight?: number;\n /** Color of back button. Default is WebColors.Black. Can be overridden within a single instruction scene */\n backButtonBackgroundColor?: RgbaColor;\n /** Color of back button text. Default is WebColors.White. Can be overridden within a single instruction scene */\n backButtonFontColor?: RgbaColor;\n /** Color of next button. Default is WebColors.Black. Can be overridden within a single instruction scene */\n nextButtonBackgroundColor?: RgbaColor;\n /** Color of next button text. Default is WebColors.White. Can be overridden within a single instruction scene */\n nextButtonFontColor?: RgbaColor;\n}\n\nexport class Instructions extends Story {\n /**\n * Creates an array of scenes containing instructions on how to complete the assessment\n *\n * @param options - {@link InstructionsOptions}\n * @returns instruction scenes\n */\n static override create(options: InstructionsOptions): Array<Scene> {\n const scenes = new Array<Scene>();\n options.instructionScenes.forEach((s, i) => {\n const nextSceneTransition =\n s.nextSceneTransition ??\n options.nextSceneTransition ??\n Transition.slide({\n direction: TransitionDirection.Left,\n duration: SCENE_TRANSITION_DURATION,\n easing: SCENE_TRANSITION_EASING,\n });\n const backSceneTransition =\n s.backSceneTransition ??\n options.backSceneTransition ??\n Transition.slide({\n direction: TransitionDirection.Right,\n duration: SCENE_TRANSITION_DURATION,\n easing: SCENE_TRANSITION_EASING,\n });\n const backButtonText =\n s.backButtonText ?? options.backButtonText ?? \"Back\";\n const backButtonTextInterpolation =\n s.backButtonTextInterpolation ?? options.backButtonTextInterpolation;\n const nextButtonText =\n s.nextButtonText ?? options.nextButtonText ?? \"Next\";\n const nextButtonTextInterpolation =\n s.nextButtonTextInterpolation ?? options.nextButtonTextInterpolation;\n const backButtonWidth =\n s.backButtonWidth ?? options.backButtonWidth ?? 125;\n const nextButtonWidth =\n s.nextButtonWidth ?? options.nextButtonWidth ?? 125;\n const backButtonHeight =\n s.backButtonHeight ?? options.backButtonHeight ?? 50;\n const nextButtonHeight =\n s.nextButtonHeight ?? options.nextButtonHeight ?? 50;\n const backgroundColor = s.backgroundColor ?? options.backgroundColor;\n const imageAboveText = s.imageAboveText ?? true;\n const imageMarginTop = s.imageMarginTop ?? 0;\n const imageMarginBottom = s.imageMarginBottom ?? 0;\n const textMarginStart = s.textMarginStart ?? 48;\n const textMarginEnd = s.textMarginEnd ?? 48;\n const textAlignmentMode =\n s.textAlignmentMode ?? LabelHorizontalAlignmentMode.Left;\n const textFontSize = s.textFontSize ?? 16;\n const titleFontSize = s.titleFontSize ?? 16;\n const titleMarginTop = s.titleMarginTop ?? 48;\n const backButtonBackgroundColor =\n s.backButtonBackgroundColor ??\n options.backButtonBackgroundColor ??\n WebColors.Black;\n const backButtonFontColor =\n s.backButtonFontColor ?? options.backButtonFontColor ?? WebColors.White;\n const nextButtonBackgroundColor =\n s.nextButtonBackgroundColor ??\n options.nextButtonBackgroundColor ??\n WebColors.Black;\n const nextButtonFontColor =\n s.nextButtonFontColor ?? options.nextButtonFontColor ?? WebColors.White;\n const sceneNamePrefix = options.sceneNamePrefix ?? \"instructions\";\n\n const scene = new Scene({\n name: sceneNamePrefix + \"-\" + (i + 1).toString().padStart(2, \"0\"),\n backgroundColor: backgroundColor,\n });\n\n let titleLabel: Label | undefined;\n if (s.title !== undefined) {\n titleLabel = new Label({\n text: s.title,\n interpolation: s.titleInterpolation,\n fontSize: titleFontSize,\n layout: {\n marginTop: titleMarginTop,\n constraints: {\n topToTopOf: scene,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n scene.addChild(titleLabel);\n }\n\n let textLabel: Label | undefined;\n if (s.text !== undefined) {\n textLabel = new Label({\n text: s.text,\n interpolation: s.textInterpolation,\n preferredMaxLayoutWidth: Dimensions.MatchConstraint,\n horizontalAlignmentMode: textAlignmentMode,\n fontSize: textFontSize,\n layout: {\n marginStart: textMarginStart,\n marginEnd: textMarginEnd,\n constraints: {\n topToTopOf: scene,\n bottomToBottomOf: scene,\n startToStartOf: scene,\n endToEndOf: scene,\n verticalBias: s.textVerticalBias,\n },\n },\n });\n scene.addChild(textLabel);\n }\n\n if (s.imageName !== undefined) {\n let image: Sprite;\n if (textLabel !== undefined) {\n if (imageAboveText) {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n marginBottom: imageMarginBottom,\n constraints: {\n bottomToTopOf: textLabel,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n } else {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n marginTop: imageMarginTop,\n constraints: {\n topToBottomOf: textLabel,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n }\n } else {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n constraints: {\n topToTopOf: scene,\n bottomToBottomOf: scene,\n verticalBias: s.imageVerticalBias,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n }\n scene.addChild(image);\n }\n\n if (i > 0) {\n const backButton = new Button({\n name: \"backButton\",\n text: backButtonText,\n interpolation: backButtonTextInterpolation,\n fontColor: backButtonFontColor,\n backgroundColor: backButtonBackgroundColor,\n size: { width: backButtonWidth, height: backButtonHeight },\n layout: {\n marginStart: 32,\n marginBottom: 80,\n constraints: { bottomToBottomOf: scene, startToStartOf: scene },\n },\n });\n backButton.isUserInteractionEnabled = true;\n backButton.onTapDown(() => {\n scene.game.presentScene(\n sceneNamePrefix + \"-\" + (i + 1 - 1).toString().padStart(2, \"0\"),\n backSceneTransition,\n );\n });\n scene.addChild(backButton);\n }\n\n const nextButton = new Button({\n name: \"nextButton\",\n text: nextButtonText,\n interpolation: nextButtonTextInterpolation,\n fontColor: nextButtonFontColor,\n backgroundColor: nextButtonBackgroundColor,\n size: { width: nextButtonWidth, height: nextButtonHeight },\n layout: {\n marginEnd: 32,\n marginBottom: 80,\n constraints: { bottomToBottomOf: scene, endToEndOf: scene },\n },\n });\n nextButton.isUserInteractionEnabled = true;\n if (i !== options.instructionScenes.length - 1) {\n nextButton.onTapDown(() => {\n scene.game.presentScene(\n sceneNamePrefix + \"-\" + (i + 1 + 1).toString().padStart(2, \"0\"),\n nextSceneTransition,\n );\n });\n } else {\n if (options.postInstructionsScene !== undefined) {\n nextButton.onTapDown(() => {\n scene.game.presentScene(\n options.postInstructionsScene ?? \"\",\n nextSceneTransition,\n );\n });\n } else {\n nextButton.onTapDown(() => {\n const sceneIndex = scene.game.scenes.indexOf(scene);\n if (sceneIndex === -1) {\n /**\n * This should never happen, unless this instruction scene has\n * been removed from the game.\n */\n console.warn(\n \"warning: postInstructionsScene is not defined, and next scene cannot be determined.\",\n );\n } else {\n const nextSceneIndex = sceneIndex + 1;\n if (nextSceneIndex < scene.game.scenes.length) {\n scene.game.presentScene(\n scene.game.scenes[nextSceneIndex],\n nextSceneTransition,\n );\n } else {\n console.warn(\n \"warning: postInstructionsScene is not defined, and there is no next scene to present.\",\n );\n }\n }\n });\n }\n }\n scene.addChild(nextButton);\n\n scenes.push(scene);\n });\n\n return scenes;\n }\n\n /**\n * Creates an array of scenes containing instructions on how to complete the assessment\n *\n * @deprecated Use {@link Instructions.create} instead (lower case method name \"create\")\n *\n * @param options - {@link InstructionsOptions}\n * @returns instruction scenes\n */\n static Create(options: InstructionsOptions): Array<Scene> {\n return this.create(options);\n }\n}\n","import {\n Transition,\n TransitionDirection,\n Easings,\n Scene,\n Label,\n Action,\n Shape,\n SceneOptions,\n RgbaColor,\n WebColors,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { TimerShape } from \"../composites/countdown-timer\";\n\nconst SCENE_TRANSITION_EASING = Easings.sinusoidalInOut;\nconst SCENE_TRANSITION_DURATION_MS = 500;\n\nexport interface CountdownSceneOptions extends SceneOptions {\n /** Duration of the countdown, in milliseconds. */\n milliseconds: number;\n /** Duration of the slide transition, in milliseconds, to the next scene after the countdown completes. Default is 500. */\n transitionDurationMilliseconds?: number;\n /** A custom transition to use to present next scene after the countdown completes. */\n transition?: Transition;\n /** Duration in milliseconds to stay on zero before transitioning to the next scene. Default is zero. This option should be used if `transition` is set to `Transition.none()`. Otherwise, the zero will flash for a single frame before presenting the next scene. */\n zeroDwellMilliseconds?: number;\n /** Text shown below the countdown shape. Default is \"GET READY\". */\n text?: string;\n /** Font name for text */\n textFontName?: string;\n /** Font size for text. Default is 50. */\n textFontSize?: number;\n /** Font color for text. Default is black. */\n textFontColor?: RgbaColor;\n /** Distance between bottom of countdown shape and text. Default is 32. */\n textMarginTop?: number;\n /** Font name for timer numbers. */\n timerNumbersFontName?: string;\n /** Font size for timer numbers. Default is 50. */\n timerNumbersFontSize?: number;\n /** Font size for timer numbers. Default is white. */\n timerNumbersFontColor?: RgbaColor;\n /** String to show when the timer reaches zero. Default is \"0\". This could be changed to another value, such as \"GO!\" */\n zeroString?: string;\n /** Shape of the timer. Default is a Royal Blue circle with a radius of 100 centered vertically. */\n timerShape?: TimerShape;\n /** Default is to center the timer shape vertically within the scene (verticalBias = .5). Setting verticalBias less than .5 will pull the shape towards the top. Setting verticalBias greater than .5 will pull the shape towards the bottom. */\n shapeVerticalBias?: number;\n}\n\nexport class CountdownScene extends Scene {\n /**\n * A scene that counts down from a specified number to zero, then transitions to the next scene.\n *\n * @param options - {@link CountdownSceneOptions}\n */\n constructor(options: CountdownSceneOptions) {\n super(options);\n\n if (\n options?.transitionDurationMilliseconds !== undefined &&\n options?.transition\n ) {\n throw new M2Error(\n \"Both transition and transitionDurationMilliseconds options were provided. Only one should be provided. If using a custom transition, then the duration of that transition must be specified within the custom transition.\",\n );\n }\n\n let timerShape: Shape;\n\n if (\n (options?.timerShape?.circle === undefined &&\n options?.timerShape?.rectangle === undefined) ||\n options?.timerShape.circle !== undefined\n ) {\n timerShape = new Shape({\n circleOfRadius: options?.timerShape?.circle?.radius ?? 100,\n layout: {\n constraints: {\n topToTopOf: this,\n bottomToBottomOf: this,\n startToStartOf: this,\n endToEndOf: this,\n verticalBias: options?.shapeVerticalBias ?? 0.5,\n },\n },\n fillColor: options?.timerShape?.fillColor ?? WebColors.RoyalBlue,\n });\n this.addChild(timerShape);\n } else if (options?.timerShape.rectangle !== undefined) {\n timerShape = new Shape({\n rect: {\n width: options?.timerShape?.rectangle?.width ?? 200,\n height: options?.timerShape?.rectangle?.height ?? 200,\n },\n cornerRadius: options?.timerShape?.rectangle?.cornerRadius,\n layout: {\n constraints: {\n topToTopOf: this,\n bottomToBottomOf: this,\n startToStartOf: this,\n endToEndOf: this,\n verticalBias: options.shapeVerticalBias ?? 0.5,\n },\n },\n fillColor: options?.timerShape?.fillColor ?? WebColors.RoyalBlue,\n });\n this.addChild(timerShape);\n } else {\n throw new M2Error(\"Invalid timer shape options.\");\n }\n\n const timerInitialNumber = Math.floor(options.milliseconds / 1000);\n\n const timerNumberLabel = new Label({\n // Number text will be set in onSetup()\n text: \"\",\n fontSize: options?.timerNumbersFontSize ?? 50,\n fontName: options?.timerNumbersFontName,\n fontColor: options?.timerNumbersFontColor ?? WebColors.White,\n });\n timerShape.addChild(timerNumberLabel);\n\n const textLabel = new Label({\n text: options?.text ?? \"GET READY\",\n fontSize: options?.textFontSize ?? 50,\n fontName: options?.textFontName,\n fontColor: options?.textFontColor,\n layout: {\n marginTop: options?.textMarginTop ?? 32,\n constraints: {\n topToBottomOf: timerShape,\n startToStartOf: this,\n endToEndOf: this,\n },\n },\n });\n this.addChild(textLabel);\n\n const countdownSequence = new Array<Action>();\n\n for (let i = timerInitialNumber - 1; i > 0; i--) {\n countdownSequence.push(Action.wait({ duration: 1000 }));\n countdownSequence.push(\n Action.custom({\n callback: () => {\n timerNumberLabel.text = i.toString();\n },\n }),\n );\n }\n\n countdownSequence.push(Action.wait({ duration: 1000 }));\n countdownSequence.push(\n Action.custom({\n callback: () => {\n timerNumberLabel.text = options?.zeroString ?? \"0\";\n },\n }),\n );\n if (options?.zeroDwellMilliseconds !== undefined) {\n countdownSequence.push(\n Action.wait({ duration: options.zeroDwellMilliseconds }),\n );\n }\n\n countdownSequence.push(\n Action.custom({\n callback: () => {\n const game = this.game;\n const isLastScene =\n game.scenes.indexOf(this) === game.scenes.length - 1;\n if (isLastScene) {\n game.end();\n }\n const nextScene = game.scenes[game.scenes.indexOf(this) + 1];\n game.presentScene(\n nextScene,\n options?.transition ??\n Transition.slide({\n direction: TransitionDirection.Left,\n duration:\n options?.transitionDurationMilliseconds ??\n SCENE_TRANSITION_DURATION_MS,\n easing: SCENE_TRANSITION_EASING,\n }),\n );\n },\n }),\n );\n\n this.onSetup(() => {\n /**\n * Set the timer number label to the initial number. This must be done\n * in onSetup() in case the scene is presented more than once.\n */\n timerNumberLabel.text = timerInitialNumber.toString();\n });\n\n this.onAppear(() => {\n this.run(Action.sequence(countdownSequence));\n });\n }\n}\n","import {\n M2NodeEvent,\n CompositeOptions,\n RgbaColor,\n Size,\n Composite,\n WebColors,\n Sprite,\n CallbackOptions,\n M2NodeEventListener,\n M2EventType,\n Shape,\n Point,\n Label,\n TapEvent,\n IDrawable,\n Timer,\n CompositeEvent,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface LocalePickerOptions extends CompositeOptions {\n /** Background color of dialog box. Default is WebColors.White */\n backgroundColor?: RgbaColor;\n /** Locales to choose from in the dialog box. Default is the locales in the game's `Translation`. */\n localeOptions?: Array<LocaleOption>;\n /** What to show as the currently selected locale in the picker. Default is the game's current locale. */\n currentLocale?: string;\n /** Alpha level for the overlay that dims the scene underneath the dialog box. Default is .5 */\n overlayAlpha?: number;\n /** Size of dialog box. Default is automatically sized to fit the number of locale options. */\n size?: Size;\n /** Corner radius of dialog box; can be used to make rounded corners */\n cornerRadius?: number;\n /** Font size of locale options in dialog box. Default is 24. */\n fontSize?: number;\n /** Font color of locale options in dialog box. Default is WebColors.Black */\n fontColor?: RgbaColor;\n /** Image to use for LocalePicker. Default is a globe SVG, 32x32. */\n icon?: LocalePickerIcon;\n /** Position of the LocalePicker icon. Default is &#123; x: 32, y: 32 &#125; */\n iconPosition: Point;\n /** Should the selection in the LocalePicker automatically switch the game's locale? Default is true. */\n automaticallyChangeLocale?: boolean;\n}\n\nexport interface LocalePickerIcon {\n /** The HTML SVG tag, in string form, that will be rendered to display the locale.\n * Must begin with &#60;svg> and end with &#60;/svg> */\n svgString?: string;\n /** Name of image to use for LocalePicker. Must have been previously loaded */\n imageName?: string;\n /** Height to scale image to */\n height: number;\n /** Width to scale image to */\n width: number;\n}\n\nexport interface LocaleOption {\n /** Human-readable text description of the locale. */\n text: string;\n /** SVG of the locale. */\n svg?: LocaleSvg;\n /** Locale in language-country format, xx-YY. */\n locale: string;\n}\n\nexport interface LocalePickerResult {\n /** Locale that was selected. Is undefined if dialog was dismissed. */\n locale?: string;\n}\n\nexport interface LocalePickerEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"LocalePicker\";\n compositeEventType: \"LocalePickerResult\";\n result: LocalePickerResult;\n}\n\ninterface LocaleSvg {\n /** The HTML SVG tag, in string form, that will be rendered to display the locale.\n * Must begin with &#60;svg> and end with &#60;/svg> */\n svgString: string;\n /** Height to scale image to */\n height: number;\n /** Width to scale image to */\n width: number;\n}\n\nexport class LocalePicker extends Composite {\n readonly compositeType = \"LocalePicker\";\n private readonly DEFAULT_FONT_SIZE = 24;\n automaticallyChangeLocale = true;\n private _localeOptions = new Array<LocaleOption>();\n private _backgroundColor = WebColors.White;\n private _fontSize = this.DEFAULT_FONT_SIZE;\n private _fontColor = WebColors.Black;\n private _currentLocale?: string;\n private _cornerRadius = 8;\n private _overlayAlpha = 0.5;\n private _icon: LocalePickerIcon = {\n // public domain SVG from https://commons.wikimedia.org/wiki/File:Globe_icon.svg\n svgString: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"420\" height=\"420\" stroke=\"#000\" fill=\"none\"><path stroke-width=\"26\" d=\"M209 15a195 195 0 1 0 2 0z\"/><path stroke-width=\"18\" d=\"M210 15v390m195-195H15M59 90a260 260 0 0 0 302 0m0 240a260 260 0 0 0-302 0M195 20a250 250 0 0 0 0 382m30 0a250 250 0 0 0 0-382\"/></svg>`,\n height: 32,\n width: 32,\n };\n private _iconPosition: Point = { x: 32, y: 32 };\n private iconSprite?: Sprite;\n /**\n * Wrap displayed locale in double angle quotes if it is the current locale.\n * Note: Although the code editor will allow us to enter almost any\n * unicode character, it will not render correctly if the font does\n * not support the character. Thus, be careful to use characters that\n * are supported by the font. For example, check a page like\n * https://www.fontspace.com/roboto-font-f13281 to see which characters\n * are supported by Roboto Regular, which is often the default font in\n * m2c2kit. Emoji or checkmarks like ✓ are not in Roboto Regular!\n */\n private readonly LEFT_SELECTION_INDICATOR = \"«\";\n private readonly RIGHT_SELECTION_INDICATOR = \"»\";\n\n /**\n * An icon and dialog box for selecting a locale from a list of options.\n *\n * @remarks This composite node is composed of a dialog box that appears\n * when the user taps a globe icon. Typically, the `LocalePicker` will be\n * added as a free node to the game so that it exists independently of\n * the game's scenes. The dialog box contains a list of locales that the\n * user can choose from. By default, this list is populated with the locales\n * in the game's `Translation` object. When the user selects a locale, the\n * dialog box disappears and the locale is set as the game's current locale.\n * The dialog box is automatically sized to fit the number of locale\n * options.\n *\n * @example\n * let localePicker: LocalePicker;\n * if (game.getParameter<boolean>(\"show_locale_picker\")) {\n * localePicker = new LocalePicker();\n * game.addFreeNode(localePicker);\n * }\n *\n * @param options - {@link LocalePickerOptions}\n */\n constructor(options?: LocalePickerOptions) {\n super(options);\n // set zPosition to max value so it is always on top\n this.zPosition = Number.MAX_VALUE;\n\n if (!options) {\n return;\n }\n\n if (options.localeOptions) {\n this.localeOptions = options.localeOptions;\n }\n\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n\n if (options.overlayAlpha !== undefined) {\n this.overlayAlpha = options.overlayAlpha;\n }\n\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n\n if (options.cornerRadius) {\n this.cornerRadius = options.cornerRadius;\n }\n\n if (options.currentLocale !== undefined) {\n this.currentLocale = options.currentLocale;\n }\n\n if (options.icon) {\n this.icon = options.icon;\n }\n\n if (options.automaticallyChangeLocale !== undefined) {\n this.automaticallyChangeLocale = options.automaticallyChangeLocale;\n }\n }\n\n /**\n * Executes a callback when the user selects a locale.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onResult(\n callback: (localePickerEvent: LocalePickerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<LocalePickerEvent> = {\n type: M2EventType.Composite,\n compositeType: \"LocalePickerResult\",\n nodeUuid: this.uuid,\n callback: callback,\n };\n\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === \"LocalePickerResult\"\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n override initialize(): void {\n if (this.currentLocale === undefined) {\n this.currentLocale = this.game.i18n?.locale;\n }\n\n if (this.localeOptions.length === 0) {\n const locales = Object.keys(this.game.i18n?.translation || {});\n locales\n .filter((locale) => locale !== \"configuration\")\n .forEach((locale) => {\n this.localeOptions.push({\n text: this.game.i18n?.translation[locale].localeName || locale,\n locale: locale,\n svg: this.game.i18n?.translation[locale].localeSvg,\n });\n });\n }\n\n if (this.localeOptions.length === 0) {\n throw new M2Error(\"No locales available for LocalePicker\");\n }\n\n /**\n * Rather than `this.removeAllChildren()`, we remove all children except\n * the icon. Otherwise, the icon will flicker when the dialog is shown.\n */\n this.children\n .filter((child) => child.name !== \"localePickerIcon\")\n .forEach((child) => this.removeChild(child));\n\n // it is OK not to await this.\n this.game.imageManager.loadImages([\n {\n imageName: \"__localePickerIcon\",\n svgString: this.icon.svgString,\n height: this.icon.height,\n width: this.icon.width,\n },\n ]);\n\n if (!this.iconSprite) {\n this.iconSprite = new Sprite({\n // name is how we refer to this sprite, as a node.\n name: \"localePickerIcon\",\n // imageName is the loaded image that we can assign to the sprite\n imageName: \"__localePickerIcon\",\n position: this.iconPosition,\n isUserInteractionEnabled: true,\n });\n this.addChild(this.iconSprite);\n\n /**\n * The `LocalePicker` will be typically be added as a free node to the\n * game so that it exists independently and on top of the game's scenes.\n * Set `handled` to true for all tap and pointer events so that they do\n * not propagate to the scene underneath. Drag and pointer leave/move\n * events are not handled because they would not be relevant once this\n * picker is shown.\n * We will do this (handling of events) for other nodes in this composite\n * that will be tapped.\n */\n this.iconSprite.onTapDown((e) => {\n e.handled = true;\n this.setDialogVisibility(true);\n });\n this.iconSprite.onTapUp((e) => {\n e.handled = true;\n });\n this.iconSprite.onTapUpAny((e) => {\n e.handled = true;\n });\n this.iconSprite.onPointerUp((e) => {\n e.handled = true;\n });\n this.iconSprite.onPointerDown((e) => {\n e.handled = true;\n });\n }\n\n const overlay = new Shape({\n rect: {\n width: m2c2Globals.canvasCssWidth,\n height: m2c2Globals.canvasCssHeight,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n fillColor: [0, 0, 0, this.overlayAlpha],\n zPosition: -1,\n isUserInteractionEnabled: true,\n hidden: true,\n });\n overlay.onTapUp((e) => {\n e.handled = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === \"LocalePickerResult\")\n .forEach((listener) => {\n const languagePickerEvent: LocalePickerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"LocalePickerResult\",\n target: this,\n handled: false,\n result: {\n locale: undefined,\n },\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(languagePickerEvent);\n });\n }\n this.setDialogVisibility(false);\n });\n overlay.onTapUpAny((e) => {\n e.handled = true;\n });\n overlay.onTapDown((e) => {\n e.handled = true;\n });\n overlay.onPointerUp((e) => {\n e.handled = true;\n });\n overlay.onPointerDown((e) => {\n e.handled = true;\n });\n this.addChild(overlay);\n\n /**\n * Because the locale options in the dialog box could be a mix of text and\n * SVGs, we cannot use a label that automatically takes care of text\n * placement. We must manually calculate the lineHeight based on the\n * fontSize. With a default fontSize of 24, the lineHeight is 50. If the\n * fontSize is changed, the lineHeight will be scaled based on the\n * fontSize.\n */\n const lineHeight = (this.fontSize / this.DEFAULT_FONT_SIZE) * 50;\n const dialogHeight = this.localeOptions.length * lineHeight;\n const dialogWidth = m2c2Globals.canvasCssWidth / 2;\n\n const sceneCenter: Point = {\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n };\n\n const localeDialog = new Shape({\n rect: {\n width: dialogWidth,\n height: dialogHeight,\n x: sceneCenter.x,\n y: sceneCenter.y,\n },\n cornerRadius: this.cornerRadius,\n fillColor: this.backgroundColor,\n isUserInteractionEnabled: true,\n hidden: true,\n });\n localeDialog.onTapDown((e) => {\n e.handled = true;\n });\n localeDialog.onTapUp((e) => {\n e.handled = true;\n });\n localeDialog.onTapUpAny((e) => {\n e.handled = true;\n });\n localeDialog.onPointerUp((e) => {\n e.handled = true;\n });\n localeDialog.onPointerDown((e) => {\n e.handled = true;\n });\n\n this.addChild(localeDialog);\n\n for (let i = 0; i < this.localeOptions.length; i++) {\n const localeOption = this.localeOptions[i];\n\n if (!localeOption.svg) {\n let labelText = localeOption.text;\n if (this.currentLocale === localeOption.locale) {\n labelText = `${this.LEFT_SELECTION_INDICATOR} ${labelText} ${this.RIGHT_SELECTION_INDICATOR}`;\n }\n const text = new Label({\n text: labelText,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n position: {\n x: sceneCenter.x,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n isUserInteractionEnabled: true,\n zPosition: 1,\n hidden: true,\n // do not localize the text of each language option\n localize: false,\n });\n text.onTapUp((e) => {\n e.handled = true;\n this.handleLocaleSelection(e, localeOption);\n });\n text.onTapUpAny((e) => {\n e.handled = true;\n });\n text.onTapDown((e) => {\n e.handled = true;\n });\n text.onPointerUp((e) => {\n e.handled = true;\n });\n text.onPointerDown((e) => {\n e.handled = true;\n });\n this.addChild(text);\n } else {\n // it is OK not to await this.\n this.game.imageManager.loadImages([\n {\n imageName: localeOption.text,\n svgString: localeOption.svg.svgString,\n height: localeOption.svg.height,\n width: localeOption.svg.width,\n },\n ]);\n const localeSprite = new Sprite({\n imageName: localeOption.text,\n position: {\n x: sceneCenter.x,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n isUserInteractionEnabled: true,\n zPosition: 1,\n hidden: true,\n });\n this.addChild(localeSprite);\n\n if (this.currentLocale === localeOption.locale) {\n const leftSelectionIndicator = new Label({\n text: this.LEFT_SELECTION_INDICATOR,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n /**\n * We subtract half the fontSize from the x position via\n * \"- this.fontSize / 2\" so that the left selection indicator is\n * positioned slightly to the left of the svg text. Half the font\n * size seems to be a good amount to make the left selection\n * indicator appear before the text, and it will scale with font\n * size changes (unlike a hard-coded value).\n */\n position: {\n x: sceneCenter.x - localeOption.svg.width / 2 - this.fontSize / 2,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n hidden: true,\n // do not localize the left selection indicator\n localize: false,\n });\n this.addChild(leftSelectionIndicator);\n const rightSelectionIndicator = new Label({\n text: this.RIGHT_SELECTION_INDICATOR,\n fontSize: this._fontSize,\n fontColor: this.fontColor,\n position: {\n // see above explanation of \"- this.fontSize / 2\"\n x: sceneCenter.x + localeOption.svg.width / 2 + this.fontSize / 2,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n hidden: true,\n // do not localize the left selection indicator\n localize: false,\n });\n this.addChild(rightSelectionIndicator);\n }\n\n localeSprite.onTapUp((e) => {\n e.handled = true;\n this.handleLocaleSelection(e, localeOption);\n });\n localeSprite.onTapUpAny((e) => {\n e.handled = true;\n });\n localeSprite.onTapDown((e) => {\n e.handled = true;\n });\n localeSprite.onPointerUp((e) => {\n e.handled = true;\n });\n localeSprite.onPointerDown((e) => {\n e.handled = true;\n });\n }\n }\n\n this.needsInitialization = false;\n }\n\n private handleLocaleSelection(e: TapEvent, localeOption: LocaleOption) {\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"LocalePickerResult\" &&\n listener.nodeUuid == this.uuid,\n )\n .forEach((listener) => {\n const languagePickerEvent: LocalePickerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"LocalePickerResult\",\n target: this,\n handled: false,\n result: {\n locale: localeOption.locale,\n },\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(languagePickerEvent);\n });\n }\n this.setDialogVisibility(false);\n if (this.automaticallyChangeLocale) {\n this.game.i18n?.switchToLocale(localeOption.locale);\n this.currentLocale = localeOption.locale;\n }\n }\n\n private setDialogVisibility(visible: boolean) {\n this.children\n .filter((child) => child.name !== \"localePickerIcon\")\n .forEach((child) => {\n child.hidden = !visible;\n });\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n this._fontSize = fontSize;\n this.needsInitialization = true;\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n this._fontColor = fontColor;\n this.needsInitialization = true;\n }\n\n get cornerRadius(): number {\n return this._cornerRadius;\n }\n set cornerRadius(cornerRadius: number) {\n this._cornerRadius = cornerRadius;\n this.needsInitialization = true;\n }\n\n get overlayAlpha(): number {\n return this._overlayAlpha;\n }\n set overlayAlpha(alpha: number) {\n this._overlayAlpha = alpha;\n this.needsInitialization = true;\n }\n\n get icon(): LocalePickerIcon {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const localePicker = this;\n /**\n * We return an object with getters and setters for the icon properties\n * so that we can update the icon and trigger a re-initialization of the\n * LocalePicker if icon properties are changed.\n */\n return {\n get svgString(): string | undefined {\n return localePicker._icon.svgString;\n },\n set svgString(svgString: string) {\n localePicker._icon.svgString = svgString;\n localePicker.needsInitialization = true;\n },\n get imageName(): string | undefined {\n return localePicker._icon.imageName;\n },\n set imageName(imageName: string) {\n localePicker._icon.imageName = imageName;\n localePicker.needsInitialization = true;\n },\n get height(): number {\n return localePicker._icon.height;\n },\n set height(height: number) {\n localePicker._icon.height = height;\n localePicker.needsInitialization = true;\n },\n get width(): number {\n return localePicker._icon.width;\n },\n set width(width: number) {\n localePicker._icon.width = width;\n localePicker.needsInitialization = true;\n },\n };\n }\n set icon(icon: LocalePickerIcon) {\n this._icon = icon;\n this.needsInitialization = true;\n }\n\n get iconPosition(): Point {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const localePicker = this;\n return {\n get x(): number {\n return localePicker._iconPosition.x;\n },\n set x(x: number) {\n localePicker._iconPosition.x = x;\n if (localePicker.iconSprite) {\n localePicker.iconSprite.position = localePicker._iconPosition;\n }\n localePicker.needsInitialization = true;\n },\n get y(): number {\n return localePicker._iconPosition.y;\n },\n set y(y: number) {\n localePicker._iconPosition.y = y;\n if (localePicker.iconSprite) {\n localePicker.iconSprite.position = localePicker._iconPosition;\n }\n localePicker.needsInitialization = true;\n },\n };\n }\n set iconPosition(position: Point) {\n this._iconPosition = position;\n if (this.iconSprite) {\n this.iconSprite.position = position;\n }\n this.needsInitialization = true;\n }\n\n get localeOptions(): Array<LocaleOption> {\n return this._localeOptions;\n }\n\n set localeOptions(options: Array<LocaleOption>) {\n this._localeOptions = options;\n this.needsInitialization = true;\n }\n\n get currentLocale(): string | undefined {\n return this._currentLocale;\n }\n set currentLocale(locale: string | undefined) {\n if (locale === this.currentLocale) {\n return;\n }\n this._currentLocale = locale;\n this.needsInitialization = true;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): LocalePicker {\n throw new M2Error(`duplicate not implemented. ${newName}`);\n }\n}\n","import { Canvas } from \"canvaskit-wasm\";\nimport {\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n RgbaColor,\n IDrawable,\n Equal,\n M2c2KitHelpers,\n M2NodeConstructor,\n Action,\n CompositeEvent,\n CallbackOptions,\n M2NodeEventListener,\n M2EventType,\n M2NodeEvent,\n M2Error,\n} from \"@m2c2kit/core\";\n\nexport interface CountdownTimerOptions extends CompositeOptions {\n /** Duration of the countdown, in milliseconds. Must be multiple of 1000. Default is 3000. */\n milliseconds?: number;\n /** Duration of each tick interval, in milliseconds. Default is 1000. */\n tickIntervalMilliseconds?: number;\n /** Font name for timer text (numbers). */\n fontName?: string;\n /** Font size for timer text (numbers). Default is 50. */\n fontSize?: number;\n /** Font size for timer text (numbers). Default is white. */\n fontColor?: RgbaColor;\n /** String to show when the timer reaches zero. Default is \"0\". This could be changed to another value, such as \"GO!\" */\n zeroString?: string;\n /** Shape of the timer. Default is a Royal Blue circle with a radius of 100. */\n timerShape?: TimerShape;\n /** Default is to center the timer text (numbers) vertically within the timer shape (verticalBias = .5). Setting verticalBias less than .5 will pull the text towards the top of the timer shape. Setting verticalBias greater than .5 will pull the text towards the bottom of the timer shape. */\n textVerticalBias?: number;\n}\n\nexport interface TimerShape {\n circle?: {\n /** Radius of the circle timer shape. */\n radius: number;\n };\n rectangle?: {\n /** Width of the rectangle timer shape. */\n width: number;\n /** Height of the rectangle timer shape. */\n height: number;\n /** Corner radius of the rectangle timer shape. Default is 0. */\n cornerRadius?: number;\n };\n /** Color of the timer shape. Default is Royal Blue. */\n fillColor?: RgbaColor;\n}\n\nexport interface CountdownTimerEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"CountdownTimer\";\n compositeEventType: \"CountdownTimerTick\" | \"CountdownTimerComplete\";\n millisecondsRemaining: number;\n target: CountdownTimer | string;\n}\n\nexport class CountdownTimer extends Composite implements CountdownTimerOptions {\n readonly compositeType = \"CountdownTimer\";\n private originalOptions: CountdownTimerOptions;\n private _milliseconds = 3000;\n private _tickIntervalMilliseconds = 1000;\n private _fontName: string | undefined;\n private _fontSize = 50;\n private _fontColor = WebColors.White;\n private _zeroString = \"0\";\n private _timerShape: TimerShape = {\n circle: {\n radius: 100,\n },\n fillColor: WebColors.RoyalBlue,\n };\n private _textVerticalBias = 0.5;\n private countdownSequence = new Array<Action>();\n private timerShapeNode?: Shape;\n private timerNumberLabel?: Label;\n private _isRunning = false;\n private hasStopped = false;\n\n /**\n * A countdown timer displays a number that counts down to zero.\n *\n * @param options\n */\n constructor(options: CountdownTimerOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.milliseconds) {\n this.milliseconds = options.milliseconds;\n }\n\n if (options.tickIntervalMilliseconds) {\n this.tickIntervalMilliseconds = options.tickIntervalMilliseconds;\n }\n\n if (options.fontName) {\n this.fontName = options.fontName;\n }\n\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n\n if (options.zeroString !== undefined) {\n this.zeroString = options.zeroString;\n }\n\n if (options.timerShape) {\n this.timerShape = options.timerShape;\n }\n\n if (options.textVerticalBias !== undefined) {\n this.textVerticalBias = options.textVerticalBias;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n this._isRunning = false;\n this.hasStopped = false;\n\n if (\n (this.timerShape?.circle === undefined &&\n this.timerShape?.rectangle === undefined) ||\n this.timerShape?.circle !== undefined\n ) {\n this.timerShapeNode = new Shape({\n circleOfRadius: this.timerShape.circle?.radius ?? 100,\n fillColor: this.timerShape?.fillColor ?? WebColors.RoyalBlue,\n suppressEvents: true,\n });\n this.addChild(this.timerShapeNode);\n } else if (this.timerShape?.rectangle !== undefined) {\n this.timerShapeNode = new Shape({\n rect: {\n width: this.timerShape?.rectangle?.width ?? 200,\n height: this.timerShape?.rectangle?.height ?? 200,\n },\n cornerRadius: this.timerShape?.rectangle?.cornerRadius,\n fillColor: this.timerShape?.fillColor ?? WebColors.RoyalBlue,\n suppressEvents: true,\n });\n this.addChild(this.timerShapeNode);\n } else {\n throw new M2Error(\"Invalid timer shape options.\");\n }\n\n this.size = this.timerShapeNode.size;\n if (this.milliseconds % 1000 !== 0) {\n throw new M2Error(\n \"CountdownTimer milliseconds must be a multiple of 1000.\",\n );\n }\n const timerInitialNumber = Math.floor(this.milliseconds / 1000);\n\n this.timerNumberLabel = new Label({\n text: timerInitialNumber.toString(),\n fontSize: this.fontSize,\n fontName: this._fontName,\n fontColor: this.fontColor,\n layout: {\n constraints: {\n topToTopOf: this.timerShapeNode,\n bottomToBottomOf: this.timerShapeNode,\n startToStartOf: this.timerShapeNode,\n endToEndOf: this.timerShapeNode,\n verticalBias: this.textVerticalBias,\n },\n },\n suppressEvents: true,\n });\n this.timerShapeNode.addChild(this.timerNumberLabel);\n\n this.countdownSequence = new Array<Action>();\n\n for (\n let i = this.milliseconds;\n i > this.tickIntervalMilliseconds;\n i = i - this.tickIntervalMilliseconds\n ) {\n this.countdownSequence.push(\n Action.wait({ duration: this.tickIntervalMilliseconds }),\n );\n this.countdownSequence.push(\n Action.custom({\n callback: () => {\n this.tick(i - this.tickIntervalMilliseconds);\n },\n }),\n );\n }\n\n this.countdownSequence.push(\n Action.wait({ duration: this.tickIntervalMilliseconds }),\n );\n this.countdownSequence.push(\n Action.custom({\n callback: () => {\n this.tick(0);\n const countdownTimerEvent: CountdownTimerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"CountdownTimerComplete\",\n target: this,\n handled: false,\n millisecondsRemaining: 0,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(countdownTimerEvent);\n this.saveEvent(countdownTimerEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"CountdownTimer\" &&\n listener.compositeEventType === \"CountdownTimerComplete\",\n )\n .forEach((listener) => {\n listener.callback(countdownTimerEvent);\n });\n }\n },\n }),\n );\n\n this.needsInitialization = false;\n }\n\n private tick(millisecondsRemaining: number) {\n const countdownTimerEvent: CountdownTimerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"CountdownTimerTick\",\n target: this,\n handled: false,\n millisecondsRemaining: millisecondsRemaining,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(countdownTimerEvent);\n this.saveEvent(countdownTimerEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"CountdownTimer\" &&\n listener.compositeEventType === \"CountdownTimerTick\",\n )\n .forEach((listener) => {\n listener.callback(countdownTimerEvent);\n });\n }\n }\n\n /**\n * Starts the countdown timer.\n *\n * @remarks Calling `start()` on a timer whose state is running (already started)\n * or stopped will raise an error.\n */\n start() {\n if (this.isRunning) {\n throw new M2Error(\"CountdownTimer: cannot start. It is already running.\");\n }\n if (this.hasStopped) {\n throw new M2Error(\n \"CountdownTimer: It has stopped. You cannot start a stopped CountdownTimer. Instead, create a new CountdownTimer or call CountdownTimer.reset() before starting.\",\n );\n }\n /**\n * If the user calls start() and the timer has not yet been initialized as\n * part of the composite lifecycle, then initialize it.\n */\n if (this.needsInitialization) {\n this.initialize();\n }\n this.run(\n Action.sequence(this.countdownSequence),\n \"__countdownSequenceAction\",\n );\n this._isRunning = true;\n }\n\n /**\n * Stops the countdown timer.\n *\n * @remarks This method is idempotent. Calling `stop()` on a stopped timer\n * has no effect and will not raise an error. This can be called on a\n * CountdownTimer in any state.\n */\n stop() {\n if (this.isRunning) {\n this.removeAction(\"__countdownSequenceAction\");\n this._isRunning = false;\n this.hasStopped = true;\n }\n }\n\n /**\n * Resets the countdown timer to its initial state so it can be started\n * again.\n *\n * @remarks This method is idempotent. Calling reset() multiple times will\n * not raise an error. This can be called on a CountdownTimer in any state.\n */\n reset() {\n this.stop();\n this.initialize();\n }\n\n /**\n * Returns true if the countdown timer is running.\n */\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n override handleCompositeEvent(event: CountdownTimerEvent): void {\n if (!this.timerNumberLabel) {\n throw new M2Error(\"Timer number label not found.\");\n }\n\n switch (event.compositeEventType) {\n case \"CountdownTimerTick\": {\n this.timerNumberLabel.text = Math.ceil(\n event.millisecondsRemaining / 1000,\n ).toString();\n break;\n }\n case \"CountdownTimerComplete\": {\n this.timerNumberLabel.text = this.zeroString;\n break;\n }\n default:\n throw new M2Error(\n `Invalid TimerCountdown event type: ${event.compositeEventType}`,\n );\n }\n }\n\n /**\n * Executes a callback when the timer ticks.\n *\n * @remarks The callback is also executed when the timer completes.\n *\n * @param callback - function to execute\n * @param options\n */\n onTick(\n callback: (countdownTimerEvent: CountdownTimerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<CountdownTimerEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"CountdownTimerTick\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addCountdownTimerEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the timer completes.\n *\n * @remarks This is the last tick of the timer.\n *\n * @param callback - function to execute.\n * @param options\n */\n onComplete(\n callback: (countdownTimerEvent: CountdownTimerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<CountdownTimerEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"CountdownTimerComplete\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addCountdownTimerEventListener(eventListener, options);\n }\n\n private addCountdownTimerEventListener(\n eventListener: M2NodeEventListener<CountdownTimerEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n get milliseconds(): number {\n return this._milliseconds;\n }\n set milliseconds(milliseconds: number) {\n if (Equal.value(this._milliseconds, milliseconds)) {\n return;\n }\n this._milliseconds = milliseconds;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"milliseconds\", milliseconds);\n }\n\n get tickIntervalMilliseconds(): number {\n return this._tickIntervalMilliseconds;\n }\n set tickIntervalMilliseconds(tickIntervalMilliseconds: number) {\n if (Equal.value(this._tickIntervalMilliseconds, tickIntervalMilliseconds)) {\n return;\n }\n this._tickIntervalMilliseconds = tickIntervalMilliseconds;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\n \"tickIntervalMilliseconds\",\n tickIntervalMilliseconds,\n );\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n if (Equal.value(this._fontColor, fontColor)) {\n return;\n }\n this._fontColor = fontColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontColor\", fontColor);\n }\n\n get fontName(): string | undefined {\n return this._fontName;\n }\n set fontName(fontName: string | undefined) {\n if (this._fontName === fontName) {\n return;\n }\n this._fontName = fontName;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontName\", fontName);\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n if (Equal.value(this._fontSize, fontSize)) {\n return;\n }\n this._fontSize = fontSize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontSize\", fontSize);\n }\n\n get zeroString(): string {\n return this._zeroString;\n }\n set zeroString(zeroString: string) {\n if (this._zeroString === zeroString) {\n return;\n }\n this._zeroString = zeroString;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"zeroString\", zeroString);\n }\n\n get timerShape(): TimerShape {\n return this._timerShape;\n }\n set timerShape(shape: TimerShape) {\n if (Equal.value(this._timerShape as object, shape as object)) {\n return;\n }\n this._timerShape = shape;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"timerShape\", shape);\n }\n\n get textVerticalBias(): number {\n return this._textVerticalBias;\n }\n set textVerticalBias(textVerticalBias: number) {\n if (Equal.value(this._textVerticalBias, textVerticalBias)) {\n return;\n }\n this._textVerticalBias = textVerticalBias;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"textVerticalBias\", textVerticalBias);\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n duplicate(newName?: string | undefined): CountdownTimer {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(\n CountdownTimer as unknown as M2NodeConstructor,\n);\n","import {\n WebColors,\n Label,\n Shape,\n Composite,\n IDrawable,\n CompositeOptions,\n Size,\n RgbaColor,\n CompositeEvent,\n M2NodeEventListener,\n CallbackOptions,\n M2NodeEvent,\n M2EventType,\n M2c2KitHelpers,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface SliderOptions extends CompositeOptions {\n /** The size of the track that the thumb moves along. */\n trackSize?: Size;\n /** The color of the track. */\n trackColor?: RgbaColor;\n /** The size of the thumb that the user drags. */\n thumbSize?: Size;\n /** The color of the thumb. */\n thumbColor?: RgbaColor;\n /** The minimum value of the slider. */\n min?: number;\n /** The maximum value of the slider. */\n max?: number;\n /** The initial value of the slider. */\n value?: number;\n}\n\nexport interface SliderEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"Slider\";\n compositeEventType: \"SliderValueChanged\";\n target: Slider | string;\n value: number;\n}\n\nexport class Slider extends Composite implements SliderOptions {\n readonly compositeType = \"Slider\";\n private originalOptions: SliderOptions;\n private _trackSize: Size = { width: 250, height: 10 };\n private _trackColor: RgbaColor = WebColors.Black;\n private _thumbSize: Size = { width: 20, height: 40 };\n private _thumbColor: RgbaColor = WebColors.DarkGray;\n private _min: number = 0;\n private _max: number = 100;\n private _value = (this.max - this.min) / 2;\n private thumbLabel?: Label;\n private _thumbShape?: Shape;\n\n private get thumbShape() {\n if (this._thumbShape === undefined) {\n throw new M2Error(\"thumbShape is not defined.\");\n }\n return this._thumbShape;\n }\n private set thumbShape(value: Shape) {\n this._thumbShape = value;\n }\n\n /**\n * A slider to select a value from a range by dragging a thumb along a track.\n *\n * @experimental Slider is a work in progress and will change in future versions.\n *\n * @param options - {@link SliderOptions}\n */\n constructor(options: SliderOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n\n if (options.trackSize) {\n this.trackSize = options.trackSize;\n }\n if (options.trackColor) {\n this.trackColor = options.trackColor;\n }\n if (options.thumbSize) {\n this.thumbSize = options.thumbSize;\n }\n if (options.thumbColor) {\n this.thumbColor = options.thumbColor;\n }\n if (options.min !== undefined) {\n this.min = options.min;\n }\n if (options.max !== undefined) {\n this.max = options.max;\n }\n if (options.value !== undefined) {\n this.value = options.value;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n const trackShape = new Shape({\n rect: {\n width: this.trackSize.width,\n height: this.trackSize.height,\n },\n cornerRadius: 8,\n fillColor: this.trackColor,\n });\n this.addChild(trackShape);\n\n this.thumbShape = new Shape({\n rect: {\n width: this.thumbSize.width,\n height: this.thumbSize.height,\n },\n cornerRadius: 8,\n fillColor: this.thumbColor,\n isUserInteractionEnabled: true,\n draggable: true,\n zPosition: 1,\n position: {\n x:\n (this.value * this.trackSize.width) / (this.max - this.min) -\n this.trackSize.width / 2,\n y: 0,\n },\n });\n trackShape.addChild(this.thumbShape);\n\n const trackZoneShape = new Shape({\n rect: {\n width: this.trackSize.width,\n height: this.thumbSize.height,\n },\n // during development, it is useful to make this visible\n // fillColor: WebColors.Red,\n // alpha: 0.05,\n alpha: 0,\n isUserInteractionEnabled: true,\n zPosition: 0,\n });\n trackShape.addChild(trackZoneShape);\n trackZoneShape.onTapDown((e) => {\n // console.log(\"trackZoneShape.onTapDown\", e.point.x);\n this.thumbShape.position.x = e.point.x - trackShape.size.width / 2;\n this.updateThumbLabel();\n });\n\n const thumbZoneShape = new Shape({\n rect: {\n width: this.trackSize.width,\n /**\n * The thumbZoneShape is twice the height of the parent scene in case\n * the slider is placed at the bottom or top of the screen. This\n * ensures that thumbZoneShape is large enough to capture pointer\n * events that are outside the bounds of the slider and on the parent\n * scene.\n */\n height: this.parentSceneAsNode.size.height * 2,\n },\n // during development, it is useful to make this visible\n // fillColor: WebColors.Black,\n // alpha: 0.008,\n alpha: 0,\n isUserInteractionEnabled: true,\n });\n this.addChild(thumbZoneShape);\n thumbZoneShape.onPointerMove(() => {\n this.thumbShape.draggable = true;\n });\n thumbZoneShape.onPointerLeave(() => {\n this.thumbShape.draggable = false;\n });\n\n this.thumbShape.onTapDown((e) => {\n /**\n * handled is set to true to prevent the tap event from being\n * propagated to the parent trackShape, which would cause the\n * thumb to jump to the tap location.\n */\n e.handled = true;\n\n if (e.point.y !== 0) {\n this.thumbShape.position.y = 0;\n }\n if (e.point.x < -this.trackSize.width / 2) {\n this.thumbShape.position.x = -this.trackSize.width / 2;\n }\n if (e.point.x > this.trackSize.width / 2) {\n this.thumbShape.position.x = this.trackSize.width / 2;\n }\n this.updateThumbLabel();\n });\n\n this.thumbShape.onDrag((e) => {\n if (e.position.y !== 0) {\n this.thumbShape.position.y = 0;\n }\n if (e.position.x < -this.trackSize.width / 2) {\n this.thumbShape.position.x = -this.trackSize.width / 2;\n }\n if (e.position.x > this.trackSize.width / 2) {\n this.thumbShape.position.x = this.trackSize.width / 2;\n }\n this.updateThumbLabel();\n });\n\n this.thumbShape.onDragEnd(() => {\n const value = Math.round(\n ((this.thumbShape.position.x + this.trackSize.width / 2) /\n this.trackSize.width) *\n (this.max - this.min),\n );\n this.thumbShape.position.x =\n (value / (this.max - this.min)) * this.trackSize.width -\n this.trackSize.width / 2;\n this.updateThumbLabel();\n });\n\n this.needsInitialization = false;\n }\n\n updateThumbLabel() {\n const value =\n ((this.thumbShape.position.x + this.trackSize.width / 2) /\n this.trackSize.width) *\n (this.max - this.min);\n if (!this.thumbLabel) {\n this.thumbLabel = new Label({\n text: value.toString(),\n });\n this.addChild(this.thumbLabel);\n }\n this.thumbLabel.text = Math.round(value).toString();\n this.thumbLabel.position = {\n x: this.thumbShape.position.x,\n y: this.thumbShape.position.y - 30,\n };\n\n if (this.thumbLabel) {\n this.thumbLabel.position = {\n x: this.thumbShape.position.x,\n y: this.thumbShape.position.y - 30,\n };\n }\n\n const sliderEvent: SliderEvent = {\n type: M2EventType.Composite,\n compositeType: \"Slider\",\n compositeEventType: \"SliderValueChanged\",\n target: this,\n value: value,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(sliderEvent);\n this.saveEvent(sliderEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === this.compositeType &&\n listener.compositeEventType === \"SliderValueChanged\",\n )\n .forEach((listener) => {\n listener.callback(sliderEvent);\n });\n }\n }\n\n /**\n * Executes a callback when the slider value changes.\n *\n * @param callback - function to execute\n * @param options\n */\n onValueChanged(\n callback: (sliderEvent: SliderEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<SliderEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"SliderValueChanged\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addSliderEventListener(eventListener, options);\n }\n\n private addSliderEventListener(\n eventListener: M2NodeEventListener<SliderEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n get trackSize(): Size {\n return this._trackSize;\n }\n set trackSize(value: Size) {\n this._trackSize = value;\n }\n\n get trackColor(): RgbaColor {\n return this._trackColor;\n }\n set trackColor(value: RgbaColor) {\n this._trackColor = value;\n }\n\n get thumbSize(): Size {\n return this._thumbSize;\n }\n set thumbSize(value: Size) {\n this._thumbSize = value;\n }\n\n get thumbColor(): RgbaColor {\n return this._thumbColor;\n }\n set thumbColor(value: RgbaColor) {\n this._thumbColor = value;\n }\n\n get value(): number {\n return this._value;\n }\n set value(value: number) {\n this._value = value;\n }\n\n get min(): number {\n return this._min;\n }\n set min(value: number) {\n this._min = value;\n }\n\n get max(): number {\n return this._max;\n }\n set max(value: number) {\n this._max = value;\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n duplicate(newName?: string | undefined): Slider {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n","export * from \"./composites/grid\";\nexport * from \"./composites/button\";\nexport * from \"./composites/dialog\";\nexport * from \"./composites/draw-pad\";\nexport * from \"./composites/virtual-keyboard\";\nexport * from \"./stories/instructions\";\nexport * from \"./scenes/countdown-scene\";\nexport * from \"./composites/locale-picker\";\nexport * from \"./composites/countdown-timer\";\nexport * from \"./composites/slider\";\n\nconsole.log(\"⚪ @m2c2kit/addons version __PACKAGE_JSON_VERSION__\");\n"],"names":["DialogResult","key","keyboard","SCENE_TRANSITION_EASING"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/composites/grid.ts","../src/composites/button.ts","../src/composites/dialog.ts","../src/composites/draw-pad.ts","../src/composites/virtual-keyboard.ts","../src/stories/instructions.ts","../src/scenes/countdown-scene.ts","../src/composites/locale-picker.ts","../src/composites/countdown-timer.ts","../src/composites/slider.ts","../src/index.ts"],"sourcesContent":["import { Canvas } from \"canvaskit-wasm\";\nimport {\n WebColors,\n Composite,\n CompositeOptions,\n RgbaColor,\n Size,\n M2Node,\n Shape,\n IDrawable,\n M2c2KitHelpers,\n Equal,\n M2NodeConstructor,\n EventStoreMode,\n M2Error,\n} from \"@m2c2kit/core\";\n\nexport interface GridOptions extends CompositeOptions {\n /** Number of rows in the grid. Must be 1 or greater */\n rows: number;\n /** Number of columns in the grid. Must be 1 or greater */\n columns: number;\n /** Size of the grid in pixels */\n size: Size;\n /** Background color of the grid. Default is a transparent blue */\n backgroundColor?: RgbaColor;\n /** Width of the grid lines. Default is 1 */\n gridLineWidth?: number;\n /** Color of the grid lines. Default is red */\n gridLineColor?: RgbaColor;\n}\n\nexport interface GridChild {\n node: M2Node;\n row: number;\n column: number;\n}\n\ninterface SerializedGridChild {\n node: string;\n row: number;\n column: number;\n}\n\nexport class Grid extends Composite implements GridOptions {\n compositeType = \"Grid\";\n // Grid options\n private _rows = 0;\n private _columns = 0;\n // default Grid is: transparent blue, red lines, line width 1\n private _gridBackgroundColor: RgbaColor = [0, 0, 255, 0.25];\n private _gridLineColor = WebColors.Red;\n private _gridLineWidth = 1;\n\n cellWidth: number;\n cellHeight: number;\n private _gridChildren = new Array<GridChild>();\n private cellContainers = new Array<Array<Shape>>();\n private _gridBackground?: Shape;\n\n /**\n * A rectangular grid that supports placement of nodes within the grid's\n * cells.\n *\n * @remarks This composite node is composed of rectangles and lines. It\n * has convenience functions for placing and clearing nodes on the grid\n * by row and column position (zero-based indexing)\n *\n * @param options - {@link GridOptions}\n */\n constructor(options: GridOptions) {\n super(options);\n if (options.size) {\n this.size = options.size;\n } else {\n throw new M2Error(\"grid size must be specified\");\n }\n if (options.rows) {\n if (options.rows >= 1) {\n this.rows = options.rows;\n } else {\n throw new M2Error(\"grid rows must be at least 1\");\n }\n } else {\n throw new M2Error(\"grid rows must be specified\");\n }\n if (options.columns) {\n if (options.columns >= 1) {\n this.columns = options.columns;\n } else {\n throw new M2Error(\"grid columns must be at least 1\");\n }\n } else {\n throw new M2Error(\"grid columns must be specified\");\n }\n if (options.backgroundColor) {\n this.gridBackgroundColor = options.backgroundColor;\n }\n if (options.gridLineColor) {\n this.gridLineColor = options.gridLineColor;\n }\n if (options.gridLineWidth) {\n this.gridLineWidth = options.gridLineWidth;\n }\n this.cellWidth = this.size.width / this.columns;\n this.cellHeight = this.size.height / this.rows;\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n rows: this.rows,\n columns: this.columns,\n size: this.size,\n backgroundColor: this.gridBackgroundColor,\n gridLineWidth: this.gridLineWidth,\n gridLineColor: this.gridLineColor,\n };\n }\n\n override initialize(): void {\n /**\n * Remove all existing children, and recursively remove each child's\n * children so we can start fresh.\n */\n this.descendants.forEach((d) => {\n if (d.parent === this) {\n // to avoid triggering the warning in Grid.removeChild(), below\n super.removeChild(d);\n } else {\n d.parent?.removeChild(d);\n }\n });\n\n this.gridBackground = new Shape({\n name: \"__\" + this.name + \"-gridRectangle\",\n rect: { size: this.size },\n fillColor: this.gridBackgroundColor,\n strokeColor: this.gridLineColor,\n lineWidth: this.gridLineWidth,\n isUserInteractionEnabled: this.isUserInteractionEnabled,\n suppressEvents: true,\n });\n super.addChild(this.gridBackground);\n this.gridBackground.isUserInteractionEnabled =\n this.isUserInteractionEnabled;\n\n for (let col = 1; col < this.columns; col++) {\n const verticalLine = new Shape({\n name: \"__\" + this.name + \"-gridVerticalLine-\" + (col - 1),\n rect: {\n size: { width: this.gridLineWidth, height: this.size.height },\n origin: { x: -this.size.width / 2 + this.cellWidth * col, y: 0 },\n },\n fillColor: this.gridLineColor,\n suppressEvents: true,\n });\n this.gridBackground.addChild(verticalLine);\n }\n\n for (let row = 1; row < this.rows; row++) {\n const horizontalLine = new Shape({\n name: \"__\" + this.name + \"-gridHorizontalLine-\" + (row - 1),\n rect: {\n size: { width: this.size.width, height: this.gridLineWidth },\n origin: { x: 0, y: -this.size.height / 2 + this.cellHeight * row },\n },\n fillColor: this.gridLineColor,\n suppressEvents: true,\n });\n this.gridBackground.addChild(horizontalLine);\n }\n\n this.cellContainers = new Array<Array<Shape>>(this.rows)\n .fill([])\n .map(() => new Array<Shape>(this.columns));\n for (let row = 0; row < this.rows; row++) {\n for (let col = 0; col < this.columns; col++) {\n const cellContainer = new Shape({\n name: \"__\" + this.name + \"-gridCellContainer-\" + row + \"-\" + col,\n rect: {\n size: { width: this.cellWidth, height: this.cellHeight },\n origin: {\n x:\n -this.size.width / 2 +\n this.cellWidth * col +\n this.cellWidth / 2,\n y:\n -this.size.height / 2 +\n this.cellHeight * row +\n this.cellHeight / 2,\n },\n },\n fillColor: WebColors.Transparent,\n lineWidth: 0,\n suppressEvents: true,\n });\n this.gridBackground.addChild(cellContainer);\n this.cellContainers[row][col] = cellContainer;\n }\n }\n\n if (this.gridChildren.length > 0) {\n this.gridChildren.forEach((gridChild) => {\n if (!this.cellWidth || !this.cellHeight || !this.gridBackground) {\n throw new M2Error(\n \"cellWidth, cellHeight, or gridBackground undefined or null\",\n );\n }\n\n /**\n * Pay attention to the type assertions here to account for how the\n * structure of gridChildren is different in replay versus other\n * modes.\n */\n if (this.game.eventStore.mode === EventStoreMode.Replay) {\n /**\n * When in event replay, the gridChild is of type\n * SerializedGridChild, and gridChild.node is the uuid of the grid\n * child node.\n */\n const childNode = [\n ...this.game.nodes,\n ...this.game.materializedNodes,\n ].find(\n (n) =>\n // gridChild.node is the uuid of the child node here!\n n.uuid === (gridChild as unknown as SerializedGridChild).node,\n );\n if (!childNode) {\n throw new M2Error(\"grid: child node not found\");\n }\n childNode?.parent?.removeChild(childNode);\n this.cellContainers[gridChild.row][gridChild.column].addChild(\n childNode,\n );\n } else {\n // Not in replay mode, gridChild is of type GridChild\n gridChild.node.parent?.removeChild(gridChild.node);\n this.cellContainers[gridChild.row][gridChild.column].addChild(\n gridChild.node,\n );\n }\n });\n }\n this.needsInitialization = false;\n }\n\n private get gridBackground(): Shape {\n if (!this._gridBackground) {\n throw new M2Error(\"gridBackground is null or undefined\");\n }\n return this._gridBackground;\n }\n\n private set gridBackground(gridBackground: Shape) {\n this._gridBackground = gridBackground;\n }\n\n /**\n * note: below we do not have getter and setter for size because the getter\n * and setter in M2Node will handle it.\n */\n\n get rows(): number {\n return this._rows;\n }\n set rows(rows: number) {\n if (Equal.value(this._rows, rows)) {\n return;\n }\n this._rows = rows;\n this.needsInitialization = true;\n }\n\n get columns(): number {\n return this._columns;\n }\n set columns(columns: number) {\n if (Equal.value(this._columns, columns)) {\n return;\n }\n this._columns = columns;\n this.needsInitialization = true;\n }\n\n get gridBackgroundColor(): RgbaColor {\n return this._gridBackgroundColor;\n }\n set gridBackgroundColor(backgroundColor: RgbaColor) {\n if (Equal.value(this._gridBackgroundColor, backgroundColor)) {\n return;\n }\n this._gridBackgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get gridLineWidth(): number {\n return this._gridLineWidth;\n }\n set gridLineWidth(gridLineWidth: number) {\n if (Equal.value(this._gridLineWidth, gridLineWidth)) {\n return;\n }\n this._gridLineWidth = gridLineWidth;\n this.needsInitialization = true;\n }\n\n get gridLineColor(): RgbaColor {\n return this._gridLineColor;\n }\n set gridLineColor(gridLineColor: RgbaColor) {\n if (Equal.value(this._gridLineColor, gridLineColor)) {\n return;\n }\n this._gridLineColor = gridLineColor;\n this.needsInitialization = true;\n }\n\n // all nodes that make up grid are added as children, so they\n // have their own dispose methods\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n override dispose(): void {}\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Grid {\n const dest = new Grid({\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n rows: this.rows,\n columns: this.columns,\n size: this.size,\n backgroundColor: this.gridBackgroundColor,\n gridLineWidth: this.gridLineWidth,\n gridLineColor: this.gridLineColor,\n name: newName,\n });\n\n if (this.children.length > 0) {\n dest.children = this.children.map((child) => {\n const clonedChild = child.duplicate();\n clonedChild.parent = dest;\n return clonedChild;\n });\n }\n\n return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * The child nodes that have been added to the grid.\n *\n * @remarks Do not set this property directly. Use the methods for adding\n * and removing grid children, such as `addAtCell()`, `removeAllAtCell()`,\n * `removeGridChild()`, and `removeAllGridChildren()`.\n */\n get gridChildren() {\n return this._gridChildren;\n }\n set gridChildren(gridChildren: Array<GridChild>) {\n this._gridChildren = gridChildren;\n this.needsInitialization = true;\n\n /**\n * Save the gridChildren property change event. The gridChild node is not\n * serializable, so we can't pass the gridChildren object directly to\n * savePropertyChangeEvent. Instead, we pass in the SerializedGridChild\n * objects, which have the node's uuid in the node property.\n */\n this.savePropertyChangeEvent(\n \"gridChildren\",\n this.gridChildren.map(\n (gridChild) =>\n ({\n node: gridChild.node.uuid,\n row: gridChild.row,\n column: gridChild.column,\n }) as SerializedGridChild,\n ),\n );\n }\n\n /**\n * Removes all grid children from the grid.\n *\n * @remarks This retains grid lines and grid appearance.\n */\n removeAllGridChildren(): void {\n if (this.gridChildren.length === 0) {\n return;\n }\n while (this.gridChildren.length) {\n this.gridChildren = this.gridChildren.slice(0, -1);\n }\n this.needsInitialization = true;\n }\n\n /**\n * Adds a node as a grid child to the grid at the specified row and column\n * position.\n *\n * @param node - node to add to the grid\n * @param row - row position within grid to add node; zero-based indexing\n * @param column - column position within grid to add node; zero-based indexing\n */\n addAtCell(node: M2Node, row: number, column: number): void {\n if (row < 0 || row >= this.rows || column < 0 || column >= this.columns) {\n console.warn(\n `warning: addAtCell() requested to add node at row ${row}, column ${column}. This is outside the bounds of grid ${this.name}, which is size ${this.rows}x${this.columns}. Note that addAtCell() uses zero-based indexing. AddAtCell() will proceed, but may draw nodes outside the grid`,\n );\n }\n this.gridChildren = [\n ...this.gridChildren,\n { node: node, row: row, column: column },\n ];\n this.needsInitialization = true;\n }\n\n /**\n * Removes all grid child nodes at the specified row and column position.\n *\n * @param row - row position within grid at which to remove grid children; zero-based indexing\n * @param column - column position within grid at which to remove grid children; zero-based indexing\n */\n removeAllAtCell(row: number, column: number): void {\n this.gridChildren = this.gridChildren.filter(\n (gridChild) => gridChild.row !== row && gridChild.column !== column,\n );\n this.needsInitialization = true;\n }\n\n /**\n * Removes the grid child node from the grid.\n *\n * @param node - node to remove\n */\n removeGridChild(node: M2Node): void {\n this.gridChildren = this.gridChildren.filter(\n (gridChild) => gridChild.node != node,\n );\n this.needsInitialization = true;\n }\n\n // The Grid manages its own children (background, lines, and cell\n // containers). It is probably a mistake when the user tries to add or remove\n // these children. The user probably meant to add or remove grid children\n // instead. Warn the user about this.\n\n override addChild(child: M2Node): void {\n console.warn(\n \"Grid.addChild() was called -- did you mean to call addAtCell() instead?\",\n );\n super.addChild(child);\n }\n\n override removeAllChildren(): void {\n console.warn(\n \"Grid.removeAllChildren() was called -- did you mean to call removeAllGridChildren() instead?\",\n );\n super.removeAllChildren();\n }\n\n override removeChild(child: M2Node): void {\n console.warn(\n \"Grid.removeChild() was called -- did you mean to call removeGridChild() instead?\",\n );\n super.removeChild(child);\n }\n\n override removeChildren(children: M2Node[]): void {\n console.warn(\n \"Grid.removeChildren() was called -- did you mean to call removeGridChild() instead?\",\n );\n super.removeChildren(children);\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(Grid as unknown as M2NodeConstructor);\n","import { Paint, Canvas } from \"canvaskit-wasm\";\nimport {\n CanvasKitHelpers,\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n TextOptions,\n IText,\n RgbaColor,\n Size,\n IDrawable,\n StringInterpolationMap,\n Equal,\n M2c2KitHelpers,\n M2NodeConstructor,\n} from \"@m2c2kit/core\";\n\nexport interface ButtonOptions extends CompositeOptions, TextOptions {\n /** Size of button. Default is 200 wide by 50 high. */\n size?: Size;\n /** Corner radius of button; can be used to make rounded corners. Default is 9 */\n cornerRadius?: number;\n /** Background color of button. Default is WebColors.Black */\n backgroundColor?: RgbaColor;\n /** Color of button text. Default is WebColors.White */\n fontColor?: RgbaColor;\n /** Names of multiple fonts to use for text. For example, if a text font and an emoji font are to be used together. Must have been previously loaded */\n fontNames?: Array<string>;\n // Already defined in TextOptions, but redefined here to change documentation\n /** Size of button text. Default is 20. */\n fontSize?: number;\n}\n\nexport class Button extends Composite implements IText, ButtonOptions {\n compositeType = \"Button\";\n isText = true;\n // Button options\n private _backgroundColor = WebColors.Black;\n private _cornerRadius = 9;\n private _fontSize = 20;\n private _text = \"\";\n private _fontColor = WebColors.White;\n private _fontName: string | undefined;\n private _fontNames: Array<string> | undefined;\n private _interpolation: StringInterpolationMap = {};\n private _localize = true;\n private backgroundPaint?: Paint;\n\n // TODO: add default \"behaviors\" (?) like button click animation?\n\n /**\n * A simple button of rectangle with text centered inside.\n *\n * @remarks This composite node is composed of a rectangle and text. To\n * respond to user taps, the isUserInteractionEnabled property must be set\n * to true and an appropriate callback must be set to handle the tap event.\n *\n * @param options - {@link ButtonOptions}\n */\n constructor(options: ButtonOptions) {\n super(options);\n if (options.text) {\n this.text = options.text;\n }\n if (options.size) {\n this.size = options.size;\n } else {\n this.size = { width: 200, height: 50 };\n }\n if (options.cornerRadius !== undefined) {\n this.cornerRadius = options.cornerRadius;\n }\n if (options.fontName) {\n this.fontName = options.fontName;\n }\n if (options.fontNames) {\n this.fontNames = options.fontNames;\n }\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n if (options.interpolation) {\n this.interpolation = options.interpolation;\n }\n if (options.localize !== undefined) {\n this.localize = options.localize;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.getTextOptions(),\n size: this.size,\n cornerRadius: this.cornerRadius,\n backgroundColor: this.backgroundColor,\n fontNames: this.fontNames,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n this.backgroundPaint = new this.canvasKit.Paint();\n this.backgroundPaint.setColor(\n this.canvasKit.Color(\n this.backgroundColor[0],\n this.backgroundColor[1],\n this.backgroundColor[2],\n this.backgroundColor[3],\n ),\n );\n this.backgroundPaint.setStyle(this.canvasKit.PaintStyle.Fill);\n\n const buttonRectangle = new Shape({\n name: \"__\" + this.name + \"-buttonRectangle\",\n rect: { size: this.size },\n cornerRadius: this.cornerRadius,\n fillColor: this._backgroundColor,\n suppressEvents: true,\n });\n this.addChild(buttonRectangle);\n\n const buttonLabel = new Label({\n name: \"__\" + this.name + \"-buttonLabel\",\n text: this.text,\n localize: this.localize,\n interpolation: this.interpolation,\n fontName: this.fontName,\n fontNames: this.fontNames,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n suppressEvents: true,\n });\n buttonRectangle.addChild(buttonLabel);\n\n this.needsInitialization = false;\n }\n\n override dispose(): void {\n CanvasKitHelpers.Dispose([this.backgroundPaint]);\n }\n\n get text(): string {\n return this._text;\n }\n set text(text: string) {\n if (Equal.value(this._text, text)) {\n return;\n }\n this._text = text;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"text\", text);\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n if (Equal.value(this._backgroundColor, backgroundColor)) {\n return;\n }\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"backgroundColor\", backgroundColor);\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n if (Equal.value(this._fontColor, fontColor)) {\n return;\n }\n this._fontColor = fontColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontColor\", fontColor);\n }\n\n get fontName(): string | undefined {\n return this._fontName;\n }\n set fontName(fontName: string | undefined) {\n if (this._fontName === fontName) {\n return;\n }\n this._fontName = fontName;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontName\", fontName);\n }\n\n get fontNames(): Array<string> | undefined {\n return this._fontNames;\n }\n set fontNames(fontNames: Array<string> | undefined) {\n if (Equal.value(this._fontNames, fontNames)) {\n return;\n }\n this._fontNames = fontNames;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontNames\", fontNames);\n }\n\n get cornerRadius(): number {\n return this._cornerRadius;\n }\n set cornerRadius(cornerRadius: number) {\n if (Equal.value(this._cornerRadius, cornerRadius)) {\n return;\n }\n this._cornerRadius = cornerRadius;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"cornerRadius\", cornerRadius);\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n if (Equal.value(this._fontSize, fontSize)) {\n return;\n }\n this._fontSize = fontSize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontSize\", fontSize);\n }\n\n get interpolation(): StringInterpolationMap {\n return this._interpolation;\n }\n set interpolation(interpolation: StringInterpolationMap) {\n if (Equal.value(this._interpolation, interpolation)) {\n return;\n }\n /**\n * If a new interpolation object is set, then we must re-initialize the\n * label. But, we will not know if a property of the interpolation object\n * has changed. Therefore, freeze the interpolation object to prevent it\n * from being modified (attempting to modify it will throw an error).\n * If a user wants to change a property of the interpolation object, they\n * must instead create a new interpolation object and set it.\n */\n this._interpolation = interpolation;\n Object.freeze(this._interpolation);\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"interpolation\", interpolation);\n }\n\n get localize(): boolean {\n return this._localize;\n }\n set localize(localize: boolean) {\n if (Equal.value(this._localize, localize)) {\n return;\n }\n this._localize = localize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"localize\", localize);\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Button {\n const dest = new Button({\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.getTextOptions(),\n size: this.size,\n cornerRadius: this.cornerRadius,\n backgroundColor: this.backgroundColor,\n fontColor: this.fontColor,\n name: newName,\n localize: this.localize,\n interpolation: JSON.parse(JSON.stringify(this.interpolation)),\n fontName: this.fontName,\n fontNames: JSON.parse(JSON.stringify(this.fontNames)),\n });\n\n if (this.children.length > 0) {\n dest.children = this.children.map((child) => {\n const clonedChild = child.duplicate();\n clonedChild.parent = dest;\n return clonedChild;\n });\n }\n\n return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(Button as unknown as M2NodeConstructor);\n","import { Paint, Canvas } from \"canvaskit-wasm\";\nimport {\n M2NodeEvent,\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n RgbaColor,\n Size,\n IDrawable,\n M2NodeEventListener,\n M2EventType,\n CallbackOptions,\n Timer,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Button } from \"./button\";\n\nexport interface DialogOptions extends CompositeOptions {\n /** Size of dialog box */\n size?: Size;\n /** Corner radius of dialog box; can be used to make rounded corners */\n cornerRadius?: number;\n /** Background color of dialog box. Default is WebColors.White */\n backgroundColor?: RgbaColor;\n /** Color of button text. Default is WebColors.White */\n fontColor?: RgbaColor;\n overlayAlpha?: number;\n positiveButtonText?: string;\n negativeButtonText?: string;\n positiveButtonColor?: RgbaColor;\n negativeButtonColor?: RgbaColor;\n messageText?: string;\n}\n\nexport enum DialogResult {\n Dismiss = \"Dismiss\",\n Positive = \"Positive\",\n Negative = \"Negative\",\n}\n\nexport interface DialogEvent extends M2NodeEvent {\n dialogResult: DialogResult;\n}\n\nexport class Dialog extends Composite {\n compositeType = \"Dialog\";\n\n private _backgroundColor = WebColors.White;\n\n cornerRadius = 9;\n\n overlayAlpha = 0.5;\n contentText = \"\";\n positiveButtonText = \"\";\n negativeButtonText = \"\";\n\n private _fontColor = WebColors.White;\n private backgroundPaint?: Paint;\n\n // todo: add getters/setters so button can respond to changes in its options\n // todo: add default \"behaviors\" (?) like button click animation?\n constructor(options?: DialogOptions) {\n super(options);\n // set zPosition to max value so it is always on top\n this.zPosition = Number.MAX_VALUE;\n\n // by default, dialog is hidden\n this.hidden = true;\n\n if (!options) {\n return;\n }\n\n if (options.overlayAlpha) {\n this.overlayAlpha = options.overlayAlpha;\n }\n\n if (options.messageText) {\n this.contentText = options.messageText;\n }\n\n if (options.positiveButtonText) {\n this.positiveButtonText = options.positiveButtonText;\n }\n\n if (options.negativeButtonText) {\n this.negativeButtonText = options.negativeButtonText;\n }\n\n if (options.size) {\n this.size = options.size;\n }\n if (options.cornerRadius) {\n this.cornerRadius = options.cornerRadius;\n }\n // if (options.fontSize) {\n // this.fontSize = options.fontSize;\n // }\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n }\n\n show(): void {\n this.hidden = false;\n }\n\n onDialogResult(\n callback: (dialogResultEvent: DialogEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<DialogEvent> = {\n type: M2EventType.Composite,\n compositeType: \"DialogResult\",\n nodeUuid: this.uuid,\n callback: callback,\n };\n\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n const overlay = new Shape({\n rect: {\n width: m2c2Globals.canvasCssWidth,\n height: m2c2Globals.canvasCssHeight,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n fillColor: [0, 0, 0, this.overlayAlpha],\n zPosition: -1,\n isUserInteractionEnabled: true,\n });\n overlay.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Dismiss,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n this.addChild(overlay);\n\n const dialogBox = new Shape({\n rect: {\n width: 300,\n height: 150,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n cornerRadius: this.cornerRadius,\n fillColor: this.backgroundColor,\n isUserInteractionEnabled: true,\n });\n dialogBox.onTapDown((e) => {\n e.handled = true;\n });\n this.addChild(dialogBox);\n\n const dialogBoxPrimaryText = new Label({\n text: this.contentText,\n fontSize: 24,\n position: { x: 200, y: 360 },\n });\n this.addChild(dialogBoxPrimaryText);\n\n const negativeButton = new Button({\n text: this.negativeButtonText,\n position: { x: 120, y: 440 },\n size: { width: 100, height: 40 },\n isUserInteractionEnabled: true,\n zPosition: 1,\n });\n negativeButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n });\n negativeButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Negative,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n\n const positiveButton = new Button({\n text: this.positiveButtonText,\n position: { x: 280, y: 440 },\n size: { width: 100, height: 40 },\n isUserInteractionEnabled: true,\n zPosition: 1,\n });\n positiveButton.onTapDown((e) => {\n e.handled = true;\n this.hidden = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === M2EventType.Composite)\n .forEach((listener) => {\n const dialogEvent: DialogEvent = {\n type: M2EventType.Composite,\n target: this,\n handled: false,\n dialogResult: DialogResult.Positive,\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(dialogEvent);\n });\n }\n });\n\n this.addChild(negativeButton);\n this.addChild(positiveButton);\n\n this.needsInitialization = false;\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n this._fontColor = fontColor;\n this.needsInitialization = true;\n }\n\n get hidden(): boolean {\n return this._hidden;\n }\n set hidden(hidden: boolean) {\n this._hidden = hidden;\n this.needsInitialization = true;\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): Dialog {\n throw new M2Error(`duplicate not implemented. ${newName}`);\n // const dest = new Dialog({\n // ...this.getNodeOptions(),\n // ...this.getDrawableOptions(),\n // ...this.getTextOptions(),\n // size: this.size,\n // cornerRadius: this.cornerRadius,\n // backgroundColor: this.backgroundColor,\n // fontColor: this.fontColor,\n // name: newName,\n // });\n\n // if (this.children.length > 0) {\n // dest.children = this.children.map((child) => {\n // const clonedChild = child.duplicate();\n // clonedChild.parent = dest;\n // return clonedChild;\n // });\n // }\n\n //return dest;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n","import {\n CompositeOptions,\n Size,\n RgbaColor,\n M2NodeEvent,\n Point,\n CallbackOptions,\n Composite,\n WebColors,\n Shape,\n MutablePath,\n TapEvent,\n M2PointerEvent,\n M2Node,\n IDrawable,\n M2c2KitHelpers,\n M2NodeConstructor,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface DrawPadOptions extends CompositeOptions {\n /** Size of the DrawPad */\n size: Size;\n /** Color of drawn lines. Default is red. */\n lineColor?: RgbaColor;\n /** Width of drawn lines. Default is 1 */\n lineWidth?: number;\n /** Background color of the DrawPad. Default is transparent. */\n backgroundColor?: RgbaColor;\n /** Width of the border. Default is 1 */\n borderWidth?: number;\n /** Color of the border. Default is black */\n borderColor?: RgbaColor;\n /** Does the DrawPad respond to user interaction? Default is true. */\n isUserInteractionEnabled?: boolean;\n /** Should drawing resume when the pointer, in a down state, returns to the DrawPad area after exiting it while drawing? Default is false. */\n resumeDrawingOnReturn?: boolean;\n /** Should the user be permitted to draw only one continuous line? If so, no more drawing is allowed after the first stroke ends. */\n continuousDrawingOnly?: boolean;\n /** If `continuousDrawingOnly`, this is the maximum pixel distance from the last stroke's end point that the user is allowed to continue drawing with a new stroke. */\n continuousDrawingOnlyExceptionDistance?: number;\n}\n\nexport const DrawPadEventType = {\n StrokeStart: \"StrokeStart\",\n StrokeMove: \"StrokeMove\",\n StrokeEnd: \"StrokeEnd\",\n} as const;\nexport type DrawPadEventType =\n (typeof DrawPadEventType)[keyof typeof DrawPadEventType];\n\nexport interface DrawPadEvent extends M2NodeEvent {\n type: DrawPadEventType;\n position: Point;\n}\n\nexport const DrawPadItemEventType = {\n StrokeEnter: \"StrokeEnter\",\n StrokeLeave: \"StrokeLeave\",\n} as const;\nexport type DrawPadItemEventType =\n (typeof DrawPadItemEventType)[keyof typeof DrawPadItemEventType];\n\nexport interface DrawPadItemEvent extends M2NodeEvent {\n type: DrawPadItemEventType;\n}\n\nexport interface StrokeInteraction {\n /** Type of user interaction with the stroke: StrokeStart, StrokeMove, or StrokeEnd. */\n type: DrawPadEventType;\n /** Position on the DrawPad where the interaction occurred. In the DrawPad coordinate system, (0, 0) is the upper-left corner. */\n position: Point;\n /** Device ISO8601 Timestamp of the interaction. */\n iso8601Timestamp: string;\n /** Was the interaction's position interpolated? (clipped to DrawPad boundary) because the user drew out of bounds? @remarks Only StrokeMove and StrokeEnd can be interpolated. A StrokeStart position can never begin out of bounds. */\n interpolated: boolean;\n}\n\nexport type DrawPadStroke = Array<StrokeInteraction>;\n\nexport interface DrawPadItem {\n /**\n * Executes a callback when a DrawPad stroke begins on or enters the DrawPadItem.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeEnter(\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ): void;\n /**\n * Executes a callback when a DrawPad stroke leaves the DrawPadItem.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeLeave(\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ): void;\n /** Is a DrawPad stroke currently within the bounds of the DrawPad item? */\n isStrokeWithinBounds: boolean;\n /** Position of the DrawPadItem within the DrawPad coordinate system, in which (0, 0) is the upper-left corner. */\n drawPadPosition: Point;\n}\n\nexport class DrawPad extends Composite {\n compositeType = \"DrawPad\";\n resumeDrawingOnReturn = false;\n continuousDrawingOnly = false;\n continuousDrawingOnlyExceptionDistance: number | undefined;\n\n private _backgroundColor: RgbaColor = [0, 0, 0, 0];\n private _borderColor = WebColors.Black;\n private _borderWidth = 1;\n private _lineColor = WebColors.Red;\n private _lineWidth = 1;\n /** The rectangular \"pad\" on which to draw */\n private drawArea?: Shape;\n /** The lines that are drawn */\n private drawShape?: Shape;\n private isDrawingPointerDown = false;\n private pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n private currentStrokesNotAllowed = false;\n private originalOptions: DrawPadOptions;\n\n /** Array of strokes created on the DrawPad, with position and timestamps\n * of all interactions with each DrawPadStroke.\n */\n strokes = new Array<DrawPadStroke>();\n\n /**\n * A rectangular area on which the user can draw strokes (lines).\n *\n * @remarks This composite node is composed of a rectangle Shape and\n * another Shape that is formed from a path of points.\n *\n * @param options - {@link DrawPadOptions}\n */\n constructor(options: DrawPadOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.isUserInteractionEnabled === undefined) {\n // unlike most nodes, DrawPad is interactive by default\n this.isUserInteractionEnabled = true;\n }\n if (!options.size) {\n throw new M2Error(\"DrawPad size must be specified\");\n }\n this.size = options.size;\n\n if (options.lineColor) {\n this.lineColor = options.lineColor;\n }\n if (options.lineWidth) {\n this.lineWidth = options.lineWidth;\n }\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n if (options.borderColor) {\n this.borderColor = options.borderColor;\n }\n if (options.borderWidth) {\n this.borderWidth = options.borderWidth;\n }\n if (options.resumeDrawingOnReturn !== undefined) {\n this.resumeDrawingOnReturn = options.resumeDrawingOnReturn;\n }\n\n if (options.continuousDrawingOnly !== undefined) {\n this.continuousDrawingOnly = options.continuousDrawingOnly;\n }\n\n if (options.continuousDrawingOnlyExceptionDistance !== undefined) {\n this.continuousDrawingOnlyExceptionDistance =\n options.continuousDrawingOnlyExceptionDistance;\n }\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.initializeDrawShape();\n this.initializeDrawArea();\n this.needsInitialization = false;\n }\n\n private initializeDrawShape() {\n if (!this.drawShape) {\n const mutablePath = new MutablePath();\n this.drawShape = new Shape({\n path: mutablePath,\n size: this.size,\n });\n this.addChild(this.drawShape);\n }\n this.drawShape.strokeColor = this.lineColor;\n this.drawShape.lineWidth = this.lineWidth;\n }\n\n private initializeDrawArea() {\n if (!this.drawArea) {\n this.drawArea = new Shape({\n rect: { size: this.size },\n isUserInteractionEnabled: true,\n suppressEvents: true,\n });\n this.addChild(this.drawArea);\n\n this.drawArea.onTapDown((e) => {\n this.handleTapDown(e);\n });\n\n this.drawArea.onPointerMove((e) => {\n this.handlePointerMove(e);\n });\n\n this.drawArea.onTapUpAny(() => {\n this.handleTapUpAny();\n });\n\n this.drawArea.onTapLeave((e) => {\n this.handleTapLeave(e);\n });\n }\n this.drawArea.fillColor = this.backgroundColor;\n this.drawArea.strokeColor = this.borderColor;\n this.drawArea.lineWidth = this.borderWidth;\n }\n\n private dist(p1: Point, p2: Point): number {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n }\n\n private handleTapDown(e: TapEvent) {\n if (this.isUserInteractionEnabled) {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.handleTapDown(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n\n if (this.continuousDrawingOnly && path.subpaths.length !== 0) {\n const prevPoint =\n path.subpaths[path.subpaths.length - 1][\n path.subpaths[path.subpaths.length - 1].length - 1\n ];\n const currentPoint = e.point;\n\n if (\n this.continuousDrawingOnlyExceptionDistance === undefined ||\n this.dist(prevPoint, currentPoint) >\n this.continuousDrawingOnlyExceptionDistance\n ) {\n this.currentStrokesNotAllowed = true;\n return;\n }\n }\n\n this.currentStrokesNotAllowed = false;\n this.isDrawingPointerDown = true;\n path.move(e.point);\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeStart,\n target: this,\n handled: false,\n position: e.point,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes.push([\n {\n type: DrawPadEventType.StrokeStart,\n position: e.point,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n },\n ]);\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n private addInterpolatedStrokeMove(point: Point): Point {\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n const previousPoint =\n this.strokes[this.strokes.length - 1][strokeInteractionCount - 1]\n .position;\n const interpolatedPoint = this.interpolateToDrawPadBorder(\n point,\n previousPoint,\n this.size,\n );\n\n if (!this.drawShape?.path) {\n throw new M2Error(\n \"DrawPad.addInterpolatedStrokeMove(): no drawShape.path\",\n );\n }\n const path = this.drawShape.path as MutablePath;\n path.addLine(interpolatedPoint);\n\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeMove,\n target: this,\n handled: false,\n position: interpolatedPoint,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeMove,\n position: interpolatedPoint,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: true,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n\n return interpolatedPoint;\n }\n\n private handleTapLeave(e: TapEvent) {\n if (this.currentStrokesNotAllowed) {\n this.isDrawingPointerDown = false;\n return;\n }\n if (this.resumeDrawingOnReturn === false) {\n this.isDrawingPointerDown = false;\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n\n let pointWasInterpolated = false;\n let point = e.point;\n /**\n * If moving the pointer quickly when exiting the DrawPad area, we must\n * interpolate a point on the border of the DrawPad and add a stroke.\n * Otherwise, the stroke will end abruptly at the last point within the\n * DrawPad.\n */\n if (!this.isPointWithinDrawPad(e.point, this.size)) {\n point = this.addInterpolatedStrokeMove(e.point);\n pointWasInterpolated = true;\n }\n\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n target: this,\n handled: false,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeEnd,\n position: pointWasInterpolated\n ? point\n : this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: pointWasInterpolated,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n this.currentStrokesNotAllowed = true;\n } else {\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = true;\n }\n }\n\n private handleTapUpAny() {\n if (this.currentStrokesNotAllowed) {\n this.isDrawingPointerDown = false;\n return;\n }\n if (this.isUserInteractionEnabled) {\n this.isDrawingPointerDown = false;\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n const strokeCount = this.strokes.length;\n const strokeInteractionCount = this.strokes[strokeCount - 1].length;\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n target: this,\n handled: false,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeEnd,\n position:\n this.strokes[strokeCount - 1][strokeInteractionCount - 1].position,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n private handlePointerMove(e: M2PointerEvent) {\n if (this.isUserInteractionEnabled && this.isDrawingPointerDown) {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.handlePointerMove(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n if (\n this.isDrawingPointerDown &&\n !this.pointerIsDownAndPointerLeftDrawAreaWhenDown\n ) {\n path.addLine(e.point);\n }\n if (this.pointerIsDownAndPointerLeftDrawAreaWhenDown) {\n this.pointerIsDownAndPointerLeftDrawAreaWhenDown = false;\n path.move(e.point);\n }\n const drawPadEvent: DrawPadEvent = {\n type: DrawPadEventType.StrokeMove,\n target: this,\n handled: false,\n position: e.point,\n ...M2c2KitHelpers.createTimestamps(),\n };\n const strokeCount = this.strokes.length;\n this.strokes[strokeCount - 1].push({\n type: DrawPadEventType.StrokeMove,\n position: e.point,\n iso8601Timestamp: new Date().toISOString(),\n interpolated: false,\n });\n this.raiseDrawPadEvent(drawPadEvent);\n }\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n private raiseDrawPadEvent(event: DrawPadEvent): void {\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === event.type)\n .forEach((listener) => {\n listener.callback(event);\n });\n }\n }\n\n private raiseDrawPadItemEvent(item: M2Node, event: DrawPadItemEvent): void {\n if (item.eventListeners.length > 0) {\n item.eventListeners\n .filter((listener) => listener.type === event.type)\n .forEach((listener) => {\n listener.callback(event);\n });\n }\n }\n\n /**\n * Removes all strokes from the DrawPad.\n */\n clear(): void {\n if (!this.drawShape?.path) {\n throw new M2Error(\"DrawPad.clear(): no drawShape.path\");\n }\n const path = this.drawShape.path as MutablePath;\n path.clear();\n this.strokes = new Array<DrawPadStroke>();\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * Executes a callback when the user starts a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeStart(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeStart,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Executes a callback when the user moves a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeMove(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeMove,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Executes a callback when the user ends a stroke on the DrawPad.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onStrokeEnd(\n callback: (ev: DrawPadEvent) => void,\n options?: CallbackOptions,\n ): void {\n this.addEventListener(\n DrawPadEventType.StrokeEnd,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n }\n\n /**\n * Adds a node to the DrawPad.\n *\n * @remarks After the node is added to the DrawPad, its\n * position is adjusted to be relative to the DrawPad's coordinate\n * system, and it is made interactive. The method returns an object\n * which is the node as a DrawPadItem, which has additional methods,\n * properties, and events specific to it now being on a DrawPad. The node\n * now **must** be manipulated only using the DrawPadItem object. Using\n * the original node object will result in undefined behavior.\n *\n * @param node - the node to add to the DrawPad\n * @returns the node as a DrawPadItem\n */\n addItem<T extends M2Node>(node: T): T & DrawPadItem {\n Object.defineProperty(node, \"drawPadPosition\", {\n get: function () {\n const drawPad = node.parent as DrawPad;\n return {\n get x() {\n return node.position.x + drawPad.size.width / 2;\n },\n\n set x(value) {\n node.position.x = value - drawPad.size.width / 2;\n },\n get y() {\n return node.position.y + drawPad.size.height / 2;\n },\n\n set y(value) {\n node.position.y = value - drawPad.size.height / 2;\n },\n };\n },\n set: function (value: Point) {\n const drawPad = node.parent as DrawPad;\n node.position.x = value.x - drawPad.size.width / 2;\n node.position.y = value.y - drawPad.size.height / 2;\n },\n });\n Object.defineProperty(node, \"onStrokeEnter\", {\n value: function (\n this: T,\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ) {\n this.addEventListener(\n DrawPadItemEventType.StrokeEnter,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n },\n });\n Object.defineProperty(node, \"onStrokeLeave\", {\n value: function (\n this: T,\n callback: (ev: DrawPadItemEvent) => void,\n options?: CallbackOptions,\n ) {\n this.addEventListener(\n DrawPadItemEventType.StrokeLeave,\n <(ev: M2NodeEvent) => void>callback,\n options,\n );\n },\n });\n Object.defineProperty(node, \"isStrokeWithinBounds\", {\n value: false,\n writable: true,\n });\n node.onPointerDown(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === false) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = true;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeEnter,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerMove(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === false) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = true;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeEnter,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerLeave(() => {\n if (this.isDrawingPointerDown) {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === true) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = false;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeLeave,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n }\n });\n node.onPointerUp(() => {\n if ((node as unknown as DrawPadItem).isStrokeWithinBounds === true) {\n (node as unknown as DrawPadItem).isStrokeWithinBounds = false;\n const drawPadItemEvent: DrawPadItemEvent = {\n type: DrawPadItemEventType.StrokeLeave,\n target: node,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.raiseDrawPadItemEvent(node, drawPadItemEvent);\n }\n });\n this.addChild(node);\n /**\n * DrawPadItems must have zPosition -1 (below the DrawPadArea) so the\n * pointer events are properly processed. If this is not set, TapDown\n * event on the DrawPadArea will not set isStrokeWithinBounds = true,\n * and thus the StrokeEnter event on the item will not be raised.\n */\n (node as unknown as IDrawable).zPosition = -1;\n /**\n * Adust the node position so it is relative to the DrawPad coordinate\n * system.\n */\n node.position.x = node.position.x - this.size.width / 2;\n node.position.y = node.position.y - this.size.height / 2;\n node.isUserInteractionEnabled = true;\n return node as T & DrawPadItem;\n }\n\n /**\n * Takes a screenshot of the DrawPad.\n *\n * @returns a base64-encoded string of the DrawPad's current state in\n * PNG format.\n */\n takeScreenshot() {\n const drawArea = this.drawArea;\n if (!drawArea) {\n throw new M2Error(\"DrawPad.takeScreenshot(): no drawArea\");\n }\n const sx =\n (drawArea.absolutePosition.x - drawArea.size.width / 2) *\n m2c2Globals.canvasScale;\n const sy =\n (drawArea.absolutePosition.y - drawArea.size.height / 2) *\n m2c2Globals.canvasScale;\n const sw = drawArea.size.width * m2c2Globals.canvasScale;\n const sh = drawArea.size.height * m2c2Globals.canvasScale;\n const imageInfo = {\n alphaType: this.game.canvasKit.AlphaType.Unpremul,\n colorType: this.game.canvasKit.ColorType.RGBA_8888,\n colorSpace: this.game.canvasKit.ColorSpace.SRGB,\n width: sw,\n height: sh,\n };\n const snapshot = this.game.snapshots[0];\n const pixelData = snapshot.readPixels(sx, sy, imageInfo) as Uint8Array;\n const croppedImage = this.game.canvasKit.MakeImage(\n imageInfo,\n pixelData,\n pixelData.length / sh,\n );\n if (!croppedImage) {\n throw new M2Error(\"DrawPad.takeScreenshot(): no croppedImage\");\n }\n const bytes = croppedImage.encodeToBytes();\n if (!bytes) {\n throw new M2Error(\n \"DrawPad.takeScreenshot(): croppedImage.encodeToBytes() failed\",\n );\n }\n croppedImage.delete();\n return this.arrayBufferToBase64String(bytes);\n }\n\n /**\n * Determines whether a point is within the DrawPad.\n *\n * @param point - The point to check\n * @returns True - if the point is within the DrawPad, false otherwise\n */\n private isPointWithinDrawPad(point: Point, drawPadSize: Size): boolean {\n return (\n point.x >= 0 &&\n point.x <= drawPadSize.width &&\n point.y >= 0 &&\n point.y <= drawPadSize.height\n );\n }\n\n /**\n * Interpolates a point to the border of the DrawPad based on a line that\n * crosses the DrawPad border. The line is formed by the current \"out of\n * bounds\" point the and previous \"within bounds\" point.\n *\n * @param currentPoint - The current point\n * @param previousPoint - The previous point\n * @param drawPadSize - The size of the DrawPad\n * @returns A new point on the border of the DrawPad\n */\n private interpolateToDrawPadBorder(\n currentPoint: Point,\n previousPoint: Point,\n drawPadSize: Size,\n ): Point {\n /** Calculate the slope and intercept of the line passing through the\n * current and previous points Use the formula y = mx + b, where m\n * is the slope and b is the intercept.\n */\n const slope =\n (currentPoint.y - previousPoint.y) / (currentPoint.x - previousPoint.x);\n const intercept = currentPoint.y - slope * currentPoint.x;\n\n // Initialize the new point to be returned\n const newPoint: Point = { x: 0, y: 0 };\n\n // Check if vertical line (slope is undefined)\n if (!Number.isFinite(slope)) {\n // Use the current x value as the intersection point\n newPoint.x = currentPoint.x;\n // Check if the line segment is going from top to bottom\n if (currentPoint.y - previousPoint.y > 0) {\n // Set the new point to be the intersection point on the bottom border\n newPoint.y = drawPadSize.height;\n return newPoint;\n }\n // Check if the line segment is going from bottom to top\n if (currentPoint.y - previousPoint.y < 0) {\n // Set the new point to be the intersection point on the top border\n newPoint.y = 0;\n return newPoint;\n }\n }\n\n /**\n * Check if the line intersects the left or right border of DrawPad.\n * Use formula y = mx + b and substitute x = 0 or x = drawPadSize.width\n */\n const yLeft = slope * 0 + intercept;\n const yRight = slope * drawPadSize.width + intercept;\n // Check if the intersection point is within the DrawPad height\n if (yLeft >= 0 && yLeft <= drawPadSize.height) {\n // Check if the line segment is going from right to left\n if (currentPoint.x - previousPoint.x < 0) {\n // Set the new point to be the intersection point on the left border\n newPoint.x = 0;\n newPoint.y = yLeft;\n return newPoint;\n }\n }\n if (yRight >= 0 && yRight <= drawPadSize.height) {\n // Check if the line segment is going from left to right\n if (currentPoint.x - previousPoint.x > 0) {\n // Set the new point to be the intersection point on the right border\n newPoint.x = drawPadSize.width;\n newPoint.y = yRight;\n return newPoint;\n }\n }\n\n /**\n * Check if the line intersects the top or bottom border of DrawPad.\n * Use formula x = (y - b) / m and substitute y = 0 or y = drawPadSize.height\n */\n const xTop = (0 - intercept) / slope;\n const xBottom = (drawPadSize.height - intercept) / slope;\n // Check if the intersection point is within the DrawPad width\n if (xTop >= 0 && xTop <= drawPadSize.width) {\n // Check if the line segment is going from bottom to top\n if (currentPoint.y - previousPoint.y < 0) {\n // Set the new point to be the intersection point on the top border\n newPoint.x = xTop;\n newPoint.y = 0;\n return newPoint;\n }\n }\n if (xBottom >= 0 && xBottom <= drawPadSize.width) {\n // Check if the line segment is going from top to bottom\n if (currentPoint.y - previousPoint.y > 0) {\n // Set the new point to be the intersection point on the bottom border\n newPoint.x = xBottom;\n newPoint.y = drawPadSize.height;\n return newPoint;\n }\n }\n\n // If none of the above cases apply, return the current point as fallback\n return currentPoint;\n }\n\n private arrayBufferToBase64String(buffer: ArrayBuffer | Uint8Array): string {\n let binary = \"\";\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get borderColor(): RgbaColor {\n return this._borderColor;\n }\n set borderColor(borderColor: RgbaColor) {\n this._borderColor = borderColor;\n this.needsInitialization = true;\n }\n\n get borderWidth(): number {\n return this._borderWidth;\n }\n set borderWidth(borderWidth: number) {\n this._borderWidth = borderWidth;\n this.needsInitialization = true;\n }\n\n get lineColor(): RgbaColor {\n return this._lineColor;\n }\n set lineColor(lineColor: RgbaColor) {\n this._lineColor = lineColor;\n this.needsInitialization = true;\n }\n\n get lineWidth(): number {\n return this._lineWidth;\n }\n set lineWidth(lineWidth: number) {\n this._lineWidth = lineWidth;\n this.needsInitialization = true;\n }\n\n override duplicate(newName?: string): DrawPad {\n throw new M2Error(\n `DrawPad.duplicate(): Method not implemented. ${newName}`,\n );\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(DrawPad as unknown as M2NodeConstructor);\n","import {\n Shape,\n Label,\n WebColors,\n Point,\n Size,\n RgbaColor,\n Composite,\n CompositeOptions,\n M2Node,\n M2NodeEvent,\n M2EventType,\n IDrawable,\n M2NodeEventListener,\n ShapeOptions,\n CallbackOptions,\n M2c2KitHelpers,\n M2NodeConstructor,\n CompositeEvent,\n EventStoreMode,\n TapEvent,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\n/**\n * Additional, optional properties for a key in the `VirtualKeyboard`.\n *\n * @remarks This is used to define special keys (e.g., Shift, Backspace),\n * keys with icons, and keys of custom size.\n */\nexport interface KeyConfiguration {\n /** Width of the key in units of a regular key width. Default is 1. */\n widthRatio?: number;\n /** Width of the key in units of a regular key height. Default is 1. */\n heightRatio?: number;\n /** Identifier for the key. */\n code: string;\n /** Label to be shown on the key. */\n labelText?: string;\n /** Label to be shown on the key when shift is activated. */\n labelTextShifted?: string;\n /** True is the key should be hidden. */\n blank?: boolean;\n /** True is the key is a shift key. */\n isShift?: boolean;\n /** ShapeOptions of the optional icon to show on the key. */\n keyIconShapeOptions?: ShapeOptions;\n}\n\n/**\n * A row in the `VirtualKeyboard`.\n *\n * @remarks Each row is an array of objects that defines a key, where each\n * object can be one of the following:\n * - a string, e.g., `a`. The string is the key in the keyboard's unshifted\n * state (`a`), and the string's value after applying `toUpperCase()` is the key\n * in the keyboard's shifted state (`A`).\n * - an array of two strings, e.g., `[\"1\", \"!\"]`. The first string is the key\n * in the keyboard's unshifted state (`1`), and the second string is the key\n * in the keyboard's shifted state (`!`).\n * - A `KeyConfiguration` object, which can be used to further customize the\n * key's appearance and behavior.\n */\nexport type VirtualKeyboardRow = Array<\n string | Array<string> | KeyConfiguration\n>;\n\nexport interface VirtualKeyboardOptions extends CompositeOptions {\n size: Size;\n /** Percent of the keyboard width that should be used for padding on the left and right sides. Default is .02 */\n keyboardHorizontalPaddingPercent?: number;\n /** Percent of the keyboard height that should be used for padding on the top and bottom sides. Default is .025 */\n keyboardVerticalPaddingPercent?: number;\n /** Percent of each key's width that should be used for padding on the left and right sides. Default is .10 */\n keyHorizontalPaddingPercent?: number;\n /** Percent of each key's height that should be used for padding on the top and bottom sides. Default is .10 */\n keyVerticalPaddingPercent?: number;\n /** Configuration of keyboard rows. Order is from top to bottom rows. */\n rows?: Array<VirtualKeyboardRow>;\n /** How many regular-sized keys should fit in a row? This is used for scaling purposes. If not provided, it will be inferred from the row configuration. */\n keysPerRow?: number;\n /** Size of font for keys. */\n fontSize?: number;\n /** The fonts for the key labels, if not the default font. */\n fontNames?: Array<string> | undefined;\n /** Comma-separated list of keys to hide. */\n hiddenKeys?: string;\n /** If true, only capital letters will be shown. */\n capitalLettersOnly?: boolean;\n /** Color of keys. */\n keyColor?: RgbaColor;\n /** Color of keys when pressed. */\n keyDownColor?: RgbaColor;\n /** Color of special keys when pressed. */\n specialKeyDownColor?: RgbaColor;\n /** Background color of keyboard. */\n backgroundColor?: RgbaColor;\n /** If true, a preview of the key that will be pressed will be shown. */\n showKeyDownPreview?: boolean;\n}\n\nexport interface VirtualKeyboardEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"VirtualKeyboard\";\n compositeEventType:\n | \"VirtualKeyboardKeyUp\"\n | \"VirtualKeyboardKeyDown\"\n | \"VirtualKeyboardKeyLeave\";\n target: VirtualKeyboard | string;\n /** String that is generated when key is pressed, with any modifiers (e.g., Shift) applied. */\n key: string;\n /** Code for the key, not taking into account any modifiers. */\n code: string;\n /** True if the Shift key is pressed. */\n shiftKey: boolean;\n /** Metadata related to the key tap. */\n keyTapMetadata: KeyTapMetadata;\n}\n\nexport interface KeyTapMetadata {\n /** Size of the key. */\n size: Size;\n /** Point on the key where the tap event occurred. */\n point: Point;\n /** Buttons pressed when the key was tapped. */\n buttons: number;\n}\n\n/**\n * `KeyConfigurationWithShape` is a `KeyConfiguration` with an optional m2c2kit\n * instantiated `Shape` for the key's icon, instead of a `ShapeOptions`\n * object.\n */\ninterface KeyConfigurationWithShape\n extends KeyConfiguration,\n Omit<KeyConfiguration, \"keyIconShapeOptions\"> {\n /** Icon to show on the key. */\n keyIcon?: Shape;\n}\n\n/**\n * The complete keyboard configuration for internal use, with all keys\n * represented as `KeyConfigurationWithShape` objects.\n */\ntype InternalKeyboardConfiguration = Array<Array<KeyConfigurationWithShape>>;\n\n/**\n * `InternalKeyboardRow` is a `VirtualKeyboardRow`, but with the optional\n * `KeyConfiguration` objects replaced with `KeyConfigurationWithShape`\n * objects. Note: keys that are strings or arrays of strings are not changed.\n */\ntype InternalKeyboardRow = Array<\n KeyConfigurationWithShape | string | Array<string>\n>;\n\nexport class VirtualKeyboard extends Composite {\n readonly compositeType = \"VirtualKeyboard\";\n private keyboardHorizontalPaddingPercent: number;\n private keyboardVerticalPaddingPercent: number;\n private keyHorizontalPaddingPercent: number;\n private keyVerticalPaddingPercent: number;\n private keyboardRows = new Array<InternalKeyboardRow>();\n private keysPerRow: number;\n private fontSize: number;\n private fontNames: Array<string> | undefined;\n private hiddenKeys: string;\n private capitalLettersOnly: boolean;\n private keyColor: RgbaColor;\n private keyDownColor: RgbaColor;\n private specialKeyDownColor: RgbaColor;\n private backgroundColor: RgbaColor;\n private showKeyDownPreview: boolean;\n private originalOptions: VirtualKeyboardOptions;\n\n private shiftActivated = false;\n private keyShapes = new Array<Shape>();\n private keyLabels = new Array<Label>();\n\n private letterCircle?: Shape;\n private letterCircleLabel?: Label;\n\n /**\n * An on-screen keyboard that can be used to enter text.\n *\n * @param options - {@link VirtualKeyboardOptions}\n */\n constructor(options: VirtualKeyboardOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.isUserInteractionEnabled === undefined) {\n // VirtualKeyboard defaults to being user interactive.\n this._isUserInteractionEnabled = true;\n }\n this.size = options.size;\n this.position = options.position ?? { x: 0, y: 0 };\n this.keyboardHorizontalPaddingPercent =\n options.keyboardHorizontalPaddingPercent ?? 0.02;\n this.keyboardVerticalPaddingPercent =\n options.keyboardVerticalPaddingPercent ?? 0.025;\n this.keyHorizontalPaddingPercent =\n options.keyHorizontalPaddingPercent ?? 0.1;\n this.keyVerticalPaddingPercent = options.keyVerticalPaddingPercent ?? 0.1;\n if (options.rows !== undefined) {\n /**\n * Map the KeyConfiguration objects to InternalKeyConfiguration objects.\n * KeyConfiguration objects are used by the user to configure the\n * keyboard. The icon, optionally, is provided as a ShapeOptions\n * object. InternalKeyConfiguration has the icon as a ready-to-use Shape\n * object.\n */\n this.keyboardRows = options.rows.map((row) => {\n const internalRow = row.map((key) => {\n if (key instanceof Object && !Array.isArray(key)) {\n const internalKeyConfig = key as KeyConfigurationWithShape;\n if (key.keyIconShapeOptions) {\n key.keyIconShapeOptions.suppressEvents = true;\n internalKeyConfig.keyIcon = new Shape(key.keyIconShapeOptions);\n (internalKeyConfig as KeyConfiguration).keyIconShapeOptions =\n undefined;\n }\n return internalKeyConfig;\n } else {\n return key;\n }\n });\n return internalRow;\n });\n }\n this.keysPerRow = options.keysPerRow ?? NaN;\n this.fontSize = options.fontSize ?? NaN;\n this.fontNames = options.fontNames;\n this.hiddenKeys = options.hiddenKeys ?? \"\";\n this.capitalLettersOnly = options.capitalLettersOnly ?? false;\n this.keyColor = options.keyColor ?? WebColors.White;\n this.keyDownColor = options.keyDownColor ?? WebColors.Transparent;\n this.specialKeyDownColor =\n options.specialKeyDownColor ?? WebColors.LightSteelBlue;\n this.backgroundColor = options.backgroundColor ?? [242, 240, 244, 1];\n this.showKeyDownPreview = options.showKeyDownPreview ?? true;\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n /**\n * VirtualKeyboard defaults to being user interactive, but disable this\n * if we are in replay mode.\n */\n if (this.game.eventStore.mode === EventStoreMode.Replay) {\n this._isUserInteractionEnabled = false;\n }\n\n if (this.keyboardRows.length === 0) {\n this.keyboardRows = this.createDefaultKeyboardRows();\n this.keysPerRow = this.keyboardRows.reduce(\n (max, row) => Math.max(max, row.length),\n 0,\n );\n this.fontSize = this.size.height / this.keyboardRows.length / 2.5;\n }\n\n const keyboardRectangle = new Shape({\n rect: { size: this.size },\n fillColor: this.backgroundColor,\n suppressEvents: true,\n });\n this.addChild(keyboardRectangle);\n\n const keyboard = this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n\n const keyboardOrigin: Point = {\n x: -keyboardRectangle.size.width / 2,\n y: -keyboardRectangle.size.height / 2,\n };\n\n const keyboardVerticalPadding =\n (this.keyboardVerticalPaddingPercent ?? 0.025) * this.size.height;\n const keyboardHorizontalPadding =\n (this.keyboardHorizontalPaddingPercent ?? 0.02) * this.size.width;\n const keyBoxHeight =\n (this.size.height - 2 * keyboardVerticalPadding) / keyboard.length;\n const keyBoxWidth =\n (this.size.width - 2 * keyboardHorizontalPadding) / this.keysPerRow;\n\n this.keyShapes = [];\n\n for (let r = 0; r < keyboard.length; r++) {\n const row = keyboard[r];\n const rowSumKeyWidths = row.reduce(\n (sum, key) => sum + (key.widthRatio ?? 1),\n 0,\n );\n\n // extraPadding is additional padding to center the keys in the row\n // if the row is not full.\n let extraPadding = 0;\n if (rowSumKeyWidths < this.keysPerRow) {\n extraPadding =\n (this.size.width -\n 2 * keyboardHorizontalPadding -\n keyBoxWidth * rowSumKeyWidths) /\n 2;\n }\n\n for (let k = 0; k < row.length; k++) {\n const key = row[k];\n if (\n this.hiddenKeys\n ?.split(\",\")\n // \" \" is a special case for the space key code\n .map((s) => (s === \" \" ? \" \" : s.trim()))\n .includes(key.code)\n ) {\n continue;\n }\n const keyBoxWidthsSoFar =\n row.slice(0, k).reduce((sum, key) => sum + (key.widthRatio ?? 1), 0) *\n keyBoxWidth;\n const keyBox = new Shape({\n rect: {\n size: {\n width: keyBoxWidth * (key.widthRatio ?? 1),\n height: keyBoxHeight,\n },\n },\n fillColor: WebColors.Transparent,\n strokeColor: WebColors.Transparent,\n lineWidth: 1,\n position: {\n x:\n extraPadding +\n keyboardOrigin.x +\n keyboardHorizontalPadding +\n keyBoxWidthsSoFar +\n ((key.widthRatio ?? 1) * keyBoxWidth) / 2,\n y:\n keyboardOrigin.y +\n keyboardVerticalPadding +\n r * keyBoxHeight +\n keyBoxHeight / 2,\n },\n suppressEvents: true,\n });\n\n const keyWidth =\n keyBoxWidth * (key.widthRatio ?? 1) -\n 2 * this.keyHorizontalPaddingPercent * keyBoxWidth;\n const keyHeight =\n keyBoxHeight -\n (key.heightRatio ?? 1) -\n 2 * this.keyVerticalPaddingPercent * keyBoxHeight;\n const keyShape = new Shape({\n rect: { size: { width: keyWidth, height: keyHeight } },\n cornerRadius: 4,\n fillColor: this.keyColor,\n lineWidth: 0,\n isUserInteractionEnabled: this.isUserInteractionEnabled,\n suppressEvents: true,\n });\n // so we can reference keyShape by key code in handleCompositeEvent()\n keyShape.userData = { code: key.code };\n keyBox.addChild(keyShape);\n this.keyShapes.push(keyShape);\n\n const keyLabel = new Label({\n text: key.labelText,\n fontSize: this.fontSize,\n fontNames: this.fontNames,\n suppressEvents: true,\n });\n // so we can reference keyLabel by key code in handleCompositeEvent()\n keyLabel.userData = { code: key.code };\n keyBox.addChild(keyLabel);\n this.keyLabels.push(keyLabel);\n\n if (key.keyIcon) {\n keyBox.addChild(key.keyIcon);\n }\n\n keyboardRectangle.addChild(keyBox);\n\n keyShape.onTapUp((tapEvent) => {\n this.handleKeyShapeTapUp(key, keyShape, tapEvent);\n });\n\n keyShape.onTapDown((tapEvent) => {\n this.handleKeyShapeTapDown(key, keyShape, tapEvent);\n });\n\n keyShape.onTapLeave((tapEvent) => {\n this.handleKeyShapeTapLeave(key, keyShape, tapEvent);\n });\n }\n }\n\n this.letterCircle = new Shape({\n circleOfRadius: 28,\n fillColor: WebColors.Silver,\n hidden: true,\n suppressEvents: true,\n });\n keyboardRectangle.addChild(this.letterCircle);\n this.letterCircleLabel = new Label({\n text: \"\",\n fontSize: this.fontSize,\n fontNames: this.fontNames,\n suppressEvents: true,\n });\n this.letterCircle.addChild(this.letterCircleLabel);\n\n this.needsInitialization = false;\n }\n\n /**\n * Executes a callback when the user presses down on a key.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyDown(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyDown\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the user releases a key.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyUp(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyUp\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the user has pressed a key with the pointer, but\n * moves the pointer outside the key bounds before releasing the pointer.\n *\n * @remarks Typically, this event will not be used, since it is a user's\n * inaccurate interaction with the keyboard. However, it can be used to\n * provide feedback to the user that they have moved the pointer outside the\n * key bounds, and thus the key stroke will not be registered.\n *\n * @param callback - function to execute\n * @param options\n */\n onKeyLeave(\n callback: (virtualKeyboardEvent: VirtualKeyboardEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<VirtualKeyboardEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"VirtualKeyboardKeyLeave\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addVirtualKeyboardEventListener(eventListener, options);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n duplicate(newName?: string | undefined): M2Node {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n private handleKeyShapeTapDown(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n if (key.isShift) {\n this.shiftActivated = !this.shiftActivated;\n }\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyDown\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyDown\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private handleKeyShapeTapUp(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyUp\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyUp\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private handleKeyShapeTapLeave(\n key: KeyConfigurationWithShape,\n keyShape: Shape,\n tapEvent: TapEvent,\n ) {\n const keyAsString = this.getKeyAsString(key);\n const virtualKeyboardEvent: VirtualKeyboardEvent = {\n type: M2EventType.Composite,\n compositeType: \"VirtualKeyboard\",\n compositeEventType: \"VirtualKeyboardKeyLeave\",\n target: this,\n handled: false,\n key: keyAsString,\n code: key.code,\n shiftKey: this.shiftActivated,\n keyTapMetadata: {\n size: keyShape.size,\n point: tapEvent.point,\n buttons: tapEvent.buttons,\n },\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(virtualKeyboardEvent);\n this.saveEvent(virtualKeyboardEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"VirtualKeyboard\" &&\n listener.compositeEventType === \"VirtualKeyboardKeyLeave\",\n )\n .forEach((listener) => {\n listener.callback(virtualKeyboardEvent);\n });\n }\n }\n\n private getKeyAsString(key: KeyConfigurationWithShape): string {\n if (key.isShift || key.code === \" \" || key.code === \"Backspace\") {\n return key.code;\n } else {\n if (this.shiftActivated) {\n return key.labelTextShifted ?? key.code;\n } else {\n return key.labelText ?? key.code;\n }\n }\n }\n\n /**\n * Converts the keyboard rows to the internal keyboard configuration.\n *\n * @remarks This normalizes the keyboard rows so that each key is a\n * full `KeyConfigurationWithShape` object, instead of a string or array of\n * strings.\n *\n * @param keyboardRows\n * @returns the keyboard for internal use\n */\n private internalKeyboardRowsToInternalKeyboardConfiguration(\n keyboardRows: Array<InternalKeyboardRow>,\n ): InternalKeyboardConfiguration {\n return keyboardRows.map((row) => {\n return row.map((key) => {\n let widthRatio = 1;\n const heightRatio = 1;\n let code: string;\n let label: string;\n let labelShifted: string;\n let keyIcon: Shape | undefined;\n let isShift = false;\n if (typeof key === \"string\") {\n code = key;\n if (this.capitalLettersOnly) {\n label = code.toUpperCase();\n } else {\n label = code;\n }\n labelShifted = code.toUpperCase();\n } else if (Array.isArray(key)) {\n code = key[0];\n label = code;\n labelShifted = key[1];\n } else {\n code = key.code;\n label = key.labelText ?? \"\";\n labelShifted = key.labelTextShifted ?? label;\n widthRatio = key.widthRatio ?? 1;\n keyIcon = key.keyIcon;\n isShift = key.isShift ?? false;\n }\n return {\n widthRatio,\n heightRatio,\n code,\n labelText: label,\n labelTextShifted: labelShifted,\n keyIcon,\n isShift,\n } as KeyConfigurationWithShape;\n });\n });\n }\n\n override handleCompositeEvent(event: VirtualKeyboardEvent): void {\n const keyboard = this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n const keyShape = this.keyShapes.find((k) => k.userData.code === event.code);\n if (!keyShape) {\n throw new M2Error(\"keyShape is not defined\");\n }\n\n this.shiftActivated = event.shiftKey;\n\n switch (event.compositeEventType) {\n case \"VirtualKeyboardKeyDown\": {\n this.handleKeyDownEvent(event, keyboard, keyShape);\n break;\n }\n case \"VirtualKeyboardKeyUp\": {\n this.handleKeyUpEvent(event, keyboard, keyShape);\n break;\n }\n case \"VirtualKeyboardKeyLeave\": {\n this.handleKeyLeaveEvent(event, keyboard, keyShape);\n break;\n }\n default: {\n throw new M2Error(\n `Unknown VirtualKeyboardEvent: ${event.compositeEventType}`,\n );\n }\n }\n }\n\n private handleKeyDownEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n if (event.code.toLowerCase().includes(\"shift\")) {\n if (event.shiftKey) {\n this.showKeyboardShifted(keyboard);\n } else {\n this.showKeyboardNotShifted(keyboard);\n }\n } else if (event.code === \" \" || event.code === \"Backspace\") {\n keyShape.fillColor = this.specialKeyDownColor;\n } else {\n keyShape.fillColor = this.keyDownColor;\n if (this.showKeyDownPreview) {\n if (!this.letterCircle || !this.letterCircleLabel) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = false;\n const keyBox = keyShape.parent as Shape;\n this.letterCircle.position.x = keyBox.position.x;\n if (keyShape.rect?.size?.height === undefined) {\n throw new M2Error(\"keyShape.rect.height is undefined\");\n }\n this.letterCircle.position.y =\n keyBox.position.y - keyShape.rect.size.height * 1.2;\n const keyboard =\n this.internalKeyboardRowsToInternalKeyboardConfiguration(\n this.keyboardRows,\n );\n const key = keyboard.flat().find((k) => k.code === event.code);\n if (!key) {\n throw new M2Error(\"key is not defined\");\n }\n if (this.shiftActivated) {\n this.letterCircleLabel.text = key.labelTextShifted ?? key.code;\n } else {\n this.letterCircleLabel.text = key.labelText ?? key.code;\n }\n }\n }\n }\n\n private handleKeyUpEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n /**\n * If shift key was released, and shift was activated, this is a simple\n * shift key activation. Shift was activated on the key down event, so\n * do nothing.\n */\n if (event.code.toLowerCase().includes(\"shift\") && event.shiftKey) {\n return;\n }\n\n /**\n * If shift key was released, and shift was not activated, this is a simple\n * shift key deactivation.\n */\n if (event.code.toLowerCase().includes(\"shift\") && !event.shiftKey) {\n this.shiftActivated = false;\n this.showKeyboardNotShifted(keyboard);\n return;\n }\n\n keyShape.fillColor = this.keyColor;\n if (!this.letterCircle) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = true;\n\n /**\n * A non-shift key was released, and shift was activated. This means that\n * we need to deactivate shift and show the keyboard in the non-shifted\n * state. This is because our behavior is to deactivate shift when a\n * non-shift key is released.\n */\n if (!event.code.toLowerCase().includes(\"shift\") && event.shiftKey) {\n this.shiftActivated = false;\n this.showKeyboardNotShifted(keyboard);\n }\n }\n\n private handleKeyLeaveEvent(\n event: VirtualKeyboardEvent,\n keyboard: InternalKeyboardConfiguration,\n keyShape: Shape,\n ) {\n if (event.code.toLowerCase().includes(\"shift\")) {\n if (event.shiftKey) {\n this.showKeyboardNotShifted(keyboard);\n this.shiftActivated = false;\n } else {\n this.showKeyboardShifted(keyboard);\n this.shiftActivated = true;\n }\n return;\n }\n keyShape.fillColor = this.keyColor;\n if (!this.letterCircle) {\n throw new M2Error(\"letterCircle is not defined\");\n }\n this.letterCircle.hidden = true;\n }\n\n private showKeyboardShifted(keyboard: InternalKeyboardConfiguration) {\n // change shift keys to special key color\n const shiftKeyShapes = this.keyShapes.filter((shape) =>\n (shape.userData.code as string).toLowerCase().includes(\"shift\"),\n );\n shiftKeyShapes.forEach((shape) => {\n shape.fillColor = this.specialKeyDownColor;\n });\n\n // if shift keys have icons, change fill to black\n const shiftKeys = keyboard.flat().filter((k) => k.isShift);\n shiftKeys.forEach((k) => {\n if (k.keyIcon) {\n k.keyIcon.fillColor = WebColors.Black;\n }\n });\n\n // change key labels to shifted text\n keyboard\n .flatMap((k) => k)\n .forEach((k) => {\n const keyLabel = this.keyLabels.find((l) => l.userData.code === k.code);\n if (!keyLabel) {\n throw new M2Error(\"keyLabel is not defined\");\n }\n if (keyLabel.text !== undefined) {\n keyLabel.text = k.labelTextShifted ?? \"\";\n }\n });\n }\n\n private showKeyboardNotShifted(keyboard: InternalKeyboardConfiguration) {\n // change shift keys back to regular color\n const shiftKeyShapes = this.keyShapes.filter((shape) =>\n (shape.userData.code as string).toLowerCase().includes(\"shift\"),\n );\n shiftKeyShapes.forEach((shape) => {\n shape.fillColor = this.keyColor;\n });\n\n // if shift keys have icons, change fill back to transparent\n const shiftKeys = keyboard.flat().filter((k) => k.isShift);\n shiftKeys.forEach((k) => {\n if (k.keyIcon) {\n k.keyIcon.fillColor = WebColors.Transparent;\n }\n });\n\n // change key labels to regular text\n keyboard\n .flatMap((k) => k)\n .forEach((k) => {\n const keyLabel = this.keyLabels.find((l) => l.userData.code === k.code);\n if (!keyLabel) {\n throw new M2Error(\"keyLabel is not defined\");\n }\n if (keyLabel.text !== undefined) {\n keyLabel.text = k.labelText ?? \"\";\n }\n });\n }\n\n private createDefaultKeyboardRows() {\n const numKeys: InternalKeyboardRow = [\n [\"1\", \"!\"],\n [\"2\", \"@\"],\n [\"3\", \"#\"],\n [\"4\", \"$\"],\n [\"5\", \"%\"],\n [\"6\", \"^\"],\n [\"7\", \"&\"],\n [\"8\", \"*\"],\n [\"9\", \"(\"],\n [\"0\", \")\"],\n ];\n const row1: InternalKeyboardRow = [\n \"q\",\n \"w\",\n \"e\",\n \"r\",\n \"t\",\n \"y\",\n \"u\",\n \"i\",\n \"o\",\n \"p\",\n ];\n const row2: InternalKeyboardRow = [\n \"a\",\n \"s\",\n \"d\",\n \"f\",\n \"g\",\n \"h\",\n \"j\",\n \"k\",\n \"l\",\n ];\n const shiftArrowShapeOptions: ShapeOptions = {\n path: {\n // Public Domain from https://www.freesvg.org\n pathString: \"m288-6.6849e-14 -288 288h144v288h288v-288h144l-288-288z\",\n width: 24,\n },\n lineWidth: 2,\n strokeColor: WebColors.Black,\n fillColor: WebColors.Transparent,\n suppressEvents: true,\n };\n const backspaceShapeOptions: ShapeOptions = {\n path: {\n // CC0 from https://www.svgrepo.com\n pathString:\n \"M10.625 5.09 0 22.09l10.625 17H44.18v-34H10.625zm31.555 32H11.734l-9.375-15 9.375-15H42.18v30zm-23.293-6.293 7.293-7.293 7.293 7.293 1.414-1.414-7.293-7.293 7.293-7.293-1.414-1.414-7.293 7.293-7.293-7.293-1.414 1.414 7.293 7.293-7.293 7.293\",\n width: 24,\n },\n lineWidth: 1,\n strokeColor: WebColors.Black,\n fillColor: WebColors.Red,\n suppressEvents: true,\n };\n const row3: InternalKeyboardRow = [\n {\n code: \"Shift\",\n isShift: true,\n widthRatio: 1.5,\n keyIcon: new Shape(shiftArrowShapeOptions),\n },\n \"z\",\n \"x\",\n \"c\",\n \"v\",\n \"b\",\n \"n\",\n \"m\",\n {\n code: \"Backspace\",\n widthRatio: 1.5,\n keyIcon: new Shape(backspaceShapeOptions),\n },\n ];\n const row4: InternalKeyboardRow = [\n { code: \" \", labelText: \"SPACE\", widthRatio: 5 },\n ];\n\n const keyboardRows = [numKeys, row1, row2, row3, row4];\n return keyboardRows;\n }\n\n private addVirtualKeyboardEventListener(\n eventListener: M2NodeEventListener<VirtualKeyboardEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n /**\n * Does the `VirtualKeyboard` respond to user events? Default is true.\n */\n override get isUserInteractionEnabled(): boolean {\n return this._isUserInteractionEnabled;\n }\n /**\n * Does the `VirtualKeyboard` respond to user events? Default is true.\n */\n override set isUserInteractionEnabled(isUserInteractionEnabled: boolean) {\n this._isUserInteractionEnabled = isUserInteractionEnabled;\n /**\n * Rather than redraw of the entire keyboard, we can simply update the\n * `isUserInteractionEnabled` property of each key shape. This means we\n * handle this property change a bit differently, since we are changing\n * keyboard node properties directly, rather that changing the properties\n * of the composite and then redrawing the composite. Specifically, in\n * event playback mode, this.keyShapes may be undefined (it has not yet\n * been initialized), so we need to check for that.\n */\n this.keyShapes?.forEach((keyShape) => {\n keyShape.isUserInteractionEnabled = isUserInteractionEnabled;\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(\n VirtualKeyboard as unknown as M2NodeConstructor,\n);\n","import { Button } from \"../composites/button\";\nimport {\n WebColors,\n Transition,\n TransitionDirection,\n Easings,\n Story,\n StoryOptions,\n Scene,\n Dimensions,\n Label,\n LabelHorizontalAlignmentMode,\n Sprite,\n RgbaColor,\n StringInterpolationMap,\n} from \"@m2c2kit/core\";\n\nconst SCENE_TRANSITION_EASING = Easings.sinusoidalInOut;\nconst SCENE_TRANSITION_DURATION = 500;\n\nexport interface InstructionScene {\n /** Primary instruction text */\n text?: string;\n /** Interpolation for text */\n textInterpolation?: StringInterpolationMap;\n /** Margin from left screen edge to primary instruction text. Default is 48 */\n textMarginStart?: number;\n /** Margin from right to primary instruction text. Default is 48 */\n textMarginEnd?: number;\n /** Horizontal alignment of primary instruction text. see {@link LabelHorizontalAlignmentMode}. Default is LabelHorizontalAlignmentMode.left. */\n textAlignmentMode?: LabelHorizontalAlignmentMode;\n /** Default is to center primary instructions vertically within the scene (textVerticalBias = .5). Setting textVerticalBias less than .5 will pull the text towards the top. Setting textVerticalBias greater than .5 will pull the text towards the bottom */\n textVerticalBias?: number;\n /** Font size of primary instruction text. Default is 16 */\n textFontSize?: number;\n /** A text heading to appear at the top of the scene */\n title?: string;\n /** Interpolation for title */\n titleInterpolation?: StringInterpolationMap;\n /** Margin from top of screen edge to title text. Default is 48 */\n titleMarginTop?: number;\n /** Font size of title text. Default is 16 */\n titleFontSize?: number;\n /** Name of optional image to show */\n imageName?: string;\n /** Default is to center image vertically within the scene (imageVerticalBias = .5). Setting imageVerticalBias less than .5 will pull the image towards the top. Setting imageVerticalBias greater than .5 will pull the image towards the bottom */\n imageVerticalBias?: number;\n /** If the image appears below the primary instruction text (imageAboveText = false), this is the margin from the bottom of the primary instruction text to the top of the image */\n imageMarginTop?: number;\n /** If the image appears above the primary instruction text (imageAboveText = true), this is the margin from the bottom of the image to the top of the primary instruction text */\n imageMarginBottom?: number;\n /** If an image is provided, should it appear above the primary text? Default is true */\n imageAboveText?: boolean;\n /** Background color for instruction scene. Will override what is set in InstructionsOptions */\n backgroundColor?: RgbaColor;\n /** Button text for the back button. Will override what is set in InstructionsOptions */\n backButtonText?: string;\n /** Interpolation for back button text */\n backButtonTextInterpolation?: StringInterpolationMap;\n /** Button text for the next button. Will override what is set in InstructionsOptions */\n nextButtonText?: string;\n /** Interpolation map for next button text */\n nextButtonTextInterpolation?: StringInterpolationMap;\n /** Width of back button. Will override what is set in InstructionsOptions */\n backButtonWidth?: number;\n /** Width of next button. Will override what is set in InstructionsOptions */\n nextButtonWidth?: number;\n /** Height of back button. Will override what is set in InstructionsOptions */\n backButtonHeight?: number;\n /** Height of next button. Will override what is set in InstructionsOptions */\n nextButtonHeight?: number;\n /** Color of back button. Will override what is set in InstructionsOptions */\n backButtonBackgroundColor?: RgbaColor;\n /** Color of back button text. Will override what is set in InstructionsOptions */\n backButtonFontColor?: RgbaColor;\n /** Color of next button. Will override what is set in InstructionsOptions */\n nextButtonBackgroundColor?: RgbaColor;\n /** Color of next button text. Will override what is set in InstructionsOptions */\n nextButtonFontColor?: RgbaColor;\n /** Scene transition when advancing to the next instruction scene. Will override what is set in InstructionsOptions */\n nextSceneTransition?: Transition;\n /** Scene transition when returning to the previous instruction scene. Will override what is set in InstructionsOptions */\n backSceneTransition?: Transition;\n}\n\nexport interface InstructionsOptions extends StoryOptions {\n /** Name to prefix to each instruction scene name. Default is \"instructions.\" For example, if screenNamePrefix is \"instructions\", instruction scenes will be named \"instructions-01\", \"instructions-02\", etc. */\n sceneNamePrefix?: string;\n /** Name of scene that follows the last instruction scene. Clicking the \"next\" button on the last instruction screen will advance to this screen */\n postInstructionsScene?: string;\n /** Array of instruction scenes that form the instructions */\n instructionScenes: Array<InstructionScene>;\n /** Background color for instruction scenes. Can be overridden within a single instruction scene */\n backgroundColor?: RgbaColor;\n /** Scene transition when advancing to the next instruction scene. Default is push transition, to the left, 500 milliseconds duration. Can be overridden within a single instruction scene */\n nextSceneTransition?: Transition;\n /** Scene transition when returning to the previous instruction scene. Default is push transition, to the right, 500 milliseconds duration. Can be overridden within a single instruction scene */\n backSceneTransition?: Transition;\n /** Button text for the back button. Default is \"Back\". Can be overridden within a single instruction scene */\n backButtonText?: string;\n /** Interpolation map for back button text */\n backButtonTextInterpolation?: StringInterpolationMap;\n /** Button text for the next button. Default is \"Next\". Can be overridden within a single instruction scene */\n nextButtonText?: string;\n /** Interpolation map for next button text */\n nextButtonTextInterpolation?: StringInterpolationMap;\n /** Width of back button. Default is 125. Can be overridden within a single instruction scene */\n backButtonWidth?: number;\n /** Width of next button. Default is 125. Can be overridden within a single instruction scene */\n nextButtonWidth?: number;\n /** Height of back button. Default is 50. Can be overridden within a single instruction scene */\n backButtonHeight?: number;\n /** Height of next button. Default is 50. Can be overridden within a single instruction scene */\n nextButtonHeight?: number;\n /** Color of back button. Default is WebColors.Black. Can be overridden within a single instruction scene */\n backButtonBackgroundColor?: RgbaColor;\n /** Color of back button text. Default is WebColors.White. Can be overridden within a single instruction scene */\n backButtonFontColor?: RgbaColor;\n /** Color of next button. Default is WebColors.Black. Can be overridden within a single instruction scene */\n nextButtonBackgroundColor?: RgbaColor;\n /** Color of next button text. Default is WebColors.White. Can be overridden within a single instruction scene */\n nextButtonFontColor?: RgbaColor;\n}\n\nexport class Instructions extends Story {\n /**\n * Creates an array of scenes containing instructions on how to complete the assessment\n *\n * @param options - {@link InstructionsOptions}\n * @returns instruction scenes\n */\n static override create(options: InstructionsOptions): Array<Scene> {\n const scenes = new Array<Scene>();\n options.instructionScenes.forEach((s, i) => {\n const nextSceneTransition =\n s.nextSceneTransition ??\n options.nextSceneTransition ??\n Transition.slide({\n direction: TransitionDirection.Left,\n duration: SCENE_TRANSITION_DURATION,\n easing: SCENE_TRANSITION_EASING,\n });\n const backSceneTransition =\n s.backSceneTransition ??\n options.backSceneTransition ??\n Transition.slide({\n direction: TransitionDirection.Right,\n duration: SCENE_TRANSITION_DURATION,\n easing: SCENE_TRANSITION_EASING,\n });\n const backButtonText =\n s.backButtonText ?? options.backButtonText ?? \"Back\";\n const backButtonTextInterpolation =\n s.backButtonTextInterpolation ?? options.backButtonTextInterpolation;\n const nextButtonText =\n s.nextButtonText ?? options.nextButtonText ?? \"Next\";\n const nextButtonTextInterpolation =\n s.nextButtonTextInterpolation ?? options.nextButtonTextInterpolation;\n const backButtonWidth =\n s.backButtonWidth ?? options.backButtonWidth ?? 125;\n const nextButtonWidth =\n s.nextButtonWidth ?? options.nextButtonWidth ?? 125;\n const backButtonHeight =\n s.backButtonHeight ?? options.backButtonHeight ?? 50;\n const nextButtonHeight =\n s.nextButtonHeight ?? options.nextButtonHeight ?? 50;\n const backgroundColor = s.backgroundColor ?? options.backgroundColor;\n const imageAboveText = s.imageAboveText ?? true;\n const imageMarginTop = s.imageMarginTop ?? 0;\n const imageMarginBottom = s.imageMarginBottom ?? 0;\n const textMarginStart = s.textMarginStart ?? 48;\n const textMarginEnd = s.textMarginEnd ?? 48;\n const textAlignmentMode =\n s.textAlignmentMode ?? LabelHorizontalAlignmentMode.Left;\n const textFontSize = s.textFontSize ?? 16;\n const titleFontSize = s.titleFontSize ?? 16;\n const titleMarginTop = s.titleMarginTop ?? 48;\n const backButtonBackgroundColor =\n s.backButtonBackgroundColor ??\n options.backButtonBackgroundColor ??\n WebColors.Black;\n const backButtonFontColor =\n s.backButtonFontColor ?? options.backButtonFontColor ?? WebColors.White;\n const nextButtonBackgroundColor =\n s.nextButtonBackgroundColor ??\n options.nextButtonBackgroundColor ??\n WebColors.Black;\n const nextButtonFontColor =\n s.nextButtonFontColor ?? options.nextButtonFontColor ?? WebColors.White;\n const sceneNamePrefix = options.sceneNamePrefix ?? \"instructions\";\n\n const scene = new Scene({\n name: sceneNamePrefix + \"-\" + (i + 1).toString().padStart(2, \"0\"),\n backgroundColor: backgroundColor,\n });\n\n let titleLabel: Label | undefined;\n if (s.title !== undefined) {\n titleLabel = new Label({\n text: s.title,\n interpolation: s.titleInterpolation,\n fontSize: titleFontSize,\n layout: {\n marginTop: titleMarginTop,\n constraints: {\n topToTopOf: scene,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n scene.addChild(titleLabel);\n }\n\n let textLabel: Label | undefined;\n if (s.text !== undefined) {\n textLabel = new Label({\n text: s.text,\n interpolation: s.textInterpolation,\n preferredMaxLayoutWidth: Dimensions.MatchConstraint,\n horizontalAlignmentMode: textAlignmentMode,\n fontSize: textFontSize,\n layout: {\n marginStart: textMarginStart,\n marginEnd: textMarginEnd,\n constraints: {\n topToTopOf: scene,\n bottomToBottomOf: scene,\n startToStartOf: scene,\n endToEndOf: scene,\n verticalBias: s.textVerticalBias,\n },\n },\n });\n scene.addChild(textLabel);\n }\n\n if (s.imageName !== undefined) {\n let image: Sprite;\n if (textLabel !== undefined) {\n if (imageAboveText) {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n marginBottom: imageMarginBottom,\n constraints: {\n bottomToTopOf: textLabel,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n } else {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n marginTop: imageMarginTop,\n constraints: {\n topToBottomOf: textLabel,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n }\n } else {\n image = new Sprite({\n imageName: s.imageName,\n layout: {\n constraints: {\n topToTopOf: scene,\n bottomToBottomOf: scene,\n verticalBias: s.imageVerticalBias,\n startToStartOf: scene,\n endToEndOf: scene,\n },\n },\n });\n }\n scene.addChild(image);\n }\n\n if (i > 0) {\n const backButton = new Button({\n name: \"backButton\",\n text: backButtonText,\n interpolation: backButtonTextInterpolation,\n fontColor: backButtonFontColor,\n backgroundColor: backButtonBackgroundColor,\n size: { width: backButtonWidth, height: backButtonHeight },\n layout: {\n marginStart: 32,\n marginBottom: 80,\n constraints: { bottomToBottomOf: scene, startToStartOf: scene },\n },\n });\n backButton.isUserInteractionEnabled = true;\n backButton.onTapDown(() => {\n scene.game.presentScene(\n sceneNamePrefix + \"-\" + (i + 1 - 1).toString().padStart(2, \"0\"),\n backSceneTransition,\n );\n });\n scene.addChild(backButton);\n }\n\n const nextButton = new Button({\n name: \"nextButton\",\n text: nextButtonText,\n interpolation: nextButtonTextInterpolation,\n fontColor: nextButtonFontColor,\n backgroundColor: nextButtonBackgroundColor,\n size: { width: nextButtonWidth, height: nextButtonHeight },\n layout: {\n marginEnd: 32,\n marginBottom: 80,\n constraints: { bottomToBottomOf: scene, endToEndOf: scene },\n },\n });\n nextButton.isUserInteractionEnabled = true;\n if (i !== options.instructionScenes.length - 1) {\n nextButton.onTapDown(() => {\n scene.game.presentScene(\n sceneNamePrefix + \"-\" + (i + 1 + 1).toString().padStart(2, \"0\"),\n nextSceneTransition,\n );\n });\n } else {\n if (options.postInstructionsScene !== undefined) {\n nextButton.onTapDown(() => {\n scene.game.presentScene(\n options.postInstructionsScene ?? \"\",\n nextSceneTransition,\n );\n });\n } else {\n nextButton.onTapDown(() => {\n const sceneIndex = scene.game.scenes.indexOf(scene);\n if (sceneIndex === -1) {\n /**\n * This should never happen, unless this instruction scene has\n * been removed from the game.\n */\n console.warn(\n \"warning: postInstructionsScene is not defined, and next scene cannot be determined.\",\n );\n } else {\n const nextSceneIndex = sceneIndex + 1;\n if (nextSceneIndex < scene.game.scenes.length) {\n scene.game.presentScene(\n scene.game.scenes[nextSceneIndex],\n nextSceneTransition,\n );\n } else {\n console.warn(\n \"warning: postInstructionsScene is not defined, and there is no next scene to present.\",\n );\n }\n }\n });\n }\n }\n scene.addChild(nextButton);\n\n scenes.push(scene);\n });\n\n return scenes;\n }\n\n /**\n * Creates an array of scenes containing instructions on how to complete the assessment\n *\n * @deprecated Use {@link Instructions.create} instead (lower case method name \"create\")\n *\n * @param options - {@link InstructionsOptions}\n * @returns instruction scenes\n */\n static Create(options: InstructionsOptions): Array<Scene> {\n return this.create(options);\n }\n}\n","import {\n Transition,\n TransitionDirection,\n Easings,\n Scene,\n Label,\n Action,\n Shape,\n SceneOptions,\n RgbaColor,\n WebColors,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { TimerShape } from \"../composites/countdown-timer\";\n\nconst SCENE_TRANSITION_EASING = Easings.sinusoidalInOut;\nconst SCENE_TRANSITION_DURATION_MS = 500;\n\nexport interface CountdownSceneOptions extends SceneOptions {\n /** Duration of the countdown, in milliseconds. */\n milliseconds: number;\n /** Duration of the slide transition, in milliseconds, to the next scene after the countdown completes. Default is 500. */\n transitionDurationMilliseconds?: number;\n /** A custom transition to use to present next scene after the countdown completes. */\n transition?: Transition;\n /** Duration in milliseconds to stay on zero before transitioning to the next scene. Default is zero. This option should be used if `transition` is set to `Transition.none()`. Otherwise, the zero will flash for a single frame before presenting the next scene. */\n zeroDwellMilliseconds?: number;\n /** Text shown below the countdown shape. Default is \"GET READY\". */\n text?: string;\n /** Font name for text */\n textFontName?: string;\n /** Font size for text. Default is 50. */\n textFontSize?: number;\n /** Font color for text. Default is black. */\n textFontColor?: RgbaColor;\n /** Distance between bottom of countdown shape and text. Default is 32. */\n textMarginTop?: number;\n /** Font name for timer numbers. */\n timerNumbersFontName?: string;\n /** Font size for timer numbers. Default is 50. */\n timerNumbersFontSize?: number;\n /** Font size for timer numbers. Default is white. */\n timerNumbersFontColor?: RgbaColor;\n /** String to show when the timer reaches zero. Default is \"0\". This could be changed to another value, such as \"GO!\" */\n zeroString?: string;\n /** Shape of the timer. Default is a Royal Blue circle with a radius of 100 centered vertically. */\n timerShape?: TimerShape;\n /** Default is to center the timer shape vertically within the scene (verticalBias = .5). Setting verticalBias less than .5 will pull the shape towards the top. Setting verticalBias greater than .5 will pull the shape towards the bottom. */\n shapeVerticalBias?: number;\n}\n\nexport class CountdownScene extends Scene {\n /**\n * A scene that counts down from a specified number to zero, then transitions to the next scene.\n *\n * @param options - {@link CountdownSceneOptions}\n */\n constructor(options: CountdownSceneOptions) {\n super(options);\n\n if (\n options?.transitionDurationMilliseconds !== undefined &&\n options?.transition\n ) {\n throw new M2Error(\n \"Both transition and transitionDurationMilliseconds options were provided. Only one should be provided. If using a custom transition, then the duration of that transition must be specified within the custom transition.\",\n );\n }\n\n let timerShape: Shape;\n\n if (\n (options?.timerShape?.circle === undefined &&\n options?.timerShape?.rectangle === undefined) ||\n options?.timerShape.circle !== undefined\n ) {\n timerShape = new Shape({\n circleOfRadius: options?.timerShape?.circle?.radius ?? 100,\n layout: {\n constraints: {\n topToTopOf: this,\n bottomToBottomOf: this,\n startToStartOf: this,\n endToEndOf: this,\n verticalBias: options?.shapeVerticalBias ?? 0.5,\n },\n },\n fillColor: options?.timerShape?.fillColor ?? WebColors.RoyalBlue,\n });\n this.addChild(timerShape);\n } else if (options?.timerShape.rectangle !== undefined) {\n timerShape = new Shape({\n rect: {\n width: options?.timerShape?.rectangle?.width ?? 200,\n height: options?.timerShape?.rectangle?.height ?? 200,\n },\n cornerRadius: options?.timerShape?.rectangle?.cornerRadius,\n layout: {\n constraints: {\n topToTopOf: this,\n bottomToBottomOf: this,\n startToStartOf: this,\n endToEndOf: this,\n verticalBias: options.shapeVerticalBias ?? 0.5,\n },\n },\n fillColor: options?.timerShape?.fillColor ?? WebColors.RoyalBlue,\n });\n this.addChild(timerShape);\n } else {\n throw new M2Error(\"Invalid timer shape options.\");\n }\n\n const timerInitialNumber = Math.floor(options.milliseconds / 1000);\n\n const timerNumberLabel = new Label({\n // Number text will be set in onSetup()\n text: \"\",\n fontSize: options?.timerNumbersFontSize ?? 50,\n fontName: options?.timerNumbersFontName,\n fontColor: options?.timerNumbersFontColor ?? WebColors.White,\n });\n timerShape.addChild(timerNumberLabel);\n\n const textLabel = new Label({\n text: options?.text ?? \"GET READY\",\n fontSize: options?.textFontSize ?? 50,\n fontName: options?.textFontName,\n fontColor: options?.textFontColor,\n layout: {\n marginTop: options?.textMarginTop ?? 32,\n constraints: {\n topToBottomOf: timerShape,\n startToStartOf: this,\n endToEndOf: this,\n },\n },\n });\n this.addChild(textLabel);\n\n const countdownSequence = new Array<Action>();\n\n for (let i = timerInitialNumber - 1; i > 0; i--) {\n countdownSequence.push(Action.wait({ duration: 1000 }));\n countdownSequence.push(\n Action.custom({\n callback: () => {\n timerNumberLabel.text = i.toString();\n },\n }),\n );\n }\n\n countdownSequence.push(Action.wait({ duration: 1000 }));\n countdownSequence.push(\n Action.custom({\n callback: () => {\n timerNumberLabel.text = options?.zeroString ?? \"0\";\n },\n }),\n );\n if (options?.zeroDwellMilliseconds !== undefined) {\n countdownSequence.push(\n Action.wait({ duration: options.zeroDwellMilliseconds }),\n );\n }\n\n countdownSequence.push(\n Action.custom({\n callback: () => {\n const game = this.game;\n const isLastScene =\n game.scenes.indexOf(this) === game.scenes.length - 1;\n if (isLastScene) {\n game.end();\n }\n const nextScene = game.scenes[game.scenes.indexOf(this) + 1];\n game.presentScene(\n nextScene,\n options?.transition ??\n Transition.slide({\n direction: TransitionDirection.Left,\n duration:\n options?.transitionDurationMilliseconds ??\n SCENE_TRANSITION_DURATION_MS,\n easing: SCENE_TRANSITION_EASING,\n }),\n );\n },\n }),\n );\n\n this.onSetup(() => {\n /**\n * Set the timer number label to the initial number. This must be done\n * in onSetup() in case the scene is presented more than once.\n */\n timerNumberLabel.text = timerInitialNumber.toString();\n });\n\n this.onAppear(() => {\n this.run(Action.sequence(countdownSequence));\n });\n }\n}\n","import {\n M2NodeEvent,\n CompositeOptions,\n RgbaColor,\n Size,\n Composite,\n WebColors,\n Sprite,\n CallbackOptions,\n M2NodeEventListener,\n M2EventType,\n Shape,\n Point,\n Label,\n TapEvent,\n IDrawable,\n Timer,\n CompositeEvent,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface LocalePickerOptions extends CompositeOptions {\n /** Background color of dialog box. Default is WebColors.White */\n backgroundColor?: RgbaColor;\n /** Locales to choose from in the dialog box. Default is the locales in the game's `Translation`. */\n localeOptions?: Array<LocaleOption>;\n /** What to show as the currently selected locale in the picker. Default is the game's current locale. */\n currentLocale?: string;\n /** Alpha level for the overlay that dims the scene underneath the dialog box. Default is .5 */\n overlayAlpha?: number;\n /** Size of dialog box. Default is automatically sized to fit the number of locale options. */\n size?: Size;\n /** Corner radius of dialog box; can be used to make rounded corners */\n cornerRadius?: number;\n /** Font size of locale options in dialog box. Default is 24. */\n fontSize?: number;\n /** Font color of locale options in dialog box. Default is WebColors.Black */\n fontColor?: RgbaColor;\n /** Image to use for LocalePicker. Default is a globe SVG, 32x32. */\n icon?: LocalePickerIcon;\n /** Position of the LocalePicker icon. Default is &#123; x: 32, y: 32 &#125; */\n iconPosition: Point;\n /** Should the selection in the LocalePicker automatically switch the game's locale? Default is true. */\n automaticallyChangeLocale?: boolean;\n}\n\nexport interface LocalePickerIcon {\n /** The HTML SVG tag, in string form, that will be rendered to display the locale.\n * Must begin with &#60;svg> and end with &#60;/svg> */\n svgString?: string;\n /** Name of image to use for LocalePicker. Must have been previously loaded */\n imageName?: string;\n /** Height to scale image to */\n height: number;\n /** Width to scale image to */\n width: number;\n}\n\nexport interface LocaleOption {\n /** Human-readable text description of the locale. */\n text: string;\n /** SVG of the locale. */\n svg?: LocaleSvg;\n /** Locale in language-country format, xx-YY. */\n locale: string;\n}\n\nexport interface LocalePickerResult {\n /** Locale that was selected. Is undefined if dialog was dismissed. */\n locale?: string;\n}\n\nexport interface LocalePickerEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"LocalePicker\";\n compositeEventType: \"LocalePickerResult\";\n result: LocalePickerResult;\n}\n\ninterface LocaleSvg {\n /** The HTML SVG tag, in string form, that will be rendered to display the locale.\n * Must begin with &#60;svg> and end with &#60;/svg> */\n svgString: string;\n /** Height to scale image to */\n height: number;\n /** Width to scale image to */\n width: number;\n}\n\nexport class LocalePicker extends Composite {\n readonly compositeType = \"LocalePicker\";\n private readonly DEFAULT_FONT_SIZE = 24;\n automaticallyChangeLocale = true;\n private _localeOptions = new Array<LocaleOption>();\n private _backgroundColor = WebColors.White;\n private _fontSize = this.DEFAULT_FONT_SIZE;\n private _fontColor = WebColors.Black;\n private _currentLocale?: string;\n private _cornerRadius = 8;\n private _overlayAlpha = 0.5;\n private _icon: LocalePickerIcon = {\n // public domain SVG from https://commons.wikimedia.org/wiki/File:Globe_icon.svg\n svgString: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"420\" height=\"420\" stroke=\"#000\" fill=\"none\"><path stroke-width=\"26\" d=\"M209 15a195 195 0 1 0 2 0z\"/><path stroke-width=\"18\" d=\"M210 15v390m195-195H15M59 90a260 260 0 0 0 302 0m0 240a260 260 0 0 0-302 0M195 20a250 250 0 0 0 0 382m30 0a250 250 0 0 0 0-382\"/></svg>`,\n height: 32,\n width: 32,\n };\n private _iconPosition: Point = { x: 32, y: 32 };\n private iconSprite?: Sprite;\n /**\n * Wrap displayed locale in double angle quotes if it is the current locale.\n * Note: Although the code editor will allow us to enter almost any\n * unicode character, it will not render correctly if the font does\n * not support the character. Thus, be careful to use characters that\n * are supported by the font. For example, check a page like\n * https://www.fontspace.com/roboto-font-f13281 to see which characters\n * are supported by Roboto Regular, which is often the default font in\n * m2c2kit. Emoji or checkmarks like ✓ are not in Roboto Regular!\n */\n private readonly LEFT_SELECTION_INDICATOR = \"«\";\n private readonly RIGHT_SELECTION_INDICATOR = \"»\";\n\n /**\n * An icon and dialog box for selecting a locale from a list of options.\n *\n * @remarks This composite node is composed of a dialog box that appears\n * when the user taps a globe icon. Typically, the `LocalePicker` will be\n * added as a free node to the game so that it exists independently of\n * the game's scenes. The dialog box contains a list of locales that the\n * user can choose from. By default, this list is populated with the locales\n * in the game's `Translation` object. When the user selects a locale, the\n * dialog box disappears and the locale is set as the game's current locale.\n * The dialog box is automatically sized to fit the number of locale\n * options.\n *\n * @example\n * let localePicker: LocalePicker;\n * if (game.getParameter<boolean>(\"show_locale_picker\")) {\n * localePicker = new LocalePicker();\n * game.addFreeNode(localePicker);\n * }\n *\n * @param options - {@link LocalePickerOptions}\n */\n constructor(options?: LocalePickerOptions) {\n super(options);\n // set zPosition to max value so it is always on top\n this.zPosition = Number.MAX_VALUE;\n\n if (!options) {\n return;\n }\n\n if (options.localeOptions) {\n this.localeOptions = options.localeOptions;\n }\n\n if (options.backgroundColor) {\n this.backgroundColor = options.backgroundColor;\n }\n\n if (options.overlayAlpha !== undefined) {\n this.overlayAlpha = options.overlayAlpha;\n }\n\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n\n if (options.cornerRadius) {\n this.cornerRadius = options.cornerRadius;\n }\n\n if (options.currentLocale !== undefined) {\n this.currentLocale = options.currentLocale;\n }\n\n if (options.icon) {\n this.icon = options.icon;\n }\n\n if (options.automaticallyChangeLocale !== undefined) {\n this.automaticallyChangeLocale = options.automaticallyChangeLocale;\n }\n }\n\n /**\n * Executes a callback when the user selects a locale.\n *\n * @param callback - function to execute\n * @param options - {@link CallbackOptions}\n */\n onResult(\n callback: (localePickerEvent: LocalePickerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<LocalePickerEvent> = {\n type: M2EventType.Composite,\n compositeType: \"LocalePickerResult\",\n nodeUuid: this.uuid,\n callback: callback,\n };\n\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === \"LocalePickerResult\"\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n override initialize(): void {\n if (this.currentLocale === undefined) {\n this.currentLocale = this.game.i18n?.locale;\n }\n\n if (this.localeOptions.length === 0) {\n const locales = Object.keys(this.game.i18n?.translation || {});\n locales\n .filter((locale) => locale !== \"configuration\")\n .forEach((locale) => {\n this.localeOptions.push({\n text: this.game.i18n?.translation[locale].localeName || locale,\n locale: locale,\n svg: this.game.i18n?.translation[locale].localeSvg,\n });\n });\n }\n\n if (this.localeOptions.length === 0) {\n throw new M2Error(\"No locales available for LocalePicker\");\n }\n\n /**\n * Rather than `this.removeAllChildren()`, we remove all children except\n * the icon. Otherwise, the icon will flicker when the dialog is shown.\n */\n this.children\n .filter((child) => child.name !== \"localePickerIcon\")\n .forEach((child) => this.removeChild(child));\n\n // it is OK not to await this.\n this.game.imageManager.loadImages([\n {\n imageName: \"__localePickerIcon\",\n svgString: this.icon.svgString,\n height: this.icon.height,\n width: this.icon.width,\n },\n ]);\n\n if (!this.iconSprite) {\n this.iconSprite = new Sprite({\n // name is how we refer to this sprite, as a node.\n name: \"localePickerIcon\",\n // imageName is the loaded image that we can assign to the sprite\n imageName: \"__localePickerIcon\",\n position: this.iconPosition,\n isUserInteractionEnabled: true,\n });\n this.addChild(this.iconSprite);\n\n /**\n * The `LocalePicker` will be typically be added as a free node to the\n * game so that it exists independently and on top of the game's scenes.\n * Set `handled` to true for all tap and pointer events so that they do\n * not propagate to the scene underneath. Drag and pointer leave/move\n * events are not handled because they would not be relevant once this\n * picker is shown.\n * We will do this (handling of events) for other nodes in this composite\n * that will be tapped.\n */\n this.iconSprite.onTapDown((e) => {\n e.handled = true;\n this.setDialogVisibility(true);\n });\n this.iconSprite.onTapUp((e) => {\n e.handled = true;\n });\n this.iconSprite.onTapUpAny((e) => {\n e.handled = true;\n });\n this.iconSprite.onPointerUp((e) => {\n e.handled = true;\n });\n this.iconSprite.onPointerDown((e) => {\n e.handled = true;\n });\n }\n\n const overlay = new Shape({\n rect: {\n width: m2c2Globals.canvasCssWidth,\n height: m2c2Globals.canvasCssHeight,\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n },\n fillColor: [0, 0, 0, this.overlayAlpha],\n zPosition: -1,\n isUserInteractionEnabled: true,\n hidden: true,\n });\n overlay.onTapUp((e) => {\n e.handled = true;\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter((listener) => listener.type === \"LocalePickerResult\")\n .forEach((listener) => {\n const languagePickerEvent: LocalePickerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"LocalePickerResult\",\n target: this,\n handled: false,\n result: {\n locale: undefined,\n },\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(languagePickerEvent);\n });\n }\n this.setDialogVisibility(false);\n });\n overlay.onTapUpAny((e) => {\n e.handled = true;\n });\n overlay.onTapDown((e) => {\n e.handled = true;\n });\n overlay.onPointerUp((e) => {\n e.handled = true;\n });\n overlay.onPointerDown((e) => {\n e.handled = true;\n });\n this.addChild(overlay);\n\n /**\n * Because the locale options in the dialog box could be a mix of text and\n * SVGs, we cannot use a label that automatically takes care of text\n * placement. We must manually calculate the lineHeight based on the\n * fontSize. With a default fontSize of 24, the lineHeight is 50. If the\n * fontSize is changed, the lineHeight will be scaled based on the\n * fontSize.\n */\n const lineHeight = (this.fontSize / this.DEFAULT_FONT_SIZE) * 50;\n const dialogHeight = this.localeOptions.length * lineHeight;\n const dialogWidth = m2c2Globals.canvasCssWidth / 2;\n\n const sceneCenter: Point = {\n x: m2c2Globals.canvasCssWidth / 2,\n y: m2c2Globals.canvasCssHeight / 2,\n };\n\n const localeDialog = new Shape({\n rect: {\n width: dialogWidth,\n height: dialogHeight,\n x: sceneCenter.x,\n y: sceneCenter.y,\n },\n cornerRadius: this.cornerRadius,\n fillColor: this.backgroundColor,\n isUserInteractionEnabled: true,\n hidden: true,\n });\n localeDialog.onTapDown((e) => {\n e.handled = true;\n });\n localeDialog.onTapUp((e) => {\n e.handled = true;\n });\n localeDialog.onTapUpAny((e) => {\n e.handled = true;\n });\n localeDialog.onPointerUp((e) => {\n e.handled = true;\n });\n localeDialog.onPointerDown((e) => {\n e.handled = true;\n });\n\n this.addChild(localeDialog);\n\n for (let i = 0; i < this.localeOptions.length; i++) {\n const localeOption = this.localeOptions[i];\n\n if (!localeOption.svg) {\n let labelText = localeOption.text;\n if (this.currentLocale === localeOption.locale) {\n labelText = `${this.LEFT_SELECTION_INDICATOR} ${labelText} ${this.RIGHT_SELECTION_INDICATOR}`;\n }\n const text = new Label({\n text: labelText,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n position: {\n x: sceneCenter.x,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n isUserInteractionEnabled: true,\n zPosition: 1,\n hidden: true,\n // do not localize the text of each language option\n localize: false,\n });\n text.onTapUp((e) => {\n e.handled = true;\n this.handleLocaleSelection(e, localeOption);\n });\n text.onTapUpAny((e) => {\n e.handled = true;\n });\n text.onTapDown((e) => {\n e.handled = true;\n });\n text.onPointerUp((e) => {\n e.handled = true;\n });\n text.onPointerDown((e) => {\n e.handled = true;\n });\n this.addChild(text);\n } else {\n // it is OK not to await this.\n this.game.imageManager.loadImages([\n {\n imageName: localeOption.text,\n svgString: localeOption.svg.svgString,\n height: localeOption.svg.height,\n width: localeOption.svg.width,\n },\n ]);\n const localeSprite = new Sprite({\n imageName: localeOption.text,\n position: {\n x: sceneCenter.x,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n isUserInteractionEnabled: true,\n zPosition: 1,\n hidden: true,\n });\n this.addChild(localeSprite);\n\n if (this.currentLocale === localeOption.locale) {\n const leftSelectionIndicator = new Label({\n text: this.LEFT_SELECTION_INDICATOR,\n fontSize: this.fontSize,\n fontColor: this.fontColor,\n /**\n * We subtract half the fontSize from the x position via\n * \"- this.fontSize / 2\" so that the left selection indicator is\n * positioned slightly to the left of the svg text. Half the font\n * size seems to be a good amount to make the left selection\n * indicator appear before the text, and it will scale with font\n * size changes (unlike a hard-coded value).\n */\n position: {\n x: sceneCenter.x - localeOption.svg.width / 2 - this.fontSize / 2,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n hidden: true,\n // do not localize the left selection indicator\n localize: false,\n });\n this.addChild(leftSelectionIndicator);\n const rightSelectionIndicator = new Label({\n text: this.RIGHT_SELECTION_INDICATOR,\n fontSize: this._fontSize,\n fontColor: this.fontColor,\n position: {\n // see above explanation of \"- this.fontSize / 2\"\n x: sceneCenter.x + localeOption.svg.width / 2 + this.fontSize / 2,\n y:\n sceneCenter.y +\n i * lineHeight -\n dialogHeight / 2 +\n lineHeight / 2,\n },\n hidden: true,\n // do not localize the left selection indicator\n localize: false,\n });\n this.addChild(rightSelectionIndicator);\n }\n\n localeSprite.onTapUp((e) => {\n e.handled = true;\n this.handleLocaleSelection(e, localeOption);\n });\n localeSprite.onTapUpAny((e) => {\n e.handled = true;\n });\n localeSprite.onTapDown((e) => {\n e.handled = true;\n });\n localeSprite.onPointerUp((e) => {\n e.handled = true;\n });\n localeSprite.onPointerDown((e) => {\n e.handled = true;\n });\n }\n }\n\n this.needsInitialization = false;\n }\n\n private handleLocaleSelection(e: TapEvent, localeOption: LocaleOption) {\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"LocalePickerResult\" &&\n listener.nodeUuid == this.uuid,\n )\n .forEach((listener) => {\n const languagePickerEvent: LocalePickerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"LocalePickerResult\",\n target: this,\n handled: false,\n result: {\n locale: localeOption.locale,\n },\n timestamp: Timer.now(),\n iso8601Timestamp: new Date().toISOString(),\n };\n listener.callback(languagePickerEvent);\n });\n }\n this.setDialogVisibility(false);\n if (this.automaticallyChangeLocale) {\n this.game.i18n?.switchToLocale(localeOption.locale);\n this.currentLocale = localeOption.locale;\n }\n }\n\n private setDialogVisibility(visible: boolean) {\n this.children\n .filter((child) => child.name !== \"localePickerIcon\")\n .forEach((child) => {\n child.hidden = !visible;\n });\n }\n\n get backgroundColor(): RgbaColor {\n return this._backgroundColor;\n }\n set backgroundColor(backgroundColor: RgbaColor) {\n this._backgroundColor = backgroundColor;\n this.needsInitialization = true;\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n this._fontSize = fontSize;\n this.needsInitialization = true;\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n this._fontColor = fontColor;\n this.needsInitialization = true;\n }\n\n get cornerRadius(): number {\n return this._cornerRadius;\n }\n set cornerRadius(cornerRadius: number) {\n this._cornerRadius = cornerRadius;\n this.needsInitialization = true;\n }\n\n get overlayAlpha(): number {\n return this._overlayAlpha;\n }\n set overlayAlpha(alpha: number) {\n this._overlayAlpha = alpha;\n this.needsInitialization = true;\n }\n\n get icon(): LocalePickerIcon {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const localePicker = this;\n /**\n * We return an object with getters and setters for the icon properties\n * so that we can update the icon and trigger a re-initialization of the\n * LocalePicker if icon properties are changed.\n */\n return {\n get svgString(): string | undefined {\n return localePicker._icon.svgString;\n },\n set svgString(svgString: string) {\n localePicker._icon.svgString = svgString;\n localePicker.needsInitialization = true;\n },\n get imageName(): string | undefined {\n return localePicker._icon.imageName;\n },\n set imageName(imageName: string) {\n localePicker._icon.imageName = imageName;\n localePicker.needsInitialization = true;\n },\n get height(): number {\n return localePicker._icon.height;\n },\n set height(height: number) {\n localePicker._icon.height = height;\n localePicker.needsInitialization = true;\n },\n get width(): number {\n return localePicker._icon.width;\n },\n set width(width: number) {\n localePicker._icon.width = width;\n localePicker.needsInitialization = true;\n },\n };\n }\n set icon(icon: LocalePickerIcon) {\n this._icon = icon;\n this.needsInitialization = true;\n }\n\n get iconPosition(): Point {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const localePicker = this;\n return {\n get x(): number {\n return localePicker._iconPosition.x;\n },\n set x(x: number) {\n localePicker._iconPosition.x = x;\n if (localePicker.iconSprite) {\n localePicker.iconSprite.position = localePicker._iconPosition;\n }\n localePicker.needsInitialization = true;\n },\n get y(): number {\n return localePicker._iconPosition.y;\n },\n set y(y: number) {\n localePicker._iconPosition.y = y;\n if (localePicker.iconSprite) {\n localePicker.iconSprite.position = localePicker._iconPosition;\n }\n localePicker.needsInitialization = true;\n },\n };\n }\n set iconPosition(position: Point) {\n this._iconPosition = position;\n if (this.iconSprite) {\n this.iconSprite.position = position;\n }\n this.needsInitialization = true;\n }\n\n get localeOptions(): Array<LocaleOption> {\n return this._localeOptions;\n }\n\n set localeOptions(options: Array<LocaleOption>) {\n this._localeOptions = options;\n this.needsInitialization = true;\n }\n\n get currentLocale(): string | undefined {\n return this._currentLocale;\n }\n set currentLocale(locale: string | undefined) {\n if (locale === this.currentLocale) {\n return;\n }\n this._currentLocale = locale;\n this.needsInitialization = true;\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n override duplicate(newName?: string): LocalePicker {\n throw new M2Error(`duplicate not implemented. ${newName}`);\n }\n}\n","import { Canvas } from \"canvaskit-wasm\";\nimport {\n WebColors,\n Composite,\n CompositeOptions,\n Shape,\n Label,\n RgbaColor,\n IDrawable,\n Equal,\n M2c2KitHelpers,\n M2NodeConstructor,\n Action,\n CompositeEvent,\n CallbackOptions,\n M2NodeEventListener,\n M2EventType,\n M2NodeEvent,\n M2Error,\n} from \"@m2c2kit/core\";\n\nexport interface CountdownTimerOptions extends CompositeOptions {\n /** Duration of the countdown, in milliseconds. Must be multiple of 1000. Default is 3000. */\n milliseconds?: number;\n /** Duration of each tick interval, in milliseconds. Default is 1000. */\n tickIntervalMilliseconds?: number;\n /** Font name for timer text (numbers). */\n fontName?: string;\n /** Font size for timer text (numbers). Default is 50. */\n fontSize?: number;\n /** Font size for timer text (numbers). Default is white. */\n fontColor?: RgbaColor;\n /** String to show when the timer reaches zero. Default is \"0\". This could be changed to another value, such as \"GO!\" */\n zeroString?: string;\n /** Shape of the timer. Default is a Royal Blue circle with a radius of 100. */\n timerShape?: TimerShape;\n /** Default is to center the timer text (numbers) vertically within the timer shape (verticalBias = .5). Setting verticalBias less than .5 will pull the text towards the top of the timer shape. Setting verticalBias greater than .5 will pull the text towards the bottom of the timer shape. */\n textVerticalBias?: number;\n}\n\nexport interface TimerShape {\n circle?: {\n /** Radius of the circle timer shape. */\n radius: number;\n };\n rectangle?: {\n /** Width of the rectangle timer shape. */\n width: number;\n /** Height of the rectangle timer shape. */\n height: number;\n /** Corner radius of the rectangle timer shape. Default is 0. */\n cornerRadius?: number;\n };\n /** Color of the timer shape. Default is Royal Blue. */\n fillColor?: RgbaColor;\n}\n\nexport interface CountdownTimerEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"CountdownTimer\";\n compositeEventType: \"CountdownTimerTick\" | \"CountdownTimerComplete\";\n millisecondsRemaining: number;\n target: CountdownTimer | string;\n}\n\nexport class CountdownTimer extends Composite implements CountdownTimerOptions {\n readonly compositeType = \"CountdownTimer\";\n private originalOptions: CountdownTimerOptions;\n private _milliseconds = 3000;\n private _tickIntervalMilliseconds = 1000;\n private _fontName: string | undefined;\n private _fontSize = 50;\n private _fontColor = WebColors.White;\n private _zeroString = \"0\";\n private _timerShape: TimerShape = {\n circle: {\n radius: 100,\n },\n fillColor: WebColors.RoyalBlue,\n };\n private _textVerticalBias = 0.5;\n private countdownSequence = new Array<Action>();\n private timerShapeNode?: Shape;\n private timerNumberLabel?: Label;\n private _isRunning = false;\n private hasStopped = false;\n\n /**\n * A countdown timer displays a number that counts down to zero.\n *\n * @param options\n */\n constructor(options: CountdownTimerOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n if (options.milliseconds) {\n this.milliseconds = options.milliseconds;\n }\n\n if (options.tickIntervalMilliseconds) {\n this.tickIntervalMilliseconds = options.tickIntervalMilliseconds;\n }\n\n if (options.fontName) {\n this.fontName = options.fontName;\n }\n\n if (options.fontSize !== undefined) {\n this.fontSize = options.fontSize;\n }\n\n if (options.fontColor) {\n this.fontColor = options.fontColor;\n }\n\n if (options.zeroString !== undefined) {\n this.zeroString = options.zeroString;\n }\n\n if (options.timerShape) {\n this.timerShape = options.timerShape;\n }\n\n if (options.textVerticalBias !== undefined) {\n this.textVerticalBias = options.textVerticalBias;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n this._isRunning = false;\n this.hasStopped = false;\n\n if (\n (this.timerShape?.circle === undefined &&\n this.timerShape?.rectangle === undefined) ||\n this.timerShape?.circle !== undefined\n ) {\n this.timerShapeNode = new Shape({\n circleOfRadius: this.timerShape.circle?.radius ?? 100,\n fillColor: this.timerShape?.fillColor ?? WebColors.RoyalBlue,\n suppressEvents: true,\n });\n this.addChild(this.timerShapeNode);\n } else if (this.timerShape?.rectangle !== undefined) {\n this.timerShapeNode = new Shape({\n rect: {\n width: this.timerShape?.rectangle?.width ?? 200,\n height: this.timerShape?.rectangle?.height ?? 200,\n },\n cornerRadius: this.timerShape?.rectangle?.cornerRadius,\n fillColor: this.timerShape?.fillColor ?? WebColors.RoyalBlue,\n suppressEvents: true,\n });\n this.addChild(this.timerShapeNode);\n } else {\n throw new M2Error(\"Invalid timer shape options.\");\n }\n\n this.size = this.timerShapeNode.size;\n if (this.milliseconds % 1000 !== 0) {\n throw new M2Error(\n \"CountdownTimer milliseconds must be a multiple of 1000.\",\n );\n }\n const timerInitialNumber = Math.floor(this.milliseconds / 1000);\n\n this.timerNumberLabel = new Label({\n text: timerInitialNumber.toString(),\n fontSize: this.fontSize,\n fontName: this._fontName,\n fontColor: this.fontColor,\n layout: {\n constraints: {\n topToTopOf: this.timerShapeNode,\n bottomToBottomOf: this.timerShapeNode,\n startToStartOf: this.timerShapeNode,\n endToEndOf: this.timerShapeNode,\n verticalBias: this.textVerticalBias,\n },\n },\n suppressEvents: true,\n });\n this.timerShapeNode.addChild(this.timerNumberLabel);\n\n this.countdownSequence = new Array<Action>();\n\n for (\n let i = this.milliseconds;\n i > this.tickIntervalMilliseconds;\n i = i - this.tickIntervalMilliseconds\n ) {\n this.countdownSequence.push(\n Action.wait({ duration: this.tickIntervalMilliseconds }),\n );\n this.countdownSequence.push(\n Action.custom({\n callback: () => {\n this.tick(i - this.tickIntervalMilliseconds);\n },\n }),\n );\n }\n\n this.countdownSequence.push(\n Action.wait({ duration: this.tickIntervalMilliseconds }),\n );\n this.countdownSequence.push(\n Action.custom({\n callback: () => {\n this.tick(0);\n const countdownTimerEvent: CountdownTimerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"CountdownTimerComplete\",\n target: this,\n handled: false,\n millisecondsRemaining: 0,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(countdownTimerEvent);\n this.saveEvent(countdownTimerEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"CountdownTimer\" &&\n listener.compositeEventType === \"CountdownTimerComplete\",\n )\n .forEach((listener) => {\n listener.callback(countdownTimerEvent);\n });\n }\n },\n }),\n );\n\n this.needsInitialization = false;\n }\n\n private tick(millisecondsRemaining: number) {\n const countdownTimerEvent: CountdownTimerEvent = {\n type: M2EventType.Composite,\n compositeType: this.compositeType,\n compositeEventType: \"CountdownTimerTick\",\n target: this,\n handled: false,\n millisecondsRemaining: millisecondsRemaining,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(countdownTimerEvent);\n this.saveEvent(countdownTimerEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === \"CountdownTimer\" &&\n listener.compositeEventType === \"CountdownTimerTick\",\n )\n .forEach((listener) => {\n listener.callback(countdownTimerEvent);\n });\n }\n }\n\n /**\n * Starts the countdown timer.\n *\n * @remarks Calling `start()` on a timer whose state is running (already started)\n * or stopped will raise an error.\n */\n start() {\n if (this.isRunning) {\n throw new M2Error(\"CountdownTimer: cannot start. It is already running.\");\n }\n if (this.hasStopped) {\n throw new M2Error(\n \"CountdownTimer: It has stopped. You cannot start a stopped CountdownTimer. Instead, create a new CountdownTimer or call CountdownTimer.reset() before starting.\",\n );\n }\n /**\n * If the user calls start() and the timer has not yet been initialized as\n * part of the composite lifecycle, then initialize it.\n */\n if (this.needsInitialization) {\n this.initialize();\n }\n this.run(\n Action.sequence(this.countdownSequence),\n \"__countdownSequenceAction\",\n );\n this._isRunning = true;\n }\n\n /**\n * Stops the countdown timer.\n *\n * @remarks This method is idempotent. Calling `stop()` on a stopped timer\n * has no effect and will not raise an error. This can be called on a\n * CountdownTimer in any state.\n */\n stop() {\n if (this.isRunning) {\n this.removeAction(\"__countdownSequenceAction\");\n this._isRunning = false;\n this.hasStopped = true;\n }\n }\n\n /**\n * Resets the countdown timer to its initial state so it can be started\n * again.\n *\n * @remarks This method is idempotent. Calling reset() multiple times will\n * not raise an error. This can be called on a CountdownTimer in any state.\n */\n reset() {\n this.stop();\n this.initialize();\n }\n\n /**\n * Returns true if the countdown timer is running.\n */\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n override handleCompositeEvent(event: CountdownTimerEvent): void {\n if (!this.timerNumberLabel) {\n throw new M2Error(\"Timer number label not found.\");\n }\n\n switch (event.compositeEventType) {\n case \"CountdownTimerTick\": {\n this.timerNumberLabel.text = Math.ceil(\n event.millisecondsRemaining / 1000,\n ).toString();\n break;\n }\n case \"CountdownTimerComplete\": {\n this.timerNumberLabel.text = this.zeroString;\n break;\n }\n default:\n throw new M2Error(\n `Invalid TimerCountdown event type: ${event.compositeEventType}`,\n );\n }\n }\n\n /**\n * Executes a callback when the timer ticks.\n *\n * @remarks The callback is also executed when the timer completes.\n *\n * @param callback - function to execute\n * @param options\n */\n onTick(\n callback: (countdownTimerEvent: CountdownTimerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<CountdownTimerEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"CountdownTimerTick\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addCountdownTimerEventListener(eventListener, options);\n }\n\n /**\n * Executes a callback when the timer completes.\n *\n * @remarks This is the last tick of the timer.\n *\n * @param callback - function to execute.\n * @param options\n */\n onComplete(\n callback: (countdownTimerEvent: CountdownTimerEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<CountdownTimerEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"CountdownTimerComplete\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addCountdownTimerEventListener(eventListener, options);\n }\n\n private addCountdownTimerEventListener(\n eventListener: M2NodeEventListener<CountdownTimerEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n get milliseconds(): number {\n return this._milliseconds;\n }\n set milliseconds(milliseconds: number) {\n if (Equal.value(this._milliseconds, milliseconds)) {\n return;\n }\n this._milliseconds = milliseconds;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"milliseconds\", milliseconds);\n }\n\n get tickIntervalMilliseconds(): number {\n return this._tickIntervalMilliseconds;\n }\n set tickIntervalMilliseconds(tickIntervalMilliseconds: number) {\n if (Equal.value(this._tickIntervalMilliseconds, tickIntervalMilliseconds)) {\n return;\n }\n this._tickIntervalMilliseconds = tickIntervalMilliseconds;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\n \"tickIntervalMilliseconds\",\n tickIntervalMilliseconds,\n );\n }\n\n get fontColor(): RgbaColor {\n return this._fontColor;\n }\n set fontColor(fontColor: RgbaColor) {\n if (Equal.value(this._fontColor, fontColor)) {\n return;\n }\n this._fontColor = fontColor;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontColor\", fontColor);\n }\n\n get fontName(): string | undefined {\n return this._fontName;\n }\n set fontName(fontName: string | undefined) {\n if (this._fontName === fontName) {\n return;\n }\n this._fontName = fontName;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontName\", fontName);\n }\n\n get fontSize(): number {\n return this._fontSize;\n }\n set fontSize(fontSize: number) {\n if (Equal.value(this._fontSize, fontSize)) {\n return;\n }\n this._fontSize = fontSize;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"fontSize\", fontSize);\n }\n\n get zeroString(): string {\n return this._zeroString;\n }\n set zeroString(zeroString: string) {\n if (this._zeroString === zeroString) {\n return;\n }\n this._zeroString = zeroString;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"zeroString\", zeroString);\n }\n\n get timerShape(): TimerShape {\n return this._timerShape;\n }\n set timerShape(shape: TimerShape) {\n if (Equal.value(this._timerShape as object, shape as object)) {\n return;\n }\n this._timerShape = shape;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"timerShape\", shape);\n }\n\n get textVerticalBias(): number {\n return this._textVerticalBias;\n }\n set textVerticalBias(textVerticalBias: number) {\n if (Equal.value(this._textVerticalBias, textVerticalBias)) {\n return;\n }\n this._textVerticalBias = textVerticalBias;\n this.needsInitialization = true;\n this.savePropertyChangeEvent(\"textVerticalBias\", textVerticalBias);\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n duplicate(newName?: string | undefined): CountdownTimer {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n\nM2c2KitHelpers.registerM2NodeClass(\n CountdownTimer as unknown as M2NodeConstructor,\n);\n","import {\n WebColors,\n Label,\n Shape,\n Composite,\n IDrawable,\n CompositeOptions,\n Size,\n RgbaColor,\n CompositeEvent,\n M2NodeEventListener,\n CallbackOptions,\n M2NodeEvent,\n M2EventType,\n M2c2KitHelpers,\n M2Error,\n} from \"@m2c2kit/core\";\nimport { Canvas } from \"canvaskit-wasm\";\n\nexport interface SliderOptions extends CompositeOptions {\n /** The size of the track that the thumb moves along. */\n trackSize?: Size;\n /** The color of the track. */\n trackColor?: RgbaColor;\n /** The size of the thumb that the user drags. */\n thumbSize?: Size;\n /** The color of the thumb. */\n thumbColor?: RgbaColor;\n /** The minimum value of the slider. */\n min?: number;\n /** The maximum value of the slider. */\n max?: number;\n /** The initial value of the slider. */\n value?: number;\n}\n\nexport interface SliderEvent extends CompositeEvent {\n type: \"Composite\";\n compositeType: \"Slider\";\n compositeEventType: \"SliderValueChanged\";\n target: Slider | string;\n value: number;\n}\n\nexport class Slider extends Composite implements SliderOptions {\n readonly compositeType = \"Slider\";\n private originalOptions: SliderOptions;\n private _trackSize: Size = { width: 250, height: 10 };\n private _trackColor: RgbaColor = WebColors.Black;\n private _thumbSize: Size = { width: 20, height: 40 };\n private _thumbColor: RgbaColor = WebColors.DarkGray;\n private _min: number = 0;\n private _max: number = 100;\n private _value = (this.max - this.min) / 2;\n private thumbLabel?: Label;\n private _thumbShape?: Shape;\n\n private get thumbShape() {\n if (this._thumbShape === undefined) {\n throw new M2Error(\"thumbShape is not defined.\");\n }\n return this._thumbShape;\n }\n private set thumbShape(value: Shape) {\n this._thumbShape = value;\n }\n\n /**\n * A slider to select a value from a range by dragging a thumb along a track.\n *\n * @experimental Slider is a work in progress and will change in future versions.\n *\n * @param options - {@link SliderOptions}\n */\n constructor(options: SliderOptions) {\n super(options);\n this.originalOptions = JSON.parse(JSON.stringify(options));\n\n if (options.trackSize) {\n this.trackSize = options.trackSize;\n }\n if (options.trackColor) {\n this.trackColor = options.trackColor;\n }\n if (options.thumbSize) {\n this.thumbSize = options.thumbSize;\n }\n if (options.thumbColor) {\n this.thumbColor = options.thumbColor;\n }\n if (options.min !== undefined) {\n this.min = options.min;\n }\n if (options.max !== undefined) {\n this.max = options.max;\n }\n if (options.value !== undefined) {\n this.value = options.value;\n }\n\n this.saveNodeNewEvent();\n }\n\n override get completeNodeOptions() {\n return {\n ...this.options,\n ...this.getNodeOptions(),\n ...this.getDrawableOptions(),\n ...this.originalOptions,\n };\n }\n\n override initialize(): void {\n this.removeAllChildren();\n\n const trackShape = new Shape({\n rect: {\n width: this.trackSize.width,\n height: this.trackSize.height,\n },\n cornerRadius: 8,\n fillColor: this.trackColor,\n });\n this.addChild(trackShape);\n\n this.thumbShape = new Shape({\n rect: {\n width: this.thumbSize.width,\n height: this.thumbSize.height,\n },\n cornerRadius: 8,\n fillColor: this.thumbColor,\n isUserInteractionEnabled: true,\n draggable: true,\n zPosition: 1,\n position: {\n x:\n (this.value * this.trackSize.width) / (this.max - this.min) -\n this.trackSize.width / 2,\n y: 0,\n },\n });\n trackShape.addChild(this.thumbShape);\n\n const trackZoneShape = new Shape({\n rect: {\n width: this.trackSize.width,\n height: this.thumbSize.height,\n },\n // during development, it is useful to make this visible\n // fillColor: WebColors.Red,\n // alpha: 0.05,\n alpha: 0,\n isUserInteractionEnabled: true,\n zPosition: 0,\n });\n trackShape.addChild(trackZoneShape);\n trackZoneShape.onTapDown((e) => {\n // console.log(\"trackZoneShape.onTapDown\", e.point.x);\n this.thumbShape.position.x = e.point.x - trackShape.size.width / 2;\n this.updateThumbLabel();\n });\n\n const thumbZoneShape = new Shape({\n rect: {\n width: this.trackSize.width,\n /**\n * The thumbZoneShape is twice the height of the parent scene in case\n * the slider is placed at the bottom or top of the screen. This\n * ensures that thumbZoneShape is large enough to capture pointer\n * events that are outside the bounds of the slider and on the parent\n * scene.\n */\n height: this.parentSceneAsNode.size.height * 2,\n },\n // during development, it is useful to make this visible\n // fillColor: WebColors.Black,\n // alpha: 0.008,\n alpha: 0,\n isUserInteractionEnabled: true,\n });\n this.addChild(thumbZoneShape);\n thumbZoneShape.onPointerMove(() => {\n this.thumbShape.draggable = true;\n });\n thumbZoneShape.onPointerLeave(() => {\n this.thumbShape.draggable = false;\n });\n\n this.thumbShape.onTapDown((e) => {\n /**\n * handled is set to true to prevent the tap event from being\n * propagated to the parent trackShape, which would cause the\n * thumb to jump to the tap location.\n */\n e.handled = true;\n\n if (e.point.y !== 0) {\n this.thumbShape.position.y = 0;\n }\n if (e.point.x < -this.trackSize.width / 2) {\n this.thumbShape.position.x = -this.trackSize.width / 2;\n }\n if (e.point.x > this.trackSize.width / 2) {\n this.thumbShape.position.x = this.trackSize.width / 2;\n }\n this.updateThumbLabel();\n });\n\n this.thumbShape.onDrag((e) => {\n if (e.position.y !== 0) {\n this.thumbShape.position.y = 0;\n }\n if (e.position.x < -this.trackSize.width / 2) {\n this.thumbShape.position.x = -this.trackSize.width / 2;\n }\n if (e.position.x > this.trackSize.width / 2) {\n this.thumbShape.position.x = this.trackSize.width / 2;\n }\n this.updateThumbLabel();\n });\n\n this.thumbShape.onDragEnd(() => {\n const value = Math.round(\n ((this.thumbShape.position.x + this.trackSize.width / 2) /\n this.trackSize.width) *\n (this.max - this.min),\n );\n this.thumbShape.position.x =\n (value / (this.max - this.min)) * this.trackSize.width -\n this.trackSize.width / 2;\n this.updateThumbLabel();\n });\n\n this.needsInitialization = false;\n }\n\n updateThumbLabel() {\n const value =\n ((this.thumbShape.position.x + this.trackSize.width / 2) /\n this.trackSize.width) *\n (this.max - this.min);\n if (!this.thumbLabel) {\n this.thumbLabel = new Label({\n text: value.toString(),\n });\n this.addChild(this.thumbLabel);\n }\n this.thumbLabel.text = Math.round(value).toString();\n this.thumbLabel.position = {\n x: this.thumbShape.position.x,\n y: this.thumbShape.position.y - 30,\n };\n\n if (this.thumbLabel) {\n this.thumbLabel.position = {\n x: this.thumbShape.position.x,\n y: this.thumbShape.position.y - 30,\n };\n }\n\n const sliderEvent: SliderEvent = {\n type: M2EventType.Composite,\n compositeType: \"Slider\",\n compositeEventType: \"SliderValueChanged\",\n target: this,\n value: value,\n ...M2c2KitHelpers.createTimestamps(),\n };\n this.handleCompositeEvent(sliderEvent);\n this.saveEvent(sliderEvent);\n if (this.eventListeners.length > 0) {\n this.eventListeners\n .filter(\n (listener) =>\n listener.type === M2EventType.Composite &&\n listener.compositeType === this.compositeType &&\n listener.compositeEventType === \"SliderValueChanged\",\n )\n .forEach((listener) => {\n listener.callback(sliderEvent);\n });\n }\n }\n\n /**\n * Executes a callback when the slider value changes.\n *\n * @param callback - function to execute\n * @param options\n */\n onValueChanged(\n callback: (sliderEvent: SliderEvent) => void,\n options?: CallbackOptions,\n ): void {\n const eventListener: M2NodeEventListener<SliderEvent> = {\n type: M2EventType.Composite,\n compositeEventType: \"SliderValueChanged\",\n compositeType: this.compositeType,\n nodeUuid: this.uuid,\n callback: <(ev: M2NodeEvent) => void>callback,\n };\n\n this.addSliderEventListener(eventListener, options);\n }\n\n private addSliderEventListener(\n eventListener: M2NodeEventListener<SliderEvent>,\n options?: CallbackOptions,\n ) {\n if (options?.replaceExisting) {\n this.eventListeners = this.eventListeners.filter(\n (listener) =>\n !(\n listener.nodeUuid === eventListener.nodeUuid &&\n listener.type === eventListener.type &&\n listener.compositeType === eventListener.compositeType\n ),\n );\n }\n this.eventListeners.push(eventListener as M2NodeEventListener<M2NodeEvent>);\n }\n\n get trackSize(): Size {\n return this._trackSize;\n }\n set trackSize(value: Size) {\n this._trackSize = value;\n }\n\n get trackColor(): RgbaColor {\n return this._trackColor;\n }\n set trackColor(value: RgbaColor) {\n this._trackColor = value;\n }\n\n get thumbSize(): Size {\n return this._thumbSize;\n }\n set thumbSize(value: Size) {\n this._thumbSize = value;\n }\n\n get thumbColor(): RgbaColor {\n return this._thumbColor;\n }\n set thumbColor(value: RgbaColor) {\n this._thumbColor = value;\n }\n\n get value(): number {\n return this._value;\n }\n set value(value: number) {\n this._value = value;\n }\n\n get min(): number {\n return this._min;\n }\n set min(value: number) {\n this._min = value;\n }\n\n get max(): number {\n return this._max;\n }\n set max(value: number) {\n this._max = value;\n }\n\n /**\n * Duplicates a node using deep copy.\n *\n * @remarks This is a deep recursive clone (node and children).\n * The uuid property of all duplicated nodes will be newly created,\n * because uuid must be unique.\n *\n * @param newName - optional name of the new, duplicated node. If not\n * provided, name will be the new uuid\n */\n duplicate(newName?: string | undefined): Slider {\n throw new M2Error(`Method not implemented. ${newName}`);\n }\n\n update(): void {\n super.update();\n }\n\n draw(canvas: Canvas): void {\n super.drawChildren(canvas);\n }\n\n warmup(canvas: Canvas): void {\n this.initialize();\n this.children\n .filter((child) => child.isDrawable)\n .forEach((child) => {\n (child as unknown as IDrawable).warmup(canvas);\n });\n }\n}\n","export * from \"./composites/grid\";\nexport * from \"./composites/button\";\nexport * from \"./composites/dialog\";\nexport * from \"./composites/draw-pad\";\nexport * from \"./composites/virtual-keyboard\";\nexport * from \"./stories/instructions\";\nexport * from \"./scenes/countdown-scene\";\nexport * from \"./composites/locale-picker\";\nexport * from \"./composites/countdown-timer\";\nexport * from \"./composites/slider\";\n\nconsole.log(\"⚪ @m2c2kit/addons version __PACKAGE_JSON_VERSION__\");\n"],"names":["DialogResult","key","keyboard","SCENE_TRANSITION_EASING"],"mappings":"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"}