diff --git a/config/dependencies.yaml b/config/dependencies.yaml
index a0d6f73881b..dc8f05d6805 100644
--- a/config/dependencies.yaml
+++ b/config/dependencies.yaml
@@ -29,6 +29,9 @@ components:
peer:
"react": "^16.4.1"
"prop-types": "15.7.2"
+ "@freesewing/patterns": "^{{version}}"
+ "@freesewing/i18n": "^{{version}}"
+ "react-intl": "^2.8.0"
core:
_:
"bezier-js": "^2.2.13"
diff --git a/packages/components/.storybook/config.js b/packages/components/.storybook/config.js
index 855fa185d85..e216d09d8dd 100644
--- a/packages/components/.storybook/config.js
+++ b/packages/components/.storybook/config.js
@@ -1,6 +1,9 @@
+import React from "react";
import { configure } from "@storybook/react";
-import { addParameters } from "@storybook/react";
import "../../../dist/css-theme/theme.css";
+import { addParameters, addDecorator } from "@storybook/react";
+import { IntlProvider } from "react-intl";
+import { strings } from "@freesewing/i18n";
function loadStories() {
// Load all 'stories.js' files under src
@@ -8,6 +11,12 @@ function loadStories() {
req.keys().forEach(filename => req(filename));
}
+addDecorator(story => (
+
+ {story()}
+
+));
+
//addParameters({
// backgrounds: [
// { name: 'Light', value: '#f8f9fa', default: true },
diff --git a/packages/components/package-lock.json b/packages/components/package-lock.json
new file mode 100644
index 00000000000..61716afd00a
--- /dev/null
+++ b/packages/components/package-lock.json
@@ -0,0 +1,1193 @@
+{
+ "name": "@freesewing/components",
+ "version": "0.33.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@freesewing/aaron": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/aaron/-/aaron-0.14.0.tgz",
+ "integrity": "sha512-C8moTyZCwbG0YU0wx0yNAtjwV5NkIGA1Vw3rxiRoQTB+a7+f1S9cqol1QcRlEIEzf+W7piQSUL8VB9hgKPFvsA=="
+ },
+ "@freesewing/bent": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/bent/-/bent-0.1.2.tgz",
+ "integrity": "sha512-ic39iC5KioQea7R55Axd9A2MNKtMqKRijE/58eOMp6TH+1UWKb8MAg1/2KX19vgKF98B/bi0Ot1WliqV1OZgPw==",
+ "requires": {
+ "@freesewing/brian": "^0.25.0",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ }
+ }
+ },
+ "@freesewing/brian": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.25.0.tgz",
+ "integrity": "sha512-MhY+fEhQ01ImNtupKm4BwRuJ0Ihk0LlEDHupbjpVKekg8kDwnfCgoSDYpmzG2e16GqdZgYdGxPLdB4MFy67VRg=="
+ },
+ "@freesewing/bruce": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/bruce/-/bruce-0.6.6.tgz",
+ "integrity": "sha512-KmGYKhZ9z2Qc4rmJecYy8Hejms44ok+Y5AklcItqKejKWItkbgJB+qtQm577T3DugPN9Efq1obYDi0KQuKKuBw==",
+ "requires": {
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/carlton": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/carlton/-/carlton-0.2.0.tgz",
+ "integrity": "sha512-jflje/ZYeW4n8X4FK20PbThqI2D1sfs//VQvfBghxReTpFvDj9JCcilbe8aOyJ86z2EB7fm6/IDMNQDdtnp6rw==",
+ "requires": {
+ "@freesewing/bent": "0.1.2",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "@freesewing/plugin-buttons": "^0.2.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ }
+ }
+ },
+ "@freesewing/cathrin": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/cathrin/-/cathrin-0.5.6.tgz",
+ "integrity": "sha512-Z1Ww+eJ6aRIgCxmav+8hPQqKPa/LcO++eCLVMADRZrfVSMif3GTWqzyM3lQhvtILu8jexlSk6RJd0zGNDZHaAA==",
+ "requires": {
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/examples": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/@freesewing/examples/-/examples-0.7.8.tgz",
+ "integrity": "sha512-hMpf6Wqcc9ppv44oWmXYa1wBkpjF6IQnZXVnupBGSVjqxwaMXd4AFxxAYdAO9ZyqxBe4hAfcZWa2BjnTbGQDQA==",
+ "requires": {
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/huey": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/huey/-/huey-0.1.3.tgz",
+ "integrity": "sha512-CuzZ0QRkG/wtwIoi4fIIsjOS/oWOtfZ9IQtM+9aObKItFgYcmyYQkFbAOfrLanSxzlUnck283iAGUpv4mqIKKw==",
+ "requires": {
+ "@freesewing/brian": "^0.25.0",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ }
+ }
+ },
+ "@freesewing/hugo": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/hugo/-/hugo-0.5.6.tgz",
+ "integrity": "sha512-sMXoqC1jUxKWZ5IVpRqmz/9lt0eMFOcbyMlQmRA7nHmh6PLf2gw4j6RtszLqYd69En6OUvh6T81lytRCRjcDRQ==",
+ "requires": {
+ "@freesewing/brian": "0.23.2",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/brian": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.23.2.tgz",
+ "integrity": "sha512-3YE/xC6fGZXvmMNZgxUXy81VNDpS5aHsWlAo9sC0CGchB7tiZAOv5g8bNyDE9yoqC63tOyElKabDiT1BPZzE+g==",
+ "requires": {
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ }
+ },
+ "freesewing": {
+ "version": "0.31.0",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.31.0.tgz",
+ "integrity": "sha512-ciQK7BzsL05a4uGvq/Slr+zqOx3eaJD1M0iYD1o3GBcA4QAuSfY2EPOwLcNMHYEW0bo/e5ZEKQDhPGgOyCKnhQ==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ }
+ }
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/i18n": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/i18n/-/i18n-0.11.3.tgz",
+ "integrity": "sha512-6PLdqTt6KFPNRMNdOFGjzxtMq+OurTjeCmGYtjqbrReBhcehVN0tXkBmtIh7kmFQBMumYfO1RLncCaL+pIcX7w=="
+ },
+ "@freesewing/jaeger": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/jaeger/-/jaeger-0.2.1.tgz",
+ "integrity": "sha512-o/T4b7AYQ8ocpuyaux93r+kbBNqLEZmYm95D/KyzGxL3StRpG78MXMm/1Dp3AuTWbxJBUPISB9QZhiFD/OyMNw==",
+ "requires": {
+ "@freesewing/bent": "0.1.1",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "@freesewing/plugin-buttons": "0.1.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/bent": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/bent/-/bent-0.1.1.tgz",
+ "integrity": "sha512-Jkls685GTzlNi/6pph3CkasDSw3pZh78WsgxEhpH2q0GrsBCtjwI5FOHPTEVrVVpviBWlIo6S33P8GJ2FHwkSg==",
+ "requires": {
+ "@freesewing/brian": "^0.25.0",
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ }
+ }
+ }
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ }
+ }
+ },
+ "@freesewing/plugin-buttons": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-buttons/-/plugin-buttons-0.1.0.tgz",
+ "integrity": "sha512-X3C4duwnx0CT9Q6zUfPeErlz4A1nJMdTLJ/smhtkfjOK9G81hsKkyRO8JIGb7vHcz9McMD5yq3xbsBxVAvGyLw=="
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ }
+ }
+ },
+ "@freesewing/patterns": {
+ "version": "0.18.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/patterns/-/patterns-0.18.6.tgz",
+ "integrity": "sha512-zTu8c9SUbmtpX100h/z/ZeX3TuO0IM19OEZ9/una1zurqcIfKsQsjGGnlb0Z3jD4k9Ot997vZ/9KQvp+wpdbSQ==",
+ "requires": {
+ "@freesewing/aaron": "^0.14.0",
+ "@freesewing/bent": "^0.1.2",
+ "@freesewing/brian": "^0.25.0",
+ "@freesewing/bruce": "^0.6.6",
+ "@freesewing/carlton": "0.2.0",
+ "@freesewing/cathrin": "^0.5.6",
+ "@freesewing/examples": "^0.7.8",
+ "@freesewing/huey": "^0.1.3",
+ "@freesewing/hugo": "^0.5.6",
+ "@freesewing/jaeger": "0.2.1",
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "@freesewing/simon": "^0.4.6",
+ "@freesewing/sven": "^0.2.6",
+ "@freesewing/tamiko": "^0.2.5",
+ "@freesewing/trayvon": "^0.1.5",
+ "@freesewing/wahid": "^0.1.3"
+ }
+ },
+ "@freesewing/plugin-banner": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-banner/-/plugin-banner-0.3.0.tgz",
+ "integrity": "sha512-fdcAZGZv+qbgkloWipKlI7D+GojCDGDNB5YLVWOtsheZpC8GFjSVW6K1rhZy8/jQoVwySM8uVKILouJivObUOw=="
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ }
+ }
+ },
+ "@freesewing/plugin-buttons": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-buttons/-/plugin-buttons-0.2.0.tgz",
+ "integrity": "sha512-NzaU3Wssf28dvZ4iXvpvomVLkak4SZsFlRGzll6ej6BoJifujdCXEMYWwrz5yNB1Ko0NXMw81xHmkLi95bJHRA=="
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-flip": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-flip/-/plugin-flip-0.2.0.tgz",
+ "integrity": "sha512-XEk3jnsLj3XK6auhwN3+oFZZ2CKIfOYisK1WK8QwBBCjkXyXLzqi7Ja8rAEgtBpQbuSHkbv6FEqAeGWFpjGdPw=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ },
+ "@freesewing/simon": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/simon/-/simon-0.4.6.tgz",
+ "integrity": "sha512-L0UfzsVAs3EiRVZF2zFd6BmZioaRMwTjmezqPOW7UQDD2BMVCSTdLCkaVt56xJN7BoSp+y30t+NL3AfRMM+djQ==",
+ "requires": {
+ "@freesewing/brian": "0.22.15",
+ "@freesewing/plugin-banner": "^0.3.0",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "@freesewing/plugin-buttons": "^0.2.0",
+ "@freesewing/plugin-flip": "^0.2.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/brian": {
+ "version": "0.22.15",
+ "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.22.15.tgz",
+ "integrity": "sha512-4gO2y4VoH3IRL8yKQD2T/6xF1bvgOYbo0rrkaJbGC/hG6pHfzk9M15Zjx+hDtXgadzoj7MP10FasrMBswU+IXw==",
+ "requires": {
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ }
+ },
+ "freesewing": {
+ "version": "0.31.0",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.31.0.tgz",
+ "integrity": "sha512-ciQK7BzsL05a4uGvq/Slr+zqOx3eaJD1M0iYD1o3GBcA4QAuSfY2EPOwLcNMHYEW0bo/e5ZEKQDhPGgOyCKnhQ==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ }
+ }
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/sven": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/@freesewing/sven/-/sven-0.2.6.tgz",
+ "integrity": "sha512-x/dlbSAnfXE5mxY2lG2aORZNw4Aoq7VGXKi8Ap6hvFVrohFxIg0A1ttvmxVIVIyadAPbvF/wFBfu+6VCIOQsUQ==",
+ "requires": {
+ "@freesewing/brian": "0.23.2",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/brian": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.23.2.tgz",
+ "integrity": "sha512-3YE/xC6fGZXvmMNZgxUXy81VNDpS5aHsWlAo9sC0CGchB7tiZAOv5g8bNyDE9yoqC63tOyElKabDiT1BPZzE+g==",
+ "requires": {
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ }
+ },
+ "freesewing": {
+ "version": "0.31.0",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.31.0.tgz",
+ "integrity": "sha512-ciQK7BzsL05a4uGvq/Slr+zqOx3eaJD1M0iYD1o3GBcA4QAuSfY2EPOwLcNMHYEW0bo/e5ZEKQDhPGgOyCKnhQ==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ }
+ }
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/tamiko": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@freesewing/tamiko/-/tamiko-0.2.5.tgz",
+ "integrity": "sha512-gyojHmVdOxFl0nsCV9W5VERgQXuT8qsPmiTSSoHGrOAIc3X46gawJOXpWxtdz4k6rS/U1juYRfKY9WLU3NvgCA==",
+ "requires": {
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/trayvon": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@freesewing/trayvon/-/trayvon-0.1.5.tgz",
+ "integrity": "sha512-W9SrnWSDWdU0vcvSgODfh4ehnvh0Q9MQwfJTsHf3nbBDkPo9SkJ9NT+o4saHYIWju3IBGa7Cu4D29gWP3GVRiw==",
+ "requires": {
+ "@freesewing/plugin-bundle": "0.8.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ }
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/wahid": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/wahid/-/wahid-0.1.3.tgz",
+ "integrity": "sha512-uq5jqM/TzAeVkuWYSlYXaZ5lhDLbVb/YoDxIMbNhi4nnqvNl/Ofi4Qcd2vX6L9c9YKqMPG0iknuuln8mwKcfCw==",
+ "requires": {
+ "@freesewing/brian": "0.23.2",
+ "@freesewing/plugin-bundle": "0.8.0",
+ "@freesewing/plugin-buttons": "^0.2.0",
+ "@freesewing/plugin-round": "^0.4.0",
+ "freesewing": "0.30.6"
+ },
+ "dependencies": {
+ "@freesewing/brian": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/brian/-/brian-0.23.2.tgz",
+ "integrity": "sha512-3YE/xC6fGZXvmMNZgxUXy81VNDpS5aHsWlAo9sC0CGchB7tiZAOv5g8bNyDE9yoqC63tOyElKabDiT1BPZzE+g==",
+ "requires": {
+ "@freesewing/plugin-bundle": "^0.9.0",
+ "freesewing": "^0.31.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-bundle": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.9.0.tgz",
+ "integrity": "sha512-CzLsPEqj2fFVHwBn7rPe0EK7s/PTw1djVZFJq1lSPVQzFQY6nGcUmIanPlsOtCx2lpUkIIrEcHE2e6sxH9iNCA==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "^0.11",
+ "@freesewing/plugin-dimension": "^0.8",
+ "@freesewing/plugin-grainline": "^0.3",
+ "@freesewing/plugin-logo": "^0.6",
+ "@freesewing/plugin-round": "^0.4",
+ "@freesewing/plugin-scalebox": "^0.4",
+ "@freesewing/plugin-sprinkle": "^0.2",
+ "@freesewing/plugin-title": "^0.11"
+ }
+ },
+ "freesewing": {
+ "version": "0.31.0",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.31.0.tgz",
+ "integrity": "sha512-ciQK7BzsL05a4uGvq/Slr+zqOx3eaJD1M0iYD1o3GBcA4QAuSfY2EPOwLcNMHYEW0bo/e5ZEKQDhPGgOyCKnhQ==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "@freesewing/plugin-bundle": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-bundle/-/plugin-bundle-0.8.0.tgz",
+ "integrity": "sha512-uz6YVo3sP+MW/0n+ZDuNkfbUDiLFF0wkP+knPy/KETYg+JqD3DLqqBgTe8zMf71BQyHc5XGb5CAMY164aDqPaQ==",
+ "requires": {
+ "@freesewing/plugin-cutonfold": "0.10.4",
+ "@freesewing/plugin-dimension": "0.7.3",
+ "@freesewing/plugin-grainline": "0.2.2",
+ "@freesewing/plugin-logo": "0.5.2",
+ "@freesewing/plugin-round": "0.3.0",
+ "@freesewing/plugin-scalebox": "0.3.1",
+ "@freesewing/plugin-sprinkle": "0.1.0",
+ "@freesewing/plugin-title": "0.10.0"
+ },
+ "dependencies": {
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.10.4.tgz",
+ "integrity": "sha512-MTQ3LIJsuh2JdbEOzC9/w0n6AMNhN45aOYhp7iHKb/PUGy25L1iINYOuuzljLHTqYAgYIoFuCeVf9tw78hnzKA=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.7.3.tgz",
+ "integrity": "sha512-F0x+zARVNd2l3IX/sK0UmH2+Y/Mw2rKwZD8eLKWBfq0zCaC3WGHmd4TzlnE0oxQpiDejAYbsliFGm0vLPQyVMg=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.2.2.tgz",
+ "integrity": "sha512-VN9Qks1vL8MswqwiqOAtSguKyXjaVI258xqTA/9t76NYJsidm2HxRQxUnxcA+xg5MzOahSSRtVAWdXuAwV31ig=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.5.2.tgz",
+ "integrity": "sha512-g+lk/nBYxnzs7hQYUdQ/YDPJCUmUeZcNdk0+xUWoADdoZY95NwrXVxfNz/O2wI9kRCgFpFojgT0dD2HKtkv0/w=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.3.0.tgz",
+ "integrity": "sha512-qlyQ/kC1MYZfDus4SI1gOkyXx3tyG2V0/zsjtYH9rW4SnwarzQMgUwRYN87DmPszrqGqIgVZmhTatW7dz3LhCg=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.3.1.tgz",
+ "integrity": "sha512-iZwWVQdLGs/cPVZl4ZyBMzNrIUzDRWyhScBg9D62UGuBIPdGFmA1fDEgZ+5hDJ9UuxR65/Ue1emJlOlP2ZwOtw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.1.0.tgz",
+ "integrity": "sha512-u/tm8sgW5h2RlvGPhyCG4KUb1GhTMwuTkOotgdsevZr9fx3aApDUmZhe2mfmJhvKvgQGaa6IOQJ69OJ402oOCg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.10.0.tgz",
+ "integrity": "sha512-UZYge58Cofpgjx7ODhdszTKYRURjVtP2YIkOsUR3/kzicVpAw/wuoFX9n85y9IGG+k9ImIX7/7F4AtqlhNItnQ=="
+ }
+ }
+ },
+ "@freesewing/plugin-cutonfold": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.11.0.tgz",
+ "integrity": "sha512-AP2x3Cu0Mr+WKa1Uo+IjsY1MKa59VGTBa5Hnb/3LuX9ksPQRtK+1CwTUTetRTdNPYe/EVoq085rsYwvT8v1n6w=="
+ },
+ "@freesewing/plugin-dimension": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.8.0.tgz",
+ "integrity": "sha512-MFqXanHo7+X4PHArhBwiOE/hliPv7JOEmSbupL/VGJVx4ptcTmlCiOnuTYmaY1ae6Vdi7upO4A4XzdmeE5G5XQ=="
+ },
+ "@freesewing/plugin-grainline": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.3.0.tgz",
+ "integrity": "sha512-uQONbhR3W2UF+C4R3qMJpxXbIb6YLDM3aeHqc2CY7RR71MyBrulfAqIt9bRli90qQJGdKuHHkVe/4FtPFvuukA=="
+ },
+ "@freesewing/plugin-logo": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.6.0.tgz",
+ "integrity": "sha512-bV4+71eblxaR6eeQvSfXQn1ThZYIX7rLAof1v9xwUV5BxLfX+MsfVqIIFi5gGRA8XPF/yf2P+9GWyWRCk6HV1Q=="
+ },
+ "@freesewing/plugin-round": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-round/-/plugin-round-0.4.0.tgz",
+ "integrity": "sha512-DtsHTiE/tRt4vOhN9dvDRxCPK2REzEBw5QHUfQgLAOlDvGhNhRpQ7nQ9oQmuTUwC/WeIuO0QadNpU+97WNpUvw=="
+ },
+ "@freesewing/plugin-scalebox": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-scalebox/-/plugin-scalebox-0.4.0.tgz",
+ "integrity": "sha512-U4PaZQQy9kRmGL56rgpUpTBSC+jod3UQYSipOfI0nRF4RahvpncfH7rnbXI+7Hp75jLTyVUdtQxirBcYzQ+oMw=="
+ },
+ "@freesewing/plugin-sprinkle": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-sprinkle/-/plugin-sprinkle-0.2.0.tgz",
+ "integrity": "sha512-nBX7/YwPWUZpBlXO/V0sh1bB2+Rh2kD+AovnofTo/DTMoqgjLRCtzyiuhxO6F2grDUjAkkrUjt7h1UN2UK13jg=="
+ },
+ "@freesewing/plugin-title": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.11.0.tgz",
+ "integrity": "sha512-6TuNGtzq/klmhef7pfmRCHnFDrVRfEzwkacCrlb9bOX5y+ql5mnIrlBRt/Sw3RD6RHAcnn+CArjoYng4HWHONA=="
+ },
+ "freesewing": {
+ "version": "0.30.6",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.30.6.tgz",
+ "integrity": "sha512-iacKTnjNCzMyMcIfutMm7UHO51ewgtpZ5TTkL7gho0nZyAvjdwreNw5yrEej73nhr7zobGQqOijw+z3JdPNQ8w==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+ },
+ "bezier-js": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.3.2.tgz",
+ "integrity": "sha512-+G6FB5YuicjLvYP2ZPrzGs1vXjkO6uONehOkjvIvoueIeyPxMWjgSS8DX+OYsx8xzrDDi56v2CqAxHU/NTu3LQ=="
+ },
+ "bin-pack": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bin-pack/-/bin-pack-1.0.2.tgz",
+ "integrity": "sha1-wqAU7b8L7XCjKSBi7UZXe5YSBnk="
+ },
+ "freesewing": {
+ "version": "0.31.0",
+ "resolved": "https://registry.npmjs.org/freesewing/-/freesewing-0.31.0.tgz",
+ "integrity": "sha512-ciQK7BzsL05a4uGvq/Slr+zqOx3eaJD1M0iYD1o3GBcA4QAuSfY2EPOwLcNMHYEW0bo/e5ZEKQDhPGgOyCKnhQ==",
+ "requires": {
+ "bezier-js": "2.3.2",
+ "bin-pack": "1.0.2"
+ }
+ }
+ }
+}
diff --git a/packages/components/package.json b/packages/components/package.json
index e8f38219421..ef288d95c88 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -26,7 +26,10 @@
},
"peerDependencies": {
"react": "^16.4.1",
- "prop-types": "15.7.2"
+ "prop-types": "15.7.2",
+ "@freesewing/patterns": "^0.33.0",
+ "@freesewing/i18n": "^0.33.0",
+ "react-intl": "^2.8.0"
},
"files": [
"../../dist/packages/components/*",
@@ -39,5 +42,9 @@
"engines": {
"node": ">=8.0.0",
"npm": ">=5"
+ },
+ "dependencies": {
+ "@freesewing/i18n": "0.11.3",
+ "@freesewing/patterns": "0.18.6"
}
}
diff --git a/packages/components/src/DraftSettingComplete/index.js b/packages/components/src/DraftSettingComplete/index.js
index f24cab919ea..7e391394842 100644
--- a/packages/components/src/DraftSettingComplete/index.js
+++ b/packages/components/src/DraftSettingComplete/index.js
@@ -1,4 +1,4 @@
import React from "react";
-import DraftSettingBool from "../DraftSettingBool";
+import PatternOptionBool from "../PatternOptionBool";
-export default props => ;
+export default props => ;
diff --git a/packages/components/src/DraftSettingLanguage/index.js b/packages/components/src/DraftSettingLanguage/index.js
new file mode 100644
index 00000000000..7a4ebba385e
--- /dev/null
+++ b/packages/components/src/DraftSettingLanguage/index.js
@@ -0,0 +1,62 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import FormFieldList from "../FormFieldList";
+import OptionPreamble from "../OptionPreamble";
+
+const DraftSettingLanguage = props => {
+ const [value, setValue] = useState(props.dflt);
+
+ const update = (name, newValue, evt) => {
+ props.updateValue(props.name, newValue);
+ setValue(newValue);
+ };
+
+ const reset = () => {
+ setValue(props.dflt);
+ props.updateValue(props.name, props.dflt);
+ };
+
+ return (
+
+
+ props.triggerAction("showHelp", {
+ type: "draftSetting",
+ value: props.name
+ })
+ }
+ />
+
+
+ );
+};
+
+DraftSettingLanguage.propTypes = {
+ triggerAction: PropTypes.func.isRequired,
+ updateValue: PropTypes.func.isRequired,
+ name: PropTypes.string.isRequired,
+ dflt: PropTypes.oneOfType([
+ PropTypes.number.isRequired,
+ PropTypes.string.isRequired
+ ]),
+ title: PropTypes.node.isRequired,
+ desc: PropTypes.node.isRequired,
+ list: PropTypes.object.isRequired
+};
+
+export default DraftSettingLanguage;
diff --git a/packages/components/src/DraftSettingLanguage/stories.js b/packages/components/src/DraftSettingLanguage/stories.js
new file mode 100644
index 00000000000..9812253c2ae
--- /dev/null
+++ b/packages/components/src/DraftSettingLanguage/stories.js
@@ -0,0 +1,27 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import Lang from ".";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data),
+ updateValue: (name, value) =>
+ console.log(`Updated setting ${name}, value is now: ${value}`),
+ name: "exampleDraftSettingLanguage",
+ dflt: "en",
+ title:
+ "I am a language draft setting. This is my title. I'm wrapped in an h4 tag",
+ desc:
+ "This is the description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it.",
+ languages: {
+ de: "German",
+ en: "English",
+ es: "Spanish",
+ fr: "French",
+ nl: "Dutch"
+ }
+};
+
+storiesOf("DraftSettingLanguage", module).add("Basic", () => (
+
+));
diff --git a/packages/components/src/DraftSettingMargin/index.js b/packages/components/src/DraftSettingMargin/index.js
new file mode 100644
index 00000000000..86fba0074fc
--- /dev/null
+++ b/packages/components/src/DraftSettingMargin/index.js
@@ -0,0 +1,74 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import FormFieldList from "../FormFieldList";
+import FormFieldSlider from "../FormFieldSlider";
+import { formatMm, roundMm, defaultSa, sliderStep } from "../utils";
+import OptionPreamble from "../OptionPreamble";
+
+const DraftSettingMargin = props => {
+ const [value, setValue] = useState(props.dflt);
+
+ const update = (name, newValue, evt) => {
+ newValue = roundMm(newValue);
+ // Sometimes, when sliding, the rapid succession of updates
+ // causes a weird timing issue to result in a value that is NaN.
+ // If that's the case, just ignore this update and keep the
+ // previous one instead
+ if (!isNaN(newValue)) {
+ setValue(newValue);
+ if (evt.type !== "mousemove") props.updateValue("margin", newValue);
+ } else {
+ if (evt.type !== "mousemove") props.updateValue("margin", newValue);
+ }
+ };
+
+ const reset = () => {
+ setValue(props.dflt);
+ props.updateValue("margin", props.dflt);
+ };
+
+ return (
+
+
+ props.triggerAction("showHelp", {
+ type: "draftSetting",
+ value: "margin"
+ })
+ }
+ />
+
+
+ );
+};
+
+DraftSettingMargin.propTypes = {
+ triggerAction: PropTypes.func.isRequired,
+ updateValue: PropTypes.func.isRequired,
+ title: PropTypes.string.isRequired,
+ desc: PropTypes.string.isRequired,
+ units: PropTypes.oneOf(["metric", "imperial"]).isRequired,
+ labels: PropTypes.array
+};
+
+DraftSettingMargin.defaultProps = {
+ // FIXME
+};
+
+export default DraftSettingMargin;
diff --git a/packages/components/src/DraftSettingMargin/stories.js b/packages/components/src/DraftSettingMargin/stories.js
new file mode 100644
index 00000000000..4c15cb96c50
--- /dev/null
+++ b/packages/components/src/DraftSettingMargin/stories.js
@@ -0,0 +1,19 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import Margin from ".";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data),
+ updateValue: (name, value) =>
+ console.log(`Updated setting ${name}, value is now: ${value}`),
+ name: "margin",
+ dflt: 2,
+ title: "Margin",
+ desc:
+ "This is the margin description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it."
+};
+
+storiesOf("DraftSettingMargin", module)
+ .add("Metric", () => )
+ .add("Imperial", () => );
diff --git a/packages/components/src/DraftSettingOnly/index.js b/packages/components/src/DraftSettingOnly/index.js
new file mode 100644
index 00000000000..81cfef1c500
--- /dev/null
+++ b/packages/components/src/DraftSettingOnly/index.js
@@ -0,0 +1,78 @@
+import React, { useState } from "react";
+import FormFieldChecks from "../FormFieldChecks";
+import FormFieldList from "../FormFieldList";
+import FormFieldSlider from "../FormFieldSlider";
+import { formatMm, roundMm, defaultSa, sliderStep } from "../utils";
+import OptionPreamble from "../OptionPreamble";
+
+const DraftSettingOnly = props => {
+ const [value, setValue] = useState(props.dflt);
+ const [parts, setParts] = useState([]);
+
+ const update = (name, newValue, evt) => {
+ setValue(newValue);
+ if (newValue === "dflt") props.updateValue("only", false);
+ else props.updateValue("only", parts);
+ };
+
+ const reset = () => {
+ setValue("dflt");
+ setParts([]);
+ props.updateValue("only", false);
+ };
+
+ const updateCustom = (name, newValue, evt) => {
+ props.updateValue("only", newValue);
+ setParts(newValue);
+ };
+
+ const list = {
+ dflt: props.labels.dflt,
+ custom: props.labels.custom
+ };
+
+ return (
+
+
+ props.triggerAction("showHelp", {
+ type: "draftSetting",
+ value: "only"
+ })
+ }
+ />
+
+ {value === "custom" ? (
+
+ ) : (
+ ""
+ )}
+
+ );
+};
+
+export default DraftSettingOnly;
diff --git a/packages/components/src/DraftSettingOnly/stories.js b/packages/components/src/DraftSettingOnly/stories.js
new file mode 100644
index 00000000000..78b712086a9
--- /dev/null
+++ b/packages/components/src/DraftSettingOnly/stories.js
@@ -0,0 +1,38 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import Sa from ".";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data),
+ updateValue: (name, value) =>
+ console.log(`Updated setting ${name}, value is now: ${value}`),
+ title: "Only (known as contents on the website) title",
+ desc:
+ "This is the only description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it.",
+ labels: {
+ dflt: "Default",
+ custom: "Custom"
+ },
+ dflt: "dflt",
+ customDflt: [],
+ parts: {
+ front: "Front",
+ back: "Back",
+ sleeve: "Sleeve",
+ pocket: "Pocket"
+ }
+};
+
+storiesOf("DraftSettingOnly", module)
+ .add("Default", () => )
+ .add("Default, all parts preselected", () => (
+
+ ))
+ .add("Custom, some parts preselected", () => (
+
+ ));
diff --git a/packages/components/src/DraftSettingPaperless/index.js b/packages/components/src/DraftSettingPaperless/index.js
index 86d6be6887a..0fceb8bee3c 100644
--- a/packages/components/src/DraftSettingPaperless/index.js
+++ b/packages/components/src/DraftSettingPaperless/index.js
@@ -1,4 +1,4 @@
import React from "react";
-import DraftSettingBool from "../DraftSettingBool";
+import PatternOptionBool from "../PatternOptionBool";
-export default props => ;
+export default props => ;
diff --git a/packages/components/src/DraftSettingSa/index.js b/packages/components/src/DraftSettingSa/index.js
new file mode 100644
index 00000000000..015cd308bb8
--- /dev/null
+++ b/packages/components/src/DraftSettingSa/index.js
@@ -0,0 +1,116 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import FormFieldList from "../FormFieldList";
+import FormFieldSlider from "../FormFieldSlider";
+import { formatMm, roundMm, defaultSa, sliderStep } from "../utils";
+import OptionPreamble from "../OptionPreamble";
+
+const DraftSettingSa = props => {
+ const [value, setValue] = useState("dflt");
+ const [saValue, setSaValue] = useState(defaultSa[props.units]);
+ const [customValue, setCustomValue] = useState(10);
+
+ const update = (name, newValue, evt) => {
+ switch (newValue) {
+ case "none":
+ props.updateValue("sa", 0);
+ setValue(newValue);
+ setSaValue(0);
+ break;
+ case "dflt":
+ props.updateValue("sa", defaultSa[props.units]);
+ setValue(newValue);
+ setSaValue(defaultSa[props.units]);
+ break;
+ default:
+ props.updateValue("sa", customValue);
+ setValue(newValue);
+ setSaValue(customValue);
+ break;
+ }
+ };
+
+ const reset = () => {
+ setValue("dflt");
+ setSaValue(defaultSa[props.units]);
+ props.updateValue("sa", defaultSa[props.units]);
+ };
+
+ const updateCustom = (name, newValue, evt) => {
+ newValue = roundMm(newValue);
+ // Sometimes, when sliding, the rapid succession of updates
+ // causes a weird timing issue to result in a value that is NaN.
+ // If that's the case, just ignore this update and keep the
+ // previous one instead
+ if (!isNaN(newValue)) {
+ setSaValue(newValue);
+ if (evt.type !== "mousemove") props.updateValue("sa", newValue);
+ } else {
+ if (evt.type !== "mousemove") props.updateValue("sa", newValue);
+ }
+ };
+
+ const list = {
+ none: props.labels.none,
+ dflt: props.labels.dflt,
+ custom: props.labels.custom
+ };
+
+ return (
+
+
+ props.triggerAction("showHelp", {
+ type: "draftSetting",
+ value: "sa"
+ })
+ }
+ />
+
+ {value === "custom" ? (
+
+ ) : (
+ ""
+ )}
+
+ );
+};
+
+DraftSettingSa.propTypes = {
+ triggerAction: PropTypes.func.isRequired,
+ updateValue: PropTypes.func.isRequired,
+ title: PropTypes.string.isRequired,
+ desc: PropTypes.string.isRequired,
+ units: PropTypes.oneOf(["metric", "imperial"]).isRequired,
+ labels: PropTypes.array
+};
+
+DraftSettingSa.defaultProps = {
+ // FIXME
+};
+
+export default DraftSettingSa;
diff --git a/packages/components/src/DraftSettingSa/stories.js b/packages/components/src/DraftSettingSa/stories.js
new file mode 100644
index 00000000000..a87d23c2f2c
--- /dev/null
+++ b/packages/components/src/DraftSettingSa/stories.js
@@ -0,0 +1,24 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import Sa from ".";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data),
+ updateValue: (name, value) =>
+ console.log(`Updated setting ${name}, value is now: ${value}`),
+ name: "sa",
+ dflt: "dflt",
+ title: "Seam allowance",
+ desc:
+ "This is the seam allowance description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it.",
+ labels: {
+ none: "No seam allowance",
+ dflt: "Standard seam allowance",
+ custom: "Custom seam allowance"
+ }
+};
+
+storiesOf("DraftSettingSa", module)
+ .add("Metric", () => )
+ .add("Imperial", () => );
diff --git a/packages/components/src/DraftSettingUnits/index.js b/packages/components/src/DraftSettingUnits/index.js
new file mode 100644
index 00000000000..f886e5a86a9
--- /dev/null
+++ b/packages/components/src/DraftSettingUnits/index.js
@@ -0,0 +1,48 @@
+import React, { useState } from "react";
+import FormFieldList from "../FormFieldList";
+import OptionPreamble from "../OptionPreamble";
+
+const DraftSettingUnits = props => {
+ const [value, setValue] = useState(props.dflt);
+
+ const update = (name, newValue, evt) => {
+ props.updateValue(props.name, newValue);
+ setValue(newValue);
+ };
+
+ const reset = () => {
+ setValue(props.dflt);
+ props.updateValue(props.name, props.dflt);
+ };
+
+ return (
+
+
+ props.triggerAction("showHelp", {
+ type: "draftSetting",
+ value: "units"
+ })
+ }
+ />
+
+
+ );
+};
+
+export default DraftSettingUnits;
diff --git a/packages/components/src/DraftSettingUnits/stories.js b/packages/components/src/DraftSettingUnits/stories.js
new file mode 100644
index 00000000000..6b2d6cdd28a
--- /dev/null
+++ b/packages/components/src/DraftSettingUnits/stories.js
@@ -0,0 +1,21 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import Units from ".";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data),
+ updateValue: (name, value) =>
+ console.log(`Updated setting ${name}, value is now: ${value}`),
+ name: "paperless",
+ dflt: "metric",
+ title: "Units title",
+ desc:
+ "This is the units description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it.",
+ list: {
+ metric: "Metric",
+ imperial: "Imperial"
+ }
+};
+
+storiesOf("DraftSettingUnits", module).add("Basic", () => );
diff --git a/packages/components/src/FormFieldChecks/index.js b/packages/components/src/FormFieldChecks/index.js
new file mode 100644
index 00000000000..4bd3fd56675
--- /dev/null
+++ b/packages/components/src/FormFieldChecks/index.js
@@ -0,0 +1,54 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import FormControl from "@material-ui/core/FormControl";
+import FormGroup from "@material-ui/core/FormGroup";
+import FormControlLabel from "@material-ui/core/FormControlLabel";
+import FormHelperText from "@material-ui/core/FormHelperText";
+import Checkbox from "@material-ui/core/Checkbox";
+
+const FormFieldChecks = props => {
+ const [value, setValue] = useState(props.dflt);
+
+ const toggle = part => {
+ let parts = value.slice(0);
+ let index = parts.indexOf(part);
+ if (index === -1) parts.push(part);
+ else parts.splice(index, 1);
+ setValue(parts);
+ props.updateValue(props.name, parts);
+ };
+
+ // Force state update when rerendering due to props change
+ // if (props.value !== value) setValue(props.value);
+
+ return (
+
+ {Object.keys(props.checks).map(i => {
+ let check = props.checks[i];
+ return (
+ toggle(i)}
+ value={i}
+ />
+ }
+ label={props.checks[i]}
+ key={i}
+ className="po-list-item"
+ />
+ );
+ })}
+
+ );
+};
+
+FormFieldChecks.propTypes = {
+ dflt: PropTypes.array,
+ checks: PropTypes.object,
+ updateValue: PropTypes.func.isRequired,
+ name: PropTypes.string.isRequired
+};
+
+export default FormFieldChecks;
diff --git a/packages/components/src/FormFieldChecks/stories.js b/packages/components/src/FormFieldChecks/stories.js
new file mode 100644
index 00000000000..0a523a0dad6
--- /dev/null
+++ b/packages/components/src/FormFieldChecks/stories.js
@@ -0,0 +1,21 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import FormFieldChecks from ".";
+
+const props = {
+ updateValue: (name, value) =>
+ console.log(`Updated option ${name}, value is now: ${value}`),
+ name: "exampleChecksOption",
+ checks: {
+ apple: "Apple",
+ banana: "Banana",
+ cherry: "Cherry"
+ },
+ dflt: []
+};
+
+storiesOf("FormFieldChecks", module)
+ .add("Basic", () => )
+ .add("Apple", () => )
+ .add("Banana", () => )
+ .add("Cherry", () => );
diff --git a/packages/components/src/FormFieldSlider/index.js b/packages/components/src/FormFieldSlider/index.js
index d574d8737bb..484b3581b80 100644
--- a/packages/components/src/FormFieldSlider/index.js
+++ b/packages/components/src/FormFieldSlider/index.js
@@ -4,7 +4,10 @@ import Slider from "@material-ui/lab/Slider";
import { withStyles } from "@material-ui/core/styles";
const PaddedSlider = withStyles({
- container: { padding: "25px 0" },
+ container: {
+ padding: "25px 0",
+ overflowX: "hidden" // See: https://github.com/mui-org/material-ui/issues/14234
+ },
track: { height: "4px" },
thumb: { width: "16px", height: "16px" }
})(Slider);
diff --git a/packages/components/src/GistConfigurator/index.js b/packages/components/src/GistConfigurator/index.js
new file mode 100644
index 00000000000..41ffd3d32db
--- /dev/null
+++ b/packages/components/src/GistConfigurator/index.js
@@ -0,0 +1,59 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import Pct from "../PatternOptionPercentage";
+import Deg from "../PatternOptionDegree";
+import Mm from "../PatternOptionMillimeter";
+import Bool from "../PatternOptionBool";
+import OptionGroup from "../OptionGroup";
+import { optionType, defaultGist, gistDefaults } from "../utils";
+import { patternInfo, patternList } from "@freesewing/patterns";
+import { FormattedMessage } from "react-intl";
+
+const GistConfigurator = props => {
+ const [gist, setGist] = useState(props.gist || defaultGist);
+
+ const update = (type, name, value) => {
+ console.log("updating", type, name, value);
+ };
+
+ let pattern = patternInfo[props.pattern];
+ let dflts = gistDefaults(pattern.config, gist);
+
+ return (
+
+
+
+
+
+ {Object.keys(pattern.optionGroups).map(group => (
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+ );
+};
+
+GistConfigurator.propTypes = {
+ pattern: PropTypes.oneOf(patternList),
+ units: PropTypes.oneOf(["metric", "imperial"]).isRequired
+};
+
+GistConfigurator.defaultProps = {};
+
+export default GistConfigurator;
diff --git a/packages/components/src/GistConfigurator/stories.js b/packages/components/src/GistConfigurator/stories.js
new file mode 100644
index 00000000000..21eaf962d91
--- /dev/null
+++ b/packages/components/src/GistConfigurator/stories.js
@@ -0,0 +1,18 @@
+import React from "react";
+import { storiesOf } from "@storybook/react";
+import GistConfigurator from ".";
+//import { IntlProvider } from "react-intl";
+//import { strings } from "@freesewing/i18n";
+
+const props = {
+ triggerAction: (type, data) =>
+ console.log(`Action of type ${type} triggered, data passed is`, data)
+};
+
+storiesOf("GistConfigurator", module)
+ .add("Simon metric", () => (
+
+ ))
+ .add("Trayvon imperial", () => (
+
+ ));
diff --git a/packages/components/src/OptionGroup/index.js b/packages/components/src/OptionGroup/index.js
new file mode 100644
index 00000000000..b676b7bda2f
--- /dev/null
+++ b/packages/components/src/OptionGroup/index.js
@@ -0,0 +1,94 @@
+import React, { useState } from "react";
+import PropTypes from "prop-types";
+import Pct from "../PatternOptionPercentage";
+import Deg from "../PatternOptionDegree";
+import Mm from "../PatternOptionMillimeter";
+import Bool from "../PatternOptionBool";
+import List from "../PatternOptionList";
+import Count from "../PatternOptionCount";
+import { optionType } from "../utils";
+import { FormattedMessage } from "react-intl";
+import { injectIntl } from "react-intl";
+
+const OptionGroup = props => {
+ const update = (name, value) => props.updateValue("option", name, value);
+
+ const renderOption = name => {
+ let option = props.pattern.config.options[name];
+ let type = optionType(option);
+ let stringKey = `options.${props.pattern.config.name}.${name}.`;
+ let extraProps = {
+ name,
+ dflt: props.dflts.options[name],
+ units: props.units,
+ updateValue: update,
+ triggerAction: props.triggerAction,
+ title: ,
+ desc: ,
+ intl: props.intl,
+ pattern: props.pattern.config.name
+ };
+ let noyes = [
+ ,
+
+ ];
+
+ switch (type) {
+ case "pct":
+ return ;
+ break;
+ case "deg":
+ return ;
+ break;
+ case "mm":
+ return (
+
+ );
+ break;
+ case "bool":
+ return ;
+ break;
+ case "list":
+ return
;
+ break;
+ case "count":
+ return ;
+ break;
+ default:
+ throw new Error("Unsupport option type: " + type);
+ }
+ };
+
+ return (
+
+ {props.options.map(name => {
+ let output = [];
+ if (typeof name === "object") {
+ // Subgroup
+ for (let subGroup of Object.keys(name)) {
+ output.push(
+
+
+
+ );
+ for (let option of name[subGroup])
+ output.push(renderOption(option));
+ }
+ } else output.push(renderOption(name));
+
+ return output;
+ })}
+
+ );
+};
+
+OptionGroup.propTypes = {
+ pattern: PropTypes.object.isRequired,
+ dflts: PropTypes.object.isRequired,
+ options: PropTypes.array.isRequired,
+ units: PropTypes.oneOf(["metric", "imperial"]).isRequired
+};
+
+OptionGroup.defaultProps = {};
+
+export default injectIntl(OptionGroup);
diff --git a/packages/components/src/OptionPreamble/index.js b/packages/components/src/OptionPreamble/index.js
index 82407a308b4..88b1a20fdea 100644
--- a/packages/components/src/OptionPreamble/index.js
+++ b/packages/components/src/OptionPreamble/index.js
@@ -3,6 +3,7 @@ import PropTypes from "prop-types";
import IconButton from "@material-ui/core/IconButton";
import ResetIcon from "@material-ui/icons/SettingsBackupRestore";
import HelpIcon from "@material-ui/icons/Help";
+import { injectIntl } from "react-intl";
const OptionPreamble = props => {
const styles = {
@@ -18,6 +19,15 @@ const OptionPreamble = props => {
right: { margin: "0 0.5rem" }
};
+ const resetLabel = props.intl.formatMessage({
+ id: "app.restoreDefaults",
+ defaultMessage: " ♻️ "
+ });
+ const docsLabel = props.intl.formatMessage({
+ id: "app.docs",
+ defaultMessage: " 🤔 "
+ });
+
return (
@@ -36,8 +46,8 @@ const OptionPreamble = props => {
{
@@ -67,17 +77,10 @@ OptionPreamble.propTypes = {
PropTypes.number.isRequired,
PropTypes.string.isRequired
]),
- title: PropTypes.string.isRequired,
- desc: PropTypes.string.isRequired,
- resetLabel: PropTypes.string,
- docsLabel: PropTypes.string,
+ title: PropTypes.node.isRequired,
+ desc: PropTypes.node.isRequired,
reset: PropTypes.func.isRequired,
showHelp: PropTypes.func.isRequired
};
-OptionPreamble.defaultProps = {
- resetLabel: "♻️",
- docsLabel: "🤔"
-};
-
-export default OptionPreamble;
+export default injectIntl(OptionPreamble);
diff --git a/packages/components/src/DraftSettingBool/index.js b/packages/components/src/PatternOptionBool/index.js
similarity index 77%
rename from packages/components/src/DraftSettingBool/index.js
rename to packages/components/src/PatternOptionBool/index.js
index f01c03cf7ec..3a884f7b977 100644
--- a/packages/components/src/DraftSettingBool/index.js
+++ b/packages/components/src/PatternOptionBool/index.js
@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
import FormFieldBool from "../FormFieldBool";
import OptionPreamble from "../OptionPreamble";
-const DraftSettingBool = props => {
+const PatternOptionBool = props => {
const [value, setValue] = useState(props.dflt);
const update = (name, newValue, evt) => {
@@ -17,7 +17,7 @@ const DraftSettingBool = props => {
};
return (
-
+
{
);
};
-DraftSettingBool.propTypes = {
+PatternOptionBool.propTypes = {
+ triggerAction: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
name: PropTypes.string.isRequired,
dflt: PropTypes.oneOfType([
PropTypes.number.isRequired,
PropTypes.string.isRequired
]),
- title: PropTypes.string.isRequired,
- desc: PropTypes.string.isRequired,
- resetLabel: PropTypes.string,
- docsLabel: PropTypes.string,
- list: PropTypes.object.isRequired
+ title: PropTypes.node.isRequired,
+ desc: PropTypes.node.isRequired,
+ labels: PropTypes.array.isRequired
};
-DraftSettingBool.defaultProps = {
- title: false,
- desc: false
-};
-
-export default DraftSettingBool;
+export default PatternOptionBool;
diff --git a/packages/components/src/DraftSettingBool/stories.js b/packages/components/src/PatternOptionBool/stories.js
similarity index 81%
rename from packages/components/src/DraftSettingBool/stories.js
rename to packages/components/src/PatternOptionBool/stories.js
index 37c00a68200..48fc57237d7 100644
--- a/packages/components/src/DraftSettingBool/stories.js
+++ b/packages/components/src/PatternOptionBool/stories.js
@@ -7,15 +7,15 @@ const props = {
console.log(`Action of type ${type} triggered, data passed is`, data),
updateValue: (name, value) =>
console.log(`Updated pct/deg/count option ${name}, value is now: ${value}`),
- name: "exampleDraftSettingBool",
+ name: "examplePatternOptionBool",
dflt: false,
title:
- "I am a boolean draft setting. This is my title. I'm wrapped in an h4 tag",
+ "I am a boolean pattern option. This is my title. I'm wrapped in an h4 tag",
desc:
"This is the description. I'm wrapped in a p tag. This component only sets the CSS class on a non-default value. It's up to you to supply the CSS to style it.",
labels: ["No", "Yes"]
};
-storiesOf("DraftSettingBool", module)
+storiesOf("PatternOptionBool", module)
.add("Basic", () => )
.add("Yes as default", () => );
diff --git a/packages/components/src/PatternOptionList/index.js b/packages/components/src/PatternOptionList/index.js
index 1d53ab19d21..e4677eb1823 100644
--- a/packages/components/src/PatternOptionList/index.js
+++ b/packages/components/src/PatternOptionList/index.js
@@ -29,6 +29,15 @@ const PatternOptionList = props => {
right: { margin: "0 0.5rem" }
};
+ // Add translations
+ let stringKey = `options.${props.pattern}.${props.name}.options.`;
+ let list = {};
+ for (let item of props.list)
+ list[item] = props.intl.formatMessage({
+ id: stringKey + item,
+ defaultMessage: item
+ });
+
return (
{
desc={props.desc}
title={props.title}
id={"po-list-" + props.name}
- displayValue={props.list[value]}
+ displayValue={list[value]}
reset={reset}
showHelp={() =>
props.triggerAction("showHelp", {
@@ -53,7 +62,7 @@ const PatternOptionList = props => {
onChange={update}
label={"po-list-" + props.name}
updateValue={update}
- list={props.list}
+ list={list}
/>
);
@@ -66,16 +75,9 @@ PatternOptionList.propTypes = {
PropTypes.number.isRequired,
PropTypes.string.isRequired
]),
- title: PropTypes.string.isRequired,
- desc: PropTypes.string.isRequired,
- resetLabel: PropTypes.string,
- docsLabel: PropTypes.string,
- list: PropTypes.object.isRequired
-};
-
-PatternOptionList.defaultProps = {
- title: false,
- desc: false
+ title: PropTypes.node.isRequired,
+ desc: PropTypes.node.isRequired,
+ list: PropTypes.array.isRequired
};
export default PatternOptionList;
diff --git a/packages/components/src/PatternOptionMillimeter/index.js b/packages/components/src/PatternOptionMillimeter/index.js
index f143dad916b..23ceb7b37aa 100644
--- a/packages/components/src/PatternOptionMillimeter/index.js
+++ b/packages/components/src/PatternOptionMillimeter/index.js
@@ -1,5 +1,12 @@
import React, { useState } from "react";
import PropTypes from "prop-types";
+import {
+ sliderStep,
+ roundMm,
+ roundMmUp,
+ roundMmDown,
+ formatMm
+} from "../utils";
import FormFieldSlider from "../FormFieldSlider";
import OptionPreamble from "../OptionPreamble";
@@ -7,26 +14,8 @@ const PatternOptionMillimeter = props => {
const [value, setValue] = useState(props.dflt);
const [previousValue, setPreviousValue] = useState(props.dflt);
- const smallestImperialStep = 0.396875;
-
- const round = val => {
- if (props.units === "imperial") {
- return Math.round(val * 1000000) / 1000000;
- } else return Math.round(val * 10) / 10;
- };
- const roundDown = val => {
- if (props.units === "imperial") {
- return val - (val % smallestImperialStep);
- } else return Math.floor(val * 10) / 10;
- };
- const roundUp = val => {
- if (props.units === "imperial") {
- return val - (val % 0.396875);
- } else return Math.ceil(val * 10) / 10;
- };
-
const update = (name, newValue, evt) => {
- newValue = round(newValue);
+ newValue = roundMm(newValue, props.units);
// Sometimes, when sliding, the rapid succession of updates
// causes a weird timing issue to result in a value that is NaN.
// If that's the case, just ignore this update and keep the
@@ -44,51 +33,6 @@ const PatternOptionMillimeter = props => {
props.updateValue(props.name, props.dflt);
};
- const formatValue = val => {
- val = round(val);
- if (props.units === "imperial") {
- if (val == 0) return 0 + '"';
- let negative = "";
- let inches = "";
- let rest = "";
- let fraction = val / 25.4;
- if (fraction < 0) {
- fraction = fraction * -1;
- negative = "-";
- }
- if (Math.abs(fraction) < 1) {
- inches = "";
- rest = fraction;
- } else {
- inches = Math.floor(fraction);
- rest = fraction - inches;
- }
- inches += " ";
- let fraction128 = Math.round(rest * 128);
- // eslint-disable-next-line
- if (fraction128 == 0) return negative + inches;
- // eslint-disable-next-line
- if (fraction128 % 64 == 0)
- return negative + inches + fraction128 / 64 + "/2";
- // eslint-disable-next-line
- if (fraction128 % 32 == 0)
- return negative + inches + fraction128 / 32 + "/2";
- // eslint-disable-next-line
- if (fraction128 % 16 == 0)
- return negative + inches + fraction128 / 16 + "/8";
- // eslint-disable-next-line
- if (fraction128 % 8 == 0)
- return negative + inches + fraction128 / 8 + "/16";
- // eslint-disable-next-line
- if (fraction128 % 4 == 0)
- return negative + inches + fraction128 / 4 + "/32";
- // eslint-disable-next-line
- if (fraction128 % 2 == 0)
- return negative + inches + fraction128 / 2 + "/64";
- else return negative + fraction;
- } else return val + "cm";
- };
-
const styles = {
container: {
display: "flex",
@@ -110,7 +54,7 @@ const PatternOptionMillimeter = props => {
desc={props.desc}
title={props.title}
id={"po-mm-" + props.name}
- displayValue={formatValue(value)}
+ displayValue={formatMm(value, props.units)}
reset={reset}
showHelp={() =>
props.triggerAction("showHelp", {
@@ -122,9 +66,9 @@ const PatternOptionMillimeter = props => {
{
+ if (units === "imperial") return Math.round(val * 1000000) / 1000000;
+ else return Math.round(val * 10) / 10;
+};
+
+export const roundMmDown = (val, units) => {
+ if (units === "imperial") return val - (val % smallestImperialStep);
+ else return Math.floor(val * 10) / 10;
+};
+
+export const roundMmUp = (val, units) => {
+ if (units === "imperial") return val - (val % 0.396875);
+ else return Math.ceil(val * 10) / 10;
+};
+
+const formatImperial = (
+ neg,
+ inch,
+ numo = false,
+ deno = false,
+ format = "html"
+) => {
+ if (format === "html") {
+ if (numo)
+ return (
+
+ {neg}
+ {inch} {numo}/{deno}"
+
+ );
+ else
+ return (
+
+ {neg}
+ {inch}"
+
+ );
+ } else {
+ if (numo) return neg + inch;
+ else return neg + inch + " " + numo + "/" + deno;
+ }
+};
+
+export const formatMm = (val, units, format = "html") => {
+ val = roundMm(val);
+ let H = format === "html" ? true : false;
+ if (units === "imperial") {
+ if (val == 0) return formatImperial("", 0, false, false, format);
+ let negative = "";
+ let inches = "";
+ let rest = "";
+ let fraction = val / 25.4;
+ if (fraction < 0) {
+ fraction = fraction * -1;
+ negative = "-";
+ }
+ if (Math.abs(fraction) < 1) rest = fraction;
+ else {
+ inches = Math.floor(fraction);
+ rest = fraction - inches;
+ }
+ let fraction128 = Math.round(rest * 128);
+ if (fraction128 == 0) return formatImperial(negative, inches);
+ if (fraction128 % 64 == 0)
+ return formatImperial(negative, inches, fraction128 / 64, 2);
+ if (fraction128 % 32 == 0)
+ return formatImperial(negative, inches, fraction128 / 32, 4);
+ if (fraction128 % 16 == 0)
+ return formatImperial(negative, inches, fraction128 / 16, 8);
+ if (fraction128 % 8 == 0)
+ return formatImperial(negative, inches, fraction128 / 8, 16);
+ if (fraction128 % 4 == 0)
+ return formatImperial(negative, inches, fraction128 / 4, 32);
+ if (fraction128 % 2 == 0)
+ return formatImperial(negative, inches, fraction128 / 2, 64);
+ return negative + fraction;
+ } else {
+ if (format === "html") return roundMm(val / 10) + "cm";
+ else return roundMm(val / 10);
+ }
+};
+
+export const defaultSa = {
+ imperial: 15.875,
+ metric: 10
+};
+
+export const sliderStep = {
+ metric: 0.1,
+ imperial: 0.396875
+};
+
+export const optionType = option => {
+ if (typeof option === "object") {
+ if (typeof option.pct !== "undefined") return "pct";
+ if (typeof option.mm !== "undefined") return "mm";
+ if (typeof option.deg !== "undefined") return "deg";
+ if (typeof option.count !== "undefined") return "count";
+ if (typeof option.bool !== "undefined") return "bool";
+ if (typeof option.list !== "undefined") return "list";
+ return "unknown";
+ }
+
+ return "constant";
+};
+
+export const defaultGist = {
+ settings: {
+ embed: true,
+ sa: 0,
+ complete: true,
+ paperless: false,
+ locale: "en",
+ units: "metric",
+ margin: 2,
+ options: {}
+ }
+};
+
+export const gistDefaults = (config, gist) => {
+ let options = {};
+ for (let option of Object.keys(config.options)) {
+ if (
+ typeof gist.options !== "undefined" &&
+ typeof gist.options[option] !== undefined
+ )
+ options[option] = gist.options[option];
+ else options[option] = optionDefault(config.options[option]);
+ }
+ delete gist.options;
+ let settings = JSON.parse(JSON.stringify(defaultGist.settings));
+ delete settings.locale;
+ delete settings.units;
+ for (let setting of Object.keys(settings)) {
+ if (typeof gist.settings[setting] !== undefined) {
+ settings[setting] = gist.settings[setting];
+ }
+ }
+ settings.options = options;
+
+ return settings;
+};
+
+export const optionDefault = option => {
+ let type = optionType(option);
+ switch (optionType(option)) {
+ case "constant":
+ return option;
+ break;
+ case "list":
+ return option.dflt;
+ break;
+ default:
+ return option[type];
+ }
+};
diff --git a/packages/simon/src/index.js b/packages/simon/src/index.js
index fde91459d7a..416f3665b82 100644
--- a/packages/simon/src/index.js
+++ b/packages/simon/src/index.js
@@ -55,3 +55,4 @@ Simon.prototype.draftSleevePlacketOverlap = draftSleevePlacketOverlap;
Simon.prototype.draftCuff = draftCuff;
export default Simon;
+export { config };