docs: add architecture and veins documentation
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- System overview, artery hierarchy, build flow, room config diagrams - Veins docs: Jira, Slack, Google OAuth - Shunts docs: MercadoPago mock - DOT source files with generated SVGs - HTML viewers with navigation and full-screen mode Solves: - Freelance work standardization - Missing infrastructure replication (shunts) - Reliable testing environment (BDD -> Gherkin -> Tests)
This commit is contained in:
102
docs/architecture/01-system-overview.dot
Normal file
102
docs/architecture/01-system-overview.dot
Normal file
@@ -0,0 +1,102 @@
|
||||
digraph SystemOverview {
|
||||
// Graph settings
|
||||
rankdir=TB;
|
||||
compound=true;
|
||||
fontname="Helvetica";
|
||||
node [fontname="Helvetica", fontsize=11];
|
||||
edge [fontname="Helvetica", fontsize=10];
|
||||
|
||||
// Title
|
||||
labelloc="t";
|
||||
label="Soleprint - System Overview";
|
||||
fontsize=16;
|
||||
|
||||
// Styling
|
||||
node [shape=box, style="rounded,filled"];
|
||||
|
||||
// Core Hub
|
||||
subgraph cluster_soleprint {
|
||||
label="Soleprint Hub (port 12000)";
|
||||
style=filled;
|
||||
color="#E8F5E9";
|
||||
fillcolor="#E8F5E9";
|
||||
|
||||
hub [label="Soleprint\nCore Coordinator", fillcolor="#C8E6C9", shape=box];
|
||||
}
|
||||
|
||||
// Artery System
|
||||
subgraph cluster_artery {
|
||||
label="Artery - Todo lo vital";
|
||||
style=filled;
|
||||
color="#FFEBEE";
|
||||
fillcolor="#FFEBEE";
|
||||
|
||||
veins [label="Veins\n(Stateless Connectors)", fillcolor="#FFCDD2"];
|
||||
shunts [label="Shunts\n(Mock Connectors)", fillcolor="#FFCDD2"];
|
||||
pulses [label="Pulses\n(Composed Flows)", fillcolor="#EF9A9A"];
|
||||
plexus [label="Plexus\n(Full Apps)", fillcolor="#E57373"];
|
||||
}
|
||||
|
||||
// Atlas System
|
||||
subgraph cluster_atlas {
|
||||
label="Atlas - Documentacion accionable";
|
||||
style=filled;
|
||||
color="#E3F2FD";
|
||||
fillcolor="#E3F2FD";
|
||||
|
||||
books [label="Books\n(Documentation)", fillcolor="#BBDEFB"];
|
||||
templates [label="Templates\n(Patterns)", fillcolor="#BBDEFB"];
|
||||
depots [label="Depots\n(External Docs)", fillcolor="#90CAF9"];
|
||||
}
|
||||
|
||||
// Station System
|
||||
subgraph cluster_station {
|
||||
label="Station - Centro de control";
|
||||
style=filled;
|
||||
color="#FFF8E1";
|
||||
fillcolor="#FFF8E1";
|
||||
|
||||
tools [label="Tools\n(modelgen, tester, datagen)", fillcolor="#FFECB3"];
|
||||
monitors [label="Monitors\n(databrowse)", fillcolor="#FFECB3"];
|
||||
}
|
||||
|
||||
// External
|
||||
subgraph cluster_external {
|
||||
label="External Services";
|
||||
style=dashed;
|
||||
color=gray;
|
||||
|
||||
jira [label="Jira", fillcolor="#E8EAF6"];
|
||||
slack [label="Slack", fillcolor="#E8EAF6"];
|
||||
google [label="Google", fillcolor="#E8EAF6"];
|
||||
mercadopago [label="MercadoPago", fillcolor="#E8EAF6"];
|
||||
}
|
||||
|
||||
// Managed Room
|
||||
subgraph cluster_room {
|
||||
label="Managed Room (e.g., AMAR)";
|
||||
style=dashed;
|
||||
color="#7B1FA2";
|
||||
|
||||
room_backend [label="Backend\n(Django/FastAPI)", fillcolor="#E1BEE7"];
|
||||
room_frontend [label="Frontend\n(Next.js)", fillcolor="#E1BEE7"];
|
||||
room_db [label="Database\n(PostgreSQL)", fillcolor="#CE93D8", shape=cylinder];
|
||||
}
|
||||
|
||||
// Connections
|
||||
hub -> veins [label="routes"];
|
||||
hub -> books [label="routes"];
|
||||
hub -> tools [label="routes"];
|
||||
|
||||
veins -> jira [label="API"];
|
||||
veins -> slack [label="API"];
|
||||
veins -> google [label="OAuth"];
|
||||
shunts -> mercadopago [label="mock", style=dashed];
|
||||
|
||||
veins -> pulses [label="compose"];
|
||||
pulses -> plexus [label="extend"];
|
||||
|
||||
tools -> room_backend [label="test", style=dashed];
|
||||
monitors -> room_db [label="browse", style=dashed];
|
||||
depots -> room_backend [label="docs", style=dashed];
|
||||
}
|
||||
244
docs/architecture/01-system-overview.svg
Normal file
244
docs/architecture/01-system-overview.svg
Normal file
@@ -0,0 +1,244 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 14.1.1 (0)
|
||||
-->
|
||||
<!-- Title: SystemOverview Pages: 1 -->
|
||||
<svg width="968pt" height="448pt"
|
||||
viewBox="0.00 0.00 968.00 448.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 444.38)">
|
||||
<title>SystemOverview</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-444.38 964,-444.38 964,4 -4,4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="480" y="-421.18" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - System Overview</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_soleprint</title>
|
||||
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="258,-325.38 258,-404.88 493,-404.88 493,-325.38 258,-325.38"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="375.5" y="-385.68" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint Hub (port 12000)</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_artery</title>
|
||||
<polygon fill="#ffebee" stroke="#ffebee" points="8,-8 8,-294.62 304,-294.62 304,-8 8,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="156" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Artery - Todo lo vital</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_atlas</title>
|
||||
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="312,-215.12 312,-294.62 647,-294.62 647,-215.12 312,-215.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="479.5" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Atlas - Documentacion accionable</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_station</title>
|
||||
<polygon fill="#fff8e1" stroke="#fff8e1" points="655,-215.12 655,-294.62 951,-294.62 951,-215.12 655,-215.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="803" y="-275.43" font-family="Helvetica,sans-Serif" font-size="16.00">Station - Centro de control</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_external</title>
|
||||
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="312,-98.81 312,-178.31 634,-178.31 634,-98.81 312,-98.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="473" y="-159.11" font-family="Helvetica,sans-Serif" font-size="16.00">External Services</text>
|
||||
</g>
|
||||
<g id="clust6" class="cluster">
|
||||
<title>cluster_room</title>
|
||||
<polygon fill="none" stroke="#7b1fa2" stroke-dasharray="5,2" points="642,-92.75 642,-184.38 952,-184.38 952,-92.75 642,-92.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="797" y="-165.18" font-family="Helvetica,sans-Serif" font-size="16.00">Managed Room (e.g., AMAR)</text>
|
||||
</g>
|
||||
<!-- hub -->
|
||||
<g id="node1" class="node">
|
||||
<title>hub</title>
|
||||
<path fill="#c8e6c9" stroke="black" d="M417.88,-369.38C417.88,-369.38 332.12,-369.38 332.12,-369.38 326.12,-369.38 320.12,-363.38 320.12,-357.38 320.12,-357.38 320.12,-345.38 320.12,-345.38 320.12,-339.38 326.12,-333.38 332.12,-333.38 332.12,-333.38 417.88,-333.38 417.88,-333.38 423.88,-333.38 429.88,-339.38 429.88,-345.38 429.88,-345.38 429.88,-357.38 429.88,-357.38 429.88,-363.38 423.88,-369.38 417.88,-369.38"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="375" y="-354.43" font-family="Helvetica,sans-Serif" font-size="11.00">Soleprint</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="375" y="-340.93" font-family="Helvetica,sans-Serif" font-size="11.00">Core Coordinator</text>
|
||||
</g>
|
||||
<!-- veins -->
|
||||
<g id="node2" class="node">
|
||||
<title>veins</title>
|
||||
<path fill="#ffcdd2" stroke="black" d="M146,-259.12C146,-259.12 28,-259.12 28,-259.12 22,-259.12 16,-253.12 16,-247.12 16,-247.12 16,-235.12 16,-235.12 16,-229.12 22,-223.12 28,-223.12 28,-223.12 146,-223.12 146,-223.12 152,-223.12 158,-229.12 158,-235.12 158,-235.12 158,-247.12 158,-247.12 158,-253.12 152,-259.12 146,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Veins</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Stateless Connectors)</text>
|
||||
</g>
|
||||
<!-- hub->veins -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>hub->veins</title>
|
||||
<path fill="none" stroke="black" d="M319.94,-340.62C277.04,-331.84 216.64,-316.87 167,-294.62 150.13,-287.06 132.8,-276.15 118.61,-266.23"/>
|
||||
<polygon fill="black" stroke="black" points="120.72,-263.44 110.56,-260.46 116.64,-269.13 120.72,-263.44"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="231.88" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||
</g>
|
||||
<!-- books -->
|
||||
<g id="node6" class="node">
|
||||
<title>books</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M417.5,-259.12C417.5,-259.12 332.5,-259.12 332.5,-259.12 326.5,-259.12 320.5,-253.12 320.5,-247.12 320.5,-247.12 320.5,-235.12 320.5,-235.12 320.5,-229.12 326.5,-223.12 332.5,-223.12 332.5,-223.12 417.5,-223.12 417.5,-223.12 423.5,-223.12 429.5,-229.12 429.5,-235.12 429.5,-235.12 429.5,-247.12 429.5,-247.12 429.5,-253.12 423.5,-259.12 417.5,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="375" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Books</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="375" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Documentation)</text>
|
||||
</g>
|
||||
<!-- hub->books -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>hub->books</title>
|
||||
<path fill="none" stroke="black" d="M375,-332.98C375,-316.25 375,-290.66 375,-270.9"/>
|
||||
<polygon fill="black" stroke="black" points="378.5,-270.99 375,-260.99 371.5,-270.99 378.5,-270.99"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="390.38" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||
</g>
|
||||
<!-- tools -->
|
||||
<g id="node9" class="node">
|
||||
<title>tools</title>
|
||||
<path fill="#ffecb3" stroke="black" d="M823,-259.12C823,-259.12 675,-259.12 675,-259.12 669,-259.12 663,-253.12 663,-247.12 663,-247.12 663,-235.12 663,-235.12 663,-229.12 669,-223.12 675,-223.12 675,-223.12 823,-223.12 823,-223.12 829,-223.12 835,-229.12 835,-235.12 835,-235.12 835,-247.12 835,-247.12 835,-253.12 829,-259.12 823,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="749" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Tools</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="749" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(modelgen, tester, datagen)</text>
|
||||
</g>
|
||||
<!-- hub->tools -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>hub->tools</title>
|
||||
<path fill="none" stroke="black" d="M430.22,-344.05C486.88,-336.46 576.95,-321.28 651,-294.62 672.05,-287.05 694.12,-275.57 711.98,-265.28"/>
|
||||
<polygon fill="black" stroke="black" points="713.56,-268.41 720.4,-260.32 710.01,-262.38 713.56,-268.41"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="637.44" y="-305.88" font-family="Helvetica,sans-Serif" font-size="10.00">routes</text>
|
||||
</g>
|
||||
<!-- pulses -->
|
||||
<g id="node4" class="node">
|
||||
<title>pulses</title>
|
||||
<path fill="#ef9a9a" stroke="black" d="M133.62,-142.81C133.62,-142.81 40.38,-142.81 40.38,-142.81 34.38,-142.81 28.38,-136.81 28.38,-130.81 28.38,-130.81 28.38,-118.81 28.38,-118.81 28.38,-112.81 34.38,-106.81 40.38,-106.81 40.38,-106.81 133.62,-106.81 133.62,-106.81 139.62,-106.81 145.62,-112.81 145.62,-118.81 145.62,-118.81 145.62,-130.81 145.62,-130.81 145.62,-136.81 139.62,-142.81 133.62,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Pulses</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Composed Flows)</text>
|
||||
</g>
|
||||
<!-- veins->pulses -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>veins->pulses</title>
|
||||
<path fill="none" stroke="black" d="M87,-222.76C87,-204.61 87,-175.84 87,-154.34"/>
|
||||
<polygon fill="black" stroke="black" points="90.5,-154.48 87,-144.48 83.5,-154.48 90.5,-154.48"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="109.12" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">compose</text>
|
||||
</g>
|
||||
<!-- jira -->
|
||||
<g id="node11" class="node">
|
||||
<title>jira</title>
|
||||
<path fill="#e8eaf6" stroke="black" d="M362,-142.81C362,-142.81 332,-142.81 332,-142.81 326,-142.81 320,-136.81 320,-130.81 320,-130.81 320,-118.81 320,-118.81 320,-112.81 326,-106.81 332,-106.81 332,-106.81 362,-106.81 362,-106.81 368,-106.81 374,-112.81 374,-118.81 374,-118.81 374,-130.81 374,-130.81 374,-136.81 368,-142.81 362,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="347" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Jira</text>
|
||||
</g>
|
||||
<!-- veins->jira -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>veins->jira</title>
|
||||
<path fill="none" stroke="black" d="M140.6,-222.66C149.39,-220.01 158.42,-217.4 167,-215.12 229,-198.71 255.03,-220.54 308,-184.38 319.35,-176.62 328.26,-164.37 334.68,-153.07"/>
|
||||
<polygon fill="black" stroke="black" points="337.65,-154.94 339.18,-144.46 331.45,-151.7 337.65,-154.94"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="300.73" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
|
||||
</g>
|
||||
<!-- slack -->
|
||||
<g id="node12" class="node">
|
||||
<title>slack</title>
|
||||
<path fill="#e8eaf6" stroke="black" d="M434,-142.81C434,-142.81 404,-142.81 404,-142.81 398,-142.81 392,-136.81 392,-130.81 392,-130.81 392,-118.81 392,-118.81 392,-112.81 398,-106.81 404,-106.81 404,-106.81 434,-106.81 434,-106.81 440,-106.81 446,-112.81 446,-118.81 446,-118.81 446,-130.81 446,-130.81 446,-136.81 440,-142.81 434,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="419" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Slack</text>
|
||||
</g>
|
||||
<!-- veins->slack -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>veins->slack</title>
|
||||
<path fill="none" stroke="black" d="M136.47,-222.69C146.47,-219.73 156.99,-217.01 167,-215.12 230.92,-203.12 248.99,-216.66 313,-205.12 344.93,-199.37 357.24,-204.11 383,-184.38 393.48,-176.34 401.63,-164.31 407.5,-153.25"/>
|
||||
<polygon fill="black" stroke="black" points="410.55,-154.97 411.77,-144.45 404.25,-151.91 410.55,-154.97"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="378.08" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">API</text>
|
||||
</g>
|
||||
<!-- google -->
|
||||
<g id="node13" class="node">
|
||||
<title>google</title>
|
||||
<path fill="#e8eaf6" stroke="black" d="M506.12,-142.81C506.12,-142.81 475.88,-142.81 475.88,-142.81 469.88,-142.81 463.88,-136.81 463.88,-130.81 463.88,-130.81 463.88,-118.81 463.88,-118.81 463.88,-112.81 469.88,-106.81 475.88,-106.81 475.88,-106.81 506.12,-106.81 506.12,-106.81 512.12,-106.81 518.12,-112.81 518.12,-118.81 518.12,-118.81 518.12,-130.81 518.12,-130.81 518.12,-136.81 512.12,-142.81 506.12,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="491" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">Google</text>
|
||||
</g>
|
||||
<!-- veins->google -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>veins->google</title>
|
||||
<path fill="none" stroke="black" d="M136.01,-222.63C146.14,-219.63 156.82,-216.91 167,-215.12 264.72,-197.96 292.34,-222.58 390,-205.12 419.85,-199.79 431.12,-203.07 455,-184.38 465.33,-176.29 473.42,-164.36 479.3,-153.37"/>
|
||||
<polygon fill="black" stroke="black" points="482.32,-155.15 483.58,-144.64 476.03,-152.07 482.32,-155.15"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="458.15" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">OAuth</text>
|
||||
</g>
|
||||
<!-- shunts -->
|
||||
<g id="node3" class="node">
|
||||
<title>shunts</title>
|
||||
<path fill="#ffcdd2" stroke="black" d="M283.75,-259.12C283.75,-259.12 188.25,-259.12 188.25,-259.12 182.25,-259.12 176.25,-253.12 176.25,-247.12 176.25,-247.12 176.25,-235.12 176.25,-235.12 176.25,-229.12 182.25,-223.12 188.25,-223.12 188.25,-223.12 283.75,-223.12 283.75,-223.12 289.75,-223.12 295.75,-229.12 295.75,-235.12 295.75,-235.12 295.75,-247.12 295.75,-247.12 295.75,-253.12 289.75,-259.12 283.75,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="236" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Shunts</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="236" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Mock Connectors)</text>
|
||||
</g>
|
||||
<!-- mercadopago -->
|
||||
<g id="node14" class="node">
|
||||
<title>mercadopago</title>
|
||||
<path fill="#e8eaf6" stroke="black" d="M613.75,-142.81C613.75,-142.81 548.25,-142.81 548.25,-142.81 542.25,-142.81 536.25,-136.81 536.25,-130.81 536.25,-130.81 536.25,-118.81 536.25,-118.81 536.25,-112.81 542.25,-106.81 548.25,-106.81 548.25,-106.81 613.75,-106.81 613.75,-106.81 619.75,-106.81 625.75,-112.81 625.75,-118.81 625.75,-118.81 625.75,-130.81 625.75,-130.81 625.75,-136.81 619.75,-142.81 613.75,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="581" y="-121.11" font-family="Helvetica,sans-Serif" font-size="11.00">MercadoPago</text>
|
||||
</g>
|
||||
<!-- shunts->mercadopago -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>shunts->mercadopago</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M280.02,-222.71C289.15,-219.71 298.79,-216.97 308,-215.12 404.38,-195.85 445.68,-239.58 527,-184.38 539.87,-175.64 551.86,-163.27 561.25,-152.15"/>
|
||||
<polygon fill="black" stroke="black" points="563.97,-154.36 567.54,-144.39 558.53,-149.95 563.97,-154.36"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="526.27" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">mock</text>
|
||||
</g>
|
||||
<!-- plexus -->
|
||||
<g id="node5" class="node">
|
||||
<title>plexus</title>
|
||||
<path fill="#e57373" stroke="black" d="M112.25,-52C112.25,-52 61.75,-52 61.75,-52 55.75,-52 49.75,-46 49.75,-40 49.75,-40 49.75,-28 49.75,-28 49.75,-22 55.75,-16 61.75,-16 61.75,-16 112.25,-16 112.25,-16 118.25,-16 124.25,-22 124.25,-28 124.25,-28 124.25,-40 124.25,-40 124.25,-46 118.25,-52 112.25,-52"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="87" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(Full Apps)</text>
|
||||
</g>
|
||||
<!-- pulses->plexus -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>pulses->plexus</title>
|
||||
<path fill="none" stroke="black" d="M87,-106.69C87,-94.48 87,-77.78 87,-63.57"/>
|
||||
<polygon fill="black" stroke="black" points="90.5,-63.89 87,-53.89 83.5,-63.89 90.5,-63.89"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="103.88" y="-73.25" font-family="Helvetica,sans-Serif" font-size="10.00">extend</text>
|
||||
</g>
|
||||
<!-- templates -->
|
||||
<g id="node7" class="node">
|
||||
<title>templates</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M506.75,-259.12C506.75,-259.12 459.25,-259.12 459.25,-259.12 453.25,-259.12 447.25,-253.12 447.25,-247.12 447.25,-247.12 447.25,-235.12 447.25,-235.12 447.25,-229.12 453.25,-223.12 459.25,-223.12 459.25,-223.12 506.75,-223.12 506.75,-223.12 512.75,-223.12 518.75,-229.12 518.75,-235.12 518.75,-235.12 518.75,-247.12 518.75,-247.12 518.75,-253.12 512.75,-259.12 506.75,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="483" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Templates</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="483" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(Patterns)</text>
|
||||
</g>
|
||||
<!-- depots -->
|
||||
<g id="node8" class="node">
|
||||
<title>depots</title>
|
||||
<path fill="#90caf9" stroke="black" d="M626.75,-259.12C626.75,-259.12 549.25,-259.12 549.25,-259.12 543.25,-259.12 537.25,-253.12 537.25,-247.12 537.25,-247.12 537.25,-235.12 537.25,-235.12 537.25,-229.12 543.25,-223.12 549.25,-223.12 549.25,-223.12 626.75,-223.12 626.75,-223.12 632.75,-223.12 638.75,-229.12 638.75,-235.12 638.75,-235.12 638.75,-247.12 638.75,-247.12 638.75,-253.12 632.75,-259.12 626.75,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="588" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Depots</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="588" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(External Docs)</text>
|
||||
</g>
|
||||
<!-- room_backend -->
|
||||
<g id="node15" class="node">
|
||||
<title>room_backend</title>
|
||||
<path fill="#e1bee7" stroke="black" d="M744.38,-142.81C744.38,-142.81 661.62,-142.81 661.62,-142.81 655.62,-142.81 649.62,-136.81 649.62,-130.81 649.62,-130.81 649.62,-118.81 649.62,-118.81 649.62,-112.81 655.62,-106.81 661.62,-106.81 661.62,-106.81 744.38,-106.81 744.38,-106.81 750.38,-106.81 756.38,-112.81 756.38,-118.81 756.38,-118.81 756.38,-130.81 756.38,-130.81 756.38,-136.81 750.38,-142.81 744.38,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="703" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Backend</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="703" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Django/FastAPI)</text>
|
||||
</g>
|
||||
<!-- depots->room_backend -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>depots->room_backend</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M605.47,-222.76C624.74,-203.6 655.94,-172.59 677.85,-150.81"/>
|
||||
<polygon fill="black" stroke="black" points="680.05,-153.56 684.67,-144.03 675.11,-148.6 680.05,-153.56"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="646.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">docs</text>
|
||||
</g>
|
||||
<!-- tools->room_backend -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>tools->room_backend</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M742.01,-222.76C734.61,-204.36 722.81,-175.03 714.12,-153.45"/>
|
||||
<polygon fill="black" stroke="black" points="717.45,-152.34 710.47,-144.37 710.95,-154.95 717.45,-152.34"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="743.5" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">test</text>
|
||||
</g>
|
||||
<!-- monitors -->
|
||||
<g id="node10" class="node">
|
||||
<title>monitors</title>
|
||||
<path fill="#ffecb3" stroke="black" d="M930.75,-259.12C930.75,-259.12 865.25,-259.12 865.25,-259.12 859.25,-259.12 853.25,-253.12 853.25,-247.12 853.25,-247.12 853.25,-235.12 853.25,-235.12 853.25,-229.12 859.25,-223.12 865.25,-223.12 865.25,-223.12 930.75,-223.12 930.75,-223.12 936.75,-223.12 942.75,-229.12 942.75,-235.12 942.75,-235.12 942.75,-247.12 942.75,-247.12 942.75,-253.12 936.75,-259.12 930.75,-259.12"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="898" y="-244.18" font-family="Helvetica,sans-Serif" font-size="11.00">Monitors</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="898" y="-230.68" font-family="Helvetica,sans-Serif" font-size="11.00">(databrowse)</text>
|
||||
</g>
|
||||
<!-- room_db -->
|
||||
<g id="node17" class="node">
|
||||
<title>room_db</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M944,-144.5C944,-146.91 924.28,-148.88 900,-148.88 875.72,-148.88 856,-146.91 856,-144.5 856,-144.5 856,-105.12 856,-105.12 856,-102.71 875.72,-100.75 900,-100.75 924.28,-100.75 944,-102.71 944,-105.12 944,-105.12 944,-144.5 944,-144.5"/>
|
||||
<path fill="none" stroke="black" d="M944,-144.5C944,-142.09 924.28,-140.12 900,-140.12 875.72,-140.12 856,-142.09 856,-144.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="900" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Database</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="900" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(PostgreSQL)</text>
|
||||
</g>
|
||||
<!-- monitors->room_db -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>monitors->room_db</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M898.3,-222.76C898.59,-206.37 899.03,-181.3 899.39,-160.77"/>
|
||||
<polygon fill="black" stroke="black" points="902.89,-160.87 899.56,-150.81 895.89,-160.75 902.89,-160.87"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="916.45" y="-195.62" font-family="Helvetica,sans-Serif" font-size="10.00">browse</text>
|
||||
</g>
|
||||
<!-- room_frontend -->
|
||||
<g id="node16" class="node">
|
||||
<title>room_frontend</title>
|
||||
<path fill="#e1bee7" stroke="black" d="M826,-142.81C826,-142.81 786,-142.81 786,-142.81 780,-142.81 774,-136.81 774,-130.81 774,-130.81 774,-118.81 774,-118.81 774,-112.81 780,-106.81 786,-106.81 786,-106.81 826,-106.81 826,-106.81 832,-106.81 838,-112.81 838,-118.81 838,-118.81 838,-130.81 838,-130.81 838,-136.81 832,-142.81 826,-142.81"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="806" y="-127.86" font-family="Helvetica,sans-Serif" font-size="11.00">Frontend</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="806" y="-114.36" font-family="Helvetica,sans-Serif" font-size="11.00">(Next.js)</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
86
docs/architecture/02-artery-hierarchy.dot
Normal file
86
docs/architecture/02-artery-hierarchy.dot
Normal file
@@ -0,0 +1,86 @@
|
||||
digraph ArteryHierarchy {
|
||||
// Graph settings
|
||||
rankdir=LR;
|
||||
compound=true;
|
||||
fontname="Helvetica";
|
||||
node [fontname="Helvetica", fontsize=11];
|
||||
edge [fontname="Helvetica", fontsize=10];
|
||||
|
||||
// Title
|
||||
labelloc="t";
|
||||
label="Artery - Connector Hierarchy";
|
||||
fontsize=16;
|
||||
|
||||
// Styling
|
||||
node [shape=box, style="rounded,filled"];
|
||||
|
||||
// Main hierarchy
|
||||
subgraph cluster_main {
|
||||
label="Evolution Path";
|
||||
style=filled;
|
||||
color="#E8F5E9";
|
||||
fillcolor="#E8F5E9";
|
||||
|
||||
vein [label="Vein\n\nStateless API connector\ne.g., Jira, Slack, Google", fillcolor="#C8E6C9", width=2.5];
|
||||
pulse [label="Pulse\n\nVein + Room + Depot\ne.g., Jira for AMAR project", fillcolor="#A5D6A7", width=2.5];
|
||||
plexus [label="Plexus\n\nFull app: backend + frontend + DB\ne.g., WhatsApp with chat UI", fillcolor="#81C784", width=2.5];
|
||||
}
|
||||
|
||||
// Mock path
|
||||
subgraph cluster_mock {
|
||||
label="Testing Path";
|
||||
style=filled;
|
||||
color="#FFF3E0";
|
||||
fillcolor="#FFF3E0";
|
||||
|
||||
shunt [label="Shunt\n\nFake connector for testing\ne.g., mercadopago mock", fillcolor="#FFCC80", width=2.5];
|
||||
}
|
||||
|
||||
// Connections
|
||||
vein -> pulse [label="+ Room\n+ Depot"];
|
||||
pulse -> plexus [label="+ Backend\n+ Frontend\n+ DB"];
|
||||
vein -> shunt [label="mock", style=dashed, constraint=false];
|
||||
|
||||
// Properties table
|
||||
subgraph cluster_props {
|
||||
label="Properties";
|
||||
style=filled;
|
||||
color="#F5F5F5";
|
||||
fillcolor="#F5F5F5";
|
||||
|
||||
props [shape=plaintext, label=<
|
||||
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="8">
|
||||
<TR>
|
||||
<TD BGCOLOR="#EEEEEE"><B>Type</B></TD>
|
||||
<TD BGCOLOR="#EEEEEE"><B>State</B></TD>
|
||||
<TD BGCOLOR="#EEEEEE"><B>Frontend</B></TD>
|
||||
<TD BGCOLOR="#EEEEEE"><B>Deploy</B></TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Vein</TD>
|
||||
<TD>None (or OAuth)</TD>
|
||||
<TD>Optional test UI</TD>
|
||||
<TD>With soleprint</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Shunt</TD>
|
||||
<TD>Configurable</TD>
|
||||
<TD>Config UI</TD>
|
||||
<TD>With soleprint</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Pulse</TD>
|
||||
<TD>Vein + config</TD>
|
||||
<TD>Uses vein's</TD>
|
||||
<TD>With soleprint</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>Plexus</TD>
|
||||
<TD>Full app state</TD>
|
||||
<TD>Required</TD>
|
||||
<TD>Self-contained</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
>];
|
||||
}
|
||||
}
|
||||
134
docs/architecture/02-artery-hierarchy.svg
Normal file
134
docs/architecture/02-artery-hierarchy.svg
Normal file
@@ -0,0 +1,134 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 14.1.1 (0)
|
||||
-->
|
||||
<!-- Title: ArteryHierarchy Pages: 1 -->
|
||||
<svg width="972pt" height="487pt"
|
||||
viewBox="0.00 0.00 972.00 487.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 482.5)">
|
||||
<title>ArteryHierarchy</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-482.5 968,-482.5 968,4 -4,4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="482" y="-459.3" font-family="Helvetica,sans-Serif" font-size="16.00">Artery - Connector Hierarchy</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_main</title>
|
||||
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="107.12,-8 107.12,-113 956,-113 956,-8 107.12,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="531.56" y="-93.8" font-family="Helvetica,sans-Serif" font-size="16.00">Evolution Path</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_mock</title>
|
||||
<polygon fill="#fff3e0" stroke="#fff3e0" points="107.12,-121 107.12,-226 303.12,-226 303.12,-121 107.12,-121"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-206.8" font-family="Helvetica,sans-Serif" font-size="16.00">Testing Path</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_props</title>
|
||||
<polygon fill="#f5f5f5" stroke="#f5f5f5" points="8,-234 8,-443 402.25,-443 402.25,-234 8,-234"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-423.8" font-family="Helvetica,sans-Serif" font-size="16.00">Properties</text>
|
||||
</g>
|
||||
<!-- vein -->
|
||||
<g id="node1" class="node">
|
||||
<title>vein</title>
|
||||
<path fill="#c8e6c9" stroke="black" d="M283.12,-77.75C283.12,-77.75 127.12,-77.75 127.12,-77.75 121.12,-77.75 115.12,-71.75 115.12,-65.75 115.12,-65.75 115.12,-28.25 115.12,-28.25 115.12,-22.25 121.12,-16.25 127.12,-16.25 127.12,-16.25 283.12,-16.25 283.12,-16.25 289.12,-16.25 295.12,-22.25 295.12,-28.25 295.12,-28.25 295.12,-65.75 295.12,-65.75 295.12,-71.75 289.12,-77.75 283.12,-77.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Vein</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Stateless API connector</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., Jira, Slack, Google</text>
|
||||
</g>
|
||||
<!-- pulse -->
|
||||
<g id="node2" class="node">
|
||||
<title>pulse</title>
|
||||
<path fill="#a5d6a7" stroke="black" d="M638.75,-77.75C638.75,-77.75 482.75,-77.75 482.75,-77.75 476.75,-77.75 470.75,-71.75 470.75,-65.75 470.75,-65.75 470.75,-28.25 470.75,-28.25 470.75,-22.25 476.75,-16.25 482.75,-16.25 482.75,-16.25 638.75,-16.25 638.75,-16.25 644.75,-16.25 650.75,-22.25 650.75,-28.25 650.75,-28.25 650.75,-65.75 650.75,-65.75 650.75,-71.75 644.75,-77.75 638.75,-77.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Pulse</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein + Room + Depot</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="560.75" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., Jira for AMAR project</text>
|
||||
</g>
|
||||
<!-- vein->pulse -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>vein->pulse</title>
|
||||
<path fill="none" stroke="black" d="M295.36,-47C345.2,-47 407.45,-47 459.03,-47"/>
|
||||
<polygon fill="black" stroke="black" points="459.03,-50.5 469.03,-47 459.03,-43.5 459.03,-50.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="432.5" y="-63" font-family="Helvetica,sans-Serif" font-size="10.00">+ Room</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="432.5" y="-50.25" font-family="Helvetica,sans-Serif" font-size="10.00">+ Depot</text>
|
||||
</g>
|
||||
<!-- shunt -->
|
||||
<g id="node4" class="node">
|
||||
<title>shunt</title>
|
||||
<path fill="#ffcc80" stroke="black" d="M283.12,-190.75C283.12,-190.75 127.12,-190.75 127.12,-190.75 121.12,-190.75 115.12,-184.75 115.12,-178.75 115.12,-178.75 115.12,-141.25 115.12,-141.25 115.12,-135.25 121.12,-129.25 127.12,-129.25 127.12,-129.25 283.12,-129.25 283.12,-129.25 289.12,-129.25 295.12,-135.25 295.12,-141.25 295.12,-141.25 295.12,-178.75 295.12,-178.75 295.12,-184.75 289.12,-190.75 283.12,-190.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-176.3" font-family="Helvetica,sans-Serif" font-size="11.00">Shunt</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-149.8" font-family="Helvetica,sans-Serif" font-size="11.00">Fake connector for testing</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="205.12" y="-136.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., mercadopago mock</text>
|
||||
</g>
|
||||
<!-- vein->shunt -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>vein->shunt</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M205.12,-78.18C205.12,-90.4 205.12,-104.63 205.12,-117.75"/>
|
||||
<polygon fill="black" stroke="black" points="201.63,-117.41 205.13,-127.41 208.63,-117.41 201.63,-117.41"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="195.75" y="-100.38" font-family="Helvetica,sans-Serif" font-size="10.00">mock</text>
|
||||
</g>
|
||||
<!-- plexus -->
|
||||
<g id="node3" class="node">
|
||||
<title>plexus</title>
|
||||
<path fill="#81c784" stroke="black" d="M936,-77.75C936,-77.75 752.75,-77.75 752.75,-77.75 746.75,-77.75 740.75,-71.75 740.75,-65.75 740.75,-65.75 740.75,-28.25 740.75,-28.25 740.75,-22.25 746.75,-16.25 752.75,-16.25 752.75,-16.25 936,-16.25 936,-16.25 942,-16.25 948,-22.25 948,-28.25 948,-28.25 948,-65.75 948,-65.75 948,-71.75 942,-77.75 936,-77.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-36.8" font-family="Helvetica,sans-Serif" font-size="11.00">Full app: backend + frontend + DB</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="844.38" y="-23.3" font-family="Helvetica,sans-Serif" font-size="11.00">e.g., WhatsApp with chat UI</text>
|
||||
</g>
|
||||
<!-- pulse->plexus -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>pulse->plexus</title>
|
||||
<path fill="none" stroke="black" d="M651.24,-47C675.94,-47 703.07,-47 728.97,-47"/>
|
||||
<polygon fill="black" stroke="black" points="728.86,-50.5 738.86,-47 728.86,-43.5 728.86,-50.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-75.75" font-family="Helvetica,sans-Serif" font-size="10.00">+ Backend</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-63" font-family="Helvetica,sans-Serif" font-size="10.00">+ Frontend</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="695.75" y="-50.25" font-family="Helvetica,sans-Serif" font-size="10.00">+ DB</text>
|
||||
</g>
|
||||
<!-- props -->
|
||||
<g id="node5" class="node">
|
||||
<title>props</title>
|
||||
<path fill="lightgrey" stroke="none" d="M382.25,-407.75C382.25,-407.75 28,-407.75 28,-407.75 22,-407.75 16,-401.75 16,-395.75 16,-395.75 16,-254.25 16,-254.25 16,-248.25 22,-242.25 28,-242.25 28,-242.25 382.25,-242.25 382.25,-242.25 388.25,-242.25 394.25,-248.25 394.25,-254.25 394.25,-254.25 394.25,-395.75 394.25,-395.75 394.25,-401.75 388.25,-407.75 382.25,-407.75"/>
|
||||
<polygon fill="#eeeeee" stroke="none" points="24,-372.25 24,-403.75 78,-403.75 78,-372.25 24,-372.25"/>
|
||||
<polygon fill="none" stroke="black" points="24,-372.25 24,-403.75 78,-403.75 78,-372.25 24,-372.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="36.75" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Type</text>
|
||||
<polygon fill="#eeeeee" stroke="none" points="78,-372.25 78,-403.75 186,-403.75 186,-372.25 78,-372.25"/>
|
||||
<polygon fill="none" stroke="black" points="78,-372.25 78,-403.75 186,-403.75 186,-372.25 78,-372.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="115.12" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">State</text>
|
||||
<polygon fill="#eeeeee" stroke="none" points="186,-372.25 186,-403.75 291,-403.75 291,-372.25 186,-372.25"/>
|
||||
<polygon fill="none" stroke="black" points="186,-372.25 186,-403.75 291,-403.75 291,-372.25 186,-372.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="211.12" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Frontend</text>
|
||||
<polygon fill="#eeeeee" stroke="none" points="291,-372.25 291,-403.75 386.25,-403.75 386.25,-372.25 291,-372.25"/>
|
||||
<polygon fill="none" stroke="black" points="291,-372.25 291,-403.75 386.25,-403.75 386.25,-372.25 291,-372.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="317.25" y="-385.3" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="11.00">Deploy</text>
|
||||
<polygon fill="none" stroke="black" points="24,-340.75 24,-372.25 78,-372.25 78,-340.75 24,-340.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="39.38" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein</text>
|
||||
<polygon fill="none" stroke="black" points="78,-340.75 78,-372.25 186,-372.25 186,-340.75 78,-340.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="87" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">None (or OAuth)</text>
|
||||
<polygon fill="none" stroke="black" points="186,-340.75 186,-372.25 291,-372.25 291,-340.75 186,-340.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="195" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">Optional test UI</text>
|
||||
<polygon fill="none" stroke="black" points="291,-340.75 291,-372.25 386.25,-372.25 386.25,-340.75 291,-340.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="300.38" y="-352.8" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||
<polygon fill="none" stroke="black" points="24,-309.25 24,-340.75 78,-340.75 78,-309.25 24,-309.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="35.25" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Shunt</text>
|
||||
<polygon fill="none" stroke="black" points="78,-309.25 78,-340.75 186,-340.75 186,-309.25 78,-309.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="97.5" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Configurable</text>
|
||||
<polygon fill="none" stroke="black" points="186,-309.25 186,-340.75 291,-340.75 291,-309.25 186,-309.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="213.75" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">Config UI</text>
|
||||
<polygon fill="none" stroke="black" points="291,-309.25 291,-340.75 386.25,-340.75 386.25,-309.25 291,-309.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="300.38" y="-321.3" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||
<polygon fill="none" stroke="black" points="24,-277.75 24,-309.25 78,-309.25 78,-277.75 24,-277.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="36.38" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Pulse</text>
|
||||
<polygon fill="none" stroke="black" points="78,-277.75 78,-309.25 186,-309.25 186,-277.75 78,-277.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="95.62" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Vein + config</text>
|
||||
<polygon fill="none" stroke="black" points="186,-277.75 186,-309.25 291,-309.25 291,-277.75 186,-277.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="207" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">Uses vein's</text>
|
||||
<polygon fill="none" stroke="black" points="291,-277.75 291,-309.25 386.25,-309.25 386.25,-277.75 291,-277.75"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="300.38" y="-289.8" font-family="Helvetica,sans-Serif" font-size="11.00">With soleprint</text>
|
||||
<polygon fill="none" stroke="black" points="24,-246.25 24,-277.75 78,-277.75 78,-246.25 24,-246.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="33" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Plexus</text>
|
||||
<polygon fill="none" stroke="black" points="78,-246.25 78,-277.75 186,-277.75 186,-246.25 78,-246.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="94.5" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Full app state</text>
|
||||
<polygon fill="none" stroke="black" points="186,-246.25 186,-277.75 291,-277.75 291,-246.25 186,-246.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="214.12" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Required</text>
|
||||
<polygon fill="none" stroke="black" points="291,-246.25 291,-277.75 386.25,-277.75 386.25,-246.25 291,-246.25"/>
|
||||
<text xml:space="preserve" text-anchor="start" x="300" y="-258.3" font-family="Helvetica,sans-Serif" font-size="11.00">Self-contained</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 13 KiB |
85
docs/architecture/03-build-flow.dot
Normal file
85
docs/architecture/03-build-flow.dot
Normal file
@@ -0,0 +1,85 @@
|
||||
digraph BuildFlow {
|
||||
// Graph settings
|
||||
rankdir=TB;
|
||||
compound=true;
|
||||
fontname="Helvetica";
|
||||
node [fontname="Helvetica", fontsize=11];
|
||||
edge [fontname="Helvetica", fontsize=10];
|
||||
|
||||
// Title
|
||||
labelloc="t";
|
||||
label="Soleprint - Build Flow";
|
||||
fontsize=16;
|
||||
|
||||
// Styling
|
||||
node [shape=box, style="rounded,filled"];
|
||||
|
||||
// Source
|
||||
subgraph cluster_source {
|
||||
label="Source (spr/)";
|
||||
style=filled;
|
||||
color="#E3F2FD";
|
||||
fillcolor="#E3F2FD";
|
||||
|
||||
soleprint_src [label="soleprint/\n(core entry points)", fillcolor="#BBDEFB"];
|
||||
artery_src [label="artery/\n(veins, shunts)", fillcolor="#BBDEFB"];
|
||||
atlas_src [label="atlas/\n(books)", fillcolor="#BBDEFB"];
|
||||
station_src [label="station/\n(tools, monitors)", fillcolor="#BBDEFB"];
|
||||
}
|
||||
|
||||
// Config
|
||||
subgraph cluster_cfg {
|
||||
label="Room Configs (cfg/)";
|
||||
style=filled;
|
||||
color="#FFF8E1";
|
||||
fillcolor="#FFF8E1";
|
||||
|
||||
cfg_standalone [label="cfg/standalone/\nconfig.json\ndata/", fillcolor="#FFECB3"];
|
||||
cfg_amar [label="cfg/amar/\nconfig.json\ndata/\ndocker-compose.yml\n...", fillcolor="#FFECB3"];
|
||||
cfg_other [label="cfg/<room>/\n...", fillcolor="#FFE082", style="rounded,filled,dashed"];
|
||||
}
|
||||
|
||||
// Build tool
|
||||
build [label="build.py", fillcolor="#E1BEE7", shape=hexagon];
|
||||
|
||||
// Commands
|
||||
subgraph cluster_cmds {
|
||||
label="Commands";
|
||||
style=filled;
|
||||
color="#F3E5F5";
|
||||
fillcolor="#F3E5F5";
|
||||
|
||||
cmd1 [label="python build.py dev", fillcolor="#CE93D8"];
|
||||
cmd2 [label="python build.py dev --cfg amar", fillcolor="#CE93D8"];
|
||||
cmd3 [label="python build.py dev --all", fillcolor="#CE93D8"];
|
||||
}
|
||||
|
||||
// Output
|
||||
subgraph cluster_gen {
|
||||
label="Generated Output (gen/)";
|
||||
style=filled;
|
||||
color="#E8F5E9";
|
||||
fillcolor="#E8F5E9";
|
||||
|
||||
gen_standalone [label="gen/standalone/\n(base soleprint)", fillcolor="#C8E6C9"];
|
||||
gen_amar [label="gen/amar/\n(with amar config)", fillcolor="#C8E6C9"];
|
||||
}
|
||||
|
||||
// Connections
|
||||
soleprint_src -> build;
|
||||
artery_src -> build;
|
||||
atlas_src -> build;
|
||||
station_src -> build;
|
||||
|
||||
cfg_standalone -> build [style=dashed];
|
||||
cfg_amar -> build [style=dashed];
|
||||
|
||||
build -> cmd1 [style=invis];
|
||||
build -> cmd2 [style=invis];
|
||||
build -> cmd3 [style=invis];
|
||||
|
||||
cmd1 -> gen_standalone [label="copies + standalone config"];
|
||||
cmd2 -> gen_amar [label="copies + amar config"];
|
||||
cmd3 -> gen_standalone [style=dashed];
|
||||
cmd3 -> gen_amar [style=dashed];
|
||||
}
|
||||
190
docs/architecture/03-build-flow.svg
Normal file
190
docs/architecture/03-build-flow.svg
Normal file
@@ -0,0 +1,190 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 14.1.1 (0)
|
||||
-->
|
||||
<!-- Title: BuildFlow Pages: 1 -->
|
||||
<svg width="854pt" height="452pt"
|
||||
viewBox="0.00 0.00 854.00 452.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 448.25)">
|
||||
<title>BuildFlow</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-448.25 850,-448.25 850,4 -4,4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="423" y="-425.05" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - Build Flow</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_source</title>
|
||||
<polygon fill="#e3f2fd" stroke="#e3f2fd" points="8,-309.5 8,-389 462,-389 462,-309.5 8,-309.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="235" y="-369.8" font-family="Helvetica,sans-Serif" font-size="16.00">Source (spr/)</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_cfg</title>
|
||||
<polygon fill="#fff8e1" stroke="#fff8e1" points="470,-289.75 470,-408.75 838,-408.75 838,-289.75 470,-289.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="654" y="-389.55" font-family="Helvetica,sans-Serif" font-size="16.00">Room Configs (cfg/)</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_cmds</title>
|
||||
<polygon fill="#f3e5f5" stroke="#f3e5f5" points="122,-118.25 122,-197.75 636,-197.75 636,-118.25 122,-118.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="379" y="-178.55" font-family="Helvetica,sans-Serif" font-size="16.00">Commands</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_gen</title>
|
||||
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="243,-8 243,-87.5 499,-87.5 499,-8 243,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="371" y="-68.3" font-family="Helvetica,sans-Serif" font-size="16.00">Generated Output (gen/)</text>
|
||||
</g>
|
||||
<!-- soleprint_src -->
|
||||
<g id="node1" class="node">
|
||||
<title>soleprint_src</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M123.75,-353.5C123.75,-353.5 28.25,-353.5 28.25,-353.5 22.25,-353.5 16.25,-347.5 16.25,-341.5 16.25,-341.5 16.25,-329.5 16.25,-329.5 16.25,-323.5 22.25,-317.5 28.25,-317.5 28.25,-317.5 123.75,-317.5 123.75,-317.5 129.75,-317.5 135.75,-323.5 135.75,-329.5 135.75,-329.5 135.75,-341.5 135.75,-341.5 135.75,-347.5 129.75,-353.5 123.75,-353.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">soleprint/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(core entry points)</text>
|
||||
</g>
|
||||
<!-- build -->
|
||||
<g id="node8" class="node">
|
||||
<title>build</title>
|
||||
<path fill="#e1bee7" stroke="black" d="M384.69,-248.75C384.69,-248.75 377.55,-254.75 377.55,-254.75 373.98,-257.75 365.75,-260.75 361.09,-260.75 361.09,-260.75 336.91,-260.75 336.91,-260.75 332.25,-260.75 324.02,-257.75 320.45,-254.75 320.45,-254.75 313.31,-248.75 313.31,-248.75 309.74,-245.75 309.74,-239.75 313.31,-236.75 313.31,-236.75 320.45,-230.75 320.45,-230.75 324.02,-227.75 332.25,-224.75 336.91,-224.75 336.91,-224.75 361.09,-224.75 361.09,-224.75 365.75,-224.75 373.98,-227.75 377.55,-230.75 377.55,-230.75 384.69,-236.75 384.69,-236.75 388.26,-239.75 388.26,-245.75 384.69,-248.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="349" y="-239.05" font-family="Helvetica,sans-Serif" font-size="11.00">build.py</text>
|
||||
</g>
|
||||
<!-- soleprint_src->build -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>soleprint_src->build</title>
|
||||
<path fill="none" stroke="black" d="M98.48,-317C111.45,-307.68 128.42,-296.73 145,-289.75 195.92,-268.31 258.4,-256.1 300.69,-249.73"/>
|
||||
<polygon fill="black" stroke="black" points="301.17,-253.2 310.56,-248.3 300.16,-246.27 301.17,-253.2"/>
|
||||
</g>
|
||||
<!-- artery_src -->
|
||||
<g id="node2" class="node">
|
||||
<title>artery_src</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M240.25,-353.5C240.25,-353.5 165.75,-353.5 165.75,-353.5 159.75,-353.5 153.75,-347.5 153.75,-341.5 153.75,-341.5 153.75,-329.5 153.75,-329.5 153.75,-323.5 159.75,-317.5 165.75,-317.5 165.75,-317.5 240.25,-317.5 240.25,-317.5 246.25,-317.5 252.25,-323.5 252.25,-329.5 252.25,-329.5 252.25,-341.5 252.25,-341.5 252.25,-347.5 246.25,-353.5 240.25,-353.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="203" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">artery/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="203" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(veins, shunts)</text>
|
||||
</g>
|
||||
<!-- artery_src->build -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>artery_src->build</title>
|
||||
<path fill="none" stroke="black" d="M223.56,-317.21C234.37,-308.5 248.04,-298.05 261,-289.75 277.08,-279.46 295.71,-269.46 311.69,-261.43"/>
|
||||
<polygon fill="black" stroke="black" points="312.98,-264.7 320.39,-257.13 309.87,-258.42 312.98,-264.7"/>
|
||||
</g>
|
||||
<!-- atlas_src -->
|
||||
<g id="node3" class="node">
|
||||
<title>atlas_src</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M315.62,-353.5C315.62,-353.5 282.38,-353.5 282.38,-353.5 276.38,-353.5 270.38,-347.5 270.38,-341.5 270.38,-341.5 270.38,-329.5 270.38,-329.5 270.38,-323.5 276.38,-317.5 282.38,-317.5 282.38,-317.5 315.62,-317.5 315.62,-317.5 321.62,-317.5 327.62,-323.5 327.62,-329.5 327.62,-329.5 327.62,-341.5 327.62,-341.5 327.62,-347.5 321.62,-353.5 315.62,-353.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="299" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">atlas/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="299" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(books)</text>
|
||||
</g>
|
||||
<!-- atlas_src->build -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>atlas_src->build</title>
|
||||
<path fill="none" stroke="black" d="M308.64,-317C315.83,-303.95 325.8,-285.86 334.03,-270.93"/>
|
||||
<polygon fill="black" stroke="black" points="336.9,-272.97 338.66,-262.52 330.77,-269.59 336.9,-272.97"/>
|
||||
</g>
|
||||
<!-- station_src -->
|
||||
<g id="node4" class="node">
|
||||
<title>station_src</title>
|
||||
<path fill="#bbdefb" stroke="black" d="M442.12,-353.5C442.12,-353.5 357.88,-353.5 357.88,-353.5 351.88,-353.5 345.88,-347.5 345.88,-341.5 345.88,-341.5 345.88,-329.5 345.88,-329.5 345.88,-323.5 351.88,-317.5 357.88,-317.5 357.88,-317.5 442.12,-317.5 442.12,-317.5 448.12,-317.5 454.12,-323.5 454.12,-329.5 454.12,-329.5 454.12,-341.5 454.12,-341.5 454.12,-347.5 448.12,-353.5 442.12,-353.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="400" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">station/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="400" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">(tools, monitors)</text>
|
||||
</g>
|
||||
<!-- station_src->build -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>station_src->build</title>
|
||||
<path fill="none" stroke="black" d="M390.17,-317C382.83,-303.95 372.67,-285.86 364.27,-270.93"/>
|
||||
<polygon fill="black" stroke="black" points="367.5,-269.52 359.54,-262.51 361.39,-272.95 367.5,-269.52"/>
|
||||
</g>
|
||||
<!-- cfg_standalone -->
|
||||
<g id="node5" class="node">
|
||||
<title>cfg_standalone</title>
|
||||
<path fill="#ffecb3" stroke="black" d="M566.38,-359.75C566.38,-359.75 489.62,-359.75 489.62,-359.75 483.62,-359.75 477.62,-353.75 477.62,-347.75 477.62,-347.75 477.62,-323.25 477.62,-323.25 477.62,-317.25 483.62,-311.25 489.62,-311.25 489.62,-311.25 566.38,-311.25 566.38,-311.25 572.38,-311.25 578.38,-317.25 578.38,-323.25 578.38,-323.25 578.38,-347.75 578.38,-347.75 578.38,-353.75 572.38,-359.75 566.38,-359.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-345.3" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/standalone/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-331.8" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-318.3" font-family="Helvetica,sans-Serif" font-size="11.00">data/</text>
|
||||
</g>
|
||||
<!-- cfg_standalone->build -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>cfg_standalone->build</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M498.41,-310.84C488.46,-303.52 477.07,-295.79 466,-289.75 441.97,-276.62 413.39,-265.31 390.49,-257.19"/>
|
||||
<polygon fill="black" stroke="black" points="391.78,-253.94 381.18,-253.97 389.48,-260.55 391.78,-253.94"/>
|
||||
</g>
|
||||
<!-- cfg_amar -->
|
||||
<g id="node6" class="node">
|
||||
<title>cfg_amar</title>
|
||||
<path fill="#ffecb3" stroke="black" d="M713.62,-373.25C713.62,-373.25 608.38,-373.25 608.38,-373.25 602.38,-373.25 596.38,-367.25 596.38,-361.25 596.38,-361.25 596.38,-309.75 596.38,-309.75 596.38,-303.75 602.38,-297.75 608.38,-297.75 608.38,-297.75 713.62,-297.75 713.62,-297.75 719.62,-297.75 725.62,-303.75 725.62,-309.75 725.62,-309.75 725.62,-361.25 725.62,-361.25 725.62,-367.25 719.62,-373.25 713.62,-373.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="661" y="-358.8" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/amar/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="661" y="-345.3" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="661" y="-331.8" font-family="Helvetica,sans-Serif" font-size="11.00">data/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="661" y="-318.3" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="661" y="-304.8" font-family="Helvetica,sans-Serif" font-size="11.00">...</text>
|
||||
</g>
|
||||
<!-- cfg_amar->build -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>cfg_amar->build</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M603.83,-297.29C598.26,-294.48 592.6,-291.91 587,-289.75 524.46,-265.68 447.64,-253.76 398.5,-248.18"/>
|
||||
<polygon fill="black" stroke="black" points="399.06,-244.72 388.74,-247.12 398.31,-251.68 399.06,-244.72"/>
|
||||
</g>
|
||||
<!-- cfg_other -->
|
||||
<g id="node7" class="node">
|
||||
<title>cfg_other</title>
|
||||
<path fill="#ffe082" stroke="black" stroke-dasharray="5,2" d="M818.25,-353.5C818.25,-353.5 755.75,-353.5 755.75,-353.5 749.75,-353.5 743.75,-347.5 743.75,-341.5 743.75,-341.5 743.75,-329.5 743.75,-329.5 743.75,-323.5 749.75,-317.5 755.75,-317.5 755.75,-317.5 818.25,-317.5 818.25,-317.5 824.25,-317.5 830.25,-323.5 830.25,-329.5 830.25,-329.5 830.25,-341.5 830.25,-341.5 830.25,-347.5 824.25,-353.5 818.25,-353.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="787" y="-338.55" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/<room>/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="787" y="-325.05" font-family="Helvetica,sans-Serif" font-size="11.00">...</text>
|
||||
</g>
|
||||
<!-- cmd1 -->
|
||||
<g id="node9" class="node">
|
||||
<title>cmd1</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M243.75,-162.25C243.75,-162.25 142.25,-162.25 142.25,-162.25 136.25,-162.25 130.25,-156.25 130.25,-150.25 130.25,-150.25 130.25,-138.25 130.25,-138.25 130.25,-132.25 136.25,-126.25 142.25,-126.25 142.25,-126.25 243.75,-126.25 243.75,-126.25 249.75,-126.25 255.75,-132.25 255.75,-138.25 255.75,-138.25 255.75,-150.25 255.75,-150.25 255.75,-156.25 249.75,-162.25 243.75,-162.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="193" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev</text>
|
||||
</g>
|
||||
<!-- build->cmd1 -->
|
||||
<!-- cmd2 -->
|
||||
<g id="node10" class="node">
|
||||
<title>cmd2</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M615.75,-162.25C615.75,-162.25 454.25,-162.25 454.25,-162.25 448.25,-162.25 442.25,-156.25 442.25,-150.25 442.25,-150.25 442.25,-138.25 442.25,-138.25 442.25,-132.25 448.25,-126.25 454.25,-126.25 454.25,-126.25 615.75,-126.25 615.75,-126.25 621.75,-126.25 627.75,-132.25 627.75,-138.25 627.75,-138.25 627.75,-150.25 627.75,-150.25 627.75,-156.25 621.75,-162.25 615.75,-162.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="535" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev --cfg amar</text>
|
||||
</g>
|
||||
<!-- build->cmd2 -->
|
||||
<!-- cmd3 -->
|
||||
<g id="node11" class="node">
|
||||
<title>cmd3</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M411.75,-162.25C411.75,-162.25 286.25,-162.25 286.25,-162.25 280.25,-162.25 274.25,-156.25 274.25,-150.25 274.25,-150.25 274.25,-138.25 274.25,-138.25 274.25,-132.25 280.25,-126.25 286.25,-126.25 286.25,-126.25 411.75,-126.25 411.75,-126.25 417.75,-126.25 423.75,-132.25 423.75,-138.25 423.75,-138.25 423.75,-150.25 423.75,-150.25 423.75,-156.25 417.75,-162.25 411.75,-162.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="349" y="-140.55" font-family="Helvetica,sans-Serif" font-size="11.00">python build.py dev --all</text>
|
||||
</g>
|
||||
<!-- build->cmd3 -->
|
||||
<!-- gen_standalone -->
|
||||
<g id="node12" class="node">
|
||||
<title>gen_standalone</title>
|
||||
<path fill="#c8e6c9" stroke="black" d="M343.25,-52C343.25,-52 262.75,-52 262.75,-52 256.75,-52 250.75,-46 250.75,-40 250.75,-40 250.75,-28 250.75,-28 250.75,-22 256.75,-16 262.75,-16 262.75,-16 343.25,-16 343.25,-16 349.25,-16 355.25,-22 355.25,-28 355.25,-28 355.25,-40 355.25,-40 355.25,-46 349.25,-52 343.25,-52"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="303" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">gen/standalone/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="303" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(base soleprint)</text>
|
||||
</g>
|
||||
<!-- cmd1->gen_standalone -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>cmd1->gen_standalone</title>
|
||||
<path fill="none" stroke="black" d="M190.27,-126.13C189.61,-116.45 190.36,-104.51 196,-95.5 206.41,-78.87 223.15,-66.38 240.33,-57.2"/>
|
||||
<polygon fill="black" stroke="black" points="241.69,-60.43 249.09,-52.85 238.58,-54.16 241.69,-60.43"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="262" y="-98.75" font-family="Helvetica,sans-Serif" font-size="10.00">copies + standalone config</text>
|
||||
</g>
|
||||
<!-- gen_amar -->
|
||||
<g id="node13" class="node">
|
||||
<title>gen_amar</title>
|
||||
<path fill="#c8e6c9" stroke="black" d="M478.62,-52C478.62,-52 385.38,-52 385.38,-52 379.38,-52 373.38,-46 373.38,-40 373.38,-40 373.38,-28 373.38,-28 373.38,-22 379.38,-16 385.38,-16 385.38,-16 478.62,-16 478.62,-16 484.62,-16 490.62,-22 490.62,-28 490.62,-28 490.62,-40 490.62,-40 490.62,-46 484.62,-52 478.62,-52"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="432" y="-37.05" font-family="Helvetica,sans-Serif" font-size="11.00">gen/amar/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="432" y="-23.55" font-family="Helvetica,sans-Serif" font-size="11.00">(with amar config)</text>
|
||||
</g>
|
||||
<!-- cmd2->gen_amar -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>cmd2->gen_amar</title>
|
||||
<path fill="none" stroke="black" d="M518.45,-125.86C501.63,-108.18 475.4,-80.61 456.24,-60.47"/>
|
||||
<polygon fill="black" stroke="black" points="458.98,-58.28 449.55,-53.45 453.91,-63.1 458.98,-58.28"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="553.43" y="-98.75" font-family="Helvetica,sans-Serif" font-size="10.00">copies + amar config</text>
|
||||
</g>
|
||||
<!-- cmd3->gen_standalone -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>cmd3->gen_standalone</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M343.29,-125.84C340.18,-116.72 336.13,-105.41 332,-95.5 327.41,-84.49 321.86,-72.6 316.84,-62.31"/>
|
||||
<polygon fill="black" stroke="black" points="320.11,-61.02 312.54,-53.61 313.83,-64.13 320.11,-61.02"/>
|
||||
</g>
|
||||
<!-- cmd3->gen_amar -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>cmd3->gen_amar</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M362.34,-125.86C375.71,-108.42 396.46,-81.35 411.84,-61.29"/>
|
||||
<polygon fill="black" stroke="black" points="414.47,-63.62 417.78,-53.55 408.91,-59.36 414.47,-63.62"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
83
docs/architecture/04-room-config.dot
Normal file
83
docs/architecture/04-room-config.dot
Normal file
@@ -0,0 +1,83 @@
|
||||
digraph RoomConfig {
|
||||
// Graph settings
|
||||
rankdir=TB;
|
||||
compound=true;
|
||||
fontname="Helvetica";
|
||||
node [fontname="Helvetica", fontsize=11];
|
||||
edge [fontname="Helvetica", fontsize=10];
|
||||
|
||||
// Title
|
||||
labelloc="t";
|
||||
label="Soleprint - Room Configuration Structure";
|
||||
fontsize=16;
|
||||
|
||||
// Styling
|
||||
node [shape=box, style="rounded,filled"];
|
||||
|
||||
// Room config structure
|
||||
subgraph cluster_room {
|
||||
label="cfg/<room>/";
|
||||
style=filled;
|
||||
color="#E8F5E9";
|
||||
fillcolor="#E8F5E9";
|
||||
|
||||
config_json [label="config.json\n\nFramework branding\nTerminology customization\n(can rebrand soleprint)", fillcolor="#C8E6C9"];
|
||||
|
||||
subgraph cluster_data {
|
||||
label="data/";
|
||||
style=filled;
|
||||
color="#DCEDC8";
|
||||
fillcolor="#DCEDC8";
|
||||
|
||||
veins_json [label="veins.json", fillcolor="#AED581"];
|
||||
shunts_json [label="shunts.json", fillcolor="#AED581"];
|
||||
depots_json [label="depots.json", fillcolor="#AED581"];
|
||||
rooms_json [label="rooms.json", fillcolor="#AED581"];
|
||||
}
|
||||
|
||||
subgraph cluster_docker {
|
||||
label="Docker";
|
||||
style=filled;
|
||||
color="#FFECB3";
|
||||
fillcolor="#FFECB3";
|
||||
|
||||
docker_compose [label="docker-compose.yml", fillcolor="#FFE082"];
|
||||
dockerfile_be [label="Dockerfile.backend", fillcolor="#FFE082"];
|
||||
dockerfile_fe [label="Dockerfile.frontend", fillcolor="#FFE082"];
|
||||
env_example [label=".env.example", fillcolor="#FFE082"];
|
||||
}
|
||||
|
||||
subgraph cluster_soleprint {
|
||||
label="soleprint/";
|
||||
style=filled;
|
||||
color="#E1BEE7";
|
||||
fillcolor="#E1BEE7";
|
||||
|
||||
spr_compose [label="docker-compose.yml\n(soleprint for this room)", fillcolor="#CE93D8"];
|
||||
spr_env [label=".env", fillcolor="#CE93D8"];
|
||||
}
|
||||
|
||||
subgraph cluster_extras {
|
||||
label="Room-specific";
|
||||
style=filled;
|
||||
color="#B2EBF2";
|
||||
fillcolor="#B2EBF2";
|
||||
|
||||
databrowse [label="databrowse/depot/\n(DB schema)", fillcolor="#80DEEA"];
|
||||
tester [label="tester/tests/\n(Room tests)", fillcolor="#80DEEA"];
|
||||
monitors [label="monitors/\n(Room monitors)", fillcolor="#80DEEA"];
|
||||
models [label="models/\n(Room models)", fillcolor="#80DEEA"];
|
||||
}
|
||||
}
|
||||
|
||||
// Examples
|
||||
subgraph cluster_examples {
|
||||
label="Examples";
|
||||
style=dashed;
|
||||
color=gray;
|
||||
|
||||
standalone [label="cfg/standalone/\n\nBase soleprint\nGeneric veins\nNo docker-compose", fillcolor="#F5F5F5"];
|
||||
|
||||
amar [label="cfg/amar/\n\nAMAR veterinary app\namar + mercadopago shunts\nFull Docker setup\nCustom monitors (turnos)", fillcolor="#F5F5F5"];
|
||||
}
|
||||
}
|
||||
161
docs/architecture/04-room-config.svg
Normal file
161
docs/architecture/04-room-config.svg
Normal file
@@ -0,0 +1,161 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 14.1.1 (0)
|
||||
-->
|
||||
<!-- Title: RoomConfig Pages: 1 -->
|
||||
<svg width="2212pt" height="193pt"
|
||||
viewBox="0.00 0.00 2212.00 193.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188.75)">
|
||||
<title>RoomConfig</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-188.75 2208,-188.75 2208,4 -4,4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1102" y="-165.55" font-family="Helvetica,sans-Serif" font-size="16.00">Soleprint - Room Configuration Structure</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_room</title>
|
||||
<polygon fill="#e8f5e9" stroke="#e8f5e9" points="8,-14.75 8,-149.25 1854,-149.25 1854,-14.75 8,-14.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="931" y="-130.05" font-family="Helvetica,sans-Serif" font-size="16.00">cfg/<room>/</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_data</title>
|
||||
<polygon fill="#dcedc8" stroke="#dcedc8" points="16,-34.25 16,-113.75 392,-113.75 392,-34.25 16,-34.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="204" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">data/</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_docker</title>
|
||||
<polygon fill="#ffecb3" stroke="#ffecb3" points="400,-34.25 400,-113.75 932,-113.75 932,-34.25 400,-34.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="666" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">Docker</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_soleprint</title>
|
||||
<polygon fill="#e1bee7" stroke="#e1bee7" points="940,-34.25 940,-113.75 1176,-113.75 1176,-34.25 940,-34.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1058" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">soleprint/</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_extras</title>
|
||||
<polygon fill="#b2ebf2" stroke="#b2ebf2" points="1184,-34.25 1184,-113.75 1672,-113.75 1672,-34.25 1184,-34.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1428" y="-94.55" font-family="Helvetica,sans-Serif" font-size="16.00">Room-specific</text>
|
||||
</g>
|
||||
<g id="clust6" class="cluster">
|
||||
<title>cluster_examples</title>
|
||||
<polygon fill="none" stroke="gray" stroke-dasharray="5,2" points="1862,-8 1862,-140 2196,-140 2196,-8 1862,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2029" y="-120.8" font-family="Helvetica,sans-Serif" font-size="16.00">Examples</text>
|
||||
</g>
|
||||
<!-- config_json -->
|
||||
<g id="node1" class="node">
|
||||
<title>config_json</title>
|
||||
<path fill="#c8e6c9" stroke="black" d="M1833.5,-97.75C1833.5,-97.75 1694.5,-97.75 1694.5,-97.75 1688.5,-97.75 1682.5,-91.75 1682.5,-85.75 1682.5,-85.75 1682.5,-34.75 1682.5,-34.75 1682.5,-28.75 1688.5,-22.75 1694.5,-22.75 1694.5,-22.75 1833.5,-22.75 1833.5,-22.75 1839.5,-22.75 1845.5,-28.75 1845.5,-34.75 1845.5,-34.75 1845.5,-85.75 1845.5,-85.75 1845.5,-91.75 1839.5,-97.75 1833.5,-97.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1764" y="-83.3" font-family="Helvetica,sans-Serif" font-size="11.00">config.json</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1764" y="-56.8" font-family="Helvetica,sans-Serif" font-size="11.00">Framework branding</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1764" y="-43.3" font-family="Helvetica,sans-Serif" font-size="11.00">Terminology customization</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1764" y="-29.8" font-family="Helvetica,sans-Serif" font-size="11.00">(can rebrand soleprint)</text>
|
||||
</g>
|
||||
<!-- veins_json -->
|
||||
<g id="node2" class="node">
|
||||
<title>veins_json</title>
|
||||
<path fill="#aed581" stroke="black" d="M83.75,-78.25C83.75,-78.25 36.25,-78.25 36.25,-78.25 30.25,-78.25 24.25,-72.25 24.25,-66.25 24.25,-66.25 24.25,-54.25 24.25,-54.25 24.25,-48.25 30.25,-42.25 36.25,-42.25 36.25,-42.25 83.75,-42.25 83.75,-42.25 89.75,-42.25 95.75,-48.25 95.75,-54.25 95.75,-54.25 95.75,-66.25 95.75,-66.25 95.75,-72.25 89.75,-78.25 83.75,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="60" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">veins.json</text>
|
||||
</g>
|
||||
<!-- shunts_json -->
|
||||
<g id="node3" class="node">
|
||||
<title>shunts_json</title>
|
||||
<path fill="#aed581" stroke="black" d="M180.5,-78.25C180.5,-78.25 125.5,-78.25 125.5,-78.25 119.5,-78.25 113.5,-72.25 113.5,-66.25 113.5,-66.25 113.5,-54.25 113.5,-54.25 113.5,-48.25 119.5,-42.25 125.5,-42.25 125.5,-42.25 180.5,-42.25 180.5,-42.25 186.5,-42.25 192.5,-48.25 192.5,-54.25 192.5,-54.25 192.5,-66.25 192.5,-66.25 192.5,-72.25 186.5,-78.25 180.5,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="153" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">shunts.json</text>
|
||||
</g>
|
||||
<!-- depots_json -->
|
||||
<g id="node4" class="node">
|
||||
<title>depots_json</title>
|
||||
<path fill="#aed581" stroke="black" d="M277.88,-78.25C277.88,-78.25 222.12,-78.25 222.12,-78.25 216.12,-78.25 210.12,-72.25 210.12,-66.25 210.12,-66.25 210.12,-54.25 210.12,-54.25 210.12,-48.25 216.12,-42.25 222.12,-42.25 222.12,-42.25 277.88,-42.25 277.88,-42.25 283.88,-42.25 289.88,-48.25 289.88,-54.25 289.88,-54.25 289.88,-66.25 289.88,-66.25 289.88,-72.25 283.88,-78.25 277.88,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="250" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">depots.json</text>
|
||||
</g>
|
||||
<!-- rooms_json -->
|
||||
<g id="node5" class="node">
|
||||
<title>rooms_json</title>
|
||||
<path fill="#aed581" stroke="black" d="M372.38,-78.25C372.38,-78.25 319.62,-78.25 319.62,-78.25 313.62,-78.25 307.62,-72.25 307.62,-66.25 307.62,-66.25 307.62,-54.25 307.62,-54.25 307.62,-48.25 313.62,-42.25 319.62,-42.25 319.62,-42.25 372.38,-42.25 372.38,-42.25 378.38,-42.25 384.38,-48.25 384.38,-54.25 384.38,-54.25 384.38,-66.25 384.38,-66.25 384.38,-72.25 378.38,-78.25 372.38,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="346" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">rooms.json</text>
|
||||
</g>
|
||||
<!-- docker_compose -->
|
||||
<g id="node6" class="node">
|
||||
<title>docker_compose</title>
|
||||
<path fill="#ffe082" stroke="black" d="M525.62,-78.25C525.62,-78.25 420.38,-78.25 420.38,-78.25 414.38,-78.25 408.38,-72.25 408.38,-66.25 408.38,-66.25 408.38,-54.25 408.38,-54.25 408.38,-48.25 414.38,-42.25 420.38,-42.25 420.38,-42.25 525.62,-42.25 525.62,-42.25 531.62,-42.25 537.62,-48.25 537.62,-54.25 537.62,-54.25 537.62,-66.25 537.62,-66.25 537.62,-72.25 531.62,-78.25 525.62,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="473" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||
</g>
|
||||
<!-- dockerfile_be -->
|
||||
<g id="node7" class="node">
|
||||
<title>dockerfile_be</title>
|
||||
<path fill="#ffe082" stroke="black" d="M664.12,-78.25C664.12,-78.25 567.88,-78.25 567.88,-78.25 561.88,-78.25 555.88,-72.25 555.88,-66.25 555.88,-66.25 555.88,-54.25 555.88,-54.25 555.88,-48.25 561.88,-42.25 567.88,-42.25 567.88,-42.25 664.12,-42.25 664.12,-42.25 670.12,-42.25 676.12,-48.25 676.12,-54.25 676.12,-54.25 676.12,-66.25 676.12,-66.25 676.12,-72.25 670.12,-78.25 664.12,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="616" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">Dockerfile.backend</text>
|
||||
</g>
|
||||
<!-- dockerfile_fe -->
|
||||
<g id="node8" class="node">
|
||||
<title>dockerfile_fe</title>
|
||||
<path fill="#ffe082" stroke="black" d="M803.5,-78.25C803.5,-78.25 706.5,-78.25 706.5,-78.25 700.5,-78.25 694.5,-72.25 694.5,-66.25 694.5,-66.25 694.5,-54.25 694.5,-54.25 694.5,-48.25 700.5,-42.25 706.5,-42.25 706.5,-42.25 803.5,-42.25 803.5,-42.25 809.5,-42.25 815.5,-48.25 815.5,-54.25 815.5,-54.25 815.5,-66.25 815.5,-66.25 815.5,-72.25 809.5,-78.25 803.5,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="755" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">Dockerfile.frontend</text>
|
||||
</g>
|
||||
<!-- env_example -->
|
||||
<g id="node9" class="node">
|
||||
<title>env_example</title>
|
||||
<path fill="#ffe082" stroke="black" d="M912.12,-78.25C912.12,-78.25 845.88,-78.25 845.88,-78.25 839.88,-78.25 833.88,-72.25 833.88,-66.25 833.88,-66.25 833.88,-54.25 833.88,-54.25 833.88,-48.25 839.88,-42.25 845.88,-42.25 845.88,-42.25 912.12,-42.25 912.12,-42.25 918.12,-42.25 924.12,-48.25 924.12,-54.25 924.12,-54.25 924.12,-66.25 924.12,-66.25 924.12,-72.25 918.12,-78.25 912.12,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="879" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">.env.example</text>
|
||||
</g>
|
||||
<!-- spr_compose -->
|
||||
<g id="node10" class="node">
|
||||
<title>spr_compose</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M1084,-78.25C1084,-78.25 960,-78.25 960,-78.25 954,-78.25 948,-72.25 948,-66.25 948,-66.25 948,-54.25 948,-54.25 948,-48.25 954,-42.25 960,-42.25 960,-42.25 1084,-42.25 1084,-42.25 1090,-42.25 1096,-48.25 1096,-54.25 1096,-54.25 1096,-66.25 1096,-66.25 1096,-72.25 1090,-78.25 1084,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1022" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">docker-compose.yml</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1022" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(soleprint for this room)</text>
|
||||
</g>
|
||||
<!-- spr_env -->
|
||||
<g id="node11" class="node">
|
||||
<title>spr_env</title>
|
||||
<path fill="#ce93d8" stroke="black" d="M1156,-78.25C1156,-78.25 1126,-78.25 1126,-78.25 1120,-78.25 1114,-72.25 1114,-66.25 1114,-66.25 1114,-54.25 1114,-54.25 1114,-48.25 1120,-42.25 1126,-42.25 1126,-42.25 1156,-42.25 1156,-42.25 1162,-42.25 1168,-48.25 1168,-54.25 1168,-54.25 1168,-66.25 1168,-66.25 1168,-72.25 1162,-78.25 1156,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1141" y="-56.55" font-family="Helvetica,sans-Serif" font-size="11.00">.env</text>
|
||||
</g>
|
||||
<!-- databrowse -->
|
||||
<g id="node12" class="node">
|
||||
<title>databrowse</title>
|
||||
<path fill="#80deea" stroke="black" d="M1299.75,-78.25C1299.75,-78.25 1204.25,-78.25 1204.25,-78.25 1198.25,-78.25 1192.25,-72.25 1192.25,-66.25 1192.25,-66.25 1192.25,-54.25 1192.25,-54.25 1192.25,-48.25 1198.25,-42.25 1204.25,-42.25 1204.25,-42.25 1299.75,-42.25 1299.75,-42.25 1305.75,-42.25 1311.75,-48.25 1311.75,-54.25 1311.75,-54.25 1311.75,-66.25 1311.75,-66.25 1311.75,-72.25 1305.75,-78.25 1299.75,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1252" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">databrowse/depot/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1252" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(DB schema)</text>
|
||||
</g>
|
||||
<!-- tester -->
|
||||
<g id="node13" class="node">
|
||||
<title>tester</title>
|
||||
<path fill="#80deea" stroke="black" d="M1406,-78.25C1406,-78.25 1342,-78.25 1342,-78.25 1336,-78.25 1330,-72.25 1330,-66.25 1330,-66.25 1330,-54.25 1330,-54.25 1330,-48.25 1336,-42.25 1342,-42.25 1342,-42.25 1406,-42.25 1406,-42.25 1412,-42.25 1418,-48.25 1418,-54.25 1418,-54.25 1418,-66.25 1418,-66.25 1418,-72.25 1412,-78.25 1406,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1374" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">tester/tests/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1374" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room tests)</text>
|
||||
</g>
|
||||
<!-- monitors -->
|
||||
<g id="node14" class="node">
|
||||
<title>monitors</title>
|
||||
<path fill="#80deea" stroke="black" d="M1533.5,-78.25C1533.5,-78.25 1448.5,-78.25 1448.5,-78.25 1442.5,-78.25 1436.5,-72.25 1436.5,-66.25 1436.5,-66.25 1436.5,-54.25 1436.5,-54.25 1436.5,-48.25 1442.5,-42.25 1448.5,-42.25 1448.5,-42.25 1533.5,-42.25 1533.5,-42.25 1539.5,-42.25 1545.5,-48.25 1545.5,-54.25 1545.5,-54.25 1545.5,-66.25 1545.5,-66.25 1545.5,-72.25 1539.5,-78.25 1533.5,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1491" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">monitors/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1491" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room monitors)</text>
|
||||
</g>
|
||||
<!-- models -->
|
||||
<g id="node15" class="node">
|
||||
<title>models</title>
|
||||
<path fill="#80deea" stroke="black" d="M1652,-78.25C1652,-78.25 1576,-78.25 1576,-78.25 1570,-78.25 1564,-72.25 1564,-66.25 1564,-66.25 1564,-54.25 1564,-54.25 1564,-48.25 1570,-42.25 1576,-42.25 1576,-42.25 1652,-42.25 1652,-42.25 1658,-42.25 1664,-48.25 1664,-54.25 1664,-54.25 1664,-66.25 1664,-66.25 1664,-72.25 1658,-78.25 1652,-78.25"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1614" y="-63.3" font-family="Helvetica,sans-Serif" font-size="11.00">models/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1614" y="-49.8" font-family="Helvetica,sans-Serif" font-size="11.00">(Room models)</text>
|
||||
</g>
|
||||
<!-- standalone -->
|
||||
<g id="node16" class="node">
|
||||
<title>standalone</title>
|
||||
<path fill="#f5f5f5" stroke="black" d="M1982,-97.75C1982,-97.75 1882,-97.75 1882,-97.75 1876,-97.75 1870,-91.75 1870,-85.75 1870,-85.75 1870,-34.75 1870,-34.75 1870,-28.75 1876,-22.75 1882,-22.75 1882,-22.75 1982,-22.75 1982,-22.75 1988,-22.75 1994,-28.75 1994,-34.75 1994,-34.75 1994,-85.75 1994,-85.75 1994,-91.75 1988,-97.75 1982,-97.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1932" y="-83.3" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/standalone/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1932" y="-56.8" font-family="Helvetica,sans-Serif" font-size="11.00">Base soleprint</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1932" y="-43.3" font-family="Helvetica,sans-Serif" font-size="11.00">Generic veins</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1932" y="-29.8" font-family="Helvetica,sans-Serif" font-size="11.00">No docker-compose</text>
|
||||
</g>
|
||||
<!-- amar -->
|
||||
<g id="node17" class="node">
|
||||
<title>amar</title>
|
||||
<path fill="#f5f5f5" stroke="black" d="M2176.25,-104.5C2176.25,-104.5 2023.75,-104.5 2023.75,-104.5 2017.75,-104.5 2011.75,-98.5 2011.75,-92.5 2011.75,-92.5 2011.75,-28 2011.75,-28 2011.75,-22 2017.75,-16 2023.75,-16 2023.75,-16 2176.25,-16 2176.25,-16 2182.25,-16 2188.25,-22 2188.25,-28 2188.25,-28 2188.25,-92.5 2188.25,-92.5 2188.25,-98.5 2182.25,-104.5 2176.25,-104.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2100" y="-90.05" font-family="Helvetica,sans-Serif" font-size="11.00">cfg/amar/</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2100" y="-63.55" font-family="Helvetica,sans-Serif" font-size="11.00">AMAR veterinary app</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2100" y="-50.05" font-family="Helvetica,sans-Serif" font-size="11.00">amar + mercadopago shunts</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2100" y="-36.55" font-family="Helvetica,sans-Serif" font-size="11.00">Full Docker setup</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="2100" y="-23.05" font-family="Helvetica,sans-Serif" font-size="11.00">Custom monitors (turnos)</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
115
docs/architecture/graph.html
Normal file
115
docs/architecture/graph.html
Normal file
@@ -0,0 +1,115 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Graph Viewer - Soleprint</title>
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
</head>
|
||||
<body class="graph-viewer">
|
||||
<header class="graph-header">
|
||||
<a href="index.html" class="back-link">← Back</a>
|
||||
<div class="nav-controls">
|
||||
<button onclick="navigate(-1)" id="btn-prev" title="Previous">◀</button>
|
||||
<span id="nav-position">1 / 4</span>
|
||||
<button onclick="navigate(1)" id="btn-next" title="Next">▶</button>
|
||||
</div>
|
||||
<h1 id="graph-title">Loading...</h1>
|
||||
<div class="graph-controls">
|
||||
<button onclick="setMode('fit')">Fit</button>
|
||||
<button onclick="setMode('fit-width')">Width</button>
|
||||
<button onclick="setMode('fit-height')">Height</button>
|
||||
<button onclick="setMode('actual-size')">100%</button>
|
||||
<button onclick="downloadSvg()">↓ SVG</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="graph-container" id="graph-container">
|
||||
<img id="graph-img" src="" alt="Graph" />
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const graphOrder = [
|
||||
"01-system-overview",
|
||||
"02-artery-hierarchy",
|
||||
"03-build-flow",
|
||||
"04-room-config",
|
||||
];
|
||||
|
||||
const graphs = {
|
||||
"01-system-overview": {
|
||||
title: "System Overview",
|
||||
file: "01-system-overview.svg",
|
||||
},
|
||||
"02-artery-hierarchy": {
|
||||
title: "Artery Hierarchy",
|
||||
file: "02-artery-hierarchy.svg",
|
||||
},
|
||||
"03-build-flow": {
|
||||
title: "Build Flow",
|
||||
file: "03-build-flow.svg",
|
||||
},
|
||||
"04-room-config": {
|
||||
title: "Room Configuration",
|
||||
file: "04-room-config.svg",
|
||||
},
|
||||
};
|
||||
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
let graphKey = params.get("g") || "01-system-overview";
|
||||
let currentIndex = graphOrder.indexOf(graphKey);
|
||||
if (currentIndex === -1) currentIndex = 0;
|
||||
|
||||
function loadGraph(key) {
|
||||
const graph = graphs[key];
|
||||
document.getElementById("graph-title").textContent = graph.title;
|
||||
document.getElementById("graph-img").src = graph.file;
|
||||
document.title = graph.title + " - Soleprint";
|
||||
history.replaceState(null, "", "?g=" + key);
|
||||
graphKey = key;
|
||||
updateNavHints();
|
||||
}
|
||||
|
||||
function updateNavHints() {
|
||||
const idx = graphOrder.indexOf(graphKey);
|
||||
const prevBtn = document.getElementById("btn-prev");
|
||||
const nextBtn = document.getElementById("btn-next");
|
||||
prevBtn.disabled = idx === 0;
|
||||
nextBtn.disabled = idx === graphOrder.length - 1;
|
||||
document.getElementById("nav-position").textContent =
|
||||
idx + 1 + " / " + graphOrder.length;
|
||||
}
|
||||
|
||||
function navigate(direction) {
|
||||
const idx = graphOrder.indexOf(graphKey);
|
||||
const newIdx = idx + direction;
|
||||
if (newIdx >= 0 && newIdx < graphOrder.length) {
|
||||
currentIndex = newIdx;
|
||||
loadGraph(graphOrder[newIdx]);
|
||||
}
|
||||
}
|
||||
|
||||
function setMode(mode) {
|
||||
const container = document.getElementById("graph-container");
|
||||
container.className = "graph-container " + mode;
|
||||
}
|
||||
|
||||
function downloadSvg() {
|
||||
const graph = graphs[graphKey];
|
||||
const link = document.createElement("a");
|
||||
link.href = graph.file;
|
||||
link.download = graph.file;
|
||||
link.click();
|
||||
}
|
||||
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if (e.key === "ArrowLeft") navigate(-1);
|
||||
else if (e.key === "ArrowRight") navigate(1);
|
||||
else if (e.key === "Escape") window.location.href = "index.html";
|
||||
});
|
||||
|
||||
loadGraph(graphOrder[currentIndex]);
|
||||
setMode("fit");
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
206
docs/architecture/index.html
Normal file
206
docs/architecture/index.html
Normal file
@@ -0,0 +1,206 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Soleprint - Architecture</title>
|
||||
<link rel="stylesheet" href="styles.css" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1>Soleprint</h1>
|
||||
<p class="subtitle">Cada paso deja huella / Each step leaves a mark</p>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<!-- What it solves -->
|
||||
<section class="findings-section">
|
||||
<h2>What Soleprint Solves</h2>
|
||||
<div class="findings-grid">
|
||||
<article class="finding-card">
|
||||
<h3>Freelance Work Standardization</h3>
|
||||
<p>Generalizing and homogenizing freelance work across projects. Instead of setting up different environments, testing approaches, and connector patterns for each client, Soleprint provides a consistent framework. Build once, reuse everywhere.</p>
|
||||
</article>
|
||||
<article class="finding-card">
|
||||
<h3>Missing Infrastructure Replication</h3>
|
||||
<p>When working with large corps where you can't access their Jira, Slack, payment systems, or internal APIs directly - Soleprint's shunts let you mock those systems locally. Test against fake MercadoPago, fake Jira tickets, fake webhooks without needing real credentials.</p>
|
||||
</article>
|
||||
<article class="finding-card">
|
||||
<h3>Reliable Testing Environment</h3>
|
||||
<p>Figure out what tests to write by actually running flows in a controlled environment. BDD -> Gherkin -> Tests workflow. Instead of guessing what to test, you explore the actual behavior first, document it, then generate tests from that documentation.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- System Overview -->
|
||||
<section class="graph-section" id="overview">
|
||||
<div class="graph-header-row">
|
||||
<h2>System Overview</h2>
|
||||
<a href="graph.html?g=01-system-overview" class="view-btn">View Full</a>
|
||||
</div>
|
||||
<a href="graph.html?g=01-system-overview" class="graph-preview">
|
||||
<img src="01-system-overview.svg" alt="System Overview" />
|
||||
</a>
|
||||
<div class="graph-details">
|
||||
<p>The four systems that make up Soleprint.</p>
|
||||
<h4>Systems</h4>
|
||||
<ul>
|
||||
<li><strong>Soleprint</strong>: Core coordinator hub (port 12000)</li>
|
||||
<li><strong>Artery</strong>: Connectors to external services - "Todo lo vital"</li>
|
||||
<li><strong>Atlas</strong>: Actionable documentation - "Documentacion accionable"</li>
|
||||
<li><strong>Station</strong>: Tools and monitors - "Centro de control"</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Artery Hierarchy -->
|
||||
<section class="graph-section" id="artery">
|
||||
<div class="graph-header-row">
|
||||
<h2>Artery Hierarchy</h2>
|
||||
<a href="graph.html?g=02-artery-hierarchy" class="view-btn">View Full</a>
|
||||
</div>
|
||||
<a href="graph.html?g=02-artery-hierarchy" class="graph-preview">
|
||||
<img src="02-artery-hierarchy.svg" alt="Artery Hierarchy" />
|
||||
</a>
|
||||
<div class="graph-details">
|
||||
<p>How connectors evolve from simple to complex.</p>
|
||||
<h4>Connector Types</h4>
|
||||
<table class="details-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
<th>Example</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Vein</td>
|
||||
<td>Stateless API connector</td>
|
||||
<td>Jira, Slack, Google</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Shunt</td>
|
||||
<td>Fake connector for testing</td>
|
||||
<td>MercadoPago mock</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pulse</td>
|
||||
<td>Vein + Room + Depot</td>
|
||||
<td>Jira for AMAR project</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Plexus</td>
|
||||
<td>Full app (backend + frontend + DB)</td>
|
||||
<td>WhatsApp with chat UI</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Build Flow -->
|
||||
<section class="graph-section" id="build">
|
||||
<div class="graph-header-row">
|
||||
<h2>Build Flow</h2>
|
||||
<a href="graph.html?g=03-build-flow" class="view-btn">View Full</a>
|
||||
</div>
|
||||
<a href="graph.html?g=03-build-flow" class="graph-preview">
|
||||
<img src="03-build-flow.svg" alt="Build Flow" />
|
||||
</a>
|
||||
<div class="graph-details">
|
||||
<p>How source is built into runnable instances.</p>
|
||||
<h4>Commands</h4>
|
||||
<table class="details-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Command</th>
|
||||
<th>Output</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>python build.py dev</code></td>
|
||||
<td>gen/standalone/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>python build.py dev --cfg amar</code></td>
|
||||
<td>gen/amar/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>python build.py dev --all</code></td>
|
||||
<td>both</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Room Config -->
|
||||
<section class="graph-section" id="room">
|
||||
<div class="graph-header-row">
|
||||
<h2>Room Configuration</h2>
|
||||
<a href="graph.html?g=04-room-config" class="view-btn">View Full</a>
|
||||
</div>
|
||||
<a href="graph.html?g=04-room-config" class="graph-preview">
|
||||
<img src="04-room-config.svg" alt="Room Configuration" />
|
||||
</a>
|
||||
<div class="graph-details">
|
||||
<p>How rooms are configured in cfg/.</p>
|
||||
<h4>Room Structure</h4>
|
||||
<ul>
|
||||
<li><strong>config.json</strong>: Framework branding, terminology</li>
|
||||
<li><strong>data/</strong>: veins.json, shunts.json, depots.json</li>
|
||||
<li><strong>soleprint/</strong>: Docker config for this room</li>
|
||||
<li><strong>databrowse/, tester/, monitors/, models/</strong>: Room-specific extensions</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Tech Stack -->
|
||||
<section class="tech-section">
|
||||
<h2>Technology Stack</h2>
|
||||
<div class="tech-grid">
|
||||
<div class="tech-column">
|
||||
<h3>Core</h3>
|
||||
<ul>
|
||||
<li>Python 3.11+</li>
|
||||
<li>FastAPI</li>
|
||||
<li>Jinja2</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tech-column">
|
||||
<h3>Tools</h3>
|
||||
<ul>
|
||||
<li>modelgen</li>
|
||||
<li>tester (Playwright)</li>
|
||||
<li>datagen</li>
|
||||
<li>databrowse</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tech-column">
|
||||
<h3>Veins</h3>
|
||||
<ul>
|
||||
<li>Jira</li>
|
||||
<li>Slack</li>
|
||||
<li>Google (OAuth)</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tech-column">
|
||||
<h3>Infrastructure</h3>
|
||||
<ul>
|
||||
<li>Docker</li>
|
||||
<li>Woodpecker CI</li>
|
||||
<li>Nginx</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<p>Soleprint - Development Workflow Platform</p>
|
||||
<p class="date">Generated: <time datetime="2025-01">January 2025</time></p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
343
docs/architecture/styles.css
Normal file
343
docs/architecture/styles.css
Normal file
@@ -0,0 +1,343 @@
|
||||
:root {
|
||||
--bg-primary: #1a1a2e;
|
||||
--bg-secondary: #16213e;
|
||||
--bg-card: #0f3460;
|
||||
--text-primary: #eee;
|
||||
--text-secondary: #a0a0a0;
|
||||
--accent: #e94560;
|
||||
--accent-secondary: #533483;
|
||||
--border: #2a2a4a;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
||||
background: var(--bg-primary);
|
||||
color: var(--text-primary);
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
header {
|
||||
background: linear-gradient(135deg, var(--bg-secondary), var(--accent-secondary));
|
||||
padding: 2rem;
|
||||
text-align: center;
|
||||
border-bottom: 2px solid var(--accent);
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
header .subtitle {
|
||||
color: var(--text-secondary);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
main {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
/* Graph sections */
|
||||
.graph-section {
|
||||
background: var(--bg-secondary);
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.graph-header-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.graph-header-row h2 {
|
||||
font-size: 1.25rem;
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.view-btn {
|
||||
background: var(--accent);
|
||||
color: white;
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 4px;
|
||||
text-decoration: none;
|
||||
font-size: 0.875rem;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
.view-btn:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.graph-preview {
|
||||
display: block;
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
max-height: 400px;
|
||||
}
|
||||
|
||||
.graph-preview img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.graph-details {
|
||||
color: var(--text-secondary);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.graph-details h4 {
|
||||
color: var(--text-primary);
|
||||
margin: 1rem 0 0.5rem;
|
||||
}
|
||||
|
||||
.graph-details ul {
|
||||
margin-left: 1.5rem;
|
||||
}
|
||||
|
||||
.graph-details li {
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
/* Tech section */
|
||||
.tech-section {
|
||||
background: var(--bg-secondary);
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.tech-section h2 {
|
||||
color: var(--accent);
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.tech-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.tech-column h3 {
|
||||
color: var(--text-primary);
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.75rem;
|
||||
padding-bottom: 0.5rem;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.tech-column ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.tech-column li {
|
||||
padding: 0.25rem 0;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
/* Findings */
|
||||
.findings-section {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.findings-section h2 {
|
||||
color: var(--accent);
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.findings-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.finding-card {
|
||||
background: var(--bg-secondary);
|
||||
border-radius: 8px;
|
||||
padding: 1.25rem;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.finding-card h3 {
|
||||
color: var(--accent);
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.finding-card ul {
|
||||
margin-left: 1rem;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.finding-card code {
|
||||
background: var(--bg-primary);
|
||||
padding: 0.125rem 0.375rem;
|
||||
border-radius: 3px;
|
||||
font-size: 0.85em;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
color: var(--text-secondary);
|
||||
border-top: 1px solid var(--border);
|
||||
}
|
||||
|
||||
footer .date {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
/* Graph viewer page */
|
||||
body.graph-viewer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.graph-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
padding: 0.75rem 1rem;
|
||||
background: var(--bg-secondary);
|
||||
border-bottom: 1px solid var(--border);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.back-link {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-controls {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.nav-controls button {
|
||||
background: var(--bg-card);
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--border);
|
||||
padding: 0.25rem 0.75rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nav-controls button:disabled {
|
||||
opacity: 0.3;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
#nav-position {
|
||||
color: var(--text-secondary);
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.graph-header h1 {
|
||||
flex: 1;
|
||||
font-size: 1rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.graph-controls {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.graph-controls button {
|
||||
background: var(--bg-card);
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--border);
|
||||
padding: 0.375rem 0.75rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.graph-controls button:hover {
|
||||
background: var(--accent);
|
||||
}
|
||||
|
||||
.graph-container {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
background: white;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.graph-container.fit img {
|
||||
max-width: 100%;
|
||||
max-height: calc(100vh - 60px);
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.graph-container.fit-width img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.graph-container.fit-height img {
|
||||
height: calc(100vh - 60px);
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.graph-container.actual-size img {
|
||||
/* No constraints */
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
.details-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 1rem 0;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.details-table th,
|
||||
.details-table td {
|
||||
padding: 0.5rem;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.details-table th {
|
||||
color: var(--text-primary);
|
||||
background: var(--bg-primary);
|
||||
}
|
||||
|
||||
.details-table td {
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.details-table code {
|
||||
background: var(--bg-primary);
|
||||
padding: 0.125rem 0.375rem;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.note {
|
||||
font-style: italic;
|
||||
font-size: 0.85rem;
|
||||
color: var(--text-secondary);
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
Reference in New Issue
Block a user