diff --git a/src/plugins/prime/stories/Form/InputGroup/InputGroup.mdx b/src/plugins/prime/stories/Form/InputGroup/InputGroup.mdx index d4f39915..53a1fe25 100644 --- a/src/plugins/prime/stories/Form/InputGroup/InputGroup.mdx +++ b/src/plugins/prime/stories/Form/InputGroup/InputGroup.mdx @@ -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'; - -# 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) + +<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} /> diff --git a/src/plugins/prime/stories/Form/InputGroup/InputGroup.stories.js b/src/plugins/prime/stories/Form/InputGroup/InputGroup.stories.js index 91653b6c..5ce5764b 100644 --- a/src/plugins/prime/stories/Form/InputGroup/InputGroup.stories.js +++ b/src/plugins/prime/stories/Form/InputGroup/InputGroup.stories.js @@ -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, }; diff --git a/src/plugins/prime/stories/Form/InputGroup/InputGroup.template.js b/src/plugins/prime/stories/Form/InputGroup/InputGroup.template.js index 64fc5a36..bbc30017 100644 --- a/src/plugins/prime/stories/Form/InputGroup/InputGroup.template.js +++ b/src/plugins/prime/stories/Form/InputGroup/InputGroup.template.js @@ -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> + `, }); diff --git a/src/plugins/prime/theme3.0/components/css/inputgroup.ts b/src/plugins/prime/theme3.0/components/css/inputgroup.ts new file mode 100644 index 00000000..6e9ac1b9 --- /dev/null +++ b/src/plugins/prime/theme3.0/components/css/inputgroup.ts @@ -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; diff --git a/src/plugins/prime/theme3.0/css.ts b/src/plugins/prime/theme3.0/css.ts index c68e950f..cda14fe5 100644 --- a/src/plugins/prime/theme3.0/css.ts +++ b/src/plugins/prime/theme3.0/css.ts @@ -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'; @@ -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 })}