Developer-Mike / obsidian-advanced-canvas

⚡ Supercharge your Obsidian.md canvas experience! Create presentations, flowcharts and more!
GNU General Public License v3.0
192 stars 7 forks source link
obsidian obsidian-md obsidian-plugin obsidian-plugins

Logo

Advanced Canvas for Obsidian.md

GitHub star count Open issues on GitHub List of contributors
GPL-3.0 license

⚡ Supercharge your canvas experience! Create presentations, flowcharts and more!

Installation

Open the Community Plugins tab in the settings and search for "Advanced Canvas" (or click here).

Other installation methods
  • Install it using BRAT
  • Manual folder creation
    1. Create a folder named obsidian-advanced-canvas in your vault's plugins folder (<vault>/.obsidian/plugins/).
    2. Download main.js, styles.css and manifest.json from the latest release and put them in the obsidian-advanced-canvas folder.
    3. Enable the plugin in Settings -> Community plugins -> Installed plugins

Features

All features can be enabled/disabled in the settings.

Support

Please consider supporting the plugin. There are many hours of work and effort behind it. The two easiest ways to support the plugin are either by starring ⭐ the repository or by donating any amount on Ko-fi ❤️. Thank you!

ko-fi

Time Spent

Canvas Commands

Node Styles

Node Shapes

Flowchart Example Flowchart Example

Usage

Shapes

Terminal Shape Terminal Shape
Process/Center Shape Process/Center Shape
Decision Shape Decision Shape
Input/Output Shape Input/Output Shape
On-page Reference Shape On-page Reference Shape
Predefined Process Shape Predefined Process Shape
Document Shape Document Shape
Database Shape Database Shape

Border Styles

Set the style of the border to dotted, dashed or invisible.

Border Styles Example Border Styles Example

Edge Styles

Path Styles

Set the style of the edge paths to dotted, short-dashed or long-dashed.

Edge Styles Example Edge Path Styles Example

Arrow Styles

Set the style of the arrows to triangle outline, halved triangle, thin triangle, diamond, diamond outline, circle or circle outline.

Arrow Styles Example Edge Arrow Styles Example

Pathfinding Methods

Set the pathfinding method of the edges (arrows) to default, straight, squared or A*.

Path Styles Example Edge Pathfinding Methods Example

Custom Styles

Custom style attributes for nodes and edges can easily be added.

  1. Add a popup menu option
    • Open the <VAULT-PATH>/.obsidian/plugins/obsidian-advanced-canvas/data.json file
    • If you want to add an option to node popup menu, search for customNodeStyleAttributes property, otherwise search for customEdgeStyleAttributes property. (Create it if it doesn't exist yet)
    • Add the custom popup menu option (Remove the comments!)
      "customNodeStyleAttributes": [
      {
          "datasetKey": "exampleStyleAttribute", // Must be unique and written in camelCase
          "label": "Example Style Attribute",
          "options": [
              {
                  "icon": "cloud-sun", // Choose an icon from lucide.dev
                  "label": "Sunny Appearance",
                  "value": null // Null means default
              },
              {
                  "icon": "cloud-rain-wind", // Choose an icon from lucide.dev
                  "label": "Rainy Appearance",
                  "value": "rainy" // The value that gets set
              }
          ]   
      }
      // You can add more categories here
      ]
  2. Create a new CSS snippet in your vault (And enable it in the settings)
    .canvas-node[data-<DATASET-KEY>="rainy"] { /* The dataset key is now written in kebab-case */
        background-color: #7f7f7f;
    }
  3. Reload Obsidian and enjoy your new custom style!
    Custom Style Attribute Example

Custom Colors

Add custom colors to the color picker. You can add them using the following css snippet:

:root {
    /* Where X is the index of the color in the palette */
    /* The colors 1-6 are already used by Obsidian */
    --canvas-color-X: 0, 255, 0; /* RGB */
}
Custom Colors In Palette Custom Colors In Palette

Properties Support

Support for properties in canvas files just like in md files. You can edit the properties using the updated control menu.

Supported properties:

Custom Background Example (cssclasses)

.canvas-wrapper.<CLASS-NAME> > .canvas-background {
    background-image: url('<IMAGE-URL>');
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;

    filter: blur(5px) brightness(0.8);
}

Presentation Mode

In presentation mode, you can navigate through the nodes using the arrow keys or the PageUp/PageDown keys (Compatible with most presentation remotes). The different slides/nodes are connected using arrows. If you want to have multiple arrows pointing from the same node, you can number them in the order you want to navigate through them. While in presentation mode, the canvas is in readonly mode (So better readonly effects the presentation mode as well!). You can exit the presentation mode using the ESC key or the corresponding command. If you want to continue the presentation from the last slide you were on, you can use the Advanced Canvas: Continue presentation command.

Presentation mode example
Canvas File Presentation canvas file

More Complex Example

Complex presentation mode example
Canvas File Complex presentation canvas file

Usage

Portals

Embed other canvases inside your canvas and create edges (arrows) to the embedded canvas.

Portal example

Usage

Collapsible Groups

Collapse and expand groups to organize your canvas.

Collapsible Groups Example Collapsible Groups Example

Better Readonly

Usage

Encapsulate Selection

Move the current selection to a new canvas and create a link in the current canvas.

Usage

Canvas Events

All custom events are prefixed with advanced-canvas: and can be listened to using app.workspace.on (Just like the default events).

All Events (27) - `advanced-canvas:canvas-changed` - Fired when a new canvas gets loaded - Payload: `Canvas` - `advanced-canvas:viewport-changed:before` and `advanced-canvas:viewport-changed:after` - Fired before and after the viewport gets changed - Payload: `Canvas` - `advanced-canvas:node-moved` - Fired when a node gets moved - Payload: `Canvas`, `Node` - `advanced-canvas:double-click` - Fired when the canvas gets double-clicked - Payload: `Canvas`, `MouseEvent`, `preventDefault: { value: Boolean }` - `advanced-canvas:dragging-state-changed` - Fired when the dragging state of the canvas changes - Payload: `Canvas`, `boolean` - `advanced-canvas:node-created` - Fired when a new node gets created - Payload: `Canvas`, `Node` - `advanced-canvas:edge-created` - Fired when a new edge gets created - Payload: `Canvas`, `Edge` - `advanced-canvas:node-added` - Fired when a new node gets added - Payload: `Canvas`, `Node` - `advanced-canvas:edge-added` - Fired when a new edge gets added - Payload: `Canvas`, `Edge` - `advanced-canvas:node-removed` - Fired when a node gets removed - Payload: `Canvas`, `Node` - `advanced-canvas:edge-removed` - Fired when an edge gets removed - Payload: `Canvas`, `Edge` - `advanced-canvas:node-changed` - Fired when any node gets changed - Payload: `Canvas`, `Node` - `advanced-canvas:edge-changed` - Fired when any edge gets changed - Payload: `Canvas`, `Edge` - `advanced-canvas:node-bbox-requested` - Fired when the bounding box of a node gets requested (e.g. for the edge path or when dragging a group) - Payload: `Canvas`, `Node`, `BBox (Reference!)` - `advanced-canvas:edge-center-requested` - Fired when the center of an edge gets requested (e.g. for the edge label position) - Payload: `Canvas`, `Edge`, `Position (Reference!)` - `advanced-canvas:containing-nodes-requested` - Fired when the nodes inside a bounding box get requested - Payload: `Canvas`, `BBox`, `Node[] (Reference!)` - `advanced-canvas:selection-changed` - Fired when the selection of the canvas changes - Payload: `Canvas`, `oldSelection: Set`, `updateSelection: (() => void) => void` - `advanced-canvas:zoom-to-bbox:before` and `advanced-canvas:zoom-to-bbox:after` - Fired before and after the canvas gets zoomed to a bounding box (e.g. zoom to selection, zoom to fit all) - Payload: `Canvas`, `BBox` - `advanced-canvas:popup-menu-created` - Fired when the a node popup menu gets created (Not firing multiple times if it gets moved between nodes of the same type) - Payload: `Canvas` - `advanced-canvas:node-interaction` - Fired when a node gets hovered over - Payload: `Canvas`, `Node` - `advanced-canvas:undo` - Fired when undo gets called - Payload: `Canvas` - `advanced-canvas:redo` - Fired when redo gets called - Payload: `Canvas` - `advanced-canvas:readonly-changed` - Fired when the readonly state of the canvas changes - Payload: `Canvas`, `boolean` - `advanced-canvas:data-requested` - Fired when the canvas data gets requested - Payload: `Canvas`, `CanvasData (Reference!)` - `advanced-canvas:load-data` - Fired when the canvas data gets set - Payload: `Canvas`, `CanvasData (Reference!)`, `setData: (CanvasData) => void` - `advanced-canvas:canvas-saved:before` and `advanced-canvas:canvas-saved:after` - Fired before and after the canvas gets saved - Payload: `Canvas`

Settings

Every feature can be enabled/disabled in the settings. All features were made to be as customizable as possible.

Contributing

All contributions are welcome! Here's how you can help:

Known Issues - Create an issue if you find any!