diff --git a/package.json b/package.json
index 1bbdecd..8688e19 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
"preview": "vite preview",
"test": "vitest",
"server": "node server.js --dev",
- "dev": "concurrently \"npm start\" \"npm run server\"",
+ "dev": "concurrently \"npm start\" \"node --watch server.js --dev\"",
"build-image": "node scripts/build-image.js"
},
"engines": {
diff --git a/src/App.jsx b/src/App.jsx
index e3c1c8f..b007899 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -1,12 +1,9 @@
-import React, { useState, useEffect, useMemo } from "react";
+import React, { useState, useEffect } from "react";
import {
- ThemeProvider,
- createTheme,
CssBaseline,
Box,
- Container,
+ useColorScheme,
} from "@mui/material";
-import useMediaQuery from "@mui/material/useMediaQuery";
import Header from "./components/Header";
import Footer from "./components/Footer";
import MainPage from "./components/MainPage";
@@ -78,19 +75,14 @@ function App() {
"x-api-key": apiKey,
});
- const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
+ const { setMode } = useColorScheme();
- const muiTheme = useMemo(() => {
- return createTheme({
- cssVariables: true,
- colorSchemes: {
- light: true,
- dark: true,
- },
- });
- }, []);
// Load sample data from API on startup and setup periodic state checking
useEffect(() => {
+ // Sync initial theme from localStorage with MUI color scheme
+ const initialMode = theme === 'auto' ? 'system' : theme;
+ setMode(initialMode);
+
loadSampleData();
// Check for state changes every 5 seconds
@@ -156,20 +148,29 @@ function App() {
const handleThemeChange = (newTheme) => {
setTheme(newTheme);
+ const muiMode = newTheme === "auto" ? "system" : newTheme;
+ setMode(muiMode);
+ localStorage.setItem("theme", newTheme);
};
const handlePageChange = (newPage) => {
setCurrentPage(newPage);
};
+ const handleShellTypeChange = (newShellType) => {
+ setShellType(newShellType);
+ localStorage.setItem("jmespath-shell-type", newShellType);
+ };
+
return (
-
+ <>
@@ -188,6 +189,7 @@ function App() {
display: "flex",
flexDirection: "column",
minHeight: 0,
+ height: "100%", // Force height for children
}}
>
{currentPage === "main" ? (
@@ -205,14 +207,14 @@ function App() {
apiKey={apiKey}
onRegenerateApiKey={regenerateApiKey}
shellType={shellType}
- onShellTypeChange={setShellType}
+ onShellTypeChange={handleShellTypeChange}
/>
)}
-
+ >
);
}
diff --git a/src/components/ApiKeyPage.jsx b/src/components/ApiKeyPage.jsx
index bc85ddf..a1484cb 100644
--- a/src/components/ApiKeyPage.jsx
+++ b/src/components/ApiKeyPage.jsx
@@ -40,12 +40,11 @@ function CodeBlock({ code }) {
p: 2,
pr: 6,
bgcolor: "action.hover",
- fontFamily: "'JetBrains Mono', 'Fira Code', monospace",
+ fontFamily: "'Noto Sans Mono', monospace",
fontSize: "0.85rem",
whiteSpace: "pre-wrap",
wordBreak: "break-all",
position: "relative",
- borderRadius: 2,
borderColor: "divider",
}}
>
@@ -92,10 +91,10 @@ function ApiKeyPage({
};
return (
-
+
-
+
API Key Management
@@ -111,11 +110,11 @@ function ApiKeyPage({
slotProps={{
input: {
readOnly: true,
- style: { fontFamily: "'JetBrains Mono', 'Fira Code', monospace", fontSize: "0.9rem" },
+ style: { fontFamily: "'Noto Sans Mono', monospace", fontSize: "0.9rem" },
},
}}
variant="outlined"
- sx={{ "& .MuiOutlinedInput-root": { borderRadius: 4, bgcolor: "background.paper" } }}
+ sx={{ "& .MuiOutlinedInput-root": { bgcolor: "background.paper" } }}
/>
- 📡 Remote Upload API
+ Remote Upload API
+
-
+
+
Validate and test JMESPath expressions against JSON data in real-time.
Enter your JMESPath query and JSON data below to see the results
@@ -203,166 +213,196 @@ function MainPage({
-
-
- JMESPath Expression
-
-
-
-
- {showReloadButton && (
-
- }
- size="small"
- >
- New data available - Reload
-
-
- )}
+
+
+
+ JMESPath Expression
+
+
+
-
-
+
+
-
-
+
+
JSON Input
+ {showReloadButton && (
+ }
+ size="small"
+ sx={{
+ ml: 1,
+ px: 1,
+ py: 0.25,
+ fontSize: "0.65rem",
+ textTransform: "none",
+ whiteSpace: "nowrap",
+ minWidth: "auto",
+ }}
+ >
+ Reload data
+
+ )}
-
+
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
-
+
{jsonError && (
-
+
{jsonError}
)}
@@ -370,21 +410,23 @@ function MainPage({
-
+
-
+
diff --git a/src/index.css b/src/index.css
index 793db93..e7b4a67 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,6 +1,11 @@
+* {
+ box-sizing: border-box;
+}
+
body {
margin: 0;
background-color: #f8f9fa;
+ overflow: hidden;
}
code {
diff --git a/src/index.jsx b/src/index.jsx
index 607f8fe..d315afb 100644
--- a/src/index.jsx
+++ b/src/index.jsx
@@ -1,11 +1,15 @@
import React from "react";
import ReactDOM from "react-dom/client";
+import { ThemeProvider } from "@mui/material";
+import theme from "./theme";
import "./index.css";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
-
+
+
+
);
\ No newline at end of file
diff --git a/src/theme.js b/src/theme.js
new file mode 100644
index 0000000..ea68413
--- /dev/null
+++ b/src/theme.js
@@ -0,0 +1,13 @@
+import { createTheme } from "@mui/material";
+
+const theme = createTheme({
+ cssVariables: {
+ colorSchemeSelector: 'class',
+ },
+ colorSchemes: {
+ light: true,
+ dark: true,
+ },
+});
+
+export default theme;