= ({
{share.timeMachine ? (
-
+
Enabled {share.timeMachineMaxSize ? `(${share.timeMachineMaxSize})` : ''}
@@ -175,7 +175,7 @@ export const SharesView: React.FC = ({
Allowed Clients:
{exp.clients.map((c, i) => (
-
+
{c.subnet} ({c.options})
))}
@@ -200,7 +200,7 @@ export const SharesView: React.FC = ({
value={newShareName}
onChange={(e) => setNewShareName(e.target.value)}
placeholder="e.g. photos, documents"
- className="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl text-white focus:outline-none focus:border-emerald-500 font-mono"
+ className="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl text-white focus:outline-none focus:border-cyan-500 font-mono"
required
/>
@@ -212,7 +212,7 @@ export const SharesView: React.FC = ({
value={newSharePath}
onChange={(e) => setNewSharePath(e.target.value)}
placeholder="/tank/..."
- className="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl text-white focus:outline-none focus:border-emerald-500 font-mono"
+ className="w-full px-3 py-2 bg-slate-950 border border-slate-800 rounded-xl text-white focus:outline-none focus:border-cyan-500 font-mono"
required
/>
@@ -226,7 +226,7 @@ export const SharesView: React.FC = ({
type="checkbox"
checked={newShareGuest}
onChange={(e) => setNewShareGuest(e.target.checked)}
- className="h-4 w-4 rounded accent-emerald-500"
+ className="h-4 w-4 rounded accent-cyan-500"
/>
@@ -240,7 +240,7 @@ export const SharesView: React.FC = ({
type="checkbox"
checked={newShareTimeMachine}
onChange={(e) => setNewShareTimeMachine(e.target.checked)}
- className="h-4 w-4 rounded accent-emerald-500"
+ className="h-4 w-4 rounded accent-cyan-500"
/>
@@ -268,7 +268,7 @@ export const SharesView: React.FC = ({
diff --git a/src/views/StorageView.tsx b/src/views/StorageView.tsx
index 2e9750d..792100b 100644
--- a/src/views/StorageView.tsx
+++ b/src/views/StorageView.tsx
@@ -69,7 +69,7 @@ export const StorageView: React.FC = ({
onClick={() => setActiveSubTab('pools')}
className={`px-3 py-1.5 rounded-lg text-xs font-medium transition ${
activeSubTab === 'pools'
- ? 'bg-emerald-600 text-white shadow-sm'
+ ? 'bg-cyan-600 text-white shadow-sm'
: 'text-slate-400 hover:text-white'
}`}
>
@@ -79,7 +79,7 @@ export const StorageView: React.FC = ({
onClick={() => setActiveSubTab('datasets')}
className={`px-3 py-1.5 rounded-lg text-xs font-medium transition ${
activeSubTab === 'datasets'
- ? 'bg-emerald-600 text-white shadow-sm'
+ ? 'bg-cyan-600 text-white shadow-sm'
: 'text-slate-400 hover:text-white'
}`}
>
@@ -89,7 +89,7 @@ export const StorageView: React.FC = ({
onClick={() => setActiveSubTab('snapshots')}
className={`px-3 py-1.5 rounded-lg text-xs font-medium transition ${
activeSubTab === 'snapshots'
- ? 'bg-emerald-600 text-white shadow-sm'
+ ? 'bg-cyan-600 text-white shadow-sm'
: 'text-slate-400 hover:text-white'
}`}
>
@@ -112,8 +112,8 @@ export const StorageView: React.FC = ({
{importSuccess && (
-
-
+
+
{importSuccess}
)}
@@ -125,13 +125,13 @@ export const StorageView: React.FC = ({
-
+
{pool.name}
-
+
{pool.health}
@@ -160,12 +160,33 @@ export const StorageView: React.FC = ({
+ {/* Live Pool I/O Telemetry */}
+
+
+
+
+ Live Pool Bandwidth & IOPS
+
+ 3,420 Read IOPS · 1,180 Write IOPS
+
+
+ {[24, 45, 18, 62, 88, 142, 95, 30, 48, 70, 85, 40, 55, 90, 60, 75, 110, 85, 95, 120].map((val, i) => (
+
+ ))}
+
+
+
{/* Status summary */}
Last Scrub: {pool.scanStatus || 'Completed with 0 errors'}
@@ -181,7 +202,7 @@ export const StorageView: React.FC = ({
-
+
ZFS Datasets & Mountpoints
Total {datasets.length} datasets
@@ -208,7 +229,7 @@ export const StorageView: React.FC = ({
{ds.name}
|
{ds.mountpoint} |
- {ds.used} |
+ {ds.used} |
{ds.available} |
@@ -232,7 +253,7 @@ export const StorageView: React.FC = ({
-
+
ZFS Point-in-Time Snapshots
Total {snapshots.length} snapshots
@@ -255,7 +276,7 @@ export const StorageView: React.FC = ({
{snap.name} |
{snap.dataset} |
{snap.creationTime} |
- {snap.usedBytes} |
+ {snap.usedBytes} |
| |