Skip to content

Commit 7f2dcd2

Browse files
feat(nav-drawer): refactor stories and update styles (#1806)
- Added styles for `relative` position behavior. - Simplified story templates with reusable functions. - Adjusted SCSS to use `translate` for cleaner transformations. Co-authored-by: Radoslav Karaivanov <[email protected]>
1 parent 94bcec6 commit 7f2dcd2

File tree

3 files changed

+150
-50
lines changed

3 files changed

+150
-50
lines changed

src/components/nav-drawer/themes/container.base.scss

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
inset-block: 0;
2020
z-index: 999;
2121
opacity: 1;
22-
transition: transform ease-out .3s, .3s, opacity ease-out .3s, .3s;
22+
transition: translate ease-out .3s, .3s, opacity ease-out .3s, .3s;
2323
}
2424

2525
[part~='mini'] {
@@ -125,7 +125,7 @@
125125
:host(:not([open])[position='top']),
126126
:host(:not([open])[position='bottom']) {
127127
[part='base'] {
128-
transform: translateY(-60vh);
128+
translate: 0 -60vh;
129129
}
130130

131131
[part='mini'] {
@@ -135,7 +135,7 @@
135135

136136
:host(:not([open])[position='bottom']) {
137137
[part='base'] {
138-
transform: translateY(60vh);
138+
translate: 0 60vh;
139139
}
140140
}
141141

@@ -161,7 +161,7 @@
161161

162162
:host(:not([open])) {
163163
[part='base'] {
164-
transform: translateX(calc(100% * var(--dir)));
164+
translate: calc(100% * var(--dir)) 0;
165165
opacity: 0;
166166
}
167167

@@ -170,3 +170,15 @@
170170
opacity: 0;
171171
}
172172
}
173+
174+
:host([position='relative']:not([open])) {
175+
[part='base'] {
176+
opacity: 1;
177+
overflow: hidden;
178+
}
179+
180+
[part='main'] {
181+
opacity: 0;
182+
}
183+
}
184+

src/components/nav-drawer/themes/shared/container/nav-drawer.common.scss

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,23 @@ $background: var-get($theme, 'background') !default;
2222
box-shadow: var-get($theme, 'elevation');
2323
}
2424

25-
[part~='base'],
26-
[part~='mini'] {
25+
:host([position='start']) [part~='base'],
26+
:host([position='start']) [part~='mini'] {
2727
border-inline-end-color: var-get($theme, 'border-color');
2828
}
2929

30+
:host([position='end']) [part~='base'],
31+
:host([position='end']) [part~='mini'] {
32+
border-inline-start-color: var-get($theme, 'border-color');
33+
}
34+
35+
:host([position='relative']) {
36+
[part~='base'],
37+
[part~='mini'] {
38+
border-inline-end-color: var-get($theme, 'border-color');
39+
}
40+
}
41+
3042
:host([open]:not([position='relative'])) {
3143
[part='base'] {
3244
box-shadow: var-get($theme, 'elevation');

stories/nav-drawer.stories.ts

Lines changed: 120 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -117,63 +117,139 @@ const handleToggle = () => {
117117
drawer?.toggle();
118118
};
119119

120-
const Template = ({ open = false, position }: IgcNavDrawerArgs) => {
121-
return html`
122-
<style>
123-
.main {
124-
display: flex;
125-
margin: -1rem;
126-
height: 100vh;
127-
overflow: hidden;
120+
const commonStyles = html`
121+
<style>
122+
.main {
123+
display: grid;
124+
grid-template-columns: auto 1fr;
125+
justify-content: center;
126+
height: 100vh;
127+
overflow: hidden;
128+
margin: -16px;
129+
}
130+
131+
.content {
132+
display: grid;
133+
grid-template-rows: auto 1fr;
134+
grid-template-columns: auto;
135+
gap: 8px;
136+
height: fit-content;
137+
align-items: center;
138+
justify-self: center;
139+
padding: 16px;
140+
141+
p {
142+
grid-column: 1 / -1;
128143
}
129-
130-
.content {
131-
padding-inline-start: 20px;
132-
font-family: var(--ig-font-family);
133-
}
134-
</style>
144+
}
145+
146+
.relative {
147+
grid-template-columns: auto auto auto;
148+
text-align: left;
149+
justify-self: start;
150+
}
151+
</style>
152+
`;
153+
154+
const createDrawerContent = (headerText: string, itemCount = 15) => html`
155+
<igc-nav-drawer-header-item>${headerText}</igc-nav-drawer-header-item>
156+
157+
${Array.from(range(itemCount)).map(
158+
(i) => html`
159+
<igc-nav-drawer-item>
160+
<igc-icon slot="icon" name="home"></igc-icon>
161+
<span slot="content">Navbar item ${i + 1}</span>
162+
</igc-nav-drawer-item>
163+
`
164+
)}
165+
166+
<igc-nav-drawer-item disabled>
167+
<igc-icon slot="icon" name="home"></igc-icon>
168+
<span slot="content">Disabled item</span>
169+
</igc-nav-drawer-item>
170+
`;
171+
172+
// Create a function for mini slot content
173+
const createMiniContent = () => html`
174+
<div slot="mini">
175+
<igc-nav-drawer-item>
176+
<igc-icon slot="icon" name="search"></igc-icon>
177+
</igc-nav-drawer-item>
178+
179+
<igc-nav-drawer-item>
180+
<igc-icon slot="icon" name="home"></igc-icon>
181+
</igc-nav-drawer-item>
182+
183+
<igc-nav-drawer-item disabled>
184+
<igc-icon slot="icon" name="home"></igc-icon>
185+
</igc-nav-drawer-item>
186+
</div>
187+
`;
188+
189+
// Create a function for control buttons
190+
const createControlButtons = (position: string) => html`
191+
${position === 'relative'
192+
? html`
193+
<igc-button @click="${handleToggle}">Toggle</igc-button>
194+
<igc-button variant="outlined" @click="${handleClose}"
195+
>Close</igc-button
196+
>
197+
`
198+
: ''}
199+
200+
<igc-button variant="outlined" @click="${handleOpen}">Open</igc-button>
201+
`;
202+
203+
// Main template function
204+
const createTemplate = (options: {
205+
headerText?: string;
206+
itemCount?: number;
207+
includeMini?: boolean;
208+
contentText?: string;
209+
}) => {
210+
return ({ open = false, position }: IgcNavDrawerArgs) => html`
211+
${commonStyles}
135212
136213
<div class="ig-scrollbar main">
137214
<igc-nav-drawer
138215
.open=${open}
139216
.position=${position}
140217
@click="${handleClick}"
141218
>
142-
<igc-nav-drawer-header-item>Sample Drawer</igc-nav-drawer-header-item>
143-
144-
${Array.from(range(15)).map(
145-
(i) => html`
146-
<igc-nav-drawer-item>
147-
<igc-icon slot="icon" name="home"></igc-icon>
148-
<span slot="content">Navbar item ${i + 1}</span>
149-
</igc-nav-drawer-item>
150-
`
219+
${createDrawerContent(
220+
options.headerText || 'Sample Drawer',
221+
options.itemCount
151222
)}
152-
153-
<igc-nav-drawer-item disabled>
154-
<igc-icon slot="icon" name="home"></igc-icon>
155-
<span slot="content">Disabled item</span>
156-
</igc-nav-drawer-item>
157-
158-
<div slot="mini">
159-
<igc-nav-drawer-item>
160-
<igc-icon slot="icon" name="home"></igc-icon>
161-
</igc-nav-drawer-item>
162-
163-
<igc-nav-drawer-item>
164-
<igc-icon slot="icon" name="search"></igc-icon>
165-
</igc-nav-drawer-item>
166-
</div>
223+
${options.includeMini ? createMiniContent() : ''}
167224
</igc-nav-drawer>
168225
169-
<section class="content">
170-
<p>Sample page content</p>
171-
<igc-button @click="${handleOpen}">Open</igc-button>
172-
<igc-button @click="${handleClose}">Close</igc-button>
173-
<igc-button @click="${handleToggle}">Toggle</igc-button>
226+
<section class="content ${position === 'relative' ? 'relative' : ''}">
227+
<p>${options.contentText}</p>
228+
${createControlButtons(position)}
174229
</section>
175230
</div>
176231
`;
177232
};
178233

179-
export const Basic: Story = Template.bind({});
234+
// Now create your stories using the template factory
235+
export const Basic: Story = {
236+
render: createTemplate({
237+
headerText: 'Drawer header',
238+
itemCount: 15,
239+
includeMini: false,
240+
contentText: 'Basic drawer example',
241+
}),
242+
};
243+
244+
export const MiniVariant: Story = {
245+
render: createTemplate({
246+
headerText: 'Drawer header',
247+
itemCount: 5,
248+
includeMini: true,
249+
contentText: 'Mini drawer example ',
250+
}),
251+
args: {
252+
position: 'start',
253+
open: false,
254+
},
255+
};

0 commit comments

Comments
 (0)