@codecademy/styleguide 79.2.0-alpha.e6658d.0 → 79.2.0-alpha.ed9688.0

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.
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { themed } from '@codecademy/gamut-styles';
3
3
  import styled from '@emotion/styled';
4
- import { Box, GridBox } from '@codecademy/gamut';
4
+ import { Box, GridBox } from '@codecademy/gamut/src';
5
5
 
6
6
  const HexCode = styled.span`
7
7
  font-family: ${themed('fontFamily.monospace')};
@@ -183,12 +183,13 @@ export const globalTypes = {
183
183
  },
184
184
  direction: {
185
185
  name: 'Direction',
186
- description: 'Text direction for the page',
186
+ description: 'Text direction (LTR or RTL)',
187
187
  defaultValue: 'ltr',
188
188
  toolbar: {
189
+ icon: 'arrowright',
189
190
  items: [
190
- { value: 'ltr', icon: 'arrowright', title: 'Left-To-Right' },
191
- { value: 'rtl', icon: 'arrowleft', title: 'Right-To-Left' },
191
+ { value: 'ltr', title: 'Left-to-Right (LTR)', icon: 'arrowright' },
192
+ { value: 'rtl', title: 'Right-to-Left (RTL)', icon: 'arrowleft' },
192
193
  ],
193
194
  showName: true,
194
195
  },
@@ -68,9 +68,8 @@ export const withEmotion = (Story: any, context: GlobalsContext) => {
68
68
  alwaysSetVariables
69
69
  bg={themeBackground[colorMode]}
70
70
  ref={storyRef}
71
- dir={direction}
72
71
  >
73
- {Story()}
72
+ <div dir={direction}>{Story()}</div>
74
73
  </Background>
75
74
  </GamutProvider>
76
75
  );
@@ -86,9 +85,8 @@ export const withEmotion = (Story: any, context: GlobalsContext) => {
86
85
  alwaysSetVariables
87
86
  bg={themeBackground[colorMode]}
88
87
  ref={storyRef}
89
- dir={direction}
90
88
  >
91
- {Story()}
89
+ <div dir={direction}>{Story()}</div>
92
90
  </Background>
93
91
  </GamutProvider>
94
92
  );
package/CHANGELOG.md CHANGED
@@ -3,13 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [79.2.0-alpha.e6658d.0](https://github.com/Codecademy/gamut/compare/@codecademy/styleguide@79.1.0...@codecademy/styleguide@79.2.0-alpha.e6658d.0) (2026-02-09)
6
+ ## [79.2.0-alpha.ed9688.0](https://github.com/Codecademy/gamut/compare/@codecademy/styleguide@79.1.2...@codecademy/styleguide@79.2.0-alpha.ed9688.0) (2026-03-05)
7
7
 
8
8
  ### Features
9
9
 
10
- - Add border related logical props ([#3257](https://github.com/Codecademy/gamut/issues/3257)) ([e852afa](https://github.com/Codecademy/gamut/commit/e852afa6b0f70eb0e3a696c2b0fde7be0047bd5b))
10
+ - Layout related logical CSS props ([#3267](https://github.com/Codecademy/gamut/issues/3267)) ([b43cbf1](https://github.com/Codecademy/gamut/commit/b43cbf1256fbf292a141c77a3251fd95f0085a04))
11
+ - Updates to ThemeProvider, tokens, and transform to allow Logical vs Physical prop resolution ([#3234](https://github.com/Codecademy/gamut/issues/3234)) ([7efbb9a](https://github.com/Codecademy/gamut/commit/7efbb9aabcd07dc6429432d007eaa5603ac1d70c))
11
12
  - Updates to ThemeProvider, tokens, and transform to allow Logical vs Physical prop resolution ([#3234](https://github.com/Codecademy/gamut/issues/3234)) ([567a6ae](https://github.com/Codecademy/gamut/commit/567a6aeffb3e8628db4b5c9a37dab965b716d969))
12
13
 
14
+ ### [79.1.2](https://github.com/Codecademy/gamut/compare/@codecademy/styleguide@79.1.1...@codecademy/styleguide@79.1.2) (2026-02-12)
15
+
16
+ **Note:** Version bump only for package @codecademy/styleguide
17
+
18
+ ### [79.1.1](https://github.com/Codecademy/gamut/compare/@codecademy/styleguide@79.1.0...@codecademy/styleguide@79.1.1) (2026-02-11)
19
+
20
+ **Note:** Version bump only for package @codecademy/styleguide
21
+
13
22
  ## [79.1.0](https://github.com/Codecademy/gamut/compare/@codecademy/styleguide@79.0.0...@codecademy/styleguide@79.1.0) (2026-02-09)
14
23
 
15
24
  ### Features
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@codecademy/styleguide",
3
3
  "description": "Styleguide & Component library for codecademy.com",
4
- "version": "79.2.0-alpha.e6658d.0",
4
+ "version": "79.2.0-alpha.ed9688.0",
5
5
  "author": "Codecademy Engineering",
6
6
  "license": "MIT",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
10
10
  "repository": "git@github.com:Codecademy/gamut.git",
11
- "gitHead": "c9f76514b37c19884b8dcd3fcdff03be92fb7500"
11
+ "gitHead": "149f648579774f0f7be4f3ba4e759bd039b8a3ce"
12
12
  }
@@ -1,4 +1,4 @@
1
- import { Box } from '@codecademy/gamut';
1
+ import { Box } from '@codecademy/gamut/src';
2
2
  import { Meta } from '@storybook/blocks';
3
3
 
4
4
  import { ComponentHeader, LinkTo, TokenTable } from '~styleguide/blocks';
@@ -18,6 +18,16 @@ export const parameters = {
18
18
 
19
19
  Layout props control the visual structure and dimensions of elements. These properties determine how components take up space, their display behavior, and how they align within their containers. Use these props to set widths, heights, overflow behavior, and container types for responsive layouts.
20
20
 
21
+ ## Examples
22
+
23
+ ### Overflow X
24
+
25
+ <Canvas of={LayoutStories.OverflowXExample} />
26
+
27
+ ### Overflow Y
28
+
29
+ <Canvas of={LayoutStories.OverflowYExample} />
30
+
21
31
  ```tsx
22
32
  import styled from '@emotion/styled';
23
33
  import { system } from '@codecademy/gamut-styles';
@@ -9,6 +9,45 @@ const meta: Meta<typeof Box> = {
9
9
  export default meta;
10
10
  type Story = StoryObj<typeof Box>;
11
11
 
12
+ export const OverflowXExample: Story = {
13
+ render: () => (
14
+ <Box
15
+ bg="background-selected"
16
+ overflowX="scroll"
17
+ p={16}
18
+ whiteSpace="nowrap"
19
+ width="200px"
20
+ >
21
+ <Box
22
+ bg="primary"
23
+ color="background-contrast"
24
+ display="inline-block"
25
+ p={8}
26
+ >
27
+ This content is wider than its container and has{' '}
28
+ <Markdown text="`overflowX='scroll'`." /> Inspect the example to see
29
+ what CSS properties are rendered.
30
+ </Box>
31
+ </Box>
32
+ ),
33
+ };
34
+
35
+ export const OverflowYExample: Story = {
36
+ render: () => (
37
+ <Box bg="background-selected" height="100px" overflowY="scroll" p={16}>
38
+ <Box bg="primary" color="background-contrast" p={8}>
39
+ This content is taller than its container and has{' '}
40
+ <Markdown text="`overflowY='scroll'`." /> Inspect the example to see
41
+ what CSS properties are rendered.
42
+ <Box mt={16}>Line 2</Box>
43
+ <Box mt={16}>Line 3</Box>
44
+ <Box mt={16}>Line 4</Box>
45
+ <Box mt={16}>Line 5</Box>
46
+ </Box>
47
+ </Box>
48
+ ),
49
+ };
50
+
12
51
  export const WidthExample: Story = {
13
52
  render: () => (
14
53
  <Box bg="background-selected" p={16}>
@@ -19,9 +58,8 @@ export const WidthExample: Story = {
19
58
  p={16}
20
59
  width="50%"
21
60
  >
22
- This box has <Markdown text="`width='50%' and height='300px'`." /> It
23
- takes up half the width of its container. Inspect the box to see the
24
- rendered CSS property.
61
+ This box has <Markdown text="`width='50%' and height='300px'`." />{' '}
62
+ Inspect the box to see the rendered CSS property.
25
63
  </Box>
26
64
  </Box>
27
65
  ),
@@ -1,8 +1,9 @@
1
- import { Meta } from '@storybook/blocks';
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
2
 
3
3
  import { AboutHeader, TokenTable } from '~styleguide/blocks';
4
4
 
5
5
  import { defaultColumns, getPropRows } from '../../shared/elements';
6
+ import * as PositioningStories from './Positioning.stories';
6
7
 
7
8
  export const parameters = {
8
9
  title: 'Positioning',
@@ -11,7 +12,7 @@ export const parameters = {
11
12
  status: 'updating',
12
13
  };
13
14
 
14
- <Meta title="Foundations/System/Props/Positioning" />
15
+ <Meta title="Foundations/System/Props/Positioning" of={PositioningStories} />
15
16
 
16
17
  <AboutHeader {...parameters} />
17
18
 
@@ -26,4 +27,8 @@ const PositioningExample = styled.div(system.positioning);
26
27
  <PositioningExample position="absolute" zIndex={2} top="0" left="0" />;
27
28
  ```
28
29
 
30
+ These positioning props support both physical and logical CSS properties and will render the appropriate properties based on `useLogicalProperties`'s value passed into the `<GamutProvider>` at the root of your application.
31
+
32
+ <Canvas of={PositioningStories.PositionExample} />
33
+
29
34
  <TokenTable rows={getPropRows('positioning')} columns={defaultColumns} />
@@ -0,0 +1,32 @@
1
+ import { Box, Markdown } from '@codecademy/gamut';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+
4
+ const meta: Meta<typeof Box> = {
5
+ title: 'Foundations/System/Props/Positioning',
6
+ component: Box,
7
+ };
8
+
9
+ export default meta;
10
+ type Story = StoryObj<typeof Box>;
11
+
12
+ export const PositionExample: Story = {
13
+ render: () => (
14
+ <Box bg="background-selected" height="250px" position="relative">
15
+ <Box
16
+ bg="primary"
17
+ color="background-contrast"
18
+ left={16}
19
+ p={16}
20
+ position="absolute"
21
+ top={16}
22
+ >
23
+ This box has{' '}
24
+ <Markdown text="`position='absolute'`, `top={16}`, and `left={16}`." />{' '}
25
+ Inspect the example to see what CSS properties are rendered. You can
26
+ also change the value of{' '}
27
+ <Markdown text="`useLogicalProperties` and `direction`" /> in the
28
+ toolbar to see how the box renders differently.
29
+ </Box>
30
+ </Box>
31
+ ),
32
+ };
@@ -485,8 +485,8 @@ const TRANSFORM_COLUMN = {
485
485
  size: 'fill',
486
486
  render: ({ transform, resolveProperty }: any) => (
487
487
  <>
488
- {transform && <Code>{transform.name}</Code>}{' '}
489
- {resolveProperty && <Code>{resolveProperty.name}</Code>}
488
+ {transform && <Code>{transform?.name}</Code>}
489
+ {resolveProperty && <Code>{resolveProperty?.name}</Code>}
490
490
  </>
491
491
  ),
492
492
  };
@@ -22,7 +22,7 @@ export const parameters = {
22
22
 
23
23
  ## What are CSS logical properties?
24
24
 
25
- CSS logical properties are a modern approach to styling that adapts to the writing mode and text direction of your content, rather than being tied to physical screen directions. More information can be found on[MDN: CSS Logical Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values)
25
+ CSS logical properties are a modern approach to styling that adapts to the writing mode and text direction of your content, rather than being tied to physical screen directions. More information can be found on [MDN: CSS Logical Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_logical_properties_and_values)
26
26
 
27
27
  ### Physical Properties (Traditional)
28
28
 
@@ -46,7 +46,9 @@ Gamut supports both physical and logical CSS properties through the `useLogicalP
46
46
 
47
47
  ### Affected Props
48
48
 
49
- Here are some examples of how physical and logical properties are affected by the `useLogicalProperties` prop:
49
+ When `useLogicalProperties` is enabled, Gamut replaces physical CSS properties with their logical equivalents. This applies to both **base properties** (like `marginLeft`, `width`) and **shorthand props** (like `mx`, `py`).
50
+
51
+ The table below shows a few examples — this is not a comprehensive list.
50
52
 
51
53
  <TokenTable
52
54
  idKey="prop"
@@ -59,7 +61,7 @@ Here are some examples of how physical and logical properties are affected by th
59
61
  },
60
62
  {
61
63
  key: 'physical',
62
- name: 'Physical',
64
+ name: 'Physical CSS',
63
65
  size: 'xl',
64
66
  render: ({ physical }) =>
65
67
  physical.map((p) => (
@@ -70,7 +72,7 @@ Here are some examples of how physical and logical properties are affected by th
70
72
  },
71
73
  {
72
74
  key: 'logical',
73
- name: 'Logical',
75
+ name: 'Logical CSS',
74
76
  size: 'xl',
75
77
  render: ({ logical }) =>
76
78
  logical.map((l) => (
@@ -81,21 +83,35 @@ Here are some examples of how physical and logical properties are affected by th
81
83
  },
82
84
  ]}
83
85
  rows={[
86
+ {
87
+ prop: 'marginLeft',
88
+ physical: ['margin-left'],
89
+ logical: ['margin-inline-start'],
90
+ },
84
91
  {
85
92
  prop: 'mx',
86
93
  physical: ['margin-left', 'margin-right'],
87
94
  logical: ['margin-inline-start', 'margin-inline-end'],
88
95
  },
89
- { prop: 'mt', physical: ['margin-top'], logical: ['margin-block-start'] },
96
+ {
97
+ prop: 'paddingTop',
98
+ physical: ['padding-top'],
99
+ logical: ['padding-block-start'],
100
+ },
90
101
  {
91
102
  prop: 'py',
92
103
  physical: ['padding-top', 'padding-bottom'],
93
104
  logical: ['padding-block-start', 'padding-block-end'],
94
105
  },
95
106
  {
96
- prop: 'pb',
97
- physical: ['padding-bottom'],
98
- logical: ['padding-block-end'],
107
+ prop: 'width',
108
+ physical: ['width'],
109
+ logical: ['inline-size'],
110
+ },
111
+ {
112
+ prop: 'height',
113
+ physical: ['height'],
114
+ logical: ['block-size'],
99
115
  },
100
116
  ]}
101
117
  />
@@ -80,6 +80,7 @@ export const Above: Story = {
80
80
  export const Below: Story = {
81
81
  render: (args) => <PopoverExample {...args} beak="center" position="below" />,
82
82
  };
83
+
83
84
  export const CenterLeft: Story = {
84
85
  render: (args) => (
85
86
  <PopoverExample
@@ -113,6 +114,7 @@ export const PopoverCheckerDense: Story = {
113
114
  />
114
115
  ),
115
116
  };
117
+
116
118
  export const PopoverCheckerLoose: Story = {
117
119
  render: (args) => (
118
120
  <PopoverExample
@@ -122,6 +124,7 @@ export const PopoverCheckerLoose: Story = {
122
124
  />
123
125
  ),
124
126
  };
127
+
125
128
  export const PopoverCheckerRegular: Story = {
126
129
  render: (args) => (
127
130
  <PopoverExample
@@ -131,6 +134,7 @@ export const PopoverCheckerRegular: Story = {
131
134
  />
132
135
  ),
133
136
  };
137
+
134
138
  export const PopoverDiagonalADense: Story = {
135
139
  render: (args) => (
136
140
  <PopoverExample
@@ -140,6 +144,7 @@ export const PopoverDiagonalADense: Story = {
140
144
  />
141
145
  ),
142
146
  };
147
+
143
148
  export const PopoverDiagonalALoose: Story = {
144
149
  render: (args) => (
145
150
  <PopoverExample
@@ -149,6 +154,7 @@ export const PopoverDiagonalALoose: Story = {
149
154
  />
150
155
  ),
151
156
  };
157
+
152
158
  export const PopoverDiagonalARegular: Story = {
153
159
  render: (args) => (
154
160
  <PopoverExample
@@ -296,14 +296,14 @@ export const ZIndex: Story = {
296
296
  },
297
297
  render: (args) => (
298
298
  <FlexBox center flexDirection="column" m={24} py={64}>
299
- <Box bg="paleBlue" zIndex={3}>
299
+ <Box bg="background-primary" zIndex={3}>
300
300
  I will not be behind the infotip, sad + unreadable
301
301
  </Box>
302
302
  <InfoTip
303
303
  ariaLabel="z-index example without override"
304
304
  info="I am inline, cool"
305
305
  />
306
- <Box bg="paleBlue" zIndex={3}>
306
+ <Box bg="background-primary" zIndex={3}>
307
307
  I will be behind the infotip, nice + great
308
308
  </Box>
309
309
  <InfoTip {...args} ariaLabel="z-index example with override" />
@@ -1,12 +1,12 @@
1
1
  import { Box, Column, LayoutGrid, Text } from '@codecademy/gamut';
2
- import type { Meta, StoryObj } from '@storybook/react';
3
- import { Fragment } from 'react';
4
-
2
+ // eslint-disable-next-line gamut/import-paths
5
3
  import {
6
4
  typographyElementVariants,
7
5
  typographyStyleVariants,
8
6
  typographyUtilities,
9
- } from '../../../../../gamut/src/Typography/variants';
7
+ } from '@codecademy/gamut/src/Typography/variants';
8
+ import type { Meta, StoryObj } from '@storybook/react';
9
+ import { Fragment } from 'react';
10
10
 
11
11
  const meta: Meta<typeof Text> = {
12
12
  component: Text,
@@ -1,8 +1,8 @@
1
1
  import { Column, LayoutGrid, Text } from '@codecademy/gamut';
2
+ // eslint-disable-next-line gamut/import-paths
3
+ import { typographyElementVariants } from '@codecademy/gamut/src/Typography/variants';
2
4
  import { Fragment } from 'react';
3
5
 
4
- import { typographyElementVariants } from '../../../../../gamut/src/Typography/variants';
5
-
6
6
  export const Elements: React.FC = () => (
7
7
  <LayoutGrid gap={32} my={48}>
8
8
  {Object.keys(typographyElementVariants).map((tag) => (
@@ -1,4 +1,4 @@
1
- import { Alert, Text } from '@codecademy/gamut';
1
+ import { Alert, Text } from '@codecademy/gamut/src';
2
2
  import { Meta } from '@storybook/blocks';
3
3
 
4
4
  import { AboutHeader, LinkTo } from '~styleguide/blocks';