Compare commits
141 Commits
sidv/e2eCI
...
sidv/useUn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f85f4bb661 | ||
|
|
01a535b8e0 | ||
|
|
3c12e66f73 | ||
|
|
f0e3bcc37b | ||
|
|
376d1a583c | ||
|
|
ea3d7bc594 | ||
|
|
0a4a3bda16 | ||
|
|
874f4c0641 | ||
|
|
60175cd84f | ||
|
|
ac6d325a00 | ||
|
|
e44e1210e2 | ||
|
|
075f55418b | ||
|
|
164b9bc2cb | ||
|
|
16540f3005 | ||
|
|
6c862565aa | ||
|
|
9ca2e0c5fc | ||
|
|
9acd562b9e | ||
|
|
3238ee4c2e | ||
|
|
b67c023b0a | ||
|
|
e28a766e7d | ||
|
|
3f7f04e02f | ||
|
|
ce6f62e24e | ||
|
|
094b97de12 | ||
|
|
0e3dadc53c | ||
|
|
1fca5131c3 | ||
|
|
fcb41e4579 | ||
|
|
a56d0bc36b | ||
|
|
e6fd3bfb28 | ||
|
|
568a3329e1 | ||
|
|
1968d1bb28 | ||
|
|
ae7833bdfa | ||
|
|
412eec06d4 | ||
|
|
10cb3e26d5 | ||
|
|
75b19eaa0c | ||
|
|
ef51111b86 | ||
|
|
36c0a30c50 | ||
|
|
f233ce1fed | ||
|
|
d13c1bce47 | ||
|
|
967d3bbb60 | ||
|
|
06c357916e | ||
|
|
406d663bff | ||
|
|
78443861a6 | ||
|
|
34aef1a6f5 | ||
|
|
7d0cec0a49 | ||
|
|
d8c3f8fc16 | ||
|
|
d8aa44f0c5 | ||
|
|
2c88c6b526 | ||
|
|
8ed1ad5a8e | ||
|
|
c23cd49322 | ||
|
|
a58b41a38e | ||
|
|
03c5bc1129 | ||
|
|
df42f96b5a | ||
|
|
c535b10534 | ||
|
|
d75f70f808 | ||
|
|
1da20d7aa5 | ||
|
|
913ba34386 | ||
|
|
dbfb29de27 | ||
|
|
69928e3ede | ||
|
|
22b66193dc | ||
|
|
895c16a793 | ||
|
|
b375f79b9c | ||
|
|
b220718b96 | ||
|
|
0f337d654f | ||
|
|
3beb828988 | ||
|
|
469bdcef2f | ||
|
|
72d9e87284 | ||
|
|
2baa36fd1f | ||
|
|
4859947eab | ||
|
|
fca58f5942 | ||
|
|
f17f81d12c | ||
|
|
86946c9bfd | ||
|
|
95e4443ff2 | ||
|
|
81aee3554e | ||
|
|
fd5780d5a1 | ||
|
|
8e7dd1d148 | ||
|
|
14ea1430d8 | ||
|
|
e46e918b23 | ||
|
|
61fdca58a1 | ||
|
|
a6ea439ef3 | ||
|
|
5a8975a4dd | ||
|
|
56e28a7f40 | ||
|
|
5705515483 | ||
|
|
612f9327e9 | ||
|
|
24bd36b087 | ||
|
|
1e3d76a0aa | ||
|
|
7670ada9ac | ||
|
|
bb9b0b015e | ||
|
|
3e64b439ce | ||
|
|
1bf636d697 | ||
|
|
f019250494 | ||
|
|
528facf88d | ||
|
|
7855edae6b | ||
|
|
33f78a5429 | ||
|
|
60d0185698 | ||
|
|
2743b72a87 | ||
|
|
7b13b489c2 | ||
|
|
d6ddf9568e | ||
|
|
ec026eaf82 | ||
|
|
c7f085a138 | ||
|
|
32a8061cc2 | ||
|
|
ac5a1b4501 | ||
|
|
d841ad8f3e | ||
|
|
3fb0b2792e | ||
|
|
bbc4e90c89 | ||
|
|
5735efacbe | ||
|
|
774512df57 | ||
|
|
152994047e | ||
|
|
d194e78677 | ||
|
|
16b51800d0 | ||
|
|
2176bef537 | ||
|
|
9f9c95b0b3 | ||
|
|
3f0b13a131 | ||
|
|
3c44379af9 | ||
|
|
1d529d80d1 | ||
|
|
89451ca640 | ||
|
|
fac3a4d29b | ||
|
|
d7610dda8f | ||
|
|
e4622ba06e | ||
|
|
6fb9b3b353 | ||
|
|
07d8684fc7 | ||
|
|
1b0ea981f9 | ||
|
|
72a3cff13e | ||
|
|
14f7756fdb | ||
|
|
0b01c3376d | ||
|
|
6c2647e8cf | ||
|
|
e1a501c66b | ||
|
|
4f169dd2b8 | ||
|
|
23a44952ac | ||
|
|
7656916cef | ||
|
|
88357ba751 | ||
|
|
98fc866444 | ||
|
|
c6fce2431b | ||
|
|
9b27396344 | ||
|
|
ebf76e3d1f | ||
|
|
4dadf8a72d | ||
|
|
4863d0d29d | ||
|
|
4f1b26fd76 | ||
|
|
accba3f408 | ||
|
|
f884b745dc | ||
|
|
4cc3b17d36 | ||
|
|
5cfa919672 |
@@ -69,6 +69,7 @@
|
|||||||
"unicorn/no-abusive-eslint-disable": "error",
|
"unicorn/no-abusive-eslint-disable": "error",
|
||||||
"unicorn/no-array-push-push": "error",
|
"unicorn/no-array-push-push": "error",
|
||||||
"unicorn/no-for-loop": "error",
|
"unicorn/no-for-loop": "error",
|
||||||
|
"unicorn/no-null": "error",
|
||||||
"unicorn/no-instanceof-array": "error",
|
"unicorn/no-instanceof-array": "error",
|
||||||
"unicorn/no-typeof-undefined": "error",
|
"unicorn/no-typeof-undefined": "error",
|
||||||
"unicorn/no-unnecessary-await": "error",
|
"unicorn/no-unnecessary-await": "error",
|
||||||
|
|||||||
1
.github/pull_request_template.md
vendored
@@ -14,4 +14,5 @@ Make sure you
|
|||||||
|
|
||||||
- [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md)
|
- [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md)
|
||||||
- [ ] :computer: have added unit/e2e tests (if appropriate)
|
- [ ] :computer: have added unit/e2e tests (if appropriate)
|
||||||
|
- [ ] :notebook: have added documentation (if appropriate)
|
||||||
- [ ] :bookmark: targeted `develop` branch
|
- [ ] :bookmark: targeted `develop` branch
|
||||||
|
|||||||
30
.github/workflows/e2e.yml
vendored
@@ -3,7 +3,7 @@ name: E2E
|
|||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -28,28 +28,15 @@ jobs:
|
|||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
# Experiment with this step if we cannot check-in the snapshots to the repo.
|
|
||||||
# - name: Cache snapshots
|
|
||||||
# id: cache-snapshot
|
|
||||||
# uses: actions/cache@v3
|
|
||||||
# with:
|
|
||||||
# # npm cache files are stored in `~/.npm` on Linux/macOS
|
|
||||||
# path: ./cypress/snapshots
|
|
||||||
# key: ${{ runner.os }}-build-${env.GITHUB_REF}
|
|
||||||
# restore-keys: |
|
|
||||||
# ${{ runner.os }}-build-develop
|
|
||||||
|
|
||||||
# Install NPM dependencies, cache them correctly
|
# Install NPM dependencies, cache them correctly
|
||||||
# and run all Cypress tests
|
# and run all Cypress tests
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
id: cypress
|
|
||||||
uses: cypress-io/github-action@v4
|
uses: cypress-io/github-action@v4
|
||||||
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
||||||
# Otherwise (e.g. if running from fork), we run on a single container only
|
# Otherwise (e.g. if running from fork), we run on a single container only
|
||||||
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||||
with:
|
with:
|
||||||
start: pnpm run dev
|
start: pnpm run dev
|
||||||
browser: chrome
|
|
||||||
wait-on: 'http://localhost:9000'
|
wait-on: 'http://localhost:9000'
|
||||||
# Disable recording if we don't have an API key
|
# Disable recording if we don't have an API key
|
||||||
# e.g. if this action was run from a fork
|
# e.g. if this action was run from a fork
|
||||||
@@ -57,18 +44,3 @@ jobs:
|
|||||||
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
env:
|
env:
|
||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
|
|
||||||
- name: Upload Artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
if: ${{ failure() && steps.cypress.conclusion == 'failure' }}
|
|
||||||
with:
|
|
||||||
name: error-snapshots
|
|
||||||
path: cypress/snapshots/**/__diff_output__/*
|
|
||||||
|
|
||||||
- name: Commit changes
|
|
||||||
uses: EndBug/add-and-commit@v9
|
|
||||||
if: ${{ github.event_name == 'push' }}
|
|
||||||
with:
|
|
||||||
message: 'Update snapshots'
|
|
||||||
add: 'cypress/snapshots/*'
|
|
||||||
pull: '--rebase --autostash'
|
|
||||||
|
|||||||
3
.github/workflows/link-checker.yml
vendored
@@ -13,11 +13,10 @@ on:
|
|||||||
- master
|
- master
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
|
||||||
- master
|
- master
|
||||||
schedule:
|
schedule:
|
||||||
# * is a special character in YAML so you have to quote this string
|
# * is a special character in YAML so you have to quote this string
|
||||||
- cron: '30 8 * * 5'
|
- cron: '30 8 * * *'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linkChecker:
|
linkChecker:
|
||||||
|
|||||||
2
.gitignore
vendored
@@ -26,7 +26,7 @@ Gemfile.lock
|
|||||||
/.vs
|
/.vs
|
||||||
|
|
||||||
cypress/screenshots/
|
cypress/screenshots/
|
||||||
cypress/snapshots-dev/
|
cypress/snapshots/
|
||||||
|
|
||||||
# eslint --cache file
|
# eslint --cache file
|
||||||
.eslintcache
|
.eslintcache
|
||||||
|
|||||||
@@ -9,5 +9,8 @@ https://mkdocs.org/
|
|||||||
https://osawards.com/javascript/#nominees
|
https://osawards.com/javascript/#nominees
|
||||||
https://osawards.com/javascript/2019
|
https://osawards.com/javascript/2019
|
||||||
|
|
||||||
|
# Timeout error, maybe Twitter has anti-bot defences against GitHub's CI servers?
|
||||||
|
https://twitter.com/mermaidjs_
|
||||||
|
|
||||||
# Don't check files that are generated during the build via `pnpm docs:code`
|
# Don't check files that are generated during the build via `pnpm docs:code`
|
||||||
packages/mermaid/src/docs/config/setup/*
|
packages/mermaid/src/docs/config/setup/*
|
||||||
|
|||||||
@@ -41,6 +41,11 @@ const packageOptions = {
|
|||||||
packageName: 'mermaid-mindmap',
|
packageName: 'mermaid-mindmap',
|
||||||
file: 'detector.ts',
|
file: 'detector.ts',
|
||||||
},
|
},
|
||||||
|
'mermaid-flowchart-v3': {
|
||||||
|
name: 'mermaid-flowchart-v3',
|
||||||
|
packageName: 'mermaid-flowchart-v3',
|
||||||
|
file: 'detector.ts',
|
||||||
|
},
|
||||||
// 'mermaid-example-diagram-detector': {
|
// 'mermaid-example-diagram-detector': {
|
||||||
// name: 'mermaid-example-diagram-detector',
|
// name: 'mermaid-example-diagram-detector',
|
||||||
// packageName: 'mermaid-example-diagram',
|
// packageName: 'mermaid-example-diagram',
|
||||||
@@ -120,6 +125,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
if (watch && config.build) {
|
if (watch && config.build) {
|
||||||
config.build.watch = {
|
config.build.watch = {
|
||||||
include: [
|
include: [
|
||||||
|
'packages/mermaid-flowchart-v3/src/**',
|
||||||
'packages/mermaid-mindmap/src/**',
|
'packages/mermaid-mindmap/src/**',
|
||||||
'packages/mermaid/src/**',
|
'packages/mermaid/src/**',
|
||||||
// 'packages/mermaid-example-diagram/src/**',
|
// 'packages/mermaid-example-diagram/src/**',
|
||||||
@@ -146,8 +152,9 @@ const main = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (watch) {
|
if (watch) {
|
||||||
build(getBuildConfig({ minify: false, watch, core: true, entryName: 'mermaid' }));
|
build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
|
||||||
if (!mermaidOnly) {
|
if (!mermaidOnly) {
|
||||||
|
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-flowchart-v3' }));
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
|
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
|
||||||
// build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
// build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ English | [简体中文](./README.zh-CN.md)
|
|||||||
|
|
||||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/img/book-banner-pre-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
## 关于 Mermaid
|
## 关于 Mermaid
|
||||||
|
|
||||||
|
|||||||
12
cSpell.json
@@ -14,6 +14,7 @@
|
|||||||
"bilkent",
|
"bilkent",
|
||||||
"bisheng",
|
"bisheng",
|
||||||
"braintree",
|
"braintree",
|
||||||
|
"brkt",
|
||||||
"brolin",
|
"brolin",
|
||||||
"brotli",
|
"brotli",
|
||||||
"classdef",
|
"classdef",
|
||||||
@@ -30,6 +31,7 @@
|
|||||||
"doku",
|
"doku",
|
||||||
"dompurify",
|
"dompurify",
|
||||||
"edgechromium",
|
"edgechromium",
|
||||||
|
"elkjs",
|
||||||
"faber",
|
"faber",
|
||||||
"flatmap",
|
"flatmap",
|
||||||
"ftplugin",
|
"ftplugin",
|
||||||
@@ -38,6 +40,7 @@
|
|||||||
"gitgraph",
|
"gitgraph",
|
||||||
"globby",
|
"globby",
|
||||||
"graphlib",
|
"graphlib",
|
||||||
|
"graphviz",
|
||||||
"grav",
|
"grav",
|
||||||
"greywolf",
|
"greywolf",
|
||||||
"inkdrop",
|
"inkdrop",
|
||||||
@@ -52,7 +55,6 @@
|
|||||||
"laganeckas",
|
"laganeckas",
|
||||||
"lintstagedrc",
|
"lintstagedrc",
|
||||||
"lucida",
|
"lucida",
|
||||||
"mansalva",
|
|
||||||
"matthieu",
|
"matthieu",
|
||||||
"mdbook",
|
"mdbook",
|
||||||
"mermerd",
|
"mermerd",
|
||||||
@@ -61,12 +63,15 @@
|
|||||||
"mindmaps",
|
"mindmaps",
|
||||||
"mitigations",
|
"mitigations",
|
||||||
"mkdocs",
|
"mkdocs",
|
||||||
|
"mult",
|
||||||
"orlandoni",
|
"orlandoni",
|
||||||
"phpbb",
|
"phpbb",
|
||||||
"plantuml",
|
"plantuml",
|
||||||
"playfair",
|
"playfair",
|
||||||
"pnpm",
|
"pnpm",
|
||||||
"podlite",
|
"podlite",
|
||||||
|
"quence",
|
||||||
|
"radious",
|
||||||
"ranksep",
|
"ranksep",
|
||||||
"rect",
|
"rect",
|
||||||
"rects",
|
"rects",
|
||||||
@@ -77,15 +82,18 @@
|
|||||||
"shiki",
|
"shiki",
|
||||||
"sidharth",
|
"sidharth",
|
||||||
"sphinxcontrib",
|
"sphinxcontrib",
|
||||||
"ssim",
|
|
||||||
"statediagram",
|
"statediagram",
|
||||||
"stylis",
|
"stylis",
|
||||||
"substate",
|
"substate",
|
||||||
"sveidqvist",
|
"sveidqvist",
|
||||||
|
"swimm",
|
||||||
"techn",
|
"techn",
|
||||||
|
"teststr",
|
||||||
|
"textlength",
|
||||||
"treemap",
|
"treemap",
|
||||||
"ts-nocheck",
|
"ts-nocheck",
|
||||||
"tuleap",
|
"tuleap",
|
||||||
|
"ugge",
|
||||||
"unist",
|
"unist",
|
||||||
"verdana",
|
"verdana",
|
||||||
"viewports",
|
"viewports",
|
||||||
|
|||||||
@@ -5,17 +5,9 @@ const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin')
|
|||||||
|
|
||||||
module.exports = defineConfig({
|
module.exports = defineConfig({
|
||||||
projectId: 'n2sma2',
|
projectId: 'n2sma2',
|
||||||
viewportWidth: 1440,
|
|
||||||
viewportHeight: 1024,
|
|
||||||
e2e: {
|
e2e: {
|
||||||
specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
|
specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
|
||||||
setupNodeEvents(on, config) {
|
setupNodeEvents(on, config) {
|
||||||
on('before:browser:launch', (browser = {}, launchOptions) => {
|
|
||||||
if (browser.name === 'chrome' && browser.isHeadless) {
|
|
||||||
launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
|
|
||||||
}
|
|
||||||
return launchOptions;
|
|
||||||
});
|
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
// copy any needed variables from process.env to config.env
|
// copy any needed variables from process.env to config.env
|
||||||
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
||||||
|
|||||||
@@ -136,5 +136,6 @@ export const urlSnapshotTest = (url, _options, api = false, validation) => {
|
|||||||
|
|
||||||
export const renderGraph = (graphStr, options, api) => {
|
export const renderGraph = (graphStr, options, api) => {
|
||||||
const url = mermaidUrl(graphStr, options, api);
|
const url = mermaidUrl(graphStr, options, api);
|
||||||
|
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ describe('Configuration', () => {
|
|||||||
});
|
});
|
||||||
it('should not taint the initial configuration when using multiple directives', () => {
|
it('should not taint the initial configuration when using multiple directives', () => {
|
||||||
const url = 'http://localhost:9000/regression/issue-1874.html';
|
const url = 'http://localhost:9000/regression/issue-1874.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
|
|
||||||
cy.get('svg');
|
cy.get('svg');
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
|
import { urlSnapshotTest } from '../../helpers/util';
|
||||||
|
|
||||||
describe('mermaid', () => {
|
describe('mermaid', () => {
|
||||||
describe('registerDiagram', () => {
|
describe('registerDiagram', () => {
|
||||||
it('should work on @mermaid-js/mermaid-mindmap and mermaid-example-diagram', () => {
|
it('should work on @mermaid-js/mermaid-mindmap and mermaid-example-diagram', () => {
|
||||||
const url = 'http://localhost:9000/external-diagrams-mindmap.html';
|
const url = 'http://localhost:9000/external-diagrams-mindmap.html';
|
||||||
cy.visit(url);
|
urlSnapshotTest(url, {}, false, false);
|
||||||
|
|
||||||
cy.get('svg', {
|
|
||||||
// may be a bit slower than normal, since vite might need to re-compile mermaid/mermaid-mindmap/mermaid-example-diagram
|
|
||||||
timeout: 10000,
|
|
||||||
}).matchImageSnapshot();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,4 +7,10 @@ describe('CSS injections', () => {
|
|||||||
flowchart: { htmlLabels: false },
|
flowchart: { htmlLabels: false },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it('should not allow adding styletags affecting the page', () => {
|
||||||
|
urlSnapshotTest('http://localhost:9000/ghsa3.html', {
|
||||||
|
logLevel: 1,
|
||||||
|
flowchart: { htmlLabels: false },
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
describe('Rerendering', () => {
|
describe('Rerendering', () => {
|
||||||
it('should be able to render after an error has occurred', () => {
|
it('should be able to render after an error has occurred', () => {
|
||||||
const url = 'http://localhost:9000/render-after-error.html';
|
const url = 'http://localhost:9000/render-after-error.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graphDiv').should('exist');
|
cy.get('#graphDiv').should('exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to render and rerender a graph via API', () => {
|
it('should be able to render and rerender a graph via API', () => {
|
||||||
const url = 'http://localhost:9000/rerender.html';
|
const url = 'http://localhost:9000/rerender.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
||||||
|
|
||||||
|
|||||||
122
cypress/integration/rendering/c4.spec.js
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.js';
|
||||||
|
|
||||||
|
describe('C4 diagram', () => {
|
||||||
|
it('should render a simple C4Context diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
C4Context
|
||||||
|
accTitle: C4 context demo
|
||||||
|
accDescr: Many large C4 diagrams
|
||||||
|
|
||||||
|
title System Context diagram for Internet Banking System
|
||||||
|
|
||||||
|
Enterprise_Boundary(b0, "BankBoundary0") {
|
||||||
|
Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.")
|
||||||
|
|
||||||
|
System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")
|
||||||
|
|
||||||
|
Enterprise_Boundary(b1, "BankBoundary") {
|
||||||
|
System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BiRel(customerA, SystemAA, "Uses")
|
||||||
|
Rel(SystemAA, SystemC, "Sends e-mails", "SMTP")
|
||||||
|
Rel(SystemC, customerA, "Sends e-mails to")
|
||||||
|
|
||||||
|
UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red")
|
||||||
|
UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5")
|
||||||
|
UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
it('should render a simple C4Container diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
C4Container
|
||||||
|
title Container diagram for Internet Banking System
|
||||||
|
|
||||||
|
System_Ext(email_system, "E-Mail System", "The internal Microsoft Exchange system", $tags="v1.0")
|
||||||
|
Person(customer, Customer, "A customer of the bank, with personal bank accounts", $tags="v1.0")
|
||||||
|
|
||||||
|
Container_Boundary(c1, "Internet Banking") {
|
||||||
|
Container(spa, "Single-Page App", "JavaScript, Angular", "Provides all the Internet banking functionality to customers via their web browser")
|
||||||
|
}
|
||||||
|
|
||||||
|
Rel(customer, spa, "Uses", "HTTPS")
|
||||||
|
Rel(email_system, customer, "Sends e-mails to")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
it('should render a simple C4Component diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
C4Component
|
||||||
|
title Component diagram for Internet Banking System - API Application
|
||||||
|
|
||||||
|
Container(spa, "Single Page Application", "javascript and angular", "Provides all the internet banking functionality to customers via their web browser.")
|
||||||
|
|
||||||
|
Container_Boundary(api, "API Application") {
|
||||||
|
Component(sign, "Sign In Controller", "MVC Rest Controller", "Allows users to sign in to the internet banking system")
|
||||||
|
}
|
||||||
|
|
||||||
|
Rel_Back(spa, sign, "Uses", "JSON/HTTPS")
|
||||||
|
UpdateRelStyle(spa, sign, $offsetY="-40")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
it('should render a simple C4Dynamic diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
C4Dynamic
|
||||||
|
title Dynamic diagram for Internet Banking System - API Application
|
||||||
|
|
||||||
|
ContainerDb(c4, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.")
|
||||||
|
Container(c1, "Single-Page Application", "JavaScript and Angular", "Provides all of the Internet banking functionality to customers via their web browser.")
|
||||||
|
Container_Boundary(b, "API Application") {
|
||||||
|
Component(c3, "Security Component", "Spring Bean", "Provides functionality Related to signing in, changing passwords, etc.")
|
||||||
|
Component(c2, "Sign In Controller", "Spring MVC Rest Controller", "Allows users to sign in to the Internet Banking System.")
|
||||||
|
}
|
||||||
|
Rel(c1, c2, "Submits credentials to", "JSON/HTTPS")
|
||||||
|
Rel(c2, c3, "Calls isAuthenticated() on")
|
||||||
|
Rel(c3, c4, "select * from users where username = ?", "JDBC")
|
||||||
|
|
||||||
|
UpdateRelStyle(c1, c2, $textColor="red", $offsetY="-40")
|
||||||
|
UpdateRelStyle(c2, c3, $textColor="red", $offsetX="-40", $offsetY="60")
|
||||||
|
UpdateRelStyle(c3, c4, $textColor="red", $offsetY="-40", $offsetX="10")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
it('should render a simple C4Deployment diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
C4Deployment
|
||||||
|
title Deployment Diagram for Internet Banking System - Live
|
||||||
|
|
||||||
|
Deployment_Node(mob, "Customer's mobile device", "Apple IOS or Android"){
|
||||||
|
Container(mobile, "Mobile App", "Xamarin", "Provides a limited subset of the Internet Banking functionality to customers via their mobile device.")
|
||||||
|
}
|
||||||
|
|
||||||
|
Deployment_Node(plc, "Big Bank plc", "Big Bank plc data center"){
|
||||||
|
Deployment_Node(dn, "bigbank-api*** x8", "Ubuntu 16.04 LTS"){
|
||||||
|
Deployment_Node(apache, "Apache Tomcat", "Apache Tomcat 8.x"){
|
||||||
|
Container(api, "API Application", "Java and Spring MVC", "Provides Internet Banking functionality via a JSON/HTTPS API.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rel(mobile, api, "Makes API calls to", "json/HTTPS")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -485,8 +485,7 @@ describe('Class diagram V2', () => {
|
|||||||
classDiagram-v2
|
classDiagram-v2
|
||||||
note "I love this diagram!\nDo you love it?"
|
note "I love this diagram!\nDo you love it?"
|
||||||
class Class10 {
|
class Class10 {
|
||||||
<<service>>
|
int id
|
||||||
int id
|
|
||||||
size()
|
size()
|
||||||
}
|
}
|
||||||
note for Class10 "Cool class\nI said it's very cool class!"
|
note for Class10 "Cool class\nI said it's very cool class!"
|
||||||
|
|||||||
@@ -414,7 +414,6 @@ describe('Class diagram', () => {
|
|||||||
classDiagram
|
classDiagram
|
||||||
note "I love this diagram!\nDo you love it?"
|
note "I love this diagram!\nDo you love it?"
|
||||||
class Class10 {
|
class Class10 {
|
||||||
<<service>>
|
|
||||||
int id
|
int id
|
||||||
size()
|
size()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { imgSnapshotTest } from '../../helpers/util';
|
import { imgSnapshotTest } from '../../helpers/util';
|
||||||
|
|
||||||
describe('State diagram', () => {
|
describe('Current diagram', () => {
|
||||||
it('should render a state with states in it', () => {
|
it('should render a state with states in it', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -182,6 +182,20 @@ describe('Entity Relationship Diagram', () => {
|
|||||||
cy.get('svg');
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render entities with length in attributes type', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
CLUSTER {
|
||||||
|
varchar(99) name
|
||||||
|
string(255) description
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ logLevel: 1 }
|
||||||
|
);
|
||||||
|
cy.get('svg');
|
||||||
|
});
|
||||||
|
|
||||||
it('should render entities and attributes with big and small entity names', () => {
|
it('should render entities and attributes with big and small entity names', () => {
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -225,10 +225,7 @@ describe('Gantt diagram', () => {
|
|||||||
const style = svg.attr('style');
|
const style = svg.attr('style');
|
||||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||||
expect(maxWidthValue).to.be.within(
|
expect(maxWidthValue).to.be.within(984 * 0.95, 984 * 1.05);
|
||||||
Cypress.config().viewportWidth * 0.95,
|
|
||||||
Cypress.config().viewportWidth * 1.05
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -272,10 +269,7 @@ describe('Gantt diagram', () => {
|
|||||||
const width = parseFloat(svg.attr('width'));
|
const width = parseFloat(svg.attr('width'));
|
||||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||||
// expect(height).to.be.within(484 * 0.95, 484 * 1.05);
|
// expect(height).to.be.within(484 * 0.95, 484 * 1.05);
|
||||||
expect(width).to.be.within(
|
expect(width).to.be.within(984 * 0.95, 984 * 1.05);
|
||||||
Cypress.config().viewportWidth * 0.95,
|
|
||||||
Cypress.config().viewportWidth * 1.05
|
|
||||||
);
|
|
||||||
expect(svg).to.not.have.attr('style');
|
expect(svg).to.not.have.attr('style');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -54,10 +54,7 @@ describe('Pie Chart', () => {
|
|||||||
const style = svg.attr('style');
|
const style = svg.attr('style');
|
||||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||||
expect(maxWidthValue).to.be.within(
|
expect(maxWidthValue).to.eq(984);
|
||||||
Cypress.config().viewportWidth * 0.95,
|
|
||||||
Cypress.config().viewportWidth * 1.05
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should render a pie diagram when useMaxWidth is false', () => {
|
it('should render a pie diagram when useMaxWidth is false', () => {
|
||||||
@@ -71,11 +68,10 @@ describe('Pie Chart', () => {
|
|||||||
{ pie: { useMaxWidth: false } }
|
{ pie: { useMaxWidth: false } }
|
||||||
);
|
);
|
||||||
cy.get('svg').should((svg) => {
|
cy.get('svg').should((svg) => {
|
||||||
|
// const height = parseFloat(svg.attr('height'));
|
||||||
const width = parseFloat(svg.attr('width'));
|
const width = parseFloat(svg.attr('width'));
|
||||||
expect(width).to.be.within(
|
// expect(height).to.eq(450);
|
||||||
Cypress.config().viewportWidth * 0.95,
|
expect(width).to.eq(984);
|
||||||
Cypress.config().viewportWidth * 1.05
|
|
||||||
);
|
|
||||||
expect(svg).to.not.have.attr('style');
|
expect(svg).to.not.have.attr('style');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,32 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
<!-- <meta charset="iso-8859-15"/> -->
|
||||||
<script src="./viewer.js" type="module"></script>
|
<script src="./viewer.js" type="module"></script>
|
||||||
|
<!-- <link href="https://fonts.googleapis.com/css?family=Mansalva&display=swap" rel="stylesheet" /> -->
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
<style>
|
<style>
|
||||||
|
body {
|
||||||
|
/* font-family: 'Mansalva', cursive;*/
|
||||||
|
/* font-family: 'Mansalva', cursive; */
|
||||||
|
/* font-family: 'arial'; */
|
||||||
|
/* font-family: "trebuchet ms", verdana, arial; */
|
||||||
|
}
|
||||||
|
/* div {
|
||||||
|
font-family: 'arial';
|
||||||
|
} */
|
||||||
|
/* .mermaid-main-font {
|
||||||
|
font-family: "trebuchet ms", verdana, arial;
|
||||||
|
font-family: var(--mermaid-font-family);
|
||||||
|
} */
|
||||||
|
/* :root {
|
||||||
|
--mermaid-font-family: '"trebuchet ms", verdana, arial';
|
||||||
|
--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive;
|
||||||
|
--mermaid-font-family: '"Lucida Console", Monaco, monospace';
|
||||||
|
} */
|
||||||
svg {
|
svg {
|
||||||
border: 2px solid darkred;
|
border: 2px solid darkred;
|
||||||
}
|
}
|
||||||
@@ -12,5 +36,21 @@
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body></body>
|
<body>
|
||||||
|
<!-- <script src="./mermaid.js"></script> -->
|
||||||
|
<script>
|
||||||
|
// Notice startOnLoad=false
|
||||||
|
// This prevents default handling in mermaid from render before the e2e logic is applied
|
||||||
|
// mermaid.initialize({
|
||||||
|
// startOnLoad: false,
|
||||||
|
// useMaxWidth: true,
|
||||||
|
// // "themeCSS": ":root { --mermaid-font-family: \"trebuchet ms\", verdana, arial;}",
|
||||||
|
// // fontFamily: '\"trebuchet ms\", verdana, arial;'
|
||||||
|
// // fontFamily: '"Comic Sans MS", "Comic Sans", cursive'
|
||||||
|
// // fontFamily: '"Mansalva", cursive',
|
||||||
|
// // fontFamily: '"Noto Sans SC", sans-serif'
|
||||||
|
// fontFamily: '"Noto Sans SC", sans-serif'
|
||||||
|
// });
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
</script>
|
</script>
|
||||||
<body>
|
<body>
|
||||||
<div id="target">
|
<div id="target">
|
||||||
<h1>This element does not belong to the SVG but we can style it</h1>
|
<h1>Background should be yellow!!!</h1>
|
||||||
</div>
|
</div>
|
||||||
<svg id="diagram"></svg>
|
<svg id="diagram"></svg>
|
||||||
|
|
||||||
|
|||||||
100
cypress/platform/ghsa3.html
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
/* background: rgb(221, 208, 208); */
|
||||||
|
/* background:#333; */
|
||||||
|
font-family: 'Arial';
|
||||||
|
/* font-size: 18px !important; */
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
.mermaid2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.mermaid svg {
|
||||||
|
/* font-size: 18px !important; */
|
||||||
|
}
|
||||||
|
.malware {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 150px;
|
||||||
|
background: red;
|
||||||
|
color: black;
|
||||||
|
display: flex;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 72px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>PAGE SHOULD NOT BE RED</h1>
|
||||||
|
<div class="flex">
|
||||||
|
<div id="diagram" class="mermaid"></div>
|
||||||
|
<div id="res" class=""></div>
|
||||||
|
</div>
|
||||||
|
<script src="./mermaid.js"></script>
|
||||||
|
<script>
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
// console.error('Mermaid error: ', err);
|
||||||
|
};
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
arrowMarkerAbsolute: true,
|
||||||
|
// themeCSS: '.edgePath .path {stroke: red;} .arrowheadPath {fill: red;}',
|
||||||
|
logLevel: 0,
|
||||||
|
state: {
|
||||||
|
defaultRenderer: 'dagre-wrapper',
|
||||||
|
},
|
||||||
|
flowchart: {
|
||||||
|
// defaultRenderer: 'dagre-wrapper',
|
||||||
|
nodeSpacing: 10,
|
||||||
|
curve: 'cardinal',
|
||||||
|
htmlLabels: true,
|
||||||
|
},
|
||||||
|
htmlLabels: true,
|
||||||
|
// gantt: { axisFormat: '%m/%d/%Y' },
|
||||||
|
sequence: { actorFontFamily: 'courier', actorMargin: 50, showSequenceNumbers: false },
|
||||||
|
// sequenceDiagram: { actorMargin: 300 } // deprecated
|
||||||
|
// fontFamily: '"times", sans-serif',
|
||||||
|
// fontFamily: 'courier',
|
||||||
|
fontSize: 18,
|
||||||
|
curve: 'basis',
|
||||||
|
// securityLevel: 'strict',
|
||||||
|
startOnLoad: false,
|
||||||
|
secure: ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'],
|
||||||
|
// themeVariables: {relationLabelColor: 'red'}
|
||||||
|
});
|
||||||
|
function callback() {
|
||||||
|
alert('It worked');
|
||||||
|
}
|
||||||
|
|
||||||
|
let diagram = '%%{init: {"flowchart": {"htmlLabels": "true"}} }%%\n';
|
||||||
|
diagram += 'flowchart\n';
|
||||||
|
diagram += 'A["<p><sty';
|
||||||
|
diagram += 'le> * { background : red}</style>test</p>"]';
|
||||||
|
|
||||||
|
console.log(diagram);
|
||||||
|
// document.querySelector('#diagram').innerHTML = diagram;
|
||||||
|
mermaid.render('diagram', diagram, (res) => {
|
||||||
|
document.querySelector('#res').innerHTML = res;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -54,31 +54,172 @@
|
|||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div>Security check</div>
|
|
||||||
<pre id="diagram" class="mermaid">
|
<pre id="diagram" class="mermaid">
|
||||||
flowchart LR
|
%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
|
||||||
%% Actors
|
graph TB
|
||||||
A
|
a --> b
|
||||||
subgraph Sub
|
a --> c
|
||||||
B --> C
|
b --> d
|
||||||
|
c --> d
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram" class="mermaid">
|
||||||
|
%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
|
||||||
|
flowchart TB
|
||||||
|
%% I could not figure out how to use double quotes in labels in Mermaid
|
||||||
|
subgraph ibm[IBM Espresso CPU]
|
||||||
|
core0[IBM PowerPC Broadway Core 0]
|
||||||
|
core1[IBM PowerPC Broadway Core 1]
|
||||||
|
core2[IBM PowerPC Broadway Core 2]
|
||||||
|
|
||||||
|
rom[16 KB ROM]
|
||||||
|
|
||||||
|
core0 --- core2
|
||||||
|
|
||||||
|
rom --> core2
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph amd[AMD Latte GPU]
|
||||||
|
mem[Memory & I/O Bridge]
|
||||||
|
dram[DRAM Controller]
|
||||||
|
edram[32 MB EDRAM MEM1]
|
||||||
|
rom[512 B SEEPROM]
|
||||||
|
|
||||||
|
sata[SATA IF]
|
||||||
|
exi[EXI]
|
||||||
|
|
||||||
|
subgraph gx[GX]
|
||||||
|
sram[3 MB 1T-SRAM]
|
||||||
end
|
end
|
||||||
|
|
||||||
%% Accusations
|
radeon[AMD Radeon R7xx GX2]
|
||||||
A --L --> Sub
|
|
||||||
|
|
||||||
%% Offense
|
mem --- gx
|
||||||
B --> A
|
mem --- radeon
|
||||||
|
|
||||||
</pre>
|
rom --- mem
|
||||||
|
|
||||||
|
mem --- sata
|
||||||
|
mem --- exi
|
||||||
|
|
||||||
|
dram --- sata
|
||||||
|
dram --- exi
|
||||||
|
end
|
||||||
|
|
||||||
|
ddr3[2 GB DDR3 RAM MEM2]
|
||||||
|
|
||||||
|
mem --- ddr3
|
||||||
|
dram --- ddr3
|
||||||
|
edram --- ddr3
|
||||||
|
|
||||||
|
core1 --- mem
|
||||||
|
|
||||||
|
exi --- rtc
|
||||||
|
rtc{{rtc}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<br />
|
||||||
<pre id="diagram" class="mermaid">
|
<pre id="diagram" class="mermaid">
|
||||||
stateDiagram-v2
|
flowchart TB
|
||||||
|
%% I could not figure out how to use double quotes in labels in Mermaid
|
||||||
|
subgraph ibm[IBM Espresso CPU]
|
||||||
|
core0[IBM PowerPC Broadway Core 0]
|
||||||
|
core1[IBM PowerPC Broadway Core 1]
|
||||||
|
core2[IBM PowerPC Broadway Core 2]
|
||||||
|
|
||||||
[*] --> S1
|
rom[16 KB ROM]
|
||||||
S1 --> S2: long line using<br/>should work
|
|
||||||
S1 --> S3: long line using <br>should work
|
|
||||||
S1 --> S4: long line using \\nshould work
|
|
||||||
|
|
||||||
</pre>
|
core0 --- core2
|
||||||
|
|
||||||
|
rom --> core2
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph amd[AMD Latte GPU]
|
||||||
|
mem[Memory & I/O Bridge]
|
||||||
|
dram[DRAM Controller]
|
||||||
|
edram[32 MB EDRAM MEM1]
|
||||||
|
rom[512 B SEEPROM]
|
||||||
|
|
||||||
|
sata[SATA IF]
|
||||||
|
exi[EXI]
|
||||||
|
|
||||||
|
subgraph gx[GX]
|
||||||
|
sram[3 MB 1T-SRAM]
|
||||||
|
end
|
||||||
|
|
||||||
|
radeon[AMD Radeon R7xx GX2]
|
||||||
|
|
||||||
|
mem --- gx
|
||||||
|
mem --- radeon
|
||||||
|
|
||||||
|
rom --- mem
|
||||||
|
|
||||||
|
mem --- sata
|
||||||
|
mem --- exi
|
||||||
|
|
||||||
|
dram --- sata
|
||||||
|
dram --- exi
|
||||||
|
end
|
||||||
|
|
||||||
|
ddr3[2 GB DDR3 RAM MEM2]
|
||||||
|
|
||||||
|
mem --- ddr3
|
||||||
|
dram --- ddr3
|
||||||
|
edram --- ddr3
|
||||||
|
|
||||||
|
core1 --- mem
|
||||||
|
|
||||||
|
exi --- rtc
|
||||||
|
rtc{{rtc}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<pre id="diagram" class="mermaid2">
|
||||||
|
flowchart LR
|
||||||
|
B1 --be be--x B2
|
||||||
|
B1 --bo bo--o B3
|
||||||
|
subgraph Ugge
|
||||||
|
B2
|
||||||
|
B3
|
||||||
|
subgraph inner
|
||||||
|
B4
|
||||||
|
B5
|
||||||
|
end
|
||||||
|
subgraph inner2
|
||||||
|
subgraph deeper
|
||||||
|
C4
|
||||||
|
C5
|
||||||
|
end
|
||||||
|
C6
|
||||||
|
end
|
||||||
|
|
||||||
|
B4 --> C4
|
||||||
|
|
||||||
|
B3 -- X --> B4
|
||||||
|
B2 --> inner
|
||||||
|
|
||||||
|
C4 --> C5
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph outer
|
||||||
|
B6
|
||||||
|
end
|
||||||
|
B6 --> B5
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram" class="mermaid2">
|
||||||
|
sequenceDiagram
|
||||||
|
Customer->>+Stripe: Makes a payment request
|
||||||
|
Stripe->>+Bank: Forwards the payment request to the bank
|
||||||
|
Bank->>+Customer: Asks for authorization
|
||||||
|
Customer->>+Bank: Provides authorization
|
||||||
|
Bank->>+Stripe: Sends a response with payment details
|
||||||
|
Stripe->>+Merchant: Sends a notification of payment receipt
|
||||||
|
Merchant->>+Stripe: Confirms the payment
|
||||||
|
Stripe->>+Customer: Sends a confirmation of payment
|
||||||
|
Customer->>+Merchant: Receives goods or services
|
||||||
|
</pre
|
||||||
|
>
|
||||||
<pre id="diagram" class="mermaid2">
|
<pre id="diagram" class="mermaid2">
|
||||||
gantt
|
gantt
|
||||||
title Style today marker (vertical line should be 5px wide and half-transparent blue)
|
title Style today marker (vertical line should be 5px wide and half-transparent blue)
|
||||||
@@ -97,17 +238,19 @@ flowchart LR
|
|||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import mindmap from '../../packages/mermaid-mindmap/src/detector';
|
import mindmap from '../../packages/mermaid-mindmap/src/detector';
|
||||||
|
import flowV3 from '../../packages/mermaid-flowchart-v3/src/detector';
|
||||||
// import example from '../../packages/mermaid-example-diagram/src/detector';
|
// import example from '../../packages/mermaid-example-diagram/src/detector';
|
||||||
import mermaid from '../../packages/mermaid/src/mermaid';
|
import mermaid from '../../packages/mermaid/src/mermaid';
|
||||||
await mermaid.registerExternalDiagrams([mindmap]);
|
await mermaid.registerExternalDiagrams([mindmap, flowV3]);
|
||||||
mermaid.parseError = function (err, hash) {
|
mermaid.parseError = function (err, hash) {
|
||||||
// console.error('Mermaid error: ', err);
|
// console.error('Mermaid error: ', err);
|
||||||
};
|
};
|
||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
theme: 'default',
|
// theme: 'forest',
|
||||||
startOnLoad: true,
|
startOnLoad: true,
|
||||||
logLevel: 0,
|
logLevel: 0,
|
||||||
flowchart: {
|
flowchart: {
|
||||||
|
// defaultRenderer: 'elk',
|
||||||
useMaxWidth: false,
|
useMaxWidth: false,
|
||||||
htmlLabels: true,
|
htmlLabels: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
@@ -14,7 +18,7 @@
|
|||||||
body {
|
body {
|
||||||
/* background: rgb(221, 208, 208); */
|
/* background: rgb(221, 208, 208); */
|
||||||
/* background:#333; */
|
/* background:#333; */
|
||||||
font-family: 'Courier New', Courier, monospace;
|
font-family: 'Arial';
|
||||||
/* font-size: 18px !important; */
|
/* font-size: 18px !important; */
|
||||||
}
|
}
|
||||||
h1 {
|
h1 {
|
||||||
@@ -23,235 +27,77 @@
|
|||||||
.mermaid2 {
|
.mermaid2 {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.mermaid {
|
.mermaid svg {
|
||||||
border: 1px solid red;
|
|
||||||
font-family: 'Courier New', Courier, monospace;
|
|
||||||
/* font-size: 18px !important; */
|
/* font-size: 18px !important; */
|
||||||
|
background-color: #eee;
|
||||||
|
background-image: radial-gradient(#fff 1%, transparent 11%),
|
||||||
|
radial-gradient(#fff 1%, transparent 11%);
|
||||||
|
background-size: 20px 20px;
|
||||||
|
background-position: 0 0, 10px 10px;
|
||||||
|
background-repeat: repeat;
|
||||||
|
}
|
||||||
|
.malware {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 150px;
|
||||||
|
background: red;
|
||||||
|
color: black;
|
||||||
|
display: flex;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 72px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div>info below</div>
|
<div>Security check</div>
|
||||||
<div class="">
|
<pre id="diagram" class="mermaid">
|
||||||
<pre class="mermaid2" style="width: 100%; height: 400px">
|
|
||||||
flowchart TB;subgraph "number as labels";1;end;
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="width: 100%; height: 400px">
|
|
||||||
flowchart TB;a[APA];
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="margin-left: 100px">
|
|
||||||
graph TD
|
|
||||||
work --> sleep
|
|
||||||
sleep --> work
|
|
||||||
eat --> sleep
|
|
||||||
work --> eat
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="margin-left: 100px">
|
|
||||||
flowchart TD
|
|
||||||
work --> sleep
|
|
||||||
sleep --> work
|
|
||||||
eat --> sleep
|
|
||||||
work --> eat
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
graph TB
|
|
||||||
A
|
|
||||||
B
|
|
||||||
subgraph foo[Foo SubGraph]
|
|
||||||
C
|
|
||||||
D
|
|
||||||
end
|
|
||||||
subgraph bar[Bar SubGraph]
|
|
||||||
E
|
|
||||||
F
|
|
||||||
end
|
|
||||||
G
|
|
||||||
|
|
||||||
A-->B
|
|
||||||
B-->C
|
|
||||||
C-->D
|
|
||||||
B-->D
|
|
||||||
D-->E
|
|
||||||
E-->A
|
|
||||||
E-->F
|
|
||||||
F-->D
|
|
||||||
F-->G
|
|
||||||
B-->G
|
|
||||||
G-->D
|
|
||||||
|
|
||||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred
|
|
||||||
style bar fill:#999,stroke-width:2px,stroke:#0F0,color:blue
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
graph TB
|
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
|
||||||
A
|
|
||||||
B
|
|
||||||
subgraph foo[Foo SubGraph]
|
|
||||||
C
|
|
||||||
D
|
|
||||||
end
|
|
||||||
subgraph bar[Bar SubGraph]
|
|
||||||
E
|
|
||||||
F
|
|
||||||
end
|
|
||||||
G
|
|
||||||
|
|
||||||
A-->B
|
|
||||||
B-->C
|
|
||||||
C-->D
|
|
||||||
B-->D
|
|
||||||
D-->E
|
|
||||||
E-->A
|
|
||||||
E-->F
|
|
||||||
F-->D
|
|
||||||
F-->G
|
|
||||||
B-->G
|
|
||||||
G-->D
|
|
||||||
|
|
||||||
style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred
|
|
||||||
style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
graph TD
|
graph TD
|
||||||
A[Christmas] ==> D
|
A["test"] --"<p><style> * { display : none}</style>test</p>"--> B
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
</pre>
|
||||||
A[Christmas] ==> C
|
|
||||||
</pre>
|
<!-- <div id="cy"></div> -->
|
||||||
<pre class="mermaid2" style="">
|
<!-- <script src="http://localhost:9000/packages/mermaid-mindmap/dist/mermaid-mindmap-detector.js"></script> -->
|
||||||
graph TD
|
<!-- <script src="./mermaid-example-diagram-detector.js"></script> -->
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
<!-- <script src="//cdn.jsdelivr.net/npm/mermaid@9.1.7/dist/mermaid.min.js"></script> -->
|
||||||
A[Christmas] ==> D
|
<!-- <script src="./mermaid.js"></script> -->
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
A[Christmas] ==> C
|
<script type="module">
|
||||||
</pre>
|
import mindmap from '../../packages/mermaid-mindmap/src/detector';
|
||||||
<pre class="mermaid2" style="">
|
// import example from '../../packages/mermaid-example-diagram/src/detector';
|
||||||
flowchart TD
|
import mermaid from '../../packages/mermaid/src/mermaid';
|
||||||
A[Christmas] ==> D
|
await mermaid.registerExternalDiagrams([mindmap]);
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
A[Christmas] ==> C
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
flowchart TD
|
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
|
||||||
A[Christmas] ==> D
|
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
A[Christmas] ==> C
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
flowchart LR
|
|
||||||
a["<strong>Haiya</strong>"]---->b
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid" style="">
|
|
||||||
flowchart LR
|
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
|
||||||
a["<strong>Haiya</strong>"]---->b
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
flowchart TD
|
|
||||||
A[Christmas] ==> D
|
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
A[Christmas] ==> C
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
flowchart TD
|
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
|
||||||
A[Christmas] ==> D
|
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
A[Christmas] ==> C
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
%%{init: { "logLevel": 1, "flowchart": {"htmlLabels":true }} }%%
|
|
||||||
classDiagram-v2
|
|
||||||
Class01 <|-- AveryLongClass : Cool
|
|
||||||
<<interface>> Class01
|
|
||||||
Class03 *-- Class04
|
|
||||||
Class05 o-- Class06
|
|
||||||
Class07 .. Class08
|
|
||||||
Class09 --> C2 : Where am i?
|
|
||||||
Class09 --* C3
|
|
||||||
Class09 --|> Class07
|
|
||||||
Class12 <|.. Class08
|
|
||||||
Class11 ..>Class12
|
|
||||||
Class07 : equals()
|
|
||||||
Class07 : Object[] elementData
|
|
||||||
Class01 : size()
|
|
||||||
Class01 : int chimp
|
|
||||||
Class01 : int gorilla
|
|
||||||
Class01 : -int privateChimp
|
|
||||||
Class01 : +int publicGorilla
|
|
||||||
Class01 : #int protectedMarmoset
|
|
||||||
Class08 <--> C2: Cool label
|
|
||||||
class Class10 {
|
|
||||||
<<service>>
|
|
||||||
int id
|
|
||||||
test()
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid2" style="">
|
|
||||||
classDiagram-v2
|
|
||||||
Class01 <|-- AveryLongClass : Cool
|
|
||||||
<<interface>> Class01
|
|
||||||
Class03 *-- Class04
|
|
||||||
Class05 o-- Class06
|
|
||||||
Class07 .. Class08
|
|
||||||
Class09 --> C2 : Where am i?
|
|
||||||
Class09 --* C3
|
|
||||||
Class09 --|> Class07
|
|
||||||
Class12 <|.. Class08
|
|
||||||
Class11 ..>Class12
|
|
||||||
Class07 : equals()
|
|
||||||
Class07 : Object[] elementData
|
|
||||||
Class01 : size()
|
|
||||||
Class01 : int chimp
|
|
||||||
Class01 : int gorilla
|
|
||||||
Class01 : -int privateChimp
|
|
||||||
Class01 : +int publicGorilla
|
|
||||||
Class01 : #int protectedMarmoset
|
|
||||||
Class08 <--> C2: Cool label
|
|
||||||
class Class10 {
|
|
||||||
<<service>>
|
|
||||||
int id
|
|
||||||
test()
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
<pre class="mermaid" style="">
|
|
||||||
flowchart BT
|
|
||||||
subgraph S1
|
|
||||||
sub1 -->sub2
|
|
||||||
end
|
|
||||||
subgraph S2
|
|
||||||
sub4
|
|
||||||
end
|
|
||||||
S1 --> S2
|
|
||||||
sub1 --> sub4
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
<script src="./mermaid.js"></script>
|
|
||||||
<script>
|
|
||||||
mermaid.parseError = function (err, hash) {
|
mermaid.parseError = function (err, hash) {
|
||||||
// console.error('Mermaid error: ', err);
|
// console.error('Mermaid error: ', err);
|
||||||
};
|
};
|
||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
// theme: 'neutral',
|
theme: 'default',
|
||||||
// arrowMarkerAbsolute: true,
|
startOnLoad: true,
|
||||||
// themeCSS: '.edgePath .path {stroke: red;} .arrowheadPath {fill: red;}',
|
|
||||||
logLevel: 0,
|
logLevel: 0,
|
||||||
flowchart: { curve: 'cardinal', htmlLabels: false },
|
flowchart: {
|
||||||
// htmlLabels: true,
|
useMaxWidth: false,
|
||||||
// gantt: { axisFormat: '%m/%d/%Y' },
|
htmlLabels: true,
|
||||||
// sequence: { actorFontFamily: 'courier', actorMargin: 50, showSequenceNumbers: false },
|
},
|
||||||
// sequenceDiagram: { actorMargin: 300 } // deprecated
|
gantt: {
|
||||||
// fontFamily: '"times", sans-serif',
|
useMaxWidth: false,
|
||||||
fontFamily: 'courier',
|
},
|
||||||
// fontSize: 18,
|
useMaxWidth: false,
|
||||||
// curve: 'cardinal',
|
|
||||||
securityLevel: 'loose',
|
|
||||||
// themeVariables: {relationLabelColor: 'red'}
|
|
||||||
});
|
});
|
||||||
function callback() {
|
function callback() {
|
||||||
alert('It worked');
|
alert('It worked');
|
||||||
}
|
}
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('In parse error:');
|
||||||
|
console.error(err);
|
||||||
|
};
|
||||||
|
// mermaid.test1('first_slow', 1200).then((r) => console.info(r));
|
||||||
|
// mermaid.test1('second_fast', 200).then((r) => console.info(r));
|
||||||
|
// mermaid.test1('third_fast', 200).then((r) => console.info(r));
|
||||||
|
// mermaid.test1('forth_slow', 1200).then((r) => console.info(r));
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 29 KiB |