diff --git a/config/dependencies.yaml b/config/dependencies.yaml index 6caad5d8440..a9c145e792b 100644 --- a/config/dependencies.yaml +++ b/config/dependencies.yaml @@ -80,6 +80,7 @@ components: "@material-ui/icons": "^4.0.1" "@material-ui/lab": "^v4.0.0-alpha.14" "prismjs": "1.16.0" + "file-saver": "^2.0.2" core: _: "bezier-js": "^2.2.13" diff --git a/packages/components/package.json b/packages/components/package.json index 7bb301f4263..2675453cad9 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -26,25 +26,27 @@ "watch": "BABEL_ENV=production rollup -c -w -o dist/index.js -f cjs" }, "peerDependencies": { - "react": "^16.8", - "prop-types": "15.7.2", - "@freesewing/pattern-info": "^2.0.0-beta.32", - "@freesewing/mui-theme": "^2.0.0-beta.32", - "@freesewing/css-theme": "^2.0.0-beta.32", "@freesewing/core": "^2.0.0-beta.32", + "@freesewing/css-theme": "^2.0.0-beta.32", "@freesewing/examples": "^2.0.0-beta.32", + "@freesewing/i18n": "^2.0.0-beta.32", + "@freesewing/mui-theme": "^2.0.0-beta.32", + "@freesewing/pattern-info": "^2.0.0-beta.32", "@freesewing/rendertest": "^2.0.0-beta.32", "@freesewing/tutorial": "^2.0.0-beta.32", - "typeface-roboto-condensed": "latest", - "@freesewing/i18n": "^2.0.0-beta.32", "@freesewing/utils": "^2.0.0-beta.32", - "react-intl": "^2.8.0", "@material-ui/core": "^4.0.1", "@material-ui/icons": "^4.0.1", "@material-ui/lab": "^v4.0.0-alpha.14", - "prismjs": "1.16.0" + "prismjs": "1.16.0", + "prop-types": "15.7.2", + "react": "^16.8", + "react-intl": "^2.8.0", + "typeface-roboto-condensed": "latest" + }, + "dependencies": { + "file-saver": "2.0.2" }, - "dependencies": {}, "devDependencies": {}, "files": [ "Blockquote/*", diff --git a/packages/components/src/Footer/index.js b/packages/components/src/Footer/index.js index 83d412f9e5b..0b639485c2f 100644 --- a/packages/components/src/Footer/index.js +++ b/packages/components/src/Footer/index.js @@ -13,20 +13,23 @@ const Footer = props => { instagram: "https://instagram.com/freesewing_org", facebook: "https://facebook.com/freesewing.org/" }; - const links = { - docs: { - blog: "https://" + props.language + ".freesewing.org/blog", - aboutFreesewing: - "https://" + props.language + ".freesewing.org/docs/about", - faq: "https://" + props.language + ".freesewing.org/docs/faq" - }, - community: { - becomeAPatron: - "https://" + props.language + ".freesewing.org/patrons/join", - makerDocs: "https://" + props.language + ".freesewing.org/docs/", - devDocs: "https://" + props.language + ".freesewing.dev/" - } - }; + const links = + props.links === false + ? { + left: { + blog: "https://" + props.language + ".freesewing.org/blog", + aboutFreesewing: + "https://" + props.language + ".freesewing.org/docs/about", + faq: "https://" + props.language + ".freesewing.org/docs/faq" + }, + right: { + becomeAPatron: + "https://" + props.language + ".freesewing.org/patrons/join", + makerDocs: "https://" + props.language + ".freesewing.org/docs/", + devDocs: "https://" + props.language + ".freesewing.dev/" + } + } + : props.links; const styles = { container: { display: "flex", @@ -57,7 +60,7 @@ const Footer = props => { items.push(
  • @@ -78,6 +81,7 @@ const Footer = props => { }; Footer.defaultProps = { - home: "/" + home: "/", + links: false }; export default Footer; diff --git a/packages/components/src/Workbench/DraftPattern/index.js b/packages/components/src/Workbench/DraftPattern/index.js index 132267af6f7..7c7d554a1f6 100644 --- a/packages/components/src/Workbench/DraftPattern/index.js +++ b/packages/components/src/Workbench/DraftPattern/index.js @@ -5,6 +5,8 @@ import Design from "../Design"; import DraftConfigurator from "../../DraftConfigurator"; import { FormattedMessage } from "react-intl"; import Prism from "prismjs"; +import fileSaver from "file-saver"; +import theme from "@freesewing/plugin-theme"; const DraftPattern = props => { const [design, setDesign] = useState(true); @@ -30,6 +32,23 @@ const DraftPattern = props => { setFocus(f); }; + const svgToFile = svg => { + const blob = new Blob([svg], { + type: "image/svg+xml;charset=utf-8" + }); + fileSaver.saveAs(blob, "freesewing-" + props.config.name + ".svg"); + }; + + if (props.svgExport) { + svgToFile( + new props.Pattern(props.gist.settings) + .use(theme) + .draft() + .render() + ); + props.setSvgExport(false); + } + const styles = { paragraph: { padding: "0 1rem" @@ -56,6 +75,8 @@ const DraftPattern = props => { return (
    +
    REMOVEME
    +
    {JSON.stringify(props.svgExport, null, 2)}

    diff --git a/packages/components/src/Workbench/index.js b/packages/components/src/Workbench/index.js index 3e8de3bb01d..2cb1f55b861 100644 --- a/packages/components/src/Workbench/index.js +++ b/packages/components/src/Workbench/index.js @@ -21,6 +21,7 @@ const Workbench = props => { const [pattern, setPattern] = useState(false); const [theme, setTheme] = useState("light"); const [measurements, setMeasurements] = useState(null); + const [svgExport, setSvgExport] = useState(false); useEffect(() => { let m = getMeasurements(); setMeasurements(m); @@ -28,19 +29,13 @@ const Workbench = props => { setDisplay(getDisplay()); props.setLanguage(props.userLanguage || "en"); }, []); - useEffect( - () => { - if (props.from) props.importGist(props.from); - }, - [props.from] - ); - useEffect( - () => { - if (props.language !== props.gist.settings.locale) - props.updateGist(props.language, "settings", "locale"); - }, - [props.language] - ); + useEffect(() => { + if (props.from) props.importGist(props.from); + }, [props.from]); + useEffect(() => { + if (props.language !== props.gist.settings.locale) + props.updateGist(props.language, "settings", "locale"); + }, [props.language]); const getDisplay = () => storage.get(props.config.name + "-display"); const saveDisplay = d => { @@ -125,6 +120,13 @@ const Workbench = props => { } } }; + if (display === "draft" && !measurementsMissing()) + navs.left.svgExport = { + type: "button", + onClick: () => setSvgExport(true), + text: "app.export", + active: false + }; // FIXME: navs.mleft = navs.left; navs.mright = navs.right; @@ -149,6 +151,8 @@ const Workbench = props => { updateGist={props.updateGist} raiseEvent={raiseEvent} units={props.units} + svgExport={svgExport} + setSvgExport={setSvgExport} /> ); break; diff --git a/yarn.lock b/yarn.lock index 672b22cef59..77a4579516e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8034,6 +8034,11 @@ file-loader@3.0.1, file-loader@^3.0.1: loader-utils "^1.0.2" schema-utils "^1.0.0" +file-saver@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a" + integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw== + file-system-cache@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" @@ -16610,17 +16615,6 @@ rollup-plugin-sass@^1.2.2: rollup-pluginutils ">= 1.3.1" sass "1.7.2" -rollup-plugin-terser@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.1.1.tgz#e9d2545ec8d467f96ba99b9216d2285aad8d5b66" - integrity sha512-McIMCDEY8EU6Y839C09UopeRR56wXHGdvKKjlfiZG/GrP6wvZQ62u2ko/Xh1MNH2M9WDL+obAAHySljIZYCuPQ== - dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^24.6.0" - rollup-pluginutils "^2.8.1" - serialize-javascript "^1.7.0" - terser "^4.1.0" - rollup-plugin-terser@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz#6f661ef284fa7c27963d242601691dc3d23f994e" @@ -18099,7 +18093,7 @@ terser@^3.14.1, terser@^3.16.1, terser@^3.8.0: source-map "~0.6.1" source-map-support "~0.5.10" -terser@^4.0.0, terser@^4.1.0: +terser@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" integrity sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==