diff --git a/config/dependencies.yaml b/config/dependencies.yaml
index 8e944b06f6b..0399c6d3b86 100644
--- a/config/dependencies.yaml
+++ b/config/dependencies.yaml
@@ -115,9 +115,10 @@ paco:
'@freesewing/snapseries': *freesewing
plugin-bundle:
dev:
+ '@freesewing/plugin-annotations': *freesewing
'@freesewing/plugin-banner': *freesewing
'@freesewing/plugin-buttons': *freesewing
- '@freesewing/plugin-cutonfold': *freesewing
+ # '@freesewing/plugin-cutonfold': *freesewing
'@freesewing/plugin-dimension': *freesewing
'@freesewing/plugin-grainline': *freesewing
'@freesewing/plugin-logo': *freesewing
@@ -128,11 +129,12 @@ plugin-bundle:
'@freesewing/plugin-sprinkle': *freesewing
plugintest:
peer:
+ '@freesewing/plugin-annotations': *freesewing
'@freesewing/plugin-banner': *freesewing
- '@freesewing/plugin-bartack': *freesewing
+ # '@freesewing/plugin-bartack': *freesewing
'@freesewing/plugin-bust': *freesewing
'@freesewing/plugin-buttons': *freesewing
- '@freesewing/plugin-cutonfold': *freesewing
+ # '@freesewing/plugin-cutonfold': *freesewing
'@freesewing/plugin-dimension': *freesewing
'@freesewing/plugin-flip': *freesewing
'@freesewing/plugin-gore': *freesewing
diff --git a/config/software/plugins.json b/config/software/plugins.json
index af0f9ce27b1..a034308b04f 100644
--- a/config/software/plugins.json
+++ b/config/software/plugins.json
@@ -1,11 +1,10 @@
{
+ "plugin-annotations": "A bundle of FreeSewing plugins that provide annotations",
"plugin-banner": "A FreeSewing plugin to repeat text on a path",
- "plugin-bartack": "A FreeSewing plugin to add bartacks to your pattern",
"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-cutonfold": "A FreeSewing plugin to add cut-on-fold indicators on your patterns",
"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",
diff --git a/designs/albert/src/front.mjs b/designs/albert/src/front.mjs
index 9f2ff6558fe..4be8cede453 100644
--- a/designs/albert/src/front.mjs
+++ b/designs/albert/src/front.mjs
@@ -2,62 +2,62 @@ import { pluginBundle } from '@freesewing/plugin-bundle'
import { version } from '../data.mjs'
// crossBox macro
-const crossBox = {
- name: 'crossbox',
- version,
- macros: {
- crossBox: function (so, { points, Point, paths, Path, getId }) {
- let id = getId()
- let shiftFraction = 0.1
- points[id + '_boxTopLeft'] = so.from.copy()
- points[id + '_boxBottomRight'] = so.to.copy()
- points[id + '_boxTopRight'] = new Point(so.to.x, so.from.y)
- points[id + '_boxBottomLeft'] = new Point(so.from.x, so.to.y)
+// const crossBox = {
+// name: 'crossbox',
+// version,
+// macros: {
+// crossBox: function (so, { points, Point, paths, Path, getId }) {
+// let id = getId()
+// let shiftFraction = 0.1
+// points[id + '_boxTopLeft'] = so.from.copy()
+// points[id + '_boxBottomRight'] = so.to.copy()
+// points[id + '_boxTopRight'] = new Point(so.to.x, so.from.y)
+// points[id + '_boxBottomLeft'] = new Point(so.from.x, so.to.y)
- points[id + '_topCrossTL'] = points[id + '_boxTopLeft'].shiftFractionTowards(
- points[id + '_boxBottomRight'],
- shiftFraction
- )
- points[id + '_topCrossTR'] = points[id + '_boxTopRight'].shiftFractionTowards(
- points[id + '_boxBottomLeft'],
- shiftFraction
- )
- points[id + '_topCrossBL'] = points[id + '_boxBottomLeft'].shiftFractionTowards(
- points[id + '_boxTopRight'],
- shiftFraction
- )
- points[id + '_topCrossBR'] = points[id + '_boxBottomRight'].shiftFractionTowards(
- points[id + '_boxTopLeft'],
- shiftFraction
- )
+// points[id + '_topCrossTL'] = points[id + '_boxTopLeft'].shiftFractionTowards(
+// points[id + '_boxBottomRight'],
+// shiftFraction
+// )
+// points[id + '_topCrossTR'] = points[id + '_boxTopRight'].shiftFractionTowards(
+// points[id + '_boxBottomLeft'],
+// shiftFraction
+// )
+// points[id + '_topCrossBL'] = points[id + '_boxBottomLeft'].shiftFractionTowards(
+// points[id + '_boxTopRight'],
+// shiftFraction
+// )
+// points[id + '_topCrossBR'] = points[id + '_boxBottomRight'].shiftFractionTowards(
+// points[id + '_boxTopLeft'],
+// shiftFraction
+// )
- paths[id + 'crossBox'] = new Path()
- .move(points[id + '_boxTopLeft'])
- .line(points[id + '_boxTopRight'])
- .line(points[id + '_boxBottomRight'])
- .line(points[id + '_boxBottomLeft'])
- .line(points[id + '_boxTopLeft'])
- .close()
- .attr('class', 'lining dotted stroke-sm')
- paths[id + '_topCross'] = new Path()
- .move(points[id + '_topCrossTL'])
- .line(points[id + '_topCrossBR'])
- .line(points[id + '_topCrossTR'])
- .line(points[id + '_topCrossBL'])
- .line(points[id + '_topCrossTL'])
- .line(points[id + '_topCrossTR'])
- .move(points[id + '_topCrossBR'])
- .line(points[id + '_topCrossBL'])
- .attr('class', 'lining dotted stroke-sm')
- if (typeof so.text === 'string') {
- points.textAnchor = points[id + '_boxTopLeft']
- .shiftFractionTowards(points[id + '_boxBottomRight'], 0.5)
- .attr('data-text', so.text)
- .attr('data-text-class', 'center')
- }
- },
- },
-}
+// paths[id + 'crossBox'] = new Path()
+// .move(points[id + '_boxTopLeft'])
+// .line(points[id + '_boxTopRight'])
+// .line(points[id + '_boxBottomRight'])
+// .line(points[id + '_boxBottomLeft'])
+// .line(points[id + '_boxTopLeft'])
+// .close()
+// .attr('class', 'lining dotted stroke-sm')
+// paths[id + '_topCross'] = new Path()
+// .move(points[id + '_topCrossTL'])
+// .line(points[id + '_topCrossBR'])
+// .line(points[id + '_topCrossTR'])
+// .line(points[id + '_topCrossBL'])
+// .line(points[id + '_topCrossTL'])
+// .line(points[id + '_topCrossTR'])
+// .move(points[id + '_topCrossBR'])
+// .line(points[id + '_topCrossBL'])
+// .attr('class', 'lining dotted stroke-sm')
+// if (typeof so.text === 'string') {
+// points.textAnchor = points[id + '_boxTopLeft']
+// .shiftFractionTowards(points[id + '_boxBottomRight'], 0.5)
+// .attr('data-text', so.text)
+// .attr('data-text-class', 'center')
+// }
+// },
+// },
+// }
export const front = {
name: 'albert.front',
diff --git a/designs/plugintest/package.json b/designs/plugintest/package.json
index 3b076af46f3..b08e7cf2bd5 100644
--- a/designs/plugintest/package.json
+++ b/designs/plugintest/package.json
@@ -48,11 +48,10 @@
"peerDependencies": {
"@freesewing/core": "3.0.0-alpha.4",
"@freesewing/plugin-bundle": "3.0.0-alpha.4",
+ "@freesewing/plugin-annotations": "3.0.0-alpha.4",
"@freesewing/plugin-banner": "3.0.0-alpha.4",
- "@freesewing/plugin-bartack": "3.0.0-alpha.4",
"@freesewing/plugin-bust": "3.0.0-alpha.4",
"@freesewing/plugin-buttons": "3.0.0-alpha.4",
- "@freesewing/plugin-cutonfold": "3.0.0-alpha.4",
"@freesewing/plugin-dimension": "3.0.0-alpha.4",
"@freesewing/plugin-flip": "3.0.0-alpha.4",
"@freesewing/plugin-gore": "3.0.0-alpha.4",
diff --git a/plugins/plugin-cutonfold/.travis.yml b/plugins/plugin-annotations/.travis.yml
similarity index 100%
rename from plugins/plugin-cutonfold/.travis.yml
rename to plugins/plugin-annotations/.travis.yml
diff --git a/plugins/plugin-bartack/README.md b/plugins/plugin-annotations/BarTack.md
similarity index 100%
rename from plugins/plugin-bartack/README.md
rename to plugins/plugin-annotations/BarTack.md
diff --git a/plugins/plugin-annotations/CHANGELOG.md b/plugins/plugin-annotations/CHANGELOG.md
new file mode 100644
index 00000000000..44601391009
--- /dev/null
+++ b/plugins/plugin-annotations/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Change log for: @freesewing/plugin-annotations
+
+
+
+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-cutonfold/README.md b/plugins/plugin-annotations/CutOnFold.md
similarity index 100%
rename from plugins/plugin-cutonfold/README.md
rename to plugins/plugin-annotations/CutOnFold.md
diff --git a/plugins/plugin-annotations/README.md b/plugins/plugin-annotations/README.md
new file mode 100644
index 00000000000..0fb1c6a8632
--- /dev/null
+++ b/plugins/plugin-annotations/README.md
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
+
+
+
+
+# @freesewing/plugin-annotations
+
+A bundle of FreeSewing plugins that provide annotations
+
+
+
+
+> #### 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-annotations
+
+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-bartack/build.mjs b/plugins/plugin-annotations/build.mjs
similarity index 100%
rename from plugins/plugin-bartack/build.mjs
rename to plugins/plugin-annotations/build.mjs
diff --git a/plugins/plugin-bartack/data.mjs b/plugins/plugin-annotations/data.mjs
similarity index 74%
rename from plugins/plugin-bartack/data.mjs
rename to plugins/plugin-annotations/data.mjs
index 0d050eaa056..0a34bd57b03 100644
--- a/plugins/plugin-bartack/data.mjs
+++ b/plugins/plugin-annotations/data.mjs
@@ -1,4 +1,4 @@
// This file is auto-generated | All changes you make will be overwritten.
-export const name = '@freesewing/plugin-bartack'
+export const name = '@freesewing/plugin-annotations'
export const version = '3.0.0-alpha.4'
export const data = { name, version }
diff --git a/plugins/plugin-cutonfold/img/example.png b/plugins/plugin-annotations/img/cutonfold.png
similarity index 100%
rename from plugins/plugin-cutonfold/img/example.png
rename to plugins/plugin-annotations/img/cutonfold.png
diff --git a/plugins/plugin-bartack/img/example.png b/plugins/plugin-annotations/img/logo.png
similarity index 100%
rename from plugins/plugin-bartack/img/example.png
rename to plugins/plugin-annotations/img/logo.png
diff --git a/plugins/plugin-bartack/package.json b/plugins/plugin-annotations/package.json
similarity index 93%
rename from plugins/plugin-bartack/package.json
rename to plugins/plugin-annotations/package.json
index cbc7441e9bd..3ddc1928509 100644
--- a/plugins/plugin-bartack/package.json
+++ b/plugins/plugin-annotations/package.json
@@ -1,7 +1,7 @@
{
- "name": "@freesewing/plugin-bartack",
+ "name": "@freesewing/plugin-annotations",
"version": "3.0.0-alpha.4",
- "description": "A FreeSewing plugin to add bartacks to your pattern",
+ "description": "A bundle of FreeSewing plugins that provide annotations",
"author": "Joost De Cock (https://github.com/joostdecock)",
"homepage": "https://freesewing.org/",
"repository": "github:freesewing/freesewing",
diff --git a/plugins/plugin-bartack/src/index.mjs b/plugins/plugin-annotations/src/bartack.mjs
similarity index 92%
rename from plugins/plugin-bartack/src/index.mjs
rename to plugins/plugin-annotations/src/bartack.mjs
index 847199c40ab..b0c9a865fdd 100644
--- a/plugins/plugin-bartack/src/index.mjs
+++ b/plugins/plugin-annotations/src/bartack.mjs
@@ -41,7 +41,7 @@ const getPoints = (path, so) => {
const bartackPath = (path, so, props) => (path ? drawBartack(getPoints(path, so), props) : null)
-function bartack(so, props) {
+function createBartack(so, props) {
const defaults = {
width: 3,
length: 15,
@@ -103,12 +103,12 @@ function bartack(so, props) {
}
// The actual plugin
-export const plugin = {
+export const bartack = {
name,
version,
macros: {
bartack: function (so, props) {
- return bartack(so, props)
+ return createBartack(so, props)
},
bartackAlong: function (so, props) {
so.bartackFractionAlong = false
@@ -116,7 +116,7 @@ export const plugin = {
so.anchor = false
so.from = false
so.to = false
- return bartack(so, props)
+ return createBartack(so, props)
},
bartackFractionAlong: function (so, props) {
so.bartackFractionAlong = true
@@ -124,11 +124,11 @@ export const plugin = {
so.anchor = false
so.from = false
so.to = false
- return bartack(so, props)
+ return createBartack(so, props)
},
},
}
// More specifically named exports
-export const bartackPlugin = plugin
-export const pluginBartack = plugin
+// export const bartackPlugin = bartack
+// export const pluginBartack = bartack
diff --git a/plugins/plugin-annotations/src/crossbox.mjs b/plugins/plugin-annotations/src/crossbox.mjs
new file mode 100644
index 00000000000..ddbc7a7e897
--- /dev/null
+++ b/plugins/plugin-annotations/src/crossbox.mjs
@@ -0,0 +1,62 @@
+import { name, version } from '../data.mjs'
+
+export const crossbox = {
+ name: 'crossbox',
+ version,
+ macros: {
+ crossBox: function (so, { points, Point, paths, Path, getId }) {
+ let id = getId()
+ let shiftFraction = 0.1
+ points[id + '_boxTopLeft'] = so.from.copy()
+ points[id + '_boxBottomRight'] = so.to.copy()
+ points[id + '_boxTopRight'] = new Point(so.to.x, so.from.y)
+ points[id + '_boxBottomLeft'] = new Point(so.from.x, so.to.y)
+
+ points[id + '_topCrossTL'] = points[id + '_boxTopLeft'].shiftFractionTowards(
+ points[id + '_boxBottomRight'],
+ shiftFraction
+ )
+ points[id + '_topCrossTR'] = points[id + '_boxTopRight'].shiftFractionTowards(
+ points[id + '_boxBottomLeft'],
+ shiftFraction
+ )
+ points[id + '_topCrossBL'] = points[id + '_boxBottomLeft'].shiftFractionTowards(
+ points[id + '_boxTopRight'],
+ shiftFraction
+ )
+ points[id + '_topCrossBR'] = points[id + '_boxBottomRight'].shiftFractionTowards(
+ points[id + '_boxTopLeft'],
+ shiftFraction
+ )
+
+ paths[id + 'crossBox'] = new Path()
+ .move(points[id + '_boxTopLeft'])
+ .line(points[id + '_boxTopRight'])
+ .line(points[id + '_boxBottomRight'])
+ .line(points[id + '_boxBottomLeft'])
+ .line(points[id + '_boxTopLeft'])
+ .close()
+ .attr('class', 'lining dotted stroke-sm')
+ paths[id + '_topCross'] = new Path()
+ .move(points[id + '_topCrossTL'])
+ .line(points[id + '_topCrossBR'])
+ .line(points[id + '_topCrossTR'])
+ .line(points[id + '_topCrossBL'])
+ .line(points[id + '_topCrossTL'])
+ .line(points[id + '_topCrossTR'])
+ .move(points[id + '_topCrossBR'])
+ .line(points[id + '_topCrossBL'])
+ .attr('class', 'lining dotted stroke-sm')
+ if (typeof so.text === 'string') {
+ points.textAnchor = points[id + '_boxTopLeft']
+ .shiftFractionTowards(points[id + '_boxBottomRight'], 0.5)
+ .attr('data-text', so.text)
+ .attr('data-text-class', 'center')
+ }
+ },
+ },
+}
+
+// More specifically named exports
+// export const cutonfoldPlugin = cutonfold
+// export const pluginCutonfold = cutonfold
diff --git a/plugins/plugin-cutonfold/src/index.mjs b/plugins/plugin-annotations/src/cutonfold.mjs
similarity index 95%
rename from plugins/plugin-cutonfold/src/index.mjs
rename to plugins/plugin-annotations/src/cutonfold.mjs
index 7b932995e14..cf7b289b90f 100644
--- a/plugins/plugin-cutonfold/src/index.mjs
+++ b/plugins/plugin-annotations/src/cutonfold.mjs
@@ -9,7 +9,7 @@ const markers = `
`
-export const plugin = {
+export const cutonfold = {
name,
version,
hooks: {
@@ -67,5 +67,5 @@ export const plugin = {
}
// More specifically named exports
-export const cutonfoldPlugin = plugin
-export const pluginCutonfold = plugin
+// export const cutonfoldPlugin = cutonfold
+// export const pluginCutonfold = cutonfold
diff --git a/plugins/plugin-annotations/src/index.mjs b/plugins/plugin-annotations/src/index.mjs
new file mode 100644
index 00000000000..abf290e09c6
--- /dev/null
+++ b/plugins/plugin-annotations/src/index.mjs
@@ -0,0 +1,22 @@
+import { bartack } from './bartack.mjs'
+import { crossbox } from './crossbox.mjs'
+import { cutonfold } from './cutonfold.mjs'
+import { pleat } from './pleat.mjs'
+import { sewtogether } from './sewtogether.mjs'
+
+// Named exports
+// export bartack
+export const bartackPlugin = bartack
+export const pluginBartack = bartack
+
+export const crossboxPlugin = crossbox
+export const pluginCrossbox = crossbox
+
+export const cutonfoldPlugin = cutonfold
+export const pluginCutonfold = cutonfold
+
+export const pleatPlugin = pleat
+export const pluginPleat = pleat
+
+export const sewtogetherPlugin = sewtogether
+export const pluginSewtogether = sewtogether
diff --git a/plugins/plugin-annotations/src/pleat.mjs b/plugins/plugin-annotations/src/pleat.mjs
new file mode 100644
index 00000000000..b96662fbd15
--- /dev/null
+++ b/plugins/plugin-annotations/src/pleat.mjs
@@ -0,0 +1,76 @@
+import { name, version } from '../data.mjs'
+
+const markers = `
+
+
+
+`
+
+export const plugin = {
+ name,
+ version,
+ hooks: {
+ preRender: (svg) => {
+ if (svg.defs.indexOf(markers) === -1) svg.defs += markers
+ },
+ },
+ macros: {
+ pleat: function (so, { points, paths, Path, complete, scale }) {
+ if (so === false) {
+ delete points.pleatFrom
+ delete points.pleatFromIn
+ delete points.pleatTo
+ delete points.pleatToIn
+ delete paths.pleatTo
+ delete paths.pleatFrom
+ delete paths.pleatArrow
+ return true
+ }
+ so = {
+ margin: 35,
+ prefix: 'pleat',
+ reverse: false,
+ ...so,
+ }
+ if (complete) {
+ points[so.prefix + 'From'] = so.from
+ points[so.prefix + 'To'] = so.to
+ points[so.prefix + 'FromIn'] = points[so.prefix + 'From'].shift(
+ so.from.shiftTowards(so.to, 0.1).angle(so.from) + 270,
+ so.margin * scale
+ )
+ points[so.prefix + 'ToIn'] = points[so.prefix + 'To'].shift(
+ so.from.shiftTowards(so.to, 0.1).angle(so.to) + 90,
+ so.margin * scale
+ )
+ paths[so.prefix + 'PleatFrom'] = new Path()
+ .move(points[so.prefix + 'From'])
+ .line(points[so.prefix + 'FromIn'])
+ .attr('class', 'note ' + (so.reverse ? 'dashed' : ''))
+ paths[so.prefix + 'PleatTo'] = new Path()
+ .move(points[so.prefix + 'To'])
+ .line(points[so.prefix + 'ToIn'])
+ .attr('class', 'note ' + (so.reverse ? '' : 'dashed'))
+ paths[so.prefix + 'PleatArrow'] = new Path()
+ .move(
+ points[so.prefix + (so.reverse ? 'To' : 'From')].shiftFractionTowards(
+ points[so.prefix + (so.reverse ? 'ToIn' : 'FromIn')],
+ 0.25
+ )
+ )
+ .line(
+ points[so.prefix + (so.reverse ? 'From' : 'To')].shiftFractionTowards(
+ points[so.prefix + (so.reverse ? 'FromIn' : 'ToIn')],
+ 0.25
+ )
+ )
+ .attr('class', 'note')
+ .attr('marker-end', 'url(#pleatTo)')
+ }
+ },
+ },
+}
+
+// More specifically named exports
+// export const pleatPlugin = plugin
+// export const pluginPleat = plugin
diff --git a/plugins/plugin-annotations/src/sewtogether.mjs b/plugins/plugin-annotations/src/sewtogether.mjs
new file mode 100644
index 00000000000..21c618e5580
--- /dev/null
+++ b/plugins/plugin-annotations/src/sewtogether.mjs
@@ -0,0 +1,94 @@
+import { name, version } from '../data.mjs'
+
+const markers = `
+
+
+
+
+
+
+
+
+
+`
+
+export const plugin = {
+ name,
+ version,
+ hooks: {
+ preRender: (svg) => {
+ if (svg.defs.indexOf(markers) === -1) svg.defs += markers
+ },
+ },
+ macros: {
+ sewtogether: function (so, { points, paths, Path, complete, scale, sa }) {
+ if (so === false) {
+ delete points.sewtogetherFrom
+ delete points.sewtogetherFromCp
+ delete points.sewtogetherMiddle
+ delete points.sewtogetherTo
+ delete points.sewtogetherHinge
+ delete points.sewtogetherToCp
+ delete paths.sewtogetherSewTogetherHinge
+ delete paths.sewtogetherSewTogether
+ return true
+ }
+ so = {
+ prefix: 'sewtogether',
+ ...so,
+ }
+ if (complete) {
+ if (null == so.middle) {
+ so.middle = so.from.shiftFractionTowards(so.to, 0.5)
+ }
+ points[so.prefix + 'From'] = so.from
+ points[so.prefix + 'Middle'] = so.middle
+ points[so.prefix + 'To'] = so.to
+
+ points[so.prefix + 'FromCp'] = points[so.prefix + 'From'].shift(
+ points[so.prefix + 'From'].angle(points[so.prefix + 'Middle']) + 90,
+ points[so.prefix + 'From'].dist(points[so.prefix + 'Middle']) / 1.5
+ )
+ points[so.prefix + 'ToCp'] = points[so.prefix + 'To'].shift(
+ points[so.prefix + 'To'].angle(points[so.prefix + 'Middle']) - 90,
+ points[so.prefix + 'To'].dist(points[so.prefix + 'Middle']) / 1.5
+ )
+
+ if (so.hinge) {
+ points[so.prefix + 'Hinge'] = points[so.prefix + 'Middle'].shift(
+ points[so.prefix + 'Middle'].angle(points[so.prefix + 'To']) +
+ Math.abs(
+ points[so.prefix + 'Middle'].angle(points[so.prefix + 'From']) -
+ points[so.prefix + 'Middle'].angle(points[so.prefix + 'To'])
+ ) /
+ 2 +
+ (sa ? 180 : 0),
+ sa
+ ? sa
+ : Math.min(
+ points[so.prefix + 'From'].dist(points[so.prefix + 'Middle']),
+ points[so.prefix + 'From'].dist(points[so.prefix + 'Middle'])
+ ) / 4
+ )
+ paths[so.prefix + 'SewTogetherHinge'] = new Path()
+ .move(points[so.prefix + 'Middle'])
+ .line(points[so.prefix + 'Hinge'])
+ .attr('marker-start', 'url(#sewTogetherCross)')
+ .attr('class', 'dotted note stroke-sm')
+ }
+ paths[so.prefix + 'SewTogether'] = new Path()
+ .move(points[so.prefix + 'From'])
+ .curve(points[so.prefix + 'FromCp'], points[so.prefix + 'ToCp'], points[so.prefix + 'To'])
+ .attr('class', 'dotted note stroke-sm')
+ .attr('marker-start', 'url(#sewTogetherStart)')
+ .attr('marker-end', 'url(#sewTogetherEnd)')
+ .attr('data-text', 'sewTogether')
+ .attr('data-text-class', 'center fill-note text-xs')
+ }
+ },
+ },
+}
+
+// More specifically named exports
+// export const sewtogetherPlugin = plugin
+// export const pluginSewtogether = plugin
diff --git a/plugins/plugin-cutonfold/tests/plugin.test.mjs b/plugins/plugin-annotations/tests/plugin.test.mjs
similarity index 100%
rename from plugins/plugin-cutonfold/tests/plugin.test.mjs
rename to plugins/plugin-annotations/tests/plugin.test.mjs
diff --git a/plugins/plugin-bartack/CHANGELOG.md b/plugins/plugin-bartack/CHANGELOG.md
deleted file mode 100644
index ce45626fead..00000000000
--- a/plugins/plugin-bartack/CHANGELOG.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Change log for: @freesewing/plugin-bartack
-
-
-## 2.21.0 (2022-06-27)
-
-### Changed
-
- - Migrated from Rollup to Esbuild for all builds
-
-## 2.20.0 (2022-01-24)
-
-### Changed
-
- - Now part of `@freesewing/plugin-bundle`
-
-### Fixed
-
- - Fixed issue with `bartackFractionAlong` macro
- - Handle start and endpoints being the same in `bartackFractionAlong`
- - Support start and endpoints being reversed in `bartackFractionAlong`
-
-## 2.19.6 (2021-12-29)
-
-### Added
-
- - Added (esm) unit tests
-
-### Changed
-
- - Add utility classes and CSS variables for better styling support
-
-
-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-bartack/tests/plugin.test.mjs b/plugins/plugin-bartack/tests/plugin.test.mjs
deleted file mode 100644
index 6e3d569f48a..00000000000
--- a/plugins/plugin-bartack/tests/plugin.test.mjs
+++ /dev/null
@@ -1,291 +0,0 @@
-import chai from 'chai'
-import { round, Design } from '@freesewing/core'
-import { plugin } from '../src/index.mjs'
-
-const expect = chai.expect
-
-describe('Bartack plugin Tests', () => {
- it('draws a default bartack from a point', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
-
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(c.ops[0].to.x).to.equal(10)
- expect(c.ops[0].to.y).to.equal(21.5)
- expect(c.ops[1].type).to.equal('line')
- expect(c.ops[1].to.x).to.equal(10)
- expect(c.ops[1].to.y).to.equal(21.5)
- expect(c.ops[2].to.x).to.equal(10)
- expect(c.ops[2].to.y).to.equal(18.5)
- expect(c.ops[3].to.x).to.equal(11)
- expect(c.ops[3].to.y).to.equal(21.5)
- expect(c.ops[4].to.x).to.equal(11)
- expect(c.ops[4].to.y).to.equal(18.5)
- expect(c.ops).to.have.lengthOf(31)
- })
-
- it('draws a bartack along a path', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, Path, macro, part }) => {
- points.from = new Point(10, 20)
- points.to = new Point(10, 30)
- macro('bartackAlong', {
- path: new Path().move(points.from).line(points.to),
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(c.ops[0].to.x).to.equal(8.5)
- expect(c.ops[0].to.y).to.equal(20)
- expect(c.ops[1].type).to.equal('line')
- expect(c.ops[1].to.x).to.equal(8.5)
- expect(c.ops[1].to.y).to.equal(20)
- expect(c.ops[2].to.x).to.equal(11.5)
- expect(c.ops[2].to.y).to.equal(20)
- expect(c.ops[3].to.x).to.equal(8.5)
- expect(c.ops[3].to.y).to.equal(21)
- expect(c.ops[4].to.x).to.equal(11.5)
- expect(c.ops[4].to.y).to.equal(21)
- expect(c.ops).to.have.lengthOf(21)
- })
-
- it('can be called using the bartackFractionAlong syntax', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, Path, macro, part }) => {
- points.from = new Point(10, 20)
- points.to = new Point(10, 100)
- macro('bartackAlong', {
- path: new Path().move(points.from).line(points.to),
- start: 0.2,
- end: 0.8,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(round(c.ops[0].to.x)).to.equal(8.5)
- expect(c.ops[0].to.y).to.equal(20)
- expect(c.ops[1].type).to.equal('line')
- expect(round(c.ops[1].to.x)).to.equal(8.5)
- expect(c.ops[1].to.y).to.equal(20)
- expect(round(c.ops[2].to.x)).to.equal(11.5)
- expect(c.ops[2].to.y).to.equal(20)
- expect(round(c.ops[3].to.x)).to.equal(8.5)
- expect(c.ops[3].to.y).to.equal(21)
- expect(round(c.ops[4].to.x)).to.equal(11.5)
- expect(c.ops[4].to.y).to.equal(21)
- expect(c.ops).to.have.lengthOf(161)
- })
-
- it('can be called using the bartackFractionAlong syntax', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, Path, macro, part }) => {
- points.from = new Point(10, 20)
- points.to = new Point(10, 100)
- macro('bartackFractionAlong', {
- path: new Path().move(points.from).line(points.to),
- start: 0.2,
- end: 0.8,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(round(c.ops[0].to.x)).to.equal(8.5)
- expect(c.ops[0].to.y).to.equal(36)
- expect(c.ops[1].type).to.equal('line')
- expect(round(c.ops[1].to.x)).to.equal(8.5)
- expect(c.ops[1].to.y).to.equal(36)
- expect(round(c.ops[2].to.x)).to.equal(11.5)
- expect(c.ops[2].to.y).to.equal(36)
- expect(round(c.ops[3].to.x)).to.equal(8.5)
- expect(c.ops[3].to.y).to.equal(37)
- expect(round(c.ops[4].to.x)).to.equal(11.5)
- expect(c.ops[4].to.y).to.equal(37)
- expect(c.ops).to.have.lengthOf(97)
- })
-
- it('has configurable length', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- length: 20,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(c.ops[0].to.x).to.equal(10)
- expect(c.ops[0].to.y).to.equal(21.5)
- expect(c.ops[1].type).to.equal('line')
- expect(c.ops[1].to.x).to.equal(10)
- expect(c.ops[1].to.y).to.equal(21.5)
- expect(c.ops[2].to.x).to.equal(10)
- expect(c.ops[2].to.y).to.equal(18.5)
- expect(c.ops[3].to.x).to.equal(11)
- expect(c.ops[3].to.y).to.equal(21.5)
- expect(c.ops[4].to.x).to.equal(11)
- expect(c.ops[4].to.y).to.equal(18.5)
- expect(c.ops).to.have.lengthOf(41)
- })
-
- it('has configurable width', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- width: 5,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(c.ops[0].to.x).to.equal(10)
- expect(c.ops[0].to.y).to.equal(22.5)
- expect(c.ops[1].type).to.equal('line')
- expect(c.ops[1].to.x).to.equal(10)
- expect(c.ops[1].to.y).to.equal(22.5)
- expect(c.ops[2].to.x).to.equal(10)
- expect(c.ops[2].to.y).to.equal(17.5)
- expect(round(c.ops[3].to.x)).to.equal(11.67)
- expect(c.ops[3].to.y).to.equal(22.5)
- expect(round(c.ops[4].to.x)).to.equal(11.67)
- expect(c.ops[4].to.y).to.equal(17.5)
- expect(c.ops).to.have.lengthOf(19)
- })
-
- it('has configurable angle', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- angle: 45,
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- expect(c.ops[0].type).to.equal('move')
- expect(round(c.ops[0].to.x)).to.equal(11.06)
- expect(round(c.ops[0].to.y)).to.equal(21.06)
- expect(c.ops[1].type).to.equal('line')
- expect(round(c.ops[1].to.x)).to.equal(11.06)
- expect(round(c.ops[1].to.y)).to.equal(21.06)
- expect(round(c.ops[2].to.x)).to.equal(8.94)
- expect(round(c.ops[2].to.y)).to.equal(18.94)
- expect(round(c.ops[3].to.x)).to.equal(11.72)
- expect(round(c.ops[3].to.y)).to.equal(20.4)
- expect(round(c.ops[4].to.x)).to.equal(9.6)
- expect(round(c.ops[4].to.y)).to.equal(18.28)
- expect(c.ops).to.have.lengthOf(33)
- })
-
- it('has configurable suffix', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- suffix: 'foo',
- })
-
- part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.bartackfoo
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- })
-
- it('has configurable prefix', function () {
- const part = {
- name: 'test',
- draft: ({ Point, points, macro, part }) => {
- points.from = new Point(10, 20)
- macro('bartack', {
- anchor: points.from,
- prefix: 'foo',
- })
-
- return part
- },
- plugins: [plugin],
- }
- const design = new Design({ parts: [part] })
- const pattern = new design()
- pattern.draft()
- const c = pattern.parts[0].test.paths.foobartack
- expect(c.attributes.get('class')).to.equal('stroke-sm stroke-mark')
- })
-})
diff --git a/plugins/plugin-bartack/tests/shared.test.mjs b/plugins/plugin-bartack/tests/shared.test.mjs
deleted file mode 100644
index 7bf4f668398..00000000000
--- a/plugins/plugin-bartack/tests/shared.test.mjs
+++ /dev/null
@@ -1,6 +0,0 @@
-// This file is auto-generated | Any changes you make will be overwritten.
-import { plugin } from '../src/index.mjs'
-import { sharedPluginTests } from '../../../tests/plugins/shared.mjs'
-
-// Run shared tests
-sharedPluginTests(plugin)
diff --git a/plugins/plugin-bundle/package.json b/plugins/plugin-bundle/package.json
index 9159ea74ff2..d6b88c3eec1 100644
--- a/plugins/plugin-bundle/package.json
+++ b/plugins/plugin-bundle/package.json
@@ -53,9 +53,9 @@
"devDependencies": {
"mocha": "10.0.0",
"chai": "4.2.0",
+ "@freesewing/plugin-annotations": "3.0.0-alpha.4",
"@freesewing/plugin-banner": "3.0.0-alpha.4",
"@freesewing/plugin-buttons": "3.0.0-alpha.4",
- "@freesewing/plugin-cutonfold": "3.0.0-alpha.4",
"@freesewing/plugin-dimension": "3.0.0-alpha.4",
"@freesewing/plugin-grainline": "3.0.0-alpha.4",
"@freesewing/plugin-logo": "3.0.0-alpha.4",
diff --git a/plugins/plugin-bundle/src/index.mjs b/plugins/plugin-bundle/src/index.mjs
index d72b9f954fe..e2524a659ea 100644
--- a/plugins/plugin-bundle/src/index.mjs
+++ b/plugins/plugin-bundle/src/index.mjs
@@ -1,7 +1,11 @@
+import { bartackPlugin } from '../../plugin-annotations/src/index.mjs'
+import { crossboxPlugin } from '../../plugin-annotations/src/index.mjs'
+import { cutonfoldPlugin } from '../../plugin-annotations/src/index.mjs'
+import { pleatPlugin } from '../../plugin-annotations/src/index.mjs'
+import { sewtogetherPlugin } from '../../plugin-annotations/src/index.mjs'
+
import { bannerPlugin } from '../../plugin-banner/src/index.mjs'
-import { bartackPlugin } from '../../plugin-bartack/src/index.mjs'
import { buttonsPlugin } from '../../plugin-buttons/src/index.mjs'
-import { cutonfoldPlugin } from '../../plugin-cutonfold/src/index.mjs'
import { dimensionPlugin } from '../../plugin-dimension/src/index.mjs'
import { grainlinePlugin } from '../../plugin-grainline/src/index.mjs'
import { logoPlugin } from '../../plugin-logo/src/index.mjs'
@@ -18,6 +22,7 @@ const bundledPlugins = [
bannerPlugin,
bartackPlugin,
buttonsPlugin,
+ crossboxPlugin,
cutonfoldPlugin,
dimensionPlugin,
grainlinePlugin,
@@ -25,8 +30,10 @@ const bundledPlugins = [
measurementsPlugin,
mirrorPlugin,
notchesPlugin,
+ pleatPlugin,
roundPlugin,
scaleboxPlugin,
+ sewtogetherPlugin,
sprinklePlugin,
titlePlugin,
]
diff --git a/plugins/plugin-cutonfold/CHANGELOG.md b/plugins/plugin-cutonfold/CHANGELOG.md
deleted file mode 100644
index 27b7b278169..00000000000
--- a/plugins/plugin-cutonfold/CHANGELOG.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Change log for: @freesewing/plugin-cutonfold
-
-
-## 2.21.0 (2022-06-27)
-
-### Changed
-
- - Migrated from Rollup to Esbuild for all builds
-
-## 2.20.0 (2022-01-24)
-
-### Added
-
- - Support for scale setting
-
-## 2.19.6 (2021-12-29)
-
-### Added
-
- - Added (esm) unit tests
-
-## 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-cutonfold/build.mjs b/plugins/plugin-cutonfold/build.mjs
deleted file mode 100644
index 99ace216bc8..00000000000
--- a/plugins/plugin-cutonfold/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-cutonfold/data.mjs b/plugins/plugin-cutonfold/data.mjs
deleted file mode 100644
index 0c74bc30573..00000000000
--- a/plugins/plugin-cutonfold/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-cutonfold'
-export const version = '3.0.0-alpha.4'
-export const data = { name, version }
diff --git a/plugins/plugin-cutonfold/package.json b/plugins/plugin-cutonfold/package.json
deleted file mode 100644
index 4c5108a0be6..00000000000
--- a/plugins/plugin-cutonfold/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "@freesewing/plugin-cutonfold",
- "version": "3.0.0-alpha.4",
- "description": "A FreeSewing plugin to add cut-on-fold indicators on your patterns",
- "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-cutonfold/src/lib/markers.js b/plugins/plugin-cutonfold/src/lib/markers.js
deleted file mode 100644
index b60f1aed59f..00000000000
--- a/plugins/plugin-cutonfold/src/lib/markers.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// FIXME identical arrow paths for dimensions, cutonfold, and grainline
-export default `
-
-
-
-
-
-
-`;
diff --git a/plugins/plugin-cutonfold/tests/shared.test.mjs b/plugins/plugin-cutonfold/tests/shared.test.mjs
deleted file mode 100644
index 7bf4f668398..00000000000
--- a/plugins/plugin-cutonfold/tests/shared.test.mjs
+++ /dev/null
@@ -1,6 +0,0 @@
-// This file is auto-generated | Any changes you make will be overwritten.
-import { plugin } from '../src/index.mjs'
-import { sharedPluginTests } from '../../../tests/plugins/shared.mjs'
-
-// Run shared tests
-sharedPluginTests(plugin)