From 10cd049f109c94e6d31c15ad45c7dddd817d0c55 Mon Sep 17 00:00:00 2001 From: Hanmo <32361024+Hanmo123@users.noreply.github.com> Date: Tue, 11 Jul 2023 10:28:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20Input=20=E5=92=8C=20TextAr?= =?UTF-8?q?ea=20=E7=9A=84=E5=9F=BA=E6=9C=AC=E5=8A=9F=E8=83=BD=20(#2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 新增输入框组件 * perf: 优化 storybook 组件配置 * feat: 新增 TextField 的 Filled 样式 * fix: 修复 type 始终为 text 的问题 * feat: 新增 TextField 的 Standard 样式 * feat: 准备分离 Input 子组件 * feat: 新增 Textarea 子组件 * feat: 新增 Textarea Outlined 样式 * perf: 移除 Standard Input 的无效样式 feat: 新增 Standard Textarea * perf: 调整 Dom 结构 feat: 新增 Helper 插槽 * refactor: 重构 Textarea feat: 新增最大行数限制 * perf: 优化焦点判断方法 * refactor: 合并 Input 和 Textarea 的样式 * perf: 优化累赘 CSS 规则 * feat: 新增下拉展示组件 feat: 新增 fade、fade-scale 动效 * fix: 修复当 slotClass 未提供时的报错问题 * fix: 修复全局 CSS 不生效问题 * feat: 新增出现时机控制字段 * feat: 新增 Standard Select * feat: 新增 Outlined Select * feat: 新增 Filled Select * fix: 修复 Outlined Input 样式错误 fix: 修复 Input 点击外部不会自动聚焦 --- packages/component-vue/.storybook/preview.ts | 2 + .../components/ADropDown.stories.ts | 26 +++ .../component-vue/components/ADropDown.vue | 49 +++++ .../components/AInput.stories.ts | 169 ++++++++++++++++++ packages/component-vue/components/AInput.vue | 112 ++++++++++++ .../components/AInput/AInputDrop.vue | 39 ++++ .../components/AInput/AInputHelper.vue | 9 + .../components/AInput/AInputInput.vue | 19 ++ .../components/AInput/AInputTextarea.vue | 32 ++++ packages/component-vue/components/main.ts | 23 +-- .../interfaces/IADropDownProps.ts | 13 ++ .../component-vue/interfaces/IAInputProps.ts | 14 ++ .../component-vue/interfaces/IATransition.ts | 3 + .../interfaces/IModelModifiers.ts | 5 + packages/component-vue/style/ACommon.css | 1 + packages/component-vue/style/ATransition.css | 22 +++ .../style/components/ADropDown.css | 7 + .../component-vue/style/components/AInput.css | 5 + .../style/components/AInput/AInputCommon.css | 109 +++++++++++ .../style/components/AInput/AInputDrop.css | 37 ++++ .../style/components/AInput/AInputHelper.css | 15 ++ 21 files changed, 701 insertions(+), 10 deletions(-) create mode 100644 packages/component-vue/components/ADropDown.stories.ts create mode 100644 packages/component-vue/components/ADropDown.vue create mode 100644 packages/component-vue/components/AInput.stories.ts create mode 100644 packages/component-vue/components/AInput.vue create mode 100644 packages/component-vue/components/AInput/AInputDrop.vue create mode 100644 packages/component-vue/components/AInput/AInputHelper.vue create mode 100644 packages/component-vue/components/AInput/AInputInput.vue create mode 100644 packages/component-vue/components/AInput/AInputTextarea.vue create mode 100644 packages/component-vue/interfaces/IADropDownProps.ts create mode 100644 packages/component-vue/interfaces/IAInputProps.ts create mode 100644 packages/component-vue/interfaces/IATransition.ts create mode 100644 packages/component-vue/interfaces/IModelModifiers.ts create mode 100644 packages/component-vue/style/ACommon.css create mode 100644 packages/component-vue/style/ATransition.css create mode 100644 packages/component-vue/style/components/ADropDown.css create mode 100644 packages/component-vue/style/components/AInput.css create mode 100644 packages/component-vue/style/components/AInput/AInputCommon.css create mode 100644 packages/component-vue/style/components/AInput/AInputDrop.css create mode 100644 packages/component-vue/style/components/AInput/AInputHelper.css diff --git a/packages/component-vue/.storybook/preview.ts b/packages/component-vue/.storybook/preview.ts index 7d68ffc..49e42ce 100644 --- a/packages/component-vue/.storybook/preview.ts +++ b/packages/component-vue/.storybook/preview.ts @@ -1,5 +1,7 @@ import type { Preview } from '@storybook/vue3' +import '../style/ACommon.css'; + const preview: Preview = { parameters: { actions: { argTypesRegex: '^on[A-Z].*' }, diff --git a/packages/component-vue/components/ADropDown.stories.ts b/packages/component-vue/components/ADropDown.stories.ts new file mode 100644 index 0000000..514e94c --- /dev/null +++ b/packages/component-vue/components/ADropDown.stories.ts @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from "@storybook/vue3"; +import ADropDown from "./ADropDown.vue"; +import { ref } from "vue"; + +const meta: Meta = { + title: 'Components/ADropDown', + component: ADropDown +}; + +const model = ref(false); +const updateModel = (value: any) => model.value = value + +export default meta; +type Story = StoryObj; + +export const Standard: Story = { + render: (args) => ({ + components: { ADropDown }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + transition: 'fade-scale', + when: 'hover' + } +}; \ No newline at end of file diff --git a/packages/component-vue/components/ADropDown.vue b/packages/component-vue/components/ADropDown.vue new file mode 100644 index 0000000..634086c --- /dev/null +++ b/packages/component-vue/components/ADropDown.vue @@ -0,0 +1,49 @@ + + + diff --git a/packages/component-vue/components/AInput.stories.ts b/packages/component-vue/components/AInput.stories.ts new file mode 100644 index 0000000..63dd5d1 --- /dev/null +++ b/packages/component-vue/components/AInput.stories.ts @@ -0,0 +1,169 @@ +import type { Meta, StoryObj } from "@storybook/vue3"; +import AInput from "./AInput.vue"; +import { ref } from "vue"; + +const meta: Meta = { + title: 'Components/AInput', + component: AInput +}; + +const model = ref(''); +const updateModel = (value: any) => model.value = value + +export default meta; +type Story = StoryObj; + +export const Standard: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'text' + }, +}; + +export const Outlined: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'password', + outlined: true + }, +}; + +export const Filled: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'text', + filled: true + }, +}; + +export const SelectStandard: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'select', + options: { + value1: 'label1', + value2: 'label2' + } + }, +}; + +export const SelectOutlined: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'select', + options: { + value1: 'label1', + value2: 'label2' + }, + outlined: true + }, +}; + +export const SelectFilled: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'select', + options: { + value1: 'label1', + value2: 'label2' + }, + filled: true + }, +}; + +export const TextareaStandard: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '个人简介', + type: 'textarea' + }, +}; + +export const TextareaOutlined: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '个人简介', + type: 'textarea', + outlined: true + }, +}; + +export const TextareaFilled: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '个人简介', + type: 'textarea', + filled: true + }, +}; + +export const MaxRow: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '个人简介', + type: 'textarea', + maxrow: 4, + outlined: false, + filled: false + }, +}; + +export const HelperText: Story = { + render: (args) => ({ + components: { AInput }, + setup: () => ({ args, model, updateModel }), + template: '' + }), + args: { + label: '用户名', + type: 'text', + outlined: false, + filled: false + }, +}; \ No newline at end of file diff --git a/packages/component-vue/components/AInput.vue b/packages/component-vue/components/AInput.vue new file mode 100644 index 0000000..493ccb8 --- /dev/null +++ b/packages/component-vue/components/AInput.vue @@ -0,0 +1,112 @@ + + + diff --git a/packages/component-vue/components/AInput/AInputDrop.vue b/packages/component-vue/components/AInput/AInputDrop.vue new file mode 100644 index 0000000..fbba54a --- /dev/null +++ b/packages/component-vue/components/AInput/AInputDrop.vue @@ -0,0 +1,39 @@ + + + diff --git a/packages/component-vue/components/AInput/AInputHelper.vue b/packages/component-vue/components/AInput/AInputHelper.vue new file mode 100644 index 0000000..05089be --- /dev/null +++ b/packages/component-vue/components/AInput/AInputHelper.vue @@ -0,0 +1,9 @@ + + + diff --git a/packages/component-vue/components/AInput/AInputInput.vue b/packages/component-vue/components/AInput/AInputInput.vue new file mode 100644 index 0000000..a632d83 --- /dev/null +++ b/packages/component-vue/components/AInput/AInputInput.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/component-vue/components/AInput/AInputTextarea.vue b/packages/component-vue/components/AInput/AInputTextarea.vue new file mode 100644 index 0000000..0321e60 --- /dev/null +++ b/packages/component-vue/components/AInput/AInputTextarea.vue @@ -0,0 +1,32 @@ + + +