diff --git a/example.txt b/example.txt
new file mode 100644
index 0000000..e69de29
diff --git a/packages/frontend/index.html b/packages/frontend/index.html
index a900f4b..b5c9700 100644
--- a/packages/frontend/index.html
+++ b/packages/frontend/index.html
@@ -18,7 +18,7 @@
diff --git a/packages/frontend/src/index.css b/packages/frontend/src/index.css
index 3a0ee25..9d0e4e9 100644
--- a/packages/frontend/src/index.css
+++ b/packages/frontend/src/index.css
@@ -1,57 +1,60 @@
:root {
color-scheme: dark;
- /* ── Floci dark palette ── */
- --bg: #0f1117;
- --surface: #1a1d2e;
- --elevated: #12152b;
- --raised: #1e2245;
- --raised-hover: #252b52;
- --border: rgba(92, 107, 192, 0.25);
- --border-faint: rgba(92, 107, 192, 0.15);
- --border-lighter: rgba(92, 107, 192, 0.08);
- --border-hover: rgba(92, 107, 192, 0.45);
- --active-nav-bg: rgba(92, 107, 192, 0.18);
-
- --text: #e8eaf6;
+ /* ── Floci AWS Dark Palette (Black, Slate, Crisp White, and Blue) ── */
+ --bg: #090d16;
+ --surface: #111726;
+ --elevated: #161f33;
+ --raised: #1c263d;
+ --raised-hover: #23314d;
+ --border: #26354d;
+ --border-faint: #1c283c;
+ --border-lighter: #151f30;
+ --border-hover: #38bdf8;
+ --active-nav-bg: rgba(217, 119, 87, 0.14);
+
+ --text: #e2e8f0;
--text-bright: #ffffff;
- --text-2: #9fa8c7;
- --text-3: #5c6695;
- --text-nav: #b0b8d8;
-
- /* Floci brand indigo (floci.io) */
- --accent: #7a7fd6;
- --accent-tint: rgba(122, 127, 214, 0.16);
- --accent-tint-faint: rgba(122, 127, 214, 0.07);
- --accent-tint-border: rgba(122, 127, 214, 0.28);
-
- /* Floci indigo interactive */
- --link: #7986cb;
- --link-tint: rgba(121, 134, 203, 0.08);
- --link-tint-hover: rgba(121, 134, 203, 0.14);
- --link-tint-border: rgba(121, 134, 203, 0.22);
-
- --hover: rgba(255, 255, 255, 0.04);
- --hover-md: rgba(255, 255, 255, 0.06);
- --hover-lg: rgba(255, 255, 255, 0.07);
- --input-border: rgba(255, 255, 255, 0.12);
- --input-bg: rgba(255, 255, 255, 0.06);
- --connection-bg: rgba(255, 255, 255, 0.03);
- --kbd-border: rgba(255, 255, 255, 0.1);
- --scrollbar-thumb: rgba(92, 107, 192, 0.3);
- --service-card-bg: rgba(15, 17, 23, 0.92);
- --service-card-hover: rgba(26, 29, 46, 0.96);
- --fn-card-hover: rgba(30, 34, 69, 0.9);
- --bulk-bar-bg: rgba(57, 73, 171, 0.35);
- --bulk-bar-border: #5c6bc0;
- --bulk-bar-text: #e8eaf6;
+ --text-2: #94a3b8;
+ --text-3: #64748b;
+ --text-nav: #cbd5e1;
+
+ /* Claude Code brand warm terracotta orange (#D97757) */
+ --accent: #d97757;
+ --accent-hover: #c46545;
+ --accent-active: #b05436;
+ --accent-tint: rgba(217, 119, 87, 0.14);
+ --accent-tint-faint: rgba(217, 119, 87, 0.08);
+ --accent-tint-border: rgba(217, 119, 87, 0.36);
+
+ /* AWS console dark blue */
+ --link: #539fe5;
+ --link-hover: #7db9f0;
+ --link-tint: rgba(83, 159, 229, 0.12);
+ --link-tint-hover: rgba(83, 159, 229, 0.2);
+ --link-tint-border: rgba(83, 159, 229, 0.35);
+
+ --hover: rgba(255, 255, 255, 0.05);
+ --hover-md: rgba(255, 255, 255, 0.08);
+ --hover-lg: rgba(255, 255, 255, 0.11);
+ --input-border: #2c3c54;
+ --input-bg: #0d1322;
+ --connection-bg: #111726;
+ --kbd-border: #33435c;
+ --scrollbar-thumb: #2d3e58;
+ --service-card-bg: #141c2e;
+ --service-card-hover: #19233a;
+ --fn-card-hover: #1c2740;
+ --bulk-bar-bg: rgba(217, 119, 87, 0.2);
+ --bulk-bar-border: #d97757;
+ --bulk-bar-text: #ffffff;
/* ── Sidebar geometry ── */
- --sidebar-w: 220px;
+ --sidebar-w: 230px;
--sidebar-rail-w: 52px;
- --sidebar-overlay-shadow: 6px 0 32px rgba(0, 0, 0, 0.45);
+ --sidebar-overlay-shadow: 6px 0 32px rgba(0, 0, 0, 0.6);
- font-family: Sora, Inter, system-ui, sans-serif;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: var(--bg);
color: var(--text);
}
@@ -59,53 +62,55 @@
[data-theme="light"] {
color-scheme: light;
- /* ── Floci light palette ── */
- --bg: #f4f6fc;
+ /* ── Floci AWS Light Palette (White & Enterprise Slate) ── */
+ --bg: #f2f4f8;
--surface: #ffffff;
--elevated: #ffffff;
- --raised: #eef0f8;
- --raised-hover: #e4e7f5;
- --border: rgba(92, 107, 192, 0.22);
- --border-faint: rgba(92, 107, 192, 0.14);
- --border-lighter: rgba(92, 107, 192, 0.08);
- --border-hover: rgba(92, 107, 192, 0.45);
- --active-nav-bg: rgba(57, 73, 171, 0.09);
-
- --text: #263052;
- --text-bright: #12173e;
- --text-2: #4a5296;
- --text-3: #6b74a8;
- --text-nav: #4a5296;
-
- /* Floci brand indigo (floci.io, light) */
- --accent: #5559a7;
- --accent-tint: rgba(85, 89, 167, 0.12);
- --accent-tint-faint: rgba(85, 89, 167, 0.06);
- --accent-tint-border: rgba(85, 89, 167, 0.25);
-
- /* Floci indigo interactive (light) */
- --link: #3949ab;
- --link-tint: rgba(57, 73, 171, 0.07);
- --link-tint-hover: rgba(57, 73, 171, 0.12);
- --link-tint-border: rgba(57, 73, 171, 0.22);
+ --raised: #f8fafc;
+ --raised-hover: #edf2f7;
+ --border: #e2e8f0;
+ --border-faint: #edf2f7;
+ --border-lighter: #f1f5f9;
+ --border-hover: #cbd5e1;
+ --active-nav-bg: rgba(217, 119, 87, 0.1);
+
+ --text: #1e293b;
+ --text-bright: #0f172a;
+ --text-2: #475569;
+ --text-3: #94a3b8;
+ --text-nav: #334155;
+
+ /* Claude Code brand warm terracotta orange (light mode) */
+ --accent: #d97757;
+ --accent-hover: #c46545;
+ --accent-active: #b05436;
+ --accent-tint: rgba(217, 119, 87, 0.1);
+ --accent-tint-faint: rgba(217, 119, 87, 0.05);
+ --accent-tint-border: rgba(217, 119, 87, 0.3);
+
+ /* AWS console interactive blue (light) */
+ --link: #0972d3;
+ --link-hover: #035299;
+ --link-tint: rgba(9, 114, 211, 0.08);
+ --link-tint-hover: rgba(9, 114, 211, 0.14);
+ --link-tint-border: rgba(9, 114, 211, 0.25);
--hover: rgba(0, 0, 0, 0.04);
- --hover-md: rgba(0, 0, 0, 0.05);
- --hover-lg: rgba(0, 0, 0, 0.06);
- --input-border: rgba(0, 0, 0, 0.15);
- --input-bg: rgba(0, 0, 0, 0.04);
- --connection-bg: rgba(0, 0, 0, 0.02);
- --kbd-border: rgba(0, 0, 0, 0.15);
- --scrollbar-thumb: rgba(92, 107, 192, 0.3);
+ --hover-md: rgba(0, 0, 0, 0.06);
+ --hover-lg: rgba(0, 0, 0, 0.08);
+ --input-border: #cbd5e1;
+ --input-bg: #ffffff;
+ --connection-bg: #f8fafc;
+ --kbd-border: #cbd5e1;
+ --scrollbar-thumb: #cbd5e1;
--service-card-bg: #ffffff;
- --service-card-hover: #f5f7ff;
- --fn-card-hover: #eff1ff;
- --bulk-bar-bg: rgba(57, 73, 171, 0.1);
- --bulk-bar-border: #3949ab;
- --bulk-bar-text: #1a237e;
+ --service-card-hover: #f8fafc;
+ --fn-card-hover: #f1f5f9;
+ --bulk-bar-bg: rgba(217, 119, 87, 0.12);
+ --bulk-bar-border: #d97757;
+ --bulk-bar-text: #9a3412;
- /* 45% black at 32px blur is far too heavy under a white panel. */
- --sidebar-overlay-shadow: 6px 0 28px rgba(38, 48, 82, 0.18);
+ --sidebar-overlay-shadow: 6px 0 28px rgba(15, 23, 42, 0.15);
}
* {
@@ -140,7 +145,7 @@ button {
code,
pre,
.mono {
- font-family: "Space Mono", "JetBrains Mono", "Fira Code", Consolas, monospace;
+ font-family: "JetBrains Mono", "Space Mono", Consolas, monospace;
}
::-webkit-scrollbar {
@@ -291,8 +296,12 @@ pre,
.service-icon {
display: grid;
place-items: center;
+ width: 38px;
+ height: 38px;
+ min-width: 38px;
border-radius: 6px;
background: var(--accent-tint);
+ border: 1px solid var(--accent-tint-border);
color: var(--accent);
}
@@ -352,7 +361,8 @@ pre,
.nav-link.active {
color: var(--text-bright);
background: var(--active-nav-bg);
- box-shadow: inset 2px 0 var(--accent);
+ box-shadow: inset 3px 0 0 var(--accent);
+ font-weight: 600;
}
.nav-soon {
@@ -414,45 +424,54 @@ pre,
.search input {
width: 100%;
- height: 28px;
- padding: 0 86px 0 32px;
+ height: 30px;
+ padding: 0 86px 0 34px;
border: 1px solid var(--input-border);
- border-radius: 4px;
+ border-radius: 6px;
outline: none;
background: var(--input-bg);
color: var(--text);
font-size: 12px;
+ transition: border-color 140ms ease, box-shadow 140ms ease;
+}
+
+.search input:focus {
+ border-color: var(--accent);
+ box-shadow: 0 0 0 2px var(--accent-tint);
}
.search svg {
position: absolute;
- top: 7px;
- left: 10px;
+ top: 8px;
+ left: 11px;
color: var(--text-2);
}
.kbd {
position: absolute;
right: 8px;
- top: 5px;
+ top: 6px;
padding: 1px 6px;
border: 1px solid var(--kbd-border);
border-radius: 4px;
+ background: var(--hover-md);
color: var(--text-2);
- font-size: 11px;
+ font-family: "JetBrains Mono", Consolas, monospace;
+ font-size: 10px;
+ font-weight: 600;
}
.connection {
display: inline-flex;
align-items: center;
- gap: 7px;
+ gap: 8px;
color: var(--text-2);
font-size: 12px;
min-width: 0;
max-width: min(460px, 45vw);
- padding: 4px 8px;
+ padding: 5px 10px;
border: 1px solid var(--border);
- border-radius: 4px;
+ border-radius: 6px;
background: var(--connection-bg);
}
@@ -474,6 +493,8 @@ pre,
min-width: 0;
overflow: hidden;
color: var(--text-2);
+ font-family: "JetBrains Mono", Consolas, monospace;
+ font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
@@ -490,18 +511,20 @@ pre,
display: inline-flex;
align-items: center;
gap: 8px;
- height: 30px;
- padding: 0 8px;
+ height: 32px;
+ padding: 0 10px;
border: 1px solid var(--border);
- border-radius: 4px;
+ border-radius: 6px;
background: var(--connection-bg);
color: var(--text);
cursor: pointer;
font-size: 12px;
+ transition: border-color 140ms ease, background 140ms ease;
}
.account-trigger:hover {
- border-color: var(--text-2);
+ border-color: var(--border-hover);
+ background: var(--hover);
}
.account-meta {
@@ -516,11 +539,14 @@ pre,
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--text-2);
+ font-weight: 600;
}
.account-value {
+ font-family: "JetBrains Mono", Consolas, monospace;
font-variant-numeric: tabular-nums;
font-weight: 600;
+ font-size: 11px;
}
.account-popover {
@@ -721,8 +747,9 @@ pre,
.table-panel {
border: 1px solid var(--border);
background: var(--elevated);
- border-radius: 4px;
+ border-radius: 6px;
overflow: hidden;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.table-panel .input-row {
@@ -738,15 +765,16 @@ pre,
display: flex;
align-items: center;
gap: 8px;
- padding: 10px 16px;
+ padding: 11px 16px;
border-bottom: 1px solid var(--border);
+ background: var(--raised);
}
.widget-header h3 {
margin: 0;
- color: var(--text);
+ color: var(--text-bright);
font-size: 13px;
- font-weight: 500;
+ font-weight: 600;
}
.widget-body {
@@ -772,28 +800,30 @@ pre,
.link-button:hover {
text-decoration: underline;
+ color: var(--link-hover);
}
.service-card {
display: block;
- padding: 18px;
+ padding: 16px 18px;
border: 1px solid var(--border);
- border-radius: 4px;
+ border-radius: 6px;
background: var(--service-card-bg);
color: inherit;
text-decoration: none;
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.25);
- transition: transform 160ms, border-color 160ms, background 160ms;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.04);
+ transition: transform 160ms cubic-bezier(0.4, 0, 0.2, 1), border-color 160ms ease, box-shadow 160ms ease, background 160ms ease;
}
.service-card:hover {
transform: translateY(-2px);
- border-color: var(--border-hover);
+ border-color: var(--accent);
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12), 0 0 0 1px var(--accent-tint-border);
background: var(--service-card-hover);
}
.service-card.offline {
- opacity: 0.76;
+ opacity: 0.65;
}
.service-card-header {
@@ -803,16 +833,21 @@ pre,
}
.service-icon {
- width: 52px;
- height: 52px;
+ width: 38px;
+ height: 38px;
+ min-width: 38px;
border-radius: 6px;
+ background: var(--accent-tint);
+ border: 1px solid var(--accent-tint-border);
+ color: var(--accent);
}
.service-card h3 {
- margin: 0;
- color: var(--text);
- font-size: 18px;
- font-weight: 500;
+ margin: 0 0 3px;
+ color: var(--text-bright);
+ font-size: 15px;
+ font-weight: 600;
+ line-height: 1.25;
}
.metric-grid {
@@ -829,49 +864,66 @@ pre,
.metric-label {
margin: 0;
color: var(--text-3);
- font-size: 12px;
+ font-size: 11px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
}
.metric-value {
margin: 2px 0 0;
- color: var(--text);
- font-size: 14px;
- font-weight: 500;
+ color: var(--text-bright);
+ font-size: 15px;
+ font-weight: 600;
+ font-family: "JetBrains Mono", Consolas, monospace;
}
.status {
display: inline-flex;
align-items: center;
- gap: 6px;
- font-size: 12px;
+ gap: 5px;
+ font-size: 11px;
+ font-weight: 500;
+ padding: 1px 7px;
+ border-radius: 9999px;
+ line-height: 1.35;
}
.status::before {
content: "";
- width: 7px;
- height: 7px;
+ width: 6px;
+ height: 6px;
border-radius: 50%;
background: #6b7280;
}
.status.healthy {
- color: #4ade80;
+ color: #10b981;
+ background: rgba(16, 185, 129, 0.12);
+ border: 1px solid rgba(16, 185, 129, 0.25);
}
.status.healthy::before {
- background: #4ade80;
+ background: #10b981;
+ box-shadow: 0 0 5px rgba(16, 185, 129, 0.6);
}
+.status.unknown,
.status.degraded {
color: #f59e0b;
+ background: rgba(245, 158, 11, 0.12);
+ border: 1px solid rgba(245, 158, 11, 0.25);
}
+.status.unknown::before,
.status.degraded::before {
background: #f59e0b;
}
.status.unavailable {
color: #ef4444;
+ background: rgba(239, 68, 68, 0.12);
+ border: 1px solid rgba(239, 68, 68, 0.25);
}
.status.unavailable::before {
@@ -1143,17 +1195,26 @@ pre,
align-items: center;
gap: 8px;
border: 1px solid var(--border);
- border-radius: 4px;
- background: var(--raised);
+ border-radius: 6px;
+ background: var(--surface);
color: var(--text);
- padding: 0 12px;
+ padding: 0 14px;
font-size: 12px;
+ font-weight: 500;
+ transition: all 140ms ease;
+}
+
+.selector-pill:hover:not(:disabled) {
+ border-color: var(--border-hover);
+ background: var(--hover-md);
}
.selector-pill.active {
- border-color: var(--link);
- background: var(--link-tint-hover);
+ border-color: var(--accent);
+ background: var(--accent-tint);
color: var(--text-bright);
+ font-weight: 600;
+ box-shadow: 0 0 0 1px var(--accent);
}
.selector-pill.soon {
@@ -2490,14 +2551,16 @@ pre,
justify-content: space-between;
gap: 18px;
border: 1px solid var(--border);
- border-left-width: 3px;
- border-radius: 4px;
+ border-left-width: 4px;
+ border-left-color: var(--accent);
+ border-radius: 6px;
background: var(--elevated);
- padding: 16px;
+ padding: 16px 20px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.console-provider-banner.ready {
- border-left-color: #22c55e;
+ border-left-color: #10b981;
}
.console-provider-banner.pending {
@@ -2508,16 +2571,27 @@ pre,
border-left-color: #ef4444;
}
+.console-provider-banner .eyebrow {
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.06em;
+ text-transform: uppercase;
+ color: var(--accent);
+ margin: 0 0 2px;
+}
+
.console-provider-banner h3 {
margin: 2px 0 4px;
color: var(--text-bright);
- font-size: 20px;
+ font-size: 18px;
+ font-weight: 700;
}
.console-provider-banner p {
margin: 0;
color: var(--text-2);
font-size: 13px;
+ line-height: 1.4;
}
.console-provider-actions {
@@ -2530,8 +2604,9 @@ pre,
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
border: 1px solid var(--border);
- border-radius: 4px;
+ border-radius: 6px;
background: var(--elevated);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
overflow: hidden;
}
@@ -2539,31 +2614,32 @@ pre,
position: relative;
display: grid;
gap: 4px;
- min-height: 82px;
+ min-height: 84px;
border-right: 1px solid var(--border);
- padding: 14px 16px;
+ padding: 14px 18px;
}
.summary-tile svg {
position: absolute;
top: 14px;
- right: 14px;
+ right: 16px;
color: var(--link);
+ opacity: 0.85;
}
.summary-tile.ready svg,
.summary-tile.ready strong {
- color: #4ade80;
+ color: #10b981;
}
.summary-tile.pending svg,
.summary-tile.pending strong {
- color: #fbbf24;
+ color: #f59e0b;
}
.summary-tile.unavailable svg,
.summary-tile.unavailable strong {
- color: #f87171;
+ color: #ef4444;
}
.summary-tile:last-child {
@@ -2574,14 +2650,16 @@ pre,
color: var(--text-2);
font-size: 10px;
font-weight: 700;
- letter-spacing: 0.08em;
+ letter-spacing: 0.07em;
text-transform: uppercase;
}
.summary-tile strong {
color: var(--text-bright);
- font-size: 20px;
+ font-size: 22px;
font-weight: 700;
+ font-family: "JetBrains Mono", Consolas, monospace;
+ letter-spacing: -0.01em;
}
.summary-tile small {
@@ -2595,23 +2673,24 @@ pre,
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0;
border: 1px solid var(--border);
- border-radius: 4px;
+ border-radius: 6px;
background: var(--elevated);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
overflow: hidden;
}
.console-flow-step {
position: relative;
display: grid;
- grid-template-columns: 22px minmax(0, 1fr);
+ grid-template-columns: 24px minmax(0, 1fr);
grid-template-areas:
"icon label"
"icon value";
- gap: 2px 8px;
+ gap: 2px 10px;
align-content: center;
- min-height: 58px;
+ min-height: 56px;
border-right: 1px solid var(--border);
- padding: 10px 14px;
+ padding: 10px 16px;
}
.console-flow-step:last-child {
@@ -2635,7 +2714,7 @@ pre,
.console-flow-step svg {
grid-area: icon;
align-self: center;
- color: var(--link);
+ color: var(--accent);
}
.console-flow-step span {
@@ -2643,7 +2722,7 @@ pre,
color: var(--text-2);
font-size: 10px;
font-weight: 700;
- letter-spacing: 0.08em;
+ letter-spacing: 0.07em;
text-transform: uppercase;
}
@@ -2652,6 +2731,8 @@ pre,
overflow: hidden;
color: var(--text-bright);
font-size: 12px;
+ font-weight: 600;
+ font-family: "JetBrains Mono", Consolas, monospace;
text-overflow: ellipsis;
white-space: nowrap;
}
@@ -2659,11 +2740,11 @@ pre,
.console-service-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
- gap: 14px;
+ gap: 16px;
}
.console-service-card {
- min-height: 150px;
+ min-height: 140px;
text-align: left;
}
@@ -2673,24 +2754,32 @@ button.console-service-card {
}
.console-service-card.blocked {
- opacity: 0.9;
+ opacity: 0.85;
}
.console-service-meta {
display: grid;
- gap: 3px;
- margin-top: 18px;
+ gap: 2px;
+ margin-top: 14px;
+ padding-top: 12px;
+ border-top: 1px solid var(--border-faint);
}
.console-service-meta strong {
color: var(--text-bright);
- font-size: 26px;
- line-height: 1;
+ font-size: 24px;
+ font-weight: 700;
+ font-family: "JetBrains Mono", Consolas, monospace;
+ line-height: 1.1;
+ letter-spacing: -0.02em;
}
.console-service-meta span {
color: var(--text-2);
- font-size: 12px;
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.05em;
+ text-transform: uppercase;
}
.cloud-coming-soon h3 {
@@ -3211,14 +3300,18 @@ button.console-service-card {
}
.button.primary {
- background: #3949ab;
- border-color: #3949ab;
- color: white;
+ background: var(--accent);
+ border-color: var(--accent);
+ color: #ffffff;
+ font-weight: 600;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
.button.primary:hover {
- background: #5c6bc0;
- border-color: #5c6bc0;
+ background: var(--accent-hover);
+ border-color: var(--accent-hover);
+ color: #ffffff;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.button.danger {