@@ -36,10 +36,34 @@ type Shadow = 'default' | 'transparent' | 'faint' | 'deep';
3636type ShapeTokenGroup = typeof shape ;
3737type ShapeTokenName = keyof ShapeTokenGroup ;
3838
39- type BorderTokenScale = ShapeTokenName extends `border-${infer Scale } `
39+ type BorderShapeTokenScale = ShapeTokenName extends `border-${infer Scale } `
4040 ? Scale
4141 : never ;
4242
43+ type BorderTokenScale = Exclude <
44+ BorderShapeTokenScale ,
45+ `radius-${string } ` | `width-${string } `
46+ > ;
47+
48+ interface Border {
49+ bottom : BorderTokenScale ;
50+ left : BorderTokenScale ;
51+ right : BorderTokenScale ;
52+ top : BorderTokenScale ;
53+ }
54+
55+ type BorderRadiusTokenScale = Extract <
56+ BorderShapeTokenScale ,
57+ `radius-${string } `
58+ > ;
59+
60+ interface BorderRadius {
61+ bottomLeft : BorderRadiusTokenScale | '' ;
62+ bottomRight : BorderRadiusTokenScale | '' ;
63+ topLeft : BorderRadiusTokenScale | '' ;
64+ topRight : BorderRadiusTokenScale | '' ;
65+ }
66+
4367type SpacingTokenGroup = typeof spacing ;
4468type SpacingTokenName = keyof SpacingTokenGroup ;
4569
@@ -48,18 +72,36 @@ type SpacingTokenScale = SpacingTokenName extends `space-${infer Scale}`
4872 ? Scale
4973 : never ;
5074
51- type Spacing = {
75+ interface Spacing {
5276 bottom : SpacingTokenScale | '' ;
5377 left : SpacingTokenScale | '' ;
5478 right : SpacingTokenScale | '' ;
5579 top : SpacingTokenScale | '' ;
56- } ;
80+ }
5781
5882interface BoxBaseProps {
5983 /** Background color of the Box */
6084 background ?: Background ;
6185 /** Border styling of the Box */
6286 border ?: BorderTokenScale ;
87+ /** Bottom border styling of the Box */
88+ borderBottom ?: BorderTokenScale ;
89+ /** Left border styling of the Box */
90+ borderLeft ?: BorderTokenScale ;
91+ /** Right border styling of the Box */
92+ borderRight ?: BorderTokenScale ;
93+ /** Top border styling of the Box */
94+ borderTop ?: BorderTokenScale ;
95+ /** Border radius of the Box */
96+ borderRadius ?: BorderRadiusTokenScale ;
97+ /** Bottom left border radius of the Box */
98+ borderRadiusBottomLeft ?: BorderRadiusTokenScale ;
99+ /** Bottom right border radius of the Box */
100+ borderRadiusBottomRight ?: BorderRadiusTokenScale ;
101+ /** Top left border radius of the Box */
102+ borderRadiusTopLeft ?: BorderRadiusTokenScale ;
103+ /** Top right border radius of the Box */
104+ borderRadiusTopRight ?: BorderRadiusTokenScale ;
63105 /** Inner content of the Box */
64106 children : ReactNode ;
65107 /** Spacing outside of the Box */
@@ -95,7 +137,16 @@ export const Box = forwardRef(
95137 {
96138 as : Component = 'div' ,
97139 background,
98- border,
140+ border = '' ,
141+ borderBottom = '' ,
142+ borderLeft = '' ,
143+ borderRight = '' ,
144+ borderTop = '' ,
145+ borderRadius = '' ,
146+ borderRadiusBottomLeft = '' ,
147+ borderRadiusBottomRight = '' ,
148+ borderRadiusTopLeft = '' ,
149+ borderRadiusTopRight = '' ,
99150 children,
100151 margin = '' ,
101152 marginBottom = '' ,
@@ -111,6 +162,24 @@ export const Box = forwardRef(
111162 } ,
112163 ref ,
113164 ) => {
165+ const borders = {
166+ bottom : borderBottom ? borderBottom : border ,
167+ left : borderLeft ? borderLeft : border ,
168+ right : borderRight ? borderRight : border ,
169+ top : borderTop ? borderTop : border ,
170+ } as Border ;
171+
172+ const borderRadiuses = {
173+ bottomLeft : borderRadiusBottomLeft
174+ ? borderRadiusBottomLeft
175+ : borderRadius ,
176+ bottomRight : borderRadiusBottomRight
177+ ? borderRadiusBottomRight
178+ : borderRadius ,
179+ topLeft : borderRadiusTopLeft ? borderRadiusTopLeft : borderRadius ,
180+ topRight : borderRadiusTopRight ? borderRadiusTopRight : borderRadius ,
181+ } as BorderRadius ;
182+
114183 const margins = {
115184 bottom : marginBottom ? marginBottom : margin ,
116185 left : marginLeft ? marginLeft : margin ,
@@ -148,12 +217,35 @@ export const Box = forwardRef(
148217 '--pc-box-padding-top' : paddings . top
149218 ? `var(--p-space-${ paddings . top } )`
150219 : '' ,
220+ '--pc-box-border-bottom' : borders . bottom
221+ ? `var(--p-border-${ borders . bottom } )`
222+ : '' ,
223+ '--pc-box-border-left' : borders . left
224+ ? `var(--p-border-${ borders . left } )`
225+ : '' ,
226+ '--pc-box-border-right' : borders . right
227+ ? `var(--p-border-${ borders . right } )`
228+ : '' ,
229+ '--pc-box-border-top' : borders . top
230+ ? `var(--p-border-${ borders . top } )`
231+ : '' ,
232+ '--pc-box-border-radius-bottom-left' : borderRadiuses . bottomLeft
233+ ? `var(--p-border-${ borderRadiuses . bottomLeft } )`
234+ : '' ,
235+ '--pc-box-border-radius-bottom-right' : borderRadiuses . bottomRight
236+ ? `var(--p-border-${ borderRadiuses . bottomRight } )`
237+ : '' ,
238+ '--pc-box-border-radius-top-left' : borderRadiuses . topLeft
239+ ? `var(--p-border-${ borderRadiuses . topLeft } )`
240+ : '' ,
241+ '--pc-box-border-radius-top-right' : borderRadiuses . topRight
242+ ? `var(--p-border-${ borderRadiuses . topRight } )`
243+ : '' ,
151244 } as React . CSSProperties ;
152245
153246 const className = classNames (
154247 styles . root ,
155248 background && styles [ background ] ,
156- border && styles [ border ] ,
157249 shadow && styles [ shadow ] ,
158250 ) ;
159251
0 commit comments