{"id":3233,"date":"2022-11-25T14:30:20","date_gmt":"2022-11-25T14:30:20","guid":{"rendered":"https:\/\/www.bohort.nl\/?p=3233"},"modified":"2023-05-10T14:40:22","modified_gmt":"2023-05-10T14:40:22","slug":"creating-a-drawingpad-oracle-jet-vcomponent","status":"publish","type":"post","link":"https:\/\/www.bohort.nl\/en\/2022\/11\/25\/creating-a-drawingpad-oracle-jet-vcomponent\/","title":{"rendered":"Creating a DrawingPad Oracle JET VComponent"},"content":{"rendered":"<h4 class=\"wp-block-heading\">Introduction<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle JavaScript Extension Toolkit (Oracle JET) empowers developers to build efficient and responsive web applications. It leverages the Virtual DOM (VDOM) architecture, which allows for the creation of VComponents. In this post, I will guide you through the process of creating a VComponent in Oracle JET that includes a drawing pad.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Prerequisites<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure that you have Node.js and npm installed on your computer and that you have installed Oracle JET CLI globally. You should also have an Oracle JET application set up and ready for development.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Create a new VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to your Oracle JET application&#8217;s root folder and create a new VComponent using the Oracle JET CLI command: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">npx @oracle\/ojet-cli create component drawingpad-component&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Define the VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Now, let&#8217;s define the structure of our drawing pad VComponent. Open the <code>drawingPad-component.tsx<\/code> file and define the component using JSX syntax. Here is the entire code for the drawing pad component. Obviously  you can modify to suit your needs, but you can also just copy the code below and paste it :<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" style=\"font-size:.875rem;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:16.859375px;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { customElement, ExtendGlobalProps } from &quot;ojs\/ojvcomponent&quot;;import &quot;ojs\/ojbutton&quot;;import { h, Component, ComponentChild } from &quot;preact&quot;;import componentStrings = require(&quot;ojL10n!.\/resources\/nls\/drawingpad-component-strings&quot;);import &quot;css!.\/drawingpad-component-styles.css&quot;;type Props = {  footerText?: string;}type State = {  drawing: boolean  context?: CanvasRenderingContext2D;};\/** *  * @ojmetadata version &quot;1.0.0&quot; * @ojmetadata displayName &quot;A user friendly, translatable name of the component&quot; * @ojmetadata description &quot;A translatable high-level description for the component&quot;*\/@customElement(&quot;drawingpad-component&quot;)export class DrawingpadComponent extends Component &lt; ExtendGlobalProps &lt; Props &gt;, State&gt; {  private canvasRef: any = null;constructor(props: Readonly&lt;{}&gt;) {  super(props);  this.state = { drawing: false };} render(props: Props, state: State): ComponentChild {  return (    &lt;div&gt;    &lt;canvas width={500} height={500}      ref={(ref) =&gt; (this.canvasRef = ref)}      onMouseDown={this.handleMouseDown}      onMouseUp={this.handleMouseUp}      onMouseMove={this.handleMouseMove}    \/&gt;    &lt;oj-button  onojAction={this.clearCanvas}&gt;Clear&lt;\/oj-button&gt;&lt;\/div&gt;  );  }  componentDidMount() {  this.setState({    context: this.canvasRef.getContext('2d'),    drawing: false  });}private clearCanvas = () =&gt; {  const context = this.state.context;  if (context) {    context.clearRect(0, 0, this.canvasRef.width, this.canvasRef.height);  }};private handleMouseDown = (event: MouseEvent) =&gt; {  const rect = this.canvasRef.getBoundingClientRect();  const x = event.clientX - rect.left;  const y = event.clientY - rect.top;  this.setState({ drawing: true });  const context = this.state.context;  if (context) {    context.beginPath();    context.moveTo(x, y);  }};private handleMouseUp = (event: MouseEvent) =&gt; {  this.setState({ drawing: false });};private handleMouseMove = (event: MouseEvent) =&gt; {  if (!this.state.drawing) return;  const rect = this.canvasRef.getBoundingClientRect();  this.draw(event.clientX - rect.left, event.clientY - rect.top);};draw(x: number, y: number) {  const context = this.state.context;  if (context &amp;&amp; this.state.drawing) {    context.lineTo(x, y);    context.stroke();  }}}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">customElement<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">ExtendGlobalProps<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ojs\/ojvcomponent&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ojs\/ojbutton&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">Component<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">ComponentChild<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;preact&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">componentStrings<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">require<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;ojL10n!.\/resources\/nls\/drawingpad-component-strings&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;css!.\/drawingpad-component-styles.css&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">footerText<\/span><span style=\"color: #D4D4D4\">?: <\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\"> = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">drawing<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">?: <\/span><span style=\"color: #4EC9B0\">CanvasRenderingContext2D<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> version &quot;1.0.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> displayName &quot;A user friendly, translatable name of the component&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * <\/span><span style=\"color: #569CD6\">@ojmetadata<\/span><span style=\"color: #6A9955\"> description &quot;A translatable high-level description for the component&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">@<\/span><span style=\"color: #DCDCAA\">customElement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;drawingpad-component&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">export<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">DrawingpadComponent<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">extends<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Component<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #4EC9B0\">ExtendGlobalProps<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\"> &gt;, <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\">&gt; {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">any<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">constructor<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">Readonly<\/span><span style=\"color: #D4D4D4\">&lt;{}&gt;) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">super<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\"> = { <\/span><span style=\"color: #9CDCFE\">drawing:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\"> };<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">render<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">props<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">Props<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">State<\/span><span style=\"color: #D4D4D4\">): <\/span><span style=\"color: #4EC9B0\">ComponentChild<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #4EC9B0\">div<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #9CDCFE\">canvas<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">width<\/span><span style=\"color: #D4D4D4\">={<\/span><span style=\"color: #B5CEA8\">500<\/span><span style=\"color: #D4D4D4\">} <\/span><span style=\"color: #9CDCFE\">height<\/span><span style=\"color: #D4D4D4\">={<\/span><span style=\"color: #B5CEA8\">500<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">ref<\/span><span style=\"color: #D4D4D4\">={(ref) =&gt; (this.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">ref<\/span><span style=\"color: #D4D4D4\">)}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">onMouseDown<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">handleMouseDown<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">onMouseUp<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">handleMouseUp<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">onMouseMove<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">handleMouseMove<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    \/&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #9CDCFE\">oj<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">onojAction<\/span><span style=\"color: #D4D4D4\">={this.<\/span><span style=\"color: #9CDCFE\">clearCanvas<\/span><span style=\"color: #D4D4D4\">}&gt;<\/span><span style=\"color: #9CDCFE\">Clear<\/span><span style=\"color: #D4D4D4\">&lt;\/<\/span><span style=\"color: #9CDCFE\">oj<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #9CDCFE\">button<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&lt;\/<\/span><span style=\"color: #9CDCFE\">div<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">componentDidMount<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getContext<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;2d&#39;<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">drawing:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">clearCanvas<\/span><span style=\"color: #D4D4D4\"> = () <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">context<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">clearRect<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">width<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">height<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleMouseDown<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">MouseEvent<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">rect<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getBoundingClientRect<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">x<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">clientX<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">rect<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">left<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">y<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">clientY<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">rect<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">top<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">drawing:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">context<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">beginPath<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">moveTo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleMouseUp<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">MouseEvent<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setState<\/span><span style=\"color: #D4D4D4\">({ <\/span><span style=\"color: #9CDCFE\">drawing:<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\"> });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleMouseMove<\/span><span style=\"color: #D4D4D4\"> = (<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">MouseEvent<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">=&gt;<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">drawing<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">rect<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">canvasRef<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getBoundingClientRect<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">draw<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">clientX<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">rect<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">left<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">clientY<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">rect<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">top<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">draw<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">number<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">context<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">state<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">drawing<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">lineTo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">x<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">y<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">stroke<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, we&#8217;re creating a canvas and implementing basic drawing functionality. When the mouse button is pressed down, <code>drawing<\/code> becomes <code>true<\/code>, and when the button is released, <code>drawing<\/code> becomes <code>false<\/code>. During mouse movement, if <code>drawing<\/code> is <code>true<\/code>, we draw on the canvas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Style the VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">You can add custom styling to your VComponent in the <code>drawingPad.css<\/code> file. For instance, you might want to define the size and border of the drawing pad:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" style=\"font-size:.875rem;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:8.4296875px;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"canvas {  width: 500px;  height: 500px;  border: 1px solid black;}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D7BA7D\">canvas<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">width<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">500px<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">height<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">500px<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">border<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #B5CEA8\">1px<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">solid<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">black<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Use the VComponent<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">To use your new DrawingPad VComponent, import it into the desired view, and include it in the render method:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" style=\"font-size:.875rem;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:16.859375px;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import { h } from &quot;preact&quot;;import { customElement, GlobalProps } from 'ojs\/ojvcomponent';import { DrawingpadComponent } from 'drawingpad-component\/loader'export function Content() {  return (    &lt;div class=&quot;oj-web-applayout-max-width oj-web-applayout-content&quot;&gt;      &lt;DrawingpadComponent\/&gt;    &lt;\/div&gt;  );};\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;preact&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">customElement<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">GlobalProps<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;ojs\/ojvcomponent&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #9CDCFE\">DrawingpadComponent<\/span><span style=\"color: #D4D4D4\"> } <\/span><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;drawingpad-component\/loader&#39;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">export<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Content<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #9CDCFE\">div<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">class<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #CE9178\">&quot;oj-web-applayout-max-width oj-web-applayout-content&quot;<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;<\/span><span style=\"color: #9CDCFE\">DrawingpadComponent<\/span><span style=\"color: #D4D4D4\">\/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;\/<\/span><span style=\"color: #9CDCFE\">div<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, I added the <code>DrawingpadComponent<\/code> component to the <code>index.tsx<\/code> view. Adjust according to your application structure and the specific view where you want to include the drawing pad. <\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top\"><figure class=\"wp-block-media-text__media\"><video controls src=\"http:\/\/www.bohort.nl\/wp-content\/uploads\/2023\/05\/drawnow.mov\"><\/video><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now that you&#8217;ve created and included the DrawingPad VComponent in your application, you can run and test it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click the play button to see a movie of the component in action.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Note regarding HTML5 canvas and 2D:<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>2d<\/code> context is a built-in object in HTML5 that provides properties and methods for drawing on the canvas. When you have a canvas element in your HTML, you can access this context using the <code>getContext()<\/code> method of the canvas element, like so:<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" style=\"font-size:.875rem;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:8.4296875px;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"let canvas = document.getElementById('myCanvas');let ctx = canvas.getContext('2d');\" style=\"color:#D4D4D4;display:none\" aria-label=\"Kopieer\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">canvas<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">document<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getElementById<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;myCanvas&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">let<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">ctx<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">canvas<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getContext<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;2d&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In this example, <code>ctx<\/code> is the context object, and it&#8217;s through this object that you can draw on the canvas. Here are some of the things you can do with the 2D context:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Draw rectangles: You can use the <code>fillRect(x, y, width, height)<\/code> method to draw a filled rectangle, or the <code>strokeRect(x, y, width, height)<\/code> method to draw a rectangle outline.<\/li>\n\n\n\n<li>Draw paths: You can use methods like <code>moveTo(x, y)<\/code>, <code>lineTo(x, y)<\/code>, and <code>arc(x, y, radius, startAngle, endAngle)<\/code> to create paths, and then use the <code>fill()<\/code> or <code>stroke()<\/code> method to draw the path.<\/li>\n\n\n\n<li>Change colors: You can use the <code>fillStyle<\/code> and <code>strokeStyle<\/code> properties to change the colors used by the <code>fill<\/code> and <code>stroke<\/code> methods.<\/li>\n\n\n\n<li>Change line styles: You can use the <code>lineWidth<\/code>, <code>lineCap<\/code>, and <code>lineJoin<\/code> properties to change the style of the lines drawn by the <code>stroke<\/code> method.<\/li>\n\n\n\n<li>Draw text: You can use the <code>fillText(text, x, y)<\/code> or <code>strokeText(text, x, y)<\/code> method to draw text.<\/li>\n\n\n\n<li>Draw images: You can use the <code>drawImage(image, dx, dy)<\/code> or <code>drawImage(image, dx, dy, dWidth, dHeight)<\/code> method to draw images.<\/li>\n\n\n\n<li>Save and restore the drawing state: You can use the <code>save()<\/code> and <code>restore()<\/code> methods to save the current drawing state (colors, line styles, etc.) to a stack, and then restore it later. This is useful when you want to make temporary changes to the drawing state without affecting the rest of your drawing code.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In the drawingPad VComponent which was created in this post, we are using the 2D context to draw lines on the canvas when the user moves the mouse while holding down the mouse button. The <code>lineTo(x, y)<\/code> method is used to extend the current path to a new point, and the <code>stroke()<\/code> method is used to draw the path. You&#8217;re also using the <code>beginPath()<\/code> method to start a new path each time the user presses the mouse button, and the <code>clearRect(x, y, width, height)<\/code> method to clear the canvas when the user clicks the &#8220;Clear&#8221; button.<\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction Oracle JavaScript Extension Toolkit (Oracle JET) empowers developers to build efficient and responsive web applications. It leverages the Virtual DOM (VDOM) architecture, which allows for the creation of VComponents&#8230;.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[69],"tags":[4,79,5,70,80,72,71],"class_list":["post-3233","post","type-post","status-publish","format-standard","hentry","category-oracle-jet","tag-bohort","tag-drawingpad","tag-luc-bors","tag-oracle-jet","tag-signature","tag-vcomponent","tag-vdom"],"_links":{"self":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/comments?post=3233"}],"version-history":[{"count":8,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3233\/revisions"}],"predecessor-version":[{"id":3242,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/posts\/3233\/revisions\/3242"}],"wp:attachment":[{"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/media?parent=3233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/categories?post=3233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bohort.nl\/en\/wp-json\/wp\/v2\/tags?post=3233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}