diff --git a/config/software/plugins.json b/config/software/plugins.json
index a034308b04f..e5e409b7083 100644
--- a/config/software/plugins.json
+++ b/config/software/plugins.json
@@ -3,19 +3,14 @@
"plugin-banner": "A FreeSewing plugin to repeat text on a path",
"plugin-bundle": "An umbrella package of 8 essential FreeSewing build-time plugins",
"plugin-bust": "A FreeSewing plugin that helps with bust-adjusting menswear patterns",
- "plugin-buttons": "A FreeSewing plugin that provides button, buttonhole, and snap snippets",
"plugin-cutlist": "A FreeSewing plugin to store data regarding a pattern's cutlist",
"plugin-dimension": "A FreeSewing plugin to add dimensions to your (paperless) pattern",
"plugin-flip": "A FreeSewing plugin to flip parts horizontally",
"plugin-gore": "A FreeSewing plugin to generate gores for a semi-sphere or dome",
- "plugin-grainline": "A FreeSewing plugin to add grainline indicators on your patterns",
"plugin-i18n": "A FreeSewing plugin for pattern translation",
- "plugin-logo": "A FreeSewing plugin to add our logo to your patterns",
"plugin-measurements": "A FreeSewing plugin that adds additional measurements that can be calculated from existing ones",
"plugin-mirror": "A FreeSewing plugin to mirror points or paths",
- "plugin-notches": "A FreeSewing plugin that provides front and back notch snippets",
"plugin-round": "A FreeSewing plugin to round corners",
- "plugin-scalebox": "A FreeSewing plugin to add a scalebox to your pattern",
"plugin-sprinkle": "A FreeSewing plugin to bulk-add snippets to your pattern",
"plugin-svgattr": "A FreeSewing plugin to set SVG attributes",
"plugin-theme": "A FreeSewing plugin that provides a default theme",
diff --git a/designs/hortensia/src/frontpanel.mjs b/designs/hortensia/src/frontpanel.mjs
index bd42576aba6..75e2b7e08a0 100644
--- a/designs/hortensia/src/frontpanel.mjs
+++ b/designs/hortensia/src/frontpanel.mjs
@@ -68,13 +68,13 @@ function draftHortensiaFrontpanel({
)
points.attachPoint2BR = new Point(handleVertPos + handleWidth * 2, h - h / 2 + handleSpace / 2)
- macro('crossBox', {
+ macro('crossbox', {
from: points.attachPoint1TL,
to: points.attachPoint1BR,
text: 'attachment',
})
- macro('crossBox', {
+ macro('crossbox', {
from: points.attachPoint2TL,
to: points.attachPoint2BR,
text: 'attachment',
diff --git a/plugins/plugin-annotations/src/scalebox.mjs b/plugins/plugin-annotations/src/scalebox.mjs
index 0463e72b6b8..5bbc60a3085 100644
--- a/plugins/plugin-annotations/src/scalebox.mjs
+++ b/plugins/plugin-annotations/src/scalebox.mjs
@@ -193,106 +193,3 @@ export const scalebox = {
},
},
}
-
-export const miniscale = {
- name: 'miniscale',
- version,
- macros: {
- miniscale(so, { store, points, paths, scale, Point, Path }) {
- // Passing `false` will remove the miniscale
- if (so === false) {
- for (const id of [
- '__miniscaleMetricTopLeft',
- '__miniscaleMetricTopRight',
- '__miniscaleMetricBottomRight',
- '__miniscaleMetricBottomLeft',
- '__miniscaleImperialTopLeft',
- '__miniscaleImperialTopRight',
- '__miniscaleImperialBottomRight',
- '__miniscaleImperialBottomLeft',
- '__miniscaleMetric',
- '__miniscaleImperial',
- ])
- delete points[id]
- for (const id of ['__miniscaleMetric', '__miniscaleImperial']) delete paths[id]
- return true
- }
-
- // Convert scale to a value between 0 and 5, inclusive.
- const scaleIndex = Math.ceil(6 * Math.max(0.1, Math.min(1, scale))) - 1
-
- console.log({ MSat: so.at })
-
- // Metric size in mm / display value and imperial size in mm / display value for each scale index.
- const sizes = [
- [10, '1cm', 25.4 * 0.375, '⅜″'],
- [13, '1.3cm', 25.4 * 0.5, '½″'],
- [16, '1.6cm', 25.4 * 0.625, '⅝″'],
- [19, '1.9cm', 25.4 * 0.75, '¾″'],
- [22, '2.2cm', 25.4 * 0.875, '⅞″'],
- [25, '2.5cm', 25.4 * 1, '1″'],
- ]
- const m = sizes[scaleIndex][0] / 2
- const i = sizes[scaleIndex][2] / 2
- const metricDisplaySize = sizes[scaleIndex][1]
- const imperialDisplaySize = sizes[scaleIndex][3]
- // Box points
- points.__miniscaleMetricTopLeft = new Point(so.at.x - m, so.at.y - m)
- points.__miniscaleMetricTopRight = new Point(so.at.x + m, so.at.y - m)
- points.__miniscaleMetricBottomLeft = new Point(so.at.x - m, so.at.y + m)
- points.__miniscaleMetricBottomRight = new Point(so.at.x + m, so.at.y + m)
- points.__miniscaleImperialTopLeft = new Point(so.at.x - i, so.at.y - i)
- points.__miniscaleImperialTopRight = new Point(so.at.x + i, so.at.y - i)
- points.__miniscaleImperialBottomLeft = new Point(so.at.x - i, so.at.y + i)
- points.__miniscaleImperialBottomRight = new Point(so.at.x + i, so.at.y + i)
- // Text anchor points
- points.__miniscaleMetric = new Point(so.at.x, so.at.y - 2 * scale)
- points.__miniscaleImperial = new Point(so.at.x, so.at.y + 8 * scale)
- // Rotation
- if (so.rotate) {
- so.rotate = Number(so.rotate)
- let toRotate = [
- '__miniscaleMetricTopLeft',
- '__miniscaleMetricTopRight',
- '__miniscaleMetricBottomLeft',
- '__miniscaleMetricBottomRight',
- '__miniscaleImperialTopLeft',
- '__miniscaleImperialTopRight',
- '__miniscaleImperialBottomLeft',
- '__miniscaleImperialBottomRight',
- '__miniscaleMetric',
- '__miniscaleImperial',
- ]
- for (const pid of toRotate) points[pid] = points[pid].rotate(so.rotate, so.at)
- for (const pid of toRotate.slice(8)) {
- points[pid].attributes.set(
- 'data-text-transform',
- `rotate(${so.rotate * -1}, ${points[pid].x}, ${points[pid].y})`
- )
- }
- }
- // Paths
- paths.__miniscaleImperial = new Path()
- .attr('class', 'scalebox imperial fill-current')
- .move(points.__miniscaleImperialTopLeft)
- .line(points.__miniscaleImperialBottomLeft)
- .line(points.__miniscaleImperialBottomRight)
- .line(points.__miniscaleImperialTopRight)
- .close()
- paths.__miniscaleMetric = new Path()
- .attr('class', 'scalebox metric fill-bg')
- .move(points.__miniscaleMetricTopLeft)
- .line(points.__miniscaleMetricBottomLeft)
- .line(points.__miniscaleMetricBottomRight)
- .line(points.__miniscaleMetricTopRight)
- .close()
- // Text
- points.__miniscaleMetric = points.__miniscaleMetric
- .attr('data-text', `${metricDisplaySize} x ${metricDisplaySize}`)
- .attr('data-text-class', 'text-xs center')
- points.__miniscaleImperial = points.__miniscaleImperial
- .attr('data-text', `${imperialDisplaySize} x ${imperialDisplaySize}`)
- .attr('data-text-class', 'text-xs center ')
- },
- },
-}
diff --git a/plugins/plugin-buttons/CHANGELOG.md b/plugins/plugin-buttons/CHANGELOG.md
deleted file mode 100644
index adcc835291c..00000000000
--- a/plugins/plugin-buttons/CHANGELOG.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Change log for: @freesewing/plugin-buttons
-
-
-## 2.21.0 (2022-06-27)
-
-### Changed
-
- - Migrated from Rollup to Esbuild for all builds
-
-## 2.19.6 (2021-12-29)
-
-### Added
-
- - Added (esm) unit tests
-
-### Changed
-
- - Add utility classes and CSS variables for better styling support
-
-### Fixed
-
- - Only add snippets once to SVG object
-
-## 2.17.0 (2021-07-01)
-
-### Changed
-
- - Is now included in plugin-bundle
-
-## 2.15.0 (2021-04-15)
-
-### Added
-
- - Added the buttonhole-end snippet
- - Added the buttonhole-start snippet
-
-## 2.7.0 (2020-07-12)
-
-### Changed
-
- - Snippet names are changed, `snap-male` is now `snap-stud` and `snap-female` is now `snap-socket` Changing this to avoid needless use of gender related terminology.
-
-### Removed
-
- - Snippet `snap-male` and `snap-female` are no longer available. Use `snap-stud` and `snap-socket` instead
-
-## 2.0.0 (2019-08-25)
-
-### Added
-
- - Initial release
-
-
-This is the **initial release**, and the start of this change log.
-
-> Prior to version 2, FreeSewing was not a JavaScript project.
-> As such, that history is out of scope for this change log.
-
diff --git a/plugins/plugin-buttons/README.md b/plugins/plugin-buttons/README.md
deleted file mode 100644
index e89dabb92be..00000000000
--- a/plugins/plugin-buttons/README.md
+++ /dev/null
@@ -1,294 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-# @freesewing/plugin-buttons
-
-A FreeSewing plugin that provides button, buttonhole, and snap snippets
-
-
-
-
-> #### Note: Version 3 is a work in progress
->
-> We are working on a new major version (v3) but it is not ready for prime-time.
-> For production use, please refer to our v2 packages (the `latest` on NPM)
-> or [the `v2` branch in our monorepo](https://github.com/freesewing/freesewing/tree/v2).
->
-> We the `main` branch and `next` packages on NPM holds v3 code. But it's alpha for now.
-
-## What am I looking at? 🤔
-
-This repository is our *monorepo* holding all our NPM designs, plugins, other NPM packages, and (web)sites.
-
-This folder holds: @freesewing/plugin-buttons
-
-If you're not entirely sure what to do or how to start, type this command:
-
-```
-npm run tips
-```
-
-> If you don't want to set up a dev environment, you can run it in your browser:
->
-> [](https://gitpod.io/#https://github.com/freesewing/freesewing)
->
-> We recommend that you fork our repository and then
-> put `gitpod.io/# to start up a browser-based dev environment of your own.
-
-## About FreeSewing 💀
-
-Where the world of makers and developers collide, that's where you'll find FreeSewing.
-
-If you're a maker, checkout [freesewing.org](https://freesewing.org/) where you can generate
-our sewing patterns adapted to your measurements.
-
-If you're a developer, our documentation is on [freesewing.dev](https://freesewing.dev/).
-Our [core library](https://freesewing.dev/reference/api/) is a *batteries-included* toolbox
-for parametric design of sewing patterns. But we also provide a range
-of [plugins](https://freesewing.dev/reference/plugins/) that further extend the
-functionality of the platform.
-
-If you have NodeJS installed, you can try it right now by running:
-
-```bash
-npx create-freesewing-pattern
-```
-
-Or, consult our getting started guides
-for [Linux](https://freesewing.dev/tutorials/getting-started-linux/),
-[MacOS](https://freesewing.dev/tutorials/getting-started-mac/),
-or [Windows](https://freesewing.dev/tutorials/getting-started-windows/).
-
-We also have a [pattern design tutorial](https://freesewing.dev/tutorials/pattern-design/) that
-walks you through your first parametric design,
-and [a friendly community](https://freesewing.org/community/where/) with
-people who can help you when you get stuck.
-
-## Support FreeSewing: Become a patron 🥰
-
-FreeSewing is an open source project run by a community,
-and financially supported by our patrons.
-
-If you feel what we do is worthwhile, and you can spend a few coind without
-hardship, then you should [join us and become a patron](https://freesewing.org/community/join).
-
-## Links 👩💻
-
- - 💻 Makers website: [freesewing.org](https://freesewing.org)
- - 💻 Developers website: [freesewing.dev](https://freesewing.dev)
- - 💬 Chat: On Discord via [discord.freesewing.org](https://discord.freesewing.org/)
- - ✅ Todo list/Kanban board: On Github via [todo.freesewing.org](https://todo.freesewing.org/)
- - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org)
- - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org)
-
-## License: MIT 🤓
-
-© [Joost De Cock](https://github.com/joostdecock).
-See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details.
-
-## Where to get help 🤯
-
-Our [chatrooms on Discord](https://chat.freesewing.org/) are the best place to ask questions,
-share your feedback, or just hang out.
-
-If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new).
-
-
-
-## Contributors ✨
-
-Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
-
-
-
-
-
-
-
-
-
-
-
-This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
-
diff --git a/plugins/plugin-buttons/build.mjs b/plugins/plugin-buttons/build.mjs
deleted file mode 100644
index 99ace216bc8..00000000000
--- a/plugins/plugin-buttons/build.mjs
+++ /dev/null
@@ -1,35 +0,0 @@
-/* This script will build the package with esbuild */
-import esbuild from 'esbuild'
-import pkg from './package.json' assert { type: 'json' }
-
-// Create banner based on package info
-const banner = `/**
- * ${pkg.name} | v${pkg.version}
- * ${pkg.description}
- * (c) ${new Date().getFullYear()} ${pkg.author}
- * @license ${pkg.license}
- */`
-
-// Shared esbuild options
-const options = {
- banner: { js: banner },
- bundle: true,
- entryPoints: ['src/index.mjs'],
- format: 'esm',
- outfile: 'dist/index.mjs',
- external: ['@freesewing'],
- metafile: process.env.VERBOSE ? true : false,
- minify: process.env.NO_MINIFY ? false : true,
- sourcemap: true,
-}
-
-// Let esbuild generate the build
-const build = async () => {
- const result = await esbuild.build(options).catch(() => process.exit(1))
-
- if (process.env.VERBOSE) {
- const info = await esbuild.analyzeMetafile(result.metafile)
- console.log(info)
- }
-}
-build()
diff --git a/plugins/plugin-buttons/data.mjs b/plugins/plugin-buttons/data.mjs
deleted file mode 100644
index 7770a858272..00000000000
--- a/plugins/plugin-buttons/data.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/plugin-buttons'
-export const version = '3.0.0-alpha.4'
-export const data = { name, version }
diff --git a/plugins/plugin-buttons/img/example.png b/plugins/plugin-buttons/img/example.png
deleted file mode 100644
index 70ea646c479..00000000000
Binary files a/plugins/plugin-buttons/img/example.png and /dev/null differ
diff --git a/plugins/plugin-buttons/package.json b/plugins/plugin-buttons/package.json
deleted file mode 100644
index 0f6b0d9aa32..00000000000
--- a/plugins/plugin-buttons/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "@freesewing/plugin-buttons",
- "version": "3.0.0-alpha.4",
- "description": "A FreeSewing plugin that provides button, buttonhole, and snap snippets",
- "author": "Joost De Cock (https://github.com/joostdecock)",
- "homepage": "https://freesewing.org/",
- "repository": "github:freesewing/freesewing",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/freesewing/freesewing/issues"
- },
- "funding": {
- "type": "individual",
- "url": "https://freesewing.org/patrons/join"
- },
- "keywords": [
- "freesewing",
- "plugin",
- "sewing pattern",
- "sewing",
- "design",
- "parametric design",
- "made to measure",
- "diy",
- "fashion"
- ],
- "type": "module",
- "module": "dist/index.mjs",
- "exports": {
- ".": "./dist/index.mjs"
- },
- "scripts": {
- "build": "node build.mjs",
- "clean": "rimraf dist",
- "mbuild": "NO_MINIFY=1 node build.mjs",
- "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
- "test": "npx mocha tests/*.test.mjs",
- "vbuild": "VERBOSE=1 node build.mjs",
- "lab": "cd ../../sites/lab && yarn start",
- "tips": "node ../../scripts/help.mjs",
- "lint": "npx eslint 'src/**' 'tests/*.mjs'",
- "prettier": "npx prettier --write 'src/*.mjs' 'tests/*.mjs'",
- "testci": "npx mocha tests/*.test.mjs --reporter ../../tests/reporters/terse.js",
- "cibuild_step1": "node build.mjs",
- "wbuild": "node build.mjs",
- "wcibuild_step1": "node build.mjs"
- },
- "peerDependencies": {
- "@freesewing/core": "3.0.0-alpha.4"
- },
- "dependencies": {},
- "devDependencies": {
- "mocha": "10.0.0",
- "chai": "4.2.0"
- },
- "files": [
- "dist/*",
- "README.md"
- ],
- "publishConfig": {
- "access": "public",
- "tag": "next"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=8"
- }
-}
diff --git a/plugins/plugin-buttons/src/index.mjs b/plugins/plugin-buttons/src/index.mjs
deleted file mode 100644
index 1e552b10175..00000000000
--- a/plugins/plugin-buttons/src/index.mjs
+++ /dev/null
@@ -1,82 +0,0 @@
-import { name, version } from '../data.mjs'
-
-const defs = [
- // button
- `
-
-
-
-
-
-
-`,
- // buttonhole
- `
-
-
-
-
-
-
-
-
-`,
- // snaps
- `
-
-
-
-
-
-
-
-
-
-
-
-
-
-`,
-]
-
-export const plugin = {
- name,
- version,
- hooks: {
- preRender: function (svg) {
- for (const def of defs) {
- if (svg.defs.indexOf(def) === -1) svg.defs += def
- }
- },
- },
-}
-
-// More specifically named exports
-export const buttonsPlugin = plugin
-export const pluginButtons = plugin
diff --git a/plugins/plugin-buttons/tests/plugin.test.mjs b/plugins/plugin-buttons/tests/plugin.test.mjs
deleted file mode 100644
index c24f22571b0..00000000000
--- a/plugins/plugin-buttons/tests/plugin.test.mjs
+++ /dev/null
@@ -1,113 +0,0 @@
-import chai from 'chai'
-import { Design } from '@freesewing/core'
-import { plugin } from '../src/index.mjs'
-
-const expect = chai.expect
-
-const Pattern = new Design()
-const pattern = new Pattern().use(plugin)
-pattern.draft().render()
-
-describe('Buttons Plugin Test', () => {
- for (const snippet of ['button', 'buttonhole', 'snap-stud', 'snap-socket']) {
- it(`Should add the ${snippet} snippet to defs`, () => {
- expect(pattern.svg.defs.indexOf(``)).to.not.equal(-1)
- })
- }
-
- it('Draws a button on an anchor point', () => {
- const part = {
- name: 'test',
- draft: ({ points, Point, snippets, Snippet, part }) => {
- points.anchor = new Point(10, 20)
- snippets.button = new Snippet('button', points.anchor)
-
- return part
- },
- plugins: [plugin],
- }
- const Pattern = new Design({ parts: [part] })
- const svg = new Pattern().draft().render()
- expect(svg).to.contain('