diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json
index 2485229..da9c24d 100644
--- a/.obsidian/community-plugins.json
+++ b/.obsidian/community-plugins.json
@@ -2,5 +2,6 @@
"obsidian-full-calendar",
"obsidian-icon-folder",
"obsidian-git",
- "obsidian-smart-typography"
+ "obsidian-smart-typography",
+ "mermaid-tools"
]
\ No newline at end of file
diff --git a/.obsidian/plugins/mermaid-tools/main.js b/.obsidian/plugins/mermaid-tools/main.js
new file mode 100644
index 0000000..829d903
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/main.js
@@ -0,0 +1,2633 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
+if you want to view the source, please visit the github repository of this plugin
+*/
+
+var __defProp = Object.defineProperty;
+var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __export = (target, all) => {
+ for (var name in all)
+ __defProp(target, name, { get: all[name], enumerable: true });
+};
+var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+};
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// main.ts
+var main_exports = {};
+__export(main_exports, {
+ TRIDENT_ICON_NAME: () => TRIDENT_ICON_NAME,
+ default: () => MermaidPlugin
+});
+module.exports = __toCommonJS(main_exports);
+var import_obsidian7 = require("obsidian");
+
+// src/elements/sampleDiagrams.ts
+var sampleDiagrams = {
+ EntityRelationshipDiagram: `erDiagram
+ CUSTOMER ||--o{ ORDER : places
+ ORDER ||--|{ LINE-ITEM : contains
+ CUSTOMER }|..|{ DELIVERY-ADDRESS : uses`,
+ ClassDiagram: `class BankAccount
+ BankAccount : +String owner
+ BankAccount : +Bigdecimal balance
+ BankAccount : +deposit(amount)
+ BankAccount : +withdrawal(amount)`,
+ Flowchart: "flowchart LR\nStart --> Stop",
+ GanttChart: `gantt
+ title A Gantt Diagram
+ dateFormat YYYY-MM-DD
+ section Section
+ A task :a1, 2014-01-01, 30d
+ Another task :after a1 , 20d
+ section Another
+ Task in sec :2014-01-12 , 12d
+ another task : 24d`,
+ GitGraph: `gitGraph
+ commit
+ commit
+ branch develop
+ checkout develop
+ commit
+ commit
+ checkout main
+ merge develop
+ commit
+ commit`,
+ PieChart: `pie title /r/obsidianmd posts by type
+ "Look at my awesome graph" : 85
+ "Look at my cool dashboard" : 14
+ "Moved from Notion, liking it" : 1`,
+ RequirementDiagram: ` requirementDiagram
+
+ requirement test_req {
+ id: 1
+ text: the test text.
+ risk: high
+ verifymethod: test
+ }
+
+ element test_entity {
+ type: simulation
+ }
+
+ test_entity - satisfies -> test_req`,
+ SequenceDiagram: `sequenceDiagram
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ StateDiagram: `stateDiagram-v2
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ UserJourneyDiagram: `journey
+ title My working day
+ section Go to work
+ Make tea: 5: Me
+ Go upstairs: 3: Me
+ Do work: 1: Me, Cat
+ section Go home
+ Go downstairs: 5: Me
+ Sit down: 5: Me`,
+ Mindmap: `mindmap
+ Root
+ A
+ B
+ C`,
+ Timeline: `timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook
+ : Google
+ 2005 : Youtube
+ 2006 : Twitter`,
+ QuadrantChart: `quadrantChart
+ title Reach and engagement of campaigns
+ x-axis Low Reach --> High Reach
+ y-axis Low Engagement --> High Engagement
+ quadrant-1 We should expand
+ quadrant-2 Need to promote
+ quadrant-3 Re-evaluate
+ quadrant-4 May be improved
+ Campaign A: [0.3, 0.6]
+ Campaign B: [0.45, 0.23]
+ Campaign C: [0.57, 0.69]
+ Campaign D: [0.78, 0.34]
+ Campaign E: [0.40, 0.34]
+ Campaign F: [0.35, 0.78]`,
+ C4Diagram: `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")`,
+ SankeyDiagram: `sankey-beta
+
+ %% source,target,value
+ Electricity grid,Over generation / exports,104.453
+ Electricity grid,Heating and cooling - homes,113.726
+ Electricity grid,H2 conversion,27.14`,
+ XyChart: `xychart-beta
+ title "Sales Revenue"
+ x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
+ y-axis "Revenue (in $)" 4000 --> 11000
+ bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
+ line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`,
+ Packet: `packet-beta
+title UDP Packet
+0-15: "Source Port"
+16-31: "Destination Port"
+32-47: "Length"
+48-63: "Checksum"
+64-95: "Data (variable length)"
+`,
+ Kanban: `kanban
+ Todo
+ [Create Documentation]
+ docs[Create Blog about the new diagram]
+ [In progress]
+ id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
+ id9[Ready for deploy]
+ id8[Design grammar]@{ assigned: 'knsv' }
+ id10[Ready for test]
+ id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' }
+ id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }
+ id11[Done]
+ id5[define getData]
+ id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'}
+ id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' }
+
+ id12[Can't reproduce]
+ id3[Weird flickering in Firefox]`,
+ Block: `block-beta
+columns 1
+ db(("DB"))
+ blockArrowId6<[" "]>(down)
+ block:ID
+ A
+ B["A wide one in the middle"]
+ C
+ end
+ space
+ D
+ ID --> D
+ C --> D
+ style B fill:#969,stroke:#333,stroke-width:4px
+`,
+ Architecture: `architecture-beta
+ group api(cloud)[API]
+
+ service db(database)[Database] in api
+ service disk1(disk)[Storage] in api
+ service disk2(disk)[Storage] in api
+ service server(server)[Server] in api
+
+ db:L -- R:server
+ disk1:T -- B:server
+ disk2:T -- B:db
+`
+};
+
+// src/elements/architecture.ts
+var architectureElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "architecture",
+ description: "a sample architecture diagram",
+ content: `architecture-beta
+ group api(cloud)[API]
+
+ service db(database)[Database] in api
+ service disk1(disk)[Storage] in api
+ service disk2(disk)[Storage] in api
+ service server(server)[Server] in api
+
+ db:L -- R:server
+ disk1:T -- B:server
+ disk2:T -- B:db
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/blockDiagram.ts
+var blockDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "block",
+ description: "a sample block diagram",
+ content: `block-beta
+columns 1
+ db(("DB"))
+ blockArrowId6<[" "]>(down)
+ block:ID
+ A
+ B["A wide one in the middle"]
+ C
+ end
+ space
+ D
+ ID --> D
+ C --> D
+ style B fill:#969,stroke:#333,stroke-width:4px
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/c4Diagram.ts
+var c4DiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "c4Diagram",
+ description: "sample C4 diagram (compatible with PlantUML)",
+ content: `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")`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/classDiagram.ts
+var classDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class",
+ content: `class Duck{
+ +String beakColor
+ +swim()
+ +quack()
+ }`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class",
+ content: `class BankAccount
+ BankAccount : +String owner
+ BankAccount : +Bigdecimal balance
+ BankAccount : +deposit(amount)
+ BankAccount : +withdrawal(amount)`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "generic class",
+ content: `class Square~Shape~{
+ int id
+ List~int~ position
+ setPoints(List~int~ points)
+ getPoints() List~int~
+ }
+
+ Square : -List~string~ messages
+ Square : +setMessages(List~string~ messages)
+ Square : +getMessages() List~string~`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "inheritance",
+ content: "classA <|-- classB",
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "composition",
+ content: "classC *-- classD",
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "aggregation",
+ content: "classE o-- classF",
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "association",
+ content: "classG <-- classH",
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "solid link",
+ content: "classI -- classJ",
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "dependency",
+ content: "classK <.. classL",
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "realization",
+ content: "classM <|.. classN",
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "dashed link",
+ content: "classO .. classP",
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "two-way relation",
+ content: "Animal <|--|> Zebra",
+ sortingOrder: 11,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "classDiagram",
+ description: "sample class diagram",
+ content: `classDiagram
+ Animal <|-- Duck
+ Animal <|-- Fish
+ Animal <|-- Zebra
+ Animal : +int age
+ Animal : +String gender
+ Animal: +isMammal()
+ Animal: +mate()
+ class Duck{
+ +String beakColor
+ +swim()
+ +quack()
+ }
+ class Fish{
+ -int sizeInFeet
+ -canEat()
+ }
+ class Zebra{
+ +bool is_wild
+ +run()
+ }`,
+ sortingOrder: 12,
+ isPinned: false
+ }
+];
+
+// src/elements/entityRelationshipDiagram.ts
+var entityRelationshipDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "a sample entity relationship diagram",
+ content: `erDiagram
+ CUSTOMER ||--o{ ORDER : places
+ ORDER ||--|{ LINE-ITEM : contains
+ CUSTOMER }|..|{ DELIVERY-ADDRESS : uses`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "an entity",
+ content: ` CUSTOMER {
+ string name
+ string custNumber
+ string sector
+ }`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-many relationship",
+ content: `A ||--|{ B : label`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-many relationship",
+ content: `A }|--|{ B : label`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-one relationship",
+ content: `A ||--|| B : label`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-one relationship",
+ content: `A }|--|| B : label`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero/one-to-one relationship",
+ content: `A |o--|| B : label`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-one/zero relationship",
+ content: `A ||--o| B : label`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero-or-more-to-one relationship",
+ content: `A }o--|| B : label`,
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "one-to-zero-or-more relationship",
+ content: `A ||--o{ B : label`,
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "zero-or-more-to-many relationship",
+ content: `A }o--|{ B : label`,
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "entityRelationshipDiagram",
+ description: "many-to-zero-or-more relationship",
+ content: `A }|--o{ B : label`,
+ sortingOrder: 11,
+ isPinned: false
+ }
+];
+
+// src/elements/flowchart.ts
+var flowchartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "a simple flowchart with top to down direction",
+ content: `flowchart TD
+Start --> Stop`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "a simple flowchart with left to right direction",
+ content: "flowchart LR\nStart --> Stop",
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A node with round edges",
+ content: "id1(Some text)",
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A stadium-shaped node",
+ content: "id1([Some text])",
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A node in a cylindrical shape",
+ content: "id1[(Database)]",
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Circle",
+ content: "id1((Some text))",
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Rhombus",
+ content: "id1{Some text}",
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Hexagon",
+ content: "id1{{Some text}}",
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Parallelogram skewed right",
+ content: "id1[/Some text/]",
+ sortingOrder: 9,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Parallelogram skewed left",
+ content: "id1[\\Some text\\]",
+ sortingOrder: 10,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Trapezoid",
+ content: "A[/Some text\\]",
+ sortingOrder: 11,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Trapezoid upside down",
+ content: "A[\\Some text/]",
+ sortingOrder: 12,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Double circle node",
+ content: "id1(((Some text)))",
+ sortingOrder: 13,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A link with arrow head",
+ content: "A-->B",
+ sortingOrder: 14,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "An open link",
+ content: "A --- B",
+ sortingOrder: 15,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Text on links",
+ content: "A-- This is the text! ---B",
+ sortingOrder: 16,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "A link with arrow head and text",
+ content: "A-->|text|B",
+ sortingOrder: 17,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Dotted link",
+ content: "A-.->B",
+ sortingOrder: 18,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Thick link",
+ content: "A ==> B",
+ sortingOrder: 19,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Invisible link",
+ content: "A ~~~ B",
+ sortingOrder: 20,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Link with circle edge",
+ content: "A --o B",
+ sortingOrder: 21,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Link with cross edge",
+ content: "A --x B",
+ sortingOrder: 22,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "flowchart",
+ description: "Subgraph",
+ content: "subgraph one\na1-->a2\nend",
+ sortingOrder: 14,
+ isPinned: false
+ }
+];
+
+// src/elements/ganntChart.ts
+var ganttChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "simple gantt chart",
+ content: `gantt
+ title A Gantt Diagram
+ dateFormat YYYY-MM-DD
+ section Section
+ A task :a1, 2014-01-01, 30d
+ Another task :after a1 , 20d
+ section Another
+ Task in sec :2014-01-12 , 12d
+ another task : 24d`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "rich gantt chart",
+ content: `gantt
+ dateFormat YYYY-MM-DD
+ title Adding GANTT diagram functionality to mermaid
+ excludes weekends
+
+ 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
+ Functionality added :milestone, 2014-01-25, 0d
+
+ 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 Last section
+ Describe gantt syntax :after doc1, 3d
+ Add gantt diagram to demo page :20h
+ Add another diagram to demo page :48h`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "ganttChart",
+ description: "milestones example",
+ content: `gantt
+ dateFormat HH:mm
+ axisFormat %H:%M
+ Initial milestone : milestone, m1, 17:49,2min
+ taska2 : 10min
+ taska3 : 5min
+ Final milestone : milestone, m2, 18:14, 2min`,
+ sortingOrder: 2,
+ isPinned: false
+ }
+];
+
+// src/elements/gitGraph.ts
+var gitGraphElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "simple git graph",
+ content: `gitGraph
+ commit
+ commit
+ branch develop
+ checkout develop
+ commit
+ commit
+ checkout main
+ merge develop
+ commit
+ commit`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "tagged commit",
+ content: `commit id: "Normal" tag: "v1.0.0"`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "reverse commit",
+ content: `commit id: "Reverse" type: REVERSE`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "highlighted commit",
+ content: `commit id: "Highlight" type: HIGHLIGHT`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "reverse commit",
+ content: `commit id: "Reverse" type: REVERSE`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "gitGraph",
+ description: "git graph with cherry-pick",
+ content: `gitGraph
+ commit id: "ZERO"
+ branch develop
+ commit id:"A"
+ checkout main
+ commit id:"ONE"
+ checkout develop
+ commit id:"B"
+ checkout main
+ commit id:"TWO"
+ cherry-pick id:"A"
+ commit id:"THREE"
+ checkout develop
+ commit id:"C"`,
+ sortingOrder: 5,
+ isPinned: false
+ }
+];
+
+// src/elements/kanban.ts
+var kanbanElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "kanban",
+ description: "a sample kanban diagram",
+ content: `kanban
+ Todo
+ [Create Documentation]
+ docs[Create Blog about the new diagram]
+ [In progress]
+ id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
+ id9[Ready for deploy]
+ id8[Design grammar]@{ assigned: 'knsv' }
+ id10[Ready for test]
+ id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' }
+ id66[last item]@{ priority: 'Very Low', assigned: 'knsv' }
+ id11[Done]
+ id5[define getData]
+ id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'}
+ id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' }
+
+ id12[Can't reproduce]
+ id3[Weird flickering in Firefox]`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/mindMap.ts
+var mindMapElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "a simple mindmap",
+ content: `mindmap
+ Root
+ A
+ B
+ C`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "square",
+ content: `id[I am a square]`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "rounded square",
+ content: `id(I am a rounded square)`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "circle",
+ content: `id((I am a circle))`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "bang",
+ content: `id))I am a bang((`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "cloud",
+ content: `id)I am a cloud(`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "hexagon",
+ content: `id{{I am a hexagon}}`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "default",
+ content: `I am the default shape`,
+ sortingOrder: 8,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "mindmap",
+ description: "sample mindmap",
+ content: `mindmap
+ root((mindmap))
+ Origins
+ Long history
+ Popularisation
+ British popular psychology author Tony Buzan
+ Research
+ On effectiveness
and features
+ On Automatic creation
+ Uses
+ Creative techniques
+ Strategic planning
+ Argument mapping
+ Tools
+ Pen and paper
+ Mermaid`,
+ sortingOrder: 9,
+ isPinned: false
+ }
+];
+
+// src/elements/packet.ts
+var packetElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "packet",
+ description: "a sample packet diagram",
+ content: `packet-beta
+title UDP Packet
+0-15: "Source Port"
+16-31: "Destination Port"
+32-47: "Length"
+48-63: "Checksum"
+64-95: "Data (variable length)"
+`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/pieChart.ts
+var pieChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "pieChart",
+ description: "sample pie chart",
+ content: `pie title /r/obsidianmd posts by type
+ "Graphs" : 85
+ "Dashboards" : 14
+ "Tips" : 1`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "pieChart",
+ description: "sample pie chart with values shown in legend",
+ content: `pie showData title /r/obsidianmd posts by type
+ "Graphs" : 85
+ "Dashboards" : 14
+ "Tips" : 1`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/quadrant.ts
+var quadrantElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "quadrantChart",
+ description: "sample quadrant chart",
+ content: `quadrantChart
+ title Reach and engagement of campaigns
+ x-axis Low Reach --> High Reach
+ y-axis Low Engagement --> High Engagement
+ quadrant-1 We should expand
+ quadrant-2 Need to promote
+ quadrant-3 Re-evaluate
+ quadrant-4 May be improved
+ Campaign A: [0.3, 0.6]
+ Campaign B: [0.45, 0.23]
+ Campaign C: [0.57, 0.69]
+ Campaign D: [0.78, 0.34]
+ Campaign E: [0.40, 0.34]
+ Campaign F: [0.35, 0.78]`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "quadrantChart",
+ description: "themed quadrant chart",
+ content: `%%{init: {"quadrantChart": {"chartWidth": 400, "chartHeight": 400}, "themeVariables": {"quadrant1TextFill": "#ff0000"} }}%%
+ quadrantChart
+ x-axis Urgent --> Not Urgent
+ y-axis Not Important --> "Important \u2764"
+ quadrant-1 Plan
+ quadrant-2 Do
+ quadrant-3 Delegate
+ quadrant-4 Delete`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/requirementDiagram.ts
+var requirementDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: ` requirementDiagram
+
+ requirement test_req {
+ id: 1
+ text: the test text.
+ risk: high
+ verifymethod: test
+ }
+
+ element test_entity {
+ type: simulation
+ }
+
+ test_entity - satisfies -> test_req`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `element customElement {
+ type: customType
+ docref: customDocRef
+ }`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "a requirement with high risk",
+ content: `functionalRequirement myReq {
+ id: reqId
+ text: someText
+ risk: High
+ verifymethod: analysis
+ }`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `interfaceRequirement myReq2 {
+ id: reqId
+ text: someText
+ risk: Medium
+ verifymethod: demonstration
+ }`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "requirementDiagram",
+ description: "sample requirements diagram",
+ content: `designConstraint myReq3 {
+ id: reqId
+ text: someText
+ risk: Low
+ verifymethod: test
+ }`,
+ sortingOrder: 4,
+ isPinned: false
+ }
+];
+
+// src/elements/sankeyDiagram.ts
+var sankeyDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sankeyDiagram",
+ description: "",
+ content: `sankey-beta
+ %% source,target,value
+ Electricity grid,Over generation / exports,104.453
+ Electricity grid,Heating and cooling - homes,113.726
+ Electricity grid,H2 conversion,27.14`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/sequenceDiagram.ts
+var sequenceDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sequenceDiagram",
+ description: "a simple sequence diagram",
+ content: `sequenceDiagram
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "sequenceDiagram",
+ description: "a simple sequence diagram with actors",
+ content: `sequenceDiagram
+actor Alice
+actor John
+Alice->>John: Hello John, how are you?
+John-->>Alice: Great!
+Alice-)John: See you later!`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/stateDiagram.ts
+var stateDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a sample state diagram",
+ content: `stateDiagram-v2
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a sample state diagram with left-to-right direction",
+ content: `stateDiagram-v2
+ direction LR
+ [*] --> Still
+ Still --> [*]
+
+ Still --> Moving
+ Moving --> Still
+ Moving --> Crash
+ Crash --> [*]`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "node with description",
+ content: `s2 : This is a state description`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a transition",
+ content: `s1 --> s2`,
+ sortingOrder: 3,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a transition with label",
+ content: `s1 --> s2: A transition`,
+ sortingOrder: 4,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "composite state",
+ content: `
+ [*] --> First
+ state First {
+ [*] --> second
+ second --> [*]
+ }`,
+ sortingOrder: 5,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "diagram with choice",
+ content: `stateDiagram-v2
+ state if_state <>
+ [*] --> IsPositive
+ IsPositive --> if_state
+ if_state --> False: if n < 0
+ if_state --> True : if n >= 0`,
+ sortingOrder: 6,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "diagram with fork",
+ content: `stateDiagram-v2
+ state fork_state <>
+ [*] --> fork_state
+ fork_state --> State2
+ fork_state --> State3
+
+ state join_state <>
+ State2 --> join_state
+ State3 --> join_state
+ join_state --> State4
+ State4 --> [*]`,
+ sortingOrder: 7,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "stateDiagram",
+ description: "a diagram with concurrency",
+ content: `stateDiagram-v2
+ [*] --> Active
+
+ state Active {
+ [*] --> NumLockOff
+ NumLockOff --> NumLockOn : EvNumLockPressed
+ NumLockOn --> NumLockOff : EvNumLockPressed
+ --
+ [*] --> CapsLockOff
+ CapsLockOff --> CapsLockOn : EvCapsLockPressed
+ CapsLockOn --> CapsLockOff : EvCapsLockPressed
+ --
+ [*] --> ScrollLockOff
+ ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
+ ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
+ }`,
+ sortingOrder: 8,
+ isPinned: false
+ }
+];
+
+// src/elements/timeline.ts
+var timelineElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "sample timeline",
+ content: `timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook
+ : Google
+ 2005 : Youtube
+ 2006 : Twitter`,
+ sortingOrder: 1,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "timeline with grouping",
+ content: `timeline
+ title Timeline of Industrial Revolution
+ section 17th-20th century
+ Industry 1.0 : Machinery, Water power, Steam
power
+ Industry 2.0 : Electricity, Internal combustion engine, Mass production
+ Industry 3.0 : Electronics, Computers, Automation
+ section 21st century
+ Industry 4.0 : Internet, Robotics, Internet of Things
+ Industry 5.0 : Artificial intelligence, Big data,3D printing`,
+ sortingOrder: 2,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "timeline",
+ description: "timeline with Forest theme. see the docs for additional themes",
+ content: `%%{init: { 'logLevel': 'debug', 'theme': 'forest' } }%%
+ timeline
+ title History of Social Media Platform
+ 2002 : LinkedIn
+ 2004 : Facebook : Google
+ 2005 : Youtube
+ 2006 : Twitter
+ 2007 : Tumblr
+ 2008 : Instagram
+ 2010 : Pinterest`,
+ sortingOrder: 3,
+ isPinned: false
+ }
+];
+
+// src/elements/userJourneyDiagram.ts
+var userJourneyDiagramElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "userJourneyDiagram",
+ description: "a sample user journey diagram",
+ content: `journey
+ title My working day
+ section Go to work
+ Make tea: 5: Me
+ Go upstairs: 3: Me
+ Do work: 1: Me, Cat
+ section Go home
+ Go downstairs: 5: Me
+ Sit down: 5: Me`,
+ sortingOrder: 0,
+ isPinned: false
+ },
+ {
+ id: crypto.randomUUID(),
+ categoryId: "userJourneyDiagram",
+ description: "a step in user journey",
+ content: ` Step Title: 5: ActorName`,
+ sortingOrder: 1,
+ isPinned: false
+ }
+];
+
+// src/elements/xyChart.ts
+var xyChartElements = [
+ {
+ id: crypto.randomUUID(),
+ categoryId: "xyChart",
+ description: "a sample XYChart diagram",
+ content: `xychart-beta
+ title "Sales Revenue"
+ x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
+ y-axis "Revenue (in $)" 4000 --> 11000
+ bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
+ line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]`,
+ sortingOrder: 0,
+ isPinned: false
+ }
+];
+
+// src/elements/defaultElements.ts
+var defaultElements = [
+ ...flowchartElements,
+ ...sequenceDiagramElements,
+ ...classDiagramElements,
+ ...stateDiagramElements,
+ ...entityRelationshipDiagramElements,
+ ...userJourneyDiagramElements,
+ ...ganttChartElements,
+ ...pieChartElements,
+ ...requirementDiagramElements,
+ ...gitGraphElements,
+ ...mindMapElements,
+ ...timelineElements,
+ ...quadrantElements,
+ ...c4DiagramElements,
+ ...sankeyDiagramElements,
+ ...xyChartElements,
+ ...packetElements,
+ ...kanbanElements,
+ ...blockDiagramElements,
+ ...architectureElements
+];
+
+// src/core/defaultCategories.ts
+var DEFAULT_CATEGORIES = [
+ {
+ id: "flowchart",
+ name: "Flowchart",
+ defaultWrapping: "flowchart LR",
+ wrappings: ["flowchart LR", "flowchart TD"],
+ isCustom: false,
+ sortOrder: 0
+ },
+ {
+ id: "sequenceDiagram",
+ name: "SequenceDiagram",
+ defaultWrapping: "sequenceDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 1
+ },
+ {
+ id: "classDiagram",
+ name: "ClassDiagram",
+ defaultWrapping: "classDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 2
+ },
+ {
+ id: "stateDiagram",
+ name: "StateDiagram",
+ defaultWrapping: "stateDiagram-v2",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 3
+ },
+ {
+ id: "entityRelationshipDiagram",
+ name: "EntityRelationshipDiagram",
+ defaultWrapping: "erDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 4
+ },
+ {
+ id: "userJourneyDiagram",
+ name: "UserJourneyDiagram",
+ defaultWrapping: "journey",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 5
+ },
+ {
+ id: "ganttChart",
+ name: "GanttChart",
+ defaultWrapping: "gantt",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 6
+ },
+ {
+ id: "pieChart",
+ name: "PieChart",
+ defaultWrapping: "pie",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 7
+ },
+ {
+ id: "requirementDiagram",
+ name: "RequirementDiagram",
+ defaultWrapping: "requirementDiagram",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 8
+ },
+ {
+ id: "gitGraph",
+ name: "GitGraph",
+ defaultWrapping: "gitGraph",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 9
+ },
+ {
+ id: "mindmap",
+ name: "Mindmap",
+ defaultWrapping: "mindmap",
+ wrappings: ["mindmap"],
+ isCustom: false,
+ sortOrder: 10
+ },
+ {
+ id: "timeline",
+ name: "Timeline",
+ defaultWrapping: "timeline",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 11
+ },
+ {
+ id: "c4Diagram",
+ name: "C4Diagram",
+ defaultWrapping: "C4Context",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 12
+ },
+ {
+ id: "quadrantChart",
+ name: "QuadrantChart",
+ defaultWrapping: "quadrantChart",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 13
+ },
+ {
+ id: "sankeyDiagram",
+ name: "SankeyDiagram",
+ defaultWrapping: "sankey-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 14
+ },
+ {
+ id: "xyChart",
+ name: "XyChart",
+ defaultWrapping: "xychart-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 15
+ },
+ {
+ id: "kanban",
+ name: "Kanban",
+ defaultWrapping: "kanban",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 16
+ },
+ {
+ id: "architecture",
+ name: "Architecture",
+ defaultWrapping: "architecture-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 17
+ },
+ {
+ id: "block",
+ name: "Block",
+ defaultWrapping: "block-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 18
+ },
+ {
+ id: "packet",
+ name: "Packet",
+ defaultWrapping: "packet-beta",
+ wrappings: null,
+ isCustom: false,
+ sortOrder: 19
+ }
+];
+
+// src/core/categoryService.ts
+var CategoryService = class {
+ constructor() {
+ this.categories = [];
+ this.categories = [...DEFAULT_CATEGORIES];
+ }
+ static getInstance() {
+ if (!CategoryService.instance) {
+ CategoryService.instance = new CategoryService();
+ }
+ return CategoryService.instance;
+ }
+ getCategories() {
+ return [...this.categories].sort((a, b) => a.sortOrder - b.sortOrder);
+ }
+ getCategoryById(id) {
+ return this.categories.find((cat) => cat.id === id);
+ }
+ getCategoryByName(name) {
+ return this.categories.find((cat) => cat.name === name);
+ }
+ addCategory(category) {
+ if (this.categories.some((cat) => cat.id === category.id)) {
+ throw new Error(`Category with ID '${category.id}' already exists`);
+ }
+ this.categories.push(category);
+ }
+ updateCategory(category) {
+ const index = this.categories.findIndex((cat) => cat.id === category.id);
+ if (index === -1) {
+ throw new Error(`Category with ID '${category.id}' not found`);
+ }
+ this.categories[index] = category;
+ }
+ deleteCategory(id) {
+ var _a;
+ if (!((_a = this.getCategoryById(id)) == null ? void 0 : _a.isCustom)) {
+ throw new Error("Cannot delete default categories");
+ }
+ this.categories = this.categories.filter((cat) => cat.id !== id);
+ }
+ loadCategories(customCategories, defaultCategorySortOrders = {}) {
+ const defaultCategories = DEFAULT_CATEGORIES.map((cat) => ({
+ ...cat,
+ sortOrder: defaultCategorySortOrders[cat.id] !== void 0 ? defaultCategorySortOrders[cat.id] : cat.sortOrder
+ }));
+ const customCats = customCategories.filter((cat) => cat.isCustom);
+ this.categories = [...defaultCategories, ...customCats];
+ }
+ getCustomCategories() {
+ return this.categories.filter((cat) => cat.isCustom);
+ }
+ getWrappingData(categoryId) {
+ var _a;
+ const category = this.getCategoryById(categoryId);
+ if (!category)
+ return null;
+ return {
+ defaultWrapping: category.defaultWrapping,
+ wrappings: (_a = category.wrappings) != null ? _a : null
+ };
+ }
+ getNextSortOrder() {
+ return Math.max(...this.categories.map((cat) => cat.sortOrder), -1) + 1;
+ }
+};
+
+// src/core/elementService.ts
+var MermaidElementService = class {
+ constructor() {
+ this.categoryService = CategoryService.getInstance();
+ }
+ static DefaultElements() {
+ return defaultElements;
+ }
+ saveElement(element, plugin) {
+ const elementExists = plugin.settings.elements.some((el) => el.id === element.id);
+ if (elementExists) {
+ const index = plugin.settings.elements.findIndex((el) => el.id === element.id);
+ if (index !== -1) {
+ plugin.settings.elements[index] = element;
+ }
+ } else {
+ this.fixSortOrder(element, plugin);
+ plugin.settings.elements.push(element);
+ }
+ plugin.saveSettings();
+ }
+ fixSortOrder(element, plugin) {
+ const elementsFromSameCategory = plugin.settings.elements.filter((el) => el.categoryId === element.categoryId);
+ if (elementsFromSameCategory.some((el) => el.sortingOrder === element.sortingOrder)) {
+ element.sortingOrder = elementsFromSameCategory.length;
+ }
+ }
+ getSampleDiagram(categoryId) {
+ const category = this.categoryService.getCategoryById(categoryId);
+ if (!category) {
+ console.warn(`[Mermaid Tools] No category found for ID: ${categoryId}, using default sample`);
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock("flowchart TD\nStart --> End"));
+ }
+ const sampleKey = category.name;
+ const sample = sampleDiagrams[sampleKey];
+ if (sample) {
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock(sample));
+ }
+ console.warn(`[Mermaid Tools] No sample diagram found for category: ${category.name}, using default sample`);
+ return this.wrapForPastingIntoEditor(this.wrapWithMermaidBlock("flowchart TD\nStart --> End"));
+ }
+ wrapForPastingIntoEditor(text) {
+ return `${text}
+`;
+ }
+ wrapWithMermaidBlock(text) {
+ return `\`\`\`mermaid
+${text}
+\`\`\``;
+ }
+ wrapAsCompleteDiagram(element) {
+ const wrapping = this.categoryService.getWrappingData(element.categoryId);
+ if (!wrapping) {
+ console.warn(`[Mermaid Tools] No wrapping data found for category: ${element.categoryId}`);
+ return element.content;
+ }
+ const contentAlreadyWrapped = wrapping.wrappings ? wrapping.wrappings.some((w) => element.content.contains(w)) : element.content.contains(wrapping.defaultWrapping);
+ if (contentAlreadyWrapped) {
+ return element.content;
+ }
+ const wrappedContent = wrapping.defaultWrapping + "\n" + element.content;
+ const firstWord = wrapping.defaultWrapping.trim().split(/\s+/)[0];
+ const validDiagramTypes = [
+ "flowchart",
+ "graph",
+ "sequenceDiagram",
+ "classDiagram",
+ "stateDiagram-v2",
+ "erDiagram",
+ "journey",
+ "gantt",
+ "pie",
+ "requirementDiagram",
+ "gitGraph",
+ "mindmap",
+ "timeline",
+ "quadrantChart",
+ "C4Context",
+ "sankey-beta",
+ "xychart-beta",
+ "packet-beta",
+ "kanban",
+ "block-beta",
+ "architecture-beta"
+ ];
+ if (!validDiagramTypes.includes(firstWord)) {
+ console.warn(`[Mermaid Tools] Potentially invalid diagram type "${firstWord}" in category ${element.categoryId}. This may cause rendering errors.`);
+ }
+ return wrappedContent;
+ }
+};
+
+// src/core/textEditorService.ts
+var NoActiveCursorError = class extends Error {
+ constructor() {
+ super();
+ this.message = "Mermaid Tools: Error getting cursor position. Make sure you are in editing mode and have an active cursor in file content.";
+ }
+};
+var TextEditorService = class {
+ constructor() {
+ this._elementService = new MermaidElementService();
+ }
+ insertTextAtCursor(editor, content) {
+ if (!editor)
+ throw new NoActiveCursorError();
+ content = this._elementService.wrapForPastingIntoEditor(content);
+ const cursor = editor.getCursor();
+ editor.replaceRange(content, cursor);
+ const lines = content.split("\n");
+ const newCursor = {
+ line: cursor.line + lines.length - 1,
+ ch: lines.length === 1 ? cursor.ch + lines[0].length : lines[lines.length - 1].length
+ };
+ editor.setCursor(newCursor);
+ editor.focus();
+ }
+};
+
+// src/settings/settings.ts
+var MermaidPluginSettings = class {
+ static DefaultSettings() {
+ const settings = new MermaidPluginSettings();
+ settings.elements = defaultElements;
+ settings.customCategories = [];
+ settings.selectedCategoryId = "flowchart";
+ settings.defaultCategorySortOrders = {};
+ settings.categoryModifications = {};
+ return settings;
+ }
+};
+
+// src/trident-icon.ts
+var import_obsidian = require("obsidian");
+function addTridentIcon() {
+ (0, import_obsidian.addIcon)(TRIDENT_ICON_NAME, getSanitizedSvg());
+}
+function getSanitizedSvg() {
+ var sanitized = (0, import_obsidian.sanitizeHTMLToDom)(tridentIcon);
+ var tempContainer = createDiv();
+ tempContainer.appendChild(sanitized);
+ return tempContainer.innerHTML;
+}
+var tridentIcon = ``;
+
+// src/ui/settingsTab.ts
+var import_obsidian4 = require("obsidian");
+
+// src/ui/editMermaidElementModal.ts
+var import_obsidian2 = require("obsidian");
+var EditMermaidElementModal = class extends import_obsidian2.Modal {
+ constructor(app, _plugin, _mermaid, _element, _categoryService) {
+ super(app);
+ this._plugin = _plugin;
+ this._mermaid = _mermaid;
+ this._element = _element;
+ this._categoryService = _categoryService;
+ }
+ async onOpen() {
+ const { contentEl } = this;
+ contentEl.addClass("mermaid-tools-edit-element-modal");
+ contentEl.createEl("h2", { text: "Edit element" });
+ const renderContainerEl = contentEl.createDiv();
+ const renderEl = renderContainerEl.createEl("pre", { text: "rendered diagram" });
+ if (!this._mermaid)
+ this._mermaid = await (0, import_obsidian2.loadMermaid)();
+ renderEl.id = "mermaid-edit-element-modal";
+ const elementCategoryContainerEl = contentEl.createDiv();
+ elementCategoryContainerEl.createEl("label", { text: "Category" });
+ const elementCategoryEl = elementCategoryContainerEl.createEl("select");
+ const categories = this._categoryService.getCategories();
+ for (const category of categories) {
+ const option = elementCategoryEl.createEl("option", { text: category.name });
+ option.value = category.id;
+ }
+ elementCategoryEl.value = this._element.categoryId;
+ elementCategoryEl.onchange = (e) => {
+ this._element.categoryId = elementCategoryEl.value;
+ };
+ const elementDescriptionContainerEl = contentEl.createDiv();
+ elementDescriptionContainerEl.createEl("label", { text: "Description" });
+ const elementDescriptionEl = elementDescriptionContainerEl.createEl("input", { value: this._element.description, type: "text" });
+ elementDescriptionEl.style.minWidth = "50%";
+ elementDescriptionEl.onchange = (e) => {
+ this._element.description = elementDescriptionEl.value;
+ };
+ const elementContentContainerEl = contentEl.createDiv();
+ elementContentContainerEl.createEl("label", { text: "Content" });
+ const elementContentEl = elementContentContainerEl.createEl("textarea", { text: this._element.content });
+ elementContentEl.style.height = "200px";
+ elementContentEl.style.width = "100%";
+ elementContentEl.onchange = async (e) => {
+ this._element.content = elementContentEl.value;
+ const { svg: svg2 } = await this._mermaid.render(renderEl.id, this._plugin._mermaidElementService.wrapAsCompleteDiagram(this._element));
+ renderEl.innerHTML = svg2;
+ renderContainerEl.appendChild(renderEl);
+ };
+ const saveButtonEl = contentEl.createEl("button", { text: "Save" });
+ saveButtonEl.onclick = (e) => {
+ this.save();
+ };
+ const { svg } = await this._mermaid.render(renderEl.id, this._plugin._mermaidElementService.wrapAsCompleteDiagram(this._element));
+ renderEl.innerHTML = svg;
+ renderContainerEl.appendChild(renderEl);
+ }
+ save() {
+ this._plugin._mermaidElementService.saveElement(this._element, this._plugin);
+ this.close();
+ }
+};
+
+// src/ui/editCategoryModal.ts
+var import_obsidian3 = require("obsidian");
+var EditCategoryModal = class extends import_obsidian3.Modal {
+ constructor(app, plugin, existingCategory, onSave) {
+ super(app);
+ this.plugin = plugin;
+ this.categoryService = CategoryService.getInstance();
+ this.onSave = onSave;
+ this.isNewCategory = !existingCategory;
+ if (existingCategory) {
+ this.category = { ...existingCategory };
+ } else {
+ this.category = {
+ id: "",
+ name: "",
+ defaultWrapping: "",
+ wrappings: null,
+ isCustom: true,
+ sortOrder: this.categoryService.getNextSortOrder()
+ };
+ }
+ }
+ onOpen() {
+ const { contentEl } = this;
+ contentEl.addClass("mermaid-tools-edit-category-modal");
+ contentEl.createEl("h2", {
+ text: this.isNewCategory ? "Create Custom Category" : "Edit Category"
+ });
+ new import_obsidian3.Setting(contentEl).setName("Category ID").setDesc("Unique identifier for this category (lowercase, no spaces)").addText((text) => text.setPlaceholder("my-custom-category").setValue(this.category.id).onChange((value) => {
+ this.category.id = value.toLowerCase().replace(/\s+/g, "-");
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Category Name").setDesc("Display name for this category").addText((text) => text.setPlaceholder("My Custom Category").setValue(this.category.name).onChange((value) => {
+ this.category.name = value;
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Default Wrapping").setDesc('Default mermaid syntax to wrap elements (e.g., "flowchart TD", "sequenceDiagram")').addText((text) => text.setPlaceholder("flowchart TD").setValue(this.category.defaultWrapping).onChange((value) => {
+ this.category.defaultWrapping = value;
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Additional Wrappings (Optional)").setDesc('Comma-separated list of alternative wrappings (e.g., "flowchart LR, flowchart TB")').addText((text) => text.setPlaceholder("flowchart LR, flowchart TB").setValue(this.category.wrappings ? this.category.wrappings.join(", ") : "").onChange((value) => {
+ if (value.trim()) {
+ this.category.wrappings = value.split(",").map((w) => w.trim()).filter((w) => w);
+ } else {
+ this.category.wrappings = null;
+ }
+ }));
+ new import_obsidian3.Setting(contentEl).setName("Sort Order").setDesc("Determines the order in which categories appear").addText((text) => text.setPlaceholder("0").setValue(this.category.sortOrder.toString()).onChange((value) => {
+ const num = parseInt(value);
+ if (!isNaN(num)) {
+ this.category.sortOrder = num;
+ }
+ }));
+ const buttonContainer = contentEl.createDiv("modal-button-container");
+ buttonContainer.style.display = "flex";
+ buttonContainer.style.justifyContent = "flex-end";
+ buttonContainer.style.gap = "10px";
+ buttonContainer.style.marginTop = "20px";
+ const cancelButton = buttonContainer.createEl("button", { text: "Cancel" });
+ cancelButton.onclick = () => this.close();
+ const saveButton = buttonContainer.createEl("button", {
+ text: this.isNewCategory ? "Create" : "Save",
+ cls: "mod-cta"
+ });
+ saveButton.onclick = () => this.save();
+ }
+ save() {
+ if (!this.category.id.trim()) {
+ alert("Category ID is required");
+ return;
+ }
+ if (!this.category.name.trim()) {
+ alert("Category name is required");
+ return;
+ }
+ if (!this.category.defaultWrapping.trim()) {
+ alert("Default wrapping is required");
+ return;
+ }
+ const commonDiagramTypes = [
+ "flowchart",
+ "graph",
+ "sequenceDiagram",
+ "classDiagram",
+ "stateDiagram-v2",
+ "erDiagram",
+ "journey",
+ "gantt",
+ "pie",
+ "requirementDiagram",
+ "gitGraph",
+ "mindmap",
+ "timeline",
+ "quadrantChart",
+ "C4Context",
+ "sankey-beta",
+ "xychart-beta",
+ "packet-beta",
+ "kanban",
+ "block-beta",
+ "architecture-beta"
+ ];
+ const wrapping = this.category.defaultWrapping.trim().split(/\s+/)[0];
+ if (!commonDiagramTypes.includes(wrapping)) {
+ const shouldContinue = confirm(`Warning: "${wrapping}" is not a recognized Mermaid diagram type. This may cause rendering errors. Are you sure you want to continue?`);
+ if (!shouldContinue) {
+ return;
+ }
+ }
+ if (this.isNewCategory && this.categoryService.getCategoryById(this.category.id)) {
+ alert(`A category with ID '${this.category.id}' already exists`);
+ return;
+ }
+ try {
+ this.onSave(this.category);
+ this.close();
+ } catch (error) {
+ alert(`Error saving category: ${error.message}`);
+ }
+ }
+};
+
+// src/ui/settingsTab.ts
+var MermaidToolsSettingsTab = class extends import_obsidian4.PluginSettingTab {
+ constructor(_app, _plugin) {
+ super(_app, _plugin);
+ this._app = _app;
+ this._plugin = _plugin;
+ }
+ async display() {
+ await renderSettings(this.containerEl, this._plugin);
+ }
+};
+async function renderSettings(containerEl, plugin) {
+ const mermaid = await (0, import_obsidian4.loadMermaid)();
+ const categoryService = CategoryService.getInstance();
+ categoryService.loadCategories(plugin.settings.customCategories, plugin.settings.defaultCategorySortOrders);
+ containerEl.empty();
+ containerEl.createEl("h1", { text: "Mermaid Tools Settings" });
+ containerEl.createEl("h2", { text: "Manage Elements & Categories" });
+ const buttonsContainer = containerEl.createDiv();
+ buttonsContainer.style.marginBottom = "20px";
+ buttonsContainer.style.display = "flex";
+ buttonsContainer.style.gap = "10px";
+ const addElementButton = buttonsContainer.createEl("button", { text: "Add Element" });
+ addElementButton.addClass("mod-cta");
+ addElementButton.onclick = () => {
+ const newElement = {
+ id: crypto.randomUUID(),
+ description: "New element",
+ content: `flowchart TD
+Start --> Stop`,
+ categoryId: "flowchart",
+ sortingOrder: 0,
+ isPinned: false
+ };
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, newElement, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ renderSettings(containerEl, plugin);
+ };
+ };
+ const addCategoryButton = buttonsContainer.createEl("button", { text: "Add Category" });
+ addCategoryButton.addClass("mod-cta");
+ addCategoryButton.onclick = () => {
+ const modal = new EditCategoryModal(plugin.app, plugin, null, (category) => {
+ try {
+ if (category.sortOrder === void 0 || category.sortOrder === null) {
+ category.sortOrder = categoryService.getNextSortOrder();
+ }
+ categoryService.addCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error adding category:", error);
+ }
+ });
+ modal.open();
+ };
+ createIntegratedCategorySection(containerEl, plugin, categoryService, mermaid);
+}
+function saveAllCategoryChanges(plugin, categoryService) {
+ plugin.settings.customCategories = categoryService.getCustomCategories();
+ const defaultCategories = categoryService.getCategories().filter((cat) => !cat.isCustom);
+ defaultCategories.forEach((cat) => {
+ plugin.settings.defaultCategorySortOrders[cat.id] = cat.sortOrder;
+ });
+ plugin.saveSettings();
+}
+function createIntegratedCategorySection(containerEl, plugin, categoryService, mermaid) {
+ const allCategories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ allCategories.forEach((category) => {
+ const categoryContainer = containerEl.createDiv();
+ categoryContainer.addClass("mermaid-tools-category-section");
+ categoryContainer.style.marginBottom = "20px";
+ categoryContainer.style.border = "1px solid var(--background-modifier-border)";
+ categoryContainer.style.borderRadius = "8px";
+ categoryContainer.style.padding = "15px";
+ const categoryHeader = categoryContainer.createDiv();
+ categoryHeader.style.display = "flex";
+ categoryHeader.style.alignItems = "center";
+ categoryHeader.style.justifyContent = "space-between";
+ categoryHeader.style.marginBottom = "10px";
+ categoryHeader.style.cursor = "pointer";
+ const categoryTitle = categoryHeader.createDiv();
+ categoryTitle.style.display = "flex";
+ categoryTitle.style.alignItems = "center";
+ categoryTitle.style.gap = "10px";
+ const expandIcon = categoryTitle.createSpan();
+ expandIcon.innerHTML = "\u25BC";
+ expandIcon.style.fontSize = "12px";
+ expandIcon.style.transition = "transform 0.2s";
+ const categoryName = categoryTitle.createEl("h3", { text: category.name });
+ categoryName.style.margin = "0";
+ categoryName.style.fontSize = "16px";
+ const categoryInfo = categoryTitle.createSpan();
+ const elementCount = plugin.settings.elements.filter((el) => el.categoryId === category.id).length;
+ categoryInfo.textContent = `(${elementCount} elements)`;
+ categoryInfo.style.color = "var(--text-muted)";
+ categoryInfo.style.fontSize = "12px";
+ const categoryControls = categoryHeader.createDiv();
+ categoryControls.style.display = "flex";
+ categoryControls.style.gap = "2px";
+ const addElementButton = categoryControls.createEl("button");
+ addElementButton.title = "Add element to this category";
+ addElementButton.style.background = "none";
+ addElementButton.style.border = "none";
+ addElementButton.style.cursor = "pointer";
+ addElementButton.style.padding = "4px";
+ addElementButton.style.display = "flex";
+ addElementButton.style.alignItems = "center";
+ addElementButton.style.borderRadius = "3px";
+ addElementButton.innerHTML = ``;
+ addElementButton.onmouseenter = () => addElementButton.style.backgroundColor = "var(--background-modifier-hover)";
+ addElementButton.onmouseleave = () => addElementButton.style.backgroundColor = "transparent";
+ addElementButton.onclick = (e) => {
+ e.stopPropagation();
+ const newElement = {
+ id: crypto.randomUUID(),
+ description: "New element",
+ content: `flowchart TD
+Start --> Stop`,
+ categoryId: category.id,
+ sortingOrder: plugin.settings.elements.filter((el) => el.categoryId === category.id).length,
+ isPinned: false
+ };
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, newElement, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ renderSettings(containerEl, plugin);
+ };
+ };
+ const moveUpButton = categoryControls.createEl("button");
+ moveUpButton.title = "Move category up";
+ moveUpButton.style.background = "none";
+ moveUpButton.style.border = "none";
+ moveUpButton.style.cursor = "pointer";
+ moveUpButton.style.padding = "4px";
+ moveUpButton.style.display = "flex";
+ moveUpButton.style.alignItems = "center";
+ moveUpButton.style.borderRadius = "3px";
+ moveUpButton.innerHTML = ``;
+ moveUpButton.onmouseenter = () => moveUpButton.style.backgroundColor = "var(--background-modifier-hover)";
+ moveUpButton.onmouseleave = () => moveUpButton.style.backgroundColor = "transparent";
+ moveUpButton.onclick = (e) => {
+ e.stopPropagation();
+ const categories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ const currentIndex = categories.findIndex((cat) => cat.id === category.id);
+ if (currentIndex > 0) {
+ const temp = categories[currentIndex - 1].sortOrder;
+ categories[currentIndex - 1].sortOrder = category.sortOrder;
+ category.sortOrder = temp;
+ categoryService.updateCategory(categories[currentIndex - 1]);
+ categoryService.updateCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ }
+ };
+ const moveDownButton = categoryControls.createEl("button");
+ moveDownButton.title = "Move category down";
+ moveDownButton.style.background = "none";
+ moveDownButton.style.border = "none";
+ moveDownButton.style.cursor = "pointer";
+ moveDownButton.style.padding = "4px";
+ moveDownButton.style.display = "flex";
+ moveDownButton.style.alignItems = "center";
+ moveDownButton.style.borderRadius = "3px";
+ moveDownButton.innerHTML = ``;
+ moveDownButton.onmouseenter = () => moveDownButton.style.backgroundColor = "var(--background-modifier-hover)";
+ moveDownButton.onmouseleave = () => moveDownButton.style.backgroundColor = "transparent";
+ moveDownButton.onclick = (e) => {
+ e.stopPropagation();
+ const categories = categoryService.getCategories().sort((a, b) => a.sortOrder - b.sortOrder);
+ const currentIndex = categories.findIndex((cat) => cat.id === category.id);
+ if (currentIndex < categories.length - 1) {
+ const temp = categories[currentIndex + 1].sortOrder;
+ categories[currentIndex + 1].sortOrder = category.sortOrder;
+ category.sortOrder = temp;
+ categoryService.updateCategory(categories[currentIndex + 1]);
+ categoryService.updateCategory(category);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ }
+ };
+ const editButton = categoryControls.createEl("button");
+ editButton.title = "Edit category";
+ editButton.style.background = "none";
+ editButton.style.border = "none";
+ editButton.style.cursor = "pointer";
+ editButton.style.padding = "4px";
+ editButton.style.display = "flex";
+ editButton.style.alignItems = "center";
+ editButton.style.borderRadius = "3px";
+ editButton.innerHTML = ``;
+ editButton.onmouseenter = () => editButton.style.backgroundColor = "var(--background-modifier-hover)";
+ editButton.onmouseleave = () => editButton.style.backgroundColor = "transparent";
+ editButton.onclick = (e) => {
+ e.stopPropagation();
+ const modal = new EditCategoryModal(plugin.app, plugin, category, (updatedCategory) => {
+ try {
+ categoryService.updateCategory(updatedCategory);
+ saveAllCategoryChanges(plugin, categoryService);
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error updating category:", error);
+ }
+ });
+ modal.open();
+ };
+ const deleteButton = categoryControls.createEl("button");
+ deleteButton.title = "Delete category";
+ deleteButton.style.background = "none";
+ deleteButton.style.border = "none";
+ deleteButton.style.cursor = "pointer";
+ deleteButton.style.padding = "4px";
+ deleteButton.style.display = "flex";
+ deleteButton.style.alignItems = "center";
+ deleteButton.style.borderRadius = "3px";
+ deleteButton.innerHTML = ``;
+ deleteButton.onmouseenter = () => deleteButton.style.backgroundColor = "var(--background-modifier-hover)";
+ deleteButton.onmouseleave = () => deleteButton.style.backgroundColor = "transparent";
+ deleteButton.onclick = (e) => {
+ e.stopPropagation();
+ const elementsInCategory = plugin.settings.elements.filter((el) => el.categoryId === category.id);
+ if (elementsInCategory.length > 0) {
+ alert(`Cannot delete category '${category.name}' because it contains ${elementsInCategory.length} element(s). Please move or delete these elements first.`);
+ return;
+ }
+ const confirmMessage = category.isCustom ? `Are you sure you want to delete the category '${category.name}'?` : `Are you sure you want to delete the default category '${category.name}'? This action cannot be undone.`;
+ if (confirm(confirmMessage)) {
+ try {
+ categoryService.deleteCategory(category.id);
+ if (category.isCustom) {
+ plugin.settings.customCategories = categoryService.getCustomCategories();
+ }
+ plugin.saveSettings();
+ renderSettings(containerEl, plugin);
+ } catch (error) {
+ console.error("Error deleting category:", error);
+ if (!category.isCustom) {
+ alert(`Cannot delete default category: ${error.message}`);
+ }
+ }
+ }
+ };
+ const elementsContainer = categoryContainer.createDiv();
+ elementsContainer.addClass("mermaid-tools-elements-container");
+ elementsContainer.style.display = "none";
+ let isCollapsed = true;
+ categoryHeader.onclick = () => {
+ isCollapsed = !isCollapsed;
+ elementsContainer.style.display = isCollapsed ? "none" : "block";
+ expandIcon.style.transform = isCollapsed ? "rotate(-90deg)" : "rotate(0deg)";
+ };
+ expandIcon.style.transform = "rotate(-90deg)";
+ renderCategoryElements(category, plugin, elementsContainer, mermaid, categoryService);
+ });
+}
+function renderCategoryElements(category, plugin, parentEl, mermaid, categoryService) {
+ const elements = plugin.settings.elements.filter((e) => e.categoryId === category.id).sort((a, b) => a.sortingOrder - b.sortingOrder);
+ if (elements.length === 0) {
+ const emptyMessage = parentEl.createDiv();
+ emptyMessage.textContent = "No elements in this category";
+ emptyMessage.style.color = "var(--text-muted)";
+ emptyMessage.style.fontStyle = "italic";
+ emptyMessage.style.padding = "10px";
+ return;
+ }
+ elements.forEach((element, index) => {
+ const settingContainer = parentEl.createDiv("mermaid-tools-element-container");
+ settingContainer.style.marginBottom = "10px";
+ settingContainer.style.padding = "10px";
+ settingContainer.style.backgroundColor = "var(--background-secondary)";
+ settingContainer.style.borderRadius = "5px";
+ const setting = new import_obsidian4.Setting(settingContainer);
+ setting.setName(element.description);
+ setting.addExtraButton((cb) => {
+ cb.setIcon("edit").setTooltip("edit element").onClick(() => {
+ const modal = new EditMermaidElementModal(plugin.app, plugin, mermaid, element, categoryService);
+ modal.open();
+ modal.onClose = () => {
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ };
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("copy").setTooltip("create a duplicate of this element").onClick(() => {
+ const duplicate = {
+ id: crypto.randomUUID(),
+ categoryId: element.categoryId,
+ description: element.description + " (copy)",
+ content: element.content,
+ sortingOrder: plugin.settings.elements.filter((el) => el.categoryId === element.categoryId).length,
+ isPinned: element.isPinned
+ };
+ plugin._mermaidElementService.saveElement(duplicate, plugin);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("arrow-up").setTooltip("move element up in the sidebar").onClick(() => {
+ if (index > 0) {
+ const temp = elements[index - 1].sortingOrder;
+ elements[index - 1].sortingOrder = element.sortingOrder;
+ element.sortingOrder = temp;
+ plugin.settings.elements = plugin.settings.elements.filter((el) => el.categoryId !== category.id).concat(elements);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ }
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("arrow-down").setTooltip("move element down in the sidebar").onClick(() => {
+ if (index < elements.length - 1) {
+ const temp = elements[index + 1].sortingOrder;
+ elements[index + 1].sortingOrder = element.sortingOrder;
+ element.sortingOrder = temp;
+ plugin.settings.elements = plugin.settings.elements.filter((el) => el.categoryId !== category.id).concat(elements);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ }
+ });
+ });
+ setting.addExtraButton((cb) => {
+ cb.setIcon("trash-2").setTooltip("delete element").onClick(() => {
+ plugin.settings.elements = plugin.settings.elements.filter((e) => e.id !== element.id);
+ plugin.saveSettings();
+ const settingsContainer = parentEl.closest(".vertical-tab-content");
+ if (settingsContainer)
+ renderSettings(settingsContainer, plugin);
+ });
+ });
+ });
+}
+
+// src/ui/toolbarView/mermaidToolbarView.ts
+var import_obsidian6 = require("obsidian");
+
+// src/ui/toolbarView/viewHelpers.ts
+var import_obsidian5 = require("obsidian");
+var TOOLBAR_ELEMENT_CLASS_NAME = "mermaid-toolbar-element";
+var TOOLBAR_ELEMENTS_CONTAINER_CLASS_NAME = "mermaid-toolbar-elements-container";
+var TOOLBAR_ELEMENTS_CONTAINER_ID = "mermaid-toolbar-elements-container-id";
+async function createMermaidToolbar(topRowButtons, items, selectedCategoryId, onCategoryChanged, onElementClick, categoryService) {
+ const container = document.createElement("div");
+ const topRow = container.createDiv();
+ topRow.addClass("mermaid-toolbar-top-row");
+ const elementsContainer = container.createDiv();
+ elementsContainer.addClass(TOOLBAR_ELEMENTS_CONTAINER_CLASS_NAME);
+ elementsContainer.setAttr("id", TOOLBAR_ELEMENTS_CONTAINER_ID);
+ createDropdown(topRow, elementsContainer, items, selectedCategoryId, onCategoryChanged, onElementClick, categoryService);
+ createTopRowBtns(topRow, topRowButtons);
+ await recreateElementsSection(elementsContainer, selectedCategoryId, items, onElementClick, categoryService);
+ return container;
+}
+function createTopRowBtns(parentEl, buttons) {
+ buttons.forEach((btn) => {
+ const b = new import_obsidian5.ButtonComponent(parentEl).setClass("clickable-icon").setIcon(btn.iconName).setTooltip(btn.tooltip).onClick(btn.callback);
+ });
+}
+function createDropdown(parentEl, elementsContainer, items, selectedCategoryId, onSelectionChanged, onElClick, categoryService) {
+ const categories = categoryService.getCategories();
+ const dropdown = new import_obsidian5.DropdownComponent(parentEl);
+ categories.forEach((category) => {
+ dropdown.addOption(category.id, category.name);
+ });
+ dropdown.setValue(selectedCategoryId);
+ dropdown.onChange((val) => {
+ onSelectionChanged(val);
+ recreateElementsSection(elementsContainer, val, items, onElClick, categoryService);
+ });
+}
+async function recreateElementsSection(sectionContainer, categoryId, items, onElClick, categoryService) {
+ sectionContainer.innerHTML = "";
+ const elemService = new MermaidElementService();
+ const mermaid = await (0, import_obsidian5.loadMermaid)();
+ const filteredSortedItems = items.filter((i) => i.categoryId === categoryId).sort((a, b) => a.sortingOrder - b.sortingOrder);
+ filteredSortedItems.forEach(async (elem, index) => {
+ const el = createToolbarElement(sectionContainer);
+ el.id = `mermaid-toolbar-element-${elem.categoryId}-${index}`;
+ const diagram = elemService.wrapAsCompleteDiagram(elem);
+ console.log(mermaid.detectType(diagram));
+ const { svg } = await mermaid.render(el.id, diagram);
+ el.title = elem.description;
+ el.innerHTML = svg;
+ el.onclick = (e) => onElClick(elem.content);
+ sectionContainer.appendChild(el);
+ });
+}
+function createToolbarElement(parentEl) {
+ const itemEl = parentEl.createEl("pre");
+ itemEl.addClass(TOOLBAR_ELEMENT_CLASS_NAME);
+ return itemEl;
+}
+
+// src/ui/toolbarView/mermaidToolbarButtons.ts
+var MermaidToolbarButton = class {
+ constructor(tooltip, iconName, callback) {
+ this.tooltip = tooltip;
+ this.iconName = iconName;
+ this.callback = callback;
+ }
+};
+
+// src/ui/toolbarView/mermaidToolbarView.ts
+var _MermaidToolbarView = class extends import_obsidian6.ItemView {
+ constructor(leaf, plugin) {
+ super(leaf);
+ this.topRowButtons = [
+ new MermaidToolbarButton("insert Mermaid code block with sample diagram", "code-2", () => this.insertTextAtCursor(this._plugin._mermaidElementService.getSampleDiagram(this._plugin.settings.selectedCategoryId))),
+ new MermaidToolbarButton("open Mermaid.js documentation web page", "external-link", () => window.open("https://mermaid.js.org/intro/")),
+ new MermaidToolbarButton("open settings", "settings", () => {
+ this.app.setting.open();
+ this.app.setting.openTabById("mermaid-tools");
+ })
+ ];
+ this._plugin = plugin;
+ this.items = plugin.settings.elements;
+ this.categoryService = CategoryService.getInstance();
+ this.categoryService.loadCategories(plugin.settings.customCategories, plugin.settings.defaultCategorySortOrders);
+ this.containerEl.children[1].addClass("mermaid-toolbar-container");
+ }
+ async onOpen() {
+ await this.recreateToolbar(this._plugin.settings.selectedCategoryId);
+ }
+ async onClose() {
+ }
+ async recreateToolbar(selectedCategoryId) {
+ const container = this.containerEl.children[1];
+ container.empty();
+ const toolbarElement = await createMermaidToolbar(this.topRowButtons, this.items, selectedCategoryId, async (newCategoryId) => {
+ this._plugin.settings.selectedCategoryId = newCategoryId;
+ this._plugin.saveSettings();
+ await this.recreateToolbar(this._plugin.settings.selectedCategoryId);
+ }, (text) => this.insertTextAtCursor(text), this.categoryService);
+ container.appendChild(toolbarElement);
+ }
+ insertTextAtCursor(text) {
+ this._plugin.insertTextAtCursor(text);
+ }
+ getViewType() {
+ return _MermaidToolbarView.VIEW_TYPE;
+ }
+ getDisplayText() {
+ return _MermaidToolbarView.VIEW_DESCRIPTION;
+ }
+ getIcon() {
+ return TRIDENT_ICON_NAME;
+ }
+};
+var MermaidToolbarView = _MermaidToolbarView;
+MermaidToolbarView.VIEW_TYPE = "mermaid-toolbar-view";
+MermaidToolbarView.VIEW_DESCRIPTION = "Mermaid Toolbar";
+
+// main.ts
+var TRIDENT_ICON_NAME = "trident-custom";
+var MermaidPlugin = class extends import_obsidian7.Plugin {
+ constructor() {
+ super(...arguments);
+ this._mermaidElementService = new MermaidElementService();
+ this._textEditorService = new TextEditorService();
+ }
+ async onload() {
+ await this.loadSettings();
+ addTridentIcon();
+ this.registerView(MermaidToolbarView.VIEW_TYPE, (leaf) => new MermaidToolbarView(leaf, this));
+ this.app.workspace.on("active-leaf-change", (leaf) => {
+ var _a, _b;
+ this.activeEditor = (_b = (_a = this.app.workspace.activeEditor) == null ? void 0 : _a.editor) != null ? _b : this.activeEditor;
+ });
+ this.addRibbonIcon(TRIDENT_ICON_NAME, "Open Mermaid Toolbar", () => {
+ this.activateView();
+ });
+ this.addCommand({
+ id: "open-toolbar",
+ name: "Open Toolbar View",
+ callback: () => {
+ this.activateView();
+ }
+ });
+ this.addSettingTab(new MermaidToolsSettingsTab(this.app, this));
+ }
+ async onunload() {
+ this.app.workspace.detachLeavesOfType(MermaidToolbarView.VIEW_TYPE);
+ }
+ async loadSettings() {
+ this.settings = Object.assign({}, MermaidPluginSettings.DefaultSettings(), await this.loadData());
+ this.addNewCategories();
+ }
+ addNewCategories() {
+ if (!this.settings.elements.some((x) => x.categoryId === "mindmap")) {
+ this.settings.elements.push(...mindMapElements);
+ console.log("[Mermaid Tools] added Mindmap elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "timeline")) {
+ this.settings.elements.push(...timelineElements);
+ console.log("[Mermaid Tools] added Timeline elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "quadrantChart")) {
+ this.settings.elements.push(...quadrantElements);
+ console.log("[Mermaid Tools] added QuadrantChart elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "c4Diagram")) {
+ this.settings.elements.push(...c4DiagramElements);
+ console.log("[Mermaid Tools] added C4 diagram elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "packet")) {
+ this.settings.elements.push(...packetElements);
+ console.log("[Mermaid Tools] added Packet elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "kanban")) {
+ this.settings.elements.push(...kanbanElements);
+ console.log("[Mermaid Tools] added Kanban elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "block")) {
+ this.settings.elements.push(...blockDiagramElements);
+ console.log("[Mermaid Tools] added Block elements");
+ }
+ if (!this.settings.elements.some((x) => x.categoryId === "architecture")) {
+ this.settings.elements.push(...architectureElements);
+ console.log("[Mermaid Tools] added Architecture diagram elements");
+ }
+ }
+ async saveSettings() {
+ await this.saveData(this.settings);
+ await this.activateView();
+ }
+ async activateView() {
+ var _a;
+ this.app.workspace.detachLeavesOfType(MermaidToolbarView.VIEW_TYPE);
+ if (this.app.workspace === null)
+ return;
+ await ((_a = this.app.workspace.getRightLeaf(false)) == null ? void 0 : _a.setViewState({
+ type: MermaidToolbarView.VIEW_TYPE,
+ active: true
+ }));
+ this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(MermaidToolbarView.VIEW_TYPE)[0]);
+ }
+ insertTextAtCursor(text) {
+ this._textEditorService.insertTextAtCursor(this.activeEditor, text);
+ }
+};
+
+/* nosourcemap */
\ No newline at end of file
diff --git a/.obsidian/plugins/mermaid-tools/manifest.json b/.obsidian/plugins/mermaid-tools/manifest.json
new file mode 100644
index 0000000..15fc37e
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/manifest.json
@@ -0,0 +1,11 @@
+{
+ "id": "mermaid-tools",
+ "name": "Mermaid Tools",
+ "version": "1.3.0",
+ "minAppVersion": "1.4.0",
+ "description": "Improved Mermaid.js experience for Obsidian: visual toolbar with common elements & more",
+ "author": "dartungar",
+ "authorUrl": "https://dartungar.com",
+ "fundingUrl": "https://www.paypal.com/paypalme/dartungar",
+ "isDesktopOnly": false
+}
diff --git a/.obsidian/plugins/mermaid-tools/styles.css b/.obsidian/plugins/mermaid-tools/styles.css
new file mode 100644
index 0000000..73ce877
--- /dev/null
+++ b/.obsidian/plugins/mermaid-tools/styles.css
@@ -0,0 +1,149 @@
+.mermaid-toolbar-container, .mermaid-toolbar-container * {
+ max-width: 100%;
+ max-height: 100%;
+}
+
+.mermaid-toolbar-top-row {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.mermaid-toolbar-elements-container {
+ padding-top: 1rem;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
+.mermaid-toolbar-element {
+ font-size: var(--font-ui-small);
+ cursor: pointer;
+ padding: 2px 2px 2px 5px;
+ border-radius: 3px;
+ flex: 1 0 auto;
+}
+
+.mermaid-toolbar-element:hover {
+ background-color: var(--interactive-hover);
+}
+
+.mermaid-tools-element-category-header::before {
+ content: "▼ ";
+ font-size: 70%;
+ padding-bottom: 2px;
+}
+
+.mermaid-tools-element-category-header.collapsed::before {
+ content: "▶ ";
+ font-size: 70%;
+ padding-bottom: 2px;
+}
+
+.mermaid-tools-element-container {
+ padding-top: 6px;
+ border-bottom: var(--border-width) solid var(--color-base-35);
+}
+
+.mermaid-tools-edit-element-modal > div {
+ margin-bottom: 0.5rem;
+}
+
+.mermaid-tools-edit-element-modal label {
+ margin-right: 1rem;
+}
+
+/* Custom Category Management Styles */
+.mermaid-tools-category-management {
+ margin-bottom: 2rem;
+ padding: 1rem;
+ border: 1px solid var(--color-base-25);
+ border-radius: 8px;
+ background-color: var(--color-base-00);
+}
+
+.mermaid-tools-category-management h3 {
+ margin-top: 1rem;
+ margin-bottom: 0.5rem;
+ color: var(--text-accent);
+}
+
+.mermaid-tools-category-management button.mod-cta {
+ margin-bottom: 1rem;
+}
+
+/* Edit Category Modal Styles */
+.mermaid-tools-edit-category-modal {
+ min-width: 500px;
+}
+
+.mermaid-tools-edit-category-modal .setting-item {
+ padding: 8px 0;
+ border: none;
+}
+
+.mermaid-tools-edit-category-modal .setting-item-info {
+ flex-grow: 1;
+ margin-right: 12px;
+}
+
+.mermaid-tools-edit-category-modal .setting-item-name {
+ font-weight: 600;
+ color: var(--text-normal);
+}
+
+.mermaid-tools-edit-category-modal .setting-item-description {
+ color: var(--text-muted);
+ font-size: var(--font-ui-smaller);
+}
+
+.mermaid-tools-edit-category-modal input,
+.mermaid-tools-edit-category-modal textarea {
+ width: 100%;
+ padding: 4px 8px;
+ border: 1px solid var(--color-base-30);
+ border-radius: 4px;
+ background-color: var(--color-base-00);
+ color: var(--text-normal);
+}
+
+.mermaid-tools-edit-category-modal input:focus,
+.mermaid-tools-edit-category-modal textarea:focus {
+ border-color: var(--color-accent);
+ outline: none;
+ box-shadow: 0 0 0 2px var(--color-accent-2);
+}
+
+.modal-button-container {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+ margin-top: 20px;
+ padding-top: 16px;
+ border-top: 1px solid var(--color-base-25);
+}
+
+.modal-button-container button {
+ padding: 6px 16px;
+ border: 1px solid var(--color-base-30);
+ border-radius: 4px;
+ background-color: var(--color-base-10);
+ color: var(--text-normal);
+ cursor: pointer;
+ font-size: var(--font-ui-small);
+}
+
+.modal-button-container button:hover {
+ background-color: var(--color-base-20);
+}
+
+.modal-button-container button.mod-cta {
+ background-color: var(--color-accent);
+ color: var(--text-on-accent);
+ border-color: var(--color-accent);
+}
+
+.modal-button-container button.mod-cta:hover {
+ background-color: var(--color-accent-hover);
+}
\ No newline at end of file
diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json
index 3840df3..b7507ab 100644
--- a/.obsidian/workspace.json
+++ b/.obsidian/workspace.json
@@ -4,35 +4,49 @@
"type": "split",
"children": [
{
- "id": "6ce0f4672b59a07b",
+ "id": "b1afd552ee0aa86f",
"type": "tabs",
"children": [
{
- "id": "b5daf62d6db275c6",
+ "id": "de53b1cb0148b07a",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
- "file": "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/status_entities.md",
+ "file": "WORK & PROJECTS/Mol/Серверы/mail.mol-soft.ru.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
- "title": "status_entities"
+ "title": "mail.mol-soft.ru"
}
},
{
- "id": "5c58359e6dbf08fd",
+ "id": "1a96eb94eb81650d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
- "file": "WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md",
+ "file": "WORK & PROJECTS/UAS/Servers access.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
- "title": "План СИЛА"
+ "title": "Servers access"
+ }
+ },
+ {
+ "id": "267d6f6cb1297872",
+ "type": "leaf",
+ "state": {
+ "type": "markdown",
+ "state": {
+ "file": "WORK & PROJECTS/Mol/Серверы/moldev.ru.md",
+ "mode": "source",
+ "source": false
+ },
+ "icon": "lucide-file",
+ "title": "moldev.ru"
}
}
],
@@ -93,7 +107,7 @@
}
],
"direction": "horizontal",
- "width": 314.5
+ "width": 561.5
},
"right": {
"id": "5a12b65cf742d665",
@@ -109,7 +123,7 @@
"state": {
"type": "backlink",
"state": {
- "file": "WORK & PROJECTS/Ulab/Доступы к точкам.md",
+ "file": "WORK & PROJECTS/Mol/Планы и диаграммы/Разработка - 06_2025.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@@ -119,7 +133,7 @@
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
- "title": "Обратные ссылки для Доступы к точкам"
+ "title": "Backlinks for Разработка - 06_2025"
}
},
{
@@ -128,12 +142,12 @@
"state": {
"type": "outgoing-link",
"state": {
- "file": "WORK & PROJECTS/Ulab/Доступы к точкам.md",
+ "file": "WORK & PROJECTS/Mol/Планы и диаграммы/Разработка - 06_2025.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
- "title": "Исходящие ссылки из Доступы к точкам"
+ "title": "Outgoing links from Разработка - 06_2025"
}
},
{
@@ -143,10 +157,12 @@
"type": "tag",
"state": {
"sortOrder": "frequency",
- "useHierarchy": true
+ "useHierarchy": true,
+ "showSearch": false,
+ "searchQuery": ""
},
"icon": "lucide-tags",
- "title": "Теги"
+ "title": "Tags"
}
},
{
@@ -155,21 +171,31 @@
"state": {
"type": "outline",
"state": {
- "file": "WORK & PROJECTS/Mol/Планы и диаграммы/План СИЛА.md",
+ "file": "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/Динамические поля Заявок (декомпозиция) 2026.02.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
- "title": "Структура План СИЛА"
+ "title": "Outline of Динамические поля Заявок (декомпозиция) 2026.02"
+ }
+ },
+ {
+ "id": "393ba628f8d04189",
+ "type": "leaf",
+ "state": {
+ "type": "git-view",
+ "state": {},
+ "icon": "git-pull-request",
+ "title": "Source Control"
}
}
],
- "currentTab": 3
+ "currentTab": 4
}
],
"direction": "horizontal",
- "width": 300
+ "width": 200
},
"left-ribbon": {
"hiddenItems": {
@@ -181,58 +207,59 @@
"command-palette:Открыть палитру команд": false,
"bases:Создать новую базу": false,
"obsidian-full-calendar:Open Full Calendar": false,
- "obsidian-git:Open Git source control": false
+ "obsidian-git:Open Git source control": false,
+ "mermaid-tools:Open Mermaid Toolbar": false
}
},
- "active": "221c41e61c302338",
+ "active": "1a96eb94eb81650d",
"lastOpenFiles": [
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Шаблон договора 2024-2025.doc",
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Оборудование.xlsx",
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/ОА ЛИМС.xlsx",
+ "Без названия.md",
+ "WORK & PROJECTS/Mol/Серверы/mail.mol-soft.ru.md",
+ "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов/Operation_Check_PJSC_Sberbank_04032026.pdf",
+ "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов/beget_2026_03.pdf",
+ "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов/beget_2026_03.pdf.crdownload",
+ "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов/firstvds_2026_03.pdf",
"WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/для ЛИМС.7z",
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/_Сотрудники.xlsx",
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/_Помещения.xlsx",
"WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/f92754ca-70d3-4753-ae10-3a29e541da4f.pdf",
"WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Act.xlsx",
"WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Account.xlsx",
- "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB",
- "WORK & PROJECTS/Mol/Документы ООО Моль-софт/Счета оплаты серверов/firstvds_2026_03.pdf",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/entities flow.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/Структура статусов.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Система тарификации/Расчёт тарифов и списаний.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/1.0/1.0.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/00001_Редактор_форм/Таблицы нумератора и документов.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/00001_Редактор_форм/Архитектура редактора и генератора (Alfa + Mol).canvas",
- "JRPG.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Websockets scheme.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud prod.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/notifies.canvas",
- "WORK & PROJECTS/Mol/Планы и диаграммы/СМК.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/00001_Редактор_форм/Описание первой версии.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Схема связей юрлиц и адресов.canvas",
- "WORK & PROJECTS/UAS/Untitled.canvas",
+ "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Шаблон договора 2024-2025.doc",
+ "WORK & PROJECTS/Mol/Документы для ТЗ ЛИМС/GRB/Оборудование.xlsx",
"WORK & PROJECTS/UAS/Servers access.md",
- "WORK & PROJECTS/UAS/Plan.md",
- "WORK & PROJECTS/UAS/IP-TEL.png",
- "WORK & PROJECTS/UAS/Access.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/Динамические поля Заявок (декомпозиция) 2026.02.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/pgo_to_groups.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/modules_to_dyn_controls.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/dynamic_controls_table.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/test logic.md",
- "Untitled 1.md",
- "PERSONAL PROJECTS/cloudflare temp mail.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/samplings table.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/pgo_to_groups.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/modules_to_dyn_controls.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/dynamic_controls_table.md",
- "Untitled.md",
- "WORK & PROJECTS/Mol/Серверы/1С Бухгалтерия.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/status_stages.md",
- "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/status_stage_logs.md",
+ "WORK & PROJECTS/Mol/Серверы/moldev.ru.md",
+ "WORK & PROJECTS/Mol/Серверы/VPN-FIREWALL-GATE (Cerberus).md",
"conflict-files-obsidian-git.md",
+ "WORK & PROJECTS/UAS/IP-TEL.png",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Схема образца испытаний и заявки.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Структура таблиц. Основа + заказы.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa PROD NODE script.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/Динамические поля заявки v2.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/Динамические поля заявки v2 архитектура.canvas",
+ "WORK & PROJECTS/Mol/Серверы/Jira - Service - Confluence - Crm.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/Динамические поля Заявок (декомпозиция) 2026.02.md",
+ "WORK & PROJECTS/UAS/IP-TEL.canvas",
+ "Untitled 1.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/samplings table.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/test logic.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/ТЗ динамических полей и ФИЗов.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Заказы/Динамические поля/pgo_to_groups.md",
"WORK & PROJECTS/Mol/Планы и диаграммы/Разработка - 08_2025.md",
"WORK & PROJECTS/Mol/Deepseek API-key.md",
+ "WORK & PROJECTS/Mol/Ideas/Все идеи для Моли.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud readme.md",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Alfa Cloud/Alfa cloud prod.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/entities flow.canvas",
+ "WORK & PROJECTS/Mol/Планы и диаграммы/Согласования и статусы/Структура статусов.canvas",
+ "PERSONAL PROJECTS/P2EP/cdRead.canvas",
+ "WORK & PROJECTS/UAS/Plan.md",
+ "WORK & PROJECTS/UAS/Access.md",
+ "PERSONAL PROJECTS/cloudflare temp mail.md",
+ "PERSONAL PROJECTS/P2EP/pseudoCode/fade calculation.md",
+ "WORK & PROJECTS/Mol/Серверы/Supervisor/job_worker.md",
+ "WORK & PROJECTS/Mol/Серверы/Mol Public Prod.md",
+ "2025-07-18.md",
+ "JRPG.md",
+ "Untitled.md",
"Структура объектов испытаний.png",
"Схема связей юрлиц и адресов.png",
"WORK & PROJECTS/img/Pasted image 20241212175419.png",
diff --git a/Без названия.md b/Без названия.md
new file mode 100644
index 0000000..5902ab2
--- /dev/null
+++ b/Без названия.md
@@ -0,0 +1,29 @@
+```mermaid
+sequenceDiagram
+ participant Encoder
+ participant File as "RLE File"
+ participant Decoder
+ Encoder->>File: write header (Type, Mode, ID, Size)
+ Encoder->>File: emit literal packet (count-1 + literals)
+ Encoder->>File: emit run packet (0x7D + N, byte or offset)
+ Encoder->>File: emit backref packet (0x7E + len, distance-1)
+ File->>Decoder: provide packet stream
+ Decoder->>Decoder: if control < 0x80 → copy (control+1) literals
+ Decoder->>Decoder: else → read param; if run → repeat byte; if backref → copy from output buffer
+ Decoder-->>File: produce decompressed bytes (output)
+```
+
+```mermaid
+sequenceDiagram
+ participant Encoder
+ participant File as "RLE File"
+ participant Decoder
+ Encoder->>File: write header (Type, Mode, ID, Size)
+ Encoder->>File: emit literal packet (count-1 + literals)
+ Encoder->>File: emit run packet (0x7D + N, byte or offset)
+ Encoder->>File: emit backref packet (0x7E + len, distance-1)
+ File->>Decoder: provide packet stream
+ Decoder->>Decoder: if control < 0x80 → copy (control+1) literals
+ Decoder->>Decoder: else → read param; if run → repeat byte; if backref → copy from output buffer
+ Decoder-->>File: produce decompressed bytes (output)
+```