@reactberry/system 2.0.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +48 -0
  2. package/package.json +74 -0
  3. package/src/blocks/Accordion/index.tsx +158 -0
  4. package/src/blocks/AnimatedCarousel/index.tsx +188 -0
  5. package/src/blocks/AppleGlow/index.tsx +144 -0
  6. package/src/blocks/Avatar/index.tsx +167 -0
  7. package/src/blocks/Await/index.tsx +45 -0
  8. package/src/blocks/Cards/AnimatedCard/index.tsx +175 -0
  9. package/src/blocks/Cards/FluorescentCard/index.tsx +180 -0
  10. package/src/blocks/Cards/InfoCard/index.tsx +206 -0
  11. package/src/blocks/Cards/TickerCard/index.tsx +125 -0
  12. package/src/blocks/Carousel/index.tsx +216 -0
  13. package/src/blocks/Checkbox/index.tsx +101 -0
  14. package/src/blocks/Collection/index.tsx +59 -0
  15. package/src/blocks/Container/index.tsx +55 -0
  16. package/src/blocks/Controls/Control.tsx +67 -0
  17. package/src/blocks/Controls/index.tsx +11 -0
  18. package/src/blocks/CyclingNumber/index.tsx +78 -0
  19. package/src/blocks/DisplaySet/index.tsx +42 -0
  20. package/src/blocks/Divider/index.tsx +14 -0
  21. package/src/blocks/Draggable/index.tsx +266 -0
  22. package/src/blocks/Drawer/index.tsx +136 -0
  23. package/src/blocks/DynamicIsland/DynamicIsland.tsx +89 -0
  24. package/src/blocks/DynamicIsland/index.tsx +2 -0
  25. package/src/blocks/Fader/index.tsx +145 -0
  26. package/src/blocks/FamilyDrawer/README.md +116 -0
  27. package/src/blocks/FamilyDrawer/example.tsx +108 -0
  28. package/src/blocks/FamilyDrawer/index.tsx +119 -0
  29. package/src/blocks/FamilyDrawer/views/DefaultView.tsx +93 -0
  30. package/src/blocks/FamilyDrawer/views/KeyView.tsx +129 -0
  31. package/src/blocks/FamilyDrawer/views/PhraseView.tsx +129 -0
  32. package/src/blocks/FamilyDrawer/views/RemoveView.tsx +81 -0
  33. package/src/blocks/FieldSet/index.tsx +173 -0
  34. package/src/blocks/Filesystem/index.tsx +198 -0
  35. package/src/blocks/Gallery/Carousel/index.tsx +257 -0
  36. package/src/blocks/Gallery/Modal/index.tsx +83 -0
  37. package/src/blocks/Gallery/index.tsx +57 -0
  38. package/src/blocks/Gallery/utils/animationVariants.ts +18 -0
  39. package/src/blocks/Gallery/utils/aspectRatio.ts +14 -0
  40. package/src/blocks/Gallery/utils/downloadPhoto.ts +24 -0
  41. package/src/blocks/Gallery/utils/range.ts +11 -0
  42. package/src/blocks/GradientMesh/index.tsx +106 -0
  43. package/src/blocks/Group/index.tsx +152 -0
  44. package/src/blocks/Heading/index.tsx +111 -0
  45. package/src/blocks/HorizontalScroller/index.tsx +135 -0
  46. package/src/blocks/Icon/index.tsx +45 -0
  47. package/src/blocks/Indicator/index.tsx +27 -0
  48. package/src/blocks/InlineEditor/index.tsx +216 -0
  49. package/src/blocks/List/index.tsx +657 -0
  50. package/src/blocks/Main/index.tsx +17 -0
  51. package/src/blocks/Marquee/index.tsx +116 -0
  52. package/src/blocks/MaskedField/index.tsx +199 -0
  53. package/src/blocks/Menu/MenuContent.tsx +246 -0
  54. package/src/blocks/Menu/MenuContext.tsx +34 -0
  55. package/src/blocks/Menu/MenuItem.tsx +104 -0
  56. package/src/blocks/Menu/index.tsx +60 -0
  57. package/src/blocks/Modal/index.tsx +268 -0
  58. package/src/blocks/MorphingPopover/index.tsx +294 -0
  59. package/src/blocks/Overlay/Backdrop.tsx +48 -0
  60. package/src/blocks/Overlay/OverscrollGuard.tsx +36 -0
  61. package/src/blocks/Overlay/index.ts +2 -0
  62. package/src/blocks/Parallax/index.tsx +117 -0
  63. package/src/blocks/ParallaxSection/index.tsx +61 -0
  64. package/src/blocks/Placeholder/index.tsx +48 -0
  65. package/src/blocks/Popover/index.tsx +402 -0
  66. package/src/blocks/Progress/getProgressColor.ts +61 -0
  67. package/src/blocks/Progress/index.tsx +179 -0
  68. package/src/blocks/ProgressiveBlur/index.tsx +75 -0
  69. package/src/blocks/README.md +15 -0
  70. package/src/blocks/RenderAsset/index.tsx +18 -0
  71. package/src/blocks/ScrollContainer/index.tsx +93 -0
  72. package/src/blocks/ShinyText/index.tsx +72 -0
  73. package/src/blocks/Skeleton/index.tsx +71 -0
  74. package/src/blocks/Slider/SliderControls.tsx +119 -0
  75. package/src/blocks/Slider/index.tsx +140 -0
  76. package/src/blocks/Slider/useSlider.ts +126 -0
  77. package/src/blocks/Slideshow/index.tsx +177 -0
  78. package/src/blocks/Spotlight/index.tsx +144 -0
  79. package/src/blocks/Steps/StepIndicator.tsx +149 -0
  80. package/src/blocks/Steps/StepProgress.tsx +164 -0
  81. package/src/blocks/Steps/Steps.tsx +197 -0
  82. package/src/blocks/Steps/StepsNav.tsx +30 -0
  83. package/src/blocks/Steps/StepsTracker.tsx +80 -0
  84. package/src/blocks/Steps/hooks.ts +71 -0
  85. package/src/blocks/Steps/index.tsx +16 -0
  86. package/src/blocks/Steps/types.ts +71 -0
  87. package/src/blocks/StickySectionStack/index.tsx +136 -0
  88. package/src/blocks/Switch/index.tsx +85 -0
  89. package/src/blocks/SystemNotice/index.tsx +81 -0
  90. package/src/blocks/Table/README.md +251 -0
  91. package/src/blocks/Table/Table.tsx +207 -0
  92. package/src/blocks/Table/TablePagination.tsx +189 -0
  93. package/src/blocks/Table/index.ts +33 -0
  94. package/src/blocks/Table/useTableControls.ts +331 -0
  95. package/src/blocks/Tag/index.tsx +27 -0
  96. package/src/blocks/TextBreak/index.tsx +96 -0
  97. package/src/blocks/TextReveal/index.tsx +104 -0
  98. package/src/blocks/Thumbnail/index.tsx +26 -0
  99. package/src/blocks/Ticker/index.tsx +112 -0
  100. package/src/blocks/Toast/index.tsx +77 -0
  101. package/src/blocks/Tooltip/index.tsx +174 -0
  102. package/src/blocks/Underlay/index.tsx +104 -0
  103. package/src/blocks/Upload/Dropzone.tsx +92 -0
  104. package/src/blocks/Upload/UploadBtn.tsx +38 -0
  105. package/src/blocks/Upload/index.tsx +61 -0
  106. package/src/blocks/Upload/types.ts +37 -0
  107. package/src/blocks/VideoMarquee/index.tsx +511 -0
  108. package/src/blocks/index.ts +119 -0
  109. package/src/blocks/pagination/Pagination.tsx +148 -0
  110. package/src/blocks/pagination/PaginationList.tsx +41 -0
  111. package/src/blocks/pagination/index.ts +2 -0
  112. package/src/charts/BarChart.tsx +63 -0
  113. package/src/charts/PieChart.tsx +39 -0
  114. package/src/charts/index.ts +3 -0
  115. package/src/charts/utils.ts +103 -0
  116. package/src/docs/README.md +373 -0
  117. package/src/docs/reference/README.md +299 -0
  118. package/src/elements/box.ts +163 -0
  119. package/src/elements/button.ts +49 -0
  120. package/src/elements/field.ts +129 -0
  121. package/src/elements/index.ts +8 -0
  122. package/src/elements/text.ts +47 -0
  123. package/src/elements/utils.js +97 -0
  124. package/src/hooks/use-copy-to-clipboard.tsx +33 -0
  125. package/src/hooks/use-enter-submit.tsx +23 -0
  126. package/src/hooks/use-local-storage.ts +42 -0
  127. package/src/hooks/use-sidebar.tsx +109 -0
  128. package/src/hooks/useAnimatedText.ts +32 -0
  129. package/src/hooks/useAutosizeTextArea.ts +45 -0
  130. package/src/hooks/useBreakpoint.tsx +123 -0
  131. package/src/hooks/useClickOutside.tsx +38 -0
  132. package/src/hooks/useHover.tsx +33 -0
  133. package/src/hooks/useHoverList.tsx +17 -0
  134. package/src/hooks/useKeyboardShortcuts.ts +91 -0
  135. package/src/hooks/useKeypress.ts +27 -0
  136. package/src/hooks/useOverlay.ts +32 -0
  137. package/src/hooks/useReducedMotion.ts +25 -0
  138. package/src/hooks/useStandaloneMode.ts +35 -0
  139. package/src/hooks/useTouchDevice.ts +34 -0
  140. package/src/icons/index.tsx +129 -0
  141. package/src/index.ts +12 -0
  142. package/src/providers/DesignSystemProvider.tsx +35 -0
  143. package/src/providers/StyledComponentsRegistry.tsx +30 -0
  144. package/src/providers/index.ts +2 -0
  145. package/src/themes/README.md +30 -0
  146. package/src/themes/default/assets/badge-avatar.tsx +45 -0
  147. package/src/themes/default/assets/logo.tsx +42 -0
  148. package/src/themes/default/global.ts +138 -0
  149. package/src/themes/default/modes/dark/config.js +49 -0
  150. package/src/themes/default/modes/dark/skins.js +631 -0
  151. package/src/themes/default/modes/dark/theme.js +87 -0
  152. package/src/themes/default/modes/light/config.js +48 -0
  153. package/src/themes/default/modes/light/skins.js +1026 -0
  154. package/src/themes/default/modes/light/theme.js +74 -0
  155. package/src/themes/default/tokens/controls.js +53 -0
  156. package/src/themes/default/tokens/shadows.js +63 -0
  157. package/src/themes/default/tokens/shapes.js +37 -0
  158. package/src/themes/default/tokens/space.js +143 -0
  159. package/src/themes/default/tokens/spectre.js +16 -0
  160. package/src/themes/default/utils.js +523 -0
  161. package/src/themes/index.ts +11 -0
  162. package/src/types.ts +394 -0
  163. package/src/utils/overlayTheme.ts +61 -0
  164. package/src/utils/pickColor.ts +15 -0
  165. package/tsconfig.json +24 -0
@@ -0,0 +1,71 @@
1
+ export interface StepConfig {
2
+ /** The label text for the step */
3
+ label: string;
4
+ /** Optional path for navigation */
5
+ path?: string;
6
+ /** Whether this step can be navigated to */
7
+ canNavigate?: boolean;
8
+ /** Additional props to pass to the step */
9
+ [key: string]: any;
10
+ }
11
+
12
+ export interface StepThemeConfig {
13
+ /** Base color for active elements */
14
+ baseColor: string;
15
+ /** Text color for labels */
16
+ textColor: string;
17
+ /** Border color for step indicators */
18
+ borderColor: string;
19
+ /** Background color for the progress track */
20
+ trackColor: string;
21
+ /** Background color for the completed progress track */
22
+ completedTrackColor: string;
23
+ /** Size of the progress track */
24
+ size: string;
25
+ /** Unit for the size (rem, px, etc.) */
26
+ unit: string;
27
+ /** Font size for step labels and indicators */
28
+ fontSize: string;
29
+ /** Preset styles for different step states */
30
+ presets: {
31
+ active: {
32
+ bg: string;
33
+ color: string;
34
+ };
35
+ completed: {
36
+ bg: string;
37
+ color: string;
38
+ };
39
+ default: {
40
+ bg: string;
41
+ color: string;
42
+ };
43
+ };
44
+ }
45
+
46
+ export type StepVariant = 'light' | 'dark';
47
+
48
+ export interface BaseStepProps {
49
+ /** Array of step configurations */
50
+ config: StepConfig[];
51
+ /** Index of the currently active step (0-based) */
52
+ active: number;
53
+ /** Custom theme configuration */
54
+ skin?: StepThemeConfig;
55
+ /** Theme variant to use */
56
+ variant?: StepVariant;
57
+ /** Whether to show step labels */
58
+ showLabels?: boolean;
59
+ /** Whether to show edge circles */
60
+ showEdges?: boolean;
61
+ /** Whether to show tooltips on hover */
62
+ showTooltip?: boolean;
63
+ /** Whether to use simple mode (no numbers/icons) */
64
+ simple?: boolean;
65
+ /** Additional props to pass to child components */
66
+ childProps?: Record<string, any>;
67
+ /** Callback when a step is clicked */
68
+ setActive?: (index: number) => void;
69
+ /** Additional props for the container */
70
+ [key: string]: any;
71
+ }
@@ -0,0 +1,136 @@
1
+ "use client";
2
+
3
+ import { Children, type ReactNode, useMemo, useRef } from "react";
4
+ import { motion, type MotionValue, useScroll, useTransform } from "motion/react";
5
+
6
+ import { Box, type BoxProps } from "@/design-system/elements";
7
+ import { useReducedMotion } from "@/design-system/hooks/useReducedMotion";
8
+
9
+ export interface StickySectionStackProps extends BoxProps {
10
+ children: ReactNode;
11
+ topPadding?: string;
12
+ stickyTop?: string;
13
+ stackOffsetBase?: number;
14
+ stickyStep?: number;
15
+ scaleStep?: number;
16
+ minScale?: number;
17
+ sectionMinHeight?: string;
18
+ bottomPadding?: string;
19
+ sectionProps?: BoxProps;
20
+ }
21
+
22
+ interface StickySectionItemProps {
23
+ children: ReactNode;
24
+ index: number;
25
+ total: number;
26
+ progress: MotionValue<number>;
27
+ stickyTop: string;
28
+ stackOffsetBase: number;
29
+ stickyStep: number;
30
+ scaleStep: number;
31
+ minScale: number;
32
+ sectionMinHeight: string;
33
+ sectionProps?: BoxProps;
34
+ }
35
+
36
+ function StickySectionItem({
37
+ children,
38
+ index,
39
+ total,
40
+ progress,
41
+ stickyTop,
42
+ stackOffsetBase,
43
+ stickyStep,
44
+ scaleStep,
45
+ minScale,
46
+ sectionMinHeight,
47
+ sectionProps,
48
+ }: StickySectionItemProps) {
49
+ const rangeStart = total <= 1 ? 0 : index / total;
50
+ const targetScale = Math.max(minScale, 1 - (total - index - 1) * scaleStep);
51
+ const scale = useTransform(progress, [rangeStart, 1], [1, targetScale]);
52
+
53
+ return (
54
+ <Box
55
+ position="sticky"
56
+ top={stickyTop}
57
+ zIndex={index + 1}
58
+ minHeight={sectionMinHeight}
59
+ display="flex"
60
+ justifyContent="center"
61
+ alignItems="flex-start"
62
+ >
63
+ <Box
64
+ as={motion.div}
65
+ style={{
66
+ scale,
67
+ transformOrigin: "top center",
68
+ position: "relative",
69
+ top: `${stackOffsetBase + index * stickyStep}px`,
70
+ }}
71
+ width="100%"
72
+ >
73
+ <Box width="100%" {...sectionProps}>
74
+ {children}
75
+ </Box>
76
+ </Box>
77
+ </Box>
78
+ );
79
+ }
80
+
81
+ export default function StickySectionStack({
82
+ children,
83
+ topPadding = "10vh",
84
+ stickyTop = "4vh",
85
+ stackOffsetBase = 0,
86
+ stickyStep = 24,
87
+ scaleStep = 0.06,
88
+ minScale = 0.82,
89
+ sectionMinHeight = "auto",
90
+ bottomPadding = "30vh",
91
+ sectionProps,
92
+ ...props
93
+ }: StickySectionStackProps) {
94
+ const containerRef = useRef<HTMLDivElement | null>(null);
95
+ const prefersReducedMotion = useReducedMotion();
96
+ const sections = useMemo(() => Children.toArray(children).filter(Boolean), [children]);
97
+
98
+ const { scrollYProgress } = useScroll({
99
+ target: containerRef,
100
+ offset: ["start start", "end end"],
101
+ });
102
+
103
+ if (prefersReducedMotion) {
104
+ return (
105
+ <Box {...props}>
106
+ {sections.map((section, index) => (
107
+ <Box key={index} width="100%" {...sectionProps}>
108
+ {section}
109
+ </Box>
110
+ ))}
111
+ </Box>
112
+ );
113
+ }
114
+
115
+ return (
116
+ <Box ref={containerRef} position="relative" pt={topPadding} pb={bottomPadding} {...props}>
117
+ {sections.map((section, index) => (
118
+ <StickySectionItem
119
+ key={index}
120
+ index={index}
121
+ total={sections.length}
122
+ progress={scrollYProgress}
123
+ stickyTop={stickyTop}
124
+ stackOffsetBase={stackOffsetBase}
125
+ stickyStep={stickyStep}
126
+ scaleStep={scaleStep}
127
+ minScale={minScale}
128
+ sectionMinHeight={sectionMinHeight}
129
+ sectionProps={sectionProps}
130
+ >
131
+ {section}
132
+ </StickySectionItem>
133
+ ))}
134
+ </Box>
135
+ );
136
+ }
@@ -0,0 +1,85 @@
1
+ import { Box, Text } from "@/design-system/elements";
2
+ import { Switch as HeadlessSwitch } from "@headlessui/react";
3
+ import { motion } from "motion/react";
4
+
5
+ const Switch: React.FC<{
6
+ value?: boolean;
7
+ onChange?: (newValue: boolean) => void;
8
+ label?: string;
9
+ help?: string;
10
+ [key: string]: any; // Allow any additional props
11
+ }> = ({ value = false, onChange, label = "", help, ...props }) => {
12
+ const handleToggle = () => {
13
+ onChange?.(!value);
14
+ };
15
+
16
+ const showLabel = Boolean(label);
17
+ const showHelp = Boolean(help);
18
+
19
+ return (
20
+ <Text
21
+ as="div"
22
+ display="flex"
23
+ gap="small"
24
+ alignItems="center"
25
+ width="100%"
26
+ justifyContent="space-between"
27
+ cursor="pointer"
28
+ onClick={handleToggle}
29
+ {...props}
30
+ >
31
+ {(showLabel || showHelp) && (
32
+ <Box display="flex" flexDirection={"column"} gap="mini">
33
+ {showLabel && (
34
+ <Text fontSize={"inherit"} color="primary" fontWeight="600">
35
+ {label}
36
+ </Text>
37
+ )}
38
+ {showHelp && (
39
+ <Text fontSize={"xsmall"} color="secondary">
40
+ {help}
41
+ </Text>
42
+ )}
43
+ </Box>
44
+ )}
45
+ <input
46
+ type="checkbox"
47
+ checked={value}
48
+ onChange={handleToggle}
49
+ style={{ display: "none" }}
50
+ />
51
+ <Box
52
+ as={HeadlessSwitch}
53
+ checked={value}
54
+ shape="pill"
55
+ bg={value ? "brand" : "palette.neutrals.8"}
56
+ position="relative"
57
+ display="inline-flex"
58
+ alignItems="center"
59
+ width="2.5rem"
60
+ aspect={"2.5/1"}
61
+ // height="1.5rem"
62
+ cursor="pointer"
63
+ border="none"
64
+ p="0"
65
+ role="checkbox"
66
+ aria-checked={value}
67
+ tabIndex={0}
68
+ >
69
+ <Box
70
+ as={motion.div}
71
+ animate={{ x: value ? "1.125rem" : "0" }}
72
+ height="100%"
73
+ aspect="1.5/1"
74
+ bg="white"
75
+ border="1px solid"
76
+ borderColor={value ? "brand" : "palette.neutrals.9"}
77
+ shape="pill"
78
+ $shadow="medium"
79
+ position="absolute"
80
+ />
81
+ </Box>
82
+ </Text>
83
+ );
84
+ };
85
+ export default Switch;
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import Box, { BoxProps } from "@/design-system/elements/box";
3
+ import Text from "@/design-system/elements/text";
4
+ import Divider from "../Divider";
5
+ import React from "react";
6
+ import { IconDotsAnim } from "@/design-system/icons";
7
+
8
+ interface SystemNoticeProps extends BoxProps {
9
+ message: React.ReactNode;
10
+ loading?: boolean;
11
+ showBreaks?: boolean;
12
+ colorSchema?: "default" | "warning" | "success" | "error" | "info" | string;
13
+ icon?: React.ReactNode;
14
+ [key: string]: any; // Allow any additional props
15
+ }
16
+
17
+ export default function SystemNotice({
18
+ message,
19
+ loading = false,
20
+ showBreaks = false,
21
+ colorSchema = "default",
22
+ icon,
23
+ ...props
24
+ }: SystemNoticeProps) {
25
+ const schemaStyles = {
26
+ default: {
27
+ skin: "panel",
28
+ color: "secondary",
29
+ },
30
+ success: {
31
+ skin: "success.subtle",
32
+ color: "primary",
33
+ },
34
+ error: {
35
+ skin: "error.subtle",
36
+ color: "primary",
37
+ },
38
+ info: {
39
+ skin: "info.subtle",
40
+ color: "primary",
41
+ },
42
+ warning: {
43
+ skin: "warning.subtle",
44
+ color: "palette.yellows.10",
45
+ },
46
+ };
47
+
48
+ const currentSchema =
49
+ schemaStyles[colorSchema as keyof typeof schemaStyles] ||
50
+ schemaStyles.default;
51
+
52
+ return (
53
+ <>
54
+ {showBreaks && <Divider />}
55
+ <Text
56
+ as="div"
57
+ p="s"
58
+ my="xs"
59
+ shape="rounded"
60
+ display="flex"
61
+ alignItems="center"
62
+ justifyContent="center"
63
+ flex="none"
64
+ fontSize="s"
65
+ textAlign="center"
66
+ fontWeight="medium"
67
+ {...currentSchema}
68
+ {...props}
69
+ >
70
+ {loading && <IconDotsAnim width="1rem" height="1rem" />}
71
+ {icon && !loading && (
72
+ <Box as="span" mr="xs" display="flex" alignItems="center">
73
+ {icon}
74
+ </Box>
75
+ )}
76
+ <Text color="inherit">{message}</Text>
77
+ </Text>
78
+ {showBreaks && <Divider />}
79
+ </>
80
+ );
81
+ }
@@ -0,0 +1,251 @@
1
+ # Table Component
2
+
3
+ A flexible, accessible, and themeable table component built with the design system's Box and Text components. It provides a complete solution for displaying tabular data with support for sorting, pagination, and various styling options.
4
+
5
+ ## Components
6
+
7
+ ### Core Components
8
+
9
+ - **Table** - Main container component with theming support
10
+ - **TableHeader** - Container for header rows (`<thead>`)
11
+ - **TableBody** - Container for body rows (`<tbody>`)
12
+ - **TableFooter** - Container for footer rows (`<tfoot>`)
13
+ - **TableRow** - Individual table row (`<tr>`)
14
+ - **TableCell** - Table cell that can be either `<td>` or `<th>`
15
+
16
+ ### Advanced Components
17
+
18
+ - **SortableTableHeader** - Header cell with built-in sorting functionality
19
+ - **TablePagination** - Pagination controls for large datasets
20
+
21
+ ### Utility Hooks
22
+
23
+ - **useTableControls** - Manages sorting and pagination state
24
+ - **useTableFilters** - Handles filtering logic
25
+ - **useFilteredTableControls** - Combines filtering with table controls
26
+
27
+ ## Installation
28
+
29
+ The Table component is part of the design system blocks:
30
+
31
+ ```tsx
32
+ import {
33
+ Table,
34
+ TableHeader,
35
+ TableBody,
36
+ TableRow,
37
+ TableCell,
38
+ SortableTableHeader,
39
+ TablePagination,
40
+ useTableControls
41
+ } from '@/design-system/blocks';
42
+ ```
43
+
44
+ ## Basic Usage
45
+
46
+ ### Simple Table
47
+
48
+ ```tsx
49
+ <Table>
50
+ <TableHeader>
51
+ <TableRow>
52
+ <TableCell header>Name</TableCell>
53
+ <TableCell header>Email</TableCell>
54
+ <TableCell header>Role</TableCell>
55
+ </TableRow>
56
+ </TableHeader>
57
+ <TableBody>
58
+ <TableRow>
59
+ <TableCell>John Doe</TableCell>
60
+ <TableCell>john@example.com</TableCell>
61
+ <TableCell>Developer</TableCell>
62
+ </TableRow>
63
+ </TableBody>
64
+ </Table>
65
+ ```
66
+
67
+ ### Styled Table
68
+
69
+ ```tsx
70
+ <Table striped hoverable stickyHeader>
71
+ <TableHeader>
72
+ <TableRow>
73
+ <TableCell header>Product</TableCell>
74
+ <TableCell header align="center">Quantity</TableCell>
75
+ <TableCell header align="right">Price</TableCell>
76
+ </TableRow>
77
+ </TableHeader>
78
+ <TableBody>
79
+ <TableRow>
80
+ <TableCell>Widget A</TableCell>
81
+ <TableCell align="center">10</TableCell>
82
+ <TableCell align="right">$99.99</TableCell>
83
+ </TableRow>
84
+ </TableBody>
85
+ </Table>
86
+ ```
87
+
88
+ ## Advanced Usage
89
+
90
+ ### Table with Sorting and Pagination
91
+
92
+ ```tsx
93
+ function DataTable() {
94
+ const {
95
+ currentData,
96
+ sortKey,
97
+ sortDirection,
98
+ handleSort,
99
+ currentPage,
100
+ totalPages,
101
+ totalItems,
102
+ itemsPerPage,
103
+ handlePageChange,
104
+ handlePageSizeChange,
105
+ } = useTableControls({
106
+ data: users,
107
+ initialItemsPerPage: 10,
108
+ });
109
+
110
+ return (
111
+ <>
112
+ <Table striped hoverable>
113
+ <TableHeader>
114
+ <TableRow>
115
+ <SortableTableHeader
116
+ sortKey="name"
117
+ currentSortKey={sortKey}
118
+ currentSortDirection={sortDirection}
119
+ onSort={handleSort}
120
+ >
121
+ Name
122
+ </SortableTableHeader>
123
+ <SortableTableHeader
124
+ sortKey="email"
125
+ currentSortKey={sortKey}
126
+ currentSortDirection={sortDirection}
127
+ onSort={handleSort}
128
+ >
129
+ Email
130
+ </SortableTableHeader>
131
+ </TableRow>
132
+ </TableHeader>
133
+ <TableBody>
134
+ {currentData.map((user) => (
135
+ <TableRow key={user.id}>
136
+ <TableCell>{user.name}</TableCell>
137
+ <TableCell>{user.email}</TableCell>
138
+ </TableRow>
139
+ ))}
140
+ </TableBody>
141
+ </Table>
142
+
143
+ <TablePagination
144
+ currentPage={currentPage}
145
+ totalPages={totalPages}
146
+ totalItems={totalItems}
147
+ itemsPerPage={itemsPerPage}
148
+ onPageChange={handlePageChange}
149
+ showPageSize
150
+ onPageSizeChange={handlePageSizeChange}
151
+ />
152
+ </>
153
+ );
154
+ }
155
+ ```
156
+
157
+ ## Props
158
+
159
+ ### Table Props
160
+
161
+ | Prop | Type | Default | Description |
162
+ |------|------|---------|-------------|
163
+ | `striped` | `boolean` | `false` | Apply alternating row colors |
164
+ | `hoverable` | `boolean` | `false` | Enable hover effects on rows |
165
+ | `compact` | `boolean` | `false` | Reduce padding for a condensed layout |
166
+ | `bordered` | `boolean` | `true` | Add borders to all cells |
167
+ | `stickyHeader` | `boolean` | `false` | Make the header sticky on scroll |
168
+ | `skin` | `'base' \| 'surface' \| 'card'` | `'surface'` | Apply predefined styling |
169
+
170
+ ### TableCell Props
171
+
172
+ | Prop | Type | Default | Description |
173
+ |------|------|---------|-------------|
174
+ | `header` | `boolean` | `false` | Render as header cell (th) |
175
+ | `align` | `'left' \| 'center' \| 'right'` | `'left'` | Text alignment |
176
+ | `colSpan` | `number` | - | Column span |
177
+ | `rowSpan` | `number` | - | Row span |
178
+
179
+ ### TableRow Props
180
+
181
+ | Prop | Type | Default | Description |
182
+ |------|------|---------|-------------|
183
+ | `selected` | `boolean` | `false` | Highlight the row as selected |
184
+ | `clickable` | `boolean` | `false` | Apply clickable styling |
185
+
186
+ ### SortableTableHeader Props
187
+
188
+ | Prop | Type | Default | Description |
189
+ |------|------|---------|-------------|
190
+ | `sortKey` | `string` | - | Column key for sorting |
191
+ | `currentSortKey` | `string` | - | Currently active sort key |
192
+ | `currentSortDirection` | `'asc' \| 'desc' \| null` | - | Current sort direction |
193
+ | `onSort` | `(key: string, direction: SortDirection) => void` | - | Sort handler |
194
+ | `sortable` | `boolean` | `true` | Enable/disable sorting |
195
+
196
+ ### TablePagination Props
197
+
198
+ | Prop | Type | Default | Description |
199
+ |------|------|---------|-------------|
200
+ | `currentPage` | `number` | - | Current page (0-based) |
201
+ | `totalPages` | `number` | - | Total number of pages |
202
+ | `totalItems` | `number` | - | Total number of items |
203
+ | `itemsPerPage` | `number` | - | Items per page |
204
+ | `onPageChange` | `(page: number) => void` | - | Page change handler |
205
+ | `showPageSize` | `boolean` | `false` | Show page size selector |
206
+ | `pageSizeOptions` | `number[]` | `[10, 25, 50, 100]` | Page size options |
207
+ | `onPageSizeChange` | `(size: number) => void` | - | Page size change handler |
208
+
209
+ ## Styling
210
+
211
+ The Table component integrates seamlessly with the design system theme:
212
+
213
+ - Uses theme tokens for colors, spacing, and typography
214
+ - Supports all Box component props for custom styling
215
+ - Maintains semantic HTML structure
216
+ - Fully responsive with horizontal scrolling
217
+
218
+ ### Custom Styling Example
219
+
220
+ ```tsx
221
+ <Table
222
+ striped
223
+ style={{
224
+ '--table-header-bg': 'var(--colors-palette-blue-100)',
225
+ '--table-header-color': 'var(--colors-palette-blue-900)',
226
+ }}
227
+ >
228
+ {/* Table content */}
229
+ </Table>
230
+ ```
231
+
232
+ ## Accessibility
233
+
234
+ - Semantic HTML with proper table structure
235
+ - ARIA labels and roles where appropriate
236
+ - Keyboard navigation support
237
+ - Screen reader friendly
238
+ - Proper focus management
239
+
240
+ ## Best Practices
241
+
242
+ 1. **Always use semantic structure** - Include TableHeader, TableBody, and optionally TableFooter
243
+ 2. **Provide descriptive headers** - Every column should have a clear header
244
+ 3. **Use appropriate alignment** - Numbers right, text left, actions center
245
+ 4. **Consider mobile** - Use horizontal scrolling or compact mode for responsive tables
246
+ 5. **Limit visible rows** - Use pagination for large datasets
247
+ 6. **Provide feedback** - Show loading, empty, and error states appropriately
248
+
249
+ ## Examples
250
+
251
+ See the [Table Patterns documentation](../../docs/examples/tables/table-patterns.md) for more examples and use cases.