From 8f7d640e85f900640e766d7c8e04080b2b431a26 Mon Sep 17 00:00:00 2001 From: tarjelavik <Tarje.Lavik@ub.uib.no> Date: Fri, 17 Sep 2021 15:32:29 +0200 Subject: [PATCH] Add preview documentation --- docs/diagrams/component_studio.svg | 111 +++++++++++++++++------- docs/diagrams/component_web.svg | 66 +++++++++----- docs/diagrams/src/component_studio.puml | 32 +++++-- docs/diagrams/src/component_web.puml | 9 ++ 4 files changed, 159 insertions(+), 59 deletions(-) diff --git a/docs/diagrams/component_studio.svg b/docs/diagrams/component_studio.svg index 5ed7559..60e7e3a 100644 --- a/docs/diagrams/component_studio.svg +++ b/docs/diagrams/component_studio.svg @@ -1,20 +1,33 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="874px" preserveAspectRatio="none" style="width:744px;height:874px;background:#FFFFFF;" version="1.1" viewBox="0 0 744 874" width="744px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacing" textLength="328" x="201.5" y="17.4023">Component diagram for Sanity Studio</text><!--MD5=[7442f3b126ee602ae02566c1a49e158a] -cluster api--><rect fill="#FFFFFF" height="204" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="512" x="56.25" y="258.6992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="130" x="247.25" y="276.168">SPA Application</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="280.75" y="291.1445">[Container]</text><!--MD5=[30860e21ba0e39165c540f9e23fe2d63] -entity sign--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="200" x="80.25" y="327.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="143" x="108.75" y="353.168">Sign In Controller</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="160.25" y="368.1445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="182.25" y="384.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="172" x="94.25" y="400.6992">Allows users to sign in to</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="74" x="143.25" y="417.1875">the Studio.</text><!--MD5=[7d95986b1a7257a223a95834a13edd2e] -entity import_tool--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="209" x="316" y="319.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="91" x="375" y="344.668">Import tool</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="400.5" y="359.6445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="422.5" y="375.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="351" y="392.1992">Plugin for importing</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="185" x="326" y="408.6875">external resources into the</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="396.5" y="425.1758">Studio.</text><!--MD5=[33573e971ff506c0f246109ca3fd77bd] -entity spa--><rect fill="#438DD5" height="118.9297" style="stroke:#3C7FC0;stroke-width:1.5;" width="202" x="527.25" y="40.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="142" x="557.25" y="65.668">Sanity Studio SPA</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="126" x="565.25" y="80.6445">[Javascript and React]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="630.25" y="96.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="130" x="563.25" y="113.1992">Provides all editing</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="537.25" y="129.6875">functionality to editors via</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="128" x="564.25" y="146.1758">their web browser.</text><!--MD5=[3d74be2a757051a7059b41e555fce061] -entity sanity_db--><path d="M209,37.1992 C209,27.1992 309.5,27.1992 309.5,27.1992 C309.5,27.1992 410,27.1992 410,37.1992 L410,162.1523 C410,172.1523 309.5,172.1523 309.5,172.1523 C309.5,172.1523 209,172.1523 209,162.1523 L209,37.1992 " fill="#B3B3B3" style="stroke:#A6A6A6;stroke-width:1.5;"/><path d="M209,37.1992 C209,47.1992 309.5,47.1992 309.5,47.1992 C309.5,47.1992 410,47.1992 410,37.1992 " fill="none" style="stroke:#A6A6A6;stroke-width:1.5;"/><image height="50" width="50" x="284.5" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABjklEQVR4Xu2YzU7CQBRGeSoTJa4NaHwNxY2LwsqXplI0rpBLwEzOtGXa3tuZxjnJ2c39+SgNtLNZJpPJdGVXvB5CrY6yPjpcsqvsNzpcaIj79SpOIC6iJeeYwuHacp4J5eLWG2wh56qzDQzCOqEqXrxzTbJWnWtBeL4O1jTJOjUkxMnHuTe0z2DWU55X4y9IzVXh2RC+N29eH8oaFdwgbphqwG8AF6c8rwKDbB9u7IZZ4gU5y3PJwwCuu+XddAJx+SZZlyRc+po/T/M0g3HRPsrfHPaNAhcb4mfMe0s+US6kIeeMglWYchHpCnERDaPeQ+Xxu86FhlguI4Zxka8Il+sqeyaBfMJcNET2SY7QK8a6pOHykw0iMMAkg+yL1em5hiFMgvDJjfJ8F9w+h+f7uEG+FB93owYRWRMCe5gHETiwTta0IVeR9Zce0YOEBKrON3ebZiEucKCV5kEEDrWQM02oNv5gTTnPHC6gIWeMxuHj3Vumj9U6YggXLhaqvMhmr6Rof9Pe/19AJpP55/wCwk7g9HfTvaAAAAAASUVORK5CYII=" y="51.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="168" x="225.5" y="116.668">Sanity Cloud Storage</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="267" y="131.6445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="311.5" y="147.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="177" x="223" y="164.1992">Stores metadata and files.</text><!--MD5=[e29493a8775effcafa538aa0485107d1] -entity auth--><rect fill="#B3B3B3" height="133.9531" style="stroke:#A6A6A6;stroke-width:1.5;" width="203" x="7" y="548.6992"/><image height="48" width="48" x="84.5" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB5ElEQVR4Xu2YsZLCMAxE+f/fUXMNDQ0NDQ1NmjQ0NGloqLgde86ElWQrYZhkbvIqJsjrjWUpTnayMnZ8YWk2Qy02Qy3+haGfMDwywARDx+Pxfr8/J4Ihh8OBtXyihvb7PU81BQxnRYeoodvtlqUvl8vj8XifzgZhCM6/MZwVHUKGkKwyB+51GIbXtD4IQ3BxDxHWtQgZmrF1NBBhXYu2obLsnwMpVlc0DKF0WTXR9/25CgJ4TKLZCxqGTN3g4puJhiDHvVMzhP7Beong9iylQNTbUs2QWU3X65XjfBDM41P1cdwI19DpdGKlRLzFid9OIc6hf7iGzO7XdR2FYUpcHBL4oe3iIqukfkZhBdtQUMXcJXqHmffmtQDDkFfqtM5eOp4qrV72zRZgGAruRLMjZHRmzfowW4BhKEfDFvpbGaxr1Zwjo92POwhky6OawmQpQyUJFCamodWlzNuti21qCZe9OZNuembZ61XM2IYkrILFwMp/vTGKc/dPlY46wZY2xjUkzk5c7OEq/vFDtwCTecNrhmTWLRbMBTZLfUzDkLcJFjvCytoO+RnzdDyV4Ek8ZKi0gLW8KMraXqWl+uSKEG+nUUPyweeYYLIyEwwVXh+k3tF/8cgAcwx9lc1Qi81Qi81Qi18VHxRxhtGvjgAAAABJRU5ErkJggg==" y="558.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="183" x="17" y="622.168">Google Authentication</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="66" y="637.1445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="110.5" y="653.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="150" x="35.5" y="669.6992">Authenticates editors.</text><!--MD5=[e2ca8134d4d6579ee847ece18521a18e] -entity marcus--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="245" y="579.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="60" x="285.5" y="605.168">Marcus</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="317.5" y="622.0781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="259" y="638.5664">Content provider</text><!--MD5=[869122dbb59a4f5702fe9cdcd390c614] -entity kulturnav--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="421" y="579.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="80" x="451.5" y="605.168">Kulturnav</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="493.5" y="622.0781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="435" y="638.5664">Content provider</text><!--MD5=[29e43f0d87d4a5e4fc25a2c204ebb0f3] -entity nb--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="597" y="579.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="47" x="644" y="605.168">NB.no</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="669.5" y="622.0781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="611" y="638.5664">Content provider</text><!--MD5=[10c2457638a95e38b5d87a5d20a81c8c] -link import_tool to sanity_db--><path d="M396.69,318.9042 C380.478,278.4482 358.755,224.2372 341.016,179.9722 " fill="none" id="import_tool-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="337.98,172.3942,338.1705,180.9361,343.7401,178.7046,337.98,172.3942" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="363.25" y="222.8008">Uses</text><!--MD5=[cc6e701350592b60920a324fb448bbde] -link import_tool to marcus--><path d="M394.025,438.3932 C375.481,479.8962 351.045,534.5872 334.335,571.9842 " fill="none" id="import_tool-to-marcus" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="330.892,579.6912,336.895,573.6114,331.4171,571.1634,330.892,579.6912" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="372.25" y="499.8008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="373.75" y="513.9336">[HTTPS]</text><!--MD5=[ce03490f95923a2a4bf4a1a880a51bb0] -link import_tool to kulturnav--><path d="M437.983,438.3932 C450.522,479.8962 467.046,534.5872 478.345,571.9842 " fill="none" id="import_tool-to-kulturnav" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="480.673,579.6912,481.2321,571.1655,475.4883,572.9001,480.673,579.6912" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="463.25" y="499.8008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="464.75" y="513.9336">[HTTPS]</text><!--MD5=[72e6538a4afd9ff6e5f89c0cb2220dab] -link import_tool to nb--><path d="M481.941,438.3932 C526.294,480.5912 584.975,536.4222 624.312,573.8472 " fill="none" id="import_tool-to-nb" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="630.454,579.6912,626.7261,572.0034,622.5903,576.3503,630.454,579.6912" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="566.25" y="499.8008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="567.75" y="513.9336">[HTTPS]</text><!--MD5=[8d00e1f70b11306d90ba31f906661b1d] -reverse link sanity_db to spa--><path d="M418.161,99.6992 C453.464,99.6992 492.454,99.6992 527.163,99.6992 " fill="none" id="sanity_db-backto-spa" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="409.746,99.6992,417.746,102.6992,417.746,96.6992,409.746,99.6992" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="452.75" y="78.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="427.75" y="92.4336">[JSON/HTTPS]</text><!--MD5=[b20751f21bc3c5e56073fe913b5ac5ab] -link spa to api--><path d="M613.829,159.4442 C604.0045,199.4642 590.8715,252.9615 580.0668,296.9745 C577.3656,307.9777 574.8099,318.3882 572.4878,327.8471 C571.3268,332.5766 570.2241,337.0682 569.1909,341.2771 C568.9326,342.3293 568.6786,343.3638 568.4291,344.38 " fill="none" id="spa-to-api" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="568.4291,344.38,573.2499,337.3259,567.423,335.8954,568.4291,344.38" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="628.25" y="215.8008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="603.25" y="229.9336">[JSON/HTTPS]</text><!--MD5=[0b4537366c46ce983a36229d7d90ca4d] -link sign to auth--><path d="M164.893,429.8242 C155.025,462.0322 142.032,504.4402 130.979,540.5142 " fill="none" id="sign-to-auth" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="128.507,548.5832,133.7181,541.8124,127.9812,540.0554,128.507,548.5832" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="173.25" y="499.8008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="148.25" y="513.9336">[JSON/HTTPS]</text><rect fill="#FFFFFF" height="162.3945" rx="5" ry="5" style="stroke:#FFFFFF;stroke-width:1.0;" width="159" x="563" y="695.6523"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="51" x="569" y="716.1875">Legend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="624" y="716.1875"/><rect fill="#08427B" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="719.1406"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="573" y="732.6758">person</text><rect fill="#1168BD" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="735.6289"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="47" x="573" y="749.1641">system</text><rect fill="#438DD5" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="752.1172"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="573" y="765.6523">container</text><rect fill="#85BBF0" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="768.6055"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="78" x="573" y="782.1406">component</text><rect fill="#686868" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="785.0938"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="573" y="798.6289">external person</text><rect fill="#999999" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="801.582"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="573" y="815.1172">external system</text><rect fill="#B3B3B3" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="818.0703"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="573" y="831.6055">external container</text><rect fill="#CCCCCC" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="569" y="834.5586"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="573" y="848.0938">external component</text><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="702.6523" y2="702.6523"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="719.1406" y2="719.1406"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="735.6289" y2="735.6289"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="752.1172" y2="752.1172"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="768.6055" y2="768.6055"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="785.0938" y2="785.0938"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="801.582" y2="801.582"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="818.0703" y2="818.0703"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="834.5586" y2="834.5586"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="716" y1="851.0469" y2="851.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="569" x2="569" y1="702.6523" y2="851.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="716" x2="716" y1="702.6523" y2="851.0469"/><!--MD5=[fad32fe7eff3261b3d1a5eb3a35bfab4] +<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1209px" preserveAspectRatio="none" style="width:2078px;height:1209px;background:#FFFFFF;" version="1.1" viewBox="0 0 2078 1209" width="2078px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacing" textLength="328" x="868.605" y="17.4023">Component diagram for Sanity Studio</text><!--MD5=[7442f3b126ee602ae02566c1a49e158a] +cluster api--><rect fill="#FFFFFF" height="568" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="765" x="7" y="186.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="130" x="324.5" y="203.668">SPA Application</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="358" y="218.6445">[Container]</text><!--MD5=[3ee045e728939fe034a5f1f68a887008] +cluster next--><a href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" target="_top" title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:actuate="onRequest" xlink:href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:show="new" xlink:title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:type="simple"><rect fill="#FFFFFF" height="290" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="851" x="887" y="480.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="72" x="1276.5" y="497.668">Next app</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1281" y="512.6445">[Container]</text></a><!--MD5=[d5ac3844f66b12d9e08170e47495e096] +cluster app--><rect fill="#FFFFFF" height="190" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="182" x="1532" y="548.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="110" x="1568" y="565.668">Preview fetch</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1591.5" y="580.6445">[Container]</text><!--MD5=[ccd133e9ad8ee15f0a1e2d6545982481] +cluster next_api--><rect fill="#FFFFFF" height="206" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="536" x="911" y="540.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="121" x="1118.5" y="557.668">Server side API</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1147.5" y="572.6445">[Container]</text><!--MD5=[30860e21ba0e39165c540f9e23fe2d63] +entity sign--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="200" x="284" y="291.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="143" x="312.5" y="316.668">Sign In Controller</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="364" y="331.6445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="386" y="347.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="172" x="298" y="364.1992">Allows users to sign in to</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="74" x="347" y="380.6875">the Studio.</text><!--MD5=[7d95986b1a7257a223a95834a13edd2e] +entity import_tool--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="209" x="519.75" y="282.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="91" x="578.75" y="308.168">Import tool</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="604.25" y="323.1445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="626.25" y="339.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="554.75" y="355.6992">Plugin for importing</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="185" x="529.75" y="372.1875">external resources into the</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="600.25" y="388.6758">Studio.</text><!--MD5=[4a25415281e815767a329b93358bb1b9] +entity preview--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="217" x="31.75" y="291.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="110" x="85.25" y="316.668">Desk preview</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="120.25" y="331.6445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="142.25" y="347.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="193" x="45.75" y="364.1992">Preview tab addition to desk</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="44" x="118.25" y="380.6875">forms.</text><!--MD5=[698d913457f9c86de3bf77a2a7de22cf] +entity resolveProductionUrl--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="213" x="404.75" y="628.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="172" x="425.25" y="653.668">resolveProductionUrl</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="491.25" y="668.6445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="513.25" y="684.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="185" x="418.75" y="701.1992">Sends correct id to preview</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="146" x="438.25" y="717.6875">api along with secret.</text><!--MD5=[3b003e53f0c5c3fd2bdf9e50327f52d3] +entity overlay--><rect fill="#85BBF0" height="85.9531" style="stroke:#78A8D8;stroke-width:1.5;" width="150" x="1548" y="636.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="16" x="1615" y="661.668">/*</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1602.5" y="676.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1625" y="692.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="1562" y="709.1992">Serves static page.</text><!--MD5=[1efdf5ff296020223cd10859dff9c219] +entity api_preview--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="279" x="1151.75" y="628.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="259" x="1161.75" y="653.668">/api/preview?token=[]&slug=[]</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1270.75" y="668.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1293.25" y="684.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="166" x="1208.25" y="701.1992">Validates token and sets</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="161" x="1210.75" y="717.6875">preview variable to true</text><!--MD5=[7fb0a03ec23579436cc251699a593eb9] +entity api_exit_preview--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="189" x="927.75" y="628.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="146" x="949.25" y="653.668">/api/exit-preview</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1001.75" y="668.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1024.25" y="684.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="161" x="941.75" y="701.1992">Sets preview variable to</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="32" x="1006.25" y="717.6875">false</text><!--MD5=[33573e971ff506c0f246109ca3fd77bd] +entity spa--><rect fill="#438DD5" height="168.9297" style="stroke:#3C7FC0;stroke-width:1.5;" width="202" x="687" y="848.6992"/><image height="50" width="50" x="763" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABjklEQVR4Xu2YzU7CQBRGeSoTJa4NaHwNxY2LwsqXplI0rpBLwEzOtGXa3tuZxjnJ2c39+SgNtLNZJpPJdGVXvB5CrY6yPjpcsqvsNzpcaIj79SpOIC6iJeeYwuHacp4J5eLWG2wh56qzDQzCOqEqXrxzTbJWnWtBeL4O1jTJOjUkxMnHuTe0z2DWU55X4y9IzVXh2RC+N29eH8oaFdwgbphqwG8AF6c8rwKDbB9u7IZZ4gU5y3PJwwCuu+XddAJx+SZZlyRc+po/T/M0g3HRPsrfHPaNAhcb4mfMe0s+US6kIeeMglWYchHpCnERDaPeQ+Xxu86FhlguI4Zxka8Il+sqeyaBfMJcNET2SY7QK8a6pOHykw0iMMAkg+yL1em5hiFMgvDJjfJ8F9w+h+f7uEG+FB93owYRWRMCe5gHETiwTta0IVeR9Zce0YOEBKrON3ebZiEucKCV5kEEDrWQM02oNv5gTTnPHC6gIWeMxuHj3Vumj9U6YggXLhaqvMhmr6Rof9Pe/19AJpP55/wCwk7g9HfTvaAAAAAASUVORK5CYII=" y="858.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="142" x="717" y="924.168">Sanity Studio SPA</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="126" x="725" y="939.1445">[Javascript and React]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="790" y="955.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="130" x="723" y="971.6992">Provides all editing</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="697" y="988.1875">functionality to editors via</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="128" x="724" y="1004.6758">their web browser.</text><!--MD5=[3d74be2a757051a7059b41e555fce061] +entity sanity_db--><path d="M1825.75,870.6992 C1825.75,860.6992 1926.25,860.6992 1926.25,860.6992 C1926.25,860.6992 2026.75,860.6992 2026.75,870.6992 L2026.75,995.6523 C2026.75,1005.6523 1926.25,1005.6523 1926.25,1005.6523 C1926.25,1005.6523 1825.75,1005.6523 1825.75,995.6523 L1825.75,870.6992 " fill="#B3B3B3" style="stroke:#A6A6A6;stroke-width:1.5;"/><path d="M1825.75,870.6992 C1825.75,880.6992 1926.25,880.6992 1926.25,880.6992 C1926.25,880.6992 2026.75,880.6992 2026.75,870.6992 " fill="none" style="stroke:#A6A6A6;stroke-width:1.5;"/><image height="50" width="50" x="1901.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABjklEQVR4Xu2YzU7CQBRGeSoTJa4NaHwNxY2LwsqXplI0rpBLwEzOtGXa3tuZxjnJ2c39+SgNtLNZJpPJdGVXvB5CrY6yPjpcsqvsNzpcaIj79SpOIC6iJeeYwuHacp4J5eLWG2wh56qzDQzCOqEqXrxzTbJWnWtBeL4O1jTJOjUkxMnHuTe0z2DWU55X4y9IzVXh2RC+N29eH8oaFdwgbphqwG8AF6c8rwKDbB9u7IZZ4gU5y3PJwwCuu+XddAJx+SZZlyRc+po/T/M0g3HRPsrfHPaNAhcb4mfMe0s+US6kIeeMglWYchHpCnERDaPeQ+Xxu86FhlguI4Zxka8Il+sqeyaBfMJcNET2SY7QK8a6pOHykw0iMMAkg+yL1em5hiFMgvDJjfJ8F9w+h+f7uEG+FB93owYRWRMCe5gHETiwTta0IVeR9Zce0YOEBKrON3ebZiEucKCV5kEEDrWQM02oNv5gTTnPHC6gIWeMxuHj3Vumj9U6YggXLhaqvMhmr6Rof9Pe/19AJpP55/wCwk7g9HfTvaAAAAAASUVORK5CYII=" y="884.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="168" x="1842.25" y="950.168">Sanity Cloud Storage</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="1883.75" y="965.1445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1928.25" y="981.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="177" x="1839.75" y="997.6992">Stores metadata and files.</text><!--MD5=[e29493a8775effcafa538aa0485107d1] +entity auth--><rect fill="#B3B3B3" height="133.9531" style="stroke:#A6A6A6;stroke-width:1.5;" width="203" x="1754.75" y="612.1992"/><image height="48" width="48" x="1832.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB5ElEQVR4Xu2YsZLCMAxE+f/fUXMNDQ0NDQ1NmjQ0NGloqLgde86ElWQrYZhkbvIqJsjrjWUpTnayMnZ8YWk2Qy02Qy3+haGfMDwywARDx+Pxfr8/J4Ihh8OBtXyihvb7PU81BQxnRYeoodvtlqUvl8vj8XifzgZhCM6/MZwVHUKGkKwyB+51GIbXtD4IQ3BxDxHWtQgZmrF1NBBhXYu2obLsnwMpVlc0DKF0WTXR9/25CgJ4TKLZCxqGTN3g4puJhiDHvVMzhP7Beong9iylQNTbUs2QWU3X65XjfBDM41P1cdwI19DpdGKlRLzFid9OIc6hf7iGzO7XdR2FYUpcHBL4oe3iIqukfkZhBdtQUMXcJXqHmffmtQDDkFfqtM5eOp4qrV72zRZgGAruRLMjZHRmzfowW4BhKEfDFvpbGaxr1Zwjo92POwhky6OawmQpQyUJFCamodWlzNuti21qCZe9OZNuembZ61XM2IYkrILFwMp/vTGKc/dPlY46wZY2xjUkzk5c7OEq/vFDtwCTecNrhmTWLRbMBTZLfUzDkLcJFjvCytoO+RnzdDyV4Ek8ZKi0gLW8KMraXqWl+uSKEG+nUUPyweeYYLIyEwwVXh+k3tF/8cgAcwx9lc1Qi81Qi81Qi18VHxRxhtGvjgAAAABJRU5ErkJggg==" y="622.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="183" x="1764.75" y="685.668">Google Authentication</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="1813.75" y="700.6445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1858.25" y="716.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="150" x="1783.25" y="733.1992">Authenticates editors.</text><!--MD5=[e2ca8134d4d6579ee847ece18521a18e] +entity marcus--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="729.75" y="28.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="60" x="770.25" y="53.668">Marcus</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="802.25" y="70.5781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="743.75" y="87.0664">Content provider</text><!--MD5=[869122dbb59a4f5702fe9cdcd390c614] +entity kulturnav--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="553.75" y="28.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="80" x="584.25" y="53.668">Kulturnav</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="626.25" y="70.5781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="567.75" y="87.0664">Content provider</text><!--MD5=[29e43f0d87d4a5e4fc25a2c204ebb0f3] +entity nb--><rect fill="#999999" height="71.8203" style="stroke:#8A8A8A;stroke-width:1.5;" width="141" x="377.75" y="28.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="47" x="424.75" y="53.668">NB.no</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="450.25" y="70.5781"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="391.75" y="87.0664">Content provider</text><!--MD5=[10c2457638a95e38b5d87a5d20a81c8c] +link import_tool to sanity_db--><path d="M728.298,401.0962 C729.533,401.4792 730.767,401.8472 732,402.1992 C865.014,440.1782 1879.98,371.6732 1975,472.1992 C2071.21,573.9792 2013.61,750.5472 1967.1,852.7842 " fill="none" id="import_tool-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1963.63,860.3182,1969.6993,854.3046,1964.2486,851.7966,1963.63,860.3182" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="2028" y="683.3008">Uses</text><!--MD5=[9275baae73afe07bd484df2dfc6ef7ed] +link preview to resolveProductionUrl--><path d="M195.542,393.3522 C263.533,454.7452 378.331,558.4042 449.097,622.3032 " fill="none" id="preview-to-resolveProductionUrl" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="455.382,627.9772,451.4552,620.389,447.434,624.8421,455.382,627.9772" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="272" y="452.3008">Uses</text><!--MD5=[0b4537366c46ce983a36229d7d90ca4d] +link sign to auth--><path d="M477.578,393.2482 C485.71,396.5952 493.92,399.6442 502,402.1992 C587.701,429.2992 620.593,394.0962 702,432.1992 C721.389,441.2742 718.021,456.5092 738,464.1992 C763.302,473.9382 1690.05,459.4942 1714,472.1992 C1766.72,500.1682 1803.76,557.4552 1826.76,604.5332 " fill="none" id="sign-to-auth" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1830.33,611.9952,1829.5823,603.484,1824.1703,606.0743,1830.33,611.9952" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="764" y="445.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="739" y="459.4336">[JSON/HTTPS]</text><!--MD5=[4a95faa665d3139c578f5686cfd0df5c] +link api_preview to overlay--><path d="M1430.35,679.1992 C1467.49,679.1992 1506.45,679.1992 1539.54,679.1992 " fill="none" id="api_preview-to-overlay" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1547.82,679.1992,1539.82,676.1992,1539.82,682.1992,1547.82,679.1992" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="57" x="1460" y="657.8008">Redirects</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1448.5" y="671.9336">[JSON/HTTPS]</text><!--MD5=[b45430e1be5c19f53a00538edff2ec11] +reverse link preview to overlay--><path d="M250.728,396.3782 C255.858,398.4212 260.965,400.3732 266,402.1992 C367.545,439.0292 393.939,449.8532 501,464.1992 C527.046,467.6892 1423.18,461.0982 1447,472.1992 C1519.7,506.0782 1573.63,586.2062 1601.54,635.9502 " fill="none" id="preview-backto-overlay" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="243.201,393.3242,249.4855,399.1125,251.7419,393.553,243.201,393.3242" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="105" x="502" y="445.3008">Streams changes</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="514.5" y="459.4336">[JSON/HTTPS]</text><!--MD5=[aa78c49c6c5bdca418a70581d35c44a2] +reverse link marcus to import_tool--><path d="M772.464,107.4772 C760.05,126.5992 745.236,149.5042 732,170.1992 C708.162,207.4702 681.627,249.4772 660.824,282.5292 " fill="none" id="marcus-backto-import_tool" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="776.922,100.6142,770.0491,105.6899,775.0812,108.9576,776.922,100.6142" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="758" y="143.3008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="759.5" y="157.4336">[HTTPS]</text><!--MD5=[397c656162bdf1374bc84609635dfd08] +reverse link kulturnav to import_tool--><path d="M624,108.5642 C624,155.4452 624,230.4362 624,282.5532 " fill="none" id="kulturnav-backto-import_tool" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="624,100.4352,621,108.4352,627,108.4352,624,100.4352" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="625" y="143.3008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="626.5" y="157.4336">[HTTPS]</text><!--MD5=[b1bebbe118c8398e4de9e7b4fd539094] +reverse link nb to import_tool--><path d="M474.914,107.4052 C504.755,154.2012 553.093,230.0042 586.603,282.5532 " fill="none" id="nb-backto-import_tool" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="470.469,100.4352,472.2407,108.7935,477.2997,105.5676,470.469,100.4352" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="49" x="506" y="143.3008">Imports</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="46" x="507.5" y="157.4336">[HTTPS]</text><!--MD5=[0271d862dad669faf31941ba3e900435] +link spa to sanity_db--><path d="M889.24,933.1992 C1102.85,933.1992 1598.01,933.1992 1817.68,933.1992 " fill="none" id="spa-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1825.7,933.1992,1817.7,930.1992,1817.7,936.1992,1825.7,933.1992" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1341.75" y="911.8008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1316.75" y="925.9336">[JSON/HTTPS]</text><!--MD5=[13cfa0366951c83b0d0b9eca32570194] +link overlay to sanity_db--><path d="M1671.3,722.2082 C1691.5,739.6512 1715.28,760.0242 1737,778.1992 C1767.3,803.5612 1800.64,830.9062 1830.77,855.4152 " fill="none" id="overlay-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1837.14,860.6002,1832.8225,853.2273,1829.0392,857.8842,1837.14,860.6002" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1809" y="799.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1784" y="813.4336">[JSON/HTTPS]</text><!--MD5=[32a41e1aa2dd9c3ad96b8807953e5b39] +link resolveProductionUrl to api_preview--><path d="M554.152,628.1282 C597.054,581.6612 667.508,516.2542 745,488.6992 C907.897,430.7752 977.634,414.9412 1134,488.6992 C1191.4,515.7732 1234.92,575.2642 1261.42,620.6122 " fill="none" id="resolveProductionUrl-to-api_preview" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1265.53,627.7612,1264.1501,619.3294,1258.9461,622.3158,1265.53,627.7612" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="643.5" y="445.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="618.5" y="459.4336">[JSON/HTTPS]</text><!--MD5=[c6021ebbec22d1130f0072b34dcfbf7b] +reverse link api to spa--><path d="M772.0626,350.5985 C772.2115,350.7413 772.362,350.886 772.5141,351.0326 C772.8183,351.3257 773.1289,351.6263 773.4457,351.9343 C778.5137,356.861 785.1492,363.6624 792.1529,371.7943 C806.1602,388.0582 821.6405,409.6442 829,432.1992 C834.516,449.1052 829.873,454.5152 828,472.1992 C814.087,603.5322 801.515,756.3402 794.32,848.5892 " fill="none" id="api-backto-spa" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="772.0626,350.5985,775.7583,358.3019,779.9123,353.9723,772.0626,350.5985" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="854" y="676.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="829" y="690.4336">[JSON/HTTPS]</text><rect fill="#FFFFFF" height="162.3945" rx="5" ry="5" style="stroke:#FFFFFF;stroke-width:1.0;" width="159" x="1897.21" y="1030.6289"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="51" x="1903.21" y="1051.1641">Legend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1958.21" y="1051.1641"/><rect fill="#08427B" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1054.1172"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="1907.21" y="1067.6523">person</text><rect fill="#1168BD" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1070.6055"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="47" x="1907.21" y="1084.1406">system</text><rect fill="#438DD5" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1087.0938"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="1907.21" y="1100.6289">container</text><rect fill="#85BBF0" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1103.582"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="78" x="1907.21" y="1117.1172">component</text><rect fill="#686868" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1120.0703"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="1907.21" y="1133.6055">external person</text><rect fill="#999999" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1136.5586"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="1907.21" y="1150.0938">external system</text><rect fill="#B3B3B3" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1153.0469"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="1907.21" y="1166.582">external container</text><rect fill="#CCCCCC" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1903.21" y="1169.5352"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="1907.21" y="1183.0703">external component</text><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1037.6289" y2="1037.6289"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1054.1172" y2="1054.1172"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1070.6055" y2="1070.6055"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1087.0938" y2="1087.0938"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1103.582" y2="1103.582"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1120.0703" y2="1120.0703"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1136.5586" y2="1136.5586"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1153.0469" y2="1153.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1169.5352" y2="1169.5352"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="2050.21" y1="1186.0234" y2="1186.0234"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1903.21" x2="1903.21" y1="1037.6289" y2="1186.0234"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="2050.21" x2="2050.21" y1="1037.6289" y2="1186.0234"/><!--MD5=[3a8f21caa493a496c238741778101e89] @startuml "component_studio" !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml ' uncomment the following line and comment the first to use locally @@ -34,7 +47,7 @@ LAYOUT_WITH_LEGEND() title Component diagram for Sanity Studio -Container(spa, "Sanity Studio SPA", "Javascript and React", "Provides all editing functionality to editors via their web browser.") +Container(spa, "Sanity Studio SPA", "Javascript and React", "Provides all editing functionality to editors via their web browser.", SANITY) ContainerDb_Ext(sanity_db, "Sanity Cloud Storage", "Google Cloud", "Stores metadata and files.", "SANITY") Container_Ext(auth, "Google Authentication", "Google Cloud", "Authenticates editors.", "google_cloud_platform") @@ -45,17 +58,35 @@ System_Ext(nb, "NB.no", "Content provider") Container_Boundary(api, "SPA Application", "SANITY") { Component(sign, "Sign In Controller", "React", "Allows users to sign in to the Studio.") Component(import_tool, "Import tool", "React", "Plugin for importing external resources into the Studio.") + Component(preview, "Desk preview", "React", "Preview tab addition to desk forms.") + Component(resolveProductionUrl, "resolveProductionUrl", "React", "Sends correct id to preview api along with secret.") Rel(import_tool, sanity_db, "Uses") + Rel(preview, resolveProductionUrl, "Uses") + Rel(sign, auth, "Uses", "JSON/HTTPS") +} + +Container_Boundary(next, "Next app", "", NEXT) { + + Container_Boundary(app, "Preview fetch") { + Component(overlay, "/*", "Route", "Serves static page.") + } + Container_Boundary(next_api, "Server side API") { + Component(api_preview, "/api/preview?token=[]&slug=[]", "Route", "Validates token and sets preview variable to true") + Component(api_exit_preview, "/api/exit-preview", "Route", "Sets preview variable to false") + } + Rel_R(api_preview, overlay, "Redirects", "JSON/HTTPS") + Rel_U(overlay, preview, "Streams changes", "JSON/HTTPS") } -Rel_D(import_tool, marcus, "Imports", "HTTPS") -Rel_D(import_tool, kulturnav, "Imports", "HTTPS") -Rel_D(import_tool, nb, "Imports", "HTTPS") -Rel_L(spa, sanity_db, "Uses", "JSON/HTTPS") -Rel_D(spa, api, "Uses", "JSON/HTTPS") -Rel(sign, auth, "Uses", "JSON/HTTPS") +Rel_U(import_tool, marcus, "Imports", "HTTPS") +Rel_U(import_tool, kulturnav, "Imports", "HTTPS") +Rel_U(import_tool, nb, "Imports", "HTTPS") +Rel_R(spa, sanity_db, "Uses", "JSON/HTTPS") +Rel_D(overlay, sanity_db, "Uses", "JSON/HTTPS") +Rel_R(resolveProductionUrl, api_preview, "Uses", "JSON/HTTPS") +Rel_U(spa, api, "Uses", "JSON/HTTPS") @enduml @@ -727,7 +758,7 @@ endlegend title Component diagram for Sanity Studio -rectangle "==Sanity Studio SPA\n//<size:12>[Javascript and React]</size>//\n\n Provides all editing functionality to editors via their web browser." <<container>> as spa +rectangle "<img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACeklEQVRoQ+2ZQU5bQQyGPe8hVWkT0mOgqlUldskNkos06aaLwIojlGzbHgTBCYA1C9hwiUYEWkQSI0cMekomE9vjlwBK1jO2P//2eObFwRv5uTfCARuQl6bkRpGQIje9DnKVogxW+3/MEmliSAIQAq0ZACWBpAIUoTLn4MPhb3U86o2WEEUgrToqkLIgPJAGRgwyaDUw+/SV29PqdVIYMcjfVgNzBkgokGHvGyJzBq8dhBMAtzQ5trzkIkVIjenGLIN858tc2Ugc0+ZlQBJ7OhAAmC0viVOfgX/733E0mUT7iGtXDULePYxzDqrKGWClShIITMaQf94FbtbURxhjYxrIk4OPJ+ciO4y4xEtEATw3e8BN7hzUjs9E9sTRRjaIHMdAij7WoZAIhILlwniwSp7Bu6NTsR+pWmIHUpBQQOS0btxXYhCNKrHs0vV926C3VCB0cWQ/BQU1ktJbKhCKrSwYBw7qJ/LTTw3iE23RM7OiaXooGcQHMWg3EQ0LzjmA+jF/0JqBzGZ10GoiQlonSXqmNJA5sHZDJRgXZmUgWsVePEgRLHZgvCqQ2JB9VSC3vS5OAGF8dTE3Ps1BrF5yoUFftF29voTBw+h52cpB6D3y3ui5W1Rm5SCUQs2TN6R0qSAU6LLyksLc7XVxHLgNUEL8SWauCBfEF3dMnWGvu3TqkypcCPIpHogcVQQ394VLSweRKqOFkvabWBEKbLjfQYx/INTGP90nhVCVVjHCMspMA5EMQgbw4AcO/98nKTANxAFUD/V/jqpKa9l0llBtZRlUfv5KjiPZwKKg41/aHdT6+j8+Qz5LA5GoYrF2A2KRRUsbG0Uss2lh6xFkswBC9e0BzQAAAABJRU5ErkJggg==>\n==Sanity Studio SPA\n//<size:12>[Javascript and React]</size>//\n\n Provides all editing functionality to editors via their web browser." <<container>> as spa database "<img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACeklEQVRoQ+2ZQU5bQQyGPe8hVWkT0mOgqlUldskNkos06aaLwIojlGzbHgTBCYA1C9hwiUYEWkQSI0cMekomE9vjlwBK1jO2P//2eObFwRv5uTfCARuQl6bkRpGQIje9DnKVogxW+3/MEmliSAIQAq0ZACWBpAIUoTLn4MPhb3U86o2WEEUgrToqkLIgPJAGRgwyaDUw+/SV29PqdVIYMcjfVgNzBkgokGHvGyJzBq8dhBMAtzQ5trzkIkVIjenGLIN858tc2Ugc0+ZlQBJ7OhAAmC0viVOfgX/733E0mUT7iGtXDULePYxzDqrKGWClShIITMaQf94FbtbURxhjYxrIk4OPJ+ciO4y4xEtEATw3e8BN7hzUjs9E9sTRRjaIHMdAij7WoZAIhILlwniwSp7Bu6NTsR+pWmIHUpBQQOS0btxXYhCNKrHs0vV926C3VCB0cWQ/BQU1ktJbKhCKrSwYBw7qJ/LTTw3iE23RM7OiaXooGcQHMWg3EQ0LzjmA+jF/0JqBzGZ10GoiQlonSXqmNJA5sHZDJRgXZmUgWsVePEgRLHZgvCqQ2JB9VSC3vS5OAGF8dTE3Ps1BrF5yoUFftF29voTBw+h52cpB6D3y3ui5W1Rm5SCUQs2TN6R0qSAU6LLyksLc7XVxHLgNUEL8SWauCBfEF3dMnWGvu3TqkypcCPIpHogcVQQ394VLSweRKqOFkvabWBEKbLjfQYx/INTGP90nhVCVVjHCMspMA5EMQgbw4AcO/98nKTANxAFUD/V/jqpKa9l0llBtZRlUfv5KjiPZwKKg41/aHdT6+j8+Qz5LA5GoYrF2A2KRRUsbG0Uss2lh6xFkswBC9e0BzQAAAABJRU5ErkJggg==>\n==Sanity Cloud Storage\n//<size:12>[Google Cloud]</size>//\n\n Stores metadata and files." <<external_container>> as sanity_db rectangle "<$google_cloud_platform>\n==Google Authentication\n//<size:12>[Google Cloud]</size>//\n\n Authenticates editors." <<external_container>> as auth @@ -738,17 +769,35 @@ rectangle "==NB.no\n\n Content provider" <<external_system>> as nb rectangle "==SPA Application\n<size:12>[Container]</size>" <<img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACeklEQVRoQ>><<2ZQU5bQQyGPe8hVWkT0mOgqlUldskNkos06aaLwIojlGzbHgTBCYA1C9hwiUYEWkQSI0cMekomE9vjlwBK1jO2P//2eObFwRv5uTfCARuQl6bkRpGQIje9DnKVogxW>><<3/MEmliSAIQAq0ZACWBpAIUoTLn4MPhb3U86o2WEEUgrToqkLIgPJAGRgwyaDUw>><</SV29PqdVIYMcjfVgNzBkgokGHvGyJzBq8dhBMAtzQ5trzkIkVIjenGLIN858tc2Ugc0>><<ZlQBJ7OhAAmC0viVOfgX/733E0mUT7iGtXDULePYxzDqrKGWClShIITMaQf94FbtbURxhjYxrIk4OPJ>><<ciO4y4xEtEATw3e8BN7hzUjs9E9sTRRjaIHMdAij7WoZAIhILlwniwSp7Bu6NTsR>><<pWmIHUpBQQOS0btxXYhCNKrHs0vV926C3VCB0cWQ/BQU1ktJbKhCKrSwYBw7qJ/LTTw3iE23RM7OiaXooGcQHMWg3EQ0LzjmA>><<jF/0JqBzGZ10GoiQlonSXqmNJA5sHZDJRgXZmUgWsVePEgRLHZgvCqQ2JB9VSC3vS5OAGF8dTE3Ps1BrF5yoUFftF29voTBw>><<h52cpB6D3y3ui5W1Rm5SCUQs2TN6R0qSAU6LLyksLc7XVxHLgNUEL8SWauCBfEF3dMnWGvu3TqkypcCPIpHogcVQQ394VLSweRKqOFkvabWBEKbLjfQYx/INTGP90nhVCVVjHCMspMA5EMQgbw4AcO/98nKTANxAFUD/V/jqpKa9l0llBtZRlUfv5KjiPZwKKg41/aHdT6>><<j8>><<Qz5LA5GoYrF2A2KRRUsbG0Uss2lh6xFkswBC9e0BzQAAAABJRU5ErkJggg==>><<boundary>> as api { rectangle "==Sign In Controller\n//<size:12>[React]</size>//\n\n Allows users to sign in to the Studio." <<component>> as sign rectangle "==Import tool\n//<size:12>[React]</size>//\n\n Plugin for importing external resources into the Studio." <<component>> as import_tool + rectangle "==Desk preview\n//<size:12>[React]</size>//\n\n Preview tab addition to desk forms." <<component>> as preview + rectangle "==resolveProductionUrl\n//<size:12>[React]</size>//\n\n Sends correct id to preview api along with secret." <<component>> as resolveProductionUrl import_tool - ->> sanity_db : **Uses** + preview - ->> resolveProductionUrl : **Uses** + sign - ->> auth : **Uses**\n//<size:12>[JSON/HTTPS]</size>// +} + +rectangle "==Next app\n<size:12>[Container]</size>" <<boundary>> as next [[img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC]] { + +rectangle "==Preview fetch\n<size:12>[Container]</size>" <<boundary>> as app { + rectangle "==/*\n//<size:12>[Route]</size>//\n\n Serves static page." <<component>> as overlay + } +rectangle "==Server side API\n<size:12>[Container]</size>" <<boundary>> as next_api { + rectangle "==/api/preview?token=[]&slug=[]\n//<size:12>[Route]</size>//\n\n Validates token and sets preview variable to true" <<component>> as api_preview + rectangle "==/api/exit-preview\n//<size:12>[Route]</size>//\n\n Sets preview variable to false" <<component>> as api_exit_preview + } + api_preview -RIGHT->> overlay : **Redirects**\n//<size:12>[JSON/HTTPS]</size>// + overlay -UP->> preview : **Streams changes**\n//<size:12>[JSON/HTTPS]</size>// } -import_tool -DOWN->> marcus : **Imports**\n//<size:12>[HTTPS]</size>// -import_tool -DOWN->> kulturnav : **Imports**\n//<size:12>[HTTPS]</size>// -import_tool -DOWN->> nb : **Imports**\n//<size:12>[HTTPS]</size>// -spa -LEFT->> sanity_db : **Uses**\n//<size:12>[JSON/HTTPS]</size>// -spa -DOWN->> api : **Uses**\n//<size:12>[JSON/HTTPS]</size>// -sign - ->> auth : **Uses**\n//<size:12>[JSON/HTTPS]</size>// +import_tool -UP->> marcus : **Imports**\n//<size:12>[HTTPS]</size>// +import_tool -UP->> kulturnav : **Imports**\n//<size:12>[HTTPS]</size>// +import_tool -UP->> nb : **Imports**\n//<size:12>[HTTPS]</size>// +spa -RIGHT->> sanity_db : **Uses**\n//<size:12>[JSON/HTTPS]</size>// +overlay -DOWN->> sanity_db : **Uses**\n//<size:12>[JSON/HTTPS]</size>// +resolveProductionUrl -RIGHT->> api_preview : **Uses**\n//<size:12>[JSON/HTTPS]</size>// +spa -UP->> api : **Uses**\n//<size:12>[JSON/HTTPS]</size>// @enduml diff --git a/docs/diagrams/component_web.svg b/docs/diagrams/component_web.svg index 6f4c8a6..77d4c84 100644 --- a/docs/diagrams/component_web.svg +++ b/docs/diagrams/component_web.svg @@ -1,24 +1,30 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1542px" preserveAspectRatio="none" style="width:849px;height:1542px;background:#FFFFFF;" version="1.1" viewBox="0 0 849 1542" width="849px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacing" textLength="337" x="249.5" y="17.4023">Component diagram for Next frontend</text><!--MD5=[3ee045e728939fe034a5f1f68a887008] -cluster next--><a href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" target="_top" title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:actuate="onRequest" xlink:href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:show="new" xlink:title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:type="simple"><rect fill="#FFFFFF" height="868" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="534" x="229" y="258.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="72" x="460" y="275.668">Next app</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="464.5" y="290.6445">[Container]</text></a><!--MD5=[d5ac3844f66b12d9e08170e47495e096] -cluster app--><rect fill="#FFFFFF" height="186" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="470" x="261" y="326.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="48" x="472" y="343.668">Pages</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="464.5" y="358.6445">[Container]</text><!--MD5=[7442f3b126ee602ae02566c1a49e158a] -cluster api--><rect fill="#FFFFFF" height="204" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="285" x="409" y="890.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="121" x="491" y="907.668">Server side API</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="520" y="922.6445">[Container]</text><!--MD5=[67a6735b2a5707e03290b64fb931c9ce] -cluster components--><rect fill="#FFFFFF" height="204" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="285" x="266" y="592.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="104" x="356.5" y="609.668">Components</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="377" y="624.6445">[Container]</text><!--MD5=[85f4d1a33338ddce045f9b827d37a273] -entity pages--><rect fill="#85BBF0" height="85.9531" style="stroke:#78A8D8;stroke-width:1.5;" width="150" x="557" y="394.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="54" x="605" y="419.668">/items</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="611.5" y="434.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="634" y="450.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="571" y="467.1992">Serves static page.</text><!--MD5=[5d258d01bf6889cf2f44a7b6e9a9e8ae] -entity id--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="217" x="304.75" y="386.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="37" x="394.75" y="411.668">/[id]</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="392.75" y="426.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="415.25" y="442.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="189" x="318.75" y="459.1992">Serves static page based on</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="375.75" y="475.6875">id variable.</text><!--MD5=[f5830ebc1bf7d5a9a4b07c85dbdf785d] -entity api_manifest--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="218" x="433" y="950.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="152" x="466" y="976.168">/api/manifest/[id]</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="521.5" y="991.1445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="544" y="1007.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="174" x="455" y="1023.6992">Fetch basic metadata and</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="198" x="443" y="1040.1875">connected images by id from</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="63" x="510.5" y="1056.6758">Sanity DB</text><!--MD5=[97d47de14f4cfe6ede125365af6aaf98] -entity mirador_viewer--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="218" x="309" y="652.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="129" x="353.5" y="678.168">/miradorViewer</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="398" y="693.1445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="420" y="709.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="174" x="331" y="725.6992">Fetch basic metadata and</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="198" x="319" y="742.1875">connected images by id from</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="63" x="386.5" y="758.6758">Sanity DB</text><!--MD5=[b1e3d2dcb3697de9e6328d1cb436cbc4] -entity frontend--><rect fill="#438DD5" height="152.4414" style="stroke:#3C7FC0;stroke-width:1.5;" width="206" x="517" y="28.1992"/><image height="50" width="50" x="595" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfUlEQVR4XtWOAY7DIAwE+/9P36mVEm0HQ7wcTriRRmo9hvB6recn4bbwoa6Pwses8jb44QrL4QerXQ4/cKfL4MVP+Sd42dNOwUt20YKHd9KCh3czBQ/t6hAu7+wQLu9uCJf+iw1cuEOFLesXjI4K25UKW9YvGB0VtisVNscTBkfCPlJhczxhcIzgTk+FzfEDh64R3OmpsDl+4NC1B/ciFTbXZuA6grtUYXNtBq5K9H+kwubaDFyV0SxSYXNtBq5KNHvDM9Eem2szcFUyc3cnazNwVZyW6Y7NwFUZtTejzubaDFwVtqs+aq7NwFVhy+z05o4nDI4KW7TzJuqcOZ4wOCps2b1o5njC4KiwUYVt1gYuZFXYIhW2GRu4kFVhi1TYZgzhUsYDzkcqbI5duFipwpZ1CJerVNgyXsIDlSpsI9PwYKUKW08LHq70gPPIKXhJlQpbb8+Gl1WpsLFPw0urPOjNl8DLqzzQ3yXww6u9HT5glY/Bh8y6FXzcyKX8AqAq6Wv25cYoAAAAAElFTkSuQmCC" y="38.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="113" x="563.5" y="103.668">Next frontend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="126" x="557" y="118.6445">[Javascript and React]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="622" y="134.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="531" y="151.1992">Provides all content to the</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="185" x="527.5" y="167.6875">user via their web browser.</text><!--MD5=[3d74be2a757051a7059b41e555fce061] -entity sanity_db--><path d="M441.75,1214.6992 C441.75,1204.6992 542.25,1204.6992 542.25,1204.6992 C542.25,1204.6992 642.75,1204.6992 642.75,1214.6992 L642.75,1339.6523 C642.75,1349.6523 542.25,1349.6523 542.25,1349.6523 C542.25,1349.6523 441.75,1349.6523 441.75,1339.6523 L441.75,1214.6992 " fill="#B3B3B3" style="stroke:#A6A6A6;stroke-width:1.5;"/><path d="M441.75,1214.6992 C441.75,1224.6992 542.25,1224.6992 542.25,1224.6992 C542.25,1224.6992 642.75,1224.6992 642.75,1214.6992 " fill="none" style="stroke:#A6A6A6;stroke-width:1.5;"/><image height="50" width="50" x="517.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABjklEQVR4Xu2YzU7CQBRGeSoTJa4NaHwNxY2LwsqXplI0rpBLwEzOtGXa3tuZxjnJ2c39+SgNtLNZJpPJdGVXvB5CrY6yPjpcsqvsNzpcaIj79SpOIC6iJeeYwuHacp4J5eLWG2wh56qzDQzCOqEqXrxzTbJWnWtBeL4O1jTJOjUkxMnHuTe0z2DWU55X4y9IzVXh2RC+N29eH8oaFdwgbphqwG8AF6c8rwKDbB9u7IZZ4gU5y3PJwwCuu+XddAJx+SZZlyRc+po/T/M0g3HRPsrfHPaNAhcb4mfMe0s+US6kIeeMglWYchHpCnERDaPeQ+Xxu86FhlguI4Zxka8Il+sqeyaBfMJcNET2SY7QK8a6pOHykw0iMMAkg+yL1em5hiFMgvDJjfJ8F9w+h+f7uEG+FB93owYRWRMCe5gHETiwTta0IVeR9Zce0YOEBKrON3ebZiEucKCV5kEEDrWQM02oNv5gTTnPHC6gIWeMxuHj3Vumj9U6YggXLhaqvMhmr6Rof9Pe/19AJpP55/wCwk7g9HfTvaAAAAAASUVORK5CYII=" y="1228.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="168" x="458.25" y="1294.168">Sanity Cloud Storage</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="499.75" y="1309.1445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="544.25" y="1325.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="177" x="455.75" y="1341.6992">Stores metadata and files.</text><!--MD5=[9a631f4ec9219869b7e8b94d6775f9b9] -entity marcusManifest--><rect fill="#438DD5" height="152.4414" style="stroke:#3C7FC0;stroke-width:1.5;" width="206" x="7" y="934.1992"/><image height="50" width="50" x="85" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfUlEQVR4XtWOAY7DIAwE+/9P36mVEm0HQ7wcTriRRmo9hvB6recn4bbwoa6Pwses8jb44QrL4QerXQ4/cKfL4MVP+Sd42dNOwUt20YKHd9KCh3czBQ/t6hAu7+wQLu9uCJf+iw1cuEOFLesXjI4K25UKW9YvGB0VtisVNscTBkfCPlJhczxhcIzgTk+FzfEDh64R3OmpsDl+4NC1B/ciFTbXZuA6grtUYXNtBq5K9H+kwubaDFyV0SxSYXNtBq5KNHvDM9Eem2szcFUyc3cnazNwVZyW6Y7NwFUZtTejzubaDFwVtqs+aq7NwFVhy+z05o4nDI4KW7TzJuqcOZ4wOCps2b1o5njC4KiwUYVt1gYuZFXYIhW2GRu4kFVhi1TYZgzhUsYDzkcqbI5duFipwpZ1CJerVNgyXsIDlSpsI9PwYKUKW08LHq70gPPIKXhJlQpbb8+Gl1WpsLFPw0urPOjNl8DLqzzQ3yXww6u9HT5glY/Bh8y6FXzcyKX8AqAq6Wv25cYoAAAAAElFTkSuQmCC" y="944.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="137" x="41.5" y="1009.668">Marcus manifest</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="35" x="92.5" y="1024.6445">[Next]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="112" y="1040.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="21" y="1057.1992">Temporary API for Marcus</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="63" y="1073.6875">IIIF manifests.</text><!--MD5=[de93d881034ae2b005eca73b65398148] -entity sparql--><path d="M9,1239.6992 C9,1229.6992 110,1229.6992 110,1229.6992 C110,1229.6992 211,1229.6992 211,1239.6992 L211,1314.6523 C211,1324.6523 110,1324.6523 110,1324.6523 C110,1324.6523 9,1324.6523 9,1314.6523 L9,1239.6992 " fill="#438DD5" style="stroke:#3C7FC0;stroke-width:1.5;"/><path d="M9,1239.6992 C9,1249.6992 110,1249.6992 110,1249.6992 C110,1249.6992 211,1249.6992 211,1239.6992 " fill="none" style="stroke:#3C7FC0;stroke-width:1.5;"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="143" x="38.5" y="1269.168">SPARQL endpoint</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="44" x="88" y="1284.1445">[Fuseki]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="112" y="1300.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="23" y="1316.6992">Data endpoint for Marcus.</text><!--MD5=[8ebd58f6b3375343ecaa75fe0bd18033] -link app to components--><path d="M270.3568,512.2871 C270.3654,512.7599 270.3741,513.2339 270.3828,513.7091 C270.4524,517.5111 270.5235,521.3925 270.5958,525.3375 C270.8848,541.1176 271.1924,557.9148 271.5,574.7117 C271.5769,578.911 271.6538,583.1102 271.7304,587.2935 C271.7496,588.3393 271.7687,589.3841 271.7878,590.4277 C271.7974,590.9495 271.8069,591.471 271.8165,591.9921 " fill="none" id="app-to-components" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="271.8165,591.9921,274.6695,583.9386,268.6705,584.0484,271.8165,591.9921" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="298" y="549.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="273" y="563.4336">[JSON/HTTPS]</text><!--MD5=[34cfbe26f1ff072a7179695b0f111cf6] -link id to mirador_viewer--><path d="M413.917,488.2712 C414.719,532.0712 415.891,596.0392 416.773,644.2312 " fill="none" id="id-to-mirador_viewer" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="416.924,652.4292,419.7763,644.3754,413.7774,644.4858,416.924,652.4292" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="442" y="549.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="417" y="563.4336">[JSON/HTTPS]</text><!--MD5=[009f1bdadfdb747559dc589c849ab181] -link mirador_viewer to api_manifest--><path d="M442.647,772.0332 C463.313,821.3672 492.808,891.7742 514.291,943.0542 " fill="none" id="mirador_viewer-to-api_manifest" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="517.4,950.4762,517.0755,941.9384,511.5416,944.2569,517.4,950.4762" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="506" y="840.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="481" y="854.4336">[JSON/HTTPS]</text><!--MD5=[c00afe3db0c8ea2b21346873462b2a20] -link frontend to api--><path d="M686.6,180.5292 C701.481,201.6692 715.164,225.6392 723,250.1992 C773.923,409.8207 765.2148,597.8645 743.508,746.846 C732.6546,821.3367 718.5516,886.0619 707.0281,932.586 C704.1472,944.217 701.4275,954.7104 698.9602,963.9345 C697.7265,968.5465 696.5559,972.8412 695.4597,976.8021 C695.1857,977.7923 694.9163,978.7617 694.6518,979.7099 C694.5195,980.184 694.3884,980.6529 694.2586,981.1164 " fill="none" id="frontend-to-api" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="694.2586,981.1164,699.3052,974.2221,693.5276,972.6037,694.2586,981.1164" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="786" y="549.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="761" y="563.4336">[JSON/HTTPS]</text><!--MD5=[df12e74ca71a6ef000ee08cd9197b84e] -link frontend to app--><path d="M516.803,121.8792 C440.788,139.9192 341.667,176.6592 288,250.1992 C263.891,283.2392 258.9115,328.8137 260.0713,366.5802 C260.2162,371.301 260.4571,375.8998 260.7686,380.3369 C260.8075,380.8916 260.8475,381.4437 260.8886,381.9932 C260.9092,382.2679 260.93,382.542 260.951,382.8155 " fill="none" id="frontend-to-app" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="260.951,382.8155,263.3277,374.6087,257.3455,375.0695,260.951,382.8155" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="347" y="223.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="322" y="237.4336">[JSON/HTTPS]</text><!--MD5=[ba084830ed4dce89920c704d0e19a212] -link mirador_viewer to marcusManifest--><path d="M356.781,772.0332 C310.158,816.8392 245.447,879.0292 193.987,928.4842 " fill="none" id="mirador_viewer-to-marcusManifest" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="188.098,934.1442,195.9447,930.7636,191.7871,926.4377,188.098,934.1442" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="95" x="302" y="833.3008">Fetches Marcus</text><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="62" x="320.5" y="847.4336">manifests</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="311.5" y="861.5664">[JSON/HTTPS]</text><!--MD5=[b6a0ac1322f03a45938afc16e0063b61] -link marcusManifest to sparql--><path d="M110,1086.4292 C110,1129.4292 110,1182.3932 110,1221.4312 " fill="none" id="marcusManifest-to-sparql" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="110,1229.5422,113,1221.5422,107,1221.5422,110,1229.5422" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="78" x="112" y="1155.3008">Fetches data</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="111" y="1169.4336">[JSON/HTTPS]</text><!--MD5=[7ea119c7c8011febc771f182c10b6cc3] -link api_manifest to sanity_db--><path d="M542,1070.0112 C542,1107.1792 542,1155.6892 542,1196.3182 " fill="none" id="api_manifest-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="542,1204.3332,545,1196.3332,539,1196.3332,542,1204.3332" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="568" y="1155.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="543" y="1169.4336">[JSON/HTTPS]</text><rect fill="#FFFFFF" height="162.3945" rx="5" ry="5" style="stroke:#FFFFFF;stroke-width:1.0;" width="159" x="668" y="1363.6523"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="51" x="674" y="1384.1875">Legend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="729" y="1384.1875"/><rect fill="#08427B" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1387.1406"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="678" y="1400.6758">person</text><rect fill="#1168BD" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1403.6289"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="47" x="678" y="1417.1641">system</text><rect fill="#438DD5" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1420.1172"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="678" y="1433.6523">container</text><rect fill="#85BBF0" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1436.6055"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="78" x="678" y="1450.1406">component</text><rect fill="#686868" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1453.0938"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="678" y="1466.6289">external person</text><rect fill="#999999" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1469.582"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="678" y="1483.1172">external system</text><rect fill="#B3B3B3" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1486.0703"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="678" y="1499.6055">external container</text><rect fill="#CCCCCC" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="674" y="1502.5586"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="678" y="1516.0938">external component</text><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1370.6523" y2="1370.6523"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1387.1406" y2="1387.1406"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1403.6289" y2="1403.6289"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1420.1172" y2="1420.1172"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1436.6055" y2="1436.6055"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1453.0938" y2="1453.0938"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1469.582" y2="1469.582"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1486.0703" y2="1486.0703"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1502.5586" y2="1502.5586"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="821" y1="1519.0469" y2="1519.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="674" x2="674" y1="1370.6523" y2="1519.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="821" x2="821" y1="1370.6523" y2="1519.0469"/><!--MD5=[66eebc1c5bd76ed29c40389db595807a] +<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1543px" preserveAspectRatio="none" style="width:1487px;height:1543px;background:#FFFFFF;" version="1.1" viewBox="0 0 1487 1543" width="1487px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacing" textLength="337" x="568.5" y="17.4023">Component diagram for Next frontend</text><!--MD5=[3ee045e728939fe034a5f1f68a887008] +cluster next--><a href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" target="_top" title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:actuate="onRequest" xlink:href="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:show="new" xlink:title="img:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABm0lEQVRoQ92Z25LDMAhDt///0dtJpu4kDhgBimPaZ0x0LPCtrz/+7x9I+QJiXCGshIj4kbC0jkyCrHgNLKQpMugugCOYW5d3wAyIEBAKMhvADYOAPAkBA1kgq0A0IFXvCGQ1iCGMBrIqxAYjaq4IIsJIICu7oTZ/D1IF4uJKZZATzBGkkhuXEnsahPH9PUdLlHEjIyYz9rSv/ALIbggbZEvqcZfhyG0gHhgqiGcGpVtdZlNdHgR1hQWyr1p3ONKcs3IvC7IJ94jzxA6fh9iONAdQgWic+cY1A2TUL8uD9KdTrVdKgCAwJUGkEisDYrlSCgSFsfac4SM4+9CINLVWYiVAEFfKgFgw5qanBJxuiOghzzr9IrNKa/CPmN8FiboSWTBYrnzz9JcipDSitdyPY8CoIFFXInBZkJMJmWtqRDzLlYtuCWSmK9ElGQZ5CgbpUXHyNUfQOzejvDyuqHotkJnOWM0/1IqAPAHTl5ip0ww41A5Sv4xSO26wsD44cCJQRJP8Dyk4rXc5NB2EvbKFAJqI1GDBOY9L1G+/AToZcCqjfA/hAAAAAElFTkSuQmCC" xlink:type="simple"><rect fill="#FFFFFF" height="869" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="1173" x="229" y="258.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="72" x="779.5" y="275.668">Next app</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="784" y="290.6445">[Container]</text></a><!--MD5=[d5ac3844f66b12d9e08170e47495e096] +cluster app--><rect fill="#FFFFFF" height="186" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="470" x="900" y="327.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="48" x="1111" y="344.668">Pages</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1103.5" y="359.6445">[Container]</text><!--MD5=[7442f3b126ee602ae02566c1a49e158a] +cluster api--><rect fill="#FFFFFF" height="204" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="285" x="1043" y="891.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="121" x="1125" y="908.668">Server side API</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1154" y="923.6445">[Container]</text><!--MD5=[67a6735b2a5707e03290b64fb931c9ce] +cluster components--><rect fill="#FFFFFF" height="204" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="285" x="900" y="593.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="104" x="990.5" y="610.668">Components</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="1011" y="625.6445">[Container]</text><!--MD5=[9a53b195b9e6dcc8c7a5cc20ca36bc92] +cluster functions--><rect fill="#FFFFFF" height="462" style="stroke:#444444;stroke-width:1.0;stroke-dasharray:7.0,7.0;" width="490" x="253" y="318.1992"/><text fill="#444444" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="81" x="457.5" y="335.668">Functions</text><text fill="#444444" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="63" x="466.5" y="350.6445">[Container]</text><!--MD5=[85f4d1a33338ddce045f9b827d37a273] +entity pages--><rect fill="#85BBF0" height="85.9531" style="stroke:#78A8D8;stroke-width:1.5;" width="150" x="1196" y="395.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="54" x="1244" y="420.668">/items</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1250.5" y="435.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1273" y="451.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="1210" y="468.1992">Serves static page.</text><!--MD5=[5d258d01bf6889cf2f44a7b6e9a9e8ae] +entity id--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="217" x="943.75" y="387.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="37" x="1033.75" y="412.668">/[id]</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1031.75" y="427.6445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1054.25" y="443.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="189" x="957.75" y="460.1992">Serves static page based on</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="1014.75" y="476.6875">id variable.</text><!--MD5=[f5830ebc1bf7d5a9a4b07c85dbdf785d] +entity api_manifest--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="218" x="1067" y="951.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="152" x="1100" y="977.168">/api/manifest/[id]</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="41" x="1155.5" y="992.1445">[Route]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1178" y="1008.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="174" x="1089" y="1024.6992">Fetch basic metadata and</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="198" x="1077" y="1041.1875">connected images by id from</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="63" x="1144.5" y="1057.6758">Sanity DB</text><!--MD5=[97d47de14f4cfe6ede125365af6aaf98] +entity mirador_viewer--><rect fill="#85BBF0" height="118.9297" style="stroke:#78A8D8;stroke-width:1.5;" width="218" x="943" y="653.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="129" x="987.5" y="679.168">/miradorViewer</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="40" x="1032" y="694.1445">[React]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1054" y="710.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="174" x="965" y="726.6992">Fetch basic metadata and</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="198" x="953" y="743.1875">connected images by id from</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="63" x="1020.5" y="759.6758">Sanity DB</text><!--MD5=[5d835dae90d3665c59e762cd4fc1e624] +entity getStaticProps--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="220" x="503" y="662.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="117" x="554.5" y="687.668">getStaticProps</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="53" x="586.5" y="702.6445">[function]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="615" y="718.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="196" x="517" y="735.1992">Static Generation: Fetch data</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="90" x="568" y="751.6875">at build time.</text><!--MD5=[9ccdca984d9af2d1e9f265f00f81bcd4] +entity getStaticPaths--><rect fill="#85BBF0" height="135.418" style="stroke:#78A8D8;stroke-width:1.5;" width="213" x="513.75" y="370.6992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="115" x="562.75" y="396.168">getStaticPaths</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="53" x="593.75" y="411.1445">[function]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="622.25" y="427.2109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="173" x="533.75" y="443.6992">Static Generation: Specify</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="123" x="556.75" y="460.1875">dynamic routes to</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="189" x="523.75" y="476.6758">pre-render pages based on</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="34" x="603.25" y="493.1641">data.</text><!--MD5=[44553005586debe443b4a4f7b85413f0] +entity getServerSideProps--><rect fill="#85BBF0" height="102.4414" style="stroke:#78A8D8;stroke-width:1.5;" width="209" x="269.75" y="387.1992"/><text fill="#000000" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="157" x="295.75" y="412.668">getServerSideProps</text><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="53" x="347.75" y="427.6445">[function]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="376.25" y="443.7109"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="158" x="295.25" y="460.1992">Server-side Rendering:</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="189" x="279.75" y="476.6875">Fetch data on each request.</text><!--MD5=[b1e3d2dcb3697de9e6328d1cb436cbc4] +entity frontend--><rect fill="#438DD5" height="152.4414" style="stroke:#3C7FC0;stroke-width:1.5;" width="206" x="1156" y="28.1992"/><image height="50" width="50" x="1234" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfUlEQVR4XtWOAY7DIAwE+/9P36mVEm0HQ7wcTriRRmo9hvB6recn4bbwoa6Pwses8jb44QrL4QerXQ4/cKfL4MVP+Sd42dNOwUt20YKHd9KCh3czBQ/t6hAu7+wQLu9uCJf+iw1cuEOFLesXjI4K25UKW9YvGB0VtisVNscTBkfCPlJhczxhcIzgTk+FzfEDh64R3OmpsDl+4NC1B/ciFTbXZuA6grtUYXNtBq5K9H+kwubaDFyV0SxSYXNtBq5KNHvDM9Eem2szcFUyc3cnazNwVZyW6Y7NwFUZtTejzubaDFwVtqs+aq7NwFVhy+z05o4nDI4KW7TzJuqcOZ4wOCps2b1o5njC4KiwUYVt1gYuZFXYIhW2GRu4kFVhi1TYZgzhUsYDzkcqbI5duFipwpZ1CJerVNgyXsIDlSpsI9PwYKUKW08LHq70gPPIKXhJlQpbb8+Gl1WpsLFPw0urPOjNl8DLqzzQ3yXww6u9HT5glY/Bh8y6FXzcyKX8AqAq6Wv25cYoAAAAAElFTkSuQmCC" y="38.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="113" x="1202.5" y="103.668">Next frontend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="126" x="1196" y="118.6445">[Javascript and React]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1261" y="134.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="1170" y="151.1992">Provides all content to the</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="185" x="1166.5" y="167.6875">user via their web browser.</text><!--MD5=[3d74be2a757051a7059b41e555fce061] +entity sanity_db--><path d="M1075.75,1215.6992 C1075.75,1205.6992 1176.25,1205.6992 1176.25,1205.6992 C1176.25,1205.6992 1276.75,1205.6992 1276.75,1215.6992 L1276.75,1340.6523 C1276.75,1350.6523 1176.25,1350.6523 1176.25,1350.6523 C1176.25,1350.6523 1075.75,1350.6523 1075.75,1340.6523 L1075.75,1215.6992 " fill="#B3B3B3" style="stroke:#A6A6A6;stroke-width:1.5;"/><path d="M1075.75,1215.6992 C1075.75,1225.6992 1176.25,1225.6992 1176.25,1225.6992 C1176.25,1225.6992 1276.75,1225.6992 1276.75,1215.6992 " fill="none" style="stroke:#A6A6A6;stroke-width:1.5;"/><image height="50" width="50" x="1151.25" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABjklEQVR4Xu2YzU7CQBRGeSoTJa4NaHwNxY2LwsqXplI0rpBLwEzOtGXa3tuZxjnJ2c39+SgNtLNZJpPJdGVXvB5CrY6yPjpcsqvsNzpcaIj79SpOIC6iJeeYwuHacp4J5eLWG2wh56qzDQzCOqEqXrxzTbJWnWtBeL4O1jTJOjUkxMnHuTe0z2DWU55X4y9IzVXh2RC+N29eH8oaFdwgbphqwG8AF6c8rwKDbB9u7IZZ4gU5y3PJwwCuu+XddAJx+SZZlyRc+po/T/M0g3HRPsrfHPaNAhcb4mfMe0s+US6kIeeMglWYchHpCnERDaPeQ+Xxu86FhlguI4Zxka8Il+sqeyaBfMJcNET2SY7QK8a6pOHykw0iMMAkg+yL1em5hiFMgvDJjfJ8F9w+h+f7uEG+FB93owYRWRMCe5gHETiwTta0IVeR9Zce0YOEBKrON3ebZiEucKCV5kEEDrWQM02oNv5gTTnPHC6gIWeMxuHj3Vumj9U6YggXLhaqvMhmr6Rof9Pe/19AJpP55/wCwk7g9HfTvaAAAAAASUVORK5CYII=" y="1229.6992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="168" x="1092.25" y="1295.168">Sanity Cloud Storage</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="85" x="1133.75" y="1310.1445">[Google Cloud]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1178.25" y="1326.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="177" x="1089.75" y="1342.6992">Stores metadata and files.</text><!--MD5=[9a631f4ec9219869b7e8b94d6775f9b9] +entity marcusManifest--><rect fill="#438DD5" height="152.4414" style="stroke:#3C7FC0;stroke-width:1.5;" width="206" x="7" y="935.1992"/><image height="50" width="50" x="85" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfUlEQVR4XtWOAY7DIAwE+/9P36mVEm0HQ7wcTriRRmo9hvB6recn4bbwoa6Pwses8jb44QrL4QerXQ4/cKfL4MVP+Sd42dNOwUt20YKHd9KCh3czBQ/t6hAu7+wQLu9uCJf+iw1cuEOFLesXjI4K25UKW9YvGB0VtisVNscTBkfCPlJhczxhcIzgTk+FzfEDh64R3OmpsDl+4NC1B/ciFTbXZuA6grtUYXNtBq5K9H+kwubaDFyV0SxSYXNtBq5KNHvDM9Eem2szcFUyc3cnazNwVZyW6Y7NwFUZtTejzubaDFwVtqs+aq7NwFVhy+z05o4nDI4KW7TzJuqcOZ4wOCps2b1o5njC4KiwUYVt1gYuZFXYIhW2GRu4kFVhi1TYZgzhUsYDzkcqbI5duFipwpZ1CJerVNgyXsIDlSpsI9PwYKUKW08LHq70gPPIKXhJlQpbb8+Gl1WpsLFPw0urPOjNl8DLqzzQ3yXww6u9HT5glY/Bh8y6FXzcyKX8AqAq6Wv25cYoAAAAAElFTkSuQmCC" y="945.1992"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="137" x="41.5" y="1010.668">Marcus manifest</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="35" x="92.5" y="1025.6445">[Next]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="112" y="1041.7109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="21" y="1058.1992">Temporary API for Marcus</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="94" x="63" y="1074.6875">IIIF manifests.</text><!--MD5=[de93d881034ae2b005eca73b65398148] +entity sparql--><path d="M9,1240.6992 C9,1230.6992 110,1230.6992 110,1230.6992 C110,1230.6992 211,1230.6992 211,1240.6992 L211,1315.6523 C211,1325.6523 110,1325.6523 110,1325.6523 C110,1325.6523 9,1325.6523 9,1315.6523 L9,1240.6992 " fill="#438DD5" style="stroke:#3C7FC0;stroke-width:1.5;"/><path d="M9,1240.6992 C9,1250.6992 110,1250.6992 110,1250.6992 C110,1250.6992 211,1250.6992 211,1240.6992 " fill="none" style="stroke:#3C7FC0;stroke-width:1.5;"/><text fill="#FFFFFF" font-family="sans-serif" font-size="16" font-weight="bold" lengthAdjust="spacing" textLength="143" x="38.5" y="1270.168">SPARQL endpoint</text><text fill="#FFFFFF" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="44" x="88" y="1285.1445">[Fuseki]</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="112" y="1301.2109"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="178" x="23" y="1317.6992">Data endpoint for Marcus.</text><!--MD5=[8ebd58f6b3375343ecaa75fe0bd18033] +link app to components--><path d="M908,513.2871 C908,513.7599 908,514.2339 908,514.7091 C908,518.5111 908,522.3925 908,526.3375 C908,542.1176 908,558.9148 908,575.7117 C908,579.911 908,584.1102 908,588.2935 C908,589.3393 908,590.3841 908,591.4277 C908,591.9495 908,592.471 908,592.9921 " fill="none" id="app-to-components" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="908,592.9921,911,584.9921,905,584.9921,908,592.9921" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="934" y="550.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="909" y="564.4336">[JSON/HTTPS]</text><!--MD5=[10607478be0e16403529e53e330d8761] +link app to getStaticPaths--><path d="M899.7056,438.1992 C899.5947,438.1992 899.4828,438.1992 899.3698,438.1992 C898.918,438.1992 898.4499,438.1992 897.9659,438.1992 C896.9978,438.1992 895.9659,438.1992 894.873,438.1992 C892.6873,438.1992 890.2575,438.1992 887.6059,438.1992 C876.9994,438.1992 862.844,438.1992 846.5618,438.1992 C813.9973,438.1992 772.9255,438.1992 734.724,438.1992 " fill="none" id="app-to-getStaticPaths" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="726.422,438.1992,734.422,441.1992,734.422,435.1992,726.422,438.1992" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="144" x="744.32" y="416.8008">Lists paths to generate</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="776.32" y="430.9336">[JSON/HTTPS]</text><!--MD5=[c1b668678ef05cefa81afb033df7a4bf] +link getStaticPaths to getStaticProps--><path d="M618.288,505.9822 C617.128,551.2132 615.61,610.4032 614.498,653.7632 " fill="none" id="getStaticPaths-to-getStaticProps" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="614.289,661.9422,617.4937,654.022,611.4957,653.8677,614.289,661.9422" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="111" x="619" y="550.3008">Builds static page</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="634.5" y="564.4336">[JSON/HTTPS]</text><!--MD5=[34cfbe26f1ff072a7179695b0f111cf6] +link id to mirador_viewer--><path d="M1052,489.2712 C1052,533.0712 1052,597.0392 1052,645.2312 " fill="none" id="id-to-mirador_viewer" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1052,653.4292,1055,645.4292,1049,645.4292,1052,653.4292" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1078" y="550.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1053" y="564.4336">[JSON/HTTPS]</text><!--MD5=[009f1bdadfdb747559dc589c849ab181] +link mirador_viewer to api_manifest--><path d="M1076.65,773.0332 C1097.31,822.3672 1126.81,892.7742 1148.29,944.0542 " fill="none" id="mirador_viewer-to-api_manifest" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1151.4,951.4762,1151.0726,942.9385,1145.5395,945.259,1151.4,951.4762" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1140" y="841.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1115" y="855.4336">[JSON/HTTPS]</text><!--MD5=[c00afe3db0c8ea2b21346873462b2a20] +link frontend to api--><path d="M1325.6,180.5292 C1340.48,201.6692 1354.16,225.6392 1362,250.1992 C1413.005,410.0852 1403.0675,598.3772 1380.1013,747.5417 C1368.6181,822.124 1353.8778,886.9243 1341.8695,933.5012 C1338.8675,945.1454 1336.0361,955.6506 1333.4692,964.8849 C1332.1857,969.5021 1330.9683,973.8016 1329.8286,977.7668 C1329.2588,979.7495 1328.7084,981.6485 1328.179,983.462 " fill="none" id="frontend-to-api" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1328.179,983.462,1333.3008,976.6234,1327.5413,974.9418,1328.179,983.462" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1424" y="550.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1399" y="564.4336">[JSON/HTTPS]</text><!--MD5=[df12e74ca71a6ef000ee08cd9197b84e] +link frontend to app--><path d="M1155.79,121.8792 C1079.77,139.9092 980.647,176.6392 927,250.1992 C902.7715,283.4192 897.7903,329.2387 898.979,367.2076 C899.1276,371.9537 899.3726,376.5771 899.6885,381.038 C899.7674,382.1532 899.8508,383.2582 899.9382,384.3525 " fill="none" id="frontend-to-app" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="899.9382,384.3525,902.2916,376.139,896.3106,376.6168,899.9382,384.3525" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="986" y="223.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="961" y="237.4336">[JSON/HTTPS]</text><!--MD5=[ba084830ed4dce89920c704d0e19a212] +link mirador_viewer to marcusManifest--><path d="M995.938,772.8062 C978.899,787.8572 959.281,802.7342 939,813.1992 C701.451,935.7792 386.217,983.4632 221.322,1000.9102 " fill="none" id="mirador_viewer-to-marcusManifest" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="213.101,1001.7682,221.3691,1003.9221,220.7466,997.9544,213.101,1001.7682" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="95" x="920" y="834.3008">Fetches Marcus</text><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="62" x="938.5" y="848.4336">manifests</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="929.5" y="862.5664">[JSON/HTTPS]</text><!--MD5=[b6a0ac1322f03a45938afc16e0063b61] +link marcusManifest to sparql--><path d="M110,1087.4292 C110,1130.4292 110,1183.3932 110,1222.4312 " fill="none" id="marcusManifest-to-sparql" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="110,1230.5422,113,1222.5422,107,1222.5422,110,1230.5422" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="78" x="112" y="1156.3008">Fetches data</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="111" y="1170.4336">[JSON/HTTPS]</text><!--MD5=[7ea119c7c8011febc771f182c10b6cc3] +link api_manifest to sanity_db--><path d="M1176,1071.0112 C1176,1108.1792 1176,1156.6892 1176,1197.3182 " fill="none" id="api_manifest-to-sanity_db" style="stroke:#666666;stroke-width:1.0;"/><polygon fill="#666666" points="1176,1205.3332,1179,1197.3332,1173,1197.3332,1176,1205.3332" style="stroke:#666666;stroke-width:1.0;"/><text fill="#666666" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacing" textLength="30" x="1202" y="1156.3008">Uses</text><text fill="#666666" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="80" x="1177" y="1170.4336">[JSON/HTTPS]</text><rect fill="#FFFFFF" height="162.3945" rx="5" ry="5" style="stroke:#FFFFFF;stroke-width:1.0;" width="159" x="1306" y="1364.6523"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="51" x="1312" y="1385.1875">Legend</text><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="0" x="1367" y="1385.1875"/><rect fill="#08427B" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1388.1406"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="48" x="1316" y="1401.6758">person</text><rect fill="#1168BD" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1404.6289"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="47" x="1316" y="1418.1641">system</text><rect fill="#438DD5" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1421.1172"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="1316" y="1434.6523">container</text><rect fill="#85BBF0" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1437.6055"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="78" x="1316" y="1451.1406">component</text><rect fill="#686868" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1454.0938"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="109" x="1316" y="1467.6289">external person</text><rect fill="#999999" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1470.582"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="1316" y="1484.1172">external system</text><rect fill="#B3B3B3" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1487.0703"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="126" x="1316" y="1500.6055">external container</text><rect fill="#CCCCCC" height="16.4883" style="stroke:none;stroke-width:1.0;" width="147" x="1312" y="1503.5586"/><text fill="#FFFFFF" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="139" x="1316" y="1517.0938">external component</text><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1371.6523" y2="1371.6523"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1388.1406" y2="1388.1406"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1404.6289" y2="1404.6289"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1421.1172" y2="1421.1172"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1437.6055" y2="1437.6055"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1454.0938" y2="1454.0938"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1470.582" y2="1470.582"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1487.0703" y2="1487.0703"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1503.5586" y2="1503.5586"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1459" y1="1520.0469" y2="1520.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1312" x2="1312" y1="1371.6523" y2="1520.0469"/><line style="stroke:#FFFFFF;stroke-width:1.0;" x1="1459" x2="1459" y1="1371.6523" y2="1520.0469"/><!--MD5=[433e43aa513aa7a333470fcf15d4516e] @startuml "component_web" !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml ' uncomment the following line and comment the first to use locally @@ -54,11 +60,20 @@ Container_Boundary(next, "Next app", "", NEXT) { Container_Boundary(api, "Server side API") { Component(api_manifest, "/api/manifest/[id]", "Route", "Fetch basic metadata and connected images by id from Sanity DB") } + Container_Boundary(components, "Components") { Component(mirador_viewer, "/miradorViewer", "React", "Fetch basic metadata and connected images by id from Sanity DB") } + + Container_Boundary(functions, "Functions") { + Component(getStaticProps, "getStaticProps", "function", "Static Generation: Fetch data at build time.") + Component(getStaticPaths, "getStaticPaths", "function", "Static Generation: Specify dynamic routes to pre-render pages based on data.") + Component(getServerSideProps, "getServerSideProps", "function", "Server-side Rendering: Fetch data on each request.") + } Rel_D(app, components, "Uses", "JSON/HTTPS") + Rel_R(app, getStaticPaths, "Lists paths to generate", "JSON/HTTPS") + Rel_D(getStaticPaths, getStaticProps, "Builds static page", "JSON/HTTPS") Rel_D(id, mirador_viewer, "Uses", "JSON/HTTPS") Rel_D(mirador_viewer, api_manifest, "Uses", "JSON/HTTPS") @@ -758,11 +773,20 @@ rectangle "==Pages\n<size:12>[Container]</size>" <<boundary>> as app { rectangle "==Server side API\n<size:12>[Container]</size>" <<boundary>> as api { rectangle "==/api/manifest/[id]\n//<size:12>[Route]</size>//\n\n Fetch basic metadata and connected images by id from Sanity DB" <<component>> as api_manifest } + rectangle "==Components\n<size:12>[Container]</size>" <<boundary>> as components { rectangle "==/miradorViewer\n//<size:12>[React]</size>//\n\n Fetch basic metadata and connected images by id from Sanity DB" <<component>> as mirador_viewer } + +rectangle "==Functions\n<size:12>[Container]</size>" <<boundary>> as functions { + rectangle "==getStaticProps\n//<size:12>[function]</size>//\n\n Static Generation: Fetch data at build time." <<component>> as getStaticProps + rectangle "==getStaticPaths\n//<size:12>[function]</size>//\n\n Static Generation: Specify dynamic routes to pre-render pages based on data." <<component>> as getStaticPaths + rectangle "==getServerSideProps\n//<size:12>[function]</size>//\n\n Server-side Rendering: Fetch data on each request." <<component>> as getServerSideProps + } app -DOWN->> components : **Uses**\n//<size:12>[JSON/HTTPS]</size>// + app -RIGHT->> getStaticPaths : **Lists paths to generate**\n//<size:12>[JSON/HTTPS]</size>// + getStaticPaths -DOWN->> getStaticProps : **Builds static page**\n//<size:12>[JSON/HTTPS]</size>// id -DOWN->> mirador_viewer : **Uses**\n//<size:12>[JSON/HTTPS]</size>// mirador_viewer -DOWN->> api_manifest : **Uses**\n//<size:12>[JSON/HTTPS]</size>// diff --git a/docs/diagrams/src/component_studio.puml b/docs/diagrams/src/component_studio.puml index 154104f..8fe5561 100644 --- a/docs/diagrams/src/component_studio.puml +++ b/docs/diagrams/src/component_studio.puml @@ -17,7 +17,7 @@ LAYOUT_WITH_LEGEND() title Component diagram for Sanity Studio -Container(spa, "Sanity Studio SPA", "Javascript and React", "Provides all editing functionality to editors via their web browser.") +Container(spa, "Sanity Studio SPA", "Javascript and React", "Provides all editing functionality to editors via their web browser.", SANITY) ContainerDb_Ext(sanity_db, "Sanity Cloud Storage", "Google Cloud", "Stores metadata and files.", "SANITY") Container_Ext(auth, "Google Authentication", "Google Cloud", "Authenticates editors.", "google_cloud_platform") @@ -28,16 +28,34 @@ System_Ext(nb, "NB.no", "Content provider") Container_Boundary(api, "SPA Application", "SANITY") { Component(sign, "Sign In Controller", "React", "Allows users to sign in to the Studio.") Component(import_tool, "Import tool", "React", "Plugin for importing external resources into the Studio.") + Component(preview, "Desk preview", "React", "Preview tab addition to desk forms.") + Component(resolveProductionUrl, "resolveProductionUrl", "React", "Sends correct id to preview api along with secret.") Rel(import_tool, sanity_db, "Uses") + Rel(preview, resolveProductionUrl, "Uses") + Rel(sign, auth, "Uses", "JSON/HTTPS") +} + +Container_Boundary(next, "Next app", "", NEXT) { + + Container_Boundary(app, "Preview fetch") { + Component(overlay, "/*", "Route", "Serves static page.") + } + Container_Boundary(next_api, "Server side API") { + Component(api_preview, "/api/preview?token=[]&slug=[]", "Route", "Validates token and sets preview variable to true") + Component(api_exit_preview, "/api/exit-preview", "Route", "Sets preview variable to false") + } + Rel_R(api_preview, overlay, "Redirects", "JSON/HTTPS") + Rel_U(overlay, preview, "Streams changes", "JSON/HTTPS") } -Rel_D(import_tool, marcus, "Imports", "HTTPS") -Rel_D(import_tool, kulturnav, "Imports", "HTTPS") -Rel_D(import_tool, nb, "Imports", "HTTPS") -Rel_L(spa, sanity_db, "Uses", "JSON/HTTPS") -Rel_D(spa, api, "Uses", "JSON/HTTPS") -Rel(sign, auth, "Uses", "JSON/HTTPS") +Rel_U(import_tool, marcus, "Imports", "HTTPS") +Rel_U(import_tool, kulturnav, "Imports", "HTTPS") +Rel_U(import_tool, nb, "Imports", "HTTPS") +Rel_R(spa, sanity_db, "Uses", "JSON/HTTPS") +Rel_D(overlay, sanity_db, "Uses", "JSON/HTTPS") +Rel_R(resolveProductionUrl, api_preview, "Uses", "JSON/HTTPS") +Rel_U(spa, api, "Uses", "JSON/HTTPS") @enduml \ No newline at end of file diff --git a/docs/diagrams/src/component_web.puml b/docs/diagrams/src/component_web.puml index 0fbe7cc..e01a865 100644 --- a/docs/diagrams/src/component_web.puml +++ b/docs/diagrams/src/component_web.puml @@ -33,11 +33,20 @@ Container_Boundary(next, "Next app", "", NEXT) { Container_Boundary(api, "Server side API") { Component(api_manifest, "/api/manifest/[id]", "Route", "Fetch basic metadata and connected images by id from Sanity DB") } + Container_Boundary(components, "Components") { Component(mirador_viewer, "/miradorViewer", "React", "Fetch basic metadata and connected images by id from Sanity DB") } + + Container_Boundary(functions, "Functions") { + Component(getStaticProps, "getStaticProps", "function", "Static Generation: Fetch data at build time.") + Component(getStaticPaths, "getStaticPaths", "function", "Static Generation: Specify dynamic routes to pre-render pages based on data.") + Component(getServerSideProps, "getServerSideProps", "function", "Server-side Rendering: Fetch data on each request.") + } Rel_D(app, components, "Uses", "JSON/HTTPS") + Rel_R(app, getStaticPaths, "Lists paths to generate", "JSON/HTTPS") + Rel_D(getStaticPaths, getStaticProps, "Builds static page", "JSON/HTTPS") Rel_D(id, mirador_viewer, "Uses", "JSON/HTTPS") Rel_D(mirador_viewer, api_manifest, "Uses", "JSON/HTTPS") -- GitLab