Skip to content
Open
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
58 changes: 18 additions & 40 deletions src/plugins/prime/stories/Form/InputGroup/InputGroup.mdx
Original file line number Diff line number Diff line change
@@ -1,51 +1,29 @@
import { Meta, Story } from '@storybook/addon-docs/blocks';
import { Meta, Canvas, Controls, Title, Description } from '@storybook/addon-docs/blocks';
import * as InputGroupStories from './InputGroup.stories';

import { Template } from './InputGroup.template';

<Meta of={InputGroupStories} />

# InputGroup

[PrimeVue InputGroup](https://primevue.org/inputgroup), [Макет](https://www.figma.com/design/4TYeki0MDLhfPGJstbIicf/UI-kit-PrimeFace-\(DS\)?node-id=484-5932\&node-type=section\&t=2PSg63p2UfJ4cUzB-0)
<Title />
<Description />

### Положение иконки
## Импорт

```html dark
<!-- Слева -->
<PrimeInputGroup>
<PrimeInputGroupAddon>
<i class="ti ti-user"></i>
</PrimeInputGroupAddon>
<PrimeInputText />
</PrimeInputGroup>
```js
import InputGroup from 'primevue/inputgroup';
import InputGroupAddon from 'primevue/inputgroupaddon';
```

<Story of={InputGroupStories.LeftIcon} />
## Варианты использования

```html dark
<!-- Справа -->
<PrimeInputGroup>
<PrimeInputText />
<PrimeInputGroupAddon>
<i class="ti ti-user"></i>
</PrimeInputGroupAddon>
</PrimeInputGroup>
```
### Default
Основной пример компонента. Используйте контролы в таблице (**Addons**, **InputProps**, **Custom**), чтобы изменять содержимое аддонов, размеры и состояния поля.

<Story of={InputGroupStories.RightIcon} />

```html dark
<!-- Слева и справа -->
<PrimeInputGroup>
<PrimeInputGroupAddon>
<i class="ti ti-user"></i>
</PrimeInputGroupAddon>
<PrimeInputText />
<PrimeInputGroupAddon>
<i class="ti ti-user"></i>
</PrimeInputGroupAddon>
</PrimeInputGroup>
```
<Canvas of={InputGroupStories.Default} />

#### Список параметров
<Controls of={InputGroupStories.Default} />

### С текстом
В качестве наполнения `InputGroupAddon` можно использовать обычный текст.

<Story of={InputGroupStories.BothIcons} />
<Canvas of={InputGroupStories.WithText} />
91 changes: 72 additions & 19 deletions src/plugins/prime/stories/Form/InputGroup/InputGroup.stories.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,85 @@
import InputGroup from 'primevue/inputgroup';
import { Template } from './InputGroup.template';

export default {
/**
* Группа полей ввода для объединения с аддонами (иконками или текстом).
*/
const meta = {
title: 'Prime/Form/InputGroup',
};

export const LeftIcon = {
render: Template.bind({}),
name: 'LeftIcon',

component: InputGroup,
tags: ['autodocs'],
argTypes: {
size: {
control: 'select',
options: ['small', 'medium', 'large', 'xlarge'],
description: 'Размер группы полей ввода (влияет на паддинги и шрифты)',
table: { category: 'Custom', defaultValue: { summary: 'medium' } },
},
placeholder: {
control: 'text',
description: 'Текст подсказки для InputText',
table: { category: 'InputProps' },
},
leftIcon: {
control: 'text',
description: 'Класс иконки для левого аддона (например, "ti ti-user")',
table: { category: 'Addons' },
},
leftText: {
control: 'text',
description: 'Текст для левого аддона (например, "@")',
table: { category: 'Addons' },
},
rightIcon: {
control: 'text',
description: 'Класс иконки для правого аддона',
table: { category: 'Addons' },
},
rightText: {
control: 'text',
description: 'Текст для правого аддона (например, "$")',
table: { category: 'Addons' },
},
invalid: {
control: 'boolean',
description: 'Флаг ошибки',
table: { category: 'Props' },
},
disabled: {
control: 'boolean',
description: 'Отключает возможность ввода',
table: { category: 'Props' },
},
readonly: {
control: 'boolean',
description: 'Поле только для чтения',
table: { category: 'Props' },
},
},
args: {
icon: 'left',
size: 'medium',
placeholder: 'Введите данные...',
leftIcon: 'ti ti-user',
leftText: '',
rightIcon: '',
rightText: '',
invalid: false,
disabled: false,
readonly: false,
},
};

export const RightIcon = {
render: Template.bind({}),
name: 'RightIcon',
export default meta;

args: {
icon: 'right',
},
export const Default = {
render: Template,
};

export const BothIcons = {
render: Template.bind({}),
name: 'BothIcons',

export const WithText = {
args: {
icon: 'both',
leftIcon: '',
leftText: '@',
placeholder: 'Username',
},
render: Template,
};
48 changes: 20 additions & 28 deletions src/plugins/prime/stories/Form/InputGroup/InputGroup.template.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,29 @@
import InputText from 'primevue/inputtext';
import InputGroup from 'primevue/inputgroup';
import InputGroupAddon from 'primevue/inputgroupaddon';
import InputText from 'primevue/inputtext';

export const Template = (args) => ({
components: { InputGroup, InputGroupAddon, InputText },
components: { InputText, InputGroup, InputGroupAddon },
setup() {
return { args };
},
template: `
<div>
<InputGroup v-if="args.icon === 'left'">
<InputGroupAddon>
<i class="ti ti-user"></i>
</InputGroupAddon>
<InputText placeholder="InputText" />
</InputGroup>

<InputGroup v-else-if="args.icon === 'right'">
<InputText placeholder="InputText" />
<InputGroupAddon>
<i class="ti ti-user"></i>
</InputGroupAddon>
</InputGroup>

<InputGroup v-else>
<InputGroupAddon>
<i class="ti ti-user"></i>
</InputGroupAddon>
<InputText placeholder="InputText" />
<InputGroupAddon>
<i class="ti ti-user"></i>
</InputGroupAddon>
</InputGroup>
</div>
`,
<InputGroup :class="{ 'p-inputgroup-xlg': args.size === 'xlarge' }">
<InputGroupAddon v-if="args.leftIcon || args.leftText">
<i v-if="args.leftIcon" :class="args.leftIcon"></i>
<span v-else>{{ args.leftText }}</span>
</InputGroupAddon>

<InputText
v-bind="args"
:class="{ 'p-inputtext-xlg': args.size === 'xlarge' }"
style="width: 100%"
/>

<InputGroupAddon v-if="args.rightIcon || args.rightText">
<i v-if="args.rightIcon" :class="args.rightIcon"></i>
<span v-else>{{ args.rightText }}</span>
</InputGroupAddon>
</InputGroup>
`,
});
29 changes: 29 additions & 0 deletions src/plugins/prime/theme3.0/components/css/inputgroup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const css = ({ dt }: { dt: (token: string) => string }) => `
/* Addon в disabled состоянии */
.p-inputgroup:has(input[disabled]) .p-inputgroupaddon,
.p-inputgroup:has(.p-inputtext[disabled]) .p-inputgroupaddon,
.p-inputgroup:has(.p-component[disabled]) .p-inputgroupaddon {
background: ${dt('inputtext.root.disabledBackground')};
color: ${dt('inputtext.root.disabledColor')};
}

/* Иконка внутри addon */
.p-inputgroup.p-inputgroup .p-inputgroupaddon i {
font-size: ${dt('inputgroup.extend.iconSize')};
}

/* Размер XLarge для InputGroup */
.p-inputgroup.p-inputgroup-xlg .p-inputgroupaddon {
font-size: ${dt('inputtext.extend.extXlg.fontSize')};
padding: ${dt('inputtext.extend.extXlg.paddingY')} ${dt(
'inputtext.extend.extXlg.paddingX'
)};
}

/* Корректировка иконки в XLarge */
.p-inputgroup.p-inputgroup-xlg .p-inputgroupaddon i {
font-size: ${dt('inputtext.extend.extXlg.fontSize')};
}
`;

export default css;
2 changes: 2 additions & 0 deletions src/plugins/prime/theme3.0/css.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import menuCss from './components/css/menu';
import dividerCss from './components/css/divider';
import drawerCss from './components/css/drawer';
import messageCss from './components/css/message';
import inputgroupCss from './components/css/inputgroup';
import inputtextCss from './components/css/inputtext';
import popoverCss from './components/css/popover';
import progressbarCss from './components/css/progressbar';
Expand Down Expand Up @@ -39,6 +40,7 @@ const css = ({ dt }: { dt: (token: string) => string }) => `
${dividerCss({ dt })}
${drawerCss({ dt })}
${messageCss({ dt })}
${inputgroupCss({ dt })}
${inputtextCss({ dt })}
${popoverCss({ dt })}
${progressbarCss({ dt })}
Expand Down
Loading