Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 49 additions & 12 deletions src/stories/components/divider/divider.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@ import {
} from './examples/divider-with-content.component';
import { DividerWithIconComponent, WithIcon as WithIconStory } from './examples/divider-with-icon.component';
import { AlignLeft as AlignLeftStory, DividerAlignLeftComponent } from './examples/divider-align-left.component';
import { AlignBottom as AlignBottomStory, DividerAlignBottomComponent } from './examples/divider-align-bottom.component';
import {
AlignBottom as AlignBottomStory,
DividerAlignBottomComponent
} from './examples/divider-align-bottom.component';

type DividerArgs = DividerComponent & { horizontalAlign: string; verticalAlign: string; content: string };

const meta: Meta<DividerComponent> = {
const meta: Meta<DividerArgs> = {
title: 'Components/Panel/Divider',
component: DividerComponent,
tags: ['autodocs'],
Expand Down Expand Up @@ -56,14 +61,37 @@ import { DividerModule } from 'primeng/divider';
type: { summary: "'solid' | 'dash'" }
}
},
align: {
align: { table: { disable: true } },
horizontalAlign: {
name: 'align',
control: 'select',
options: ['left', 'center', 'right', 'top', 'bottom'],
options: ['left', 'center', 'right'],
description: 'Выравнивание контента внутри разделителя',
table: {
category: 'Props',
defaultValue: { summary: 'center' },
type: { summary: "'left' | 'center' | 'right' | 'top' | 'bottom'" }
type: { summary: "'left' | 'center' | 'right'" }
},
if: { arg: 'layout', eq: 'horizontal' }
},
verticalAlign: {
name: 'align',
control: 'select',
options: ['top', 'center', 'bottom'],
description: 'Выравнивание контента внутри разделителя',
table: {
category: 'Props',
defaultValue: { summary: 'center' },
type: { summary: "'top' | 'center' | 'bottom'" }
},
if: { arg: 'layout', eq: 'vertical' }
},
content: {
control: 'text',
description: 'Контент разделителя (content projection); выравнивать без него нечего',
table: {
category: 'Слоты',
type: { summary: 'ng-content' }
}
}
}
Expand All @@ -78,29 +106,38 @@ const commonTemplate = `
`;

export default meta;
type Story = StoryObj<DividerComponent>;
type Story = StoryObj<DividerArgs>;

// ── Default ───────────────────────────────────────────────────────────────────

export const Default: Story = {
name: 'Default',
render: (args) => {
const layout = args.layout ?? 'horizontal';
const align = layout === 'vertical' ? (args.verticalAlign ?? 'center') : (args.horizontalAlign ?? 'center');

const parts: string[] = [];

if (args.layout && args.layout !== 'horizontal') parts.push(`layout="${args.layout}"`);
if (layout !== 'horizontal') parts.push(`layout="${layout}"`);
if (args.type && args.type !== 'solid') parts.push(`type="${args.type}"`);
if (args.align && args.align !== 'center') parts.push(`align="${args.align}"`);
if (align !== 'center') parts.push(`align="${align}"`);

const attrs = parts.length ? `\n ${parts.join('\n ')}\n` : '';
const content = args.content ? `\n <span>${args.content}</span>\n` : '';
const divider = `<extra-divider${attrs}>${content}</extra-divider>`;

const template = parts.length
? `<extra-divider\n ${parts.join('\n ')}\n></extra-divider>`
: `<extra-divider></extra-divider>`;
/* Вертикальному разделителю нужна высота от родителя: без неё он ровно по контенту,
и выравнивать внутри нечего — top, center и bottom дают одно и то же. */
const template = layout === 'vertical' ? `<div class="flex h-40">\n ${divider}\n</div>` : divider;

return { props: args, template };
},
args: {
layout: 'horizontal',
type: 'solid',
align: 'center'
horizontalAlign: 'center',
verticalAlign: 'center',
content: 'Отправитель'
},
parameters: {
docs: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ExtraDividerComponent } from '../../../../lib/components/divider/divider.component';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import {
ExtraDividerAlign,
ExtraDividerComponent,
ExtraDividerLayout,
ExtraDividerType
} from '../../../../lib/components/divider/divider.component';

/* Вертикальному разделителю нужна высота от родителя: без неё он ровно по контенту,
и выравнивать внутри нечего — top, center и bottom дают одно и то же. */
const template = `
<div class="flex h-40">
<extra-divider layout="vertical" align="bottom">
<span>Отправитель</span>
<div [class]="layout === 'vertical' ? 'flex h-40' : ''">
<extra-divider [layout]="layout" [type]="type" [align]="align">
<span>{{ content }}</span>
</extra-divider>
</div>
`;
Expand All @@ -18,12 +25,35 @@ const styles = '';
template,
styles
})
export class DividerAlignBottomComponent {}
export class DividerAlignBottomComponent {
@Input() layout: ExtraDividerLayout = 'vertical';
@Input() type: ExtraDividerType = 'solid';
@Input() align: ExtraDividerAlign = 'bottom';
@Input() content = 'Отправитель';
}

export const AlignBottom = {
render: () => ({
template: `<app-divider-align-bottom></app-divider-align-bottom>`
}),
render: (args: Record<string, unknown>) => {
const layout = (args['layout'] as ExtraDividerLayout) ?? 'vertical';
const align = (layout === 'vertical' ? args['verticalAlign'] : args['horizontalAlign']) as ExtraDividerAlign;

return {
props: { ...args, layout, align },
template: `<app-divider-align-bottom
[layout]="layout"
[type]="type"
[align]="align"
[content]="content"
></app-divider-align-bottom>`
};
},
args: {
layout: 'vertical' as const,
type: 'solid' as const,
horizontalAlign: 'center',
verticalAlign: 'bottom',
content: 'Отправитель'
},
parameters: {
docs: {
description: { story: 'Контент вертикального разделителя выровнен по нижнему краю.' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ExtraDividerComponent } from '../../../../lib/components/divider/divider.component';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import {
ExtraDividerAlign,
ExtraDividerComponent,
ExtraDividerLayout,
ExtraDividerType
} from '../../../../lib/components/divider/divider.component';

/* Вертикальному разделителю нужна высота от родителя: без неё он ровно по контенту,
и выравнивать внутри нечего — top, center и bottom дают одно и то же. */
const template = `
<div>
<extra-divider align="left">
<span>Отправитель</span>
<div [class]="layout === 'vertical' ? 'flex h-40' : ''">
<extra-divider [layout]="layout" [type]="type" [align]="align">
<span>{{ content }}</span>
</extra-divider>
</div>
`;
Expand All @@ -18,12 +25,35 @@ const styles = '';
template,
styles
})
export class DividerAlignLeftComponent {}
export class DividerAlignLeftComponent {
@Input() layout: ExtraDividerLayout = 'horizontal';
@Input() type: ExtraDividerType = 'solid';
@Input() align: ExtraDividerAlign = 'left';
@Input() content = 'Отправитель';
}

export const AlignLeft = {
render: () => ({
template: `<app-divider-align-left></app-divider-align-left>`
}),
render: (args: Record<string, unknown>) => {
const layout = (args['layout'] as ExtraDividerLayout) ?? 'horizontal';
const align = (layout === 'vertical' ? args['verticalAlign'] : args['horizontalAlign']) as ExtraDividerAlign;

return {
props: { ...args, layout, align },
template: `<app-divider-align-left
[layout]="layout"
[type]="type"
[align]="align"
[content]="content"
></app-divider-align-left>`
};
},
args: {
layout: 'horizontal' as const,
type: 'solid' as const,
horizontalAlign: 'left',
verticalAlign: 'top',
content: 'Отправитель'
},
parameters: {
docs: {
description: { story: 'Контент разделителя выровнен по левому краю.' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ExtraDividerComponent } from '../../../../lib/components/divider/divider.component';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import {
ExtraDividerAlign,
ExtraDividerComponent,
ExtraDividerLayout,
ExtraDividerType
} from '../../../../lib/components/divider/divider.component';

/* Вертикальному разделителю нужна высота от родителя: без неё он ровно по контенту,
и выравнивать внутри нечего — top, center и bottom дают одно и то же. */
const template = `
<div>
<extra-divider align="center">
<span>Москва → Новосибирск</span>
<div [class]="layout === 'vertical' ? 'flex h-40' : ''">
<extra-divider [layout]="layout" [type]="type" [align]="align">
<span>{{ content }}</span>
</extra-divider>
</div>
`;
Expand All @@ -18,12 +25,35 @@ const styles = '';
template,
styles
})
export class DividerWithContentComponent {}
export class DividerWithContentComponent {
@Input() layout: ExtraDividerLayout = 'horizontal';
@Input() type: ExtraDividerType = 'solid';
@Input() align: ExtraDividerAlign = 'center';
@Input() content = 'Москва → Новосибирск';
}

export const WithContent = {
render: () => ({
template: `<app-divider-with-content></app-divider-with-content>`
}),
render: (args: Record<string, unknown>) => {
const layout = (args['layout'] as ExtraDividerLayout) ?? 'horizontal';
const align = (layout === 'vertical' ? args['verticalAlign'] : args['horizontalAlign']) as ExtraDividerAlign;

return {
props: { ...args, layout, align },
template: `<app-divider-with-content
[layout]="layout"
[type]="type"
[align]="align"
[content]="content"
></app-divider-with-content>`
};
},
args: {
layout: 'horizontal' as const,
type: 'solid' as const,
horizontalAlign: 'center',
verticalAlign: 'center',
content: 'Москва → Новосибирск'
},
parameters: {
docs: {
description: { story: 'Разделитель с текстовым контентом по центру.' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ExtraDividerComponent } from '../../../../lib/components/divider/divider.component';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import {
ExtraDividerAlign,
ExtraDividerComponent,
ExtraDividerLayout,
ExtraDividerType
} from '../../../../lib/components/divider/divider.component';

/* Вертикальному разделителю нужна высота от родителя: без неё он ровно по контенту,
и выравнивать внутри нечего — top, center и bottom дают одно и то же. */
const template = `
<div>
<extra-divider align="center">
<i class="ti ti-map-pin"></i>
<div [class]="layout === 'vertical' ? 'flex h-40' : ''">
<extra-divider [layout]="layout" [type]="type" [align]="align">
<i [class]="icon"></i>
</extra-divider>
</div>
`;
Expand All @@ -18,12 +25,46 @@ const styles = '';
template,
styles
})
export class DividerWithIconComponent {}
export class DividerWithIconComponent {
@Input() layout: ExtraDividerLayout = 'horizontal';
@Input() type: ExtraDividerType = 'solid';
@Input() align: ExtraDividerAlign = 'center';
@Input() icon = 'ti ti-map-pin';
}

export const WithIcon = {
render: () => ({
template: `<app-divider-with-icon></app-divider-with-icon>`
}),
render: (args: Record<string, unknown>) => {
const layout = (args['layout'] as ExtraDividerLayout) ?? 'horizontal';
const align = (layout === 'vertical' ? args['verticalAlign'] : args['horizontalAlign']) as ExtraDividerAlign;

return {
props: { ...args, layout, align },
template: `<app-divider-with-icon
[layout]="layout"
[type]="type"
[align]="align"
[icon]="icon"
></app-divider-with-icon>`
};
},
args: {
layout: 'horizontal' as const,
type: 'solid' as const,
horizontalAlign: 'center',
verticalAlign: 'center',
icon: 'ti ti-map-pin'
},
argTypes: {
content: { table: { disable: true } },
icon: {
control: 'text',
description: 'Класс иконки tabler icon',
table: {
category: 'Слоты',
type: { summary: 'string' }
}
}
},
parameters: {
docs: {
description: { story: 'Разделитель с иконкой.' },
Expand Down
Loading