Skip to content

Commit d4841d7

Browse files
committed
refactor(styling): introduce PaletteContext and unify inline styles
- Add theme/ResistanceTable/palette.js with PaletteProvider/usePalette - Remove palette prop drilling; components consume palette via context - Apply inline styles consistently: headers, rows, cells, legend, tooltip, source switcher - Keep all critical colors inline to avoid dark-mode prod issues This simplifies styling, removes duplication, and keeps behavior consistent in production.
1 parent 4fdfd5f commit d4841d7

File tree

18 files changed

+184
-78
lines changed

18 files changed

+184
-78
lines changed

dist/theme/ResistanceTable/components/Legend.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React from 'react';
2+
import { usePalette } from '../palette';
23

34
// Mock types
45
// Helper function to remove type annotations for JS conversion
56
const identity = (props) => props;
67

7-
export const Legend = ({ cols, displayMode, styles, palette }) => {
8+
export const Legend = ({ cols, displayMode, styles }) => {
9+
const palette = usePalette();
810
if (displayMode === 'full') return null;
911

1012
return (

dist/theme/ResistanceTable/components/TableBody.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export const TableBody = ({
1515
styles,
1616
colorMode,
1717
sourceId2ShortName,
18-
palette,
1918
t,
2019
}) => {
2120
return (
@@ -36,7 +35,6 @@ export const TableBody = ({
3635
onHideTooltip={onHideTooltip}
3736
styles={styles}
3837
colorMode={colorMode}
39-
palette={palette}
4038
sourceId2ShortName={sourceId2ShortName}
4139
t={t}
4240
/>

dist/theme/ResistanceTable/components/TableCell.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import { CellTooltipContent } from '../ui/components';
33
import { cellStyle, hl } from '../utils';
4+
import { usePalette } from '../palette';
45

56
export const TableCell = React.memo(
67
({
@@ -16,11 +17,11 @@ export const TableCell = React.memo(
1617
onShowTooltip,
1718
onHideTooltip,
1819
styles,
19-
palette,
2020
colorMode,
2121
sourceId2ShortName,
2222
t,
2323
}) => {
24+
const palette = usePalette();
2425
const cell = row[col.name];
2526
const highlight = hoveredRow === rowIndex || hoveredCol === colIndex;
2627

dist/theme/ResistanceTable/components/TableHeader.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export const TableHeader = ({
1010
onShowTooltip,
1111
onHideTooltip,
1212
styles,
13-
palette,
1413
}) => {
1514
const abxCol = { whiteSpace: 'nowrap', width: '1%' };
1615

@@ -30,7 +29,6 @@ export const TableHeader = ({
3029
onShowTooltip={onShowTooltip}
3130
onHideTooltip={onHideTooltip}
3231
styles={styles}
33-
palette={palette}
3432
/>
3533
))}
3634
</tr>

dist/theme/ResistanceTable/components/TableHeaderCell.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import { hl } from '../utils';
3+
import { usePalette } from '../palette';
34

45
export const TableHeaderCell = React.memo(
56
({
@@ -12,8 +13,8 @@ export const TableHeaderCell = React.memo(
1213
onShowTooltip,
1314
onHideTooltip,
1415
styles,
15-
palette,
1616
}) => {
17+
const palette = usePalette();
1718
const highlight = hoveredCol === colIndex;
1819

1920
const handleMouseEnter = (event) => {

dist/theme/ResistanceTable/components/TableRow.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import { TableCell } from './TableCell';
33
import { hl } from '../utils';
4+
import { usePalette } from '../palette';
45

56
export const TableRow = React.memo(
67
({
@@ -16,11 +17,11 @@ export const TableRow = React.memo(
1617
onShowTooltip,
1718
onHideTooltip,
1819
styles,
19-
palette,
2020
colorMode,
2121
sourceId2ShortName,
2222
t,
2323
}) => {
24+
const palette = usePalette();
2425
const highlight = hoveredRow === rowIndex;
2526
const abxCol = { whiteSpace: 'nowrap', width: '1%' };
2627

@@ -71,7 +72,6 @@ export const TableRow = React.memo(
7172
onShowTooltip={onShowTooltip}
7273
onHideTooltip={onHideTooltip}
7374
styles={styles}
74-
palette={palette}
7575
colorMode={colorMode}
7676
sourceId2ShortName={sourceId2ShortName}
7777
t={t}

dist/theme/ResistanceTable/index.jsx

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { SourceSwitcher } from './ui/components';
1313
import { TableHeader, TableBody, Legend } from './components';
1414
import styles from './styles.module.css';
1515
import { groupAndSortAntibiotics, buildMatrix, formatMatrix } from './utils';
16+
import { PaletteProvider } from './palette';
1617
import { getTranslator } from './i18n';
1718

1819
const useIsomorphicLayoutEffect =
@@ -108,6 +109,9 @@ export default function ResistanceTable(props) {
108109

109110
const { colorMode } = useColorMode();
110111

112+
// We will use PaletteProvider to supply inline color values to subcomponents.
113+
// For inline styles within this component, we derive the same palette through the provider.
114+
// To keep it simple here, we compute a local palette identical to the provider's value.
111115
const palette = useMemo(() => {
112116
if (colorMode === 'dark') {
113117
return {
@@ -122,6 +126,7 @@ export default function ResistanceTable(props) {
122126
tooltipBg: 'rgba(200, 200, 200, 0.9)',
123127
tooltipText: '#000',
124128
overlay: 'rgba(30, 30, 30, 0.7)',
129+
primary: 'var(--ifm-color-primary, #7aa2f7)'
125130
};
126131
}
127132
return {
@@ -136,6 +141,7 @@ export default function ResistanceTable(props) {
136141
tooltipBg: 'rgba(60, 60, 60, 0.9)',
137142
tooltipText: '#fff',
138143
overlay: 'rgba(255, 255, 255, 0.7)',
144+
primary: 'var(--ifm-color-primary, #3578e5)'
139145
};
140146
}, [colorMode]);
141147

@@ -466,10 +472,10 @@ export default function ResistanceTable(props) {
466472
</div>
467473
)}
468474
<table ref={tableRef} className={styles.resistanceTable} style={{ borderCollapse: 'separate', borderSpacing: 0, color: palette.text }}>
469-
<TableHeader {...{ cols, displayMode: display, hoveredCol: hover.col, onSetHover: handleSetHover, onClearHover: handleClearHover, onShowTooltip: showTooltip, onHideTooltip: hideTooltip, styles, palette }} />
470-
<TableBody {...{ data, cols, displayMode: display, rowsAreAbx, hoveredRow: hover.row, hoveredCol: hover.col, onSetHover: handleSetHover, onClearHover: handleClearHover, onShowTooltip: showTooltip, onHideTooltip: hideTooltip, styles, colorMode, sourceId2ShortName, palette, t }} />
475+
<TableHeader {...{ cols, displayMode: display, hoveredCol: hover.col, onSetHover: handleSetHover, onClearHover: handleClearHover, onShowTooltip: showTooltip, onHideTooltip: hideTooltip, styles }} />
476+
<TableBody {...{ data, cols, displayMode: display, rowsAreAbx, hoveredRow: hover.row, hoveredCol: hover.col, onSetHover: handleSetHover, onClearHover: handleClearHover, onShowTooltip: showTooltip, onHideTooltip: hideTooltip, styles, colorMode, sourceId2ShortName, t }} />
471477
</table>
472-
<Legend {...{ cols, displayMode: display, styles, palette }} />
478+
<Legend {...{ cols, displayMode: display, styles }} />
473479
<div className={styles.sourceInfo} style={{ backgroundColor: palette.sourceInfoBg, borderTop: `1px solid ${palette.border}`, color: palette.sourceInfoText }}>
474480
{renderHiddenInfo()}
475481
{sourceChain.length > 0 && (
@@ -500,33 +506,35 @@ export default function ResistanceTable(props) {
500506
if (!pluginGlobalData) return <div className={styles.error}>{t('error')}: {t('pluginError')}</div>;
501507

502508
return (
503-
<RadixTooltip.Provider>
504-
<div ref={containerRef} style={{ minHeight: '150px' }}>
505-
<div className={styles.rootContainer}>
506-
{hierarchicalSources.length > 0 && (
507-
<SourceSwitcher {...{ sources: hierarchicalSources, selected: selectedSource, onSelect: setSelectedSource, styles, locale, palette }} />
508-
)}
509-
<div className={styles.tableContainer}>
510-
{renderContent()}
509+
<PaletteProvider colorMode={colorMode}>
510+
<RadixTooltip.Provider>
511+
<div ref={containerRef} style={{ minHeight: '150px' }}>
512+
<div className={styles.rootContainer}>
513+
{hierarchicalSources.length > 0 && (
514+
<SourceSwitcher {...{ sources: hierarchicalSources, selected: selectedSource, onSelect: setSelectedSource, styles, locale }} />
515+
)}
516+
<div className={styles.tableContainer}>
517+
{renderContent()}
518+
</div>
511519
</div>
512520
</div>
513-
</div>
514521

515-
<RadixTooltip.Root open={tooltipOpen} onOpenChange={setTooltipOpen}>
516-
<RadixTooltip.Trigger asChild><VirtualTrigger ref={virtualTriggerRef} /></RadixTooltip.Trigger>
517-
<RadixTooltip.Portal>
518-
<RadixTooltip.Content
519-
side="top"
520-
align="center"
521-
sideOffset={5}
522-
className={styles.tooltipContent}
523-
style={{ backgroundColor: palette.tooltipBg, color: palette.tooltipText }}
524-
>
525-
{tooltipContent}
526-
<RadixTooltip.Arrow width={8} height={4} className={styles.tooltipArrow} style={{ fill: palette.tooltipBg }} />
527-
</RadixTooltip.Content>
528-
</RadixTooltip.Portal>
529-
</RadixTooltip.Root>
530-
</RadixTooltip.Provider>
522+
<RadixTooltip.Root open={tooltipOpen} onOpenChange={setTooltipOpen}>
523+
<RadixTooltip.Trigger asChild><VirtualTrigger ref={virtualTriggerRef} /></RadixTooltip.Trigger>
524+
<RadixTooltip.Portal>
525+
<RadixTooltip.Content
526+
side="top"
527+
align="center"
528+
sideOffset={5}
529+
className={styles.tooltipContent}
530+
style={{ backgroundColor: palette.tooltipBg, color: palette.tooltipText }}
531+
>
532+
{tooltipContent}
533+
<RadixTooltip.Arrow width={8} height={4} className={styles.tooltipArrow} style={{ fill: palette.tooltipBg }} />
534+
</RadixTooltip.Content>
535+
</RadixTooltip.Portal>
536+
</RadixTooltip.Root>
537+
</RadixTooltip.Provider>
538+
</PaletteProvider>
531539
);
532540
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import React, {createContext, useContext, useMemo} from 'react';
2+
3+
export const createPalette = (colorMode) => {
4+
if (colorMode === 'dark') {
5+
return {
6+
border: '#444',
7+
background: '#1e1e1e',
8+
text: '#eee',
9+
subtleBg: '#252525',
10+
subtleBgHover: '#333',
11+
sourceInfoBg: '#333',
12+
sourceInfoText: '#bbb',
13+
emptyCellBg: '#2a2a2a',
14+
tooltipBg: 'rgba(200, 200, 200, 0.9)',
15+
tooltipText: '#000',
16+
overlay: 'rgba(30, 30, 30, 0.7)',
17+
primary: 'var(--ifm-color-primary, #7aa2f7)'
18+
};
19+
}
20+
return {
21+
border: '#ddd',
22+
background: '#fff',
23+
text: '#333',
24+
subtleBg: '#f9f9f9',
25+
subtleBgHover: '#f0f0f0',
26+
sourceInfoBg: '#f0f0f0',
27+
sourceInfoText: '#666',
28+
emptyCellBg: '#f2f2f2',
29+
tooltipBg: 'rgba(60, 60, 60, 0.9)',
30+
tooltipText: '#fff',
31+
overlay: 'rgba(255, 255, 255, 0.7)',
32+
primary: 'var(--ifm-color-primary, #3578e5)'
33+
};
34+
};
35+
36+
const PaletteContext = createContext(createPalette('light'));
37+
38+
export const PaletteProvider = ({colorMode, children}) => {
39+
const value = useMemo(() => createPalette(colorMode), [colorMode]);
40+
return <PaletteContext.Provider value={value}>{children}</PaletteContext.Provider>;
41+
};
42+
43+
export const usePalette = () => useContext(PaletteContext);
44+

dist/theme/ResistanceTable/ui/components.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useState } from 'react';
2+
import { usePalette } from '../palette';
23
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
34
import { ChevronDownIcon } from '@radix-ui/react-icons';
45
import clsx from 'clsx';
@@ -12,8 +13,8 @@ const SourceMenuItem = ({
1213
level = 0,
1314
isLast = false,
1415
locale,
15-
palette,
1616
}) => {
17+
const palette = usePalette();
1718
const hasChildren = source.children && source.children.length > 0;
1819
const isSelected = selected?.id === source.id;
1920
const [isHighlighted, setIsHighlighted] = useState(false);
@@ -73,8 +74,8 @@ export const SourceSwitcher = ({
7374
onSelect,
7475
styles,
7576
locale,
76-
palette,
7777
}) => {
78+
const palette = usePalette();
7879
if (!sources || sources.length === 0) return null;
7980

8081
const selectedName = selected

src/theme/ResistanceTable/components/Legend.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import React from 'react';
2+
import { usePalette } from '../palette';
23

34
// Mock types
45
// Helper function to remove type annotations for JS conversion
56
const identity = (props) => props;
67

7-
export const Legend = ({ cols, displayMode, styles, palette }) => {
8+
export const Legend = ({ cols, displayMode, styles }) => {
9+
const palette = usePalette();
810
if (displayMode === 'full') return null;
911

1012
return (

0 commit comments

Comments
 (0)