🔥 Removed workbench package, it's now in components
This commit is contained in:
parent
2008aed4d1
commit
1c127410b5
42 changed files with 3 additions and 23617 deletions
|
@ -33,6 +33,9 @@ components:
|
|||
"@freesewing/i18n": "^{{version}}"
|
||||
"@freesewing/utils": "^{{version}}"
|
||||
"react-intl": "^2.8.0"
|
||||
"@material-ui/core": "^3.9.3"
|
||||
"@material-ui/icons": "^3.0.2"
|
||||
"@material-ui/lab": "^3.0.0-alpha.30"
|
||||
core:
|
||||
_:
|
||||
"bezier-js": "^2.2.13"
|
||||
|
@ -96,16 +99,3 @@ wahid:
|
|||
"@freesewing/brian": "^{{version}}"
|
||||
"@freesewing/plugin-buttons": "^{{version}}"
|
||||
"@freesewing/plugin-round": "^{{version}}"
|
||||
workbench:
|
||||
_:
|
||||
"@freesewing/components": "^{{version}}"
|
||||
"@freesewing/css-theme": "^{{version}}"
|
||||
"@freesewing/utils": "^{{version}}"
|
||||
"@freesewing/mui-theme": "^{{version}}"
|
||||
peer:
|
||||
"@freesewing/core": "^{{version}}"
|
||||
"@freesewing/i18n": "^{{version}}"
|
||||
"@freesewing/utils": "^{{version}}"
|
||||
"@freesewing/plugin-theme": "^{{version}}"
|
||||
"react-intl": "^2.8.0"
|
||||
"typeface-roboto-condensed": "^0.0.54"
|
||||
|
|
|
@ -45,4 +45,3 @@ tamiko: "A FreeSewing pattern for a zero-waste top"
|
|||
trayvon: "A FreeSewing pattern for a tie"
|
||||
utils: "A collection of utilities shared across freesewing frontend projects"
|
||||
wahid: "A FreeSewing pattern for a classic fitted waistcoat"
|
||||
workbench: "A React component to facilitate FreeSewing pattern design"
|
||||
|
|
|
@ -83,8 +83,5 @@ plugin-bundle:
|
|||
- made to measure
|
||||
- diy
|
||||
- fashion
|
||||
workbench:
|
||||
- react
|
||||
- development
|
||||
|
||||
|
||||
|
|
|
@ -27,8 +27,4 @@ core:
|
|||
coverage: "BABEL_ENV=production nyc npm test && nyc report --reporter=text-lcov > coverage.lcov && ./node_modules/.bin/codecov"
|
||||
pattern-info:
|
||||
prebuild: "node src/prebuild.js"
|
||||
workbench:
|
||||
test: "cross-env CI=1 react-scripts test --env=jsdom"
|
||||
test:watch: "react-scripts test --env=jsdom"
|
||||
start: "rollup -c -w"
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"presets": [
|
||||
["@babel/preset-env", { "modules": false }],
|
||||
"@babel/preset-react"
|
||||
],
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"parser": "babel-eslint",
|
||||
"extends": [
|
||||
"standard",
|
||||
"standard-react"
|
||||
],
|
||||
"env": {
|
||||
"es6": true
|
||||
},
|
||||
"plugins": [
|
||||
"react"
|
||||
],
|
||||
"parserOptions": {
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
// don't force es6 functions to include space before paren
|
||||
"space-before-function-paren": 0,
|
||||
|
||||
// allow specifying true explicitly for boolean props
|
||||
"react/jsx-boolean-value": 0
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- 9
|
||||
- 8
|
|
@ -1,98 +0,0 @@
|
|||
> **Note**: This is part of version 2 of FreeSewing.
|
||||
> It is a work in progress, and not ready for prime-time yet
|
||||
>
|
||||
> For all questions, please come say hello in [our chatroom on Gitter](https://gitter.im/).
|
||||
|
||||
<p align="center"><a title="Go to freesewing.org" href="https://freesewing.org/"><img src="https://freesewing.org/img/logo/black.svg" align="center" width="150px" alt="Freesewing logo"/></a></p>
|
||||
<p align="center">FreeSewing is a free and open source library for made-to-measure sewing patterns</p>
|
||||
<p align='center'><a
|
||||
href="https://www.npmjs.com/package/@freesewing/workbench"
|
||||
title="@freesewing/workbench on NPM"
|
||||
><img src="https://img.shields.io/npm/v/freesewing.svg"
|
||||
alt="@freesewing/workbench on NPM"/>
|
||||
</a><a
|
||||
href="https://opensource.org/licenses/MIT"
|
||||
title="License: MIT"
|
||||
><img src="https://img.shields.io/npm/l/freesewing.svg?label=License"
|
||||
alt="License: MIT"/>
|
||||
</a><a
|
||||
href="https://github.com/freesewing/freesewing/issues?q=is%3Aissue+is%3Aopen+label%3Apkg%3Aworkbench"
|
||||
title="Open issues tagged pkg:workbench"
|
||||
><img src="https://img.shields.io/github/issues/freesewing/freesewing/pkg:workbench.svg?label=Issues"
|
||||
alt="Open issues tagged pkg:workbench"/>
|
||||
</a></p><p align='center'><a
|
||||
href="https://twitter.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-blue.svg?logo=twitter&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a><a
|
||||
href="https://gitter.im/freesewing/freesewing"
|
||||
title="Chat with us on Gitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Chat%20with%20us-CA0547.svg?logo=gitter&logoColor=white&logoWidth=15"
|
||||
alt="Chat with us on Gitter"/>
|
||||
</a><a
|
||||
href="https://freesewing.org/patrons/join"
|
||||
title="Become a FreeSewing Patron"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Support%20us-blueviolet.svg?logo=cash-app&logoColor=white&logoWidth=15"
|
||||
alt="Become a FreeSewing Patron"/>
|
||||
</a><a
|
||||
href="https://instagram.com/freesewing_org"
|
||||
title="Follow @freesewing_org on Twitter"
|
||||
><img src="https://img.shields.io/badge/%F3%A0%80%A0-Follow%20us-E4405F.svg?logo=instagram&logoColor=white&logoWidth=15"
|
||||
alt="Follow @freesewing_org on Twitter"/>
|
||||
</a></p>
|
||||
|
||||
# @freesewing/workbench
|
||||
|
||||
A React component to facilitate FreeSewing pattern design
|
||||
|
||||
|
||||
|
||||
## 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).
|
|
@ -1,51 +0,0 @@
|
|||
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 yaml from "rollup-plugin-yaml";
|
||||
import url from "rollup-plugin-url";
|
||||
import postcss from "rollup-plugin-postcss";
|
||||
import svgr from "@svgr/rollup";
|
||||
import peerDepsExternal from "rollup-plugin-peer-deps-external";
|
||||
import { name, version, description, author, license } from "./package.json";
|
||||
|
||||
export default {
|
||||
input: "src/index.js",
|
||||
output: [
|
||||
{
|
||||
file: "dist/index.js",
|
||||
format: "cjs",
|
||||
sourcemap: true
|
||||
},
|
||||
{
|
||||
file: "dist/index.mjs",
|
||||
format: "es",
|
||||
sourcemap: true
|
||||
}
|
||||
],
|
||||
plugins: [
|
||||
peerDepsExternal(),
|
||||
resolve({ modulesOnly: true }),
|
||||
url(),
|
||||
commonjs(),
|
||||
json(),
|
||||
yaml(),
|
||||
svgr(),
|
||||
postcss({
|
||||
modules: true
|
||||
}),
|
||||
babel({
|
||||
exclude: "node_modules/**",
|
||||
plugins: [
|
||||
"@babel/plugin-proposal-object-rest-spread",
|
||||
"@babel/plugin-transform-react-jsx"
|
||||
]
|
||||
}),
|
||||
minify({
|
||||
comments: false,
|
||||
sourceMap: true,
|
||||
banner: `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */`
|
||||
})
|
||||
]
|
||||
};
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"plugins": [
|
||||
["transform-object-rest-spread", { "useBuiltIns": true }]
|
||||
]
|
||||
}
|
File diff suppressed because it is too large
Load diff
11115
packages/workbench/example/package-lock.json
generated
11115
packages/workbench/example/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,30 +0,0 @@
|
|||
{
|
||||
"name": "workbench-example",
|
||||
"homepage": "https://freesewing.github.io/workbench",
|
||||
"version": "0.0.0",
|
||||
"license": "MIT",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@freesewing/aaron": "file:../../aaron",
|
||||
"@freesewing/brian": "file:../../brian",
|
||||
"@freesewing/core": "file:../../core",
|
||||
"@freesewing/components": "file:../../components",
|
||||
"@freesewing/utils": "file:../../core",
|
||||
"@freesewing/i18n": "file:../../i18n",
|
||||
"@freesewing/plugin-bundle": "file:../../plugin-bundle",
|
||||
"@freesewing/plugin-theme": "file:../../plugin-theme",
|
||||
"prop-types": "^15.6.2",
|
||||
"react": "^16.4.1",
|
||||
"react-dom": "^16.4.1",
|
||||
"react-intl": "2.8.0",
|
||||
"react-scripts": "^1.1.4",
|
||||
"@freesewing/workbench": "file:.."
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test --env=jsdom",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"devDependencies": {}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#000000">
|
||||
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
||||
|
||||
<title>workbench</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
You need to enable JavaScript to run this app.
|
||||
</noscript>
|
||||
|
||||
<div id="root"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"short_name": "workbench",
|
||||
"name": "workbench",
|
||||
"start_url": "./index.html",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
import React from "react";
|
||||
import Workbench from "@freesewing/workbench";
|
||||
import freesewing from "@freesewing/core";
|
||||
//import Aaron from "@freesewing/aaron";
|
||||
//import Brian from "@freesewing/brian";
|
||||
//import plugins from "@freesewing/plugin-bundle";
|
||||
|
||||
export default props => {
|
||||
console.log(freesewing);
|
||||
return <Workbench freesewing={freesewing} patterns={{}} plugins={{}} />;
|
||||
};
|
|
@ -1,5 +0,0 @@
|
|||
import React from 'react'
|
||||
import ReactDOM from 'react-dom'
|
||||
import App from './App'
|
||||
|
||||
ReactDOM.render(<App />, document.getElementById('root'))
|
File diff suppressed because it is too large
Load diff
684
packages/workbench/package-lock.json
generated
684
packages/workbench/package-lock.json
generated
|
@ -1,684 +0,0 @@
|
|||
{
|
||||
"name": "@freesewing/workbench",
|
||||
"version": "0.32.4",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@babel/helper-builder-react-jsx": {
|
||||
"version": "7.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz",
|
||||
"integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/types": "^7.3.0",
|
||||
"esutils": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/helper-plugin-utils": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
|
||||
"integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
|
||||
"dev": true
|
||||
},
|
||||
"@babel/plugin-external-helpers": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz",
|
||||
"integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/helper-plugin-utils": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/plugin-syntax-jsx": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz",
|
||||
"integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/helper-plugin-utils": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/plugin-transform-react-jsx": {
|
||||
"version": "7.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz",
|
||||
"integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/helper-builder-react-jsx": "^7.3.0",
|
||||
"@babel/helper-plugin-utils": "^7.0.0",
|
||||
"@babel/plugin-syntax-jsx": "^7.2.0"
|
||||
}
|
||||
},
|
||||
"@babel/runtime": {
|
||||
"version": "7.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
|
||||
"integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"@babel/types": {
|
||||
"version": "7.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
|
||||
"integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"esutils": "^2.0.2",
|
||||
"lodash": "^4.17.11",
|
||||
"to-fast-properties": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@emotion/hash": {
|
||||
"version": "0.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.1.tgz",
|
||||
"integrity": "sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA=="
|
||||
},
|
||||
"@freesewing/components": {
|
||||
"version": "file:../components"
|
||||
},
|
||||
"@freesewing/css-theme": {
|
||||
"version": "file:../css-theme",
|
||||
"requires": {
|
||||
"open-color": "1.6.3"
|
||||
}
|
||||
},
|
||||
"@freesewing/i18n": {
|
||||
"version": "file:../i18n"
|
||||
},
|
||||
"@freesewing/utils": {
|
||||
"version": "file:../utils"
|
||||
},
|
||||
"@material-ui/core": {
|
||||
"version": "3.9.3",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.3.tgz",
|
||||
"integrity": "sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"@material-ui/system": "^3.0.0-alpha.0",
|
||||
"@material-ui/utils": "^3.0.0-alpha.2",
|
||||
"@types/jss": "^9.5.6",
|
||||
"@types/react-transition-group": "^2.0.8",
|
||||
"brcast": "^3.0.1",
|
||||
"classnames": "^2.2.5",
|
||||
"csstype": "^2.5.2",
|
||||
"debounce": "^1.1.0",
|
||||
"deepmerge": "^3.0.0",
|
||||
"dom-helpers": "^3.2.1",
|
||||
"hoist-non-react-statics": "^3.2.1",
|
||||
"is-plain-object": "^2.0.4",
|
||||
"jss": "^9.8.7",
|
||||
"jss-camel-case": "^6.0.0",
|
||||
"jss-default-unit": "^8.0.2",
|
||||
"jss-global": "^3.0.0",
|
||||
"jss-nested": "^6.0.1",
|
||||
"jss-props-sort": "^6.0.0",
|
||||
"jss-vendor-prefixer": "^7.0.0",
|
||||
"normalize-scroll-left": "^0.1.2",
|
||||
"popper.js": "^1.14.1",
|
||||
"prop-types": "^15.6.0",
|
||||
"react-event-listener": "^0.6.2",
|
||||
"react-transition-group": "^2.2.1",
|
||||
"recompose": "0.28.0 - 0.30.0",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"@material-ui/icons": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-3.0.2.tgz",
|
||||
"integrity": "sha512-QY/3gJnObZQ3O/e6WjH+0ah2M3MOgLOzCy8HTUoUx9B6dDrS18vP7Ycw3qrDEKlB6q1KNxy6CZHm5FCauWGy2g==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"recompose": "0.28.0 - 0.30.0"
|
||||
}
|
||||
},
|
||||
"@material-ui/lab": {
|
||||
"version": "3.0.0-alpha.30",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-3.0.0-alpha.30.tgz",
|
||||
"integrity": "sha512-d8IXbkQO92Ln7f/Tzy8Q5cLi/sMWH/Uz1xrOO5NKUgg42whwyCuoT9ErddDPFNQmPi9d1C7A5AG8ONjEAbAIyQ==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"@material-ui/utils": "^3.0.0-alpha.2",
|
||||
"classnames": "^2.2.5",
|
||||
"keycode": "^2.1.9",
|
||||
"prop-types": "^15.6.0"
|
||||
}
|
||||
},
|
||||
"@material-ui/styles": {
|
||||
"version": "3.0.0-alpha.10",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-3.0.0-alpha.10.tgz",
|
||||
"integrity": "sha512-qJ5eiupBPRCNlMCDZ2G5h8auBtBtm8uT/oCUAJ/FqhO5oC7POLmmvDN1Cq1cgAmqQnaL6uN5mAM1Gc90GpKr9A==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"@emotion/hash": "^0.7.1",
|
||||
"@material-ui/utils": "^3.0.0-alpha.2",
|
||||
"classnames": "^2.2.5",
|
||||
"deepmerge": "^3.0.0",
|
||||
"hoist-non-react-statics": "^3.2.1",
|
||||
"jss": "^10.0.0-alpha.7",
|
||||
"jss-plugin-camel-case": "^10.0.0-alpha.7",
|
||||
"jss-plugin-default-unit": "^10.0.0-alpha.7",
|
||||
"jss-plugin-global": "^10.0.0-alpha.7",
|
||||
"jss-plugin-nested": "^10.0.0-alpha.7",
|
||||
"jss-plugin-props-sort": "^10.0.0-alpha.7",
|
||||
"jss-plugin-rule-value-function": "^10.0.0-alpha.7",
|
||||
"jss-plugin-vendor-prefixer": "^10.0.0-alpha.7",
|
||||
"prop-types": "^15.6.0",
|
||||
"warning": "^4.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"jss": {
|
||||
"version": "10.0.0-alpha.16",
|
||||
"resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0-alpha.16.tgz",
|
||||
"integrity": "sha512-HmKNNnr82TR5jkWjBcbrx/uim2ief588pWp7zsf4GQpL125zRkEaWYL1SXv5bR6bBvAoTtvJsTAOxDIlLxUNZg==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.3.1",
|
||||
"is-in-browser": "^1.1.3",
|
||||
"tiny-warning": "^1.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@material-ui/system": {
|
||||
"version": "3.0.0-alpha.2",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/system/-/system-3.0.0-alpha.2.tgz",
|
||||
"integrity": "sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"deepmerge": "^3.0.0",
|
||||
"prop-types": "^15.6.0",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"@material-ui/utils": {
|
||||
"version": "3.0.0-alpha.3",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz",
|
||||
"integrity": "sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"prop-types": "^15.6.0",
|
||||
"react-is": "^16.6.3"
|
||||
}
|
||||
},
|
||||
"@types/jss": {
|
||||
"version": "9.5.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.8.tgz",
|
||||
"integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==",
|
||||
"requires": {
|
||||
"csstype": "^2.0.0",
|
||||
"indefinite-observable": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"@types/prop-types": {
|
||||
"version": "15.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz",
|
||||
"integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg=="
|
||||
},
|
||||
"@types/react": {
|
||||
"version": "16.8.14",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.14.tgz",
|
||||
"integrity": "sha512-26tFVJ1omGmzIdFTFmnC5zhz1GTaqCjxgUxV4KzWvsybF42P7/j4RBn6UeO3KbHPXqKWZszMXMoI65xIWm954A==",
|
||||
"requires": {
|
||||
"@types/prop-types": "*",
|
||||
"csstype": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"@types/react-transition-group": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.9.0.tgz",
|
||||
"integrity": "sha512-hP7vUaZMVSWKxo133P8U51U6UZ7+pbY+eAQb8+p6SZ2rB1rj3mOTDgTzhhi+R2SCB4S+sWekAAGoxdiZPG0ReQ==",
|
||||
"requires": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"asap": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
|
||||
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
|
||||
},
|
||||
"brcast": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz",
|
||||
"integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg=="
|
||||
},
|
||||
"change-emitter": {
|
||||
"version": "0.1.6",
|
||||
"resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
|
||||
"integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
|
||||
},
|
||||
"classnames": {
|
||||
"version": "2.2.6",
|
||||
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
|
||||
"integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
|
||||
},
|
||||
"core-js": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
|
||||
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
|
||||
},
|
||||
"css-vendor": {
|
||||
"version": "0.3.8",
|
||||
"resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz",
|
||||
"integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=",
|
||||
"requires": {
|
||||
"is-in-browser": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"csstype": {
|
||||
"version": "2.6.4",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.4.tgz",
|
||||
"integrity": "sha512-lAJUJP3M6HxFXbqtGRc0iZrdyeN+WzOWeY0q/VnFzI+kqVrYIzC7bWlKqCW7oCIdzoPkvfp82EVvrTlQ8zsWQg=="
|
||||
},
|
||||
"debounce": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz",
|
||||
"integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg=="
|
||||
},
|
||||
"deepmerge": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz",
|
||||
"integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow=="
|
||||
},
|
||||
"dom-helpers": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
|
||||
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.1.2"
|
||||
}
|
||||
},
|
||||
"encoding": {
|
||||
"version": "0.1.12",
|
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
|
||||
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
|
||||
"requires": {
|
||||
"iconv-lite": "~0.4.13"
|
||||
}
|
||||
},
|
||||
"esutils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
|
||||
"dev": true
|
||||
},
|
||||
"fbjs": {
|
||||
"version": "0.8.17",
|
||||
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
|
||||
"integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
|
||||
"requires": {
|
||||
"core-js": "^1.0.0",
|
||||
"isomorphic-fetch": "^2.1.1",
|
||||
"loose-envify": "^1.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"promise": "^7.1.1",
|
||||
"setimmediate": "^1.0.5",
|
||||
"ua-parser-js": "^0.7.18"
|
||||
}
|
||||
},
|
||||
"hoist-non-react-statics": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz",
|
||||
"integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==",
|
||||
"requires": {
|
||||
"react-is": "^16.7.0"
|
||||
}
|
||||
},
|
||||
"hyphenate-style-name": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz",
|
||||
"integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ=="
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"indefinite-observable": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz",
|
||||
"integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==",
|
||||
"requires": {
|
||||
"symbol-observable": "1.2.0"
|
||||
}
|
||||
},
|
||||
"is-in-browser": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
|
||||
"integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
|
||||
},
|
||||
"is-plain-object": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
|
||||
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
|
||||
"requires": {
|
||||
"isobject": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"is-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
|
||||
},
|
||||
"isobject": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
|
||||
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
|
||||
},
|
||||
"isomorphic-fetch": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
|
||||
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
|
||||
"requires": {
|
||||
"node-fetch": "^1.0.1",
|
||||
"whatwg-fetch": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
|
||||
},
|
||||
"jss": {
|
||||
"version": "9.8.7",
|
||||
"resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz",
|
||||
"integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==",
|
||||
"requires": {
|
||||
"is-in-browser": "^1.1.3",
|
||||
"symbol-observable": "^1.1.0",
|
||||
"warning": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"warning": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
|
||||
"requires": {
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"jss-camel-case": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz",
|
||||
"integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==",
|
||||
"requires": {
|
||||
"hyphenate-style-name": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"jss-default-unit": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz",
|
||||
"integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg=="
|
||||
},
|
||||
"jss-global": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz",
|
||||
"integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q=="
|
||||
},
|
||||
"jss-nested": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz",
|
||||
"integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==",
|
||||
"requires": {
|
||||
"warning": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"warning": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
|
||||
"requires": {
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"jss-plugin-camel-case": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-Bwrav1ZB0XywdJW6TaEuFhKe1ZpZvUlESh3jsFOvebA9aFTYNCkmHMEqjA5+u9VMxksl3u77nnZHtukpxkzrBA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"hyphenate-style-name": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"jss-plugin-default-unit": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-auuJUbQaWMxoHOVFPrfZNZpZm9ab8PZeDyvey8nMt2lbokkmZ53UyAnM/1kNsg5BdAXTItcLDxDB3I4gwNU84g==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"jss-plugin-global": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-OWeoW4szLDgRUKviST+xfilqa8O5uXJCW+O3YonheCRTRJg6rRzlE/b5pfYPoU9UtwvY9n7JvwBX5r3c1lMsEQ==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"jss-plugin-nested": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-wsRzuIZXAc6WMjc61mREW9cUrDxgSI7dK/fx5c7a06IDUfSn+83NJ30J/RB4oBnbQW9SijV/muujz7IJqpn9Gw==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"tiny-warning": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"jss-plugin-props-sort": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-KXOCaHUk1+KXqE0z3q66/w1fDoy+VsZvI77gLxOqTsTrvIKFLX0jarwXogW3CDlaPQQFTZ6JykJJXtPRTBlstA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"jss-plugin-rule-value-function": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-ett83hvIM69/LknmrWndrrdiDlfLfP+rneU5qP7gTOWJ7g1P9GuEL1Tc4CWdZUWBX+T58tgIBP0V1pzWCkP0QA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"jss-plugin-vendor-prefixer": {
|
||||
"version": "10.0.0-alpha.7",
|
||||
"resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0-alpha.7.tgz",
|
||||
"integrity": "sha512-YbIVgqq+dLimOBOEYggho1Iuc0roz4PJSZYyaok9n8JnXVIqPnxYJbr8+bMbvzJ5CL3eeJij/e7L2IPCceRKrA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"css-vendor": "^1.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"css-vendor": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-1.2.1.tgz",
|
||||
"integrity": "sha512-ZpwiWxn5jWNJ7NF3DAb/Dc/+c2lRu+fnovej/adCv3VJsULJSjdXEpUwRcq4fnpAAh98Hi7b0GDnlyoNFcdv1g==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.3.1",
|
||||
"is-in-browser": "^1.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"jss-props-sort": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz",
|
||||
"integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g=="
|
||||
},
|
||||
"jss-vendor-prefixer": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz",
|
||||
"integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==",
|
||||
"requires": {
|
||||
"css-vendor": "^0.3.8"
|
||||
}
|
||||
},
|
||||
"keycode": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
|
||||
"integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.11",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
|
||||
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
|
||||
"dev": true
|
||||
},
|
||||
"loose-envify": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
||||
"requires": {
|
||||
"js-tokens": "^3.0.0 || ^4.0.0"
|
||||
}
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "1.7.3",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
|
||||
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
|
||||
"requires": {
|
||||
"encoding": "^0.1.11",
|
||||
"is-stream": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"normalize-scroll-left": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz",
|
||||
"integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg=="
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
|
||||
},
|
||||
"popper.js": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz",
|
||||
"integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA=="
|
||||
},
|
||||
"promise": {
|
||||
"version": "7.3.1",
|
||||
"resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
|
||||
"integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
|
||||
"requires": {
|
||||
"asap": "~2.0.3"
|
||||
}
|
||||
},
|
||||
"prop-types": {
|
||||
"version": "15.7.2",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
|
||||
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.4.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"react-is": "^16.8.1"
|
||||
}
|
||||
},
|
||||
"react-event-listener": {
|
||||
"version": "0.6.6",
|
||||
"resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz",
|
||||
"integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.2.0",
|
||||
"prop-types": "^15.6.0",
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-is": {
|
||||
"version": "16.8.6",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
|
||||
"integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
|
||||
},
|
||||
"react-lifecycles-compat": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
||||
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
||||
},
|
||||
"react-transition-group": {
|
||||
"version": "2.9.0",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
|
||||
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
|
||||
"requires": {
|
||||
"dom-helpers": "^3.4.0",
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"react-lifecycles-compat": "^3.0.4"
|
||||
}
|
||||
},
|
||||
"recompose": {
|
||||
"version": "0.30.0",
|
||||
"resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
|
||||
"integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"change-emitter": "^0.1.2",
|
||||
"fbjs": "^0.8.1",
|
||||
"hoist-non-react-statics": "^2.3.1",
|
||||
"react-lifecycles-compat": "^3.0.2",
|
||||
"symbol-observable": "^1.0.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"hoist-non-react-statics": {
|
||||
"version": "2.5.5",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
|
||||
"integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
|
||||
"integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"setimmediate": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
|
||||
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
|
||||
},
|
||||
"symbol-observable": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
||||
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
|
||||
},
|
||||
"tiny-warning": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz",
|
||||
"integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q=="
|
||||
},
|
||||
"to-fast-properties": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
||||
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
|
||||
"dev": true
|
||||
},
|
||||
"ua-parser-js": {
|
||||
"version": "0.7.19",
|
||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz",
|
||||
"integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ=="
|
||||
},
|
||||
"warning": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
|
||||
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"whatwg-fetch": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
|
||||
"integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
{
|
||||
"name": "@freesewing/workbench",
|
||||
"version": "2.0.0-alpha.4",
|
||||
"description": "A React component to facilitate FreeSewing pattern design",
|
||||
"author": "Joost De Cock <joost@decock.org> (https://github.com/joostdecock)",
|
||||
"homepage": "https://freesewing.org/",
|
||||
"repository": "github:freesewing/freesewing",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/freesewing/freesewing/issues"
|
||||
},
|
||||
"keywords": [
|
||||
"freesewing",
|
||||
"react",
|
||||
"development"
|
||||
],
|
||||
"main": "dist/index.js",
|
||||
"module": "dist/index.mjs",
|
||||
"scripts": {
|
||||
"clean": "rimraf dist",
|
||||
"nodebuild": "BABEL_ENV=production rollup -c -o dist/index.js -f cjs",
|
||||
"modulebuild": "BABEL_ENV=production rollup -c -o dist/index.mjs -f es",
|
||||
"build": "npm run clean && npm run nodebuild && npm run modulebuild",
|
||||
"test": "cross-env CI=1 react-scripts test --env=jsdom",
|
||||
"pubtest": "npm publish --registry http://localhost:6662",
|
||||
"pubforce": "npm publish",
|
||||
"symlink": "mkdir -p ./node_modules/@freesewing && cd ./node_modules/@freesewing && ln -s -f ../../../* . && cd -",
|
||||
"test:watch": "react-scripts test --env=jsdom",
|
||||
"start": "rollup -c -w"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@freesewing/core": "^2.0.0-alpha.3",
|
||||
"@freesewing/i18n": "^2.0.0-alpha.3",
|
||||
"@freesewing/plugin-theme": "^2.0.0-alpha.3",
|
||||
"@freesewing/utils": "^2.0.0-alpha.3",
|
||||
"react-intl": "^2.8.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@freesewing/components": "^2.0.0-alpha.4",
|
||||
"@freesewing/css-theme": "^2.0.0-alpha.4",
|
||||
"@freesewing/mui-theme": "^2.0.0-alpha.4",
|
||||
"@freesewing/utils": "^2.0.0-alpha.4"
|
||||
},
|
||||
"files": [
|
||||
"dist/*",
|
||||
"README.md",
|
||||
"package.json"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"tag": "alpha"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0",
|
||||
"npm": ">=5"
|
||||
}
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
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 yaml from "rollup-plugin-yaml";
|
||||
import url from "rollup-plugin-url";
|
||||
import postcss from "rollup-plugin-postcss";
|
||||
import svgr from "@svgr/rollup";
|
||||
import peerDepsExternal from "rollup-plugin-peer-deps-external";
|
||||
import { name, version, description, author, license } from "./package.json";
|
||||
|
||||
export default {
|
||||
input: "src/index.js",
|
||||
output: [
|
||||
{
|
||||
file: "dist/index.js",
|
||||
format: "cjs",
|
||||
sourcemap: true
|
||||
},
|
||||
{
|
||||
file: "dist/index.mjs",
|
||||
format: "es",
|
||||
sourcemap: true
|
||||
}
|
||||
],
|
||||
plugins: [
|
||||
peerDepsExternal(),
|
||||
resolve({ modulesOnly: true }),
|
||||
url(),
|
||||
commonjs(),
|
||||
json(),
|
||||
yaml(),
|
||||
svgr(),
|
||||
postcss({
|
||||
modules: true
|
||||
}),
|
||||
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 */`
|
||||
})
|
||||
]
|
||||
};
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"env": {
|
||||
"jest": true
|
||||
}
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
import React, { useState } from "react";
|
||||
import PropTypes from "prop-types";
|
||||
import { IntlProvider } from "react-intl";
|
||||
import Button from "@material-ui/core/Button";
|
||||
import MuiThemeProvider from "@material-ui/core/styles/MuiThemeProvider";
|
||||
import { createMuiTheme } from "@material-ui/core/styles";
|
||||
import { i18n, strings } from "@freesewing/i18n";
|
||||
import { Navbar, withGist } from "@freesewing/components";
|
||||
import { defaultGist, storage } from "@freesewing/utils";
|
||||
import { dark, light } from "@freesewing/mui-theme";
|
||||
|
||||
import "./scss/style.scss";
|
||||
//import ButtonPicker from "./components/ButtonPicker";
|
||||
//import Settings from "./components/settings/";
|
||||
|
||||
require("typeface-roboto-condensed");
|
||||
require("@freesewing/css-theme");
|
||||
|
||||
//addLocaleData([...en, ...de, ...es, ...fr, ...nl]);
|
||||
|
||||
const Workbench = props => {
|
||||
const [language, setLanguage] = useState(props.language);
|
||||
const [pattern, setPattern] = useState(false);
|
||||
const [settings, setSettings] = useState(false);
|
||||
const [theme, setTheme] = useState("light");
|
||||
|
||||
const themes = { dark, light };
|
||||
|
||||
const loadLanguage = () => {
|
||||
let l = storage.get("language");
|
||||
if (Object.keys(i18n).indexOf(l) === -1) l = "en";
|
||||
setLanguage(l);
|
||||
return l;
|
||||
};
|
||||
|
||||
const updateLanguage = l => {
|
||||
setLanguage(l);
|
||||
storage.set("language", l);
|
||||
};
|
||||
|
||||
const loadPattern = () => {
|
||||
let p = storage.get("pattern");
|
||||
if (Object.keys(props.freesewing.patterns).indexOf(p) === -1)
|
||||
p = props.pattern;
|
||||
setPattern(p);
|
||||
return p;
|
||||
};
|
||||
|
||||
const updatePattern = p => {
|
||||
setPattern(p);
|
||||
store.set("pattern", p);
|
||||
};
|
||||
|
||||
const toggleSettings = () => setSettings(!settings);
|
||||
|
||||
const toggleDarkmode = () => {
|
||||
if (theme === "light") setTheme("dark");
|
||||
else setTheme("light");
|
||||
};
|
||||
|
||||
return (
|
||||
<IntlProvider locale={language} messages={strings[language]}>
|
||||
<MuiThemeProvider theme={createMuiTheme(themes[theme])}>
|
||||
<React.Fragment>
|
||||
<Navbar />
|
||||
<Button variant="contained" color="primary">
|
||||
test
|
||||
</Button>
|
||||
</React.Fragment>
|
||||
</MuiThemeProvider>
|
||||
</IntlProvider>
|
||||
);
|
||||
};
|
||||
|
||||
Workbench.propTypes = {
|
||||
freesewing: PropTypes.object,
|
||||
language: PropType.string
|
||||
};
|
||||
|
||||
Workbench.defaultProps = {
|
||||
language: "en"
|
||||
};
|
||||
|
||||
export default Workbench;
|
|
@ -1,71 +0,0 @@
|
|||
import React from "react";
|
||||
import Logo from "./Logo";
|
||||
import Emblem from "./Emblem";
|
||||
import { i18n } from "@freesewing/i18n";
|
||||
import { version } from "../../package.json";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "./scss/ButtonPicker.scss";
|
||||
|
||||
const ButtonPicker = props => (
|
||||
<section>
|
||||
<div className={css.box}>
|
||||
<Logo size={250} />
|
||||
{props.msgKey ? (
|
||||
<h1>
|
||||
<FormattedMessage id={props.msgKey} />
|
||||
</h1>
|
||||
) : (
|
||||
<div>
|
||||
<Emblem
|
||||
size={52}
|
||||
color1="#61dafb"
|
||||
color2="#ffffff"
|
||||
text1="Free"
|
||||
text2="Sewing"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<div className={css.buttons}>
|
||||
{props.keys.map(key => (
|
||||
<button
|
||||
key={key}
|
||||
className={css.picker}
|
||||
onClick={() => props.setChoice(key)}
|
||||
>
|
||||
<Emblem
|
||||
size={21}
|
||||
color1="#ffffff"
|
||||
text1={props.values[key]}
|
||||
text2=""
|
||||
/>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<footer className={css.picker}>
|
||||
Freesewing workbench v{version}
|
||||
<br />
|
||||
<a className={css.link} href="https://freesewing.org">
|
||||
<Emblem
|
||||
size={16}
|
||||
color1="#61dafb"
|
||||
color2="#ffffff"
|
||||
text1="freesewing"
|
||||
text2=".org"
|
||||
/>
|
||||
</a>
|
||||
|
|
||||
<a className={css.link} href="https://freesewing.dev">
|
||||
<Emblem
|
||||
size={16}
|
||||
color1="#61dafb"
|
||||
color2="#ffffff"
|
||||
text1="freesewing"
|
||||
text2=".dev"
|
||||
/>
|
||||
</a>
|
||||
</footer>
|
||||
</section>
|
||||
);
|
||||
|
||||
export default ButtonPicker;
|
|
@ -1,47 +0,0 @@
|
|||
import React from "react";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
const Emblem = props => {
|
||||
const font = {
|
||||
fontFamily: "'Roboto Condensed', sans-serif",
|
||||
fontSize: props.size,
|
||||
fontWeight: 900,
|
||||
}
|
||||
const styles = {
|
||||
free: {
|
||||
...font,
|
||||
color: props.color1,
|
||||
letterSpacing: props.size/-40+"px",
|
||||
},
|
||||
sewing: {
|
||||
...font,
|
||||
color: props.color2,
|
||||
letterSpacing: props.size/-20+"px",
|
||||
},
|
||||
}
|
||||
|
||||
return (
|
||||
<React.Fragment>
|
||||
<span style={styles.free}>{props.text1}</span>
|
||||
<span style={styles.sewing}>{props.text2}</span>
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
Emblem.propTypes = {
|
||||
size: PropTypes.number,
|
||||
color1: PropTypes.string,
|
||||
color2: PropTypes.string,
|
||||
text1: PropTypes.string,
|
||||
text2: PropTypes.string,
|
||||
};
|
||||
|
||||
Emblem.defaultProps = {
|
||||
size: 24,
|
||||
color1: "#111111",
|
||||
color2: "#111111",
|
||||
text1: "",
|
||||
text2: ""
|
||||
};
|
||||
|
||||
export default Emblem;
|
File diff suppressed because one or more lines are too long
|
@ -1,59 +0,0 @@
|
|||
import React from "react";
|
||||
import Logo from "./Logo";
|
||||
import Emblem from "./Emblem";
|
||||
import css from "./scss/NavBar.scss";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
|
||||
const NavBar = props => {
|
||||
const goToHelp = () =>
|
||||
(window.location.href =
|
||||
"https://freesewing.dev/" + props.locale + "/workbench");
|
||||
|
||||
return (
|
||||
<header className={css.navbar}>
|
||||
{props.empty ? (
|
||||
""
|
||||
) : (
|
||||
<React.Fragment>
|
||||
<div className={css.logo}>
|
||||
<Logo size={36} />
|
||||
</div>
|
||||
<a href="https://freesewing.org/" className={css.navbar}>
|
||||
<Emblem
|
||||
size={20}
|
||||
color1="#61dafb"
|
||||
color2="#ffffff"
|
||||
text1="Free"
|
||||
text2="Sewing"
|
||||
/>
|
||||
</a>
|
||||
<div className={css.right}>
|
||||
{props.pattern ? (
|
||||
<React.Fragment>
|
||||
<button className={css.navbar} onClick={props.toggleSettings}>
|
||||
<Emblem
|
||||
size={16}
|
||||
text1={<FormattedMessage id="app.settings" />}
|
||||
color1="#fff"
|
||||
/>
|
||||
</button>
|
||||
<button className={css.navbar} onClick={props.clearPattern}>
|
||||
<Emblem size={16} text1={props.pattern} color1="#fff" />
|
||||
</button>
|
||||
</React.Fragment>
|
||||
) : (
|
||||
""
|
||||
)}
|
||||
<button className={css.navbar} onClick={props.clearLanguage}>
|
||||
<Emblem size={16} text1={props.language} color1="#fff" />
|
||||
</button>
|
||||
<button className={css.navbar} onClick={goToHelp}>
|
||||
<Emblem size={16} text1="?" color1="#fff" />
|
||||
</button>
|
||||
</div>
|
||||
</React.Fragment>
|
||||
)}
|
||||
</header>
|
||||
);
|
||||
};
|
||||
export default NavBar;
|
|
@ -1,21 +0,0 @@
|
|||
import React from "react";
|
||||
import PropTypes from "prop-types";
|
||||
|
||||
const Pattern = props => {
|
||||
return (
|
||||
<React.Fragment>
|
||||
<span style={styles.free}>{props.text1}</span>
|
||||
<span style={styles.sewing}>{props.text2}</span>
|
||||
</React.Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
Pattern.propTypes = {
|
||||
pattern: PropTypes.string,
|
||||
freesewing: PropTypes.object
|
||||
};
|
||||
|
||||
Pattern.defaultProps = {
|
||||
};
|
||||
|
||||
export default Pattern;
|
|
@ -1,31 +0,0 @@
|
|||
.box {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
padding: 1rem 2rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
button.picker {
|
||||
padding: 0.5rem 1rem;
|
||||
margin: 0.5rem 1rem;
|
||||
border: 1px solid transparent;
|
||||
border-bottom: 4px solid #fff6;
|
||||
background: transparent;
|
||||
}
|
||||
button.picker:hover {
|
||||
border-bottom: 4px solid #61dafb;
|
||||
}
|
||||
footer.picker {
|
||||
position: fixed;
|
||||
bottom: 2rem;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
.link {
|
||||
padding: 0.5rem;
|
||||
font-weight: normal;
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
div.config {
|
||||
border: 1px solid #fffa;
|
||||
border-radius: 4px;
|
||||
padding: 1rem;
|
||||
margin: 0.5rem;
|
||||
}
|
||||
table.config {
|
||||
width: 300px;
|
||||
text-align: left;
|
||||
}
|
||||
table.config td {
|
||||
padding: 0.1rem 0.5rem;
|
||||
}
|
||||
td.option {
|
||||
padding-left: 1rem;
|
||||
}
|
||||
span.key,
|
||||
span.subkey {
|
||||
font-weight: bold;
|
||||
padding-right: 0.5rem;
|
||||
}
|
||||
span.true,
|
||||
span.false {
|
||||
font-family: 'Roboto Condensed', sans-serif;
|
||||
font-weight: bold;
|
||||
}
|
||||
span.true {
|
||||
color: #58fc58;
|
||||
}
|
||||
span.false {
|
||||
color: #f97070;
|
||||
}
|
||||
span.key {
|
||||
color: #61dafb;
|
||||
font-family: 'Roboto Condensed', sans-serif;
|
||||
}
|
||||
ul.config,
|
||||
ol.config {
|
||||
margin: 0.2rem 0;
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
.box {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
padding: 1rem 2rem;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
button.picker {
|
||||
padding: 0.5rem 1rem;
|
||||
margin: 0.5rem 1rem;
|
||||
border: 1px solid transparent;
|
||||
border-bottom: 4px solid #fff6;
|
||||
background: transparent;
|
||||
}
|
||||
button.picker:hover {
|
||||
border-bottom: 4px solid #61dafb;
|
||||
}
|
||||
footer.picker {
|
||||
position: fixed;
|
||||
bottom: 2rem;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
.link {
|
||||
padding: 0.5rem;
|
||||
font-weight: normal;
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
header.navbar {
|
||||
height: 64px;
|
||||
background: #222;
|
||||
color: #fff;
|
||||
padding: 0 2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
div.right {
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
}
|
||||
div.logo {
|
||||
line-height: 0
|
||||
}
|
||||
button.emblem {
|
||||
margin: 0;
|
||||
margin-left: 1rem;
|
||||
padding: 0 0.5rem;
|
||||
height: 64px;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
border-bottom: 4px solid transparent;
|
||||
transition: border 0.2s ease-out;
|
||||
}
|
||||
a.navbar,
|
||||
button.navbar {
|
||||
margin: 0;
|
||||
margin-left: 1rem;
|
||||
padding: 0 0.5rem;
|
||||
height: 64px;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
border-bottom: 4px solid transparent;
|
||||
transition: border 0.2s ease-out;
|
||||
}
|
||||
button.navbar:hover {
|
||||
border-bottom: 4px solid #61dafb;
|
||||
}
|
||||
a.navbar {
|
||||
line-height: 64px
|
||||
}
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
div.wrapper {
|
||||
padding: 1rem;
|
||||
display: flex;
|
||||
}
|
|
@ -1,107 +0,0 @@
|
|||
import React from "react";
|
||||
import Emblem from "../Emblem";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "../scss/Config.scss";
|
||||
|
||||
const Config = props => {
|
||||
console.log(props.pattern);
|
||||
const emblem = (t1, t2) => (
|
||||
<Emblem text1={t1} text2={t2} color1="#61dafb" color2="#fff" size={20} />
|
||||
);
|
||||
|
||||
const renderConfig = () => {
|
||||
let c = props.pattern.config;
|
||||
let rows = [];
|
||||
for (let key of ["name", "version"])
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
<span className={css.val}>{c[key]}</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
for (let key of ["measurements", "parts", "hide"]) {
|
||||
let list = [];
|
||||
if (typeof c[key] !== "undefined") {
|
||||
for (let item of c[key])
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.val}>{item}</span>
|
||||
</li>
|
||||
);
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
<ul className={css.config}>{list}</ul>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
for (let key of ["dependencies", "inject"]) {
|
||||
if (typeof c[key] !== "undefined") {
|
||||
let list = [];
|
||||
for (let item of Object.keys(c[key])) {
|
||||
let values = null;
|
||||
if (typeof c[key][item] === "string") {
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.subkey}>
|
||||
{item}
|
||||
{key === "inject" ? " «" : ":"}
|
||||
</span>
|
||||
<span className={css.val}>{c[key][item]}</span>
|
||||
</li>
|
||||
);
|
||||
} else if (c[key][item].length > 0) {
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.subkey}>{item}:</span>
|
||||
<span className={css.val}>
|
||||
{c[key][item].map(v => v + " ")}
|
||||
</span>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
}
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
<ul className={css.config}>{list}</ul>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<table className={css.config}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{emblem("config", ".js")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>{rows}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
return <div className={css.config}>{renderConfig()}</div>;
|
||||
};
|
||||
export default Config;
|
|
@ -1,27 +0,0 @@
|
|||
import React from "react";
|
||||
import Emblem from "../Emblem";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "../scss/Config.scss";
|
||||
|
||||
const Measurements = props => {
|
||||
const emblem = (t1, t2) => (
|
||||
<Emblem text1={t1} text2={t2} color1="#61dafb" color2="#fff" size={20} />
|
||||
);
|
||||
|
||||
return (
|
||||
<div className={css.config}>
|
||||
<table className={css.config}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<FormattedMessage id="app.measurements" />
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody />
|
||||
</table>
|
||||
<pre>{JSON.stringify(props, null, 2)}</pre>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
export default Measurements;
|
|
@ -1,158 +0,0 @@
|
|||
import React from "react";
|
||||
import Emblem from "../Emblem";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "../scss/Config.scss";
|
||||
|
||||
const Options = props => {
|
||||
const emblem = (t1, t2) => (
|
||||
<Emblem text1={t1} text2={t2} color1="#61dafb" color2="#fff" size={20} />
|
||||
);
|
||||
|
||||
const renderOptions = () => {
|
||||
let c = props.pattern.config;
|
||||
let rows = [];
|
||||
if (typeof c.options !== "undefined") {
|
||||
let list = [];
|
||||
for (let item of Object.keys(c.options).sort()) {
|
||||
let values = null;
|
||||
if (typeof c.options[item] === "boolean") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.true}>
|
||||
{c.options[item] ? "TRUE" : "FALSE"}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else if (typeof c.options[item] !== "object") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.val}>{c.options[item]}</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else {
|
||||
if (typeof c.options[item].pct !== "undefined") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.val}>
|
||||
{c.options[item].min}%{" / "}
|
||||
<b>{c.options[item].pct}%</b>
|
||||
{" / "}
|
||||
{c.options[item].max}%
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else if (typeof c.options[item].deg !== "undefined") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.val}>
|
||||
{c.options[item].min}
|
||||
°
|
||||
{" / "}
|
||||
<b>
|
||||
{c.options[item].deg}
|
||||
°
|
||||
</b>
|
||||
{" / "}
|
||||
{c.options[item].max}
|
||||
°
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else if (typeof c.options[item].mm !== "undefined") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.val}>
|
||||
{c.options[item].min}
|
||||
mm;
|
||||
{" / "}
|
||||
<b>
|
||||
{c.options[item].mm}
|
||||
mm
|
||||
</b>
|
||||
{" / "}
|
||||
{c.options[item].max}
|
||||
mm
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else if (typeof c.options[item].bool !== "undefined") {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
{c.options[item].bool ? (
|
||||
<React.Fragment>
|
||||
<span className={css.true}>TRUE</span>
|
||||
<span> / FALSE</span>
|
||||
</React.Fragment>
|
||||
) : (
|
||||
<React.Fragment>
|
||||
<span>TRUE / </span>
|
||||
<span className={css.false}>FALSE</span>
|
||||
</React.Fragment>
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else if (typeof c.options[item].list !== "undefined") {
|
||||
let list = [];
|
||||
for (let opt of c.options[item].list) {
|
||||
if (opt === c.options[item].dflt)
|
||||
list.push(
|
||||
<li>
|
||||
<b>{opt}</b> «
|
||||
</li>
|
||||
);
|
||||
else list.push(<li>{opt}</li>);
|
||||
}
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<ul className={css.config}>{list}</ul>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else {
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{item}:</span>
|
||||
<span className={css.val}>FIXME</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else return null;
|
||||
return (
|
||||
<table className={css.config}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{emblem(c.name + ".config", ".options")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>{rows}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
return <div className={css.config}>{renderOptions()}</div>;
|
||||
};
|
||||
export default Options;
|
|
@ -1,95 +0,0 @@
|
|||
import React from "react";
|
||||
import Emblem from "../Emblem";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "../scss/Config.scss";
|
||||
|
||||
const ResolvedConfig = props => {
|
||||
const emblem = (t1, t2) => (
|
||||
<Emblem text1={t1} text2={t2} color1="#61dafb" color2="#fff" size={20} />
|
||||
);
|
||||
|
||||
const renderResolvedConfig = () => {
|
||||
let c = props.pattern.config;
|
||||
let rows = [];
|
||||
let list = [];
|
||||
if (typeof c.draftOrder !== "undefined") {
|
||||
for (let item of c.draftOrder)
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.val}>{item}</span>
|
||||
</li>
|
||||
);
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>draftOrder:</span>
|
||||
<ol className={css.config}>{list}</ol>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>draftOrder:</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
for (let key of ["resolvedDependencies"]) {
|
||||
if (typeof c[key] !== "undefined") {
|
||||
let list = [];
|
||||
for (let item of Object.keys(c[key])) {
|
||||
let values = null;
|
||||
if (typeof c[key][item] === "string") {
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.subkey}>
|
||||
{item}
|
||||
{key === "inject" ? " «" : ":"}
|
||||
</span>
|
||||
<span className={css.val}>{c[key][item]}</span>
|
||||
</li>
|
||||
);
|
||||
} else if (c[key][item].length > 0) {
|
||||
list.push(
|
||||
<li>
|
||||
<span className={css.subkey}>{item}:</span>
|
||||
<span className={css.val}>
|
||||
{c[key][item].map(v => v + " ")}
|
||||
</span>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
}
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
<ul className={css.config}>{list}</ul>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
} else
|
||||
rows.push(
|
||||
<tr>
|
||||
<td>
|
||||
<span className={css.key}>{key}:</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<table className={css.config}>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{emblem(c.name, ".config")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>{rows}</tbody>
|
||||
</table>
|
||||
);
|
||||
};
|
||||
|
||||
return <div className={css.config}>{renderResolvedConfig()}</div>;
|
||||
};
|
||||
export default ResolvedConfig;
|
|
@ -1,35 +0,0 @@
|
|||
import React from "react";
|
||||
import Emblem from "../Emblem";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import css from "../scss/Settings.scss";
|
||||
import Config from "./Config";
|
||||
import ResolvedConfig from "./ResolvedConfig";
|
||||
import Options from "./Options";
|
||||
import Measurements from "./Measurements";
|
||||
import Complete from "./options/draft-complete";
|
||||
|
||||
const Settings = props => {
|
||||
let pattern = new props.freesewing.patterns[props.pattern]();
|
||||
return (
|
||||
<section>
|
||||
<div className={css.wrapper}>
|
||||
<Options pattern={pattern} />
|
||||
<Measurements pattern={pattern} />
|
||||
<div>
|
||||
<Complete
|
||||
pattern={props.pattern}
|
||||
gist={{
|
||||
complete: false
|
||||
}}
|
||||
updateGist={props.updateGist}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
//<Config pattern={pattern} />
|
||||
//<ResolvedConfig pattern={pattern} />
|
||||
|
||||
export default Settings;
|
|
@ -1,44 +0,0 @@
|
|||
import React from "react";
|
||||
import { FormattedMessage } from "react-intl";
|
||||
import { strings } from "@freesewing/i18n";
|
||||
|
||||
const Complete = props => {
|
||||
let complete, incomplete;
|
||||
if (props.gist.complete) complete = "checked";
|
||||
else incomplete = "checked";
|
||||
return (
|
||||
<div className="option draft">
|
||||
<header>
|
||||
<h5 className="do-title"><FormattedMessage id="settings.complete.title" /></h5>
|
||||
<p className="do-description"><FormattedMessage id="settings.complete.description" /></p>
|
||||
</header>
|
||||
<ul className="radio">
|
||||
<li>
|
||||
<label>
|
||||
<input
|
||||
type="radio"
|
||||
name="complete"
|
||||
value={1}
|
||||
onChange={evt => props.updateGist("complete", true)}
|
||||
checked={props.gist.complete}
|
||||
/>
|
||||
<FormattedMessage id="app.yes" />
|
||||
</label>
|
||||
</li>
|
||||
<li>
|
||||
<label>
|
||||
<input
|
||||
type="radio"
|
||||
name="complete"
|
||||
value={0}
|
||||
onChange={evt => props.updateGist("complete", false)}
|
||||
checked={props.gist.complete}
|
||||
/>
|
||||
<FormattedMessage id="app.no" />
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default Complete;
|
|
@ -1,33 +0,0 @@
|
|||
import React, { useState } from "react";
|
||||
import PropTypes from "prop-types";
|
||||
import { withGist } from "@freesewing/components";
|
||||
|
||||
const Workbench = props => {
|
||||
const [gist, setGist] = useState(props.gist.get);
|
||||
const [expanded, setExpanded] = useState([]);
|
||||
|
||||
const toggleGroup = group => {
|
||||
let shown = expanded.slice(0);
|
||||
let index = shown.indexOf(group);
|
||||
if (index === -1) shown.push(group);
|
||||
else shown.splice(index, 1);
|
||||
setExpanded(shown);
|
||||
};
|
||||
|
||||
return (
|
||||
<ul className="nav l1">
|
||||
<li>
|
||||
<h2>hi</h2>
|
||||
</li>
|
||||
</ul>
|
||||
);
|
||||
};
|
||||
|
||||
Workbench.propTypes = {
|
||||
pattern: PropTypes.oneOf(patternList),
|
||||
units: PropTypes.oneOf(["metric", "imperial"]).isRequired
|
||||
};
|
||||
|
||||
Workbench.defaultProps = {};
|
||||
|
||||
export default withGist(Workbench, { gist: {}, store: "yes" });
|
|
@ -1,32 +0,0 @@
|
|||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: #fff;
|
||||
font-feature-settings: "kern", "liga", "clig", "calt";
|
||||
word-wrap: break-word;
|
||||
font-kerning: normal;
|
||||
font-family: -apple-system,system-ui,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #61dafb;
|
||||
transition: color 0.2s ease-out;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
color: #f58fff;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
section {
|
||||
width: 100%;
|
||||
min-height: calc(100vh - 64px);
|
||||
display: flex;
|
||||
background: #222;
|
||||
color: #fff;
|
||||
}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
import ExampleComponent from './'
|
||||
|
||||
describe('ExampleComponent', () => {
|
||||
it('is truthy', () => {
|
||||
expect(ExampleComponent).toBeTruthy()
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue