From c0690d5496ba5bfa4e0a2b298981a52c11c32856 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Tue, 23 Apr 2019 18:34:18 +0200 Subject: [PATCH] :construction: [components] Work on draft/pattern settings/options --- config/dependencies.yaml | 3 + packages/components/.storybook/config.js | 11 +- packages/components/package-lock.json | 1193 +++++++++++++++++ packages/components/package.json | 9 +- .../src/DraftSettingComplete/index.js | 4 +- .../src/DraftSettingLanguage/index.js | 62 + .../src/DraftSettingLanguage/stories.js | 27 + .../src/DraftSettingMargin/index.js | 74 + .../src/DraftSettingMargin/stories.js | 19 + .../components/src/DraftSettingOnly/index.js | 78 ++ .../src/DraftSettingOnly/stories.js | 38 + .../src/DraftSettingPaperless/index.js | 4 +- .../components/src/DraftSettingSa/index.js | 116 ++ .../components/src/DraftSettingSa/stories.js | 24 + .../components/src/DraftSettingUnits/index.js | 48 + .../src/DraftSettingUnits/stories.js | 21 + .../components/src/FormFieldChecks/index.js | 54 + .../components/src/FormFieldChecks/stories.js | 21 + .../components/src/FormFieldSlider/index.js | 5 +- .../components/src/GistConfigurator/index.js | 59 + .../src/GistConfigurator/stories.js | 18 + packages/components/src/OptionGroup/index.js | 94 ++ .../components/src/OptionPreamble/index.js | 31 +- .../index.js | 22 +- .../stories.js | 6 +- .../components/src/PatternOptionList/index.js | 26 +- .../src/PatternOptionMillimeter/index.js | 86 +- .../src/PatternOptionPctDegCount/index.js | 8 +- packages/components/src/utils/index.js | 161 +++ packages/simon/src/index.js | 1 + 30 files changed, 2195 insertions(+), 128 deletions(-) create mode 100644 packages/components/package-lock.json create mode 100644 packages/components/src/DraftSettingLanguage/index.js create mode 100644 packages/components/src/DraftSettingLanguage/stories.js create mode 100644 packages/components/src/DraftSettingMargin/index.js create mode 100644 packages/components/src/DraftSettingMargin/stories.js create mode 100644 packages/components/src/DraftSettingOnly/index.js create mode 100644 packages/components/src/DraftSettingOnly/stories.js create mode 100644 packages/components/src/DraftSettingSa/index.js create mode 100644 packages/components/src/DraftSettingSa/stories.js create mode 100644 packages/components/src/DraftSettingUnits/index.js create mode 100644 packages/components/src/DraftSettingUnits/stories.js create mode 100644 packages/components/src/FormFieldChecks/index.js create mode 100644 packages/components/src/FormFieldChecks/stories.js create mode 100644 packages/components/src/GistConfigurator/index.js create mode 100644 packages/components/src/GistConfigurator/stories.js create mode 100644 packages/components/src/OptionGroup/index.js rename packages/components/src/{DraftSettingBool => PatternOptionBool}/index.js (77%) rename packages/components/src/{DraftSettingBool => PatternOptionBool}/stories.js (81%) create mode 100644 packages/components/src/utils/index.js 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 };