diff --git a/config/descriptions.yaml b/config/descriptions.yaml index 33c56d651aa..98e77c789f5 100644 --- a/config/descriptions.yaml +++ b/config/descriptions.yaml @@ -13,6 +13,7 @@ create-freesewing-pattern: "Initializer package for FreeSewing patterns: npm ini css-theme: "A CSS theme for FreeSewing web UIs" examples: "A FreeSewing pattern holding examples for our documentation" florent: "A FreeSewing pattern for a flat cap" +fu: "A FreeSewing pattern for a face mask" gatsby-remark-jargon: "A gatsby-transformer-remark sub-plugin for jargon terms" holmes: "A FreeSewing pattern for a Sherlock Holmes hat" huey: "A FreeSewing pattern for a zip-up hoodie" diff --git a/packages/components/src/LineDrawing/patterns.js b/packages/components/src/LineDrawing/patterns.js index 53fcc70c81f..78080bc0244 100644 --- a/packages/components/src/LineDrawing/patterns.js +++ b/packages/components/src/LineDrawing/patterns.js @@ -164,6 +164,21 @@ const svg = { d="m 187.17375,184.33425 -15.75119,-1.47576 c -60.36752,21.15691 -98.5494,9.79442 -145.208319,11.247" /> ], + fu: [ + , + , + + ], + holmes: [ @freesewing/fu on NPM + License: MIT + Code quality on DeepScan + Open issues tagged pkg:fu +

Follow @freesewing_org on Twitter + Chat with us on Gitter + Become a FreeSewing Patron + Follow @freesewing_org on Twitter +

+ +## What am I looking at? 🤔 + +This repository is our *monorepo* holding [all our NPM packages](https://www.npmjs.com/search?q=keywords:freesewing). +This folder holds **@freesewing/fu** + +A FreeSewing pattern for a face mask + + + +## About FreeSewing 💀 + +Where the world of makers and developers collide, that's where you'll find FreeSewing. + +Our [core library](https://freesewing.dev/) is a *batteries-included* toolbox +for parametric design of sewing patterns. It's a modular system (check our list +of [plugins](https://freesewing.dev/plugins) and getting started is as simple as: + +```bash +npm init freesewing-pattern +``` + +The [getting started](https://freesewing.dev/start) section on [freesewing.dev](https://freesewing.dev/) is a good +entrypoint to our documentation, but you'll find a lot more there, including +our [API reference](https://freesewing.dev/api), +as well as [our turorial](https://freesewing.dev/tutorial), +and [best practices](https://freesewing.dev/do). + +If you're a maker, checkout [freesewing.org](https://freesewing/) where you can generate +our sewing patterns adapted to your measurements. + +## Support FreeSewing: Become a patron 🥰 + +FreeSewing is an open source project run by a community, +and financially supported by our patrons. + +If you feel what we do is worthwhile, you too +should [become a patron](https://freesewing.org/patrons/join). + +## Links 👩‍💻 + + - 💻 Makers website: [freesewing.org](https://freesewing.org) + - 💻 Developers website: [freesewing.dev](https://freesewing.dev) + - 💬 Chat: [gitter.im/freesewing](https://gitter.im/freesewing/chat) + - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org) + - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org) + +## License: MIT 🤓 + +© [Joost De Cock](https://github.com/joostdecock). +See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details. + +## Where to get help 🤯 + +Our [chatroom on Gitter](https://gitter.im/freesewing/chat) is the best place to ask questions, +share your feedback, or just hang out. + +If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new). diff --git a/packages/fu/config/index.js b/packages/fu/config/index.js new file mode 100644 index 00000000000..ac13767ecbc --- /dev/null +++ b/packages/fu/config/index.js @@ -0,0 +1,23 @@ +import { version } from '../package.json' + +export default { + name: 'fu', + version: version, + design: 'Joost De Cock', + code: 'Joost De Cock', + department: 'accessories', + type: 'pattern', + difficulty: 1, + tags: [], + optionGroups: { + fit: ['height', 'length', 'curve', 'shaping'] + }, + measurements: ['headCircumference'], + parts: ['mask'], + options: { + length: { pct: 40, min: 30, max: 50 }, + height: { pct: 25, min: 20, max: 30 }, + curve: { pct: 6, min: 3, max: 9 }, + shaping: { pct: 50, min: 25, max: 75 } + } +} diff --git a/packages/fu/example/.babelrc b/packages/fu/example/.babelrc new file mode 100644 index 00000000000..6e3090a4956 --- /dev/null +++ b/packages/fu/example/.babelrc @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["prismjs", { + "languages": ["javascript", "css", "markup"], + "plugins": ["line-numbers"], + "theme": "twilight", + "css": true + }] + ] +} diff --git a/packages/fu/example/README.md b/packages/fu/example/README.md new file mode 100644 index 00000000000..5dde1c00256 --- /dev/null +++ b/packages/fu/example/README.md @@ -0,0 +1,96 @@ +

+Freesewing logo +
+FreeSewing v2 +

+

A JavaScript library for made-to-measure sewing patterns

+

Follow @freesewing_org on Twitter + Chat with us on Gitter + Become a FreeSewing Patron + Follow @freesewing_org on Twitter + +

+ +# fu example + +This project was bootstrapped with [Create Freesewing Pattern](https://en.freesewing.dev/create-freesewing-pattern): + +```js +npm init freesewing-pattern +``` + +This example folder is part of the local development environment. +It is **not** part of the pattern's source code. + +To run this example, follow these steps: + + - In the folder above this one, run: `yarn start` (or `npm start`) + - Then, in new terminal, run the same command in this folder: `yarn start` (or `npm start`) + +This will spin up the development environment, similar to [our online demo](https://fu.freesewing.dev/). + +## About FreeSewing 🤔 + +Where the world of makers and developers collide, that's where you'll find FreeSewing. + +Our [core library](https://freesewing.dev/en/freesewing) is a *batteries-included* toolbox +for parametric design of sewing patterns. It's a modular system (check our list +of [plugins](https://freesewing.dev/en/plugins) and getting started is as simple as: + +```bash +npm init freesewing-pattern +``` + +The [getting started] section on [freesewing.dev](https://freesewing.dev/) is a good +entrypoint to our documentation, but you'll find a lot more there, including +our [API documentation](https://freesewing.dev/en/freesewing/api), +as well as [examples](https://freesewing.dev/en/freesewing/examples), +and [best practices](https://freesewing.dev/en/do). + +If you're a maker, checkout [freesewing.org](https://freesewing/) where you can generate +our sewing patterns adapted to your measurements. + +## Support FreeSewing: Become a patron 🥰 + +FreeSewing is an open source project run by a community, +and financially supported by our patrons. + +If you feel what we do is worthwhile, you too +should [become a patron](https://freesewing.org/patrons/join). + +## Links 👩‍💻 + + - 💻 Makers website: [freesewing.org](https://freesewing.org) + - 💻 Developers website: [freesewing.dev](https://freesewing.org) + - 💬 Chat: [gitter.im/freesewing](https://gitter.im/freesewing/freesewing) + - 🐦 Twitter: [@freesewing_org](https://twitter.com/freesewing_org) + - 📷 Instagram: [@freesewing_org](https://instagram.com/freesewing_org) + +## License: MIT 🤓 + +© [Joost De Cock](https://github.com/joostdecock). +See [the license file](https://github.com/freesewing/freesewing/blob/develop/LICENSE) for details. + +## Where to get help 🤯 + +Our [chatroom on Gitter](https://gitter.im) is the best place to ask questions, +share your feedback, or just hang out. + +If you want to report a problem, please [create an issue](https://github.com/freesewing/freesewing/issues/new). + diff --git a/packages/fu/example/package.json b/packages/fu/example/package.json new file mode 100644 index 00000000000..00f21c1ab85 --- /dev/null +++ b/packages/fu/example/package.json @@ -0,0 +1,48 @@ +{ + "name": "fu-example", + "homepage": "https://freesewing.github.io/fu", + "version": "0.0.0", + "private": true, + "dependencies": { + "@freesewing/components": "latest", + "@freesewing/core": "latest", + "@freesewing/css-theme": "latest", + "@freesewing/i18n": "latest", + "@freesewing/models": "latest", + "@freesewing/mui-theme": "latest", + "@freesewing/pattern-info": "latest", + "@freesewing/plugin-bundle": "latest", + "@freesewing/plugin-theme": "latest", + "@freesewing/plugin-i18n": "latest", + "@freesewing/plugin-svgattr": "latest", + "@freesewing/utils": "latest", + "@material-ui/core": "^4.4.0", + "@material-ui/icons": "^4.2.1", + "@material-ui/lab": "^v4.0.0-alpha.25", + "pattern": "link:..", + "prismjs": "1.17.1", + "react": "^16.9", + "react-dom": "^16.9", + "react-scripts": "^3.1.1", + "file-saver": "^2.0.2", + "typeface-roboto-condensed": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ], + "devDependencies": { + "babel-plugin-prismjs": "1.1.1" + } +} diff --git a/packages/fu/example/public/favicon.ico b/packages/fu/example/public/favicon.ico new file mode 100644 index 00000000000..95061a260f1 Binary files /dev/null and b/packages/fu/example/public/favicon.ico differ diff --git a/packages/fu/example/public/index.html b/packages/fu/example/public/index.html new file mode 100644 index 00000000000..ba66d6053a7 --- /dev/null +++ b/packages/fu/example/public/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + + fu + + + +
+ + + diff --git a/packages/fu/example/public/manifest.json b/packages/fu/example/public/manifest.json new file mode 100644 index 00000000000..a1d35b1177f --- /dev/null +++ b/packages/fu/example/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "fu", + "name": "fu", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/packages/fu/example/src/App.js b/packages/fu/example/src/App.js new file mode 100644 index 00000000000..3bad5ad72fb --- /dev/null +++ b/packages/fu/example/src/App.js @@ -0,0 +1,16 @@ +import React from 'react' +import freesewing from '@freesewing/core' +import Workbench from '@freesewing/components/Workbench' +import 'typeface-roboto-condensed' +import '@freesewing/css-theme' + +import Pattern from 'pattern' + +const App = props => { + let instance = new Pattern() + let config = instance.config + + return +} + +export default App diff --git a/packages/fu/example/src/index.js b/packages/fu/example/src/index.js new file mode 100644 index 00000000000..9dd7ba788d4 --- /dev/null +++ b/packages/fu/example/src/index.js @@ -0,0 +1,11 @@ +import React from 'react' +import ReactDOM from 'react-dom' +import App from './App' +import * as serviceWorker from './serviceWorker' + +ReactDOM.render(, document.getElementById('root')) + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister() diff --git a/packages/fu/example/src/serviceWorker.js b/packages/fu/example/src/serviceWorker.js new file mode 100644 index 00000000000..44e1b1b2f8c --- /dev/null +++ b/packages/fu/example/src/serviceWorker.js @@ -0,0 +1,123 @@ +// In production, we register a service worker to serve assets from local cache. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on the "N+1" visit to a page, since previously +// cached resources are updated in the background. + +// To learn more about the benefits of this model, read https://goo.gl/KwvDNy. +// This link also includes instructions on opting out of this behavior. + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) +) + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location) + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js` + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config) + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://goo.gl/SC7cgQ' + ) + }) + } else { + // Is not local host. Just register service worker + registerValidSW(swUrl, config) + } + }) + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the old content will have been purged and + // the fresh content will have been added to the cache. + // It's the perfect time to display a "New content is + // available; please refresh." message in your web app. + console.log('New content is available; please refresh.') + + // Execute callback + if (config.onUpdate) { + config.onUpdate(registration) + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.') + + // Execute callback + if (config.onSuccess) { + config.onSuccess(registration) + } + } + } + } + } + }) + .catch(error => { + console.error('Error during service worker registration:', error) + }) +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + if ( + response.status === 404 || + response.headers.get('content-type').indexOf('javascript') === -1 + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload() + }) + }) + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config) + } + }) + .catch(() => { + console.log('No internet connection found. App is running in offline mode.') + }) +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister() + }) + } +} diff --git a/packages/fu/package.json b/packages/fu/package.json new file mode 100644 index 00000000000..ac62c049537 --- /dev/null +++ b/packages/fu/package.json @@ -0,0 +1,89 @@ +{ + "name": "@freesewing/fu", + "version": "2.3.0-beta.1", + "description": "A FreeSewing pattern for a face mask", + "author": "Joost De Cock (https://github.com/joostdecock)", + "homepage": "https://freesewing.org/", + "repository": "github:freesewing/freesewing", + "license": "MIT", + "bugs": { + "url": "https://github.com/freesewing/freesewing/issues" + }, + "keywords": [ + "freesewing", + "design", + "diy", + "fashion", + "made to measure", + "parametric design", + "pattern", + "sewing", + "sewing pattern" + ], + "main": "dist/index.js", + "module": "dist/index.mjs", + "scripts": { + "clean": "rimraf dist", + "build": "npm run clean && rollup -c", + "test": "echo \"fu: No tests configured. Perhaps you'd like to do this?\" && exit 0", + "pubtest": "npm publish --registry http://localhost:6662", + "pubforce": "npm publish", + "symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -", + "start": "rollup -c -w", + "netlify": "echo \"Not configured yet\"" + }, + "peerDependencies": { + "@freesewing/core": "^2.3.0", + "@freesewing/plugin-bundle": "^2.3.0" + }, + "dependencies": {}, + "devDependencies": { + "react": "^16.8", + "react-dom": "^16.8", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "babel-eslint": "10.0.1", + "eslint": "^5.16.0", + "babel-jest": "24.7.1", + "jest": "24.7.1", + "@freesewing/components": "^2.3.0", + "@freesewing/css-theme": "^2.3.0", + "@freesewing/i18n": "^2.3.0", + "@freesewing/mui-theme": "^2.3.0", + "@freesewing/plugin-bust": "^2.3.0", + "@freesewing/plugin-buttons": "^2.3.0", + "@freesewing/plugin-flip": "^2.3.0", + "@freesewing/utils": "^2.3.0", + "@svgr/rollup": "^2.4.1", + "cross-env": "^5.1.4", + "gh-pages": "^1.2.0", + "react-scripts": "^3.0.0", + "webpack": "4.29.6", + "rollup": "^0.64.1", + "rollup-plugin-babel": "^4.0.1", + "rollup-plugin-babel-minify": "^7.0.0", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-json": "^3.1.0", + "rollup-plugin-node-resolve": "^3.3.0", + "rollup-plugin-peer-deps-external": "^2.2.0", + "rollup-plugin-postcss": "^1.6.2", + "rollup-plugin-url": "^1.4.0", + "@material-ui/core": "4.0.1", + "@material-ui/icons": "4.0.1", + "@material-ui/lab": "^v4.0.0-alpha.14", + "react-intl": "2.8.0", + "prop-types": "15.7.2" + }, + "files": [ + "dist/*", + "README.md", + "package.json" + ], + "publishConfig": { + "access": "public", + "tag": "beta" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5" + } +} diff --git a/packages/fu/rollup.config.js b/packages/fu/rollup.config.js new file mode 100644 index 00000000000..142439a7f29 --- /dev/null +++ b/packages/fu/rollup.config.js @@ -0,0 +1,41 @@ +import babel from 'rollup-plugin-babel' +import resolve from 'rollup-plugin-node-resolve' +import commonjs from 'rollup-plugin-commonjs' +import json from 'rollup-plugin-json' +import minify from 'rollup-plugin-babel-minify' +import peerDepsExternal from 'rollup-plugin-peer-deps-external' +import { name, version, description, author, license, main, module } from './package.json' + +const output = [ + { + file: main, + format: 'cjs', + sourcemap: true + } +] +if (typeof module !== 'undefined') + output.push({ + file: module, + format: 'es', + sourcemap: true + }) + +export default { + input: 'src/index.js', + output, + plugins: [ + peerDepsExternal(), + resolve({ modulesOnly: true }), + commonjs(), + json(), + babel({ + exclude: 'node_modules/**', + plugins: ['@babel/plugin-proposal-object-rest-spread'] + }), + minify({ + comments: false, + sourceMap: true, + banner: `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */` + }) + ] +} diff --git a/packages/fu/src/index.js b/packages/fu/src/index.js new file mode 100644 index 00000000000..70c44e1c6da --- /dev/null +++ b/packages/fu/src/index.js @@ -0,0 +1,13 @@ +import freesewing from '@freesewing/core' +import plugins from '@freesewing/plugin-bundle' +import config from '../config' +// Parts +import draftMask from './mask' + +// Create design +const Pattern = new freesewing.Design(config, plugins) + +// Attach draft methods to prototype +Pattern.prototype.draftMask = draftMask + +export default Pattern diff --git a/packages/fu/src/mask.js b/packages/fu/src/mask.js new file mode 100644 index 00000000000..2fd17051d0c --- /dev/null +++ b/packages/fu/src/mask.js @@ -0,0 +1,109 @@ +export default part => { + let { + points, + Point, + paths, + Path, + measurements, + options, + complete, + sa, + paperless, + Snippet, + snippets, + macro + } = part.shorthand() + + points.topLeft = new Point(0, 0) + points.bottomLeft = new Point(0, measurements.headCircumference * options.height) + points.topRight = new Point((measurements.headCircumference * options.length) / 2, 0) + points.bottomRight = new Point(points.topRight.x, points.bottomLeft.y) + points.tipCenter = new Point(points.topRight.x, points.bottomRight.y / 2) + + points.topEdge = points.topLeft.shiftFractionTowards(points.bottomLeft, 0.2) + points.bottomEdge = points.bottomLeft.shiftFractionTowards(points.topLeft, 0.18) + points.topTip = points.topRight.shiftFractionTowards(points.topLeft, 0.42 * options.shaping) + points.bottomTip = points.bottomRight.shiftFractionTowards( + points.bottomLeft, + 0.6 * options.shaping + ) + points.topTipCp = points.tipCenter.shiftFractionTowards(points.topRight, 0.5) + points.bottomTipCp = points.tipCenter.shiftFractionTowards(points.bottomRight, 0.5) + + points.topEdgeCp = points.topEdge.shift(0, measurements.headCircumference * options.curve) + + paths.seam = new Path() + .move(points.topEdge) + .line(points.bottomEdge) + .line(points.bottomTip) + ._curve(points.bottomTipCp, points.tipCenter) + .curve_(points.topTipCp, points.topTip) + .curve_(points.topEdgeCp, points.topEdge) + .close() + .attr('class', 'fabric') + + if (complete) { + points.logo = new Point(points.tipCenter.x / 2, points.tipCenter.y / 1.5) + snippets.logo = new Snippet('logo', points.logo).attr('data-scale', 0.5) + points.title = new Point(points.tipCenter.x / 2, points.tipCenter.y * 1.25) + macro('title', { + at: points.title, + nr: 1, + title: 'mask', + scale: 0.5 + }) + + points.topSnap = points.topEdge.shift(-45, 6) + points.bottomSnap = points.bottomEdge.shift(45, 6) + snippets.topSnap = new Snippet('snap-male', points.topSnap) + snippets.bottomSnap = new Snippet('snap-male', points.bottomSnap) + + paths.strip = new Path() + .move(points.topTip) + .curve_(points.topEdgeCp, points.topEdge) + .offset(-10) + .attr('class', 'stroke-sm dotted') + + if (sa) paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa') + + if (paperless) { + macro('hd', { + from: points.bottomEdge, + to: points.bottomTip, + y: points.bottomTip.y + sa + 15 + }) + macro('hd', { + from: points.bottomEdge, + to: points.tipCenter, + y: points.bottomTip.y + sa + 30 + }) + macro('hd', { + from: points.topEdge, + to: points.topTip, + y: points.topTip.y - sa - 15 + }) + macro('vd', { + from: points.bottomTip, + to: points.bottomEdge, + x: points.bottomEdge.x - sa - 15 + }) + macro('vd', { + from: points.bottomTip, + to: points.topEdge, + x: points.bottomEdge.x - sa - 30 + }) + macro('vd', { + from: points.bottomTip, + to: points.topTip, + x: points.bottomEdge.x - sa - 45 + }) + macro('vd', { + from: points.bottomTip, + to: points.tipCenter, + x: points.tipCenter.x + sa + 15 + }) + } + } + + return part +} diff --git a/packages/fu/tests/pattern.test.js b/packages/fu/tests/pattern.test.js new file mode 100644 index 00000000000..d34c44e97bf --- /dev/null +++ b/packages/fu/tests/pattern.test.js @@ -0,0 +1,6 @@ +const patternTests = require('@freesewing/pattern-tests').allTests + +const pattern = require('../dist/') +const pkg = require('../package.json') + +patternTests(pattern, pkg) diff --git a/packages/i18n/src/locales/en/options/fu.yml b/packages/i18n/src/locales/en/options/fu.yml new file mode 100644 index 00000000000..d1b5c079d63 --- /dev/null +++ b/packages/i18n/src/locales/en/options/fu.yml @@ -0,0 +1,15 @@ +height: + title: Height + description: Controls the height of the face mask + +length: + title: Lenght + description: Controls the length of the face mask + +curve: + title: Curve + description: Controls the curvature of the upper edge of the face mask + +shaping: + title: Shaping + description: Controls the amount of shaping in the face mask diff --git a/packages/i18n/src/locales/en/options/index.js b/packages/i18n/src/locales/en/options/index.js index 8e4b3ca24d7..ec1bd6e56f2 100644 --- a/packages/i18n/src/locales/en/options/index.js +++ b/packages/i18n/src/locales/en/options/index.js @@ -1,3 +1,4 @@ +import fu from './fu.yml' import brian from './brian.yml' import breanna from './breanna.yml' import aaron from './aaron.yml' @@ -27,6 +28,7 @@ import { options as optionList } from '@freesewing/pattern-info' import shared from '../../../shared-options.yml' let patterns = { + fu, brian, breanna, aaron, diff --git a/packages/i18n/src/locales/en/patterns.yml b/packages/i18n/src/locales/en/patterns.yml index 7b2e7fac5ff..c93ff8753ab 100644 --- a/packages/i18n/src/locales/en/patterns.yml +++ b/packages/i18n/src/locales/en/patterns.yml @@ -28,6 +28,9 @@ cathrin: florent: description: 'Florent is a flat cap, a rounded cap with a small stiff brim in front.' title: Florent flat cap +fu: + description: 'Fu is a face mask' + title: Fu face mask holmes: description: 'For Sherlock Holmes cosplay or just a cute hat' title: Holmes deerstalker hat diff --git a/packages/pattern-info/src/index.js b/packages/pattern-info/src/index.js index 51d04a7b3c4..3876314ded8 100644 --- a/packages/pattern-info/src/index.js +++ b/packages/pattern-info/src/index.js @@ -16,6 +16,7 @@ export const list = [ 'carlton', 'cathrin', 'florent', + 'fu', 'holmes', 'huey', 'hugo', @@ -41,6 +42,7 @@ export const withoutBreasts = [ 'bruce', 'carlton', 'florent', + 'fu', 'holmes', 'huey', 'hugo', diff --git a/packages/pattern-info/src/prebuild.js b/packages/pattern-info/src/prebuild.js index 1ff7bb60d3c..66b7aa5e8ed 100644 --- a/packages/pattern-info/src/prebuild.js +++ b/packages/pattern-info/src/prebuild.js @@ -10,6 +10,7 @@ const carlita = require('@freesewing/carlita').config const carlton = require('@freesewing/carlton').config const cathrin = require('@freesewing/cathrin').config const florent = require('@freesewing/florent').config +const fu = require('@freesewing/fu').config const holmes = require('@freesewing/holmes').config const huey = require('@freesewing/huey').config const hugo = require('@freesewing/hugo').config @@ -37,6 +38,7 @@ const patterns = { carlton, cathrin, florent, + fu, holmes, huey, hugo,