Skip to content

Commit 7d145ba

Browse files
committed
feat(visualizer): introduce dark mode theme
Added theme colors for dark mode.
1 parent cbab8c9 commit 7d145ba

File tree

15 files changed

+147
-63
lines changed

15 files changed

+147
-63
lines changed

packages/json-table-schema-visualizer/.storybook/preview.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React from "react";
22
import { Layer, Stage } from "react-konva";
3-
import { defaultThemeConfig } from "../src/constants/theme";
3+
import { darkThemeConfig } from "../src/constants/theme";
44
import ThemeProvider from "../src/providers/ThemeProvider";
5+
import "../src/styles/index.css";
56

67
/** @type { import('@storybook/react').Preview } */
78
const preview = {
@@ -16,7 +17,7 @@ const preview = {
1617
decorators: [
1718
(Story, configs) =>
1819
configs.parameters.withKonvaWrapper ? (
19-
<ThemeProvider theme={defaultThemeConfig}>
20+
<ThemeProvider themeColors={darkThemeConfig} theme={"light"}>
2021
<Stage width={window.innerWidth} height={window.innerHeight}>
2122
<Layer>
2223
<Story />

packages/json-table-schema-visualizer/src/components/Column/Column.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
PADDINGS,
1111
TABLE_WIDTH,
1212
} from "@/constants/sizing";
13-
import { useTheme } from "@/hooks/theme";
13+
import { useThemeColors } from "@/hooks/theme";
1414

1515
interface ColumnProps {
1616
colName: string;
@@ -33,16 +33,16 @@ const Column = ({
3333
isEnum,
3434
note,
3535
}: ColumnProps) => {
36-
const theme = useTheme();
36+
const themeColors = useThemeColors();
3737
const tableColors = useTableColor(tableName);
3838

39-
const colTextColor = theme.text[900];
40-
const typeTextColor = theme.text[700];
39+
const colTextColor = themeColors.text[900];
40+
const typeTextColor = themeColors.text[700];
4141
const fontStyle = isPrimaryKey ? "bold" : "normal";
4242

4343
return (
4444
<ColumnWrapper
45-
highlightColor={tableColors?.lighter ?? theme.colAccent}
45+
highlightColor={tableColors?.lighter ?? themeColors.colAccent}
4646
relationalTables={relationalTables}
4747
offsetY={offsetY}
4848
tableName={tableName}

packages/json-table-schema-visualizer/src/components/DiagramViewer/DiagramViewer.stories.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import DiagramViewer from "./DiagramViewer";
33
import type { Meta, StoryObj } from "@storybook/react";
44

55
import { createBookingsTableClone, exampleData } from "@/fake/fakeJsonTables";
6-
import { defaultThemeConfig } from "@/constants/theme";
76

87
const meta: Meta<typeof DiagramViewer> = {
98
component: DiagramViewer,
@@ -28,7 +27,6 @@ export const DiagramViewerStory: Story = {
2827
render: (props) => <DiagramViewer {...props} />,
2928
args: {
3029
tables,
31-
theme: defaultThemeConfig,
3230
enums: exampleData.enums,
3331
refs: exampleData.refs,
3432
},

packages/json-table-schema-visualizer/src/components/DiagramViewer/DiagramViewer.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,24 @@ import Tables from "./Tables";
88
import RelationsConnections from "./Connections";
99
import DiagramWrapper from "./DiagramWrapper";
1010

11-
import { type ThemeConfigValue } from "@/types/theme";
1211
import TablesPositionsProvider from "@/providers/TablesPositionsProvider";
1312
import MainProviders from "@/providers/MainProviders";
14-
import ThemeProvider from "@/providers/ThemeProvider";
1513

1614
interface DiagramViewerProps {
1715
tables: JSONTableTable[];
1816
refs: JSONTableRef[];
19-
theme: ThemeConfigValue;
2017
enums: JSONTableEnum[];
2118
}
22-
const DiagramViewer = ({ refs, tables, theme, enums }: DiagramViewerProps) => {
19+
const DiagramViewer = ({ refs, tables, enums }: DiagramViewerProps) => {
2320
return (
2421
<TablesPositionsProvider tables={tables}>
25-
<ThemeProvider theme={theme}>
26-
<MainProviders tables={tables} enums={enums}>
27-
<DiagramWrapper>
28-
<RelationsConnections refs={refs} />
22+
<MainProviders tables={tables} enums={enums}>
23+
<DiagramWrapper>
24+
<RelationsConnections refs={refs} />
2925

30-
<Tables tables={tables} />
31-
</DiagramWrapper>
32-
</MainProviders>
33-
</ThemeProvider>
26+
<Tables tables={tables} />
27+
</DiagramWrapper>
28+
</MainProviders>
3429
</TablesPositionsProvider>
3530
);
3631
};

packages/json-table-schema-visualizer/src/components/DiagramViewer/DiagramWrapper.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ import { Group, Layer, Stage } from "react-konva";
22
import { type ReactNode } from "react";
33
import { type KonvaEventObject } from "konva/lib/Node";
44

5+
import ThemeToggler from "../ThemeToggler/ThemeToggler";
6+
57
import type { Stage as CoreStage } from "konva/lib/Stage";
68

79
import { useWindowSize } from "@/hooks/window";
810
import { useCursorChanger } from "@/hooks/cursor";
911
import { DIAGRAM_PADDING } from "@/constants/sizing";
12+
import { useThemeColors, useThemeContext } from "@/hooks/theme";
13+
import { Theme } from "@/types/theme";
1014

1115
interface DiagramWrapperProps {
1216
children: ReactNode;
@@ -15,8 +19,10 @@ interface DiagramWrapperProps {
1519
const DiagramWrapper = ({ children }: DiagramWrapperProps) => {
1620
const scaleBy = 1.02;
1721
const { height, width } = useWindowSize();
22+
const { theme } = useThemeContext();
1823
const { onChange: onGrabbing, onRestore: onGrabRelease } =
1924
useCursorChanger("grabbing");
25+
const themeColors = useThemeColors();
2026

2127
const handleZooming = (e: KonvaEventObject<WheelEvent>) => {
2228
e.evt.preventDefault();
@@ -51,21 +57,26 @@ const DiagramWrapper = ({ children }: DiagramWrapperProps) => {
5157
};
5258

5359
return (
54-
<main>
60+
<main className={`relative ${theme === Theme.dark ? "dark" : ""}`}>
5561
<Stage
5662
draggable
5763
onDragStart={onGrabbing}
5864
onDragEnd={onGrabRelease}
5965
onWheel={handleZooming}
6066
width={width}
6167
height={height}
68+
style={{ backgroundColor: themeColors.bg }}
6269
>
6370
<Layer>
6471
<Group offsetX={-DIAGRAM_PADDING} offsetY={-DIAGRAM_PADDING}>
6572
{children}
6673
</Group>
6774
</Layer>
6875
</Stage>
76+
77+
<div className="absolute top-5 right-5">
78+
<ThemeToggler />
79+
</div>
6980
</main>
7081
);
7182
};

packages/json-table-schema-visualizer/src/components/FieldDetails/EnumDetails.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Group } from "react-konva";
33
import KonvaText from "../dumb/KonvaText";
44

55
import { useGetEnum } from "@/hooks/enums";
6-
import { useTheme } from "@/hooks/theme";
6+
import { useThemeColors } from "@/hooks/theme";
77
import { computeTextSize } from "@/utils/computeTextSize";
88
import { PADDINGS } from "@/constants/sizing";
99
import { createEnumItemText } from "@/utils/createEnumItemText";
@@ -17,7 +17,7 @@ const enumTextSize = computeTextSize("Enum");
1717

1818
const EnumDetails = ({ enumName, y }: EnumDetailsProps) => {
1919
const enumObject = useGetEnum(enumName);
20-
const theme = useTheme();
20+
const themeColors = useThemeColors();
2121

2222
if (enumObject === undefined) {
2323
return null;
@@ -27,16 +27,20 @@ const EnumDetails = ({ enumName, y }: EnumDetailsProps) => {
2727

2828
return (
2929
<Group y={y}>
30-
<KonvaText fontStyle="bold" fill={theme.red} text="Enum" />
30+
<KonvaText fontStyle="bold" fill={themeColors.red} text="Enum" />
3131

32-
<KonvaText x={enumNameX} fill={theme.green} text={enumObject.name} />
32+
<KonvaText
33+
x={enumNameX}
34+
fill={themeColors.green}
35+
text={enumObject.name}
36+
/>
3337

3438
{enumObject.values.map((item, index) => (
3539
<KonvaText
3640
key={item.name}
3741
y={(index + 1) * enumTextSize.height}
3842
text={createEnumItemText(item.name)}
39-
fill={theme.enumItem}
43+
fill={themeColors.enumItem}
4044
/>
4145
))}
4246
</Group>

packages/json-table-schema-visualizer/src/components/FieldDetails/FieldDetailWrapper.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Group, Line, Rect } from "react-konva";
22
import { useState, type ReactNode } from "react";
33

44
import { COLUMN_HEIGHT, PADDINGS, TABLE_WIDTH } from "@/constants/sizing";
5-
import { useTheme } from "@/hooks/theme";
5+
import { useThemeColors } from "@/hooks/theme";
66
import { computeCaretPoints } from "@/utils/computeCaretPoints";
77

88
interface FieldDetailWrapperProps {
@@ -11,7 +11,7 @@ interface FieldDetailWrapperProps {
1111

1212
const FieldDetailWrapper = ({ children }: FieldDetailWrapperProps) => {
1313
const [isDetailVisible, setIsDetailVisible] = useState(false);
14-
const theme = useTheme();
14+
const themeColors = useThemeColors();
1515

1616
const handleOnHover = () => {
1717
setIsDetailVisible(true);
@@ -36,7 +36,7 @@ const FieldDetailWrapper = ({ children }: FieldDetailWrapperProps) => {
3636

3737
{isDetailVisible ? (
3838
<Line
39-
fill={theme.noteBg}
39+
fill={themeColors.noteBg}
4040
closed
4141
points={computeCaretPoints(popoverX, COLUMN_HEIGHT)}
4242
/>

packages/json-table-schema-visualizer/src/components/FieldDetails/FieldDetails.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import KonvaText from "../dumb/KonvaText";
55
import EnumDetails from "./EnumDetails";
66
import FieldDetailWrapper from "./FieldDetailWrapper";
77

8-
import { useTheme } from "@/hooks/theme";
8+
import { useThemeColors } from "@/hooks/theme";
99
import { computeFieldDetailBoxDimension } from "@/utils/computeFieldDetailBoxDimension";
1010
import { useGetEnum } from "@/hooks/enums";
1111
import { PADDINGS } from "@/constants/sizing";
@@ -16,15 +16,15 @@ interface FieldDetailsProps {
1616
}
1717

1818
const FieldDetails = ({ note, enumName = "" }: FieldDetailsProps) => {
19-
const theme = useTheme();
19+
const themeColors = useThemeColors();
2020
const enumObject = useGetEnum(enumName);
2121

2222
const contentDimension = computeFieldDetailBoxDimension(note, enumObject);
2323
return (
2424
<FieldDetailWrapper>
2525
<Group>
2626
<Rect
27-
fill={theme.noteBg}
27+
fill={themeColors.noteBg}
2828
width={contentDimension.w + PADDINGS.md * 2}
2929
height={contentDimension.h}
3030
cornerRadius={5}
@@ -34,7 +34,7 @@ const FieldDetails = ({ note, enumName = "" }: FieldDetailsProps) => {
3434
<KonvaText
3535
y={PADDINGS.md}
3636
width={contentDimension.w}
37-
fill={theme.white}
37+
fill={themeColors.white}
3838
text={note}
3939
/>
4040

packages/json-table-schema-visualizer/src/components/RelationConnection/ConnectionPath.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Path } from "react-konva";
22
import { useState } from "react";
33

4-
import { useTheme } from "@/hooks/theme";
4+
import { useThemeColors } from "@/hooks/theme";
55
import { useTablesInfo } from "@/hooks/table";
66
import { useTableColor } from "@/hooks/tableColor";
77

@@ -17,7 +17,7 @@ const ConnectionPath = ({
1717
targetTableName,
1818
relationOwner,
1919
}: ConnectionPathProps) => {
20-
const theme = useTheme();
20+
const themeColors = useThemeColors();
2121
const { hoveredTableName } = useTablesInfo();
2222
const sourceTableColors = useTableColor(relationOwner);
2323
const [isHovered, setIsHovered] = useState(false);
@@ -28,8 +28,8 @@ const ConnectionPath = ({
2828
isHovered;
2929

3030
const strokeColor = highlight
31-
? sourceTableColors?.regular ?? theme.connection.active
32-
: theme.connection.default;
31+
? sourceTableColors?.regular ?? themeColors.connection.active
32+
: themeColors.connection.default;
3333

3434
const handleOnHover = () => {
3535
setIsHovered(true);

packages/json-table-schema-visualizer/src/components/Table.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
TABLE_HEADER_HEIGHT,
1616
TABLE_WIDTH,
1717
} from "@/constants/sizing";
18-
import { useTheme } from "@/hooks/theme";
18+
import { useThemeColors } from "@/hooks/theme";
1919
import eventEmitter from "@/events-emitter";
2020
import { computeTableDragEventName } from "@/utils/eventName";
2121
import { useTablePosition, useTablesInfo } from "@/hooks/table";
@@ -24,7 +24,7 @@ import { tableCoordsStore } from "@/stores/tableCoords";
2424
interface TableProps extends JSONTableTable {}
2525

2626
const Table = ({ fields, name }: TableProps) => {
27-
const theme = useTheme();
27+
const themeColors = useThemeColors();
2828
const tableRef = useRef<null | Konva.Group>(null);
2929
const { setHoveredTableName } = useTablesInfo();
3030
const tablePosition = useTablePosition(name);
@@ -94,10 +94,10 @@ const Table = ({ fields, name }: TableProps) => {
9494
<Rect
9595
shadowBlur={PADDINGS.xs}
9696
shadowOpacity={0.2}
97-
shadowColor={theme.table.shadow}
97+
shadowColor={themeColors.table.shadow}
9898
height={tableHeight}
9999
width={TABLE_WIDTH}
100-
fill={theme.table.bg}
100+
fill={themeColors.table.bg}
101101
cornerRadius={PADDINGS.sm}
102102
/>
103103

0 commit comments

Comments
 (0)