diff --git a/.esbuild/esbuild.cjs b/.esbuild/esbuild.cjs deleted file mode 100644 index 393dadcf31..0000000000 --- a/.esbuild/esbuild.cjs +++ /dev/null @@ -1,20 +0,0 @@ -const { esmBuild, esmCoreBuild, iifeBuild } = require('./util.cjs'); -const { build } = require('esbuild'); - -const handler = (e) => { - console.error(e); - process.exit(1); -}; -const watch = process.argv.includes('--watch'); - -// mermaid.js -build(iifeBuild({ minify: false, watch })).catch(handler); -// mermaid.esm.mjs -build(esmBuild({ minify: false, watch })).catch(handler); - -// mermaid.min.js -build(iifeBuild()).catch(handler); -// mermaid.esm.min.mjs -build(esmBuild()).catch(handler); -// mermaid.core.mjs (node_modules unbundled) -build(esmCoreBuild()).catch(handler); diff --git a/.esbuild/serve.cjs b/.esbuild/serve.cjs deleted file mode 100644 index 4c06572f3e..0000000000 --- a/.esbuild/serve.cjs +++ /dev/null @@ -1,79 +0,0 @@ -const esbuild = require('esbuild'); -const http = require('http'); -const { iifeBuild, esmBuild } = require('./util.cjs'); -const express = require('express'); - -// Start 2 esbuild servers. One for IIFE and one for ESM -// Serve 2 static directories: demo & cypress/platform -// Have 3 entry points: -// mermaid: './src/mermaid', -// e2e: './cypress/platform/viewer.js', -// 'bundle-test': './cypress/platform/bundle-test.js', - -const getEntryPointsAndExtensions = (format) => { - return { - entryPoints: { - mermaid: './src/mermaid', - e2e: 'cypress/platform/viewer.js', - 'bundle-test': 'cypress/platform/bundle-test.js', - }, - outExtension: { '.js': format === 'iife' ? '.js' : '.esm.mjs' }, - }; -}; - -const generateHandler = (server) => { - return (req, res) => { - const options = { - hostname: server.host, - port: server.port, - path: req.url, - method: req.method, - headers: req.headers, - }; - // Forward each incoming request to esbuild - const proxyReq = http.request(options, (proxyRes) => { - // If esbuild returns "not found", send a custom 404 page - if (proxyRes.statusCode === 404) { - if (!req.url.endsWith('.html')) { - res.writeHead(404, { 'Content-Type': 'text/html' }); - res.end('

A custom 404 page

'); - return; - } - } - // Otherwise, forward the response from esbuild to the client - res.writeHead(proxyRes.statusCode, proxyRes.headers); - proxyRes.pipe(res, { end: true }); - }); - // Forward the body of the request to esbuild - req.pipe(proxyReq, { end: true }); - }; -}; - -(async () => { - const iifeServer = await esbuild.serve( - {}, - { - ...iifeBuild({ minify: false, outfile: undefined, outdir: 'dist' }), - ...getEntryPointsAndExtensions('iife'), - } - ); - const esmServer = await esbuild.serve( - {}, - { - ...esmBuild({ minify: false, outfile: undefined, outdir: 'dist' }), - ...getEntryPointsAndExtensions('esm'), - } - ); - const app = express(); - - app.use(express.static('demos')); - app.use(express.static('cypress/platform')); - app.all('/mermaid.js', generateHandler(iifeServer)); - app.all('/mermaid.esm.mjs', generateHandler(esmServer)); - - app.all('/e2e.esm.mjs', generateHandler(esmServer)); - app.all('/bundle-test.esm.mjs', generateHandler(esmServer)); - app.listen(9000, () => { - console.log(`Listening on http://localhost:9000`); - }); -})(); diff --git a/.esbuild/util.cjs b/.esbuild/util.cjs deleted file mode 100644 index 4dbcd01c37..0000000000 --- a/.esbuild/util.cjs +++ /dev/null @@ -1,94 +0,0 @@ -const { transformJison } = require('./jisonTransformer.cjs'); -const fs = require('fs'); -const { dependencies } = require('../package.json'); - -/** @typedef {import('esbuild').BuildOptions} Options */ - -/** - * @param {Options} override - * @returns {Options} - */ -const buildOptions = (override = {}) => { - return { - bundle: true, - minify: true, - keepNames: true, - banner: { js: '"use strict";' }, - globalName: 'mermaid', - platform: 'browser', - tsconfig: 'tsconfig.json', - resolveExtensions: ['.ts', '.js', '.mjs', '.json', '.jison'], - external: ['require', 'fs', 'path'], - entryPoints: ['src/mermaid.ts'], - outfile: 'dist/mermaid.min.js', - plugins: [jisonPlugin], - sourcemap: 'external', - ...override, - }; -}; - -/** - * Build options for mermaid.esm.* build. - * - * For ESM browser use. - * - * @param {Options} override - Override options. - * @returns {Options} ESBuild build options. - */ -exports.esmBuild = (override = { minify: true }) => { - return buildOptions({ - format: 'esm', - outfile: `dist/mermaid.esm${override.minify ? '.min' : ''}.mjs`, - ...override, - }); -}; - -/** - * Build options for mermaid.core.* build. - * - * This build does not bundle `./node_modules/`, as it is designed to be used with - * Webpack/ESBuild/Vite to use mermaid inside an app/website. - * - * @param {Options} override - Override options. - * @returns {Options} ESBuild build options. - */ -exports.esmCoreBuild = (override) => { - return buildOptions({ - format: 'esm', - outfile: `dist/mermaid.core.mjs`, - external: ['require', 'fs', 'path', ...Object.keys(dependencies)], - platform: 'neutral', - ...override, - }); -}; - -/** - * Build options for mermaid.js build. - * - * For IIFE browser use (where ESM is not yet supported). - * - * @param {Options} override - Override options. - * @returns {Options} ESBuild build options. - */ -exports.iifeBuild = (override = { minify: true }) => { - return buildOptions({ - outfile: `dist/mermaid${override.minify ? '.min' : ''}.js`, - format: 'iife', - footer: { - js: 'mermaid = mermaid.default;', - }, - ...override, - }); -}; - -const jisonPlugin = { - name: 'jison', - setup(build) { - build.onLoad({ filter: /\.jison$/ }, async (args) => { - // Load the file from the file system - const source = await fs.promises.readFile(args.path, 'utf8'); - const contents = transformJison(source); - return { contents, warnings: [] }; - }); - }, -}; diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 194f870542..3a7f767d8a 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -37,11 +37,16 @@ jobs: # and run all Cypress tests - name: Cypress run uses: cypress-io/github-action@v3 + # 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 + if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }} with: start: yarn dev wait-on: 'http://localhost:9000' - record: true + # Disable recording if we don't have an API key + # e.g. if this action was run from a fork + record: ${{ secrets.CYPRESS_RECORD_KEY != '' }} + parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }} headless: true - parallel: true env: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} diff --git a/.gitignore b/.gitignore index 9641d25748..6e4fe723a2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,11 @@ token package-lock.json -.vscode/ +# ignore files in /.vscode/ except for launch.json and extensions.json +/.vscode/** +!/.vscode/launch.json +!/.vscode/extensions.json + cypress/platform/current.html cypress/platform/experimental.html local/ diff --git a/.vite/build.ts b/.vite/build.ts new file mode 100644 index 0000000000..c4df49ea24 --- /dev/null +++ b/.vite/build.ts @@ -0,0 +1,89 @@ +import { build, InlineConfig } from 'vite'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import jisonPlugin from './jisonPlugin.js'; +import pkg from '../package.json' assert { type: 'json' }; +type OutputOptions = Exclude< + Exclude['rollupOptions'], + undefined +>['output']; + +const { dependencies } = pkg; +const watch = process.argv.includes('--watch'); +const __dirname = fileURLToPath(new URL('.', import.meta.url)); + +interface BuildOptions { + minify: boolean | 'esbuild'; + core?: boolean; + watch?: boolean; +} + +export const getBuildConfig = ({ minify, core, watch }: BuildOptions): InlineConfig => { + const external = ['require', 'fs', 'path']; + let output: OutputOptions = [ + { + name: 'mermaid', + format: 'esm', + sourcemap: true, + entryFileNames: `[name].esm${minify ? '.min' : ''}.mjs`, + }, + { + name: 'mermaid', + format: 'umd', + sourcemap: true, + entryFileNames: `[name]${minify ? '.min' : ''}.js`, + }, + ]; + + if (core) { + // Core build is used to generate file without bundled dependencies. + // This is used by downstream projects to bundle dependencies themselves. + external.push(...Object.keys(dependencies)); + // This needs to be an array. Otherwise vite will build esm & umd with same name and overwrite esm with umd. + output = [ + { + format: 'esm', + sourcemap: true, + entryFileNames: `[name].core.mjs`, + }, + ]; + } + + const config: InlineConfig = { + configFile: false, + build: { + emptyOutDir: false, + lib: { + entry: resolve(__dirname, '../src/mermaid.ts'), + name: 'mermaid', + // the proper extensions will be added + fileName: 'mermaid', + }, + minify, + rollupOptions: { + external, + output, + }, + }, + resolve: { + extensions: ['.jison', '.js', '.ts', '.json'], + }, + plugins: [jisonPlugin()], + }; + + if (watch && config.build) { + config.build.watch = { + include: 'src/**', + }; + } + + return config; +}; + +if (watch) { + build(getBuildConfig({ minify: false, watch })); +} else { + build(getBuildConfig({ minify: false })); + build(getBuildConfig({ minify: 'esbuild' })); + build(getBuildConfig({ minify: false, core: true })); +} diff --git a/.vite/jisonPlugin.ts b/.vite/jisonPlugin.ts new file mode 100644 index 0000000000..c211907841 --- /dev/null +++ b/.vite/jisonPlugin.ts @@ -0,0 +1,17 @@ +import { transformJison } from './jisonTransformer.js'; +const fileRegex = /\.(jison)$/; + +export default function jison() { + return { + name: 'jison', + + transform(src: string, id: string) { + if (fileRegex.test(id)) { + return { + code: transformJison(src), + map: null, // provide source map if available + }; + } + }, + }; +} diff --git a/.esbuild/jisonTransformer.cjs b/.vite/jisonTransformer.ts similarity index 55% rename from .esbuild/jisonTransformer.cjs rename to .vite/jisonTransformer.ts index 5f89c6647b..a5734e1259 100644 --- a/.esbuild/jisonTransformer.cjs +++ b/.vite/jisonTransformer.ts @@ -1,6 +1,9 @@ -const { Generator } = require('jison'); -exports.transformJison = (src) => { - const parser = new Generator(src, { +// @ts-ignore No typings for jison +import jison from 'jison'; + +export const transformJison = (src: string): string => { + // @ts-ignore No typings for jison + const parser = new jison.Generator(src, { moduleType: 'js', 'token-stack': true, }); diff --git a/.vite/server.ts b/.vite/server.ts new file mode 100644 index 0000000000..4cadc07cb7 --- /dev/null +++ b/.vite/server.ts @@ -0,0 +1,26 @@ +import express from 'express'; +import { createServer as createViteServer } from 'vite'; +// import { getBuildConfig } from './build'; + +async function createServer() { + const app = express(); + + // Create Vite server in middleware mode + const vite = await createViteServer({ + configFile: './vite.config.ts', + server: { middlewareMode: true }, + appType: 'custom', // don't include Vite's default HTML handling middlewares + }); + + app.use(vite.middlewares); + app.use(express.static('dist')); + app.use(express.static('demos')); + app.use(express.static('cypress/platform')); + + app.listen(9000, () => { + console.log(`Listening on http://localhost:9000`); + }); +} + +// build(getBuildConfig({ minify: false, watch: true })); +createServer(); diff --git a/.vite/tsconfig.json b/.vite/tsconfig.json new file mode 100644 index 0000000000..915436da1e --- /dev/null +++ b/.vite/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "ES2022" + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..9633bed665 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "zixuanchen.vitest-explorer", + "luniclynx.bison" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..92df7056e1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug Current Test File", + "autoAttachChildProcesses": true, + "skipFiles": ["/**", "**/node_modules/**"], + "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs", + "args": ["run", "${relativeFile}"], + "smartStep": true, + "console": "integratedTerminal" + } + ] +} diff --git a/cypress/helpers/util.js b/cypress/helpers/util.js index d138dfcfef..bee9a59f0b 100644 --- a/cypress/helpers/util.js +++ b/cypress/helpers/util.js @@ -1,4 +1,6 @@ -import { Base64 } from 'js-base64'; +const utf8ToB64 = (str) => { + return window.btoa(unescape(encodeURIComponent(str))); +}; export const mermaidUrl = (graphStr, options, api) => { const obj = { @@ -6,7 +8,7 @@ export const mermaidUrl = (graphStr, options, api) => { mermaid: options, }; const objStr = JSON.stringify(obj); - let url = 'http://localhost:9000/e2e.html?graph=' + Base64.encodeURI(objStr); + let url = 'http://localhost:9000/e2e.html?graph=' + utf8ToB64(objStr); if (api) { url = 'http://localhost:9000/xss.html?graph=' + graphStr; } diff --git a/cypress/integration/other/xss.spec.js b/cypress/integration/other/xss.spec.js index 4911dd8df5..76b2c47f2c 100644 --- a/cypress/integration/other/xss.spec.js +++ b/cypress/integration/other/xss.spec.js @@ -15,7 +15,7 @@ describe('XSS', () => { it('should not allow tags in the css', () => { const str = - 'eyJjb2RlIjoiJSV7aW5pdDogeyAnZm9udEZhbWlseSc6ICdcXFwiPjwvc3R5bGU-PGltZyBzcmM9eCBvbmVycm9yPXhzc0F0dGFjaygpPid9IH0lJVxuZ3JhcGggTFJcbiAgICAgQSAtLT4gQiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0IiwiZmxvd2NoYXJ0Ijp7Imh0bWxMYWJlbHMiOmZhbHNlfX0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9'; + 'eyJjb2RlIjoiJSV7aW5pdDogeyAnZm9udEZhbWlseSc6ICdcXFwiPjwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPXhzc0F0dGFjaygpPid9IH0lJVxuZ3JhcGggTFJcbiAgICAgQSAtLT4gQiIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0IiwiZmxvd2NoYXJ0Ijp7Imh0bWxMYWJlbHMiOmZhbHNlfX0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9'; const url = mermaidUrl( str, diff --git a/cypress/platform/bundle-test.js b/cypress/platform/bundle-test.js index 373f8741a0..074dd8c635 100644 --- a/cypress/platform/bundle-test.js +++ b/cypress/platform/bundle-test.js @@ -1,4 +1,4 @@ -import mermaid from '../../dist/mermaid.core'; +import mermaid from '../../src/mermaid'; let code = `flowchart LR Power_Supply --> Transmitter_A diff --git a/cypress/platform/e2e.html b/cypress/platform/e2e.html index a239113345..c686afc886 100644 --- a/cypress/platform/e2e.html +++ b/cypress/platform/e2e.html @@ -2,7 +2,7 @@ - + + diff --git a/cypress/platform/xss.html b/cypress/platform/xss.html index 2d3661a4e8..39b985ccc1 100644 --- a/cypress/platform/xss.html +++ b/cypress/platform/xss.html @@ -1,6 +1,6 @@ - + + + + +
+    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.")
+          Person(customerB, "Banking Customer B")
+          Person_Ext(customerC, "Banking Customer C", "desc")
+
+          Person(customerD, "Banking Customer D", "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") { + + SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") + + System_Boundary(b2, "BankBoundary2") { + System(SystemA, "Banking System A") + System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.") + } + + System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") + SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") + + Boundary(b3, "BankBoundary3", "boundary") { + SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.") + SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") + } + } + } + + BiRel(customerA, SystemAA, "Uses") + BiRel(SystemAA, SystemE, "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(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10") + UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50") + UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20") + + UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") +
+ +
+    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")
+        Container_Ext(mobile_app, "Mobile App", "C#, Xamarin", "Provides a limited subset of the Internet banking functionality to customers via their mobile device")
+        Container(web_app, "Web Application", "Java, Spring MVC", "Delivers the static content and the Internet banking SPA")
+        ContainerDb(database, "Database", "SQL Database", "Stores user registration information, hashed auth credentials, access logs, etc.")
+        ContainerDb_Ext(backend_api, "API Application", "Java, Docker Container", "Provides Internet banking functionality via API")
+
+    }
+
+    System_Ext(banking_system, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
+
+    Rel(customer, web_app, "Uses", "HTTPS")
+    UpdateRelStyle(customer, web_app, $offsetY="60", $offsetX="90")     
+    Rel(customer, spa, "Uses", "HTTPS")
+    UpdateRelStyle(customer, spa, $offsetY="-40")    
+    Rel(customer, mobile_app, "Uses")
+    UpdateRelStyle(customer, mobile_app, $offsetY="-30") 
+
+    Rel(web_app, spa, "Delivers")
+    UpdateRelStyle(web_app, spa, $offsetX="130") 
+    Rel(spa, backend_api, "Uses", "async, JSON/HTTPS")
+    Rel(mobile_app, backend_api, "Uses", "async, JSON/HTTPS")
+    Rel_Back(database, backend_api, "Reads from and writes to", "sync, JDBC")
+
+    Rel(email_system, customer, "Sends e-mails to")
+    UpdateRelStyle(email_system, customer, $offsetX="-45")    
+    Rel(backend_api, email_system, "Sends e-mails using", "sync, SMTP")
+    UpdateRelStyle(backend_api, email_system, $offsetY="-60")    
+    Rel(backend_api, banking_system, "Uses", "sync/async, XML/HTTPS")
+    UpdateRelStyle(backend_api, banking_system, $offsetY="-50", $offsetX="-140")
+    
+ +
+    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(ma, "Mobile App", "Xamarin", "Provides a limited subset ot the internet banking functionality to customers via their mobile mobile device.")
+    ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.")
+    System_Ext(mbs, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
+
+    Container_Boundary(api, "API Application") {
+        Component(sign, "Sign In Controller", "MVC Rest Controller", "Allows users to sign in to the internet banking system")
+        Component(accounts, "Accounts Summary Controller", "MVC Rest Controller", "Provides customers with a summary of their bank accounts")
+        Component(security, "Security Component", "Spring Bean", "Provides functionality related to singing in, changing passwords, etc.")
+        Component(mbsfacade, "Mainframe Banking System Facade", "Spring Bean", "A facade onto the mainframe banking system.")
+
+        Rel(sign, security, "Uses")
+        Rel(accounts, mbsfacade, "Uses")
+        Rel(security, db, "Read & write to", "JDBC")
+        Rel(mbsfacade, mbs, "Uses", "XML/HTTPS")
+    }
+
+    Rel_Back(spa, sign, "Uses", "JSON/HTTPS")
+    Rel(spa, accounts, "Uses", "JSON/HTTPS")
+
+    Rel(ma, sign, "Uses", "JSON/HTTPS")
+    Rel(ma, accounts, "Uses", "JSON/HTTPS")
+
+    UpdateRelStyle(spa, sign, $offsetY="-40") 
+    UpdateRelStyle(spa, accounts, $offsetX="40", $offsetY="40")
+
+    UpdateRelStyle(ma, sign, $offsetX="-90", $offsetY="40")
+    UpdateRelStyle(ma, accounts, $offsetY="-40")
+
+        UpdateRelStyle(sign, security, $offsetX="-160", $offsetY="10")
+        UpdateRelStyle(accounts, mbsfacade, $offsetX="140", $offsetY="10")
+        UpdateRelStyle(security, db, $offsetY="-40")
+        UpdateRelStyle(mbsfacade, mbs, $offsetY="-40")
+    
+ +
+    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")
+    
+ +
+    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(comp, "Customer's computer", "Mircosoft Windows or Apple macOS"){
+        Deployment_Node(browser, "Web Browser", "Google Chrome, Mozilla Firefox,
Apple Safari or Microsoft Edge"){ + Container(spa, "Single Page Application", "JavaScript and Angular", "Provides all of the Internet Banking functionality to customers via their web browser.") + } + } + + 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.") + } + } + Deployment_Node(bb2, "bigbank-web*** x4", "Ubuntu 16.04 LTS"){ + Deployment_Node(apache2, "Apache Tomcat", "Apache Tomcat 8.x"){ + Container(web, "Web Application", "Java and Spring MVC", "Delivers the static content and the Internet Banking single page application.") + } + } + Deployment_Node(bigbankdb01, "bigbank-db01", "Ubuntu 16.04 LTS"){ + Deployment_Node(oracle, "Oracle - Primary", "Oracle 12c"){ + ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") + } + } + Deployment_Node(bigbankdb02, "bigbank-db02", "Ubuntu 16.04 LTS") { + Deployment_Node(oracle2, "Oracle - Secondary", "Oracle 12c") { + ContainerDb(db2, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") + } + } + } + + Rel(mobile, api, "Makes API calls to", "json/HTTPS") + Rel(spa, api, "Makes API calls to", "json/HTTPS") + Rel_U(web, spa, "Delivers to the customer's web browser") + Rel(api, db, "Reads from and writes to", "JDBC") + Rel(api, db2, "Reads from and writes to", "JDBC") + Rel_R(db, db2, "Replicates data to") + + UpdateRelStyle(spa, api, $offsetY="-40") + UpdateRelStyle(web, spa, $offsetY="-40") + UpdateRelStyle(api, db, $offsetY="-20", $offsetX="5") + UpdateRelStyle(api, db2, $offsetX="-40", $offsetY="-20") + UpdateRelStyle(db, db2, $offsetY="-10") +
+ +
+ + + + + + + diff --git a/demos/classchart.html b/demos/classchart.html index ebc3fe0a5c..e15495b95c 100644 --- a/demos/classchart.html +++ b/demos/classchart.html @@ -3,7 +3,7 @@ - Mermaid Quick Test Page + Class diagrams Mermaid Quick Test Page + + + +
+    gitGraph:
+    options
+    {
+    "nodeSpacing": 50,
+    "nodeRadius": 5
+    }
+    end
+    branch master
+    commit
+    branch newbranch
+    checkout newbranch
+    commit
+    commit
+    checkout master
+    commit
+    commit
+    merge newbranch
+    
+ + + + + diff --git a/demos/index.html b/demos/index.html index 8ef343ef17..f0ddb6ac37 100644 --- a/demos/index.html +++ b/demos/index.html @@ -14,999 +14,43 @@ -
-    info
-    
- -
- -
-    C4Context
-      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.")
-      Person(customerB, "Banking Customer B")      
-      Person_Ext(customerC, "Banking Customer C", "desc")            
-
-      Person(customerD, "Banking Customer D", "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") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts. next line.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } - } - } - - BiRel(customerA, SystemAA, "Uses") - BiRel(SystemAA, SystemE, "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(SystemAA, SystemE, $textColor="blue", $lineColor="blue", $offsetY="-10") - UpdateRelStyle(SystemAA, SystemC, $textColor="blue", $lineColor="blue", $offsetY="-40", $offsetX="-50") - UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20") - - UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") -
- -
-    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")
-        Container_Ext(mobile_app, "Mobile App", "C#, Xamarin", "Provides a limited subset of the Internet banking functionality to customers via their mobile device")
-        Container(web_app, "Web Application", "Java, Spring MVC", "Delivers the static content and the Internet banking SPA")
-        ContainerDb(database, "Database", "SQL Database", "Stores user registration information, hashed auth credentials, access logs, etc.")
-        ContainerDb_Ext(backend_api, "API Application", "Java, Docker Container", "Provides Internet banking functionality via API")
-
-    }
-
-    System_Ext(banking_system, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
-
-    Rel(customer, web_app, "Uses", "HTTPS")
-    UpdateRelStyle(customer, web_app, $offsetY="60", $offsetX="90")     
-    Rel(customer, spa, "Uses", "HTTPS")
-    UpdateRelStyle(customer, spa, $offsetY="-40")    
-    Rel(customer, mobile_app, "Uses")
-    UpdateRelStyle(customer, mobile_app, $offsetY="-30") 
-
-    Rel(web_app, spa, "Delivers")
-    UpdateRelStyle(web_app, spa, $offsetX="130") 
-    Rel(spa, backend_api, "Uses", "async, JSON/HTTPS")
-    Rel(mobile_app, backend_api, "Uses", "async, JSON/HTTPS")
-    Rel_Back(database, backend_api, "Reads from and writes to", "sync, JDBC")
-
-    Rel(email_system, customer, "Sends e-mails to")
-    UpdateRelStyle(email_system, customer, $offsetX="-45")    
-    Rel(backend_api, email_system, "Sends e-mails using", "sync, SMTP")
-    UpdateRelStyle(backend_api, email_system, $offsetY="-60")    
-    Rel(backend_api, banking_system, "Uses", "sync/async, XML/HTTPS")
-    UpdateRelStyle(backend_api, banking_system, $offsetY="-50", $offsetX="-140")
-    
- -
-    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(ma, "Mobile App", "Xamarin", "Provides a limited subset ot the internet banking functionality to customers via their mobile mobile device.")
-    ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.")
-    System_Ext(mbs, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
-
-    Container_Boundary(api, "API Application") {
-        Component(sign, "Sign In Controller", "MVC Rest Controller", "Allows users to sign in to the internet banking system")
-        Component(accounts, "Accounts Summary Controller", "MVC Rest Controller", "Provides customers with a summary of their bank accounts")
-        Component(security, "Security Component", "Spring Bean", "Provides functionality related to singing in, changing passwords, etc.")
-        Component(mbsfacade, "Mainframe Banking System Facade", "Spring Bean", "A facade onto the mainframe banking system.")
-
-        Rel(sign, security, "Uses")
-        Rel(accounts, mbsfacade, "Uses")
-        Rel(security, db, "Read & write to", "JDBC")
-        Rel(mbsfacade, mbs, "Uses", "XML/HTTPS")
-    }
-
-    Rel_Back(spa, sign, "Uses", "JSON/HTTPS")
-    Rel(spa, accounts, "Uses", "JSON/HTTPS")
-
-    Rel(ma, sign, "Uses", "JSON/HTTPS")
-    Rel(ma, accounts, "Uses", "JSON/HTTPS")
-
-    UpdateRelStyle(spa, sign, $offsetY="-40") 
-    UpdateRelStyle(spa, accounts, $offsetX="40", $offsetY="40")
-
-    UpdateRelStyle(ma, sign, $offsetX="-90", $offsetY="40")
-    UpdateRelStyle(ma, accounts, $offsetY="-40")
-
-        UpdateRelStyle(sign, security, $offsetX="-160", $offsetY="10")
-        UpdateRelStyle(accounts, mbsfacade, $offsetX="140", $offsetY="10")
-        UpdateRelStyle(security, db, $offsetY="-40")
-        UpdateRelStyle(mbsfacade, mbs, $offsetY="-40")
-    
- -
-    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")
-    
- -
-    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(comp, "Customer's computer", "Mircosoft Windows or Apple macOS"){
-        Deployment_Node(browser, "Web Browser", "Google Chrome, Mozilla Firefox,
Apple Safari or Microsoft Edge"){ - Container(spa, "Single Page Application", "JavaScript and Angular", "Provides all of the Internet Banking functionality to customers via their web browser.") - } - } - - 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.") - } - } - Deployment_Node(bb2, "bigbank-web*** x4", "Ubuntu 16.04 LTS"){ - Deployment_Node(apache2, "Apache Tomcat", "Apache Tomcat 8.x"){ - Container(web, "Web Application", "Java and Spring MVC", "Delivers the static content and the Internet Banking single page application.") - } - } - Deployment_Node(bigbankdb01, "bigbank-db01", "Ubuntu 16.04 LTS"){ - Deployment_Node(oracle, "Oracle - Primary", "Oracle 12c"){ - ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") - } - } - Deployment_Node(bigbankdb02, "bigbank-db02", "Ubuntu 16.04 LTS") { - Deployment_Node(oracle2, "Oracle - Secondary", "Oracle 12c") { - ContainerDb(db2, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") - } - } - } - - Rel(mobile, api, "Makes API calls to", "json/HTTPS") - Rel(spa, api, "Makes API calls to", "json/HTTPS") - Rel_U(web, spa, "Delivers to the customer's web browser") - Rel(api, db, "Reads from and writes to", "JDBC") - Rel(api, db2, "Reads from and writes to", "JDBC") - Rel_R(db, db2, "Replicates data to") - - UpdateRelStyle(spa, api, $offsetY="-40") - UpdateRelStyle(web, spa, $offsetY="-40") - UpdateRelStyle(api, db, $offsetY="-20", $offsetX="5") - UpdateRelStyle(api, db2, $offsetX="-40", $offsetY="-20") - UpdateRelStyle(db, db2, $offsetY="-10") -
- -
- -
-    pie
-      title Key elements in Product X
-      accDescription This is a pie chart showing the key elements in Product X.
-      "Calcium" : 42.96
-      "Potassium" : 50.05
-      "Magnesium" : 10.01
-      "Iron" :  5
-    
- -
-    gantt
-      title Airworks roadmap
-      dateFormat YYYY-MM-DD
-      axisFormat %m-%d %a
-      excludes	weekends, 2021-10-01,2021-10-04,2021-10-05,2021-10-06,2021-10-07
-      includes 2021-10-09
-
-      section Airworks 3.4.1
-      开发	:b, 2021-10-07, 5d
-      测试	:after b, 4d
-      OK  :milestore
-      section Airworks 3.4.2
-      开发	:a, 2021-10-09, 4d
-      测试	:after a, 4d
-    
-
-    gantt
-    title Exclusive end dates (Manual date should end on 3d)
-    dateFormat YYYY-MM-DD
-    axisFormat %d
-    section Section1
-    2 Days: 1, 2019-01-01,2d
-    Manual Date: 2, 2019-01-01,2019-01-03
-    
-
-    gantt
-    title Inclusive end dates (Manual date should end on 4th)
-    dateFormat YYYY-MM-DD
-    axisFormat %d
-    inclusiveEndDates
-    section Section1
-    2 Days: 1, 2019-01-01,2d
-    Manual Date: 2, 2019-01-01,2019-01-03
-    
-
-    gantt
-    title Hide today marker (vertical line should not be visible)
-    dateFormat YYYY-MM-DD
-    axisFormat %d
-    todayMarker off
-    section Section1
-    Today: 1, -1h
-    
-
-    gantt
-    title Style today marker (vertical line should be 5px wide and half-transparent blue)
-    dateFormat YYYY-MM-DD
-    axisFormat %d
-    todayMarker stroke-width:5px,stroke:#00f,opacity:0.5
-    section Section1
-    Today: 1, -1h
-    
- -
- -
-    graph LR
-    sid-B3655226-6C29-4D00-B685-3D5C734DC7E1["
-
-    提交申请
-    熊大
-    "];
-    class sid-B3655226-6C29-4D00-B685-3D5C734DC7E1 node-executed;
-    sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A["
-    负责人审批
-    强子
-    "];
-    class sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A node-executed;
-    sid-E27C0367-E6D6-497F-9736-3CDC21FDE221["
-    DBA审批
-    强子
-    "];
-    class sid-E27C0367-E6D6-497F-9736-3CDC21FDE221 node-executed;
-    sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD["
-    SA审批
-    阿美
-    "];
-    class sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD node-executed;
-    sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7["
-    主管审批
-    光头强
-    "];
-    class sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7 node-executed;
-    sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89["
-    DBA确认
-    强子
-    "];
-    class sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89 node-executed;
-    sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937["
-    SA确认
-    阿美
-    "];
-    class sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937 node-executed;
-    sid-4FC27B48-A6F9-460A-A675-021F5854FE22["
-    结束
-    "];
-    class sid-4FC27B48-A6F9-460A-A675-021F5854FE22 node-executed;
-    sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E["
-    SA执行1
-    强子
-    "];
-    class sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E node-executed;
-    sid-6C2120F3-D940-4958-A067-0903DCE879C4["
-    SA执行2
-    强子
-    "];
-    class sid-6C2120F3-D940-4958-A067-0903DCE879C4 node-executed;
-    sid-9180E2A0-5C4B-435F-B42F-0D152470A338["
-    DBA执行1
-    强子
-    "];
-    class sid-9180E2A0-5C4B-435F-B42F-0D152470A338 node-executed;
-    sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD["
-    DBA执行3
-    强子
-    "];
-    class sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD node-executed;
-    sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756["
-    DBA执行2
-    强子
-    "];
-    class sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756 node-executed;
-    sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93["
-    DBA执行4
-    强子
-    "];
-    class sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93 node-executed;
-    sid-1897B30A-9C5C-4D5B-B80B-76A038785070["
-    负责人确认
-    梁静茹
-    "];
-    class sid-1897B30A-9C5C-4D5B-B80B-76A038785070 node-executed;
-    sid-B3655226-6C29-4D00-B685-3D5C734DC7E1-->sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7;
-    sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A-->sid-1897B30A-9C5C-4D5B-B80B-76A038785070;
-    sid-E27C0367-E6D6-497F-9736-3CDC21FDE221-->sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89;
-    sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD-->sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937;
-    sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E-->sid-6C2120F3-D940-4958-A067-0903DCE879C4;
-    sid-9180E2A0-5C4B-435F-B42F-0D152470A338-->sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756;
-    sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD-->sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93;
-    sid-6C2120F3-D940-4958-A067-0903DCE879C4-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
-    sid-1897B30A-9C5C-4D5B-B80B-76A038785070-->sid-4FC27B48-A6F9-460A-A675-021F5854FE22;
-    sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937-->sid-19DD9E9F-98C1-44EE-B604-842AFEE76F1E;
-    sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89-->sid-9180E2A0-5C4B-435F-B42F-0D152470A338;
-    sid-A1B3CD96-7697-4D7C-BEAA-73D187B1BE89-->sid-03A2C3AC-5337-48A5-B154-BB3FD0EC8DAD;
-    sid-D5E1F2F4-306C-47A2-BF74-F66E3D769756-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
-    sid-8C3F2F1D-F014-4F99-B966-095DC1A2BD93-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
-    sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-BED98281-9585-4D1B-934E-BD1AC6AC0EFD;
-    sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-E27C0367-E6D6-497F-9736-3CDC21FDE221;
-    sid-3E35A7FF-A2F4-4E07-9247-DBF884C81937-->sid-6C2120F3-D940-4958-A067-0903DCE879C4;
-    sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A;
-    sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4FC27B48-A6F9-460A-A675-021F5854FE22;
-    
-
-    graph TD
-    A[Christmas] -->|Get money| B(Go shopping)
-    B --> C{Let me thinksssssx
sssssssssssssssssssuuu
tttsssssssssssssssssssssss} - C -->|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[Car] -
-
-    graph TD
-    A[/Christmas\]
-    A -->|Get money| B[\Go shopping/]
-    B --> C{Let me thinksssss
ssssssssssssssssssssss
sssssssssssssssssssssssssss} - C -->|One| D[/Laptop/] - C -->|Two| E[\iPhone\] - C -->|Three| F[Car] -
-
-    graph LR
-    47(SAM.CommonFA.FMESummary)-->48(SAM.CommonFA.CommonFAFinanceBudget)
-    37(SAM.CommonFA.BudgetSubserviceLineVolume)-->48(SAM.CommonFA.CommonFAFinanceBudget)
-    35(SAM.CommonFA.PopulationFME)-->47(SAM.CommonFA.FMESummary)
-    41(SAM.CommonFA.MetricCost)-->47(SAM.CommonFA.FMESummary)
-    44(SAM.CommonFA.MetricOutliers)-->47(SAM.CommonFA.FMESummary)
-    46(SAM.CommonFA.MetricOpportunity)-->47(SAM.CommonFA.FMESummary)
-    40(SAM.CommonFA.OPVisits)-->47(SAM.CommonFA.FMESummary)
-    38(SAM.CommonFA.CommonFAFinanceRefund)-->47(SAM.CommonFA.FMESummary)
-    43(SAM.CommonFA.CommonFAFinancePicuDays)-->47(SAM.CommonFA.FMESummary)
-    42(SAM.CommonFA.CommonFAFinanceNurseryDays)-->47(SAM.CommonFA.FMESummary)
-    45(SAM.CommonFA.MetricPreOpportunity)-->46(SAM.CommonFA.MetricOpportunity)
-    35(SAM.CommonFA.PopulationFME)-->45(SAM.CommonFA.MetricPreOpportunity)
-    41(SAM.CommonFA.MetricCost)-->45(SAM.CommonFA.MetricPreOpportunity)
-    41(SAM.CommonFA.MetricCost)-->44(SAM.CommonFA.MetricOutliers)
-    39(SAM.CommonFA.ChargeDetails)-->43(SAM.CommonFA.CommonFAFinancePicuDays)
-    39(SAM.CommonFA.ChargeDetails)-->42(SAM.CommonFA.CommonFAFinanceNurseryDays)
-    39(SAM.CommonFA.ChargeDetails)-->41(SAM.CommonFA.MetricCost)
-    39(SAM.CommonFA.ChargeDetails)-->40(SAM.CommonFA.OPVisits)
-    35(SAM.CommonFA.PopulationFME)-->39(SAM.CommonFA.ChargeDetails)
-    36(SAM.CommonFA.PremetricCost)-->39(SAM.CommonFA.ChargeDetails)
-    
-
-    graph TD
-    9e122290_1ec3_e711_8c5a_005056ad0002("fa:fa-creative-commons My System | Test Environment")
-    82072290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Business Logic Server:Service 1")
-    db052290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Business Logic Server:Service 2")
-    4e112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Report Server:Service 1")
-    30122290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Shared Report Server:Service 2")
-    5e112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Dedicated Test Business Logic Server:Service 1")
-    c1112290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs Dedicated Test Business Logic Server:Service 2")
-    b7042290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\SharedDbInstance].[SupportDb]")
-    8f102290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\SharedDbInstance].[DevelopmentDb]")
-    0e102290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\SharedDbInstance].[TestDb]")
-    07132290_1ec3_e711_8c5a_005056ad0002("fa:fa-circle [DBServer\SharedDbInstance].[SharedReportingDb]")
-    c7072290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Shared Business Logic Server")
-    ca122290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Shared Report Server")
-    68102290_1ec3_e711_8c5a_005056ad0002("fa:fa-server Dedicated Test Business Logic Server")
-    f4112290_1ec3_e711_8c5a_005056ad0002("fa:fa-database [DBServer\SharedDbInstance]")
-    d6072290_1ec3_e711_8c5a_005056ad0002("fa:fa-server DBServer")
-    71082290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\:MSSQLSERVER")
-    c0102290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\:SQLAgent")
-    9a072290_1ec3_e711_8c5a_005056ad0002("fa:fa-cogs DBServer\:SQLBrowser")
-    1d0a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost1")
-    200a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost2")
-    1c0a2290_1ec3_e711_8c5a_005056ad0002("fa:fa-server VmHost3")
-    9e122290_1ec3_e711_8c5a_005056ad0002-->82072290_1ec3_e711_8c5a_005056ad0002
-    9e122290_1ec3_e711_8c5a_005056ad0002-->db052290_1ec3_e711_8c5a_005056ad0002
-    9e122290_1ec3_e711_8c5a_005056ad0002-->4e112290_1ec3_e711_8c5a_005056ad0002
-    9e122290_1ec3_e711_8c5a_005056ad0002-->30122290_1ec3_e711_8c5a_005056ad0002
-    9e122290_1ec3_e711_8c5a_005056ad0002-->5e112290_1ec3_e711_8c5a_005056ad0002
-    9e122290_1ec3_e711_8c5a_005056ad0002-->c1112290_1ec3_e711_8c5a_005056ad0002
-    82072290_1ec3_e711_8c5a_005056ad0002-->b7042290_1ec3_e711_8c5a_005056ad0002
-    82072290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
-    82072290_1ec3_e711_8c5a_005056ad0002-->0e102290_1ec3_e711_8c5a_005056ad0002
-    82072290_1ec3_e711_8c5a_005056ad0002-->c7072290_1ec3_e711_8c5a_005056ad0002
-    db052290_1ec3_e711_8c5a_005056ad0002-->c7072290_1ec3_e711_8c5a_005056ad0002
-    db052290_1ec3_e711_8c5a_005056ad0002-->82072290_1ec3_e711_8c5a_005056ad0002
-    4e112290_1ec3_e711_8c5a_005056ad0002-->b7042290_1ec3_e711_8c5a_005056ad0002
-    4e112290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
-    4e112290_1ec3_e711_8c5a_005056ad0002-->0e102290_1ec3_e711_8c5a_005056ad0002
-    4e112290_1ec3_e711_8c5a_005056ad0002-->07132290_1ec3_e711_8c5a_005056ad0002
-    4e112290_1ec3_e711_8c5a_005056ad0002-->ca122290_1ec3_e711_8c5a_005056ad0002
-    30122290_1ec3_e711_8c5a_005056ad0002-->ca122290_1ec3_e711_8c5a_005056ad0002
-    30122290_1ec3_e711_8c5a_005056ad0002-->4e112290_1ec3_e711_8c5a_005056ad0002
-    5e112290_1ec3_e711_8c5a_005056ad0002-->8f102290_1ec3_e711_8c5a_005056ad0002
-    5e112290_1ec3_e711_8c5a_005056ad0002-->68102290_1ec3_e711_8c5a_005056ad0002
-    c1112290_1ec3_e711_8c5a_005056ad0002-->68102290_1ec3_e711_8c5a_005056ad0002
-    c1112290_1ec3_e711_8c5a_005056ad0002-->5e112290_1ec3_e711_8c5a_005056ad0002
-    b7042290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
-    8f102290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
-    0e102290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
-    07132290_1ec3_e711_8c5a_005056ad0002-->f4112290_1ec3_e711_8c5a_005056ad0002
-    c7072290_1ec3_e711_8c5a_005056ad0002-->1d0a2290_1ec3_e711_8c5a_005056ad0002
-    ca122290_1ec3_e711_8c5a_005056ad0002-->200a2290_1ec3_e711_8c5a_005056ad0002
-    68102290_1ec3_e711_8c5a_005056ad0002-->1c0a2290_1ec3_e711_8c5a_005056ad0002
-    f4112290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
-    f4112290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
-    f4112290_1ec3_e711_8c5a_005056ad0002-->c0102290_1ec3_e711_8c5a_005056ad0002
-    f4112290_1ec3_e711_8c5a_005056ad0002-->9a072290_1ec3_e711_8c5a_005056ad0002
-    d6072290_1ec3_e711_8c5a_005056ad0002-->1c0a2290_1ec3_e711_8c5a_005056ad0002
-    71082290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
-    c0102290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
-    c0102290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
-    9a072290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002
-    9a072290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002
-    
-
-    graph TB
-    subgraph One
-    a1-->a2
-    end
-    
-
-    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:10px,stroke:#0F0,color:blue
-    
-
-    graph LR
-    456ac9b0d15a8b7f1e71073221059886[1051 AAA fa:fa-check]
-    f7f580e11d00a75814d2ded41fe8e8fe[1141 BBB fa:fa-check]
-    81dc9bdb52d04dc20036dbd8313ed055[1234 CCC fa:fa-check]
-    456ac9b0d15a8b7f1e71073221059886 -->|Node| f7f580e11d00a75814d2ded41fe8e8fe
-    f7f580e11d00a75814d2ded41fe8e8fe -->|Node| 81dc9bdb52d04dc20036dbd8313ed055
-    click 456ac9b0d15a8b7f1e71073221059886 "/admin/user/view?id=1051" "AAA
-    6000"
-    click f7f580e11d00a75814d2ded41fe8e8fe "/admin/user/view?id=1141" "BBB
-    600"
-    click 81dc9bdb52d04dc20036dbd8313ed055 "/admin/user/view?id=1234" "CCC
-    3000"
-    style 456ac9b0d15a8b7f1e71073221059886 fill:#f9f,stroke:#333,stroke-width:4px
-    
-
-    graph TD
-    A[Christmas] -->|Get money| B(Go shopping)
-    B --> C{{Let me think...
Do I want something for work,
something to spend every free second with,
or something to get around?}} - C -->|One| D[Laptop] - C -->|Two| E[iPhone] - C -->|Three| F[Car] - click A "index.html#link-clicked" "link test" - click B testClick "click test" - classDef someclass fill:#f96; - class A someclass; - class C someclass; -
-
-    graph TD
-    A([stadium shape test])
-    A -->|Get money| B([Go shopping])
-    B --> C([Let me think...
Do I want something for work,
something to spend every free second with,
or something to get around?]) - C -->|One| D([Laptop]) - C -->|Two| E([iPhone]) - C -->|Three| F([Car
wroom wroom]) - click A "index.html#link-clicked" "link test" - click B testClick "click test" - classDef someclass fill:#f96; - class A someclass; - class C someclass; -
-
-    graph LR
-    A[[subroutine shape test]]
-    A -->|Get money| B[[Go shopping]]
-    B --> C[[Let me think...
Do I want something for work,
something to spend every free second with,
or something to get around?]] - C -->|One| D[[Laptop]] - C -->|Two| E[[iPhone]] - C -->|Three| F[[Car
wroom wroom]] - click A "index.html#link-clicked" "link test" - click B testClick "click test" - classDef someclass fill:#f96; - class A someclass; - class C someclass; -
-
-    graph LR
-    A[(cylindrical
shape
test)] - A -->|Get money| B1[(Go shopping 1)] - A -->|Get money| B2[(Go shopping 2)] - A -->|Get money| B3[(Go shopping 3)] - C[(Let me think...
Do I want something for work,
something to spend every free second with,
or something to get around?)] - B1 --> C - B2 --> C - B3 --> C - C -->|One| D[(Laptop)] - C -->|Two| E[(iPhone)] - C -->|Three| F[(Car)] - click A "index.html#link-clicked" "link test" - click B testClick "click test" - classDef someclass fill:#f96; - class A someclass; -
-
-    graph LR
-    A1[Multi
Line] -->|Multi
Line| B1(Multi
Line) - C1[Multi
Line] -->|Multi
Line| D1(Multi
Line) - E1[Multi
Line] -->|Multi
Line| F1(Multi
Line) - A2[Multi
Line] -->|Multi
Line| B2(Multi
Line) - C2[Multi
Line] -->|Multi
Line| D2(Multi
Line) - E2[Multi
Line] -->|Multi
Line| F2(Multi
Line) - linkStyle 0 stroke:DarkGray,stroke-width:2px - linkStyle 1 stroke:DarkGray,stroke-width:2px - linkStyle 2 stroke:DarkGray,stroke-width:2px -
-
-    graph LR
-    A(( )) -->|step 1| B(( ))
-    B(( )) -->|step 2| C(( ))
-    C(( )) -->|step 3| D(( ))
-    linkStyle 1 stroke:greenyellow,stroke-width:2px
-    style C fill:greenyellow,stroke:green,stroke-width:4px
-    
-
-    graph TB
-    TITLE["Link Click Events
(click the nodes below)"] - A["link test (open in same tab)"] - B["link test (open in new tab)"] - C[anchor test] - D[mailto test] - E[other protocol test] - F[script test] - TITLE --> A & B & C & D & E & F - click A "https://mermaid-js.github.io/mermaid/#/" "link test (open in same tab)" - click B "https://mermaid-js.github.io/mermaid/#/" "link test (open in new tab)" _blank - click C "#link-clicked" - click D "mailto:user@user.user" "mailto test" - click E "notes://do-your-thing/id" "other protocol test" - click F "javascript:alert('test')" "script test" -
-
-
-    graph LR
-    A[red
text] -->|red
text| B(blue
text) - C[/red
text/] -->|blue
text| D{blue
text} - E{{default
style}} -->|default
style| F([default
style]) - linkStyle default color:Sienna; - linkStyle 0 color:red; - linkStyle 1 stroke:DarkGray,stroke-width:2px,color:#0000ff - style A color:red; - style B color:blue; - style C stroke:#ff0000,fill:#ffcccc,color:#ff0000 - style D stroke:#0000ff,fill:#ccccff,color:#0000ff - click B "index.html#link-clicked" "link test" - click D testClick "click test" -
-
-    graph TD
-    A[myClass1] --> B[default] & C[default]
-    B[default] & C[default] --> D[myClass2]
-    classDef default stroke-width:2px,fill:none,stroke:silver
-    classDef node color:red
-    classDef myClass1 color:#0000ff
-    classDef myClass2 stroke:#0000ff,fill:#ccccff
-    class A myClass1
-    class D myClass2
-    
- -
- -
-    sequenceDiagram
-    accDescription Hello friends
-    participant Alice
-    participant Bob
-    participant John as John
Second Line - rect rgb(200, 220, 100) - rect rgb(200, 255, 200) - Alice ->> Bob: Hello Bob, how are you? - Bob-->>John: How about you John? - end - Bob--x Alice: I am good thanks! - Bob-x John: I am good thanks! - Note right of John: John thinks a long
long time, so long
that the text does
not fit on a row. - Bob-->Alice: Checking with John... - Note over John:wrap: John looks like he's still thinking, so Bob prods him a bit. - Bob-x John: Hey John - we're still waiting to know
how you're doing - Note over John:nowrap: John's trying hard not to break his train of thought. - Bob-x John:wrap: John! Are you still debating about how you're doing? How long does it take?? - Note over John: After a few more moments, John
finally snaps out of it. - end - alt either this - Alice->>John: Yes - else or this - Alice->>John: No - else or this will happen - Alice->John: Maybe - end - par this happens in parallel - Alice -->> Bob: Parallel message 1 - and - Alice -->> John: Parallel message 2 - end -
-
-    sequenceDiagram
-    participant 1 as multiline
using #lt;br#gt; - participant 2 as multiline
using #lt;br/#gt; - participant 3 as multiline
using #lt;br /#gt; - participant 4 as multiline
using #lt;br /#gt; - 1->>2: multiline
using #lt;br#gt; - note right of 2: multiline
using #lt;br#gt; - 2->>3: multiline
using #lt;br/#gt; - note right of 3: multiline
using #lt;br/#gt; - 3->>4: multiline
using #lt;br /#gt; - note right of 4: multiline
using #lt;br /#gt; - 4->>1: multiline
using #lt;br /#gt; - note right of 1: multiline
using #lt;br /#gt; -
-
-    sequenceDiagram
-    autonumber
-    Alice->>John: Hello John,
how are you? - autonumber 50 10 - Alice->>John: John,
can you hear me? - John-->>Alice: Hi Alice,
I can hear you! - autonumber off - John-->>Alice: I feel great! -
- -
- -
-    gantt
-    dateFormat YYYY-MM-DD
-    axisFormat %d/%m
-    title Adding GANTT diagram to mermaid
-    excludes weekdays 2014-01-10
-
-    section A section
-    Completed task :done, des1, 2014-01-06,2014-01-08
-    Active task :active, des2, 2014-01-09, 3d
-    Future task : des3, after des2, 5d
-    Future task2 : des4, after des3, 5d
-
-    section Critical tasks
-    Completed task in the critical line :crit, done, 2014-01-06,24h
-    Implement parser and jison :crit, done, after des1, 2d
-    Create tests for parser :crit, active, 3d
-    Future task in critical line :crit, 5d
-    Create tests for renderer :2d
-    Add to mermaid :1d
-
-    section Documentation
-    Describe gantt syntax :active, a1, after des1, 3d
-    Add gantt diagram to demo page :after a1 , 20h
-    Add another diagram to demo page :doc1, after a1 , 48h
-
-    section Clickable
-    Visit mermaidjs :active, cl1, 2014-01-07,2014-01-10
-    Calling a Callback (look at the console log) :cl2, after cl1, 3d
-
-    click cl1 href "https://mermaidjs.github.io/"
-    click cl2 call ganttTestClick("test", test, test)
-
-    section Last section
-    Describe gantt syntax :after doc1, 3d
-    Add gantt diagram to demo page : 20h
-    Add another diagram to demo page : 48h
-    
-
-    gantt
-    dateFormat YYYY-MM-DD
-    axisFormat %d/%m
-    title GANTT diagram with multiline section titles
-    excludes weekdays 2014-01-10
-
-    section A section
multiline - Completed task : done, des1, 2014-01-06,2014-01-08 - Active task : active, des2, 2014-01-09, 3d - Future task : des3, after des2, 5d - Future task2 : des4, after des3, 5d - - section Critical tasks
multiline - Completed task in the critical line : crit, done, 2014-01-06, 24h - Implement parser and jison : crit, done, after des1, 2d - Create tests for parser : crit, active, 3d - Future task in critical line : crit, 5d - Create tests for renderer : 2d - Add to mermaid : 1d - - section Documentation
multiline - Describe gantt syntax : active, a1, after des1, 3d - Add gantt diagram to demo page : after a1, 20h - Add another diagram to demo page : doc1, after a1, 48h - - section Last section
multiline - Describe gantt syntax : after doc1, 3d - Add gantt diagram to demo page : 20h - Add another diagram to demo page : 48h -
- -
- -
-    gitGraph:
-    options
-    {
-    "nodeSpacing": 50, 
-    "nodeRadius": 5
-    }
-    end
-    branch master
-    commit
-    branch newbranch
-    checkout newbranch
-    commit
-    commit
-    checkout master
-    commit
-    commit
-    merge newbranch
-    
- -
- -
-    classDiagram
-    Class01 <|-- AveryLongClass : Cool
-
-    <<interface>> Class01
-    Class03 "0" *-- "0..n" Class04
-    Class05 "1" o-- "many" Class06
-    Class07 .. Class08
-    Class09 "many" --> "1" C2 : Where am i?
-    Class09 "0" --* "1..n" C3
-    Class09 --|> Class07
-    Class07 : equals()
-    Class07 : Object[] elementData
-    Class01 : #size()
-    Class01 : -int chimp
-    Class01 : +int gorilla
-    Class08 <--> C2: Cool label
-      class Class10 {
-      <<service>>
-      int id
-      size()
-      }
-    
- -
-    classDiagram
-    class Class01~T~
-    Class01 : #size()
-    Class01 : -int chimp
-    Class01 : +int gorilla
-    class Class10~T~ {
-    <<service>>
-    int id
-    size()
-    }
-    
- -
-    classDiagram
-    Class01~T~ <|-- AveryLongClass : Cool
-    <<interface>> Class01
-    Class03~T~ "0" *-- "0..n" Class04
-    Class05 "1" o-- "many" Class06
-    Class07~T~ .. Class08
-    Class09 "many" --> "1" C2 : Where am i?
-      Class09 "0" --* "1..n" C3
-      Class09 --|> Class07
-      Class07 : equals()
-      Class07 : Object[] elementData
-      Class01 : #size()
-      Class01 : -int chimp
-      Class01 : +int gorilla
-      Class08 <--> C2: Cool label
-        class Class10 {
-        <<service>>
-        int id
-        size()
-        }
-    
- -
-    classDiagram
-    Interface1 ()-- Interface1Impl
-    
- -
-    classDiagram 
-    direction LR
-    Animal ()-- Dog
-    Dog : bark()
-    Dog : species()
-    
- -
-    classDiagram 
-    direction RL
-    Fruit ()-- Apple
-    Apple : color()
-    Apple : -int leafCount()
-    Fruit ()-- Pineapple
-    Pineapple : color()
-    Pineapple : -int leafCount()
-    Pineapple : -int spikeCount()
-    
- -
-    stateDiagram
-    accDescription This is a state diagram showing one state
-    State1
-    
- -
- -
-    stateDiagram
-    [*] --> First
-    state First {
-    [*] --> second
-    second --> [*]
-    }
-    
-
-    stateDiagram
-    State1: The state with a note
-    note right of State1
-    Important information! You can write
-    notes.
-    end note
-    State1 --> State2
-    note left of State2 : This is the note to the left.
-    
-
-    stateDiagram
-    State1
-    note right of State1
-    Line1
Line2
Line3
Line4
Line5 - end note -
- -
- -
-    requirementDiagram
-
-    requirement An Example {
-    id: 1
-    text: the test text.
-    risk: high
-    verifymethod: test
-    }
-
-    functionalRequirement Random Name {
-    id: 1.1
-    text: the second test text.
-    risk: low
-    verifymethod: inspection
-    }
-
-    performanceRequirement Something Else {
-    id: 1.2
-    text: the third test text.
-    risk: medium
-    verifymethod: demonstration
-    }
-
-    interfaceRequirement test_req4 {
-    id: 1.2.1
-    text: the fourth test text.
-    risk: medium
-    verifymethod: analysis
-    }
-
-    physicalRequirement test_req5 {
-    id: 1.2.2
-    text: the fifth test text.
-    risk: medium
-    verifymethod: analysis
-    }
-
-    designConstraint test_req6 {
-    id: 1.2.3
-    text: really long text to test overflow. really long text to test overflow. really long text to test overflow.
-    risk: medium
-    verifymethod: analysis
-    }
-
-    element test_entity {
-    type: simulation
-    }
-
-    element test_entity2 {
-    type: word doc
-    docRef: reqs/test_entity
-    }
-
-    element test_entity3 {
-    type: "test suite"
-    docRef: github.com/all_the_tests
-    }
-
-
-    test_entity - satisfies -> Random Name
-    An Example - traces -> Random Name
-    An Example - contains -> Something Else
-    Something Else - contains -> test_req4
-    test_req4 - derives -> test_req5
-    test_req5 - refines -> test_req6
-    test_entity3 - verifies -> test_req5
-    An Example <- copies - test_entity2
-    
- -

Anchor for "link-clicked" test

+

Mermaid quick test and demo pages

+ + diff --git a/demos/pie.html b/demos/pie.html new file mode 100644 index 0000000000..3232d25347 --- /dev/null +++ b/demos/pie.html @@ -0,0 +1,51 @@ + + + + + + Mermaid Quick Test Page + + + + + +
+      pie title Pets adopted by volunteers
+      accTitle: simple pie char demo
+      accDescr: pie chart with 3 sections: dogs, cats, rats. Most are dogs.
+    "Dogs" : 386
+    "Cats" : 85
+    "Rats" : 15
+    
+ +
+    pie
+      title Key elements in Product X
+        accTitle: Key elements in Product X
+      accDescr: This is a pie chart showing the key elements in Product X.
+      "Calcium" : 42.96
+      "Potassium" : 50.05
+      "Magnesium" : 10.01
+      "Iron" :  5
+    
+ + + + diff --git a/demos/requirements.html b/demos/requirements.html index 6bbd684a83..cebaf7e026 100644 --- a/demos/requirements.html +++ b/demos/requirements.html @@ -3,7 +3,7 @@ - Mermaid Quick Test Page + Requirements Mermaid Quick Test Page