1
- import React from "react" ;
1
+ import React , { useState } from "react" ;
2
2
import { navigate } from "gatsby" ;
3
3
import { useLocation } from "@reach/router" ;
4
-
5
4
import { SistentLayout } from "../../sistent-layout" ;
5
+ import { Col , Row } from "../../../../../reusecore/Layout" ;
6
6
import Button from "../../../../../reusecore/Button" ;
7
+ import { useStyledDarkMode } from "../../../../../theme/app/useStyledDarkMode" ;
8
+
9
+ import {
10
+ styled ,
11
+ Table ,
12
+ TableContainer ,
13
+ TableCell ,
14
+ TableRow ,
15
+ TableHead ,
16
+ TableBody ,
17
+ SistentThemeProvider ,
18
+ CustomTooltip ,
19
+ Box ,
20
+ } from "@sistent/sistent" ;
21
+ import { copyToClipboard } from "../../../../../components/CodeBlock/copy-to-clipboard.js" ;
22
+
23
+
24
+ // Table data
25
+ const spacingTokens = [
26
+ { token : "spacing-00" , px : "0px (8 × 0)" , rem : "0rem" , size : 0 } ,
27
+ { token : "spacing-01" , px : "2px (8 × 0.25)" , rem : "0.125rem" , size : 2 } ,
28
+ { token : "spacing-02" , px : "4px (8 × 0.5)" , rem : "0.25rem" , size : 4 } ,
29
+ { token : "spacing-03" , px : "8px (8 × 1)" , rem : "0.5rem" , size : 8 } ,
30
+ { token : "spacing-04" , px : "16px (8 × 2)" , rem : "1rem" , size : 16 } ,
31
+ { token : "spacing-05" , px : "24px (8 × 3)" , rem : "1.5rem" , size : 24 } ,
32
+ { token : "spacing-06" , px : "32px (8 × 4)" , rem : "2rem" , size : 32 } ,
33
+ { token : "spacing-07" , px : "40px (8 × 5)" , rem : "2.5rem" , size : 40 } ,
34
+ { token : "spacing-08" , px : "48px (8 × 6)" , rem : "3rem" , size : 48 } ,
35
+ { token : "spacing-09" , px : "56px (8 × 7)" , rem : "3.5rem" , size : 56 } ,
36
+ { token : "spacing-10" , px : "64px (8 × 8)" , rem : "4rem" , size : 64 } ,
37
+ { token : "spacing-11" , px : "72px (8 × 9)" , rem : "4.5rem" , size : 72 } ,
38
+ { token : "spacing-12" , px : "80px (8 × 10)" , rem : "5rem" , size : 80 } ,
39
+ ] ;
40
+
41
+ const CopyCell = ( { value } ) => {
42
+ const [ copyText , setCopyText ] = useState ( "Copy" ) ;
43
+
44
+ const handleCopy = async ( ) => {
45
+ await copyToClipboard ( value ) ;
46
+ setCopyText ( "Copied" ) ;
47
+ setTimeout ( ( ) => setCopyText ( "Copy" ) , 1000 ) ;
48
+ } ;
49
+
50
+ return (
51
+ < CustomTooltip
52
+ title = { copyText === "Copied" ? "Copied" : "Copy" }
53
+ enterDelay = { 800 }
54
+ leaveDelay = { 10 }
55
+ placement = "right"
56
+ >
57
+ < Box
58
+ sx = { {
59
+ position : "relative" ,
60
+ display : "inline-flex" ,
61
+ alignItems : "center" ,
62
+ cursor : "pointer" ,
63
+ padding : "2px 4px" ,
64
+ borderRadius : "3px" ,
65
+ transition : "background-color 0.2s ease" ,
66
+ "&:hover" : {
67
+ backgroundColor : ( theme ) =>
68
+ theme . palette . action ?. hover || "rgba(0, 0, 0, 0.04)" ,
69
+ } ,
70
+ } }
71
+ onClick = { handleCopy }
72
+ >
73
+ < span > { value } </ span >
74
+ </ Box >
75
+ </ CustomTooltip >
76
+ ) ;
77
+ } ;
78
+
79
+ const SpacingVisualBox = styled ( "div" ) ( ( { theme, size } ) => ( {
80
+ backgroundColor : theme . palette . brand ?. default || "#00B39F" ,
81
+ width : size === 0 ? "0px" : `${ Math . max ( size , 4 ) } px` ,
82
+ height : "20px" ,
83
+ borderRadius : "4px" ,
84
+ border : size === 0 ? "none" : `1px solid ${ theme . palette . divider } ` ,
85
+ minWidth : size === 0 ? "0px" : "4px" ,
86
+ } ) ) ;
7
87
8
- export const SpacingCode = ( ) => {
88
+ const StyledTableRow = styled ( TableRow ) ( ( { theme } ) => ( {
89
+ "&:nth-child(odd)" : {
90
+ backgroundColor : theme . palette . background . default ,
91
+ } ,
92
+ "&:nth-child(even)" : {
93
+ backgroundColor : theme . palette . background . secondary ,
94
+ } ,
95
+ } ) ) ;
96
+
97
+ const StyledTableContainer = styled ( TableContainer ) ( ( ) => ( {
98
+ width : "100%" ,
99
+ backgroundColor : "transparent" ,
100
+ boxShadow : "none" ,
101
+ padding : 0 ,
102
+ } ) ) ;
103
+
104
+ const StyledTableCell = styled ( TableCell ) ( ( { theme } ) => ( {
105
+ color : theme . palette . text . secondary ,
106
+ fontSize : "0.975rem" ,
107
+ padding : "0.75rem" ,
108
+ borderBottom : `1px solid ${ theme . palette . divider } ` ,
109
+ borderRadius : "4px" ,
110
+ } ) ) ;
111
+
112
+ const StyledHeaderCell = styled ( StyledTableCell ) ( ( ) => ( {
113
+ fontWeight : 600 ,
114
+ } ) ) ;
115
+
116
+ const SpacingCode = ( ) => {
117
+ const { isDark } = useStyledDarkMode ( ) ;
9
118
const location = useLocation ( ) ;
10
119
11
120
return (
@@ -19,6 +128,7 @@ export const SpacingCode = () => {
19
128
clear, concise, and consistent arrangement of interface elements
20
129
across a screen.
21
130
</ p >
131
+
22
132
< div className = "filterBtns" >
23
133
< Button
24
134
className = {
@@ -51,10 +161,84 @@ export const SpacingCode = () => {
51
161
title = "Code"
52
162
/>
53
163
</ div >
164
+
54
165
< div className = "main-content" >
55
- < p > Sorry, this page is still under work</ p >
166
+ < p >
167
+ The spacing system uses standardized tokens to ensure consistent
168
+ spatial relationships across all interface elements. These tokens
169
+ are based on an 8-pixel grid system with additional fractional
170
+ values for fine-grained control.
171
+ </ p >
172
+
173
+ < a id = "Spacing Tokens" >
174
+ < h2 > Spacing Tokens</ h2 >
175
+ </ a >
176
+
177
+ < p >
178
+ Spacing tokens provide a systematic approach to managing space in
179
+ your designs. Built on multiples of 8 pixels, these tokens ensure
180
+ visual harmony and consistency across all components and layouts.
181
+ The system includes half-step (4px) and quarter-step (2px) values
182
+ for precise spacing requirements.
183
+ </ p >
184
+
185
+ < SistentThemeProvider initialMode = { isDark ? "dark" : "light" } >
186
+ < Row className = "table-container" $Hcenter >
187
+ < Col md = { 12 } sx = { { px : 0 } } >
188
+ < StyledTableContainer >
189
+ < Table size = "small" aria-label = "spacing-tokens" >
190
+ < TableHead >
191
+ < TableRow >
192
+ < StyledHeaderCell > Token</ StyledHeaderCell >
193
+ < StyledHeaderCell > Pixel Value</ StyledHeaderCell >
194
+ < StyledHeaderCell > REM Value</ StyledHeaderCell >
195
+ < StyledHeaderCell align = "center" > Visual</ StyledHeaderCell >
196
+ </ TableRow >
197
+ </ TableHead >
198
+ < TableBody >
199
+ { spacingTokens . map ( ( spacing ) => (
200
+ < StyledTableRow key = { spacing . token } >
201
+ < StyledTableCell sx = { { fontFamily : "monospace" } } >
202
+ < CopyCell value = { spacing . token } />
203
+ </ StyledTableCell >
204
+ < StyledTableCell >
205
+ < CopyCell value = { spacing . px } />
206
+ </ StyledTableCell >
207
+ < StyledTableCell >
208
+ < CopyCell value = { spacing . rem } />
209
+ </ StyledTableCell >
210
+ < StyledTableCell align = "center" >
211
+ < SpacingVisualBox size = { spacing . size } />
212
+ </ StyledTableCell >
213
+ </ StyledTableRow >
214
+ ) ) }
215
+ </ TableBody >
216
+ </ Table >
217
+ </ StyledTableContainer >
218
+ </ Col >
219
+ </ Row >
220
+ </ SistentThemeProvider >
221
+
222
+ < a id = "Implementation" >
223
+ < h2 > Implementation</ h2 >
224
+ </ a >
225
+ < p >
226
+ These spacing tokens can be applied across three primary contexts:
227
+ inset (padding), stack (vertical spacing), and inline (horizontal
228
+ spacing). Each token maintains the 8-pixel grid relationship to
229
+ ensure consistent alignment and visual rhythm throughout your
230
+ interface.
231
+ </ p >
232
+ < p >
233
+ When implementing spacing in code, reference these tokens by their
234
+ semantic names rather than hardcoded pixel values. This approach
235
+ maintains design system consistency and makes future updates more
236
+ manageable across your entire application.
237
+ </ p >
56
238
</ div >
57
239
</ div >
58
240
</ SistentLayout >
59
241
) ;
60
242
} ;
243
+
244
+ export default SpacingCode ;
0 commit comments