├── .github └── workflows │ └── publish.yml ├── .gitignore ├── dist ├── assets │ ├── env-DjWubmgd.js │ ├── main-_G4yc6cG.js │ └── main-rlcMladr.css └── index.html ├── eslint.config.mjs ├── package-lock.json ├── package.json ├── readme.md ├── sand-pattern.mjs ├── sand_table_pattern_maker.jpg ├── scripts └── create-new.js ├── src ├── css │ ├── main.css │ └── sliders.css ├── index.html └── js │ ├── env.js │ ├── gCode.js │ ├── patterns │ ├── Circle.js │ ├── Coordinates.js │ ├── Cross.js │ ├── Curvature.js │ ├── Cycloid.js │ ├── Diameters.js │ ├── Draw.js │ ├── Egg.js │ ├── Farris.js │ ├── FermatSpiral.js │ ├── Fibonacci.js │ ├── FibonacciLollipops.js │ ├── Frame.js │ ├── Gcode.js │ ├── Gravity.js │ ├── Heart.js │ ├── Lindenmayer.js │ ├── Lissajous.js │ ├── LogarithmicSpiral.js │ ├── Parametric.js │ ├── Rectangle.js │ ├── Rhodonea.js │ ├── ShapeMorph.js │ ├── ShapeSpin.js │ ├── SpinMorph.js │ ├── Spiral.js │ ├── SpiralZigZag.js │ ├── Spokes.js │ ├── Star.js │ ├── Sunset.js │ ├── Superellipse.js │ ├── Text.js │ ├── ThetaRhoInput.js │ ├── WigglySpiral.js │ ├── ZigZag.js │ ├── index.js │ └── utils │ │ └── Utilities.js │ ├── sand_table_pattern_maker.js │ └── thetaRho.js └── vite.config.js /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | 7 | # Allows you to run this workflow manually from the Actions tab 8 | workflow_dispatch: 9 | 10 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 11 | permissions: 12 | contents: read 13 | pages: write 14 | id-token: write 15 | 16 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 17 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 18 | concurrency: 19 | group: "pages" 20 | cancel-in-progress: false 21 | 22 | jobs: 23 | build: 24 | runs-on: ubuntu-latest 25 | 26 | steps: 27 | - name: Checkout source 28 | uses: actions/checkout@v4 29 | 30 | - name: Setup Node.js 31 | uses: actions/setup-node@v4 32 | with: 33 | node-version: '22' # Use your desired Node version 34 | 35 | - name: Install dependencies 36 | run: npm install 37 | 38 | - name: Build project 39 | run: npm run build 40 | 41 | - name: Upload artifact 42 | uses: actions/upload-pages-artifact@v3 43 | with: 44 | path: ./dist 45 | 46 | deploy: 47 | needs: build 48 | runs-on: ubuntu-latest 49 | environment: 50 | name: github-pages 51 | url: ${{ steps.deployment.outputs.page_url }} 52 | 53 | steps: 54 | - name: Deploy to GitHub Pages 55 | id: deployment 56 | uses: actions/deploy-pages@v4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules -------------------------------------------------------------------------------- /dist/assets/env-DjWubmgd.js: -------------------------------------------------------------------------------- 1 | var e={app:{version:"0.1.0",framerate:10},canvas:{width:648,height:648},table:{format:"cartesian",units:"mm",x:{min:0,max:472},y:{min:0,max:380}},motor:{speed:4e3},ball:{diameter:19},gcode:{command:"G0"},recalculate_pattern:!0,mouse:{pressed:!1,x:null,y:null}};export{e}; 2 | -------------------------------------------------------------------------------- /dist/assets/main-rlcMladr.css: -------------------------------------------------------------------------------- 1 | body{padding:0;margin:0;font-family:Dosis,sans-serif;background-color:#444;font-size:16px}header{margin:0;padding:.5em 0;text-align:center;background-color:#202020}header h1{margin:0;padding:0;font-size:1em;color:#fff}h2{font-size:1em;margin-top:1.5em;color:#f0ffb4}p.small{font-size:.75em}footer{color:gray;text-align:center;background-color:#202020;padding:.5em 0}footer p{margin:0;padding:0}footer a,footer a:link,footer a:visited,footer a:hover,footer a:active{color:#8c8c8c;text-decoration:underline}#sketch-holder{position:relative;width:648px;margin:0 auto}.container{display:grid;grid-template-columns:50% 50%;color:#444}.box{background-color:#444;color:#fff;padding:20px}.box:nth-of-type(2){z-index:2;background:#0000004d}#canvas-holder{min-width:600px}#pattern-selector{background-color:#000;padding:.25em .5em;margin:.25em 0}#pattern-selector label{display:inline-block;width:7em}table tr td:nth-of-type(1){width:7em}button{background-color:#4caf50;border:none;border-radius:.5em;color:#fff;padding:15px 32px;text-align:center;text-decoration:none;display:inline-block;font-size:16px;cursor:pointer}.pattern-control{background-color:#202020;padding:.25em .5em;margin:.25em 0}.pattern-control label{display:inline-block;width:7em}.pattern-control input[type=range]{width:20em}.pattern-control input[type=text]{width:40em} 2 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 |Format | 24 |25 | |
X Range | 28 |29 | |
Y Range | 32 |33 | |
Motor Speed | 36 |37 | |
Ball Size | 40 |41 | |
Instructions | 56 |57 | |
Distance | 60 |61 | |
Time | 64 |65 | |
Download Pattern image and G-code instructions at once. Chrome Required.
73 |