diff --git a/packages/components/src/Draft/Defs/index.js b/packages/components/src/Draft/Defs/index.js
index 86ce4fe549c..e30cefa4238 100644
--- a/packages/components/src/Draft/Defs/index.js
+++ b/packages/components/src/Draft/Defs/index.js
@@ -24,6 +24,8 @@ const Defs = (props) => {
{paperlessGrids}
+ {props.extraDefs || ''}
+
)
}
diff --git a/packages/components/src/Draft/index.js b/packages/components/src/Draft/index.js
index b2f1b79dfc9..dd59b265f46 100644
--- a/packages/components/src/Draft/index.js
+++ b/packages/components/src/Draft/index.js
@@ -20,6 +20,7 @@ const Draft = (props) => (
parts={props.parts}
paperless={props.settings.paperless}
design={props.design || false}
+ extraDefs={props.extraDefs}
/>
{Object.keys(props.parts).map((name) => (
diff --git a/packages/core/src/hooks.js b/packages/core/src/hooks.js
index 70a7f93fb31..fcbd1fa867d 100644
--- a/packages/core/src/hooks.js
+++ b/packages/core/src/hooks.js
@@ -6,7 +6,6 @@ export default function Hooks() {
postSample: [],
preRender: [],
postRender: [],
- insertText: [],
- debug: []
+ insertText: []
}
}
diff --git a/packages/core/src/part.js b/packages/core/src/part.js
index e379b59af2b..1cd917a8394 100644
--- a/packages/core/src/part.js
+++ b/packages/core/src/part.js
@@ -28,34 +28,17 @@ function Part() {
return this
}
-Part.prototype.macroClosure = function(args) {
+Part.prototype.macroClosure = function (args) {
let self = this
- let method = function(key, args) {
+ let method = function (key, args) {
let macro = utils.macroName(key)
- if (typeof self[macro] === 'function') {
- self[macro](args)
- } else {
- self.debug({
- type: 'warning',
- label: '🚨 Macro not found',
- msg: `Macro ${key} is not registered`
- })
- }
+ if (typeof self[macro] === 'function') self[macro](args)
}
return method
}
-Part.prototype.debugClosure = function() {
- let self = this
- let method = function(data) {
- self.debug(data)
- }
-
- return method
-}
-
-Part.prototype.runHooks = function(hookName, data = false) {
+Part.prototype.runHooks = function (hookName, data = false) {
if (data === false) data = this
let hooks = this.hooks[hookName]
if (hooks && hooks.length > 0) {
@@ -65,22 +48,17 @@ Part.prototype.runHooks = function(hookName, data = false) {
}
}
-/** Debug method */
-Part.prototype.debug = function(data) {
- this.runHooks('debug', data)
-}
-
/** Returns an unused ID */
-Part.prototype.getId = function() {
+Part.prototype.getId = function () {
this.freeId += 1
return '' + this.freeId
}
/** Returns a value formatted for units provided in settings */
-Part.prototype.unitsClosure = function(value) {
+Part.prototype.unitsClosure = function (value) {
let self = this
- let method = function(value) {
+ let method = function (value) {
return utils.units(value, self.context.settings.units)
}
@@ -88,7 +66,7 @@ Part.prototype.unitsClosure = function(value) {
}
/** Calculates the part's bounding box and sets it */
-Part.prototype.boundary = function() {
+Part.prototype.boundary = function () {
if (this.topLeft) return this // Cached
let topLeft = new Point(Infinity, Infinity)
@@ -130,7 +108,7 @@ Part.prototype.boundary = function() {
}
/** Stacks part so that its top left corner is in (0,0) */
-Part.prototype.stack = function() {
+Part.prototype.stack = function () {
if (this.topLeft !== false) return this
else this.boundary()
if (this.topLeft.x == 0 && this.topLeft.y == 0) return this
@@ -140,7 +118,7 @@ Part.prototype.stack = function() {
}
/** Adds an attribute. This is here to make this call chainable in assignment */
-Part.prototype.attr = function(name, value, overwrite = false) {
+Part.prototype.attr = function (name, value, overwrite = false) {
if (overwrite) this.attributes.set(name, value)
else this.attributes.add(name, value)
@@ -148,8 +126,8 @@ Part.prototype.attr = function(name, value, overwrite = false) {
}
/** Copies point/path/snippet data from part orig into this */
-Part.prototype.inject = function(orig) {
- const findBasePoint = p => {
+Part.prototype.inject = function (orig) {
+ const findBasePoint = (p) => {
for (let i in orig.points) {
if (orig.points[i] === p) return i
}
@@ -182,12 +160,12 @@ Part.prototype.inject = function(orig) {
return this
}
-Part.prototype.units = function(input) {
+Part.prototype.units = function (input) {
return utils.units(input, this.context.settings.units)
}
/** Returns an object with shorthand access for pattern design */
-Part.prototype.shorthand = function() {
+Part.prototype.shorthand = function () {
let complete = this.context.settings.complete ? true : false
let paperless = this.context.settings.paperless === true ? true : false
let sa = this.context.settings.complete ? this.context.settings.sa || 0 : 0
@@ -206,8 +184,7 @@ Part.prototype.shorthand = function() {
Path: this.Path,
Snippet: this.Snippet,
complete,
- paperless,
- debug: this.debugClosure()
+ paperless
}
}
diff --git a/packages/core/src/pattern.js b/packages/core/src/pattern.js
index 60f3836e703..b031f2deefb 100644
--- a/packages/core/src/pattern.js
+++ b/packages/core/src/pattern.js
@@ -182,7 +182,18 @@ Pattern.prototype.sampleRun = function (parts, anchors, run, runs, extraClass =
for (let j in this.parts[i].paths) {
parts[i].paths[j + '_' + run] = this.parts[i].paths[j]
.clone()
- .attr('style', sampleStyle(run, runs, this.settings.sample.styles))
+ .attr(
+ 'style',
+ extraClass === 'sample-focus'
+ ? this.settings.sample
+ ? this.settings.sample.focusStyle || sampleStyle(run, runs)
+ : sampleStyle(run, runs)
+ : sampleStyle(
+ run,
+ runs,
+ this.settings.sample ? this.settings.sample.styles || false : false
+ )
+ )
.attr('data-sample-run', run)
.attr('data-sample-runs', runs)
if (this.parts[i].points.anchor)
@@ -216,11 +227,6 @@ Pattern.prototype.sampleOption = function (optionName) {
step = (option.max / factor - val) / 9
for (let run = 1; run < 11; run++) {
this.settings.options[optionName] = val
- this.debug({
- type: 'info',
- label: '🏃🏿♀️ Sample run',
- msg: `Sampling option ${optionName} with value ${round(val)}`
- })
this.sampleRun(parts, anchors, run, 10)
val += step
}
@@ -238,11 +244,6 @@ Pattern.prototype.sampleListOption = function (optionName) {
let runs = option.list.length
for (let val of option.list) {
this.settings.options[optionName] = val
- this.debug({
- type: 'info',
- label: '🏃🏿♀️ Sample run',
- msg: `Sampling option ${optionName} with value ${round(val)}`
- })
this.sampleRun(parts, anchors, run, runs)
run++
}
@@ -266,11 +267,6 @@ Pattern.prototype.sampleMeasurement = function (measurementName) {
val = val * 0.9
for (let run = 1; run < 11; run++) {
this.settings.measurements[measurementName] = val
- this.debug({
- type: 'info',
- label: '🏃🏿♀️ Sample run',
- msg: `Sampling option ${measurementName} with value ${round(val)}`
- })
this.sampleRun(parts, anchors, run, 10)
val += step
}
@@ -288,18 +284,18 @@ Pattern.prototype.sampleModels = function (models, focus = false) {
this.runHooks('preSample')
let anchors = {}
let parts = this.sampleParts()
- let run = 0
+ // If there's a focus, do it first so it's at the bottom of the SVG
+ if (focus) {
+ this.settings.measurements = models[focus]
+ this.sampleRun(parts, anchors, -1, -1, 'sample-focus')
+ delete models[focus]
+ }
+ let run = -1
let runs = Object.keys(models).length
for (let l in models) {
run++
this.settings.measurements = models[l]
- this.debug({
- type: 'info',
- label: '🏃🏿♀️ Sample run',
- msg: `Sampling model ${l}`
- })
- let className = l === focus ? 'sample-focus' : ''
- this.sampleRun(parts, anchors, run, runs, className)
+ this.sampleRun(parts, anchors, run, runs)
}
this.parts = parts
this.runHooks('postSample')
@@ -307,11 +303,6 @@ Pattern.prototype.sampleModels = function (models, focus = false) {
return this
}
-/** Debug method, exposes debug hook */
-Pattern.prototype.debug = function (data) {
- this.runHooks('debug', data)
-}
-
Pattern.prototype.render = function () {
this.svg = new Svg(this)
this.svg.hooks = this.hooks
@@ -324,11 +315,6 @@ Pattern.prototype.on = function (hook, method, data) {
}
Pattern.prototype.use = function (plugin, data) {
- this.debug({
- type: 'success',
- label: '🔌 Plugin loaded',
- msg: `${plugin.name} v${plugin.version}`
- })
if (plugin.hooks) this.loadPluginHooks(plugin, data)
if (plugin.macros) this.loadPluginMacros(plugin)
diff --git a/packages/core/src/svg.js b/packages/core/src/svg.js
index 09164e87f82..d52ff5e5b58 100644
--- a/packages/core/src/svg.js
+++ b/packages/core/src/svg.js
@@ -21,7 +21,7 @@ function Svg(pattern) {
this.attributes.add('freesewing', version)
}
-Svg.prototype.runHooks = function(hookName, data = false) {
+Svg.prototype.runHooks = function (hookName, data = false) {
if (data === false) data = this
let hooks = this.hooks[hookName]
if (hooks.length > 0) {
@@ -32,7 +32,7 @@ Svg.prototype.runHooks = function(hookName, data = false) {
}
/** Runs insertText hooks */
-Svg.prototype.insertText = function(text) {
+Svg.prototype.insertText = function (text) {
if (this.hooks.insertText.length > 0) {
for (let hook of this.hooks.insertText)
text = hook.method(this.pattern.settings.locale, text, hook.data)
@@ -41,11 +41,8 @@ Svg.prototype.insertText = function(text) {
return text
}
-/** Debug method, exposes debug hook */
-Svg.prototype.debug = function() {}
-
/** Renders a draft object as SVG */
-Svg.prototype.render = function(pattern) {
+Svg.prototype.render = function (pattern) {
this.idPrefix = pattern.settings.idPrefix
this.runHooks('preRender')
if (!pattern.settings.embed) {
@@ -77,7 +74,7 @@ Svg.prototype.render = function(pattern) {
}
/** Renders SVG head section */
-Svg.prototype.renderHead = function() {
+Svg.prototype.renderHead = function () {
let svg = this.renderStyle()
svg += this.renderScript()
svg += this.renderDefs()
@@ -87,7 +84,7 @@ Svg.prototype.renderHead = function() {
}
/** Renders SVG closing section */
-Svg.prototype.renderTail = function() {
+Svg.prototype.renderTail = function () {
let svg = ''
svg += this.closeGroup()
svg += this.nl() + ''
@@ -96,7 +93,7 @@ Svg.prototype.renderTail = function() {
}
/** Returns SVG code for the opening SVG tag */
-Svg.prototype.renderSvgTag = function() {
+Svg.prototype.renderSvgTag = function () {
let svg = '${this.renderPathText(path)}`
}
-Svg.prototype.renderPathText = function(path) {
+Svg.prototype.renderPathText = function (path) {
let text = path.attributes.get('data-text')
if (!text) return ''
else this.text = this.insertText(text)
@@ -181,16 +178,16 @@ Svg.prototype.renderPathText = function(path) {
else if (align && align.indexOf('right') > -1) offset = ' startOffset="100%" '
let svg = this.nl() + ''
this.indent()
- svg += `${
- this.escapeText(this.text)
- }`
+ svg += `${this.escapeText(this.text)}`
this.outdent()
svg += this.nl() + ''
return svg
}
-Svg.prototype.renderText = function(point) {
+Svg.prototype.renderText = function (point) {
let text = point.attributes.getAsArray('data-text')
if (text !== false) {
let joint = ''
@@ -214,8 +211,7 @@ Svg.prototype.renderText = function(point) {
svg += `${line}`
}
} else {
- svg += `${this.escapeText(this.text)
- }`
+ svg += `${this.escapeText(this.text)}`
}
this.outdent()
svg += this.nl() + ''
@@ -223,18 +219,18 @@ Svg.prototype.renderText = function(point) {
return svg
}
-Svg.prototype.escapeText = function(text) {
+Svg.prototype.escapeText = function (text) {
return text.replace('"', '“')
}
-Svg.prototype.renderCircle = function(point) {
+Svg.prototype.renderCircle = function (point) {
return ``
}
/** Returns SVG code for a snippet */
-Svg.prototype.renderSnippet = function(snippet, part) {
+Svg.prototype.renderSnippet = function (snippet, part) {
let x = snippet.anchor.x
let y = snippet.anchor.y
let scale = snippet.attributes.get('data-scale')
@@ -256,7 +252,7 @@ Svg.prototype.renderSnippet = function(snippet, part) {
}
/** Returns SVG code to open a group */
-Svg.prototype.openGroup = function(id, attributes = false) {
+Svg.prototype.openGroup = function (id, attributes = false) {
let svg = this.nl() + this.nl()
svg += ``
svg += this.nl()
@@ -270,19 +266,19 @@ Svg.prototype.openGroup = function(id, attributes = false) {
}
/** Returns SVG code to close a group */
-Svg.prototype.closeGroup = function() {
+Svg.prototype.closeGroup = function () {
this.outdent()
return `${this.nl()}${this.nl()}`
}
/** Returns a linebreak + identation */
-Svg.prototype.nl = function() {
+Svg.prototype.nl = function () {
return '\n' + this.tab()
}
/** Returns indentation */
-Svg.prototype.tab = function() {
+Svg.prototype.tab = function () {
let space = ''
for (let i = 0; i < this.tabs; i++) {
space += ' '
@@ -292,17 +288,17 @@ Svg.prototype.tab = function() {
}
/** Increases indentation by 1 */
-Svg.prototype.indent = function() {
+Svg.prototype.indent = function () {
this.tabs += 1
}
/** Decreases indentation by 1 */
-Svg.prototype.outdent = function() {
+Svg.prototype.outdent = function () {
this.tabs -= 1
}
/** Returns an unused ID */
-Svg.prototype.getId = function() {
+Svg.prototype.getId = function () {
this.freeId += 1
return '' + this.freeId
diff --git a/packages/css-theme/src/components/_draft.scss b/packages/css-theme/src/components/_draft.scss
index d8c4c0910dd..09e5d1861a4 100644
--- a/packages/css-theme/src/components/_draft.scss
+++ b/packages/css-theme/src/components/_draft.scss
@@ -53,11 +53,6 @@ svg.freesewing.draft {
stroke: none !important;
fill: none !important;
}
- /* sample */
- path.sample-focus {
- stroke-width: 0;
- fill-opacity: 0.2;
- }
/* Text */
text {