diff --git a/src/lib/components/breadcrumb/breadcrumb.component.ts b/src/lib/components/breadcrumb/breadcrumb.component.ts new file mode 100644 index 00000000..740583cf --- /dev/null +++ b/src/lib/components/breadcrumb/breadcrumb.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; +import { Breadcrumb } from 'primeng/breadcrumb'; +import { MenuItem } from 'primeng/api'; + +@Component({ + selector: 'breadcrumb', + standalone: true, + imports: [Breadcrumb], + template: ` + + `, +}) +export class BreadcrumbComponent { + @Input() model: MenuItem[] = []; + @Input() home: MenuItem | undefined = undefined; +} diff --git a/src/prime-preset/tokens/components/breadcrumb.ts b/src/prime-preset/tokens/components/breadcrumb.ts new file mode 100644 index 00000000..5c6fe006 --- /dev/null +++ b/src/prime-preset/tokens/components/breadcrumb.ts @@ -0,0 +1,24 @@ +export const breadcrumbCss = ({ dt }: { dt: (token: string) => string }): string => ` + .p-breadcrumb-item-link { + padding: ${dt('breadcrumb.extend.extItem.padding')}; + font-size: ${dt('fonts.fontSize.200')}; + } + + .p-breadcrumb-item-link:hover { + background: ${dt('breadcrumb.extend.hoverBackground')}; + } + + .p-breadcrumb-item-icon { + font-size: ${dt('breadcrumb.extend.iconSize')}; + } + + .p-breadcrumb-item:last-child .p-breadcrumb-item-link { + opacity: ${dt('opacity.500')}; + pointer-events: none; + cursor: default; + } + + .p-breadcrumb-item:last-child .p-breadcrumb-item-link:hover { + background: ${dt('transparent')}; + } +`; diff --git a/src/stories/components/breadcrumb/breadcrumb.data.ts b/src/stories/components/breadcrumb/breadcrumb.data.ts new file mode 100644 index 00000000..df815a46 --- /dev/null +++ b/src/stories/components/breadcrumb/breadcrumb.data.ts @@ -0,0 +1,15 @@ +import { MenuItem } from 'primeng/api'; + +export const commonHome: MenuItem = { icon: 'ti ti-home', url: '#' }; + +export const commonItems: MenuItem[] = [ + { label: 'Электроника', icon: 'ti ti-device-laptop', url: '#' }, + { label: 'Компьютеры', icon: 'ti ti-cpu', url: '#' }, + { label: 'Ноутбуки' }, +]; + +export const iconOnlyItems: MenuItem[] = [ + { icon: 'ti ti-device-laptop', url: '#' }, + { icon: 'ti ti-cpu', url: '#' }, + { icon: 'ti ti-book' }, +]; diff --git a/src/stories/components/breadcrumb/breadcrumb.stories.ts b/src/stories/components/breadcrumb/breadcrumb.stories.ts new file mode 100644 index 00000000..1f090d38 --- /dev/null +++ b/src/stories/components/breadcrumb/breadcrumb.stories.ts @@ -0,0 +1,75 @@ +import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import { BreadcrumbComponent } from '../../../lib/components/breadcrumb/breadcrumb.component'; +import { BreadcrumbBasicComponent, Basic } from './examples/breadcrumb-basic.component'; +import { BreadcrumbIconsOnlyComponent, IconsOnly } from './examples/breadcrumb-icons-only.component'; +import { commonHome, commonItems } from './breadcrumb.data'; + +type BreadcrumbArgs = BreadcrumbComponent; + +const meta: Meta = { + title: 'Components/Menu/Breadcrumb', + component: BreadcrumbComponent, + tags: ['autodocs'], + decorators: [ + moduleMetadata({ + imports: [ + BreadcrumbComponent, + BreadcrumbBasicComponent, + BreadcrumbIconsOnlyComponent, + ], + }), + ], + parameters: { + designTokens: { prefix: '--p-breadcrumb' }, + docs: { + description: { + component: `Компонент навигации, показывающий путь к текущей странице.`, + }, + }, + }, + argTypes: { + // ── Props ──────────────────────────────────────────────── + model: { + control: 'object', + description: 'Массив элементов меню', + table: { + category: 'Props', + type: { summary: 'MenuItem[]' }, + }, + }, + home: { + control: 'object', + description: 'Элемент для иконки «Домой»', + table: { + category: 'Props', + type: { summary: 'MenuItem' }, + }, + }, + }, + args: { + model: commonItems, + home: commonHome, + }, +}; + +export default meta; +type Story = StoryObj; + +// ── Default ────────────────────────────────────────────────────────────────── +export const Default: Story = { + name: 'Default', + render: (args) => ({ + props: args, + template: ``, + }), + parameters: { + docs: { + description: { + story: 'Базовый пример компонента.', + }, + }, + }, +}; + +// ── Re-exports from example components ──────────────────────────────────── +export { Basic, IconsOnly }; diff --git a/src/stories/components/breadcrumb/examples/breadcrumb-basic.component.ts b/src/stories/components/breadcrumb/examples/breadcrumb-basic.component.ts new file mode 100644 index 00000000..066086f0 --- /dev/null +++ b/src/stories/components/breadcrumb/examples/breadcrumb-basic.component.ts @@ -0,0 +1,56 @@ +import { Component } from '@angular/core'; +import { StoryObj } from '@storybook/angular'; +import { BreadcrumbComponent } from '../../../../lib/components/breadcrumb/breadcrumb.component'; +import { commonHome, commonItems } from '../breadcrumb.data'; + +const template = ` +
+ +
+`; + +@Component({ + selector: 'app-breadcrumb-basic', + standalone: true, + imports: [BreadcrumbComponent], + template, +}) +export class BreadcrumbBasicComponent { + home = commonHome; + model = commonItems; +} + +export const Basic: StoryObj = { + render: () => ({ + template: ``, + }), + parameters: { + docs: { + description: { story: 'Хлебные крошки с текстом и иконками.' }, + source: { + language: 'ts', + code: ` +import { Component } from '@angular/core'; +import { BreadcrumbComponent } from '@cdek-it/angular-ui-kit'; + +@Component({ + selector: 'app-breadcrumb-basic', + standalone: true, + imports: [BreadcrumbComponent], + template: \` + + \`, +}) +export class BreadcrumbBasicComponent { + home = { icon: 'ti ti-home', url: '#' }; + model = [ + { label: 'Электроника', icon: 'ti ti-device-laptop', url: '#' }, + { label: 'Компьютеры', icon: 'ti ti-cpu', url: '#' }, + { label: 'Ноутбуки' }, + ]; +} + `, + }, + }, + }, +}; diff --git a/src/stories/components/breadcrumb/examples/breadcrumb-icons-only.component.ts b/src/stories/components/breadcrumb/examples/breadcrumb-icons-only.component.ts new file mode 100644 index 00000000..2b97a6e2 --- /dev/null +++ b/src/stories/components/breadcrumb/examples/breadcrumb-icons-only.component.ts @@ -0,0 +1,56 @@ +import { Component } from '@angular/core'; +import { StoryObj } from '@storybook/angular'; +import { BreadcrumbComponent } from '../../../../lib/components/breadcrumb/breadcrumb.component'; +import { commonHome, iconOnlyItems } from '../breadcrumb.data'; + +const template = ` +
+ +
+`; + +@Component({ + selector: 'app-breadcrumb-icons-only', + standalone: true, + imports: [BreadcrumbComponent], + template, +}) +export class BreadcrumbIconsOnlyComponent { + home = commonHome; + model = iconOnlyItems; +} + +export const IconsOnly: StoryObj = { + render: () => ({ + template: ``, + }), + parameters: { + docs: { + description: { story: 'Хлебные крошки только с иконками, без текста.' }, + source: { + language: 'ts', + code: ` +import { Component } from '@angular/core'; +import { BreadcrumbComponent } from '@cdek-it/angular-ui-kit'; + +@Component({ + selector: 'app-breadcrumb-icons-only', + standalone: true, + imports: [BreadcrumbComponent], + template: \` + + \`, +}) +export class BreadcrumbIconsOnlyComponent { + home = { icon: 'ti ti-home', url: '#' }; + model = [ + { icon: 'ti ti-device-laptop', url: '#' }, + { icon: 'ti ti-cpu', url: '#' }, + { icon: 'ti ti-book' }, + ]; +} + `, + }, + }, + }, +};