Files
react-test/docs/data/joy/components/table/TableColumnPinning.tsx
how2ice 005cf56baf
Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
init project
2025-12-12 14:26:25 +09:00

121 lines
4.2 KiB
TypeScript

import Box from '@mui/joy/Box';
import Button from '@mui/joy/Button';
import Table from '@mui/joy/Table';
import Typography from '@mui/joy/Typography';
import Sheet from '@mui/joy/Sheet';
function createData(
name: string,
calories: number,
fat: number,
carbs: number,
protein: number,
) {
return { name, calories, fat, carbs, protein };
}
const rows = [
createData('1', 159, 6.0, 24, 4.0),
createData('2', 237, 9.0, 37, 4.3),
createData('3', 262, 16.0, 24, 6.0),
createData('4', 305, 3.7, 67, 4.3),
];
export default function TableColumnPinning() {
return (
<Box sx={{ width: '100%' }}>
<Typography level="body-sm" sx={{ textAlign: 'center', pb: 2 }}>
Scroll direction
</Typography>
<Sheet
variant="outlined"
sx={(theme) => ({
'--TableCell-height': '40px',
// the number is the amount of the header rows.
'--TableHeader-height': 'calc(1 * var(--TableCell-height))',
'--Table-firstColumnWidth': '80px',
'--Table-lastColumnWidth': '144px',
// background needs to have transparency to show the scrolling shadows
'--TableRow-stripeBackground': 'rgba(0 0 0 / 0.04)',
'--TableRow-hoverBackground': 'rgba(0 0 0 / 0.08)',
overflow: 'auto',
background: `linear-gradient(to right, ${theme.vars.palette.background.surface} 30%, rgba(255, 255, 255, 0)),
linear-gradient(to right, rgba(255, 255, 255, 0), ${theme.vars.palette.background.surface} 70%) 0 100%,
radial-gradient(
farthest-side at 0 50%,
rgba(0, 0, 0, 0.12),
rgba(0, 0, 0, 0)
),
radial-gradient(
farthest-side at 100% 50%,
rgba(0, 0, 0, 0.12),
rgba(0, 0, 0, 0)
)
0 100%`,
backgroundSize:
'40px calc(100% - var(--TableCell-height)), 40px calc(100% - var(--TableCell-height)), 14px calc(100% - var(--TableCell-height)), 14px calc(100% - var(--TableCell-height))',
backgroundRepeat: 'no-repeat',
backgroundAttachment: 'local, local, scroll, scroll',
backgroundPosition:
'var(--Table-firstColumnWidth) var(--TableCell-height), calc(100% - var(--Table-lastColumnWidth)) var(--TableCell-height), var(--Table-firstColumnWidth) var(--TableCell-height), calc(100% - var(--Table-lastColumnWidth)) var(--TableCell-height)',
backgroundColor: 'background.surface',
})}
>
<Table
borderAxis="bothBetween"
stripe="odd"
hoverRow
sx={{
'& tr > *:first-child': {
position: 'sticky',
left: 0,
boxShadow: '1px 0 var(--TableCell-borderColor)',
bgcolor: 'background.surface',
},
'& tr > *:last-child': {
position: 'sticky',
right: 0,
bgcolor: 'var(--TableCell-headBackground)',
},
}}
>
<thead>
<tr>
<th style={{ width: 'var(--Table-firstColumnWidth)' }}>Row</th>
<th style={{ width: 200 }}>Calories</th>
<th style={{ width: 200 }}>Fat&nbsp;(g)</th>
<th style={{ width: 200 }}>Carbs&nbsp;(g)</th>
<th style={{ width: 200 }}>Protein&nbsp;(g)</th>
<th
aria-label="last"
style={{ width: 'var(--Table-lastColumnWidth)' }}
/>
</tr>
</thead>
<tbody>
{rows.map((row) => (
<tr key={row.name}>
<td>{row.name}</td>
<td>{row.calories}</td>
<td>{row.fat}</td>
<td>{row.carbs}</td>
<td>{row.protein}</td>
<td>
<Box sx={{ display: 'flex', gap: 1 }}>
<Button size="sm" variant="plain" color="neutral">
Edit
</Button>
<Button size="sm" variant="soft" color="danger">
Delete
</Button>
</Box>
</td>
</tr>
))}
</tbody>
</Table>
</Sheet>
</Box>
);
}