archbyte 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/archbyte.js CHANGED
@@ -1,5 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ const [major] = process.versions.node.split('.').map(Number);
4
+ if (major < 18) {
5
+ console.error(`\n ArchByte requires Node.js 18+. You have ${process.versions.node}.\n Download the latest version at https://nodejs.org/\n`);
6
+ process.exit(1);
7
+ }
8
+
3
9
  import { Command } from 'commander';
4
10
  import { handleServe } from '../dist/cli/serve.js';
5
11
  import { handleGenerate } from '../dist/cli/generate.js';
@@ -21,8 +27,15 @@ const program = new Command();
21
27
  program
22
28
  .name('archbyte')
23
29
  .description('ArchByte - See what agents build. As they build it.')
24
- .version('0.1.0')
25
- .addHelpText('after', '\nFor more details visit https://archbyte.heartbyte.io');
30
+ .version('0.1.2')
31
+ .addHelpText('after', `
32
+ Quick start:
33
+ $ archbyte login Sign in
34
+ $ archbyte init Configure your model provider
35
+ $ archbyte run Analyze → generate → serve
36
+
37
+ https://archbyte.heartbyte.io
38
+ `);
26
39
 
27
40
  // — Getting started —
28
41
 
@@ -116,6 +116,7 @@ export const connectionMapper = {
116
116
  result.flows.push({
117
117
  name: f.name,
118
118
  description: typeof f.description === "string" ? f.description : "",
119
+ category: typeof f.category === "string" ? f.category : "system",
119
120
  steps: Array.isArray(f.steps) ? f.steps.filter((s) => typeof s === "string") : [],
120
121
  });
121
122
  }
@@ -203,6 +203,7 @@ export function mergeAgentOutputs(ctx, componentId, serviceDesc, flowDet, connMa
203
203
  flows: flows.map((f) => ({
204
204
  name: f.name,
205
205
  description: f.description,
206
+ category: f.category,
206
207
  steps: f.steps,
207
208
  })),
208
209
  },
@@ -64,6 +64,7 @@ export interface ConnectionMapperOutput {
64
64
  flows: Array<{
65
65
  name: string;
66
66
  description: string;
67
+ category: string;
67
68
  steps: string[];
68
69
  }>;
69
70
  }
@@ -9,7 +9,7 @@ registerPrompt("premium/migration-planner", "GB0WSCMLEUUgHEMJMBocDDUXABw3CxFFLBs
9
9
  registerPrompt("premium/performance-analyzer", "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");
10
10
  registerPrompt("premium/security-auditor", "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");
11
11
  registerPrompt("pipeline/component-identifier", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IQEAAvBgoOO1kREyQAGkgjCxcNKAYGCzYMBgQtHhpIMRATCygUCgsjFwBFIh0OGC0XEQs1UgoGYhhUFi4UFx8jCxFFMQAMAicaAEtLeCJIYBobCDEdDQ0sDVZFKAFDCWIdHRY1Gw0LNlkQADEeDBEjGxgAYQcNATZVVBYkABUBIRxYRSACEwQrGhURKB0NRGIVHQczExERblkbF2EBCg8sEBIMIhMNHGIUGwE0HgZGYjAaBi0HBw14c1lFAxMAAycXEEUyFxEeKxoRFm1SIjgLClhFNh0RAycLB29sUiUaLRcAAC8WQwkyCRgMIhMXAS0XB0VpBQYKblkZCiMbDw1rc1lFDRsBGiMLHQAyXRMJIRIVAiQBQ0ArF1QILhwMGicJGxZoeE5IATU9RTUdDAQxc1lFBRMXCSAYBwAyUksBJFkRHTEeCgsrDRgcYREMBiQQExAzFwdEYhxaAm9SCgZiHRsGKhcRRSEWGRUuAQZBSFRUIDkGBhosGBhFMhcRHisaERZhWgZGJVdUNyQWChtuWSYEIxAKHA8oWEUEHgIbNhAXFiQTEQsqUH5vBx0RSCcYFw1hEQwFMhYaAC8GT0gyCxsTKBYGUkhUVAwlSEMDJxsVB2wRAhsnWQcJNBVDQCdXE0ttUkEJMhBZFiQAFQ0wW1hFYwUGCm8fBgovBgYGJltdb2xSDQkvHE5FKQcOCSxUBgAgFgIKLhxUCyAfBmJvWQAcMRdZSC0XEUUuFENKJAsbCzUXDQxgVVRHIAIKSm5ZVhYkABUBIRxWSWFQFAcwEhEXY15DSi4QFhcgABpKbllWBi0bQURiWxAENRMBCTEcVklhUAQJNhwDBDhQT0hgGhUGKRdBRGJbBRAkBwZKSFRUCSALBhp4WRsLJFIMDmJbBBckAQYGNhgADC4cQURiWxUVMR4KCyMNHQovUE9IYB0VESBQT0hgHAwRJAANCS5bfkhhAgIcKkNUFyQeAhwrDxFFJRsRDSENGxc4UhMJNhFUTSRcBEZuWVYWJAAVDTBbWEVjExMYMVYDACNQSmJvWRAAMhERATINHQovSENZb0tUFiQcFw0sGhFFJRcQCzAQBBEoHQ1ILR9UFTQAEwcxHH5IYQYGCyoXGwkuFQoNMUNUBDMAAhFiFhJFKhcaSDYcFw0vHQ8HJRARFmFaBkYlV1hFGlA3ETIcJwYzGxMcYFVURwQKExonCgdHbVJBOC0KAAIzFzA5DlspTEt4MQ0xCRsLJVIUATYRVCoPPjpII1k+Ng48QwcgExEGNUhDE2JbFwosAgwGJxcAFmNIQzNsV1o4YQ8=");
12
- registerPrompt("pipeline/connection-mapper", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IUFRVhMy8kYhobCy8XABwrFhoWYRAGHDUcEQthEQwFMhYaAC8GEEgrF1QEYQEMDjYOFRckUhARMQ0RCG94aSstFxoAIgYKByxZABwxFxBSSFRURygfEwcwDVZfYRYKGicaAEUiHQcNYhAZFS4AF0cmHAQALxYGBiEAfkhhUAscNglWX2EgJjsWVhM3ETFMIBYtJEUiEw8EMXNZRWMWAhwjGxUWJFBZSCEWGRUuHAYGNlkGACAWEEc1Cx0RJAFDHC1ZFUUlExcJIBgHAEtfQ0onDxELNVBZSCMKDQsiUgYeJxcASiwXEBsjHhFFaQIWCm0KAQdtUhIdJwwRFmh4TkhgHgYVIlBZSCUrJCZhEQIELgp+SGFQFA0gChsGKhcXSnhZIwAjIQwLKRwARSIdDQYnGgAMLhwQYm9ZVgMoHgZKeFkHDSAABgxiHx0JJAEaGzYcGUUgEQANMQp+bwcdEUgnGBcNYREMBiwcFxEoHQ1SSFRUAzMdDlJiChsQMxEGSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+SGEGDFJiDRUXJhcXSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+SGEGGhgnQ1QKLxdDByRZAA0kUhcRMhwHRSAQDB4nc1lFJRcQCzAQBBEoHQ1SYhsGDCQUQwwnChcXKAIXAS0XVAonUhcAJ1kGAC0TFwEtFwcNKAJpRWIYBxwvEVlINgsBAGEbBUgjCg0LIhoRBywWARZhWgYeJxcAFm1SEh0nDBEWaHhpKS4KG0UoFgYGNhASHGFYSQ4uFgMWa1hDisLtVAAvFk4cLVQRCyVSEQ0zDBEWNVITCTYRB0U1GhEHNx4cRTUaBkgxAAcRJB9ZYm9ZGgQsF1lIJBUbEmEcAgUnWVwAbxVNRGJbIRYkAEM6Jx4dFjUAAhwrFhpHaHhOSCYcBwYzGxMcKxYaX2EFCwk2WRwEMQIGBjFzWUUyBgYYMUNUBDMAAhFiFhJFMgYRASweB0lhFwILKlkxPQAxNyQbWR0LYQYLDWIfGxcsExdIYBobCDEdDQ0sDT0BYZDl+mIaGwgxHQ0NLA09AWNSSw1sHlpJYVAUDSBUEhcuHBcNLB1Uh8fgQwkyEFkWJAAVDTBbWEVjExMBbwoRFzcXEUig/+ZFMR0QHCULERYwHkFBbFkxBCIaQxs2HARFLAcQHGIaGws1EwoGYhwMBCIGDxFiFhoAYZDl+mIYBhcuBUMfKw0cRSBSFQkuEBBFIh0OGC0XEQs1UiosYhYaRSQTAABiCh0BJFxDLC1ZOioVUhYbJ1kSFyQXThwnAQBFJRcQCzAQBBEoHQ0bYhgHRTIGBhgxV35vCD8zJxAtNSsVSEM9MRxUESkXQy0aODcxYREMBTIWGgAvBkMhBgpUAzMdDkg2ERFFIh0OGC0XEQs1AUMEKwoAS2E3FQ0wAFQDMx0ORzYWVAwvUgAHLBcRBjUbDAYxWTUrBVIGHicLDUUiHQ4YLRcRCzVSKixiEBpFJx4MH2IKAAAxAUMFNwoARTMXBQ0wHBoGJFICSDQYGAwlUgAHLwkbCyQcF0gLPVQDMx0OSDYREUUtGxAcYhgWCjcXTUgGFlQrDiZDASwPEQs1UgAHLwkbCyQcF0gLPQdFLgBDHTEcVAMzFwZFNhwMEWEWBhshCx0VNRsMBjFXfm8TFxAYLRcQRTYbFwBiNjopGFICSAgqOythHQECJxoAX0sJaUhiWxcKLxwGCzYQGwsyUFlIGVdaSxxeaUhiWxIJLgUQSnhZL0tvXD5iPw==");
12
+ registerPrompt("pipeline/connection-mapper", "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");
13
13
  registerPrompt("pipeline/flow-detector", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMREyQcFystFxoAIgYKBywKXk97UiYeJxcASCUACh4nF1QGLh8OHSwQFwQ1GwwGYgkVETUXEQYxWVwIJAEQCSUcVBQ0FxYNMVVUFTQQTBs3G1hFNhcBAC0WHxZtUgYeJxcARSQfChw2HAYWaFxpSGJZMgozUgYJIRFORTpSEx0gFR0WKRcRRGIKAQcyEREBIBwGSWERCwksFxEJbVIXDSERGgotHQQRYgR+RWFSTkgyDBYJKAELDTBWBxAjAQAaKxsRF3tSAAcvCRsLJBwXSAs9B0VpGQYKIxtZBiABBkgxFQECMltpSGJZWUUiGgIGLBwYX2EXFQ0sDVsRLgIKC20IAQA0F0MGIxQRb2FSQ0ViDREGKRwMBC0eDV9hBgsNYgoEACIbBQEhWQAAIhoNBy4WExxhBxANJllcAG8VTURiWxETJBwXRScUHRE1FxFKbllWEiQQCwctElZMS3hRRmJTXgQxGzEHNw0RFmtYWUgDKT1FMx0WHCcKWwAvFhMHKxcAFmEWBhwnGgAAJVIFGi0UVAYuFgZIMhgAESQADRtsc1RFYTQMGmIcFQYpSEMTYgkVESleQwUnDRwKJV5DACMXEAkkACUBLhxUGEt4IDoLLT0mAD5ZSA0XGBxhAAYYLQsARSQEBgY2WRcKLxwGCzYQGwsyUgIGJlkGCjQGBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUxAAweKx0RAWERDAwnWQcELAIPDTFVVBY1ExcBIVkHBiAcDQ0wWQYAMgcPHDFVVAozUicHIRIRF2EBBho0EBcAMlxDISRZAA0kUhAcIw0dBmEBAAksFxEXYQECETFZVisuUgYeJxcASCUACh4nF1QVIAYXDTAXB0UlFxcNIQ0RAWNeQxonDQEXL1IGBTINDUUkBAYGNjobCy8XABwrFhoWb1InB2I3OzFhGw0eJxcARTETFxwnCxoWYQYLCTZZFRckUg0HNlkREygWBgYhHBBFKBxDHCocVAwvAhYcbHN+NyQBEwcsHVQSKAYLSA03ODxhE0MiETY6RS4QCQ0hDU5vOnhDSGAcAgAvBiAHLBcRBjUbDAYxW05FGlxNRh9VfkVhUAIYKysbEDUXEEp4WS9Lb1w+Yj9zfiwnUg0HYgkVETUXEQYxWRIKNBwHRGILERE0AA1IJxQEEThSAhowGA0Wbw==");
14
14
  registerPrompt("pipeline/service-describer", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMEFy4YBgs2PREWIgAKGDYQGwtrWFlIA1kXCSQTEUhwVEdFMhcNHCcXFwBhFgYbIQsdFTUbDAZiFhJFNhoCHGINHAwyUhMaLRMRBjVSBwcnClpvc1xDQmgJBgwsExERDhgaAjQTBA1oU05FFRoGSC8YHQthAhEHJQsVCCwbDQ9iFRULJgcCDydZXABvFU1EYlsgHDEXMAswEAQRY15DShIAAA0uHEFEYlszCmNeQ0oQDAcRY1tNYnFXVE9rFgIcIxsVFiQBSUJ4WTAENRMBCTEcB0U0AQYMYhAaRTUaChtiCQYKKxcAHGxzQEthWEkNOg0RFy8TDzsnCwIMIhcQQmhDVCA5BgYaLBgYRTIXER4rGhEWbjMzITFZFwovARYFJx1UBzhSFwArClQVMx0JDSENWm9LNAwaYh0VESAQAhsnClQELxZDDToNERcvEw87JwsCDCIXEERiCQYKNxsHDXhzWUUoFllIKRwWBCNfAAkxHFQWLQcEYm9ZGgQsF1lIKgwZBC9fEQ0jHRUHLRdDBiMUEW9sUhcRMhxORTUXAAAsFhgKJgtDHDsJEUVpF00PbFVURzEdEBwlCxEWMB5BRGJbBgAlGxBKbllWFjUAChgnW11vbFIHDTEaBgwxBgoHLENUEikTF0grDVMWYQcQDSZZEgozeE5INwoRAQMLWUgjCwYEOFIMDmIaGwgxHQ0NLA1ULAUBQxwqGABFNAEGSDYRHRZhWhYbJ1kfACMTAUUhGAcAYQEPHSUKVAggBgAAKxcTRTUaBkghFhkVLhwGBjZZGgQsFxBBSHM3NwgmKisDNU5FDhwPEWIQGgYtBwcNYh0VESAQAhsnClQELxZDDToNERcvEw9IMRwGEygRBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUiHQcNIBgHAHt4TkgSGBcOIBUGRyYcBAAvFgYGIQBUDCwCDBo2ClRNJFwERm5ZVhUmUE9IYAsRASgBQURiWwcRMxsTDWBVVEcBExQbbwoQDm4RDwEnFwBIMkFBQUhUVCAvBAoaLRcZAC8GQx4jCx0EIx4GG2ILEQMkAAYGIRAaAmEGCw0vWVwAbxVNRGI9NTEAMCI7ByYhNw1eQzoHPT02HicxJG5ZJzETOzMtHSoxJhM3NzcJPC1MS19DLC0aHwAzUiAHLwkbFiRSEA0wDx0GJAFDHysNHEUsExcLKhAaAmEbDgklHAdvbFIgBywfHQI0AAIcKxYaRScbDw0xWQYAJxcRDSwaHQsmUhcAJxR+SGE2ChonGgBFNAECDydZHQthEQwMJ1kHBCwCDw0xWQQXLgQKDCcdfm8FHUMmDS1UAjQXEBtiFgZFKBwFDTBZBwAzBAoLJwpUESkTF0gvEBMNNVIBDWIMBwAnBw9GYj0bRQ89N0grFxcJNBYGSDEcBhMoEQYbYhMBFjVSAQ0hGAEWJFIXACdZBBcuGAYLNllWBi4HDwxgWQEWJFIXACcUWkUIFEMcKhwGAGEbEEgsFlQGLhwAGicNEUUkBAoMJxcXAG1SBwdiFxsRYRsNCy4MEABhGxdGSHMmADICDAYmWQMMNRpDJww1LUUgUik7DTdUCiMYBgs2WRkENRELASweVBEpGxBIMRocACwTWWI5c1RFYwIRBygcFxEFFxALMBAEESgdDUp4WVZLb1xBREhZVEcxAAoFIwsNKSAcBB0jHhFHe1JBRmxXVklLUkNKJhgABCMTEA0xW05FGlxNRh9VfkVhUAYQNhwGCyAeMA0wDx0GJAFBUmIiWktvL2kV");
15
15
  registerPrompt("pipeline/validator", "GB0WSCMLEUUgUhAHJA0DBDMXQwkwGhwMNRcAHDcLEUUzFxUBJw4RF29SNQkuEBAENRdDHCocVAQvEw8RMRAHRTMXEB0uDQdFIBwHSDEMEwIkARdIIRYGFyQRFwEtFwdLS3ggACcaH0UnHRFSSEhaRWtYLBoyERULYREMBTIWGgAvBhBCaENUJi4fEwcsHBoRMlIUATYRVB8kAAxIIRYaCyQRFwEtFwdFNRoCHGIKHAo0HgdIIBxUBi4cDQ0hDREBS0BNSGhTIxcuHARIIRYZFS4cBgY2WQAcMRcQQmhDVABvFU1EYhhUNyQTABxiGAQVYQYaGCcdVAQyUkEbJwsCDCIXQUgxERsQLRZDCidZVgMzHQ0cJxcQR0tBTUhoUzkMMgEKBiVZFwovHAYLNhAbCzJYSVJiNhYTKB0WG2ILEQkgBgoHLAocDDEBQwYtDVQGIAIXHTAcEG91XENCaC4RBCpSBw0xGgYMMQYKBywKXk97UiAHLwkbCyQcFxtiDh0RKVIGBTINDUUuAEMdLBoYACAAQwwnChcXKAIXAS0XB0Wj8vdIMgsbEygWBkggHAARJABDBywcB290XENCaD0BFS0bAAk2HFsXJBYWBiYYGhFhEQwFMhYaAC8GEEJoQ1QmLh8TBywcGhEyUhcAIw1UFikdFgQmWRYAYR8GGiUcEG9LIAYbMhYaAWEFChwqWTsrDStDCWIzJyoPUgwKKBwXEXt4GGJiWVYGLh8TBywcGhEVCxMNARYGFyQRFwEtFwdHe1IYSGAaGwgxHQ0NLA1ZDCVQWUhgGhsXMxcAHG8NDRUkUEMVbnNURWMRDAUyFhoALwYnDTEaBgwxBgoHLApWX2EJQ0ohFhkVLhwGBjZUHQFjSENKIBwAESQAQwwnChcXKAIXAS0XVkU8XmlIYlsVASUXBystFxoAIgYKBywKVl9hKRhIYB8GCixQWUhgEBBHbVJBHC1bTkVjGwdKbllWETgCBkp4WVYROAIGSm5ZVgEkAQAaKwkADC4cQVJiWxAAMhFBRGJbFRY4HABKeFkSBC0BBkg/JFhvYVJBGicUGxMkFiAHLBcRBjUbDAYJHA0WY0hDM2AfBgosSFkcLUNOETgCBkofVX5FYVAABywfHQEkHAANYENUVW9KVkRIWVRHKAEQHScKVl9hKUEMJwoXFygCFwEtF1QKJ1ICBjtZBgAsEwoGKxcTRSgBEB0nClY4Sw9pYhcKEUUkHxMcO1kbBysXABwxVhUXMxMaG2IQEkUvHUMLLQsGACIGCgcsClQLJBcHDSZXVDEpF0MLLRcSDCUXDQsnWQcGLgAGSGpJWVRoUhENJBURBjUBQxEtDAZFLgQGGiMVGEUiHQ0OKx0RCyIXQwEsWQANJFICBiMVDRYoAUMZNxgYDDULTQ==");
@@ -96,6 +96,7 @@ export interface ConnectionResult {
96
96
  flows: Array<{
97
97
  name: string;
98
98
  description: string;
99
+ category?: string;
99
100
  steps: string[];
100
101
  }>;
101
102
  }
@@ -436,6 +436,7 @@ export function buildAnalysisFromStatic(result, projectRoot) {
436
436
  id: `flow-${i}`,
437
437
  name: f.name,
438
438
  description: f.description,
439
+ category: f.category || "system",
439
440
  steps: f.steps
440
441
  .map((step) => {
441
442
  const parts = step.split("\u2192").map((s) => s.trim());
@@ -148,11 +148,19 @@ export async function handleGenerate(options) {
148
148
  }
149
149
  return null;
150
150
  };
151
+ const FLOW_CATEGORY_COLORS = {
152
+ "user-journey": "#3b82f6",
153
+ "data-pipeline": "#22c55e",
154
+ "system": "#f59e0b",
155
+ "deployment": "#a855f7",
156
+ "error-recovery": "#ef4444",
157
+ };
151
158
  diagram.flows = analysis.flows.map(flow => ({
152
159
  id: flow.id,
153
160
  name: flow.name,
154
161
  description: flow.description,
155
- color: "#3b82f6", // Default blue for flows
162
+ color: FLOW_CATEGORY_COLORS[flow.category ?? "system"] || "#3b82f6",
163
+ category: flow.category || "system",
156
164
  steps: flow.steps
157
165
  .map(step => {
158
166
  const forwardId = `edge-${step.from}-${step.to}`;
@@ -38,6 +38,7 @@ export interface Flow {
38
38
  name: string;
39
39
  description: string;
40
40
  color: string;
41
+ category?: string;
41
42
  steps: FlowStep[];
42
43
  }
43
44
  export interface EnvironmentMetadata {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archbyte",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "ArchByte - See what agents build. As they build it.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,6 +56,7 @@
56
56
  "bin/",
57
57
  "dist/",
58
58
  "!dist/agents/premium/",
59
+ "templates/",
59
60
  "ui/dist/",
60
61
  "README.md"
61
62
  ]
@@ -0,0 +1,24 @@
1
+ # ArchByte Configuration
2
+ # https://heartbyte.io/archbyte
3
+
4
+ # Architecture fitness rules — control validation severity
5
+ # Levels: error (fail CI), warn (report), off (skip)
6
+ rules:
7
+ no-layer-bypass: warn
8
+ no-circular-deps: warn
9
+ no-orphans: off
10
+ max-connections:
11
+ level: warn
12
+ threshold: 8
13
+
14
+ # Custom rules — restrict specific connections
15
+ # custom:
16
+ # - name: "No direct DB access from UI"
17
+ # from: { layer: presentation }
18
+ # to: { type: database }
19
+ # level: error
20
+ #
21
+ # - name: "Services must go through API gateway"
22
+ # from: { type: service, not: { id: api-gateway } }
23
+ # to: { type: external }
24
+ # level: warn
@@ -0,0 +1,173 @@
1
+ {
2
+ "type": "excalidraw",
3
+ "version": 2,
4
+ "source": "archbyte",
5
+ "elements": [
6
+ {
7
+ "id": "presentation-layer-box",
8
+ "type": "rectangle",
9
+ "x": 50,
10
+ "y": 50,
11
+ "width": 700,
12
+ "height": 150,
13
+ "strokeColor": "#1971c2",
14
+ "backgroundColor": "#e7f5ff",
15
+ "strokeWidth": 2,
16
+ "roughness": 0
17
+ },
18
+ {
19
+ "id": "presentation-layer-label",
20
+ "type": "text",
21
+ "x": 60,
22
+ "y": 60,
23
+ "width": 150,
24
+ "height": 25,
25
+ "text": "PRESENTATION",
26
+ "strokeColor": "#1971c2",
27
+ "backgroundColor": "transparent"
28
+ },
29
+ {
30
+ "id": "application-layer-box",
31
+ "type": "rectangle",
32
+ "x": 50,
33
+ "y": 220,
34
+ "width": 700,
35
+ "height": 150,
36
+ "strokeColor": "#e67700",
37
+ "backgroundColor": "#fff4e6",
38
+ "strokeWidth": 2,
39
+ "roughness": 0
40
+ },
41
+ {
42
+ "id": "application-layer-label",
43
+ "type": "text",
44
+ "x": 60,
45
+ "y": 230,
46
+ "width": 150,
47
+ "height": 25,
48
+ "text": "APPLICATION",
49
+ "strokeColor": "#e67700",
50
+ "backgroundColor": "transparent"
51
+ },
52
+ {
53
+ "id": "data-layer-box",
54
+ "type": "rectangle",
55
+ "x": 50,
56
+ "y": 390,
57
+ "width": 700,
58
+ "height": 150,
59
+ "strokeColor": "#2f9e44",
60
+ "backgroundColor": "#ebfbee",
61
+ "strokeWidth": 2,
62
+ "roughness": 0
63
+ },
64
+ {
65
+ "id": "data-layer-label",
66
+ "type": "text",
67
+ "x": 60,
68
+ "y": 400,
69
+ "width": 80,
70
+ "height": 25,
71
+ "text": "DATA",
72
+ "strokeColor": "#2f9e44",
73
+ "backgroundColor": "transparent"
74
+ },
75
+ {
76
+ "id": "frontend",
77
+ "type": "rectangle",
78
+ "x": 100,
79
+ "y": 100,
80
+ "width": 180,
81
+ "height": 70,
82
+ "strokeColor": "#1971c2",
83
+ "backgroundColor": "#d0ebff",
84
+ "roughness": 0
85
+ },
86
+ {
87
+ "id": "frontend-text",
88
+ "type": "text",
89
+ "x": 110,
90
+ "y": 125,
91
+ "width": 160,
92
+ "height": 25,
93
+ "text": "Frontend App",
94
+ "strokeColor": "#1e1e1e",
95
+ "backgroundColor": "transparent"
96
+ },
97
+ {
98
+ "id": "backend",
99
+ "type": "rectangle",
100
+ "x": 100,
101
+ "y": 270,
102
+ "width": 180,
103
+ "height": 70,
104
+ "strokeColor": "#e67700",
105
+ "backgroundColor": "#ffe8cc",
106
+ "roughness": 0
107
+ },
108
+ {
109
+ "id": "backend-text",
110
+ "type": "text",
111
+ "x": 110,
112
+ "y": 295,
113
+ "width": 160,
114
+ "height": 25,
115
+ "text": "Backend API",
116
+ "strokeColor": "#1e1e1e",
117
+ "backgroundColor": "transparent"
118
+ },
119
+ {
120
+ "id": "database",
121
+ "type": "ellipse",
122
+ "x": 100,
123
+ "y": 430,
124
+ "width": 180,
125
+ "height": 70,
126
+ "strokeColor": "#2f9e44",
127
+ "backgroundColor": "#b2f2bb",
128
+ "roughness": 0
129
+ },
130
+ {
131
+ "id": "database-text",
132
+ "type": "text",
133
+ "x": 135,
134
+ "y": 455,
135
+ "width": 110,
136
+ "height": 25,
137
+ "text": "Database",
138
+ "strokeColor": "#1e1e1e",
139
+ "backgroundColor": "transparent"
140
+ },
141
+ {
142
+ "id": "arrow-frontend-to-backend",
143
+ "type": "arrow",
144
+ "x": 190,
145
+ "y": 170,
146
+ "width": 0,
147
+ "height": 100,
148
+ "strokeColor": "#868e96",
149
+ "backgroundColor": "transparent",
150
+ "points": [[0, 0], [0, 100]],
151
+ "startArrowhead": null,
152
+ "endArrowhead": "arrow"
153
+ },
154
+ {
155
+ "id": "arrow-backend-to-database",
156
+ "type": "arrow",
157
+ "x": 190,
158
+ "y": 340,
159
+ "width": 0,
160
+ "height": 90,
161
+ "strokeColor": "#868e96",
162
+ "backgroundColor": "transparent",
163
+ "points": [[0, 0], [0, 90]],
164
+ "startArrowhead": null,
165
+ "endArrowhead": "arrow"
166
+ }
167
+ ],
168
+ "appState": {
169
+ "gridSize": 20,
170
+ "viewBackgroundColor": "#ffffff"
171
+ },
172
+ "flows": []
173
+ }
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap";.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root{--bg-primary: hsl(222 47% 5%);--bg-secondary: hsl(222 47% 7%);--bg-tertiary: hsl(222 47% 10%);--bg-hover: hsl(222 47% 12%);--text-primary: hsl(210 40% 96%);--text-secondary: hsl(215 20% 55%);--text-muted: hsl(215 15% 40%);--border-color: hsl(220 25% 15%);--border-light: hsl(220 20% 12%);--shadow-color: rgba(0, 0, 0, .3);--canvas-bg: hsl(222 47% 5%);--canvas-dots: hsl(220 25% 15%);--watermark-color: rgba(255, 255, 255, .02);--accent-cyan: hsl(185 75% 50%);--accent-green: hsl(142 76% 42%);--accent-amber: hsl(38 92% 50%);--accent-red: hsl(0 90% 55%);--glow-cyan: 0 0 20px hsl(185 75% 50% / .15);--glow-green: 0 0 12px hsl(142 76% 42% / .3)}[data-theme=light]{--bg-primary: hsl(220 20% 97%);--bg-secondary: hsl(220 18% 94%);--bg-tertiary: hsl(220 16% 90%);--bg-hover: hsl(220 14% 86%);--text-primary: hsl(220 30% 12%);--text-secondary: hsl(220 15% 40%);--text-muted: hsl(220 10% 58%);--border-color: hsl(220 15% 82%);--border-light: hsl(220 12% 88%);--shadow-color: rgba(0, 0, 0, .08);--canvas-bg: hsl(220 20% 97%);--canvas-dots: hsl(220 15% 82%);--watermark-color: rgba(0, 0, 0, .02);--accent-cyan: hsl(185 80% 35%);--accent-green: hsl(142 72% 32%);--accent-amber: hsl(38 90% 42%);--accent-red: hsl(0 85% 45%);--glow-cyan: 0 0 12px hsl(185 80% 35% / .12);--glow-green: 0 0 8px hsl(142 72% 32% / .2)}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{width:100%;height:100%;overflow:hidden;font-family:JetBrains Mono,monospace}.app{width:100%;height:100%;display:flex;flex-direction:column;background:var(--bg-primary)}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:var(--bg-primary)}::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#303a50}.branding-header{position:relative;z-index:10;background:#080c16d9;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:10px 24px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid hsl(185 75% 50% / .1);box-shadow:0 1px 12px #20cfdf0d}.archbyte-brand{display:flex;align-items:center;gap:10px}.archbyte-logo{font-size:20px}.archbyte-logo-img{height:22px;width:auto}.archbyte-name{font-size:20px;font-weight:700;color:var(--text-primary);letter-spacing:-.3px}.archbyte-tagline{font-size:13px;color:var(--text-muted);padding-left:14px;margin-left:4px;border-left:1px solid var(--border-color)}.branding-account{display:flex;align-items:center;gap:10px}.account-tier-badge{font-size:11px;font-weight:600;padding:3px 10px;border-radius:4px;letter-spacing:.3px;text-transform:uppercase}.account-tier-badge.premium{background:#672eb8;color:#fff}.account-tier-badge.free{background:#182543;color:var(--text-muted)}.account-email{font-size:12px;color:var(--text-muted);position:relative}.account-pro-tag{margin-left:6px;font-size:9px;font-weight:700;letter-spacing:.5px;padding:1px 4px;border-radius:3px;background:#a65eed26;color:#a65eed;border:1px solid hsl(270 80% 65% / .4);vertical-align:middle}.project-info-wrapper{position:relative;display:inline-flex;align-items:center}.project-info-trigger{background:none;border:1px solid transparent;color:var(--text-secondary);font-family:JetBrains Mono,monospace;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s;margin-left:10px;padding:3px 10px 3px 14px;border-left:1px solid var(--border-color);border-radius:0}.project-info-trigger:hover{color:var(--text-primary);background:var(--bg-tertiary)}.project-info-popup{position:absolute;top:calc(100% + 8px);left:0;background:#090e1af2;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-color);border-radius:12px;padding:16px;width:340px;z-index:100;box-shadow:0 8px 32px var(--shadow-color);animation:popupFadeIn .15s ease-out}@keyframes popupFadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.project-info-header{display:flex;align-items:center;gap:8px;margin-bottom:10px}.project-info-name{font-size:15px;font-weight:700;color:var(--text-primary);letter-spacing:-.3px}.project-info-lang{font-size:10px;font-weight:600;color:#4cd9e6;background:#20cfdf1f;padding:2px 8px;border-radius:10px;text-transform:uppercase;letter-spacing:.5px}.project-info-desc{font-size:12px;color:var(--text-secondary);line-height:1.5;margin:0 0 14px;padding-bottom:14px;border-bottom:1px solid var(--border-color)}.project-info-stats{display:flex;gap:6px;flex-wrap:wrap}.project-info-stat{display:flex;flex-direction:column;align-items:center;background:var(--bg-tertiary);padding:8px 12px;border-radius:8px;min-width:56px;flex:1}.project-info-stat-value{font-size:16px;font-weight:700;color:var(--text-primary);font-family:JetBrains Mono,monospace}.project-info-stat-label{font-size:9px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.project-info-badge{margin-top:10px;font-size:10px;font-weight:600;color:#f6c155;background:#f2a60d1a;padding:3px 10px;border-radius:10px;display:inline-block}.project-info-vscode{display:flex;align-items:center;gap:8px;margin-top:12px;padding:8px 12px;border-radius:8px;font-size:12px;font-weight:600;color:#75b3f0;background:#1980e61a;border:1px solid hsl(210 80% 50% / .2);text-decoration:none;cursor:pointer;transition:all .2s}.project-info-vscode:hover{background:#1980e633;border-color:#1980e666;color:#a3ccf5}.project-info-vscode svg{flex-shrink:0}[data-theme=light] .project-info-popup{background:#f9fafbf5}[data-theme=light] .project-info-vscode{color:#1466b8;background:#1980e614;border-color:#1980e633}[data-theme=light] .project-info-vscode:hover{background:#1980e626;border-color:#1980e659;color:#0f4d8a}.brand-attribution{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary);text-decoration:none;transition:color .2s}.brand-attribution:hover{color:var(--text-primary)}.brand-avatar{width:28px;height:28px;border-radius:50%;object-fit:cover;border:2px solid hsl(185 75% 50% / .3);transition:border-color .2s,box-shadow .2s}.brand-attribution:hover .brand-avatar{border-color:var(--accent-cyan);box-shadow:0 0 12px #20cfdf4d}.brand-attribution-link{color:var(--accent-cyan);font-weight:600}.brand-attribution:hover .brand-attribution-link{color:#63dee9}.toolbar{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:var(--bg-secondary);border-bottom:1px solid var(--border-color)}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:16px}.toolbar-right{gap:8px}.toolbar-right .dropdown-menu{left:auto;right:0}.toolbar-section{display:flex;flex-direction:column;gap:3px;padding-right:12px;border-right:1px solid hsl(222 30% 25%)}.toolbar-section:last-child{padding-right:0;border-right:none}.toolbar-section-label{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);text-align:center;-webkit-user-select:none;user-select:none}.toolbar-section-items,.toolbar-group{display:flex;align-items:center;gap:6px}.toolbar-divider{width:1px;height:24px;background:var(--border-color);margin:0 8px}.toolbar-btn-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;font-size:15px;font-weight:600;font-family:system-ui,sans-serif;line-height:1;text-align:center;color:var(--text-secondary);cursor:pointer;transition:all .2s}.toolbar-btn-icon:hover{background:var(--bg-hover);color:var(--text-primary);box-shadow:var(--glow-cyan)}.toolbar-btn-icon:disabled{opacity:.5;cursor:not-allowed}.toolbar-error-btn{background:#ef444426!important;border-color:#ef444466!important;color:#ef4444!important;font-size:11px;animation:pulse-error 2s ease-in-out infinite}.toolbar-error-btn:hover{background:#ef444440!important}@keyframes pulse-error{0%,to{opacity:1}50%{opacity:.7}}.toolbar-btn{display:flex;align-items:center;gap:4px;height:32px;padding:0 10px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;font-size:12px;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:all .2s}.toolbar-btn:hover{background:var(--bg-hover);color:var(--text-primary);box-shadow:var(--glow-cyan)}.toolbar-btn:disabled{opacity:.5;cursor:not-allowed}.toolbar-btn.active{background:#20cfdf26;border-color:var(--accent-cyan);color:var(--accent-cyan)}.premium-btn{position:relative;border:1px solid hsl(270 80% 65% / .5)!important}.premium-btn.premium-locked{opacity:.4;cursor:not-allowed}.premium-btn.premium-locked:hover{opacity:.55}.premium-btn:after{content:"PRO";position:absolute;top:3px;right:4px;font-size:7px;font-weight:700;letter-spacing:.5px;line-height:1;color:#a65eed}.dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 14px;font-size:12px;font-weight:500;color:var(--text-secondary);background:transparent;border:none;cursor:pointer;text-align:left;transition:all .15s}.dropdown-item:hover{background:var(--bg-hover);color:var(--text-primary)}.dropdown-item.active{color:var(--accent-cyan);background:var(--bg-hover)}.shortcut-item{display:flex;align-items:center;justify-content:space-between;padding:6px 14px;font-size:12px;color:var(--text-secondary)}.shortcut-item kbd{background:var(--bg-tertiary);padding:2px 6px;border-radius:4px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:600;color:var(--text-primary);margin-right:12px;border:1px solid var(--border-color)}.toolbar-search{height:32px;width:200px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;padding:0 10px;font-size:12px;font-family:JetBrains Mono,monospace;color:var(--text-primary);outline:none;transition:border-color .2s}.toolbar-search::placeholder{color:var(--text-muted)}.toolbar-search:focus{border-color:var(--accent-cyan);box-shadow:0 0 0 2px #20cfdf26}.dropdown-wrapper{position:relative}.dropdown-menu{position:absolute;top:100%;left:0;margin-top:4px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:4px;z-index:50;min-width:160px;box-shadow:0 4px 16px var(--shadow-color);animation:fade-in-up .15s ease-out}.dropdown-label{padding:6px 10px 4px;font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}.dropdown-separator{height:1px;background:var(--border-color);margin:4px 0}.panel-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;flex:1;padding:6px 10px;font-size:11px;font-family:JetBrains Mono,monospace;font-weight:500;border-radius:6px;cursor:pointer;border:1px solid var(--border-color);background:var(--bg-tertiary);color:var(--text-secondary);transition:all .2s}.panel-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.panel-btn.cyan{border-color:#20cfdf4d;color:var(--accent-cyan);background:#20cfdf1a}.panel-btn.cyan:hover{background:#20cfdf33}.panel-btn.green{border-color:#1abc554d;color:var(--accent-green);background:#1abc551a}.panel-btn.green:hover{background:#1abc5533}.panel-btn.amber{border-color:#f59f0a4d;color:var(--accent-amber);background:#f59f0a1a}.panel-btn.amber:hover{background:#f59f0a33}.panel-btn.red{border-color:#f425254d;color:var(--accent-red);background:#f425251a}.panel-btn.red:hover{background:#f4252533}.panel-btn.small{flex:0;padding:3px 8px;font-size:10px}.panel-close-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;border-radius:4px;font-size:14px;transition:all .2s}.panel-close-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.save-btn{padding:6px 14px;background:var(--accent-cyan);color:var(--bg-primary);border:none;border-radius:6px;font-family:JetBrains Mono,monospace;font-size:12px;font-weight:600;cursor:pointer;transition:background .2s}.save-btn:hover{background:#4cd9e6}.save-btn:disabled{opacity:.5;cursor:not-allowed}.discard-btn{padding:6px 14px;background:transparent;color:var(--text-secondary);border:1px solid var(--border-color);border-radius:6px;font-family:JetBrains Mono,monospace;font-size:12px;cursor:pointer;transition:all .2s}.discard-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.discard-btn:disabled{opacity:.5;cursor:not-allowed}.tech-badge{display:inline-flex;padding:2px 8px;font-size:10px;font-family:JetBrains Mono,monospace;border-radius:4px;background:#20cfdf1a;color:var(--accent-cyan);border:1px solid hsl(185 75% 50% / .3)}.active-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:4px;background:#20cfdf26;color:var(--accent-cyan);border:1px solid hsl(185 75% 50% / .3)}.validation-badge{font-size:10px;font-weight:600;text-transform:uppercase;padding:2px 8px;border-radius:4px}.validation-badge.pass{background:#1abc5526;color:var(--accent-green);border:1px solid hsl(142 76% 42% / .3)}.validation-badge.fail{background:#f4252526;color:var(--accent-red);border:1px solid hsl(0 90% 55% / .3)}.ops-tabs{display:flex;gap:2px;background:var(--bg-tertiary);border-radius:6px;padding:2px}.ops-tab{padding:4px 12px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;border-radius:4px;font-family:JetBrains Mono,monospace;transition:all .2s}.ops-tab.active{background:var(--bg-hover);color:var(--text-primary)}.ops-tab:hover{color:var(--text-primary)}.dropdown-item.disabled{opacity:.4;cursor:default;pointer-events:none}.watermark{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:72px;font-weight:700;color:var(--watermark-color);pointer-events:none;z-index:0;-webkit-user-select:none;user-select:none;letter-spacing:-2px}.environment-tabs{display:flex;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);padding:0 16px;gap:4px;height:48px;align-items:stretch}.env-tab{display:flex;align-items:center;gap:8px;padding:0 20px;background:transparent;border:none;border-bottom:3px solid transparent;cursor:pointer;font-size:13px;font-weight:500;color:var(--text-secondary);transition:all .2s;font-family:JetBrains Mono,monospace}.env-tab:hover{background:var(--bg-hover)}.env-tab.selected{border-bottom-color:var(--env-color);color:var(--text-primary);box-shadow:0 2px 12px color-mix(in srgb,var(--env-color) 20%,transparent)}.env-indicator{width:8px;height:8px;border-radius:50%;background:var(--env-color);opacity:.4;transition:opacity .2s}.env-tab.selected .env-indicator{opacity:1;animation:breathe 3s infinite}.env-label{font-weight:600}.env-meta{font-size:11px;color:var(--text-muted);font-weight:400;margin-left:8px;padding-left:8px;border-left:1px solid var(--border-color)}.component-info-panel{position:absolute;top:16px;left:16px;background:#090e1ae6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:16px;border-radius:12px;border:1px solid var(--border-color);font-size:12px;color:var(--text-primary);z-index:10;width:280px;box-shadow:0 2px 12px var(--shadow-color)}.node-details-panel{position:absolute;top:16px;left:16px;background:#090e1ae6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:16px;border-radius:12px;border:1px solid var(--border-color);font-size:12px;color:var(--text-primary);z-index:15;width:300px;max-height:calc(100vh - 200px);overflow-y:auto;box-shadow:0 2px 12px var(--shadow-color)}.node-details-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--border-color)}.node-details-title{font-size:14px;font-weight:600;color:var(--text-primary)}.node-details-type{font-size:10px;color:var(--text-muted);text-transform:uppercase;margin-top:2px}.node-details-section{margin-bottom:12px}.node-details-section-title{font-size:10px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}.node-details-path{font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-secondary);background:var(--bg-tertiary);padding:6px 8px;border-radius:4px;word-break:break-all;border:1px solid var(--border-light)}.node-details-tech-stack{display:flex;flex-wrap:wrap;gap:4px}.node-details-connections{display:flex;flex-direction:column;gap:4px}.connection-item{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-secondary)}.connection-item-detailed{padding:8px 10px;background:var(--bg-tertiary);border-radius:6px;margin-bottom:6px;border:1px solid var(--border-light)}.connection-header{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--text-primary)}.connection-arrow{color:var(--text-muted)}.connection-target{color:var(--text-primary)}.connection-label{font-size:11px;color:var(--text-secondary);margin-top:4px;padding-left:18px;line-height:1.4}.node-details-actions{display:flex;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border-color)}.env-badge{display:inline-block;padding:4px 12px;border-radius:20px;color:var(--text-primary);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:12px}.env-details{padding:10px 0;border-top:1px solid var(--border-color);border-bottom:1px solid var(--border-color);margin-bottom:12px}.env-detail-row{display:flex;justify-content:space-between;align-items:center;padding:4px 0}.env-detail-label{font-size:10px;color:var(--text-muted);text-transform:uppercase}.env-detail-value{font-size:11px;font-weight:500;color:var(--text-secondary)}.component-list{display:flex;flex-direction:column;gap:6px}.component-list-title{font-weight:600;color:var(--text-muted);text-transform:uppercase;font-size:10px;letter-spacing:1px;margin-bottom:4px}.component-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:8px 10px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:8px;cursor:pointer;transition:all .2s;text-align:left;width:100%}.component-item:hover{background:var(--bg-hover);border-color:var(--accent-cyan);transform:translate(2px);box-shadow:var(--glow-cyan)}.component-name{font-weight:600;font-size:12px;color:var(--text-primary)}.component-path{font-size:10px;color:var(--text-muted);font-family:JetBrains Mono,monospace}.git-info{display:flex;align-items:center;gap:8px;margin-top:4px}.git-branch{display:inline-flex;align-items:center;padding:2px 6px;background:#20cfdf1a;border:1px solid hsl(185 75% 50% / .3);border-radius:4px;font-size:10px;font-family:JetBrains Mono,monospace;color:var(--accent-cyan)}.git-hash{display:inline-flex;align-items:center;padding:2px 6px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;font-size:10px;font-family:JetBrains Mono,monospace;color:var(--text-secondary)}.no-git-info{color:var(--text-muted);font-style:italic;text-align:center;padding:12px}.canvas-container{flex:1;position:relative}.react-flow{background:var(--canvas-bg)!important}.react-flow__background{background:var(--canvas-bg)}.react-flow__controls{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;box-shadow:0 2px 8px var(--shadow-color)}.react-flow__controls-button{background:var(--bg-secondary);border-color:var(--border-color);fill:#fff;color:#fff}.react-flow__controls-button:hover{background:var(--bg-hover);fill:var(--text-primary)}.arch-node{padding:14px 16px;border-radius:12px;font-size:12px;font-weight:500;border:1.5px solid;min-width:130px;text-align:left;box-shadow:0 4px 16px #00000040,inset 0 1px #ffffff0d;transition:transform .2s,box-shadow .2s;display:flex;flex-direction:column;gap:6px;position:relative;overflow:hidden}.arch-node:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.08),transparent)}.arch-node:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000059,inset 0 1px #ffffff0d}.arch-node .node-type-icon{position:absolute;top:10px;right:12px;font-size:16px;opacity:.35;line-height:1}.arch-node .node-content{flex:1;min-width:0}.arch-node .label{font-weight:700;font-size:13px;margin-bottom:2px;letter-spacing:-.2px;padding-right:20px}.arch-node .sublabel{font-size:10px;opacity:.7}.arch-node .node-desc{font-size:9px;opacity:.5;line-height:1.3;margin-top:2px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.arch-node .node-tech-row{display:flex;flex-wrap:wrap;gap:3px;margin-top:2px}.arch-node .node-tech-pill{font-size:8px;font-weight:600;padding:1px 6px;border-radius:3px;background:#ffffff0f;border:1px solid rgba(255,255,255,.08);opacity:.7;letter-spacing:.2px;text-transform:uppercase}.arch-node.presentation{background:linear-gradient(145deg,#122436,#152e47);border-color:#2680d999;color:#c6d9ec}.arch-node.presentation:hover{border-color:#3c8cdd;box-shadow:0 0 24px #2680d933,0 8px 24px #00000059}.arch-node.presentation .node-tech-pill{border-color:#2680d940;color:#99bfe6}.arch-node.application{background:linear-gradient(145deg,#322415,#432e19);border-color:#e88c3099;color:#ecd9c6}.arch-node.application:hover{border-color:#eb9947;box-shadow:0 0 24px #e88c3033,0 8px 24px #00000059}.arch-node.application .node-tech-pill{border-color:#e88c3040;color:#e6bf99}.arch-node.data{background:linear-gradient(145deg,#14291b,#183923);border-color:#2eb85c99;color:#c9e8d4}.arch-node.data:hover{border-color:#3c6;box-shadow:0 0 24px #2eb85c33,0 8px 24px #00000059}.arch-node.data .node-tech-pill{border-color:#2eb85c40;color:#9fdfb5}.arch-node.external{background:linear-gradient(145deg,#27192e,#331e3e);border-color:#9f53c699;color:#ddcde4}.arch-node.external:hover{border-color:#a6c;box-shadow:0 0 24px #9f53c633,0 8px 24px #00000059}.arch-node.external .node-tech-pill{border-color:#9f53c640;color:#c8a6d9}.arch-node.deployment{background:linear-gradient(145deg,#2e1919,#3e1e1e);border-color:#c339;color:#e4cdcd}.arch-node.deployment:hover{border-color:#d14747;box-shadow:0 0 24px #c333,0 8px 24px #00000059}.arch-node.deployment .node-tech-pill{border-color:#cc333340;color:#df9f9f}.react-flow__resize-control{border-radius:2px!important}.react-flow__resize-control.handle{width:8px!important;height:8px!important}.react-flow__node.selected .arch-node{box-shadow:0 0 0 2px #20cfdf66,0 4px 16px #0006}.arch-node.active{animation:pulse-border 2s infinite}@keyframes pulse-border{0%,to{box-shadow:0 0 #1abc5566}50%{box-shadow:0 0 0 8px #1abc5500}}.arch-node.highlighted{animation:highlight-glow 1.5s ease-in-out;box-shadow:0 0 20px #20cfdf99,0 0 40px #20cfdf4d;transform:scale(1.05);z-index:100}@keyframes highlight-glow{0%{box-shadow:0 0 #20cfdf00;transform:scale(1)}20%{box-shadow:0 0 30px #20cfdfcc,0 0 60px #20cfdf66;transform:scale(1.08)}to{box-shadow:0 0 20px #20cfdf99,0 0 40px #20cfdf4d;transform:scale(1.05)}}.arch-node.connected{box-shadow:0 0 0 3px var(--accent-green),0 4px 16px #1abc554d}.arch-node.dimmed{opacity:.3}.arch-node.search-match{box-shadow:0 0 0 3px var(--accent-amber),0 4px 16px #f59f0a66}.arch-node.search-no-match{opacity:.2}.node-actions-panel{position:absolute;top:60px;right:16px;background:#090e1ae6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--border-color);border-radius:10px;padding:12px;box-shadow:0 4px 12px var(--shadow-color);z-index:10;min-width:180px}.node-actions-title{font-size:11px;font-weight:600;color:var(--text-secondary);margin-bottom:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.node-actions-buttons{display:flex;gap:8px;margin-bottom:8px}.node-actions-hint{font-size:10px;color:var(--text-muted);text-align:center;padding-top:8px;border-top:1px solid var(--border-color)}.lock-icon{margin-right:6px}.arch-node.locked{opacity:.7;cursor:not-allowed}.arch-node.locked:after{content:"🔒";position:absolute;top:4px;right:4px;font-size:10px}.hidden-nodes-panel{position:absolute;bottom:60px;right:16px;background:#090e1ae6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--border-color);border-radius:10px;padding:12px;box-shadow:0 4px 12px var(--shadow-color);z-index:10;min-width:200px;max-width:280px;max-height:300px;overflow-y:auto}.hidden-nodes-title{display:flex;justify-content:space-between;align-items:center;font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border-color)}.hidden-nodes-list{display:flex;flex-direction:column;gap:6px}.hidden-node-item{display:flex;justify-content:space-between;align-items:center;padding:6px 8px;background:var(--bg-tertiary);border-radius:6px}.hidden-node-name{font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:140px}.status-bar{background:var(--bg-secondary);border-top:1px solid var(--border-color);padding:10px 20px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;font-size:12px;color:var(--text-secondary)}.status-left{display:flex;align-items:center;gap:16px;justify-self:start}.status-center{display:flex;align-items:center;justify-self:center}.status-indicator{display:flex;align-items:center;gap:8px}.status-dot{width:8px;height:8px;border-radius:50%;background:var(--accent-green);animation:breathe 2s infinite}.status-dot.disconnected{background:var(--accent-red);animation:none}@keyframes breathe{0%,to{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.95)}}.status-right{display:flex;align-items:center;gap:20px;justify-self:end}.layer-dropdown-item{gap:10px!important;transition:opacity .2s}.layer-dropdown-item.hidden-layer{opacity:.4}.layer-toggle-indicator{margin-left:auto;font-size:10px;color:var(--text-muted)}.legend-color{width:16px;height:16px;border-radius:4px;border:2px solid}.legend-color.presentation{background:#132639;border-color:#2680d9}.legend-color.application{background:#362617;border-color:#e88c30}.legend-color.data{background:#162d1d;border-color:#2eb85c}.legend-color.external{background:#2a1b32;border-color:#9f53c6}.legend-color.deployment{background:#321b1b;border-color:#c33}.loading{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-secondary);font-size:14px}.loading-spinner{width:24px;height:24px;border:3px solid var(--border-color);border-top-color:var(--accent-cyan);border-radius:50%;animation:spin 1s linear infinite;margin-right:12px}@keyframes spin{to{transform:rotate(360deg)}}.agent-panel{position:absolute;bottom:60px;left:16px;background:#090e1ae6;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:12px 16px;border-radius:10px;border:1px solid var(--border-color);font-size:11px;color:var(--text-primary);z-index:10;max-width:300px;box-shadow:0 2px 12px var(--shadow-color)}.agent-panel-title{font-weight:600;margin-bottom:8px;color:var(--text-muted);text-transform:uppercase;font-size:10px}.agent-item{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border-color)}.agent-item:last-child{border-bottom:none}.agent-dot{width:6px;height:6px;border-radius:50%}.agent-dot.active{background:var(--accent-green);animation:breathe 1.5s infinite}.agent-name{font-weight:500;color:var(--text-primary)}.agent-target{color:var(--text-muted);margin-left:auto}.flow-dropdown{min-width:240px}.flow-dot-inline{display:inline-block;width:8px;height:8px;border-radius:50%;flex-shrink:0}.toolbar-btn.has-active-flow{background:#20cfdf1a;border-color:#20cfdf4d;color:var(--accent-cyan);gap:6px}.toolbar-btn.has-hidden{color:var(--accent-amber)}.flow-category-header{display:flex;align-items:center;gap:6px;padding:6px 10px 4px;font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted)}.flow-dropdown-item{gap:10px!important}.flow-dropdown-item.active{background:#20cfdf1a!important;color:var(--accent-cyan)!important}.flow-dropdown-name{flex:1}.flow-clear{color:var(--accent-red)!important}.flow-progress-bar{position:absolute;bottom:16px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:#090e1af2;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--border-color);border-radius:12px;padding:10px 16px;z-index:15;max-width:90vw;box-shadow:0 4px 20px var(--shadow-color),var(--glow-cyan);animation:slide-up .3s ease-out}.flow-progress-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;animation:breathe 2s infinite}.flow-progress-name{font-size:12px;font-weight:600;color:var(--text-primary);white-space:nowrap;flex-shrink:0}.flow-progress-steps{display:flex;gap:4px;overflow-x:auto;max-width:500px}.flow-progress-step{padding:4px 8px;background:var(--bg-tertiary);border-radius:4px;font-size:10px;border-left:2px solid transparent;transition:all .3s;opacity:.4;color:var(--text-secondary);white-space:nowrap;flex-shrink:0}.flow-progress-step.active{opacity:1;background:var(--bg-hover);color:var(--text-primary)}.flow-progress-step.current{font-weight:600;box-shadow:0 1px 4px var(--shadow-color)}.flow-progress-controls{display:flex;gap:4px;flex-shrink:0;margin-left:4px}.flow-progress-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border-color);background:var(--bg-tertiary);border-radius:6px;cursor:pointer;font-size:12px;color:var(--text-secondary);transition:all .2s}.flow-progress-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.flow-progress-btn.stop{border-color:#f425254d;color:var(--accent-red)}.flow-progress-btn.stop:hover{background:#f4252526}.flow-hud-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:flex;align-items:center;justify-content:center;background:#070a13d9;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:flowHudFadeIn .2s ease-out}@keyframes flowHudFadeIn{0%{opacity:0}to{opacity:1}}.flow-hud-panel{width:90vw;height:85vh;max-width:1400px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 60px #20cfdf14,0 8px 32px #0006}.flow-hud-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border-color);flex-shrink:0}.flow-hud-title{display:flex;align-items:center;gap:10px;font-size:15px;font-weight:700;color:var(--text-primary);letter-spacing:.3px}.flow-hud-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.flow-hud-controls{display:flex;align-items:center;gap:6px}.flow-hud-btn{background:var(--bg-tertiary);border:1px solid var(--border-color);color:var(--text-primary);width:32px;height:32px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .15s}.flow-hud-btn:hover{background:var(--bg-hover);border-color:var(--accent-cyan)}.flow-hud-close{background:var(--bg-tertiary);border:1px solid var(--border-color);color:var(--text-muted);width:32px;height:32px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;transition:all .15s}.flow-hud-close:hover{background:#f4252526;border-color:var(--accent-red);color:var(--accent-red)}.flow-hud-description{padding:10px 20px;font-size:12px;color:var(--text-muted);border-bottom:1px solid var(--border-color);flex-shrink:0}.flow-hud-canvas{flex:1;min-height:0;position:relative}.flow-hud-canvas .react-flow__controls{bottom:10px;left:10px}.flow-hud-steps{display:flex;align-items:center;gap:8px;padding:14px 20px;border-top:1px solid var(--border-color);overflow-x:auto;flex-shrink:0}.flow-hud-step{display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:8px;font-size:11px;color:var(--text-muted);background:var(--bg-tertiary);border:1px solid var(--border-color);white-space:nowrap;transition:all .3s}.flow-hud-step.active{color:var(--text-primary);border-color:currentColor}.flow-hud-step.current{box-shadow:0 0 12px currentColor}.flow-hud-step-num{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:10px;font-weight:700;color:var(--text-primary);background:var(--border-color);flex-shrink:0;transition:background .3s}.git-repo-badge{display:inline-flex;align-items:center;padding:2px 8px;background:#2a1b32;border:1px solid hsl(280 50% 55% / .3);border-radius:4px;font-size:11px;font-family:JetBrains Mono,monospace;font-weight:500;color:#bf8cd9;text-decoration:none;transition:all .2s}.git-repo-badge:hover{background:#382442;border-color:#9f53c680}.save-panel{position:fixed;bottom:55px;left:50%;transform:translate(-50%);background:#20cfdf26;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:var(--text-primary);padding:12px 20px;border-radius:10px;border:1px solid var(--accent-cyan);display:flex;gap:16px;align-items:center;box-shadow:var(--glow-cyan);z-index:100;animation:slide-up .3s ease-out}@keyframes slide-up{0%{opacity:0;transform:translate(-50%) translateY(20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.save-panel-text{font-size:13px;font-weight:500}.react-flow__node.selected{outline:2px solid var(--accent-cyan);outline-offset:2px}.react-flow__handle{width:10px;height:10px;background:var(--accent-cyan);border:2px solid var(--bg-primary);opacity:0;transition:opacity .2s}.react-flow__node:hover .react-flow__handle,.react-flow__node.selected .react-flow__handle{opacity:1}.react-flow__handle:hover{transform:scale(1.2)}.clipboard-indicator{position:fixed;bottom:120px;left:50%;transform:translate(-50%);background:var(--bg-hover);color:var(--text-primary);padding:8px 16px;border-radius:6px;font-size:12px;border:1px solid var(--border-color);z-index:100;animation:fade-in-out 2s ease-in-out;pointer-events:none}@keyframes fade-in-out{0%,to{opacity:0;transform:translate(-50%) translateY(10px)}20%,80%{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes scan-line{0%{top:-100%}to{top:200%}}.stats-overlay{position:absolute;top:60px;right:16px;background:var(--bg-secondary);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:16px;border-radius:12px;border:1px solid var(--border-color);z-index:10;min-width:240px;box-shadow:var(--glow-cyan)}.stats-overlay-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.stats-overlay-title{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:1px;color:var(--accent-cyan)}.stats-scan-info{display:flex;flex-wrap:wrap;gap:6px 12px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid var(--border-color);font-size:11px;color:var(--text-muted)}.scan-info-item{white-space:nowrap}.scan-info-item:not(:last-child):after{content:"|";margin-left:12px;opacity:.3}.stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.stat-card{padding:10px;background:var(--bg-tertiary);border-radius:8px;border:1px solid var(--border-color)}.stat-value{font-size:20px;font-weight:700;color:var(--text-primary)}.stat-label{font-size:9px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-top:2px}.stat-card.highlight{border-color:var(--accent-cyan);box-shadow:var(--glow-cyan)}.validation-panel{position:absolute;top:16px;right:290px;background:var(--bg-secondary);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:16px;border-radius:12px;border:1px solid var(--border-color);z-index:10;width:280px;max-height:calc(100vh - 200px);overflow-y:auto;box-shadow:0 2px 12px var(--shadow-color)}.validation-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.validation-title{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:1px;color:var(--text-muted)}.violation-item{padding:10px;background:var(--bg-tertiary);border-radius:8px;margin-bottom:6px;border-left:3px solid;cursor:pointer;transition:all .2s}.violation-item:hover{background:var(--bg-hover)}.violation-item.error{border-left-color:var(--accent-red)}.violation-item.warn{border-left-color:var(--accent-amber)}.violation-rule{font-size:10px;font-weight:600;text-transform:uppercase;color:var(--text-muted);margin-bottom:4px}.violation-message{font-size:11px;color:var(--text-secondary)}.ops-panel{position:absolute;top:16px;right:16px;background:var(--bg-secondary);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--border-color);z-index:10;width:280px;max-height:calc(100vh - 200px);overflow-y:auto;box-shadow:0 2px 12px var(--shadow-color)}.ops-header{display:flex;justify-content:space-between;align-items:center;padding:10px 12px 0}.ops-section{padding:12px}.ops-empty{color:var(--text-muted);font-size:11px;text-align:center;padding:20px 12px}.ops-hint{display:block;margin-top:6px;font-family:JetBrains Mono,monospace;font-size:10px;color:var(--accent-cyan);opacity:.7}.patrol-sparkline-row{display:flex;align-items:center;gap:8px;margin-bottom:10px}.patrol-sparkline{display:flex;gap:2px;flex:1}.spark-dot{width:8px;height:16px;border-radius:2px;flex-shrink:0;transition:opacity .15s}.spark-dot.healthy{background:var(--accent-green);opacity:.7}.spark-dot.violation{background:var(--accent-red);opacity:.8}.spark-dot:hover{opacity:1}.patrol-health-pct{font-size:12px;font-weight:700;color:var(--text-primary);min-width:32px;text-align:right}.patrol-status-card{padding:10px;background:var(--bg-tertiary);border-radius:8px;border:1px solid var(--border-color);margin-bottom:8px}.patrol-status-card.violation{border-color:#f425254d}.patrol-status-card.healthy{border-color:#1abc554d}.patrol-status-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.patrol-badge{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;padding:2px 8px;border-radius:10px}.patrol-badge.healthy{background:#1abc5526;color:var(--accent-green)}.patrol-badge.violation{background:#f4252526;color:var(--accent-red)}.patrol-time{font-size:10px;color:var(--text-muted)}.patrol-counts{display:flex;gap:8px}.patrol-count{font-size:10px}.patrol-count.error{color:var(--accent-red)}.patrol-count.warn{color:var(--accent-amber)}.patrol-count.ok{color:var(--accent-green)}.patrol-violations{margin-bottom:8px}.patrol-violations-label{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:4px}.patrol-violation-item{padding:6px 8px;background:var(--bg-tertiary);border-radius:4px;margin-bottom:3px;border-left:2px solid;display:flex;gap:6px;align-items:baseline}.patrol-violation-item.error{border-left-color:var(--accent-red)}.patrol-violation-item.warn{border-left-color:var(--accent-amber)}.patrol-violation-item.resolved{border-left-color:var(--accent-green)}.patrol-v-rule{font-size:9px;font-weight:600;color:var(--text-muted);flex-shrink:0}.patrol-v-msg{font-size:10px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.patrol-summary{font-size:10px;color:var(--text-muted);text-align:center;padding-top:4px}.wf-item{border:1px solid var(--border-color);border-radius:8px;margin-bottom:6px;overflow:hidden}.wf-header{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;cursor:pointer;transition:background .15s}.wf-header:hover{background:var(--bg-hover)}.wf-header-left{display:flex;align-items:center;gap:6px;overflow:hidden}.wf-expand{font-size:11px;color:var(--text-muted);width:12px;flex-shrink:0}.wf-name{font-size:11px;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-tag{font-size:8px;color:var(--text-muted);background:var(--bg-tertiary);padding:1px 5px;border-radius:3px;flex-shrink:0}.wf-status{font-size:9px;font-weight:600;flex-shrink:0}.wf-status.completed{color:var(--accent-green)}.wf-status.running{color:var(--accent-amber)}.wf-status.failed{color:var(--accent-red)}.wf-detail{padding:0 10px 10px;border-top:1px solid var(--border-color)}.wf-desc{font-size:10px;color:var(--text-muted);padding:8px 0 6px}.wf-steps{display:flex;flex-direction:column;gap:3px}.wf-step{display:flex;align-items:center;gap:6px;font-size:10px;padding:3px 0}.wf-step-icon{font-size:10px;width:14px;text-align:center}.wf-step.completed .wf-step-icon{color:var(--accent-green)}.wf-step.running .wf-step-icon{color:var(--accent-amber)}.wf-step.failed .wf-step-icon{color:var(--accent-red)}.wf-step.pending .wf-step-icon{color:var(--text-muted)}.wf-step-id{color:var(--text-secondary)}.wf-step.completed .wf-step-id{color:var(--text-muted)}.wf-progress{display:flex;align-items:center;gap:8px;margin-top:6px}.wf-progress-bar{flex:1;height:4px;background:var(--bg-tertiary);border-radius:2px;overflow:hidden}.wf-progress-fill{height:100%;background:var(--accent-cyan);border-radius:2px;transition:width .3s ease}.wf-progress-label{font-size:10px;font-weight:600;color:var(--text-muted);min-width:28px;text-align:right}.wf-steps-preview{font-size:10px;color:var(--text-muted);font-family:JetBrains Mono,monospace;padding:4px 0}.wf-run-hint{font-size:9px;font-family:JetBrains Mono,monospace;color:var(--accent-cyan);opacity:.6;margin-top:6px}.wf-actions{display:flex;gap:6px;margin-top:8px}.wf-actions .panel-btn{flex:1}.wf-error{font-size:11px;color:var(--accent-red);background:#f425251a;border:1px solid hsl(0 90% 55% / .25);border-radius:6px;padding:6px 10px;margin-bottom:8px}.patrol-actions{display:flex;gap:6px;margin-bottom:10px}.patrol-actions .panel-btn{flex:1}.chat-panel{position:absolute;bottom:16px;right:16px;width:350px;height:400px;background:#090e1af2;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-color);border-radius:12px;display:flex;flex-direction:column;z-index:20;box-shadow:0 4px 24px var(--shadow-color),var(--glow-cyan);animation:slide-up-chat .2s ease-out}@keyframes slide-up-chat{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.chat-header{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid var(--border-color);flex-shrink:0}.chat-title{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--accent-cyan)}.chat-messages{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:8px;min-height:0}.chat-empty{color:var(--text-muted);font-size:12px;text-align:center;padding:40px 20px}.chat-message{max-width:85%;padding:8px 12px;border-radius:10px;font-size:12px;line-height:1.5;word-wrap:break-word;white-space:pre-wrap}.chat-message.user{align-self:flex-end;background:#20cfdf26;border:1px solid hsl(185 75% 50% / .25);color:var(--text-primary)}.chat-message.assistant{align-self:flex-start;background:var(--bg-tertiary);border:1px solid var(--border-color);color:var(--text-secondary)}.chat-message-content{font-family:JetBrains Mono,monospace}.chat-cursor{display:inline-block;width:6px;height:14px;background:var(--accent-cyan);margin-left:2px;vertical-align:text-bottom;animation:chat-blink .8s step-end infinite}@keyframes chat-blink{0%,to{opacity:1}50%{opacity:0}}.chat-input-bar{display:flex;gap:6px;padding:10px 12px;border-top:1px solid var(--border-color);flex-shrink:0}.chat-input{flex:1;height:32px;background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;padding:0 10px;font-size:12px;font-family:JetBrains Mono,monospace;color:var(--text-primary);outline:none;transition:border-color .2s}.chat-input::placeholder{color:var(--text-muted)}.chat-input:focus{border-color:var(--accent-cyan);box-shadow:0 0 0 2px #20cfdf26}.chat-send-btn,.chat-stop-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;border:1px solid var(--border-color);cursor:pointer;font-size:14px;font-weight:700;transition:all .2s;flex-shrink:0}.chat-send-btn{background:#20cfdf26;color:var(--accent-cyan);border-color:#20cfdf4d}.chat-send-btn:hover:not(:disabled){background:#20cfdf40}.chat-send-btn:disabled{opacity:.3;cursor:not-allowed}.chat-stop-btn{background:#f4252526;color:var(--accent-red);border-color:#f425254d;font-size:10px}.chat-stop-btn:hover{background:#f4252540}[data-theme=light] .arch-node{box-shadow:0 2px 12px #00000014,inset 0 1px #fff9}[data-theme=light] .arch-node:hover{box-shadow:0 4px 20px #0000001f,inset 0 1px #fff9}[data-theme=light] .arch-node:before{background:linear-gradient(90deg,transparent,rgba(255,255,255,.4),transparent)}[data-theme=light] .arch-node .node-tech-pill{background:#0000000a;border-color:#0000001a}[data-theme=light] .arch-node.presentation{background:linear-gradient(145deg,#e9f0f7,#d7e6f4);border-color:#428cd780;color:#19334d}[data-theme=light] .arch-node.presentation:hover{border-color:#428cd7;box-shadow:0 0 20px #428cd726,0 4px 20px #0000001f}[data-theme=light] .arch-node.presentation .node-tech-pill{color:#2e669e}[data-theme=light] .arch-node.application{background:linear-gradient(145deg,#f7f0e8,#f5e6d6);border-color:#df802080;color:#452e17}[data-theme=light] .arch-node.application:hover{border-color:#df8020;box-shadow:0 0 20px #df802026,0 4px 20px #0000001f}[data-theme=light] .arch-node.application .node-tech-pill{color:#8f5924}[data-theme=light] .arch-node.data{background:linear-gradient(145deg,#e6f4eb,#d5f1de);border-color:#2e9e5380;color:#1c4028}[data-theme=light] .arch-node.data:hover{border-color:#2e9e53;box-shadow:0 0 20px #2e9e5326,0 4px 20px #0000001f}[data-theme=light] .arch-node.data .node-tech-pill{color:#2a6f41}[data-theme=light] .arch-node.external{background:linear-gradient(145deg,#f1eaf5,#e9daf1);border-color:#9540bf80;color:#392145}[data-theme=light] .arch-node.external:hover{border-color:#9540bf;box-shadow:0 0 20px #9540bf26,0 4px 20px #0000001f}[data-theme=light] .arch-node.external .node-tech-pill{color:#743d8f}[data-theme=light] .arch-node.deployment{background:linear-gradient(145deg,#f7eded,#f4dddd);border-color:#be373780;color:#452121}[data-theme=light] .arch-node.deployment:hover{border-color:#be3737;box-shadow:0 0 20px #be373726,0 4px 20px #0000001f}[data-theme=light] .arch-node.deployment .node-tech-pill{color:#813131}[data-theme=light] .legend-color.presentation{background:#d9e6f2;border-color:#428cd7}[data-theme=light] .legend-color.application{background:#f2e6d9;border-color:#df8020}[data-theme=light] .legend-color.data{background:#dbf0e2;border-color:#2e9e53}[data-theme=light] .legend-color.external{background:#e8ddee;border-color:#9540bf}[data-theme=light] .legend-color.deployment{background:#f0dbdb;border-color:#be3737}[data-theme=light] .branding-header{background:#f6f7f9eb;border-bottom-color:#1295a126;box-shadow:0 1px 12px #1295a10f}[data-theme=light] .component-info-panel,[data-theme=light] .node-details-panel,[data-theme=light] .node-actions-panel,[data-theme=light] .hidden-nodes-panel,[data-theme=light] .agent-panel,[data-theme=light] .chat-panel{background:#f6f7f9eb;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}[data-theme=light] .flow-progress-bar{background:#f6f7f9f2;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}[data-theme=light] .save-panel{background:#1295a11a}[data-theme=light] ::-webkit-scrollbar-track{background:var(--bg-secondary)}[data-theme=light] ::-webkit-scrollbar-thumb{background:#bec4cf}[data-theme=light] ::-webkit-scrollbar-thumb:hover{background:#a1a9ba}[data-theme=light] .git-repo-badge{background:#efe7f3;border-color:#9540bf4d;color:#739}[data-theme=light] .git-repo-badge:hover{background:#e4d6eb;border-color:#9540bf80}[data-theme=light] .toolbar-btn.active{background:#1295a11a}[data-theme=light] .flow-progress-btn.stop{border-color:#d4111140}[data-theme=light] .flow-progress-btn.stop:hover{background:#d411111a}[data-theme=light] .react-flow__controls-button{background:var(--bg-secondary);border-color:var(--border-color);fill:var(--text-primary);color:var(--text-primary)}[data-theme=light] .react-flow__controls-button:hover{background:var(--bg-hover)}[data-theme=light] .react-flow__handle{border-color:var(--bg-primary)}[data-theme=light] .react-flow__node.selected .arch-node{box-shadow:0 0 0 2px #1295a159,0 4px 12px #0000001f}