@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,148 @@
1
+ "use client";
2
+
3
+ import Icon from "../Icon";
4
+ import { Box, Button } from "@/design-system/elements";
5
+ import { usePathname, useRouter, useSearchParams } from "next/navigation";
6
+ import { useCallback } from "react";
7
+
8
+ interface PaginationProps {
9
+ total: number;
10
+ pageSize?: number;
11
+ onPageChange: (page: number) => void;
12
+ }
13
+
14
+ export function Pagination({
15
+ total,
16
+ pageSize = 10,
17
+ onPageChange,
18
+ }: PaginationProps) {
19
+ const router = useRouter();
20
+ const pathname = usePathname();
21
+ const searchParams = useSearchParams();
22
+
23
+ const currentPage = Number(searchParams.get("page") || 1);
24
+ const isLastPage = currentPage * pageSize >= total;
25
+ const pageCount = Math.ceil(total / pageSize);
26
+
27
+ const createQueryString = useCallback(
28
+ (page: number | string) => {
29
+ const params = new URLSearchParams(searchParams.toString());
30
+ params.set("page", page.toString());
31
+ return params.toString();
32
+ },
33
+ [searchParams],
34
+ );
35
+
36
+ const handlePageChange = (page: number | string) => {
37
+ onPageChange(Number(page));
38
+ router.push(`${pathname}?${createQueryString(page)}`);
39
+ };
40
+
41
+ const getPageNumbers = (): (number | string)[] => {
42
+ const pageNumbersToShow = 3;
43
+ const maxPagesBeforeCurrentPage = Math.floor(pageNumbersToShow / 2);
44
+ const maxPagesAfterCurrentPage = Math.ceil(pageNumbersToShow / 2) - 1;
45
+ let startPage = 1;
46
+ let endPage = pageCount;
47
+
48
+ if (pageCount <= 1) {
49
+ return [];
50
+ }
51
+
52
+ if (currentPage <= maxPagesBeforeCurrentPage) {
53
+ startPage = 1;
54
+ endPage = pageNumbersToShow;
55
+ } else if (currentPage + maxPagesAfterCurrentPage >= pageCount) {
56
+ startPage = pageCount - pageNumbersToShow + 1;
57
+ } else {
58
+ startPage = currentPage - maxPagesBeforeCurrentPage;
59
+ endPage = currentPage + maxPagesAfterCurrentPage;
60
+ }
61
+
62
+ let numbers: number[] = Array.from(Array(endPage + 1 - startPage).keys())
63
+ .map((num) => startPage + num)
64
+ .filter((num) => num <= pageCount && num > 0);
65
+
66
+ if (numbers[0] > 1) {
67
+ numbers =
68
+ numbers[0] <= 2
69
+ ? [1, ...numbers]
70
+ : ([1, "...", ...numbers] as number[]);
71
+ }
72
+
73
+ if (numbers[numbers.length - 1] < pageCount) {
74
+ numbers =
75
+ numbers[numbers.length - 1] >= pageCount - 1
76
+ ? [...numbers, pageCount]
77
+ : ([...numbers, "...", pageCount] as number[]);
78
+ }
79
+
80
+ return numbers;
81
+ };
82
+
83
+ // If total items are less than or equal to pageSize, don't show pagination
84
+ if (total <= pageSize) {
85
+ return null;
86
+ }
87
+
88
+ return (
89
+ <Box as="nav" display="flex" justifyContent="center" alignItems="center">
90
+ <Box display="flex" gap="xxsmall">
91
+ <Button
92
+ variant="outline"
93
+ $size="icon.xsmall"
94
+ onClick={() => currentPage !== 1 && handlePageChange(currentPage - 1)}
95
+ disabled={currentPage === 1}
96
+ aria-label={
97
+ currentPage === 1 ? "No previous page available" : "Previous page"
98
+ }
99
+ >
100
+ <Icon icon="IconArrowLeft" size="medium" />
101
+ </Button>
102
+
103
+ {getPageNumbers().map((page, index) =>
104
+ page === "..." ? (
105
+ <Button
106
+ key={`ellipsis-${index}`}
107
+ disabled
108
+ variant="outline"
109
+ $size="icon.xsmall"
110
+ >
111
+ &hellip;
112
+ </Button>
113
+ ) : page === currentPage ? (
114
+ <Button
115
+ key={page}
116
+ $size="icon.xsmall"
117
+ variant="primary"
118
+ aria-current="true"
119
+ // disabled
120
+ >
121
+ {page}
122
+ </Button>
123
+ ) : (
124
+ <Button
125
+ key={page}
126
+ variant="outline"
127
+ $size="icon.xsmall"
128
+ onClick={() => handlePageChange(page)}
129
+ aria-label={`Page ${page}`}
130
+ >
131
+ {page}
132
+ </Button>
133
+ ),
134
+ )}
135
+
136
+ <Button
137
+ variant="outline"
138
+ $size="icon.xsmall"
139
+ onClick={() => !isLastPage && handlePageChange(currentPage + 1)}
140
+ disabled={isLastPage}
141
+ aria-label={isLastPage ? "No next page available" : "Next page"}
142
+ >
143
+ <Icon icon="IconArrowRight" size="medium" />
144
+ </Button>
145
+ </Box>
146
+ </Box>
147
+ );
148
+ }
@@ -0,0 +1,41 @@
1
+ "use client";
2
+
3
+ import { ReactNode } from "react";
4
+ import { Box } from "@/design-system/elements";
5
+ import { Pagination } from "./Pagination";
6
+
7
+ interface PaginationListProps {
8
+ total: number; // total number of items
9
+ pageSize?: number; // items per page (default: 20)
10
+ children: ReactNode; // the list content to render
11
+ onPageChange?: (page: number) => void; // optional callback when page changes
12
+ }
13
+
14
+ export default function PaginationList({
15
+ total,
16
+ pageSize = 10,
17
+ children,
18
+ onPageChange,
19
+ }: PaginationListProps) {
20
+ // Simply pass the onPageChange handler to the Pagination component
21
+ const handlePageChange = (page: number) => {
22
+ if (onPageChange) {
23
+ onPageChange(page);
24
+ }
25
+ };
26
+
27
+ return (
28
+ <>
29
+ {/* Render the paginated content */}
30
+ {children}
31
+ {/* Render the pagination controls */}
32
+ <Box position="sticky" bottom="0" bg="base" p="small">
33
+ <Pagination
34
+ total={total}
35
+ pageSize={pageSize}
36
+ onPageChange={handlePageChange}
37
+ />
38
+ </Box>
39
+ </>
40
+ );
41
+ }
@@ -0,0 +1,2 @@
1
+ export { Pagination } from "./Pagination";
2
+ export { default as PaginationList } from "./PaginationList";
@@ -0,0 +1,63 @@
1
+ import { ResponsiveBar } from "@nivo/bar";
2
+ import { charttheme } from "./utils";
3
+ // import { useTheme } from "styled-components";
4
+
5
+ const BarChart = ({
6
+ data,
7
+ keys,
8
+ indexBy,
9
+ props,
10
+ }: {
11
+ data: any;
12
+ props: any;
13
+ keys: string[];
14
+ indexBy: string;
15
+ }) => {
16
+ // const theme = useTheme();
17
+
18
+ return (
19
+ <ResponsiveBar
20
+ data={data}
21
+ keys={keys}
22
+ indexBy={indexBy}
23
+ {...props}
24
+ margin={{ top: 50, right: 0, bottom: 100, left: 50 }}
25
+ padding={0.125}
26
+ innerPadding={2}
27
+ borderRadius={4}
28
+ borderWidth={1}
29
+ groupMode={"stacked"}
30
+ borderColor={{ from: "color", modifiers: [["brighter", 0.5]] }}
31
+ colors={{ scheme: "tableau10" }}
32
+ axisBottom={{
33
+ tickRotation: -45,
34
+ truncateTickAt: 10,
35
+ }}
36
+ axisLeft={{
37
+ legend: "Messages",
38
+ legendPosition: "middle",
39
+ legendOffset: -40,
40
+ tickValues: 3,
41
+ }}
42
+ labelSkipWidth={12}
43
+ labelSkipHeight={12}
44
+ labelTextColor="white"
45
+ // legends={[
46
+ // {
47
+ // dataFrom: "keys",
48
+ // anchor: "bottom-right",
49
+ // direction: "column",
50
+ // translateX: 120,
51
+ // itemWidth: 100,
52
+ // itemHeight: 20,
53
+ // itemsSpacing: 2,
54
+ // symbolSize: 20,
55
+ // },
56
+ // ]}
57
+ animate={true}
58
+ theme={charttheme}
59
+ />
60
+ );
61
+ };
62
+
63
+ export default BarChart;
@@ -0,0 +1,39 @@
1
+ import React from "react";
2
+ import { ResponsivePie } from "@nivo/pie";
3
+ import { charttheme } from "./utils";
4
+
5
+ const PieChart = ({ data, ...props }: { data: any }) => {
6
+ return (
7
+ <ResponsivePie
8
+ data={data}
9
+ animate
10
+ sortByValue={false}
11
+ innerRadius={0.75}
12
+ padAngle={2}
13
+ cornerRadius={4}
14
+ colors={{ datum: "data.color" }}
15
+ borderWidth={1}
16
+ borderColor={{ from: "color", modifiers: [["brighter", 0.8]] }}
17
+ margin={{ top: 30, right: 30, bottom: 30, left: 30 }}
18
+ arcLinkLabelsSkipAngle={10}
19
+ arcLinkLabelsTextColor="#ffffff88"
20
+ arcLinkLabelsThickness={2}
21
+ arcLinkLabelsColor={{ from: "color", modifiers: [["darker", 2]] }}
22
+ arcLabelsSkipAngle={10}
23
+ arcLabelsTextColor={{
24
+ from: "color",
25
+ modifiers: [["darker", 2]],
26
+ }}
27
+ arcLinkLabel={(d) => `${d.label}`}
28
+ enableArcLabels={false}
29
+ arcLinkLabelsOffset={4}
30
+ arcLinkLabelsDiagonalLength={8}
31
+ arcLinkLabelsStraightLength={8}
32
+ arcLinkLabelsTextOffset={4}
33
+ theme={charttheme}
34
+ {...props}
35
+ />
36
+ );
37
+ };
38
+
39
+ export default PieChart;
@@ -0,0 +1,3 @@
1
+ export { default as BarChart } from "./BarChart";
2
+ export { default as PieChart } from "./PieChart";
3
+ export * from "./utils";
@@ -0,0 +1,103 @@
1
+ export const charttheme = {
2
+ background: "transparent",
3
+ fontFamily: "sans-serif",
4
+ fontSize: 12,
5
+ textColor: "#777777",
6
+ axis: {
7
+ domain: {
8
+ line: {
9
+ stroke: "transparent",
10
+ strokeWidth: 1,
11
+ },
12
+ },
13
+ ticks: {
14
+ line: {
15
+ stroke: "#777777",
16
+ strokeWidth: 2,
17
+ },
18
+ text: {},
19
+ },
20
+ legend: {
21
+ text: {
22
+ fontSize: 12,
23
+ fontWeight: 600,
24
+ },
25
+ },
26
+ },
27
+ grid: {
28
+ line: {
29
+ stroke: "#333",
30
+ strokeWidth: 1,
31
+ strokeDasharray: "2 2",
32
+ },
33
+ },
34
+ legends: {
35
+ text: {
36
+ fill: "#333333",
37
+ fontSize: 12,
38
+ },
39
+ },
40
+ labels: {
41
+ text: { fontSize: 11, fill: "currentColor", fontWeight: 600 },
42
+ },
43
+ markers: {
44
+ lineColor: "#ff0000",
45
+ lineStrokeWidth: 1,
46
+ lineStrokeDasharray: "4 4",
47
+ },
48
+ dots: {
49
+ text: {},
50
+ },
51
+ tooltip: {
52
+ container: {
53
+ background: "black",
54
+ color: "white",
55
+ fontSize: "inherit",
56
+ borderRadius: "8px",
57
+ boxShadow: "0 1px 2px rgba(0, 0, 0, 0.25)",
58
+ padding: "5px 9px",
59
+ },
60
+ basic: {
61
+ whiteSpace: "pre",
62
+ display: "flex",
63
+ alignItems: "center",
64
+ },
65
+ table: {},
66
+ tableCell: {
67
+ padding: "3px 5px",
68
+ },
69
+ },
70
+ crosshair: {
71
+ line: {
72
+ stroke: "#000000",
73
+ strokeWidth: 1,
74
+ strokeOpacity: 0.75,
75
+ strokeDasharray: "6 6",
76
+ },
77
+ },
78
+ annotations: {
79
+ text: {
80
+ fontSize: 13,
81
+ outlineWidth: 2,
82
+ outlineColor: "#ffffff",
83
+ },
84
+ link: {
85
+ stroke: "#000000",
86
+ strokeWidth: 1,
87
+ outlineWidth: 2,
88
+ outlineColor: "#ffffff",
89
+ },
90
+ outline: {
91
+ fill: "none",
92
+ stroke: "#000000",
93
+ strokeWidth: 2,
94
+ outlineWidth: 2,
95
+ outlineColor: "#ffffff",
96
+ },
97
+ symbol: {
98
+ fill: "#000000",
99
+ outlineWidth: 2,
100
+ outlineColor: "#ffffff",
101
+ },
102
+ },
103
+ };