A comprehensive React component library built with Material UI and TypeScript for the CANFAR (Canadian Advanced Network for Astronomical Research) platform.
- 108+ Production-Ready Components: UI components, forms, dialogs, tables, and domain-specific components
- TypeScript First: Full TypeScript support with comprehensive type definitions
- Material UI Based: Built on top of Material UI v7 with custom theming
- Design System: Complete design tokens including colors, typography, spacing, and more
- Accessibility: WCAG AA compliant with built-in a11y support
- Tree-Shakeable: Optimized bundle size with ES modules
- Dark Mode: Full light/dark theme support
npm install @canfar/shared-componentsThis library requires the following peer dependencies:
npm install react react-dom @mui/material @emotion/react @emotion/styled @mui/icons-materialOptional dependencies:
npm install @mui/x-data-grid # For data grid componentsimport { ThemeProvider, createCanfarTheme } from '@canfar/shared-components';
function App() {
const theme = createCanfarTheme('light');
return (
<ThemeProvider theme={theme}>
{/* Your app */}
</ThemeProvider>
);
}import { Button, Card, TextField } from '@canfar/shared-components';
function MyComponent() {
return (
<Card>
<TextField label="Username" />
<Button variant="contained" color="primary">
Submit
</Button>
</Card>
);
}Basic building blocks for your interface:
Button,IconButtonTextField,Checkbox,Radio,Switch,Select,SliderCard,Paper,Box,GridTypography,Divider,Avatar,Badge,ChipAlert,Snackbar,Tooltip,Progress,Skeleton
Structure your application:
AppLayout,PageLayoutAppBar,Toolbar,DrawerHeader,FooterWidgetContainer,CollapsiblePanel
Modal and dialog interfaces:
Dialog,DeleteConfirmationDialogLoginModal,SessionCheckModalAddGroupDialog,EditGroupDialogCreateFolderDialog,UploadDialog- And many more...
Tables and data visualization:
Table,TableBody,TableHead,TableRow,TableCellFileTable,MeetingTable,GroupTable,DOITableList,Menu,MenuItemBarChartHorizontal,PlatformLoad
CANFAR-specific functionality:
- Meetings:
MeetingCard,MeetingForm,MeetingsList,MeetingDetail - Sessions:
SessionCard,SessionLaunchForm,ActiveSessionsWidget - Storage:
UserStorageWidget,FileTable - Services:
ServiceCard,ServicesGrid - AI:
AIPromptInterface,ResponseViewer,ModelSelector - Metrics:
MetricBlock,PlatformLoad
import { designTokens } from '@canfar/shared-components';
const MyStyledComponent = styled('div')({
color: designTokens.colors.primary.main,
padding: designTokens.spacing.medium,
borderRadius: designTokens.spacing.borderRadius,
boxShadow: designTokens.shadows.card,
});import { createCanfarTheme } from '@canfar/shared-components';
const customTheme = createCanfarTheme('dark', {
primary: {
main: '#custom-color',
},
});import { useSnackbarQueue } from '@canfar/shared-components';
function MyComponent() {
const { enqueueSnackbar } = useSnackbarQueue();
const handleClick = () => {
enqueueSnackbar({
message: 'Operation successful!',
severity: 'success',
});
};
return <Button onClick={handleClick}>Show Notification</Button>;
}import {
ResourceSliderInput,
ResourceStepperInput,
DualResourceSelector
} from '@canfar/shared-components';
function ResourceConfiguration() {
const [cpu, setCpu] = useState(2);
const [memory, setMemory] = useState(4);
return (
<div>
<ResourceSliderInput
label="CPU Cores"
value={cpu}
onChange={setCpu}
min={1}
max={16}
/>
<DualResourceSelector
cpuValue={cpu}
memoryValue={memory}
onCpuChange={setCpu}
onMemoryChange={setMemory}
/>
</div>
);
}All components come with comprehensive TypeScript definitions:
import type { ButtonProps, CardProps } from '@canfar/shared-components';
const MyButton: React.FC<ButtonProps> = (props) => {
// TypeScript will provide full autocomplete and type checking
return <Button {...props} />;
};Access the complete design system:
import { designTokens } from '@canfar/shared-components';
// Colors
designTokens.colors.primary.main // #1976d2
designTokens.colors.secondary.main // #c2185b
designTokens.colors.tertiary.main // #8e24aa
// Typography
designTokens.typography.fontFamily
designTokens.typography.fontSizes
// Spacing
designTokens.spacing.small // 8px
designTokens.spacing.medium // 16px
designTokens.spacing.large // 24px
// Shadows
designTokens.shadows.card
designTokens.shadows.dialog
// Transitions
designTokens.transitions.standard# Install dependencies
npm install
# Build the library
npm run build
# Run in development mode (watch)
npm run dev
# Type check
npm run typecheckcanfar-shared/
├── src/
│ ├── components/ # 108+ React components
│ ├── implementation/ # Component implementations
│ ├── types/ # TypeScript type definitions
│ ├── design-system/ # Design tokens and styles
│ ├── theme/ # Material UI theme configuration
│ ├── hooks/ # Custom React hooks
│ └── index.ts # Main export file
├── dist/ # Built output (generated)
├── package.json
├── tsconfig.json
└── tsup.config.ts
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
MIT
This library is part of the CANFAR platform. For contributions, please refer to the main CANFAR project guidelines.
- canfar-next - Main CANFAR Next.js application
- CANFAR Science Platform - https://www.canfar.net/
For issues and questions:
- GitHub Issues: https://github.com/szautkin/canfar-shared/issues
- CANFAR Website: https://www.canfar.net/