Merge branch 'develop'
2
.gitignore
vendored
@ -50,3 +50,5 @@ Thumbs.db
|
|||||||
|
|
||||||
**/build/**/*
|
**/build/**/*
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
|
*/test/playground/dist
|
12
README.md
@ -1,8 +1,12 @@
|
|||||||
# wisemapping-frontend
|
# WiseMapping Frond End
|
||||||
|
|
||||||
This is a WIP migration from [legacy wisemapping](https://bitbucket.org/wisemapping/wisemapping-open-source/) into a modern web development project with multiple improvements.
|
WiseMapping Frond End is part of the [MindMap Open Source Project](http://www.wisemapping.org). The first release of WiseMapping was in 2010 and there was not mayor update on the architecture. In 2021, a major change started with the goal to provide a visual and technology refresh of the project.
|
||||||
|
|
||||||
This monorepo uses lerna and contains all the packages that compose the wisemapping frontend.
|
WiseMapping Front extracts all the UI related aspects in this repository. You will find three major modules:
|
||||||
|
|
||||||
|
* Web2D: Lighway abstraction over SVG for chart renderding.
|
||||||
|
* Mindplot: Pure vanilla ES6 classes responsible for providing mindmap rendering and edition capabilities.
|
||||||
|
* Webapp: REACT application that encompass the whole midnmap adminitraction experience.
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
@ -18,7 +22,7 @@ Please refer to each package's Readme.md for anything specific to the package.
|
|||||||
|
|
||||||
If you want to contribute, please check out [CONTRIBUTING.md](./CONTRIBUTING.md).
|
If you want to contribute, please check out [CONTRIBUTING.md](./CONTRIBUTING.md).
|
||||||
|
|
||||||
## Scripts
|
## Useful scripts
|
||||||
|
|
||||||
Each package might provide the following scripts.
|
Each package might provide the following scripts.
|
||||||
You can run these for all packages by running it from the root folder. Alternatively you can run it for a specific package by passing the `--scope` option.
|
You can run these for all packages by running it from the root folder. Alternatively you can run it for a specific package by passing the `--scope` option.
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
image: cypress/included:8.4.1
|
image: cypress/included:8.4.1
|
||||||
|
|
||||||
pipelines:
|
pipelines:
|
||||||
default:
|
branches:
|
||||||
- parallel:
|
'{master,develop}':
|
||||||
- step:
|
- step:
|
||||||
name: Build and test
|
name: Build and test
|
||||||
caches:
|
caches:
|
||||||
|
1
dist/app.bundle.js
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/webapp/dist/app.bundle.js
|
1
dist/app.bundle.js.map
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/webapp/dist/app.bundle.js.map
|
1
dist/loader.js
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/mindplot/dist/loader.js
|
1
dist/loader.js.map
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/mindplot/dist/loader.js.map
|
1
dist/vendors.bundle.js
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/webapp/dist/vendors.bundle.js
|
1
dist/vendors.bundle.js.map
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../packages/webapp/dist/vendors.bundle.js.map
|
@ -3,7 +3,7 @@ services:
|
|||||||
e2e:
|
e2e:
|
||||||
image: cypress/included:8.4.1
|
image: cypress/included:8.4.1
|
||||||
container_name: wisemapping-integration-tests
|
container_name: wisemapping-integration-tests
|
||||||
entrypoint: '/bin/sh -c "yarn install && yarn bootstrap && yarn test:integration"'
|
entrypoint: '/bin/sh -c "yarn install && yarn bootstrap && yarn build && yarn test:integration"'
|
||||||
working_dir: /e2e
|
working_dir: /e2e
|
||||||
environment:
|
environment:
|
||||||
- CYPRESS_imageSnaphots=true
|
- CYPRESS_imageSnaphots=true
|
||||||
@ -16,7 +16,6 @@ services:
|
|||||||
- node-modules-mindplot:/e2e/packages/mindplot/node_modules
|
- node-modules-mindplot:/e2e/packages/mindplot/node_modules
|
||||||
- node-modules-web2d:/e2e/packages/web2d/node_modules
|
- node-modules-web2d:/e2e/packages/web2d/node_modules
|
||||||
- node-modules-webapp:/e2e/packages/webapp/node_modules
|
- node-modules-webapp:/e2e/packages/webapp/node_modules
|
||||||
- node-modules-webcomponent:/e2e/packages/webcomponent/node_modules
|
|
||||||
- cypress-binary-cache:/root/.cache/Cypress
|
- cypress-binary-cache:/root/.cache/Cypress
|
||||||
volumes:
|
volumes:
|
||||||
node-modules: {}
|
node-modules: {}
|
||||||
@ -25,5 +24,4 @@ volumes:
|
|||||||
node-modules-mindplot: {}
|
node-modules-mindplot: {}
|
||||||
node-modules-web2d: {}
|
node-modules-web2d: {}
|
||||||
node-modules-webapp: {}
|
node-modules-webapp: {}
|
||||||
node-modules-webcomponent: {}
|
|
||||||
cypress-binary-cache: {}
|
cypress-binary-cache: {}
|
||||||
|
@ -3,7 +3,7 @@ services:
|
|||||||
e2e:
|
e2e:
|
||||||
image: cypress/included:8.4.1
|
image: cypress/included:8.4.1
|
||||||
container_name: wisemapping-integration-tests
|
container_name: wisemapping-integration-tests
|
||||||
entrypoint: '/bin/sh -c "yarn install && yarn bootstrap && yarn test:integration"'
|
entrypoint: '/bin/sh -c "yarn bootstrap && yarn build && yarn test:integration"'
|
||||||
working_dir: /e2e
|
working_dir: /e2e
|
||||||
environment:
|
environment:
|
||||||
- CYPRESS_imageSnaphots=true
|
- CYPRESS_imageSnaphots=true
|
||||||
@ -15,7 +15,6 @@ services:
|
|||||||
- node-modules-mindplot:/e2e/packages/mindplot/node_modules
|
- node-modules-mindplot:/e2e/packages/mindplot/node_modules
|
||||||
- node-modules-web2d:/e2e/packages/web2d/node_modules
|
- node-modules-web2d:/e2e/packages/web2d/node_modules
|
||||||
- node-modules-webapp:/e2e/packages/webapp/node_modules
|
- node-modules-webapp:/e2e/packages/webapp/node_modules
|
||||||
- node-modules-webcomponent:/e2e/packages/webcomponent/node_modules
|
|
||||||
- cypress-binary-cache:/root/.cache/Cypress
|
- cypress-binary-cache:/root/.cache/Cypress
|
||||||
volumes:
|
volumes:
|
||||||
node-modules: {}
|
node-modules: {}
|
||||||
@ -24,5 +23,4 @@ volumes:
|
|||||||
node-modules-mindplot: {}
|
node-modules-mindplot: {}
|
||||||
node-modules-web2d: {}
|
node-modules-web2d: {}
|
||||||
node-modules-webapp: {}
|
node-modules-webapp: {}
|
||||||
node-modules-webcomponent: {}
|
|
||||||
cypress-binary-cache: {}
|
cypress-binary-cache: {}
|
||||||
|
87
lang/en.json
@ -1,87 +0,0 @@
|
|||||||
{
|
|
||||||
"footer.aboutus": {
|
|
||||||
"defaultMessage": "About Us"
|
|
||||||
},
|
|
||||||
"footer.contactus": {
|
|
||||||
"defaultMessage": "Contact Us"
|
|
||||||
},
|
|
||||||
"footer.donations": {
|
|
||||||
"defaultMessage": "PayPal Donations"
|
|
||||||
},
|
|
||||||
"footer.faq": {
|
|
||||||
"defaultMessage": "F.A.Q."
|
|
||||||
},
|
|
||||||
"footer.feedback": {
|
|
||||||
"defaultMessage": "Feedback"
|
|
||||||
},
|
|
||||||
"footer.opensource": {
|
|
||||||
"defaultMessage": "Open Source"
|
|
||||||
},
|
|
||||||
"footer.termsandconditions": {
|
|
||||||
"defaultMessage": "Term And Conditions"
|
|
||||||
},
|
|
||||||
"header.donthaveaccount": {
|
|
||||||
"defaultMessage": "Don't have an account ?"
|
|
||||||
},
|
|
||||||
"header.haveaccount": {
|
|
||||||
"defaultMessage": "Already have an account?"
|
|
||||||
},
|
|
||||||
"login.email": {
|
|
||||||
"defaultMessage": "Email"
|
|
||||||
},
|
|
||||||
"login.error": {
|
|
||||||
"defaultMessage": "The login.email address or login.password you entered is not valid."
|
|
||||||
},
|
|
||||||
"login.forgotpwd": {
|
|
||||||
"defaultMessage": "Forgot Password ?"
|
|
||||||
},
|
|
||||||
"login.hsqldbcofig": {
|
|
||||||
"defaultMessage": "Although HSQLDB is bundled with WiseMapping by default during the installation, we do not recommend this database for production use. Please consider using MySQL 5.7 instead. You can find more information how to configure MySQL",
|
|
||||||
"description": "Missing production database configured"
|
|
||||||
},
|
|
||||||
"login.loginto": {
|
|
||||||
"defaultMessage": "Log Into Your Account"
|
|
||||||
},
|
|
||||||
"login.password": {
|
|
||||||
"defaultMessage": "Password"
|
|
||||||
},
|
|
||||||
"login.remberme": {
|
|
||||||
"defaultMessage": "Remember me"
|
|
||||||
},
|
|
||||||
"login.signin": {
|
|
||||||
"defaultMessage": "Sign In"
|
|
||||||
},
|
|
||||||
"login.signup": {
|
|
||||||
"defaultMessage": "Sign Up"
|
|
||||||
},
|
|
||||||
"login.userinactive": {
|
|
||||||
"defaultMessage": "Sorry, your account has not been activated yet. You'll receive a notification login.email when it becomes active. Stay tuned!."
|
|
||||||
},
|
|
||||||
"login.welcome": {
|
|
||||||
"defaultMessage": "Welcome"
|
|
||||||
},
|
|
||||||
"registration.become": {
|
|
||||||
"defaultMessage": "Become a member of our comunity"
|
|
||||||
},
|
|
||||||
"registration.email": {
|
|
||||||
"defaultMessage": "Email"
|
|
||||||
},
|
|
||||||
"registration.firstname": {
|
|
||||||
"defaultMessage": "First Name"
|
|
||||||
},
|
|
||||||
"registration.lastname": {
|
|
||||||
"defaultMessage": "Last Name"
|
|
||||||
},
|
|
||||||
"registration.password": {
|
|
||||||
"defaultMessage": "Password"
|
|
||||||
},
|
|
||||||
"registration.register": {
|
|
||||||
"defaultMessage": "Register"
|
|
||||||
},
|
|
||||||
"registration.signup": {
|
|
||||||
"defaultMessage": "Signing up is free and just take a moment"
|
|
||||||
},
|
|
||||||
"registration.termandconditions": {
|
|
||||||
"defaultMessage": "Terms of Service: Please check the WiseMapping Account information you've entered above, and review the Terms of Service here. By clicking on 'Register' below you are agreeing to the Terms of Service above and the Privacy Policy"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "wisemapping-font-end",
|
"name": "wisemapping-front-end",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"bootstrap": "lerna bootstrap",
|
"bootstrap": "lerna bootstrap",
|
||||||
"build": "lerna run build",
|
"build": "lerna run build",
|
||||||
@ -44,5 +44,6 @@
|
|||||||
},
|
},
|
||||||
"homepage": "http://localhost:8080/react",
|
"homepage": "http://localhost:8080/react",
|
||||||
"license": "https://wisemapping.atlassian.net/wiki/spaces/WS/pages/524357/WiseMapping+Public+License+Version+1.0+WPL",
|
"license": "https://wisemapping.atlassian.net/wiki/spaces/WS/pages/524357/WiseMapping+Public+License+Version+1.0+WPL",
|
||||||
"version": "0.4.0"
|
"version": "0.4.0",
|
||||||
|
"dependencies": {}
|
||||||
}
|
}
|
||||||
|
@ -16,21 +16,6 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const innerXML = function (node) {
|
|
||||||
// summary:
|
|
||||||
// Implementation of MS's innerXML function.
|
|
||||||
if ($defined(node.innerXML)) {
|
|
||||||
return node.innerXML;
|
|
||||||
// string
|
|
||||||
} else if ($defined(node.xml)) {
|
|
||||||
return node.xml;
|
|
||||||
// string
|
|
||||||
} else if ($defined(XMLSerializer)) {
|
|
||||||
return new XMLSerializer().serializeToString(node);
|
|
||||||
// string
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cross-browser implementation of creating an XML document object.
|
* Cross-browser implementation of creating an XML document object.
|
||||||
*/
|
*/
|
||||||
@ -61,7 +46,7 @@ export const createDocument = function () {
|
|||||||
obj - object to inspect
|
obj - object to inspect
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const $defined = function (obj) {
|
export const $defined = function (obj) {
|
||||||
return obj != undefined;
|
return obj != undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,5 +28,8 @@ module.exports = {
|
|||||||
resolve: {
|
resolve: {
|
||||||
extensions: ['.js'],
|
extensions: ['.js'],
|
||||||
},
|
},
|
||||||
plugins: [new CleanWebpackPlugin()],
|
plugins: [new CleanWebpackPlugin({
|
||||||
|
dangerouslyAllowCleanPatternsOutsideProject: true,
|
||||||
|
dry: false,
|
||||||
|
})],
|
||||||
};
|
};
|
||||||
|
6
packages/editor/.babelrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
"@babel/preset-env",
|
||||||
|
"@babel/preset-react"
|
||||||
|
]
|
||||||
|
}
|
4
packages/editor/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
cypress/screenshots
|
||||||
|
cypress/videos
|
||||||
|
cypress/downloads
|
||||||
|
cypress/snapshots/*/__diff_output__
|
28
packages/editor/README.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Editor
|
||||||
|
|
||||||
|
React Component for the wisemapping editor.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
This is a work in progress and for now mindplot needs to be instantiated using the initCallback prop. Check `test/playground/map-render` for some usage examples.
|
||||||
|
|
||||||
|
import Editor from `@wisemapping/editor`;
|
||||||
|
|
||||||
|
ReactDOM.render(
|
||||||
|
<Editor
|
||||||
|
mapId={1}
|
||||||
|
memoryPersistence={false}
|
||||||
|
readOnlyMode={false}
|
||||||
|
locale="en"
|
||||||
|
onAction={(action) => console.log('action called:', action)}
|
||||||
|
initCallback={initialization}
|
||||||
|
/>,
|
||||||
|
document.getElementById('root'),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
## i18n
|
||||||
|
|
||||||
|
Messages are translated in the `lang` folder, and then compiled to `src/compiled-lang` using the following command:
|
||||||
|
|
||||||
|
yarn compile lang/de.json --ast --out-file src/compiled-lang/de.json
|
6
packages/editor/cypress.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"video": false,
|
||||||
|
"videoUploadOnPasses": false,
|
||||||
|
"baseUrl": "http://localhost:8081"
|
||||||
|
}
|
||||||
|
|
5
packages/editor/cypress/fixtures/example.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "Using fixtures to represent data",
|
||||||
|
"email": "hello@cypress.io",
|
||||||
|
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||||
|
}
|
22
packages/editor/cypress/integration/playground.test.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
context('Playground', () => {
|
||||||
|
it('viewmode page should match its snapshot', () => {
|
||||||
|
['welcome', 'sample1', 'sample2', 'sample3', 'sample4', 'sample5', 'sample6', 'complex', 'img-support', 'icon-sample'].forEach((mapId) => {
|
||||||
|
cy.visit(`/viewmode.html?id=${mapId}`);
|
||||||
|
cy.get('#mindplot.ready').should('exist');
|
||||||
|
cy.matchImageSnapshot(`viewmode-${mapId}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('the playground container.html page should match its snapshot', () => {
|
||||||
|
cy.visit('/container.html');
|
||||||
|
cy.getIframeBody()
|
||||||
|
.find('#mindplot.ready')
|
||||||
|
.should('exist');
|
||||||
|
cy.matchImageSnapshot('container');
|
||||||
|
});
|
||||||
|
it('the playground editor.html page should match its snapshot', () => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
cy.get('#mindplot.ready').should('exist');
|
||||||
|
// TODO: why is the editor appearing twice in the snapshot?
|
||||||
|
cy.matchImageSnapshot('editor');
|
||||||
|
});
|
||||||
|
});
|
16
packages/editor/cypress/integration/relationship.test.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
context('Relationship Topics', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
cy.reload();
|
||||||
|
cy.get('[test-id="30-11-relationship"]').click({ force: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change shape relationship', () => {
|
||||||
|
cy.get('[test-id="control-56"]').trigger('mousedown', { force: true });
|
||||||
|
cy.get('body').trigger('mousemove', { clientX: 500, clientY: 200 });
|
||||||
|
cy.get('body').trigger('mouseup');
|
||||||
|
cy.matchImageSnapshot('changeShapeRealtionship');
|
||||||
|
|
||||||
|
cy.get('[test-id="control-56"]').invoke('attr', 'cy').should('eq', '-131.75');
|
||||||
|
});
|
||||||
|
});
|
67
packages/editor/cypress/integration/topicFontChange.test.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
context('Edit Topic', () => {
|
||||||
|
// TODO: review why click({force: true}) is needed in these tests
|
||||||
|
// also, why is the element outside the viewport in screenshots?
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
cy.reload();
|
||||||
|
cy.get('[test-id=1]').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change Main Topic Text', () => {
|
||||||
|
cy.get('body').type('New Title Main Topic{enter}');
|
||||||
|
cy.get('[test-id=1] > text > tspan').should('have.text', 'New Title Main Topic');
|
||||||
|
cy.matchImageSnapshot('changeMainTopicText');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change Font Size', () => {
|
||||||
|
cy.get('#fontSizeTip').click();
|
||||||
|
cy.get('.popover #small').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-size').should('eq', '8.0625');
|
||||||
|
cy.matchImageSnapshot('changeFontSizeSmall');
|
||||||
|
|
||||||
|
cy.get('#fontSizeTip').click();
|
||||||
|
cy.get('.popover #normal').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-size').should('eq', '10.75');
|
||||||
|
cy.matchImageSnapshot('changeFontSizeNormal');
|
||||||
|
|
||||||
|
cy.get('#fontSizeTip').click();
|
||||||
|
cy.get('.popover #large').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-size').should('eq', '13.4375');
|
||||||
|
cy.matchImageSnapshot('changeFontSizeLarge');
|
||||||
|
|
||||||
|
cy.get('#fontSizeTip').click();
|
||||||
|
cy.get('.popover #huge').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-size').should('eq', '20.15625');
|
||||||
|
cy.matchImageSnapshot('changeFontSizeHuge');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change Font type', () => {
|
||||||
|
cy.get('#fontFamilyTip').click();
|
||||||
|
cy.get('[model="Times"]').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-family').should('eq', 'Times');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeFontType');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change Font Italic', () => {
|
||||||
|
cy.get('#fontItalicTip').click();
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'font-style').should('eq', 'italic');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeFontItalic');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Change Font color', () => {
|
||||||
|
cy.get('#fontColorTip').click();
|
||||||
|
cy.get('[title="RGB (153, 0, 255)"]').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=1] > text').invoke('attr', 'fill').should('eq', 'rgb(153, 0, 255)');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeFontColor');
|
||||||
|
});
|
||||||
|
});
|
49
packages/editor/cypress/integration/topicManager.test.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
context('Node manager', () => {
|
||||||
|
before(() => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('shortcut add sibling node', () => {
|
||||||
|
cy.contains('Mind Mapping').click();
|
||||||
|
cy.get('body').type('{enter}').type('Mind Mapping rocks!!').type('{enter}');
|
||||||
|
|
||||||
|
cy.get('[test-id=36] > text > tspan').should('exist');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('editor-shortcut-edit');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('shortcut add child node', () => {
|
||||||
|
cy.contains('Mind Mapping rocks!!').click();
|
||||||
|
cy.get('body').type('{insert}').type('Child 1 mind Mapping rocks!!').type('{enter}');
|
||||||
|
cy.get('body').type('{enter}').type('Child 2 mind Mapping rocks!!').type('{enter}');
|
||||||
|
|
||||||
|
cy.get('[test-id=36] > text > tspan').should('exist');
|
||||||
|
cy.get('[test-id=37] > text > tspan').should('exist');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('addChildNodeSortcut');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Delete topic', () => {
|
||||||
|
cy.get('[test-id=37]').click();
|
||||||
|
cy.get('body').type('{del}');
|
||||||
|
|
||||||
|
cy.get('[test-id=37]').should('not.exist');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('deleteTopicShortcut');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('undo changes', () => {
|
||||||
|
cy.get('#undoEditionTip').click();
|
||||||
|
|
||||||
|
cy.get('[test-id=36] > text > tspan').should('exist');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('undoChange');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Save changes', () => {
|
||||||
|
cy.contains('Mind Mapping rocks!!').click();
|
||||||
|
cy.get('body').type('{ctrl}s');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('saveChagesShortcut');
|
||||||
|
});
|
||||||
|
});
|
35
packages/editor/cypress/integration/topicPosition.test.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
context('Change topic position', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
cy.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Move up node "Mind Mapping"', () => {
|
||||||
|
const position = { clientX: 270, clientY: 160 };
|
||||||
|
cy.contains('Mind Mapping').trigger('mousedown');
|
||||||
|
cy.get('body').trigger('mousemove', position);
|
||||||
|
cy.get('body').trigger('mouseup');
|
||||||
|
cy.matchImageSnapshot('moveupNode');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Move down node "Mind Mapping"', () => {
|
||||||
|
cy.contains('Mind Mapping').trigger('mousedown');
|
||||||
|
cy.get('body').trigger('mousemove', { clientX: 350, clientY: 380 });
|
||||||
|
cy.get('body').trigger('mouseup');
|
||||||
|
cy.matchImageSnapshot('movedownNode');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Move default position node "Mind Mapping"', () => {
|
||||||
|
cy.contains('Mind Mapping').trigger('mousedown');
|
||||||
|
cy.get('body').trigger('mousemove', { clientX: 270, clientY: 240 });
|
||||||
|
cy.get('body').trigger('mouseup');
|
||||||
|
cy.matchImageSnapshot('moveDefaultPosition');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Move left node "Mind Mapping"', () => {
|
||||||
|
cy.contains('Mind Mapping').trigger('mousedown');
|
||||||
|
cy.get('body').trigger('mousemove', { clientX: 700, clientY: 240 });
|
||||||
|
cy.get('body').trigger('mouseup');
|
||||||
|
cy.matchImageSnapshot('moveleftNode');
|
||||||
|
});
|
||||||
|
});
|
44
packages/editor/cypress/integration/topicShape.test.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
context('Change Topic shape', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.visit('/editor.html');
|
||||||
|
cy.reload();
|
||||||
|
cy.contains('Try it Now!').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change to square shape', () => {
|
||||||
|
cy.get('#topicShapeTip').click();
|
||||||
|
cy.get('#rectagle').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=11] > rect').eq(1).invoke('attr', 'rx').should('eq', '0');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeToSquareShape');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change to rounded rectagle', () => {
|
||||||
|
cy.get('#topicShapeTip').click();
|
||||||
|
// TODO: The parameter {force: true} was placed because it does not detect that the element is visible
|
||||||
|
cy.get('#rounded_rectagle').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=11] > rect').eq(1).invoke('attr', 'rx').should('eq', '4.05');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeToRoundedRectagle');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change to line', () => {
|
||||||
|
cy.get('#topicShapeTip').click();
|
||||||
|
// TODO: The parameter {force: true} was placed because it does not detect that the element is visible
|
||||||
|
cy.get('#line').click({ force: true });
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeToLine');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change to elipse shape', () => {
|
||||||
|
cy.get('#topicShapeTip').click();
|
||||||
|
// TODO: The parameter {force: true} was placed because it does not detect that the element is visible
|
||||||
|
cy.get('#elipse').click({ force: true });
|
||||||
|
|
||||||
|
cy.get('[test-id=11] > rect').eq(1).invoke('attr', 'rx').should('eq', '12.15');
|
||||||
|
|
||||||
|
cy.matchImageSnapshot('changeToElipseShape');
|
||||||
|
});
|
||||||
|
});
|
24
packages/editor/cypress/plugins/index.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/// <reference types="cypress" />
|
||||||
|
// ***********************************************************
|
||||||
|
// This example plugins/index.js can be used to load plugins
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off loading
|
||||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/plugins-guide
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||||
|
// the project's config changing)
|
||||||
|
|
||||||
|
const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Cypress.PluginConfig}
|
||||||
|
*/
|
||||||
|
module.exports = (on, config) => {
|
||||||
|
// `on` is used to hook into various events Cypress emits
|
||||||
|
// `config` is the resolved Cypress config
|
||||||
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
|
};
|
After Width: | Height: | Size: 205 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 187 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 117 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 105 KiB |
24
packages/editor/cypress/support/commands.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command';
|
||||||
|
|
||||||
|
// make matchImageSnapshot() call the real implementation only if CYPRESS_imageSnaphots is set
|
||||||
|
// otherwise it calls a noop
|
||||||
|
if (Cypress.env('imageSnaphots')) {
|
||||||
|
addMatchImageSnapshotCommand({
|
||||||
|
failureThreshold: 0.001,
|
||||||
|
failureThresholdType: 'percent',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Cypress.Commands.add(
|
||||||
|
'matchImageSnapshot',
|
||||||
|
{
|
||||||
|
prevSubject: ['optional', 'element', 'window', 'document'],
|
||||||
|
},
|
||||||
|
() => Promise.resolve(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://www.cypress.io/blog/2020/02/12/working-with-iframes-in-cypress/
|
||||||
|
Cypress.Commands.add('getIframeBody', () => cy
|
||||||
|
.get('iframe')
|
||||||
|
.its('0.contentDocument.body').should('not.be.empty')
|
||||||
|
.then(cy.wrap));
|
20
packages/editor/cypress/support/index.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// ***********************************************************
|
||||||
|
// This example support/index.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands';
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
3
packages/editor/images/account.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-hidden="true" style="color: black;">
|
||||||
|
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"></path>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 382 B |
1
packages/editor/images/add.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg>
|
After Width: | Height: | Size: 173 B |
BIN
packages/editor/images/ajax-loader.gif
Normal file
After Width: | Height: | Size: 6.7 KiB |
1
packages/editor/images/back-icon.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M11.67 3.87L9.9 2.1 0 12l9.9 9.9 1.77-1.77L3.54 12z"/></svg>
|
After Width: | Height: | Size: 189 B |
1
packages/editor/images/center_focus.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></svg>
|
After Width: | Height: | Size: 440 B |
1
packages/editor/images/discard.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
After Width: | Height: | Size: 258 B |
1
packages/editor/images/export.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24"/></g><g><path d="M5,20h14v-2H5V20z M19,9h-4V3H9v6H5l7,7L19,9z"/></g></svg>
|
After Width: | Height: | Size: 254 B |
BIN
packages/editor/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
1
packages/editor/images/font-bold.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></svg>
|
After Width: | Height: | Size: 386 B |
1
packages/editor/images/font-color.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><rect fill="none" height="24" width="24"/><path d="M2,20h20v4H2V20z M5.49,17h2.42l1.27-3.58h5.65L16.09,17h2.42L13.25,3h-2.5L5.49,17z M9.91,11.39l2.03-5.79h0.12l2.03,5.79 H9.91z"/></svg>
|
After Width: | Height: | Size: 321 B |
1
packages/editor/images/font-italic.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z"/></svg>
|
After Width: | Height: | Size: 205 B |
1
packages/editor/images/font-size.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24"/></g><g><g><g><path d="M2.5,4v3h5v12h3V7h5V4H2.5z M21.5,9h-9v3h3v7h3v-7h3V9z"/></g></g></g></svg>
|
After Width: | Height: | Size: 277 B |
1
packages/editor/images/font-type.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" baseProfile="tiny" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9.93 13.5h4.14L12 7.98zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z"/></svg>
|
After Width: | Height: | Size: 343 B |
1
packages/editor/images/history.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></svg>
|
After Width: | Height: | Size: 381 B |
1
packages/editor/images/keyboard.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="36" viewBox="0 0 24 24" width="36"><path d="M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2V8zm0 3h2v2h-2v-2zM8 8h2v2H8V8zm0 3h2v2H8v-2zm-1 2H5v-2h2v2zm0-3H5V8h2v2zm9 7H8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2V8h2v2zm3 3h-2v-2h2v2zm0-3h-2V8h2v2z"/><path d="M0 0h24v24H0zm0 0h24v24H0z" fill="none"/></svg>
|
After Width: | Height: | Size: 391 B |
16
packages/editor/images/logo-small.svg
Normal file
After Width: | Height: | Size: 14 KiB |
3
packages/editor/images/logo-text-black.svg
Normal file
After Width: | Height: | Size: 7.0 KiB |
1
packages/editor/images/minus.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 13H5v-2h14v2z"/></svg>
|
After Width: | Height: | Size: 155 B |
1049
packages/editor/images/note-add.svg
Normal file
1
packages/editor/images/print.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></svg>
|
After Width: | Height: | Size: 302 B |
1
packages/editor/images/public.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
|
After Width: | Height: | Size: 457 B |
5
packages/editor/images/pwrdby-white.svg
Normal file
After Width: | Height: | Size: 15 KiB |
1
packages/editor/images/redo.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"/></svg>
|
After Width: | Height: | Size: 300 B |
1
packages/editor/images/save.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>
|
After Width: | Height: | Size: 299 B |
1
packages/editor/images/topic-add.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></svg>
|
After Width: | Height: | Size: 257 B |
1
packages/editor/images/topic-border.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><rect fill="none" height="24" width="24"/><path d="M22,24H2v-4h20V24z M13.06,5.19l3.75,3.75L7.75,18H4v-3.75L13.06,5.19z M17.88,7.87l-3.75-3.75 l1.83-1.83c0.39-0.39,1.02-0.39,1.41,0l2.34,2.34c0.39,0.39,0.39,1.02,0,1.41L17.88,7.87z" enable-background="new"/></svg>
|
After Width: | Height: | Size: 398 B |
1
packages/editor/images/topic-color.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><rect fill="none" height="24" width="24"/></g><g><path d="M12,2C6.49,2,2,6.49,2,12s4.49,10,10,10c1.38,0,2.5-1.12,2.5-2.5c0-0.61-0.23-1.2-0.64-1.67c-0.08-0.1-0.13-0.21-0.13-0.33 c0-0.28,0.22-0.5,0.5-0.5H16c3.31,0,6-2.69,6-6C22,6.04,17.51,2,12,2z M17.5,13c-0.83,0-1.5-0.67-1.5-1.5c0-0.83,0.67-1.5,1.5-1.5 s1.5,0.67,1.5,1.5C19,12.33,18.33,13,17.5,13z M14.5,9C13.67,9,13,8.33,13,7.5C13,6.67,13.67,6,14.5,6S16,6.67,16,7.5 C16,8.33,15.33,9,14.5,9z M5,11.5C5,10.67,5.67,10,6.5,10S8,10.67,8,11.5C8,12.33,7.33,13,6.5,13S5,12.33,5,11.5z M11,7.5 C11,8.33,10.33,9,9.5,9S8,8.33,8,7.5C8,6.67,8.67,6,9.5,6S11,6.67,11,7.5z"/></g></svg>
|
After Width: | Height: | Size: 758 B |
1
packages/editor/images/topic-delete.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></svg>
|
After Width: | Height: | Size: 239 B |
1
packages/editor/images/topic-icon.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></svg>
|
After Width: | Height: | Size: 510 B |
1
packages/editor/images/topic-link.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0" fill="none"/><path d="M8 11h8v2H8zm12.1 1H22c0-2.76-2.24-5-5-5h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1zM3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM19 12h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/></svg>
|
After Width: | Height: | Size: 366 B |
1
packages/editor/images/topic-note.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M13 11h-2v3H8v2h3v3h2v-3h3v-2h-3zm1-9H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z"/></svg>
|
After Width: | Height: | Size: 280 B |
1
packages/editor/images/topic-notes.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M13 11h-2v3H8v2h3v3h2v-3h3v-2h-3zm1-9H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z"/></svg>
|
After Width: | Height: | Size: 280 B |
1
packages/editor/images/topic-relation.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M7.77 6.76L6.23 5.48.82 12l5.41 6.52 1.54-1.28L3.42 12l4.35-5.24zM7 13h2v-2H7v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28L20.58 12l-4.35 5.24 1.54 1.28L23.18 12l-5.41-6.52z"/></svg>
|
After Width: | Height: | Size: 341 B |
1
packages/editor/images/topic-shape.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2l-5.5 9h11z"/><circle cx="17.5" cy="17.5" r="4.5"/><path d="M3 13.5h8v8H3z"/></svg>
|
After Width: | Height: | Size: 236 B |
1
packages/editor/images/undo.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"/></svg>
|
After Width: | Height: | Size: 299 B |
@ -1,13 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Wisemapping</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<!-- React app root element -->
|
|
||||||
<div id="root"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|