From f591f74586aa7ccb887d2fc7f5b4e4541855e464 Mon Sep 17 00:00:00 2001 From: renzp94 <1074720760@qq.com> Date: Sun, 15 Oct 2023 09:49:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0InputNumber=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.mts | 4 + docs/components/InputNumber.md | 164 ++++++++++ docs/example/input-number/addon.svelte | 24 ++ docs/example/input-number/basic.svelte | 7 + docs/example/input-number/bordered.svelte | 5 + docs/example/input-number/disabled.svelte | 5 + docs/example/input-number/formatter.svelte | 20 ++ docs/example/input-number/keyboard.svelte | 10 + docs/example/input-number/precision.svelte | 9 + docs/example/input-number/prefix.svelte | 7 + docs/example/input-number/size.svelte | 9 + packages/adorn-ui/package.json | 1 + packages/adorn-ui/src/Input/Input.svelte | 1 + packages/adorn-ui/src/Input/Number.svelte | 0 packages/adorn-ui/src/Input/index.js | 2 - .../adorn-ui/src/InputNumber/index.svelte | 296 ++++++++++++++++++ packages/adorn-ui/src/index.js | 1 + pnpm-lock.yaml | 7 + 18 files changed, 570 insertions(+), 2 deletions(-) create mode 100644 docs/components/InputNumber.md create mode 100644 docs/example/input-number/addon.svelte create mode 100644 docs/example/input-number/basic.svelte create mode 100644 docs/example/input-number/bordered.svelte create mode 100644 docs/example/input-number/disabled.svelte create mode 100644 docs/example/input-number/formatter.svelte create mode 100644 docs/example/input-number/keyboard.svelte create mode 100644 docs/example/input-number/precision.svelte create mode 100644 docs/example/input-number/prefix.svelte create mode 100644 docs/example/input-number/size.svelte delete mode 100644 packages/adorn-ui/src/Input/Number.svelte create mode 100644 packages/adorn-ui/src/InputNumber/index.svelte diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 472a420..4c3630c 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -84,6 +84,10 @@ const components = [ text: 'Input 输入框', link: '/components/Input' }, + { + text: 'InputNumber 数字输入框', + link: '/components/InputNumber' + }, ] }, ] diff --git a/docs/components/InputNumber.md b/docs/components/InputNumber.md new file mode 100644 index 0000000..1939912 --- /dev/null +++ b/docs/components/InputNumber.md @@ -0,0 +1,164 @@ +--- +title: InputNumber 数字输入框 +lang: zh-CN +--- + +# InputNumber 数字输入框 + +通过鼠标或键盘,输入范围内的数值。 + +## 基本使用 + +基本使用。 + + + +## 三种大小 + +我们为``输入框定义了三种尺寸(大、默认、小),高度分别为`40px`、`32px` 和 `24px`。 + + + +## 前置/后置标签 + +使用`addonBefore`插槽自定义前置标签,`addonAfter`插槽自定义后置标签。 + + + +## 不可用 + +禁用的输入框。 + + + +## 精度限制 + +使用`precision`属性指定精度,为`0`表示只能输入整数。 + + + +## 格式化展示 + +通过`formatter`格式化数字,以展示具有具体含义的数据。此属性只控制展示效果,如果使用了`bind:value`的话,value永远为`数字`。 + +需要获取`格式化数字`,可通过`input`或`change`事件获取。默认如果存在`formatter`则`input`或`change`事件返回的值是`数字`,如果需要`格式化数字`则可以使用`isParse=false`。 + +> 再次说明:`isParse`属性只控制`input`或`change`事件中的值,不控制`value`,`value`永远为`数字`。 + + + +## 键盘行为 + +使用`keyboard`属性可以控制键盘行为。 + + + +## 无边框 + +没有边框。 + + + +## 前置内容 + +使用`prefix`插槽自定义前置内容。 + + + +## Input Props 属性 + +| 属性 | 说明 | 类型 | 默认值 | 版本 | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | -------- | ---- | +| allowClear | 可以点击清除图标删除内容 | `boolean` | `false` | | +| bordered | 是否有边框 | `boolean` | `true` | | +| defaultValue | 输入框默认内容 | `string` | - | | +| disabled | 设置按是否禁用状态 | `boolean` | `false` | +| id | 输入框的id | `string` | - | | +| maxLength | 最大长度 | `number` | - | | +| showCount | 是否展示字数 | `boolean` | `false` | | +| status | 设置校验状态 | `error \| warning` | - | | +| size | 控件大小。 | `large \| middle \| small` | `middle` | | +| type | 声明`input`类型,同原生`input`标签的`type`属性,见:[MDN](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input#%E5%B1%9E%E6%80%A7)(请直接使用`Input.TextArea`代替`type="textarea"`) | `string` | `text` | | +| value | 输入框内容 | `string` | - | | + +## Events 事件 + +| 事件 | 说明 | 类型 | +| ---------- | ------------------ | ----------------------------------------------------------- | +| input | 输入事件 | `(value: CustomEvent) => void` | +| change | 输入改变事件 | `ChangeEventHandler \| undefined \| null` | +| blur | 失去焦点事件 | `FocusEventHandler \| undefined \| null` | +| focus | 获取焦点事件 | `FocusEventHandler \| undefined \| null` | +| keyup | 键盘抬起事件 | `KeyboardEventHandler \| undefined \| null` | +| keydown | 键盘按下事件 | `KeyboardEventHandler \| undefined \| null` | +| keypress | 键盘按下并松开事件 | `KeyboardEventHandler \| undefined \| null` | +| mouseenter | 鼠标移入事件 | `MouseEventHandler \| undefined \| null` | +| mouseleave | 鼠标移出事件 | `MouseEventHandler \| undefined \| null` | +| mousemove | 鼠标移动事件 | `MouseEventHandler \| undefined \| null` | + +## Slots 插槽 + +| 插槽名 | 说明 | +| ----------- | ----------------------------- | +| addonBefore | 带标签的`input`,设置前置标签 | +| addonAfter | 带标签的`input`,设置后置标签 | +| prefix | 带有前缀图标的`input` | +| suffix | 带有后缀图标的`input` | + +## Input.Search Props 属性 + +| 属性 | 说明 | 类型 | 默认值 | 版本 | +| ----------- | -------------------------------- | --------- | ------- | ---- | +| enterButton | 是否有确认按钮,可设为按钮文字。 | `boolean` | `false` | | +| loading | 搜索 loading | `boolean` | `false` | | + +其余属性和`Input`一致。 + +## Events 事件 + +| 事件 | 说明 | 类型 | +| ------ | -------------------------------- | -------------------------------------- | +| search | 点击搜索图标或按下回车键时的回调 | `(value: CustomEvent) => void` | + +其余事件和`Input`一致。 + +## Slots 插槽 + +除了没有`addonAfter`插槽,其他的和`Input`一致。 + +## Input.Password Props 属性 + +| 属性 | 说明 | 类型 | 默认值 | 版本 | +| ------- | ------------ | --------- | ------- | ---- | +| visible | 是否显示密码 | `boolean` | `false` | | + +其余属性和`Input`一致。 + +## Events 事件 + +| 事件 | 说明 | 类型 | +| ------------- | -------------- | --------------------------------------- | +| visibleChange | 显隐密码的回调 | `(value: CustomEvent) => void` | + +其余事件和`Input`一致。 + +## Slots 插槽 + +除了没有`suffix`插槽,其他的和`Input`一致。 + +## Input.TextArea Props 属性 + +| 属性 | 说明 | 类型 | 默认值 | 版本 | +| ------------ | ------------------------ | ------------------ | ------- | ---- | +| allowClear | 可以点击清除图标删除内容 | `boolean` | `false` | | +| bordered | 是否有边框 | `boolean` | `true` | | +| defaultValue | 输入框默认内容 | `string` | - | | +| disabled | 设置按是否禁用状态 | `boolean` | `false` | +| maxLength | 最大长度 | `number` | - | | +| showCount | 是否展示字数 | `boolean` | `false` | | +| status | 设置校验状态 | `error \| warning` | - | | +| value | 输入框内容 | `string` | - | | + +## Events 事件 + +事件和`Input`一致。 diff --git a/docs/example/input-number/addon.svelte b/docs/example/input-number/addon.svelte new file mode 100644 index 0000000..cc43246 --- /dev/null +++ b/docs/example/input-number/addon.svelte @@ -0,0 +1,24 @@ + + + + + http:// + + + + + + http:// + + + + http:// + + + + http:// + + + diff --git a/docs/example/input-number/basic.svelte b/docs/example/input-number/basic.svelte new file mode 100644 index 0000000..375f3f4 --- /dev/null +++ b/docs/example/input-number/basic.svelte @@ -0,0 +1,7 @@ + + + diff --git a/docs/example/input-number/bordered.svelte b/docs/example/input-number/bordered.svelte new file mode 100644 index 0000000..08af600 --- /dev/null +++ b/docs/example/input-number/bordered.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/example/input-number/disabled.svelte b/docs/example/input-number/disabled.svelte new file mode 100644 index 0000000..a45a08b --- /dev/null +++ b/docs/example/input-number/disabled.svelte @@ -0,0 +1,5 @@ + + + diff --git a/docs/example/input-number/formatter.svelte b/docs/example/input-number/formatter.svelte new file mode 100644 index 0000000..49d5115 --- /dev/null +++ b/docs/example/input-number/formatter.svelte @@ -0,0 +1,20 @@ + + + `$ ${v}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')} + stringMode +/> diff --git a/docs/example/input-number/keyboard.svelte b/docs/example/input-number/keyboard.svelte new file mode 100644 index 0000000..86bc3dd --- /dev/null +++ b/docs/example/input-number/keyboard.svelte @@ -0,0 +1,10 @@ + + + + + + diff --git a/docs/example/input-number/precision.svelte b/docs/example/input-number/precision.svelte new file mode 100644 index 0000000..2a1b228 --- /dev/null +++ b/docs/example/input-number/precision.svelte @@ -0,0 +1,9 @@ + + + + + + + diff --git a/docs/example/input-number/prefix.svelte b/docs/example/input-number/prefix.svelte new file mode 100644 index 0000000..de7abfb --- /dev/null +++ b/docs/example/input-number/prefix.svelte @@ -0,0 +1,7 @@ + + + + + diff --git a/docs/example/input-number/size.svelte b/docs/example/input-number/size.svelte new file mode 100644 index 0000000..117d8d4 --- /dev/null +++ b/docs/example/input-number/size.svelte @@ -0,0 +1,9 @@ + + + + + + + diff --git a/packages/adorn-ui/package.json b/packages/adorn-ui/package.json index dec174a..36968eb 100644 --- a/packages/adorn-ui/package.json +++ b/packages/adorn-ui/package.json @@ -79,6 +79,7 @@ }, "dependencies": { "@renzp/classes": "^0.0.3", + "@renzp/number-correct": "^0.0.6", "lodash-es": "^4.17.21" } } diff --git a/packages/adorn-ui/src/Input/Input.svelte b/packages/adorn-ui/src/Input/Input.svelte index 71a92c0..d6b2492 100644 --- a/packages/adorn-ui/src/Input/Input.svelte +++ b/packages/adorn-ui/src/Input/Input.svelte @@ -60,6 +60,7 @@ dispatch('input', value) } } + const onChange = (e: any) => dispatch('change', e.target?.value) let focused = false diff --git a/packages/adorn-ui/src/Input/Number.svelte b/packages/adorn-ui/src/Input/Number.svelte deleted file mode 100644 index e69de29..0000000 diff --git a/packages/adorn-ui/src/Input/index.js b/packages/adorn-ui/src/Input/index.js index 6d4b97e..dbed04c 100644 --- a/packages/adorn-ui/src/Input/index.js +++ b/packages/adorn-ui/src/Input/index.js @@ -1,5 +1,4 @@ import Component from './Input.svelte' -import Number from './Number.svelte' import Password from './Password.svelte' import Search from './Search.svelte' import TextArea from './TextArea.svelte' @@ -7,7 +6,6 @@ import TextArea from './TextArea.svelte' const Input = Object.assign( Component, { - Number, Password, Search, TextArea diff --git a/packages/adorn-ui/src/InputNumber/index.svelte b/packages/adorn-ui/src/InputNumber/index.svelte new file mode 100644 index 0000000..274c708 --- /dev/null +++ b/packages/adorn-ui/src/InputNumber/index.svelte @@ -0,0 +1,296 @@ + + +
+ + +
+ {#if controls} + + +
onStep('up')}> + +
+ + +
onStep('down')}> + +
+ {/if} +
+ + + +
+ + diff --git a/packages/adorn-ui/src/index.js b/packages/adorn-ui/src/index.js index 11e98f7..a579551 100644 --- a/packages/adorn-ui/src/index.js +++ b/packages/adorn-ui/src/index.js @@ -8,6 +8,7 @@ export { FloatButton } from './FloatButton' export { Row, Col } from './Grid' export { default as Icon } from './Icon/index.svelte' export { Input } from './Input' +export { default as InputNumber } from './InputNumber/index.svelte' export { Layout } from './Layout' export { Menu } from './Menu' export { default as Pagination } from './Pagination/index.svelte' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0174cb7..b8cff0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: '@renzp/classes': specifier: ^0.0.3 version: 0.0.3 + '@renzp/number-correct': + specifier: ^0.0.6 + version: 0.0.6 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -709,6 +712,10 @@ packages: resolution: {integrity: sha512-imuC92ILS4s/SLnJzf4C6hbmwS6EBuwQXBfceoveT0VEmpfenCAK66cbzzfjt/+lkmmSgIuifIo4SoZUknPR6A==} dev: false + /@renzp/number-correct@0.0.6: + resolution: {integrity: sha512-dDMxL5MCRwBOVXNMAAb7rdBrtAe19/7Eycz/L1JJ5V54A9ib0LmK0m+iAsI/K74Um1s7kQbhKBwLJJC34X3j9w==} + dev: false + /@sveltejs/kit@1.23.0(svelte@4.2.0)(vite@4.4.9): resolution: {integrity: sha512-MuDM6afpSMnPFMtEsE1O+Qn6NVPNHDqsDYYZE/8/+Z3IvGmE+GKHC+za6fEmCfwXLqNlxFZiV8s8kKOeNVJP+g==} engines: {node: ^16.14 || >=18}