• Jump To … +
    ./demo/canvas-001.js ./demo/canvas-002.js ./demo/canvas-003.js ./demo/canvas-004.js ./demo/canvas-005.js ./demo/canvas-006.js ./demo/canvas-007.js ./demo/canvas-008.js ./demo/canvas-009.js ./demo/canvas-010.js ./demo/canvas-011.js ./demo/canvas-012.js ./demo/canvas-013.js ./demo/canvas-014.js ./demo/canvas-015.js ./demo/canvas-015a.js ./demo/canvas-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.js ./demo/canvas-019a.js ./demo/canvas-020.js ./demo/canvas-021.js ./demo/canvas-022.js ./demo/canvas-023.js ./demo/canvas-024.js ./demo/canvas-025.js ./demo/canvas-026.js ./demo/canvas-027.js ./demo/canvas-028.js ./demo/canvas-029.js ./demo/canvas-030.js ./demo/canvas-031.js ./demo/canvas-032.js ./demo/canvas-033.js ./demo/canvas-034.js ./demo/canvas-035.js ./demo/canvas-036.js ./demo/canvas-037.js ./demo/canvas-038.js ./demo/canvas-039.js ./demo/canvas-040.js ./demo/canvas-041.js ./demo/canvas-042.js ./demo/canvas-043.js ./demo/canvas-044.js ./demo/canvas-045.js ./demo/canvas-046.js ./demo/canvas-047.js ./demo/canvas-048.js ./demo/canvas-049.js ./demo/canvas-050.js ./demo/canvas-051.js ./demo/canvas-052.js ./demo/canvas-053.js ./demo/canvas-054.js ./demo/canvas-055.js ./demo/canvas-056.js ./demo/canvas-057.js ./demo/canvas-058.js ./demo/canvas-059.js ./demo/canvas-060.js ./demo/canvas-061.js ./demo/canvas-062.js ./demo/canvas-063.js ./demo/canvas-064.js ./demo/core-001.js ./demo/delaunator-001.js ./demo/delaunator-002.js ./demo/dom-001.js ./demo/dom-002.js ./demo/dom-003.js ./demo/dom-004.js ./demo/dom-005.js ./demo/dom-006.js ./demo/dom-007.js ./demo/dom-008.js ./demo/dom-009.js ./demo/dom-010.js ./demo/dom-011.js ./demo/dom-012.js ./demo/dom-013.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.js ./demo/filters-002a.js ./demo/filters-003.js ./demo/filters-004.js ./demo/filters-005.js ./demo/filters-006.js ./demo/filters-007.js ./demo/filters-008.js ./demo/filters-009.js ./demo/filters-010.js ./demo/filters-011.js ./demo/filters-012.js ./demo/filters-013.js ./demo/filters-014.js ./demo/filters-015.js ./demo/filters-016.js ./demo/filters-017.js ./demo/filters-018.js ./demo/filters-019.js ./demo/filters-020.js ./demo/filters-021.js ./demo/filters-022.js ./demo/filters-023.js ./demo/filters-024.js ./demo/filters-025.js ./demo/filters-026.js ./demo/filters-027.js ./demo/filters-101.js ./demo/filters-102.js ./demo/filters-103.js ./demo/filters-104.js ./demo/filters-105.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/mediapipe-001.js ./demo/mediapipe-002.js ./demo/mediapipe-003.js ./demo/modules-001.js ./demo/modules-002.js ./demo/modules-003.js ./demo/modules-004.js ./demo/modules-005.js ./demo/packets-001.js ./demo/packets-002.js ./demo/particles-001.js ./demo/particles-002.js ./demo/particles-003.js ./demo/particles-004.js ./demo/particles-005.js ./demo/particles-006.js ./demo/particles-007.js ./demo/particles-008.js ./demo/particles-009.js ./demo/particles-010.js ./demo/particles-011.js ./demo/particles-012.js ./demo/particles-013.js ./demo/particles-014.js ./demo/particles-015.js ./demo/particles-016.js ./demo/rapier-001.js ./demo/snippets-001.js ./demo/snippets-002.js ./demo/snippets-003.js ./demo/snippets-004.js ./demo/snippets-005.js ./demo/snippets-006.js ./demo/temp-000.js ./demo/temp-001.js ./demo/temp-001a.js ./demo/temp-002.js ./demo/temp-003.js ./demo/temp-004.js ./demo/temp-005.js ./demo/temp-006.js ./demo/temp-007.js ./demo/temp-008.js ./demo/temp-009.js ./demo/temp-010.js ./demo/temp-011.js ./demo/temp-012.js ./demo/temp-013.js ./demo/temp-014.js ./demo/temp-015.js ./demo/temp-016.js ./demo/temp-017.js ./demo/temp-018.js ./demo/temp-018a.js ./demo/temp-019.js ./demo/temp-020.js ./demo/temp-021.js ./demo/temp-022.js ./demo/temp-023.js ./demo/temp-024.js ./demo/temp-025.js ./demo/temp-026.js ./demo/temp-027.js ./demo/temp-028.js ./demo/temp-029.js ./demo/temp-030.js ./demo/temp-031.js ./demo/temp-032.js ./demo/temp-033.js ./demo/temp-034.js ./demo/temp-035.js ./demo/temp-036.js ./demo/temp-037.js ./demo/temp-100.js ./demo/temp-101.js ./demo/temp-102.js ./demo/temp-103.js ./demo/temp-104.js ./demo/temp-200.js ./demo/temp-201.js ./demo/temp-301.js ./demo/temp-inkscapeSvgFilters.js ./demo/temp-lottie.js ./demo/tensorflow-001.js ./demo/tensorflow-002.js ./demo/utilities.js
  • §

    Demo Canvas 001

    Block and Wheel entitys (make, clone, method); drag and drop block and wheel entitys

  • §

    Run code

  • §

    Various ways to import the SAcrawl-canvas library, depending on project requirements

    // If library has been added to a project build using npm/yarn/etc and is being bundled:
    import scrawl from 'scrawl';
    
    // If library has been added to a public/dist folder in the code base:
    import scrawl from './path/to/min/scrawl.js';
    
    // If library is imported from a Content Distribution Network endpoint:
    import scrawl from 'https://path/to/cdn/endpoint/scrawl-canvas';
    
    // If the library is to be used in a TypeScript project, or for tree-shaking[1], then functions need to be imported individually:
    import {
        makeBlock,
        makeWheel,
    } from 'relevant-library-path-source';
    
    // ...Or, alternatively, using the * notation:
    import * as scrawl from 'relevant-library-path-source';
    
    // [1] - Tree-shaking functionality to help package managers reduce the size of the shipped library code is on the road map for delivery as part of SC version 9.0.0
    
    • All testing Demos use the TS version for loading the library, so we can test the library’s .d.ts TypeScript definitions file against them (SC doesn’t use TS internally). Other approaches tend to generate a TypeScript error claiming (wrongly) that the library doesn’t have a default export.
    import {
        library as L,
        makeBlock,
        makeDragZone,
        makeRender,
        makeWheel,
    } from '../source/scrawl.js';
    
    import { reportSpeed, killArtefact } from './utilities.js';
  • §

    Scene setup

    let canvas = L.artefact.mycanvas;
  • §

    Create and clone block entitys

    makeBlock({
        name: 'myblock-fill',
        width: 100,
        height: 100,
        startX: 25,
        startY: 25,
    
        fillStyle: 'green',
        strokeStyle: 'gold',
    
        lineWidth: 6,
        lineJoin: 'round',
        shadowOffsetX: 4,
        shadowOffsetY: 4,
        shadowBlur: 2,
        shadowColor: 'black',
    
    }).clone({
        name: 'myblock-draw',
        startX: 175,
        method: 'draw',
        sharedState: true
    
    }).clone({
        name: 'myblock-drawAndFill',
        startX: 325,
        method: 'drawAndFill',
    
    }).clone({
        name: 'myblock-fillAndDraw',
        startX: 475,
        method: 'fillAndDraw',
        sharedState: true
    
    }).clone({
        name: 'myblock-drawThenFill',
        startY: 175,
        method: 'drawThenFill'
    
    }).clone({
        name: 'myblock-fillThenDraw',
        startX: 325,
        method: 'fillThenDraw',
        sharedState: true
    
    }).clone({
        name: 'myblock-clear',
        startX: 175,
        method: 'clear'
    });
  • §

    Create and clone Wheel entitys

    makeWheel({
        name: 'mywheel-fill',
        radius: 50,
        startAngle: 15,
        endAngle: -15,
        includeCenter: true,
    
        startX: 475,
        startY: 475,
    
        fillStyle: 'purple',
        strokeStyle: 'gold',
    
        lineWidth: 6,
        lineJoin: 'round',
        shadowOffsetX: 4,
        shadowOffsetY: 4,
        shadowBlur: 2,
        shadowColor: 'black',
    
        purge: 'all',
    
    }).clone({
        name: 'mywheel-draw',
        startX: 325,
        method: 'draw',
        sharedState: true
    
    }).clone({
        name: 'mywheel-drawAndFill',
        startX: 175,
        method: 'drawAndFill',
    
    }).clone({
        name: 'mywheel-fillAndDraw',
        startX: 25,
        method: 'fillAndDraw',
        sharedState: true
    
    }).clone({
        name: 'mywheel-drawThenFill',
        startY: 325,
        method: 'drawThenFill'
    
    }).clone({
        name: 'mywheel-fillThenDraw',
        startX: 175,
        method: 'fillThenDraw',
        sharedState: true
    
    }).clone({
        name: 'mywheel-clear',
        startX: 325,
        method: 'clear'
    });
  • §

    Change the fill and stroke styles on one of the blocks, and one of the wheels, and any entitys sharing their respective states

    L.artefact['myblock-fillAndDraw'].set({
        fillStyle: 'blue',
        strokeStyle: 'coral'
    });
  • §

    Entitys can be found in both the ‘artefact’ and ‘entity’ sections of the library

    L.entity['mywheel-fillAndDraw'].set({
        fillStyle: 'blue',
        strokeStyle: 'coral'
    });
  • §

    User interaction

    Create the drag-and-drop zone

    let current = makeDragZone({
    
        zone: canvas,
        endOn: ['up', 'leave'],
        exposeCurrentArtefact: true,
        preventTouchDefaultWhenDragging: true,
    });
  • §

    Scene animation

    Function to display frames-per-second data, and other information relevant to the demo

    const report = reportSpeed('#reportmessage', function () {
        const dragging = current();
        return `Currently dragging: ${(typeof dragging !== 'boolean' && dragging) ? dragging.artefact.name : 'nothing'}`;
    });
  • §

    Create the Display cycle animation

    makeRender({
    
        name: 'demo-animation',
        target: canvas,
        afterShow: report,
    });
  • §

    Development and testing

    console.log(L);
    
    console.log('Performing tests ...');
    killArtefact(canvas, 'myblock-fill', 4000);
    killArtefact(canvas, 'mywheel-fillAndDraw', 6000);