mermaid: make zoom configurable #144

This commit is contained in:
Sören Weber 2023-02-05 11:13:03 +01:00
parent 98f5959a33
commit a046b9300f
No known key found for this signature in database
GPG key ID: BEC6D55545451B6D
7 changed files with 38 additions and 10 deletions

View file

@ -205,4 +205,5 @@ disableHugoGeneratorInject = true
# graphs; you usually will not need it and you should remove this for # graphs; you usually will not need it and you should remove this for
# security reasons # security reasons
mermaidInitialize = "{ \"securityLevel\": \"loose\" }" mermaidInitialize = "{ \"securityLevel\": \"loose\" }"
mermaidZoom = true
additionalContentLanguage = [ "en" ] additionalContentLanguage = [ "en" ]

View file

@ -28,6 +28,10 @@ This document shows you what's new in the latest release. For a detailed list of
<script src="{{"js/jquery.min.js"| relURL}}{{ if $assetBusting }}?{{ now.Unix }}{{ end }}" defer></script> <script src="{{"js/jquery.min.js"| relURL}}{{ if $assetBusting }}?{{ now.Unix }}{{ end }}" defer></script>
```` ````
- {{% badge style="note" title=" " %}}Change{{% /badge %}} [Mermaid]({{% relref "shortcodes/mermaid#parameter" %}}) diagrams can now be configured for pan and zoom on site and project level as individually for each graph.
The default setting of `on`, in effect since 1.1.0, changed back to `off` as there was interference with scrolling on mobile and big pages.
- {{% badge style="note" title=" " %}}Change{{% /badge %}} The theme is now capable to visually [adapt to your OS's light/dark mode setting]({{%relref "basics/customization/#adjust-to-os-settings" %}}). - {{% badge style="note" title=" " %}}Change{{% /badge %}} The theme is now capable to visually [adapt to your OS's light/dark mode setting]({{%relref "basics/customization/#adjust-to-os-settings" %}}).
This is also the new default setting if you haven't configured `themeVariant` in your `config.toml`. This is also the new default setting if you haven't configured `themeVariant` in your `config.toml`.
@ -459,6 +463,8 @@ This document shows you what's new in the latest release. For a detailed list of
## 1.1.0 (2021-07-02) ## 1.1.0 (2021-07-02)
- {{% badge style="warning" title=" " %}}Breaking{{% /badge %}} [Mermaid]({{% relref "shortcodes/mermaid" %}}) diagrams can now be panned and zoomed. This isn't configurable yet.
- {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} [`Mermaid`]({{% relref "shortcodes/mermaid#configuration" %}}) config options can be set in `config.toml`. - {{% badge style="info" icon="plus-circle" title=" " %}}New{{% /badge %}} [`Mermaid`]({{% relref "shortcodes/mermaid#configuration" %}}) config options can be set in `config.toml`.
--- ---

View file

@ -5,7 +5,7 @@ title = "Mermaid"
The `mermaid` shortcode generates diagrams and flowcharts from text, in a similar manner as Markdown using the [Mermaid](https://mermaidjs.github.io/) library. The `mermaid` shortcode generates diagrams and flowcharts from text, in a similar manner as Markdown using the [Mermaid](https://mermaidjs.github.io/) library.
{{< mermaid align="center" >}} {{< mermaid align="center">}}
graph LR; graph LR;
If --> Then If --> Then
Then --> Else Then --> Else
@ -33,7 +33,7 @@ To use codefence syntax you have to turn off `guessSyntax` for the `markup.highl
{{% tab name="codefence" %}} {{% tab name="codefence" %}}
````md ````md
```mermaid { align="center" } ```mermaid { align="center" zoom="true" }
graph LR; graph LR;
If --> Then If --> Then
Then --> Else Then --> Else
@ -44,7 +44,7 @@ graph LR;
{{% tab name="shortcode" %}} {{% tab name="shortcode" %}}
````go ````go
{{</* mermaid align="center" */>}} {{</* mermaid align="center" zoom="true" */>}}
graph LR; graph LR;
If --> Then If --> Then
Then --> Else Then --> Else
@ -59,6 +59,7 @@ graph LR;
"context" . "context" .
"content" "graph LR;\nIf --> Then\nThen --> Else" "content" "graph LR;\nIf --> Then\nThen --> Else"
"align" "center" "align" "center"
"zoom" "true"
)}} )}}
```` ````
@ -73,6 +74,7 @@ The generated graphs can be be panned by dragging them and zoomed by using the m
| Name | Default | Notes | | Name | Default | Notes |
|:----------------------|:-----------------|:------------| |:----------------------|:-----------------|:------------|
| **align** | `center` | Allowed values are `left`, `center` or `right`. | | **align** | `center` | Allowed values are `left`, `center` or `right`. |
| **zoom** | see notes | Whether the graph is pan- and zoomable.<br><br>If not set the value is determined by the `mermaidZoom` setting of the [site](#global-configuration-file) or the [pages frontmatter](#pages-frontmatter) or `false` if not set at all.<br><br>- `false`: no pan or zoom<br>- `true`: pan and zoom active |
| _**&lt;content&gt;**_ | _&lt;empty&gt;_ | Your Mermaid graph. | | _**&lt;content&gt;**_ | _&lt;empty&gt;_ | Your Mermaid graph. |
## Configuration ## Configuration
@ -94,6 +96,7 @@ To use codefence syntax you have to turn off `guessSyntax` for the `markup.highl
````toml ````toml
[params] [params]
mermaidInitialize = "{ \"theme\": \"dark\" }" mermaidInitialize = "{ \"theme\": \"dark\" }"
mermaidZoom = true
[markup] [markup]
[markup.highlight] [markup.highlight]
@ -108,6 +111,7 @@ To use codefence syntax you have to turn off `guessSyntax` for the `markup.highl
````toml ````toml
+++ +++
mermaidInitialize = "{ \"theme\": \"dark\" }" mermaidInitialize = "{ \"theme\": \"dark\" }"
mermaidZoom = true
+++ +++
```` ````
@ -339,10 +343,10 @@ gantt
Add to Mermaid :1d Add to Mermaid :1d
{{< /mermaid >}} {{< /mermaid >}}
### Pie Chart ### Pie Chart without Zoom
````go ````go
{{</* mermaid */>}} {{</* mermaid zoom="false" */>}}
pie title Pets adopted by volunteers pie title Pets adopted by volunteers
"Dogs" : 386 "Dogs" : 386
"Cats" : 85 "Cats" : 85
@ -350,7 +354,7 @@ pie title Pets adopted by volunteers
{{</* /mermaid */>}} {{</* /mermaid */>}}
```` ````
{{< mermaid >}} {{< mermaid zoom="false" >}}
pie title Pets adopted by volunteers pie title Pets adopted by volunteers
"Dogs" : 386 "Dogs" : 386
"Cats" : 85 "Cats" : 85

View file

@ -1,8 +1,21 @@
{{- $context := .context }} {{- $context := .context }}
{{- $content := .content }} {{- $content := .content }}
{{- $align := .align | default "center" }} {{- $align := .align | default "center" }}
{{- $zoom := $context.Site.Params.mermaidZoom | default false }}
{{- with $context.Page.Params.mermaidZoom }}
{{- $zoom = . }}
{{- if eq (printf "%T" .) "string" }}
{{- $zoom = (eq . "true") }}
{{- end }}
{{- end }}
{{- with .zoom }}
{{- $zoom = . }}
{{- if eq (printf "%T" .) "string" }}
{{- $zoom = (eq . "true") }}
{{- end }}
{{- end }}
{{- with $context }} {{- with $context }}
<div class="mermaid align-{{ $align }}"> <div class="mermaid align-{{ $align }}{{ if $zoom }} zoom{{ end }}">
{{- replaceRE "&#39;" "'" ( replaceRE "&#34;" "\"" ( $content | safeHTML ) ) -}} {{- replaceRE "&#39;" "'" ( replaceRE "&#34;" "\"" ( $content | safeHTML ) ) -}}
</div> </div>
{{- .Page.Store.Set "hasMermaid" true }} {{- .Page.Store.Set "hasMermaid" true }}

View file

@ -3,4 +3,5 @@
"context" . "context" .
"content" .Inner "content" .Inner
"align" (.Get "align") "align" (.Get "align")
"zoom" (.Get "zoom")
) }} ) }}

View file

@ -1121,12 +1121,15 @@ option {
.mermaid > svg { .mermaid > svg {
border: 1px solid transparent; border: 1px solid transparent;
cursor: pointer;
/* remove inline height from generated diagram */ /* remove inline height from generated diagram */
height: initial !important; height: initial !important;
} }
.mermaid > svg:hover { .mermaid.zoom > svg {
cursor: pointer;
}
.mermaid.zoom > svg:hover {
border-color: rgba( 134, 134, 134, .333 ); border-color: rgba( 134, 134, 134, .333 );
} }

View file

@ -227,7 +227,7 @@ function initMermaid( update, attrs ) {
mermaid.init(); mermaid.init();
// zoom for Mermaid // zoom for Mermaid
// https://github.com/mermaid-js/mermaid/issues/1860#issuecomment-1345440607 // https://github.com/mermaid-js/mermaid/issues/1860#issuecomment-1345440607
var svgs = d3.selectAll( '.mermaid svg' ); var svgs = d3.selectAll( '.mermaid.zoom svg' );
svgs.each( function(){ svgs.each( function(){
var svg = d3.select( this ); var svg = d3.select( this );
svg.html( '<g>' + svg.html() + '</g>' ); svg.html( '<g>' + svg.html() + '</g>' );