Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ dist
dist-ssr
*.local
*-lock.json
pnpm-lock.yaml

# Editor directories and files
.vscode
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
Expand Down
21 changes: 0 additions & 21 deletions .storybook/document.tsx

This file was deleted.

26 changes: 13 additions & 13 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-onboarding",
"@storybook/addon-essentials",
"@storybook/addon-interactions",
"@storybook/addon-styling-webpack",
],
framework: {
name: "@storybook/react-vite",
options: {},
},
staticDirs: ["../public"],
previewHead: (head) => `
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-onboarding",
"@storybook/addon-essentials",
"@storybook/addon-interactions",
"@storybook/addon-styling-webpack",
],
framework: {
name: "@storybook/react-vite",
options: {},
},
staticDirs: ["../public"],
previewHead: head => `
${head}
${`<link
href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp"
Expand Down
3 changes: 2 additions & 1 deletion .storybook/manager.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { addons } from "@storybook/manager-api";

import theme from "./theme";

addons.setConfig({
theme: theme,
theme,
});
2 changes: 1 addition & 1 deletion .storybook/preview.css
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@
/* Style for the value column in the props panel */
#storybook-panel-root .css-1wjen9k .css-1p3m7a8 {
min-width: 300px !important;
}
}
171 changes: 87 additions & 84 deletions .storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,102 +1,105 @@
import React, { useState, useEffect } from "react";
import type { Preview } from "@storybook/react";

import "../src/style/main.css";
import "@fontsource/inter";

import "./preview.css";

import type { Preview } from "@storybook/react";
import React, { useEffect, useState } from "react";

const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
expanded: true,
},
layout: "fullscreen",
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
expanded: true,
},
layout: "fullscreen",
},
};

const withJsonEditor = (Story, context) => {
const { args } = context;
const { oldValue, newValue } = args;
function withJsonEditor(Story, context) {
const { args } = context;
const { oldValue, newValue } = args;

const [oldJson, setOldJson] = useState(JSON.stringify(oldValue, null, 2));
const [newJson, setNewJson] = useState(JSON.stringify(newValue, null, 2));
const [oldJsonError, setOldJsonError] = useState("");
const [newJsonError, setNewJsonError] = useState("");
const [parsedOldValue, setParsedOldValue] = useState(oldValue);
const [parsedNewValue, setParsedNewValue] = useState(newValue);
const [oldJson, setOldJson] = useState(JSON.stringify(oldValue, null, 2));
const [newJson, setNewJson] = useState(JSON.stringify(newValue, null, 2));
const [oldJsonError, setOldJsonError] = useState("");
const [newJsonError, setNewJsonError] = useState("");
const [parsedOldValue, setParsedOldValue] = useState(oldValue);
const [parsedNewValue, setParsedNewValue] = useState(newValue);

const validateJson = (jsonString: string) => {
try {
return { error: "", parsed: JSON.parse(jsonString) };
} catch (error) {
return { error: "Invalid JSON format", parsed: null };
}
};
const validateJson = (jsonString: string) => {
try {
return { error: "", parsed: JSON.parse(jsonString) };
}
catch {
return { error: "Invalid JSON format", parsed: null };
}
};

useEffect(() => {
const { error, parsed } = validateJson(oldJson);
setOldJsonError(error);
if (!error) {
setParsedOldValue(parsed);
}
}, [oldJson]);
useEffect(() => {
const { error, parsed } = validateJson(oldJson);
setOldJsonError(error);
if (!error) {
setParsedOldValue(parsed);
}
}, [oldJson]);

useEffect(() => {
const { error, parsed } = validateJson(newJson);
setNewJsonError(error);
if (!error) {
setParsedNewValue(parsed);
}
}, [newJson]);
useEffect(() => {
const { error, parsed } = validateJson(newJson);
setNewJsonError(error);
if (!error) {
setParsedNewValue(parsed);
}
}, [newJson]);

return (
<div style={{ display: "flex", flexDirection: "column", gap: "20px" }}>
<div style={{ display: "flex", gap: "20px" }}>
<div style={{ flex: 1 }}>
<h3>Old Value</h3>
<textarea
style={{
width: "100%",
height: "200px",
padding: "10px",
fontFamily: "monospace",
backgroundColor: "#f5f5f5",
border: oldJsonError ? "1px solid red" : "1px solid #ddd",
borderRadius: "4px",
}}
value={oldJson}
onChange={(e) => setOldJson(e.target.value)}
/>
{oldJsonError && <div style={{ color: "red" }}>{oldJsonError}</div>}
</div>
<div style={{ flex: 1 }}>
<h3>New Value</h3>
<textarea
style={{
width: "100%",
height: "200px",
padding: "10px",
fontFamily: "monospace",
backgroundColor: "#f5f5f5",
border: newJsonError ? "1px solid red" : "1px solid #ddd",
borderRadius: "4px",
}}
value={newJson}
onChange={(e) => setNewJson(e.target.value)}
/>
{newJsonError && <div style={{ color: "red" }}>{newJsonError}</div>}
</div>
</div>
{!oldJsonError && !newJsonError && (
<Story {...context} args={{ ...context.args, oldValue: parsedOldValue, newValue: parsedNewValue }} />
)}
return (
<div style={{ display: "flex", flexDirection: "column", gap: "20px" }}>
<div style={{ display: "flex", gap: "20px" }}>
<div style={{ flex: 1 }}>
<h3>Old Value</h3>
<textarea
style={{
width: "100%",
height: "200px",
padding: "10px",
fontFamily: "monospace",
backgroundColor: "#f5f5f5",
border: oldJsonError ? "1px solid red" : "1px solid #ddd",
borderRadius: "4px",
}}
value={oldJson}
onChange={e => setOldJson(e.target.value)}
/>
{oldJsonError && <div style={{ color: "red" }}>{oldJsonError}</div>}
</div>
);
};
<div style={{ flex: 1 }}>
<h3>New Value</h3>
<textarea
style={{
width: "100%",
height: "200px",
padding: "10px",
fontFamily: "monospace",
backgroundColor: "#f5f5f5",
border: newJsonError ? "1px solid red" : "1px solid #ddd",
borderRadius: "4px",
}}
value={newJson}
onChange={e => setNewJson(e.target.value)}
/>
{newJsonError && <div style={{ color: "red" }}>{newJsonError}</div>}
</div>
</div>
{!oldJsonError && !newJsonError && (
<Story {...context} args={{ ...context.args, oldValue: parsedOldValue, newValue: parsedNewValue }} />
)}
</div>
);
}

export const decorators = [withJsonEditor];

Expand Down
62 changes: 31 additions & 31 deletions .storybook/theme.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,41 @@
import { create } from "@storybook/theming/create";

export default create({
base: "light",
brandTitle: "Virtual React Json Diff",
brandUrl: "https://virtual-react-json-diff.netlify.app",
// brandImage: "./image.png",
brandTarget: "_self",
gridCellSize: 20,
base: "light",
brandTitle: "Virtual React Json Diff",
brandUrl: "https://virtual-react-json-diff.netlify.app",
// brandImage: "./image.png",
brandTarget: "_self",
gridCellSize: 20,

// Typography
fontBase: '"Open Sans", sans-serif',
fontCode: "monospace",
// Typography
fontBase: "\"Open Sans\", sans-serif",
fontCode: "monospace",

//
colorPrimary: "#3A10E5",
colorSecondary: "#585C6D",
//
colorPrimary: "#3A10E5",
colorSecondary: "#585C6D",

// UI
appBg: "#ffffff",
appContentBg: "#ffffff",
appPreviewBg: "#ffffff",
appBorderColor: "#585C6D",
appBorderRadius: 4,
// UI
appBg: "#ffffff",
appContentBg: "#ffffff",
appPreviewBg: "#ffffff",
appBorderColor: "#585C6D",
appBorderRadius: 4,

// Text colors
textColor: "#10162F",
textInverseColor: "#ffffff",
// Text colors
textColor: "#10162F",
textInverseColor: "#ffffff",

// Toolbar default and active colors
barTextColor: "#9E9E9E",
barSelectedColor: "#585C6D",
barHoverColor: "#585C6D",
barBg: "#ffffff",
// Toolbar default and active colors
barTextColor: "#9E9E9E",
barSelectedColor: "#585C6D",
barHoverColor: "#585C6D",
barBg: "#ffffff",

// Form colors
inputBg: "#ffffff",
inputBorder: "#10162F",
inputTextColor: "#10162F",
inputBorderRadius: 2,
// Form colors
inputBg: "#ffffff",
inputBorder: "#10162F",
inputTextColor: "#10162F",
inputBorderRadius: 2,
});
52 changes: 52 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"cSpell.words": ["Iconify", "persistor"],
// Disable the default formatter, use eslint instead
"prettier.enable": false,
"editor.formatOnSave": false,

// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "never"
},

// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off", "fixable": true },
{ "rule": "format/*", "severity": "off", "fixable": true },
{ "rule": "*-indent", "severity": "off", "fixable": true },
{ "rule": "*-spacing", "severity": "off", "fixable": true },
{ "rule": "*-spaces", "severity": "off", "fixable": true },
{ "rule": "*-order", "severity": "off", "fixable": true },
{ "rule": "*-dangle", "severity": "off", "fixable": true },
{ "rule": "*-newline", "severity": "off", "fixable": true },
{ "rule": "*quotes", "severity": "off", "fixable": true },
{ "rule": "*semi", "severity": "off", "fixable": true }
],

// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"json5",
"jsonc",
"yaml",
"toml",
"xml",
"gql",
"graphql",
"astro",
"svelte",
"css",
"less",
"scss",
"pcss",
"postcss"
]
}
Loading