diff --git a/README.md b/README.md
index ad3796f30..2d8636ad2 100644
--- a/README.md
+++ b/README.md
@@ -44,9 +44,6 @@
# 安装项目 npm 依赖,在 node 12 下会有报错但不影响正常使用。
npm i --legacy-peer-deps
-# 因为需要 require 一个 formula/lib/doc.md 文件,所以需要先生成一下
-npm run build --workspace amis-formula
-
# 启动项目,等编译结束后通过 http://127.0.0.1:8888/examples/pages/simple 访问。
npm start
```
diff --git a/examples/components/CssDocs.tsx b/examples/components/CssDocs.tsx
index 3c71c2821..92ea597ec 100644
--- a/examples/components/CssDocs.tsx
+++ b/examples/components/CssDocs.tsx
@@ -51,7 +51,9 @@ export const cssDocs = [
label: 'Box Sizing',
path: '/zh-CN/style/layout/box-sizing',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_box-sizing.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/layout/_box-sizing.md'
+ ).then(wrapDoc)
)
},
@@ -59,7 +61,9 @@ export const cssDocs = [
label: 'Display',
path: '/zh-CN/style/layout/display',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_display.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_display.md').then(
+ wrapDoc
+ )
)
},
@@ -67,7 +71,9 @@ export const cssDocs = [
label: 'Floats',
path: '/zh-CN/style/layout/floats',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_float.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_float.md').then(
+ wrapDoc
+ )
)
},
@@ -75,7 +81,9 @@ export const cssDocs = [
label: 'Clear',
path: '/zh-CN/style/layout/clear',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_clear.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_clear.md').then(
+ wrapDoc
+ )
)
},
@@ -83,7 +91,9 @@ export const cssDocs = [
label: 'Overflow',
path: '/zh-CN/style/layout/overflow',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_overflow.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_overflow.md').then(
+ wrapDoc
+ )
)
},
@@ -91,7 +101,9 @@ export const cssDocs = [
label: 'Position',
path: '/zh-CN/style/layout/position',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_position.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_position.md').then(
+ wrapDoc
+ )
)
},
@@ -99,9 +111,9 @@ export const cssDocs = [
label: 'Top / Right / Bottom / Left',
path: '/zh-CN/style/layout/top-right-bottom-left',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_top-right-bottom-left.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/layout/_top-right-bottom-left.md'
+ ).then(wrapDoc)
)
},
@@ -109,7 +121,9 @@ export const cssDocs = [
label: 'Visibility',
path: '/zh-CN/style/layout/visibility',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_visibility.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/layout/_visibility.md'
+ ).then(wrapDoc)
)
},
@@ -117,7 +131,9 @@ export const cssDocs = [
label: 'Z-Index',
path: '/zh-CN/style/layout/z-index',
component: React.lazy(() =>
- import('amis-ui/scss/helper/layout/_z-index.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/layout/_z-index.md').then(
+ wrapDoc
+ )
)
}
]
@@ -130,7 +146,9 @@ export const cssDocs = [
label: 'Flex Direction',
path: '/zh-CN/style/flex/direction',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_direction.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_direction.md').then(
+ wrapDoc
+ )
)
},
@@ -138,7 +156,9 @@ export const cssDocs = [
label: 'Flex Wrap',
path: '/zh-CN/style/flex/wrap',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_wrap.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_wrap.md').then(
+ wrapDoc
+ )
)
},
@@ -146,7 +166,9 @@ export const cssDocs = [
label: 'Flex',
path: '/zh-CN/style/flex/flex',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_flex.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_flex.md').then(
+ wrapDoc
+ )
)
},
@@ -154,7 +176,9 @@ export const cssDocs = [
label: 'Flex Grow',
path: '/zh-CN/style/flex/grow',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_grow.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_grow.md').then(
+ wrapDoc
+ )
)
},
@@ -162,7 +186,9 @@ export const cssDocs = [
label: 'Flex Shrink',
path: '/zh-CN/style/flex/shrink',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_shrink.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_shrink.md').then(
+ wrapDoc
+ )
)
},
@@ -170,7 +196,9 @@ export const cssDocs = [
label: 'Flex Order',
path: '/zh-CN/style/flex/order',
component: React.lazy(() =>
- import('amis-ui/scss/helper/flex/_order.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/flex/_order.md').then(
+ wrapDoc
+ )
)
}
]
@@ -183,58 +211,72 @@ export const cssDocs = [
label: 'Grid Template Columns',
path: '/zh-CN/style/grid/columns',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_columns.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/grid/_columns.md').then(
+ wrapDoc
+ )
)
},
{
label: 'Grid Column Start / End',
path: '/zh-CN/style/grid/column-start-end',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_column-start-end.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/grid/_column-start-end.md'
+ ).then(wrapDoc)
)
},
{
label: 'Grid Template Rows',
path: '/zh-CN/style/grid/rows',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_rows.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/grid/_rows.md').then(
+ wrapDoc
+ )
)
},
{
label: 'Grid Row Start / End',
path: '/zh-CN/style/grid/row-start-end',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_row-start-end.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/grid/_row-start-end.md'
+ ).then(wrapDoc)
)
},
{
label: 'Grid Auto Flow',
path: '/zh-CN/style/grid/auto-flow',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_auto-flow.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/grid/_auto-flow.md').then(
+ wrapDoc
+ )
)
},
{
label: 'Grid Auto Columns',
path: '/zh-CN/style/grid/auto-columns',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_auto-columns.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/grid/_auto-columns.md'
+ ).then(wrapDoc)
)
},
{
label: 'Grid Auto Rows',
path: '/zh-CN/style/grid/auto-rows',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_auto-rows.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/grid/_auto-rows.md').then(
+ wrapDoc
+ )
)
},
{
label: 'Gap',
path: '/zh-CN/style/grid/gap',
component: React.lazy(() =>
- import('amis-ui/scss/helper/grid/_gap.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/grid/_gap.md').then(
+ wrapDoc
+ )
)
}
]
@@ -247,7 +289,7 @@ export const cssDocs = [
path: '/zh-CN/style/box-alignment/justify-content',
component: React.lazy(() =>
import(
- 'amis-ui/scss/helper/box-alignment/_justify-content.scss'
+ '../../packages/amis-ui/scss/helper/box-alignment/_justify-content.md'
).then(wrapDoc)
)
},
@@ -256,9 +298,9 @@ export const cssDocs = [
label: 'Justify Items',
path: '/zh-CN/style/box-alignment/justify-items',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_justify-items.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_justify-items.md'
+ ).then(wrapDoc)
)
},
@@ -266,9 +308,9 @@ export const cssDocs = [
label: 'Justify Self',
path: '/zh-CN/style/box-alignment/justify-self',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_justify-self.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_justify-self.md'
+ ).then(wrapDoc)
)
},
@@ -276,9 +318,9 @@ export const cssDocs = [
label: 'Align Content',
path: '/zh-CN/style/box-alignment/align-content',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_align-content.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_align-content.md'
+ ).then(wrapDoc)
)
},
@@ -286,9 +328,9 @@ export const cssDocs = [
label: 'Align Items',
path: '/zh-CN/style/box-alignment/align-items',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_align-items.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_align-items.md'
+ ).then(wrapDoc)
)
},
@@ -296,9 +338,9 @@ export const cssDocs = [
label: 'Align Self',
path: '/zh-CN/style/box-alignment/align-self',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_align-self.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_align-self.md'
+ ).then(wrapDoc)
)
},
@@ -306,9 +348,9 @@ export const cssDocs = [
label: 'Place Content',
path: '/zh-CN/style/box-alignment/place-content',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_place-content.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_place-content.md'
+ ).then(wrapDoc)
)
},
@@ -316,9 +358,9 @@ export const cssDocs = [
label: 'Place Items',
path: '/zh-CN/style/box-alignment/place-items',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_place-items.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_place-items.md'
+ ).then(wrapDoc)
)
},
@@ -326,9 +368,9 @@ export const cssDocs = [
label: 'Place Self',
path: '/zh-CN/style/box-alignment/place-self',
component: React.lazy(() =>
- import('amis-ui/scss/helper/box-alignment/_place-self.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/box-alignment/_place-self.md'
+ ).then(wrapDoc)
)
}
]
@@ -341,7 +383,9 @@ export const cssDocs = [
label: 'Padding',
path: '/zh-CN/style/spacing/padding',
component: React.lazy(() =>
- import('amis-ui/scss/helper/spacing/_padding.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/spacing/_padding.md').then(
+ wrapDoc
+ )
)
},
@@ -349,7 +393,9 @@ export const cssDocs = [
label: 'Margin',
path: '/zh-CN/style/spacing/margin',
component: React.lazy(() =>
- import('amis-ui/scss/helper/spacing/_margin.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/spacing/_margin.md').then(
+ wrapDoc
+ )
)
},
@@ -357,9 +403,9 @@ export const cssDocs = [
label: 'Space Between',
path: '/zh-CN/style/spacing/space-between',
component: React.lazy(() =>
- import('amis-ui/scss/helper/spacing/_space-between.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/spacing/_space-between.md'
+ ).then(wrapDoc)
)
}
]
@@ -372,14 +418,18 @@ export const cssDocs = [
label: 'Width',
path: '/zh-CN/style/sizing/width',
component: React.lazy(() =>
- import('amis-ui/scss/helper/sizing/_width.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/sizing/_width.md').then(
+ wrapDoc
+ )
)
},
{
label: 'Height',
path: '/zh-CN/style/sizing/height',
component: React.lazy(() =>
- import('amis-ui/scss/helper/sizing/_height.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/sizing/_height.md').then(
+ wrapDoc
+ )
)
}
]
@@ -392,9 +442,9 @@ export const cssDocs = [
label: 'Font Family',
path: '/zh-CN/style/typography/font-family',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_font-family.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_font-family.md'
+ ).then(wrapDoc)
)
},
@@ -402,7 +452,9 @@ export const cssDocs = [
label: 'Font Size',
path: '/zh-CN/style/typography/font-size',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_font-size.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_font-size.md'
+ ).then(wrapDoc)
)
},
@@ -410,9 +462,9 @@ export const cssDocs = [
label: 'Font style',
path: '/zh-CN/style/typography/font-style',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_font-style.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_font-style.md'
+ ).then(wrapDoc)
)
},
@@ -420,9 +472,9 @@ export const cssDocs = [
label: 'Font Weight',
path: '/zh-CN/style/typography/font-weight',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_font-weight.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_font-weight.md'
+ ).then(wrapDoc)
)
},
@@ -430,9 +482,9 @@ export const cssDocs = [
label: 'Letter Spacing',
path: '/zh-CN/style/typography/letter-spacing',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_letter-spacing.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_letter-spacing.md'
+ ).then(wrapDoc)
)
},
@@ -440,9 +492,9 @@ export const cssDocs = [
label: 'Line Height',
path: '/zh-CN/style/typography/line-height',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_line-height.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_line-height.md'
+ ).then(wrapDoc)
)
},
@@ -450,9 +502,9 @@ export const cssDocs = [
label: 'List Style Type',
path: '/zh-CN/style/typography/list-style-type',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_list-style-type.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_list-style-type.md'
+ ).then(wrapDoc)
)
},
@@ -460,9 +512,9 @@ export const cssDocs = [
label: 'Text Alignment',
path: '/zh-CN/style/typography/text-align',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_text-align.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_text-align.md'
+ ).then(wrapDoc)
)
},
@@ -470,9 +522,9 @@ export const cssDocs = [
label: 'Text Color',
path: '/zh-CN/style/typography/text-color',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_text-color.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_text-color.md'
+ ).then(wrapDoc)
)
},
@@ -480,9 +532,9 @@ export const cssDocs = [
label: 'Text Decoration',
path: '/zh-CN/style/typography/text-decoration',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_text-decoration.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_text-decoration.md'
+ ).then(wrapDoc)
)
},
@@ -490,9 +542,9 @@ export const cssDocs = [
label: 'Text Transform',
path: '/zh-CN/style/typography/text-transform',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_text-transform.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_text-transform.md'
+ ).then(wrapDoc)
)
},
@@ -500,9 +552,9 @@ export const cssDocs = [
label: 'Vertical Alignment',
path: '/zh-CN/style/typography/vertical-align',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_vertical-align.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_vertical-align.md'
+ ).then(wrapDoc)
)
},
@@ -510,9 +562,9 @@ export const cssDocs = [
label: 'Whitespace',
path: '/zh-CN/style/typography/whitespace',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_whitespace.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_whitespace.md'
+ ).then(wrapDoc)
)
},
@@ -520,9 +572,9 @@ export const cssDocs = [
label: 'Word Break',
path: '/zh-CN/style/typography/word-break',
component: React.lazy(() =>
- import('amis-ui/scss/helper/typography/_word-break.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/typography/_word-break.md'
+ ).then(wrapDoc)
)
}
]
@@ -535,9 +587,9 @@ export const cssDocs = [
label: 'Background Color',
path: '/zh-CN/style/background/background-color',
component: React.lazy(() =>
- import('amis-ui/scss/helper/background/_background-color.scss').then(
- wrapDoc
- )
+ import(
+ '../../packages/amis-ui/scss/helper/background/_background-color.md'
+ ).then(wrapDoc)
)
}
]
@@ -550,7 +602,9 @@ export const cssDocs = [
label: 'Border Radius',
path: '/zh-CN/style/border/border-radius',
component: React.lazy(() =>
- import('amis-ui/scss/helper/border/_border-radius.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/border/_border-radius.md'
+ ).then(wrapDoc)
)
},
@@ -558,7 +612,9 @@ export const cssDocs = [
label: 'Border Width',
path: '/zh-CN/style/border/border-width',
component: React.lazy(() =>
- import('amis-ui/scss/helper/border/_border-width.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/border/_border-width.md'
+ ).then(wrapDoc)
)
},
@@ -566,7 +622,9 @@ export const cssDocs = [
label: 'Border Color',
path: '/zh-CN/style/border/border-color',
component: React.lazy(() =>
- import('amis-ui/scss/helper/border/_border-color.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/border/_border-color.md'
+ ).then(wrapDoc)
)
},
@@ -574,7 +632,9 @@ export const cssDocs = [
label: 'Border Style',
path: '/zh-CN/style/border/border-style',
component: React.lazy(() =>
- import('amis-ui/scss/helper/border/_border-style.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/border/_border-style.md'
+ ).then(wrapDoc)
)
}
]
@@ -587,7 +647,9 @@ export const cssDocs = [
label: 'Box Shadow',
path: '/zh-CN/style/effect/box-shadow',
component: React.lazy(() =>
- import('amis-ui/scss/helper/effect/_box-shadow.scss').then(wrapDoc)
+ import(
+ '../../packages/amis-ui/scss/helper/effect/_box-shadow.md'
+ ).then(wrapDoc)
)
},
@@ -595,7 +657,9 @@ export const cssDocs = [
label: 'Opacity',
path: '/zh-CN/style/effect/opacity',
component: React.lazy(() =>
- import('amis-ui/scss/helper/effect/_opacity.scss').then(wrapDoc)
+ import('../../packages/amis-ui/scss/helper/effect/_opacity.md').then(
+ wrapDoc
+ )
)
}
]
diff --git a/examples/components/EventAction/cmpt-event-action/FormEvent.jsx b/examples/components/EventAction/cmpt-event-action/FormEvent.jsx
index e56e8fd4e..2dcf3cd81 100644
--- a/examples/components/EventAction/cmpt-event-action/FormEvent.jsx
+++ b/examples/components/EventAction/cmpt-event-action/FormEvent.jsx
@@ -176,16 +176,6 @@ export default {
}
]
},
- submitSucc: {
- actions: [
- {
- actionType: 'toast',
- args: {
- msg: '提交成功:${event.data|json}'
- }
- }
- ]
- },
submitSucc: {
actions: [
{
@@ -254,7 +244,7 @@ export default {
{
type: 'form',
debug: true,
- title: "表单:提交表单无target,无api,只触发提交成功事件",
+ title: '表单:提交表单无target,无api,只触发提交成功事件',
body: [
{
type: 'input-text',
@@ -284,7 +274,7 @@ export default {
}
}
]
- },
+ }
}
}
]
diff --git a/examples/components/Form/Custom.jsx b/examples/components/Form/Custom.tsx
similarity index 100%
rename from examples/components/Form/Custom.jsx
rename to examples/components/Form/Custom.tsx
diff --git a/examples/components/Form/Static.jsx b/examples/components/Form/Static.jsx
index 0b0c368d1..6346c8d1f 100644
--- a/examples/components/Form/Static.jsx
+++ b/examples/components/Form/Static.jsx
@@ -117,8 +117,7 @@ export default {
imageCaption: 'jfe fjkda fejfkda fejk fdajf dajfe jfkda',
popOver: {
title: '查看大图',
- body:
- '
'
+ body: ' '
}
},
diff --git a/examples/components/Form/SwitchDisplay.jsx b/examples/components/Form/SwitchDisplay.jsx
index ed268a86b..ebc0e4a11 100644
--- a/examples/components/Form/SwitchDisplay.jsx
+++ b/examples/components/Form/SwitchDisplay.jsx
@@ -1,920 +1,920 @@
const renderOptions = (
count = 3,
- render = (index) => ({label: `选项${index}`, value: index})
+ render = index => ({label: `选项${index}`, value: index})
) => [...Array(count)].map((item, index) => render(index));
-const renderSelectValues = (count) =>
+const renderSelectValues = count =>
[...Array(count)].map((item, index) => index).join(',');
export default {
- "title": "表单及表单项切换输入态展示态",
- "data": {
- "id": 1
+ title: '表单及表单项切换输入态展示态',
+ data: {
+ id: 1
},
- "body": [
+ body: [
{
- "type": "form",
- "title": "整个表单状态切换",
- "mode": "horizontal",
- "labelWidth": 150,
- "id": "allFormSwitch",
- "data": {
- "isStatic": false
+ type: 'form',
+ title: '整个表单状态切换',
+ mode: 'horizontal',
+ labelWidth: 150,
+ id: 'allFormSwitch',
+ data: {
+ isStatic: false
},
- "body": [
+ body: [
{
- "type": "input-text",
- "name": "var1",
- "label": "输入框",
- "value": "text"
+ type: 'input-text',
+ name: 'var1',
+ label: '输入框',
+ value: 'text'
},
{
- "type": "input-color",
- "name": "var2",
- "label": "颜色选择",
- "value": "#F0F"
+ type: 'input-color',
+ name: 'var2',
+ label: '颜色选择',
+ value: '#F0F'
},
{
- "type": "switch",
- "name": "switch",
- "label": "开关",
- "option": "开关说明",
- "value": true
+ type: 'switch',
+ name: 'switch',
+ label: '开关',
+ option: '开关说明',
+ value: true
},
{
- "type": "checkboxes",
- "name": "checkboxes",
- "label": "多选框",
- "value": renderSelectValues(12),
- "multiple": true,
- "options": renderOptions(12)
+ type: 'checkboxes',
+ name: 'checkboxes',
+ label: '多选框',
+ value: renderSelectValues(12),
+ multiple: true,
+ options: renderOptions(12)
},
{
- "type": "input-tag",
- "name": "select11",
- "label": "标签选择",
- "inline": true,
- "value": renderSelectValues(12),
- "options": renderOptions(12)
+ type: 'input-tag',
+ name: 'select11',
+ label: '标签选择',
+ inline: true,
+ value: renderSelectValues(12),
+ options: renderOptions(12)
},
{
- "type": 'button-toolbar',
- "name": 'button-toolbar',
- "buttons": [
+ type: 'button-toolbar',
+ name: 'button-toolbar',
+ buttons: [
{
- "type": "button",
- "label": "提交",
- "level": "primary",
- "visibleOn": "${!isStatic}",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '提交',
+ level: 'primary',
+ visibleOn: '${!isStatic}',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "setValue",
- "componentId": "allFormSwitch",
- "args": {
- "value": {
- "isStatic": true
+ actionType: 'setValue',
+ componentId: 'allFormSwitch',
+ args: {
+ value: {
+ isStatic: true
}
}
},
{
- "actionType": "static",
- "componentId": "allFormSwitch"
+ actionType: 'static',
+ componentId: 'allFormSwitch'
}
]
}
}
},
{
- "type": "button",
- "label": "编辑",
- "level": "primary",
- "visibleOn": "${isStatic}",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '编辑',
+ level: 'primary',
+ visibleOn: '${isStatic}',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "setValue",
- "componentId": "allFormSwitch",
- "args": {
- "value": {
- "isStatic": false
+ actionType: 'setValue',
+ componentId: 'allFormSwitch',
+ args: {
+ value: {
+ isStatic: false
}
}
},
{
- "actionType": "nonstatic",
- "componentId": "allFormSwitch"
+ actionType: 'nonstatic',
+ componentId: 'allFormSwitch'
}
]
}
}
}
],
- "className": 'show'
- },
+ className: 'show'
+ }
],
- "actions": []
+ actions: []
},
{
- "type": "form",
- "title": "单个表单项状态切换",
- "mode": "horizontal",
- "labelWidth": 150,
- "body": [
+ type: 'form',
+ title: '单个表单项状态切换',
+ mode: 'horizontal',
+ labelWidth: 150,
+ body: [
{
- "type": "input-text",
- "id": "formItemSwitch",
- "name": "var1",
- "label": "使用事件动作状态切换",
- "value": "text"
+ type: 'input-text',
+ id: 'formItemSwitch',
+ name: 'var1',
+ label: '使用事件动作状态切换',
+ value: 'text'
},
{
- "type": 'button-toolbar',
- "name": 'button-toolbar',
- "buttons": [
+ type: 'button-toolbar',
+ name: 'button-toolbar',
+ buttons: [
{
- "type": "button",
- "label": "输入态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '输入态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "nonstatic",
- "componentId": "formItemSwitch"
+ actionType: 'nonstatic',
+ componentId: 'formItemSwitch'
}
]
}
}
},
{
- "type": "button",
- "label": "展示态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '展示态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "static",
- "componentId": "formItemSwitch"
+ actionType: 'static',
+ componentId: 'formItemSwitch'
}
]
}
}
}
],
- "className": 'show'
- },
+ className: 'show'
+ }
],
- "actions": []
+ actions: []
},
{
- "type": "form",
- "title": "表单项展示态属性",
- "mode": "horizontal",
- "labelWidth": 150,
- "body": [
+ type: 'form',
+ title: '表单项展示态属性',
+ mode: 'horizontal',
+ labelWidth: 150,
+ body: [
{
- "type": "input-text",
- "id": "formItemInputText",
- "name": "var1",
- "label": "输入态 不设置 或static: false",
- "value": "text",
- "static": false,
- "desc": "使用staticOn 支持表达式控制,用法类似"
+ type: 'input-text',
+ id: 'formItemInputText',
+ name: 'var1',
+ label: '输入态 不设置 或static: false',
+ value: 'text',
+ static: false,
+ desc: '使用staticOn 支持表达式控制,用法类似'
},
{
- "type": "input-text",
- "id": "formItemInputText",
- "name": "var1",
- "label": "展示态 static: true",
- "value": "text",
- "static": true
+ type: 'input-text',
+ id: 'formItemInputText',
+ name: 'var1',
+ label: '展示态 static: true',
+ value: 'text',
+ static: true
},
{
- "type": "input-text",
- "id": "formItemInputText",
- "name": "var2",
- "label": "空值时的占位 staticPlaceholder",
- "staticPlaceholder": "空值占位符,默认为 -",
- "static": true
+ type: 'input-text',
+ id: 'formItemInputText',
+ name: 'var2',
+ label: '空值时的占位 staticPlaceholder',
+ staticPlaceholder: '空值占位符,默认为 -',
+ static: true
},
{
- "type": "input-text",
- "name": "var3",
- "label": "自定义展示态schema",
- "value": "表单项value",
- "static": true,
- "staticSchema": [
- "自定义前缀 | ",
+ type: 'input-text',
+ name: 'var3',
+ label: '自定义展示态schema',
+ value: '表单项value',
+ static: true,
+ staticSchema: [
+ '自定义前缀 | ',
{
- "type": "tpl",
- "tpl": "${var3}"
+ type: 'tpl',
+ tpl: '${var3}'
},
- " | 自定义后缀",
+ ' | 自定义后缀'
]
}
],
- "actions": []
+ actions: []
},
{
- "type": "form",
- "api": "/api/mock2/saveForm?waitSeconds=2",
- "id": "myform",
- "mode": "horizontal",
- "autoFocus": true,
- "panel": false,
- "debug": false,
- "title": "目前支持输入态展示态切换的表单项",
- "labelWidth": 150,
- "staticClassName": "now-is-static",
- "body": [
+ type: 'form',
+ api: '/api/mock2/saveForm?waitSeconds=2',
+ id: 'myform',
+ mode: 'horizontal',
+ autoFocus: true,
+ panel: false,
+ debug: false,
+ title: '目前支持输入态展示态切换的表单项',
+ labelWidth: 150,
+ staticClassName: 'now-is-static',
+ body: [
{
- "type": "button-toolbar",
- "name": "button-toolbar",
- "buttons": [
+ type: 'button-toolbar',
+ name: 'button-toolbar',
+ buttons: [
{
- "type": "button",
- "label": "切换为输入态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '切换为输入态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "nonstatic",
- "componentId": "myform"
+ actionType: 'nonstatic',
+ componentId: 'myform'
}
]
}
}
},
{
- "type": "button",
- "label": "切换为展示态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '切换为展示态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "static",
- "componentId": "myform"
+ actionType: 'static',
+ componentId: 'myform'
}
]
}
}
}
],
- "className": "show"
+ className: 'show'
},
{
- "type": "input-text",
- "name": "var1",
- "label": "文本",
- "value": "text",
- "desc": "这是一段描述文字",
- "id": "my-input-text"
+ type: 'input-text',
+ name: 'var1',
+ label: '文本',
+ value: 'text',
+ desc: '这是一段描述文字',
+ id: 'my-input-text'
},
{
- "type": "input-password",
- "name": "password",
- "label": "密码",
- "inline": true,
- "value": "123456"
+ type: 'input-password',
+ name: 'password',
+ label: '密码',
+ inline: true,
+ value: '123456'
},
{
- "type": "input-email",
- "validations": "isEmail",
- "label": "邮箱",
- "name": "email",
- "value": "hello@baidu.com"
+ type: 'input-email',
+ validations: 'isEmail',
+ label: '邮箱',
+ name: 'email',
+ value: 'hello@baidu.com'
},
{
- "type": "input-url",
- "validations": "isUrl",
- "label": "url",
- "name": "url",
- "value": "https://www.baidu.com"
+ type: 'input-url',
+ validations: 'isUrl',
+ label: 'url',
+ name: 'url',
+ value: 'https://www.baidu.com'
},
{
- "type": "input-number",
- "name": "number",
- "label": "数字",
- "placeholder": "",
- "inline": true,
- "value": 5,
- "min": 1,
- "max": 10
+ type: 'input-number',
+ name: 'number',
+ label: '数字',
+ placeholder: '',
+ inline: true,
+ value: 5,
+ min: 1,
+ max: 10
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "native-date",
- "name": "native-date",
- "label": "native日期选择",
- "value": "2022-08-18"
+ type: 'native-date',
+ name: 'native-date',
+ label: 'native日期选择',
+ value: '2022-08-18'
},
{
- "type": "native-time",
- "name": "native-time",
- "label": "native时间选择",
- "value": "16:10"
+ type: 'native-time',
+ name: 'native-time',
+ label: 'native时间选择',
+ value: '16:10'
},
{
- "type": "native-number",
- "name": "native-number",
- "label": "native数字输入",
- "value": "6"
+ type: 'native-number',
+ name: 'native-number',
+ label: 'native数字输入',
+ value: '6'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-tag",
- "name": "tag",
- "label": "标签",
- "placeholder": "",
- "clearable": true,
- "value": "zhugeliang,caocao",
- "options": [
+ type: 'input-tag',
+ name: 'tag',
+ label: '标签',
+ placeholder: '',
+ clearable: true,
+ value: 'zhugeliang,caocao',
+ options: [
{
- "label": "诸葛亮",
- "value": "zhugeliang"
+ label: '诸葛亮',
+ value: 'zhugeliang'
},
{
- "label": "曹操",
- "value": "caocao"
+ label: '曹操',
+ value: 'caocao'
},
{
- "label": "钟无艳",
- "value": "zhongwuyan"
+ label: '钟无艳',
+ value: 'zhongwuyan'
},
{
- "label": "野核",
- "children": [
+ label: '野核',
+ children: [
{
- "label": "李白",
- "value": "libai"
+ label: '李白',
+ value: 'libai'
},
{
- "label": "韩信",
- "value": "hanxin"
+ label: '韩信',
+ value: 'hanxin'
},
{
- "label": "云中君",
- "value": "yunzhongjun"
+ label: '云中君',
+ value: 'yunzhongjun'
}
]
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "checkboxes",
- "name": "checkboxes",
- "label": "多选框",
- "value": "1,2",
- "options": [
+ type: 'checkboxes',
+ name: 'checkboxes',
+ label: '多选框',
+ value: '1,2',
+ options: [
{
- "label": "选项1",
- "value": 1
+ label: '选项1',
+ value: 1
},
{
- "label": "选项2",
- "value": 2
+ label: '选项2',
+ value: 2
},
{
- "label": "选项3",
- "value": 3
+ label: '选项3',
+ value: 3
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "radios",
- "name": "radios",
- "label": "单选",
- "value": 3,
- "options": [
+ type: 'radios',
+ name: 'radios',
+ label: '单选',
+ value: 3,
+ options: [
{
- "label": "选项1",
- "value": 1
+ label: '选项1',
+ value: 1
},
{
- "label": "选项2",
- "value": 2
+ label: '选项2',
+ value: 2
},
{
- "label": "选项3",
- "value": 3
+ label: '选项3',
+ value: 3
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "button-group-select",
- "name": "btn-group",
- "label": "按钮组",
- "description": "类似于单选效果",
- "value": 1,
- "options": [
+ type: 'button-group-select',
+ name: 'btn-group',
+ label: '按钮组',
+ description: '类似于单选效果',
+ value: 1,
+ options: [
{
- "label": "选项 A",
- "value": 1
+ label: '选项 A',
+ value: 1
},
{
- "label": "选项 B",
- "value": 2
+ label: '选项 B',
+ value: 2
},
{
- "label": "选项 C",
- "value": 3
+ label: '选项 C',
+ value: 3
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "list-select",
- "name": "List",
- "label": "List",
- "desc": "也差不多,只是展示方式不一样",
- "value": 3,
- "options": [
+ type: 'list-select',
+ name: 'List',
+ label: 'List',
+ desc: '也差不多,只是展示方式不一样',
+ value: 3,
+ options: [
{
- "label": "选项 A",
- "value": 1
+ label: '选项 A',
+ value: 1
},
{
- "label": "选项 B",
- "value": 2
+ label: '选项 B',
+ value: 2
},
{
- "label": "选项 C",
- "value": 3
+ label: '选项 C',
+ value: 3
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "list-select",
- "name": "list2",
- "label": "List",
- "desc": "可多选",
- "multiple": true,
- "value": renderSelectValues(2),
- "options": renderOptions(3)
+ type: 'list-select',
+ name: 'list2',
+ label: 'List',
+ desc: '可多选',
+ multiple: true,
+ value: renderSelectValues(2),
+ options: renderOptions(3)
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "list-select",
- "name": "list4",
- "label": "List",
- "imageClassName": "thumb-lg",
- "desc": "支持放张图片",
- "value": renderSelectValues(2),
- "options": renderOptions(3, (index) => ({
- "image": "/examples/static/photo/3893101144.jpg",
- "value": index,
- "label": `图片${index}`
+ type: 'list-select',
+ name: 'list4',
+ label: 'List',
+ imageClassName: 'thumb-lg',
+ desc: '支持放张图片',
+ value: renderSelectValues(2),
+ options: renderOptions(3, index => ({
+ image: '/examples/static/photo/3893101144.jpg',
+ value: index,
+ label: `图片${index}`
}))
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "list-select",
- "name": "list5",
- "label": "List",
- "desc": "支持文字排版",
- "multiple": true,
- "value": 1,
- "options": renderOptions(3, (index) => ({
- "value": index,
- "body": "\n
套餐:C01
\n
CPU:22核
\n
内存:10GB
\n
SSD盘:1024GB
\n
"
+ type: 'list-select',
+ name: 'list5',
+ label: 'List',
+ desc: '支持文字排版',
+ multiple: true,
+ value: 1,
+ options: renderOptions(3, index => ({
+ value: index,
+ body: '\n
套餐:C01
\n
CPU:22核
\n
内存:10GB
\n
SSD盘:1024GB
\n
'
}))
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-rating",
- "count": 5,
- "value": 4,
- "label": "评分",
- "name": "rating",
- "half": false
+ type: 'input-rating',
+ count: 5,
+ value: 4,
+ label: '评分',
+ name: 'rating',
+ half: false
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "switch",
- "name": "switch",
- "label": "开关",
- "value": true
+ type: 'switch',
+ name: 'switch',
+ label: '开关',
+ value: true
},
{
- "type": "switch",
- "name": "switch4",
- "value": true,
- "onText": "开启",
- "offText": "关闭",
- "label": "开关文字"
+ type: 'switch',
+ name: 'switch4',
+ value: true,
+ onText: '开启',
+ offText: '关闭',
+ label: '开关文字'
},
{
- "type": "switch",
- "name": "switch5",
- "value": true,
- "onText": {
- "type": "icon",
- "icon": "fa fa-check-circle"
+ type: 'switch',
+ name: 'switch5',
+ value: true,
+ onText: {
+ type: 'icon',
+ icon: 'fa fa-check-circle'
},
- "offText": {
- "type": "icon",
- "icon": "fa fa-times-circle"
+ offText: {
+ type: 'icon',
+ icon: 'fa fa-times-circle'
},
- "label": "开关icon"
+ label: '开关icon'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "checkbox",
- "name": "checkbox",
- "label": "勾选框",
- "option": "同意协议",
- "value": true
+ type: 'checkbox',
+ name: 'checkbox',
+ label: '勾选框',
+ option: '同意协议',
+ value: true
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "select",
- "name": "type",
- "label": "下拉单选",
- "inline": true,
- "value": 1,
- "options": [
+ type: 'select',
+ name: 'type',
+ label: '下拉单选',
+ inline: true,
+ value: 1,
+ options: [
{
- "label": "选项1",
- "value": 1
+ label: '选项1',
+ value: 1
},
{
- "label": "选项2",
- "value": 2
+ label: '选项2',
+ value: 2
},
{
- "label": "内容很长很长的选项,内容很长很长的选项",
- "value": 3
+ label: '内容很长很长的选项,内容很长很长的选项',
+ value: 3
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "select",
- "name": "type2",
- "label": "多选",
- "multiple": true,
- "inline": true,
- "value": "1,2",
- "options": [
+ type: 'select',
+ name: 'type2',
+ label: '多选',
+ multiple: true,
+ inline: true,
+ value: '1,2',
+ options: [
{
- "label": "选项1",
- "value": 1
+ label: '选项1',
+ value: 1
},
{
- "label": "选项2",
- "value": 2
+ label: '选项2',
+ value: 2
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-color",
- "name": "color",
- "label": "Color",
- "value": "#dc1717"
+ type: 'input-color',
+ name: 'color',
+ label: 'Color',
+ value: '#dc1717'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-date",
- "name": "date",
- "label": "日期",
- "value": "1591326307"
+ type: 'input-date',
+ name: 'date',
+ label: '日期',
+ value: '1591326307'
},
{
- "type": "input-datetime",
- "name": "datetime",
- "label": "日期+时间",
- "value": "1591326307"
+ type: 'input-datetime',
+ name: 'datetime',
+ label: '日期+时间',
+ value: '1591326307'
},
{
- "type": "input-time",
- "name": "time",
- "label": "时间",
- "value": "1591326307"
+ type: 'input-time',
+ name: 'time',
+ label: '时间',
+ value: '1591326307'
},
{
- "type": "input-month",
- "name": "year-month",
- "label": "年月",
- "value": "1591326307"
+ type: 'input-month',
+ name: 'year-month',
+ label: '年月',
+ value: '1591326307'
},
{
- "type": "input-month",
- "name": "month",
- "label": "月份",
- "value": "1591326307"
+ type: 'input-month',
+ name: 'month',
+ label: '月份',
+ value: '1591326307'
},
{
- "type": "input-year",
- "name": "year",
- "label": "年份",
- "value": "1591326307"
+ type: 'input-year',
+ name: 'year',
+ label: '年份',
+ value: '1591326307'
},
{
- "type": "input-quarter",
- "name": "quarter",
- "label": "季度",
- "value": "1591326307"
+ type: 'input-quarter',
+ name: 'quarter',
+ label: '季度',
+ value: '1591326307'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-date-range",
- "name": "input-date-range",
- "label": "日期范围",
- "value": "1661961600,1664553599"
+ type: 'input-date-range',
+ name: 'input-date-range',
+ label: '日期范围',
+ value: '1661961600,1664553599'
},
{
- "type": "input-datetime-range",
- "name": "input-datetime-range",
- "label": "日期时间范围",
- "value": "1659283200,1661961599"
+ type: 'input-datetime-range',
+ name: 'input-datetime-range',
+ label: '日期时间范围',
+ value: '1659283200,1661961599'
},
{
- "type": "input-time-range",
- "name": "input-time-range",
- "label": "时间范围",
- "value": "15:00,23:27"
+ type: 'input-time-range',
+ name: 'input-time-range',
+ label: '时间范围',
+ value: '15:00,23:27'
},
{
- "type": "input-month-range",
- "name": "input-month-range",
- "label": "月份范围",
- "value": "1643644800,1651420799"
+ type: 'input-month-range',
+ name: 'input-month-range',
+ label: '月份范围',
+ value: '1643644800,1651420799'
},
{
- "type": "input-year-range",
- "name": "input-year-range",
- "label": "年份范围",
- "value": "1693497600,1790870399"
+ type: 'input-year-range',
+ name: 'input-year-range',
+ label: '年份范围',
+ value: '1693497600,1790870399'
},
{
- "type": "input-quarter-range",
- "name": "input-quarter-range",
- "label": "季度范围",
- "value": "1640966400,1664639999"
+ type: 'input-quarter-range',
+ name: 'input-quarter-range',
+ label: '季度范围',
+ value: '1640966400,1664639999'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-group",
- "size": "sm",
- "inline": true,
- "label": "组合",
- "body": [
+ type: 'input-group',
+ size: 'sm',
+ inline: true,
+ label: '组合',
+ body: [
{
- "type": "input-text",
- "placeholder": "搜索作业ID/名称",
- "inputClassName": "b-l-none p-l-none",
- "name": "jobName",
- "value": "作业"
+ type: 'input-text',
+ placeholder: '搜索作业ID/名称',
+ inputClassName: 'b-l-none p-l-none',
+ name: 'jobName',
+ value: '作业'
},
{
- "type": "input-text",
- "placeholder": "搜索作业ID/名称",
- "inputClassName": "b-l-none p-l-none",
- "name": "jobName",
- "value": "家庭作业"
+ type: 'input-text',
+ placeholder: '搜索作业ID/名称',
+ inputClassName: 'b-l-none p-l-none',
+ name: 'jobName',
+ value: '家庭作业'
}
]
},
{
- "type": "input-group",
- "label": "各种组合",
- "inline": true,
- "body": [
+ type: 'input-group',
+ label: '各种组合',
+ inline: true,
+ body: [
{
- "type": "select",
- "name": "memoryUnits",
- "options": [
+ type: 'select',
+ name: 'memoryUnits',
+ options: [
{
- "label": "Gi",
- "value": "Gi"
+ label: 'Gi',
+ value: 'Gi'
},
{
- "label": "Mi",
- "value": "Mi"
+ label: 'Mi',
+ value: 'Mi'
},
{
- "label": "Ki",
- "value": "Ki"
+ label: 'Ki',
+ value: 'Ki'
}
],
- "value": "Gi"
+ value: 'Gi'
},
{
- "type": "input-text",
- "name": "memory",
- "value": "memory"
+ type: 'input-text',
+ name: 'memory',
+ value: 'memory'
},
{
- "type": "select",
- "name": "memoryUnits2",
- "options": [
+ type: 'select',
+ name: 'memoryUnits2',
+ options: [
{
- "label": "Gi",
- "value": "Gi"
+ label: 'Gi',
+ value: 'Gi'
},
{
- "label": "Mi",
- "value": "Mi"
+ label: 'Mi',
+ value: 'Mi'
},
{
- "label": "Ki",
- "value": "Ki"
+ label: 'Ki',
+ value: 'Ki'
}
],
- "value": "Gi"
+ value: 'Gi'
},
{
- "type": "button",
- "label": "Go"
+ type: 'button',
+ label: 'Go'
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "textarea",
- "name": "textarea",
- "label": "多行文本",
- "value": "这是一段多行文本文字\n第二行内容\n2222\n333",
- "staticSchema": {
- "limit": 3
+ type: 'textarea',
+ name: 'textarea',
+ label: '多行文本',
+ value: '这是一段多行文本文字\n第二行内容\n2222\n333',
+ staticSchema: {
+ limit: 3
}
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "label": "穿梭器",
- "name": "a",
- "type": "transfer",
- "source": "/api/mock2/form/getOptions?waitSeconds=1",
- "searchable": true,
- "searchApi": "/api/mock2/options/autoComplete2?term=$term",
- "selectMode": "list",
- "sortable": true,
- "inline": true,
- "value": "A,B,C"
+ label: '穿梭器',
+ name: 'a',
+ type: 'transfer',
+ source: '/api/mock2/form/getOptions?waitSeconds=1',
+ searchable: true,
+ searchApi: '/api/mock2/options/autoComplete2?term=$term',
+ selectMode: 'list',
+ sortable: true,
+ inline: true,
+ value: 'A,B,C'
},
{
- "label": '组合穿梭器',
- "type": 'tabs-transfer',
- "name": 'tabs-transfer',
- "sortable": true,
- "selectMode": 'tree',
- "id": 'tab-transfer-receiver',
- "resetValue": 'zhugeliang',
- "value": "zhugeliang,caocao",
- "enableNodePath": true,
- "options": [
+ label: '组合穿梭器',
+ type: 'tabs-transfer',
+ name: 'tabs-transfer',
+ sortable: true,
+ selectMode: 'tree',
+ id: 'tab-transfer-receiver',
+ resetValue: 'zhugeliang',
+ value: 'zhugeliang,caocao',
+ enableNodePath: true,
+ options: [
{
- "label": '成员',
- "selectMode": 'tree',
- "searchable": true,
- "children": [
+ label: '成员',
+ selectMode: 'tree',
+ searchable: true,
+ children: [
{
- "label": '法师',
- "children": [
+ label: '法师',
+ children: [
{
- "label": '诸葛亮',
- "value": 'zhugeliang'
+ label: '诸葛亮',
+ value: 'zhugeliang'
}
]
},
{
- "label": '战士',
- "children": [
+ label: '战士',
+ children: [
{
- "label": '曹操',
- "value": 'caocao'
+ label: '曹操',
+ value: 'caocao'
},
{
- "label": '钟无艳',
- "value": 'zhongwuyan'
+ label: '钟无艳',
+ value: 'zhongwuyan'
}
]
},
{
- "label": '打野',
- "children": [
+ label: '打野',
+ children: [
{
- "label": '李白',
- "value": 'libai'
+ label: '李白',
+ value: 'libai'
},
{
- "label": '韩信',
- "value": 'hanxin'
+ label: '韩信',
+ value: 'hanxin'
},
{
- "label": '云中君',
- "value": 'yunzhongjun'
+ label: '云中君',
+ value: 'yunzhongjun'
}
]
}
]
},
{
- "label": '用户',
- "selectMode": 'chained',
- "children": [
+ label: '用户',
+ selectMode: 'chained',
+ children: [
{
- "label": '法师',
- "children": [
+ label: '法师',
+ children: [
{
- "label": '诸葛亮',
- "value": 'zhugeliang2'
+ label: '诸葛亮',
+ value: 'zhugeliang2'
}
]
},
{
- "label": '战士',
- "children": [
+ label: '战士',
+ children: [
{
- "label": '曹操',
- "value": 'caocao2'
+ label: '曹操',
+ value: 'caocao2'
},
{
- "label": '钟无艳',
- "value": 'zhongwuyan2'
+ label: '钟无艳',
+ value: 'zhongwuyan2'
}
]
},
{
- "label": '打野',
- "children": [
+ label: '打野',
+ children: [
{
- "label": '李白',
- "value": 'libai2'
+ label: '李白',
+ value: 'libai2'
},
{
- "label": '韩信',
- "value": 'hanxin2'
+ label: '韩信',
+ value: 'hanxin2'
},
{
- "label": '云中君',
- "value": 'yunzhongjun2'
+ label: '云中君',
+ value: 'yunzhongjun2'
}
]
}
]
}
],
- "onEvent": {
- "change": {
- "actions": [
+ onEvent: {
+ change: {
+ actions: [
{
- "actionType": 'toast',
- "args": {
- "msgType": 'info',
- "msg": '${event.data.value|json}'
+ actionType: 'toast',
+ args: {
+ msgType: 'info',
+ msg: '${event.data.value|json}'
}
}
]
@@ -922,65 +922,65 @@ export default {
}
},
{
- "label": '穿梭器picker',
- "type": 'transfer-picker',
- "name": 'transfer-picker',
- "id": 'transfer-picker-receiver',
- "resetValue": 'zhugeliang',
- "sortable": true,
- "selectMode": 'tree',
- "searchable": true,
- "value": "zhugeliang,zhongwuyan",
- "enableNodePath": true,
- "options": [
+ label: '穿梭器picker',
+ type: 'transfer-picker',
+ name: 'transfer-picker',
+ id: 'transfer-picker-receiver',
+ resetValue: 'zhugeliang',
+ sortable: true,
+ selectMode: 'tree',
+ searchable: true,
+ value: 'zhugeliang,zhongwuyan',
+ enableNodePath: true,
+ options: [
{
- "label": '法师',
- "children": [
+ label: '法师',
+ children: [
{
- "label": '诸葛亮',
- "value": 'zhugeliang'
+ label: '诸葛亮',
+ value: 'zhugeliang'
}
]
},
{
- "label": '战士',
- "children": [
+ label: '战士',
+ children: [
{
- "label": '曹操',
- "value": 'caocao'
+ label: '曹操',
+ value: 'caocao'
},
{
- "label": '钟无艳',
- "value": 'zhongwuyan'
+ label: '钟无艳',
+ value: 'zhongwuyan'
}
]
},
{
- "label": '打野',
- "children": [
+ label: '打野',
+ children: [
{
- "label": '李白',
- "value": 'libai'
+ label: '李白',
+ value: 'libai'
},
{
- "label": '韩信',
- "value": 'hanxin'
+ label: '韩信',
+ value: 'hanxin'
},
{
- "label": '云中君',
- "value": 'yunzhongjun'
+ label: '云中君',
+ value: 'yunzhongjun'
}
]
}
],
- "onEvent": {
- "change": {
- "actions": [
+ onEvent: {
+ change: {
+ actions: [
{
- "actionType": 'toast',
- "args": {
- "msgType": 'info',
- "msg": '${event.data.value|json}'
+ actionType: 'toast',
+ args: {
+ msgType: 'info',
+ msg: '${event.data.value|json}'
}
}
]
@@ -988,142 +988,142 @@ export default {
}
},
{
- "label": '组合穿梭器picker',
- "type": 'tabs-transfer-picker',
- "name": 'tabs-transfer-picker',
- "id": 'tabs-transfer-picker-receiver',
- "resetValue": 'zhugeliang',
- "value": "caocao,zhongwuyan",
- "sortable": true,
- "selectMode": 'tree',
- "pickerSize": 'md',
- "menuTpl":
+ label: '组合穿梭器picker',
+ type: 'tabs-transfer-picker',
+ name: 'tabs-transfer-picker',
+ id: 'tabs-transfer-picker-receiver',
+ resetValue: 'zhugeliang',
+ value: 'caocao,zhongwuyan',
+ sortable: true,
+ selectMode: 'tree',
+ pickerSize: 'md',
+ menuTpl:
"${label} ${email ? `
${email} ${phone}
`: ''}
",
- "valueTpl": '${label}(${value})',
- "options": [
+ valueTpl: '${label}(${value})',
+ options: [
{
- "label": '成员',
- "selectMode": 'tree',
- "searchable": true,
- "children": [
+ label: '成员',
+ selectMode: 'tree',
+ searchable: true,
+ children: [
{
- "label": '法师',
- "children": [
+ label: '法师',
+ children: [
{
- "label": '诸葛亮',
- "value": 'zhugeliang',
- "email": 'zhugeliang@timi.com',
- "phone": 13111111111
+ label: '诸葛亮',
+ value: 'zhugeliang',
+ email: 'zhugeliang@timi.com',
+ phone: 13111111111
}
]
},
{
- "label": '战士',
- "children": [
+ label: '战士',
+ children: [
{
- "label": '曹操',
- "value": 'caocao',
- "email": 'caocao@timi.com',
- "phone": 13111111111
+ label: '曹操',
+ value: 'caocao',
+ email: 'caocao@timi.com',
+ phone: 13111111111
},
{
- "label": '钟无艳',
- "value": 'zhongwuyan',
- "email": 'zhongwuyan@timi.com',
- "phone": 13111111111
+ label: '钟无艳',
+ value: 'zhongwuyan',
+ email: 'zhongwuyan@timi.com',
+ phone: 13111111111
}
]
},
{
- "label": '打野',
- "children": [
+ label: '打野',
+ children: [
{
- "label": '李白',
- "value": 'libai',
- "email": 'libai@timi.com',
- "phone": 13111111111
+ label: '李白',
+ value: 'libai',
+ email: 'libai@timi.com',
+ phone: 13111111111
},
{
- "label": '韩信',
- "value": 'hanxin',
- "email": 'hanxin@timi.com',
- "phone": 13111111111
+ label: '韩信',
+ value: 'hanxin',
+ email: 'hanxin@timi.com',
+ phone: 13111111111
},
{
- "label": '云中君',
- "value": 'yunzhongjun',
- "email": 'yunzhongjun@timi.com',
- "phone": 13111111111
+ label: '云中君',
+ value: 'yunzhongjun',
+ email: 'yunzhongjun@timi.com',
+ phone: 13111111111
}
]
}
]
},
{
- "label": '角色',
- "selectMode": 'list',
- "children": [
+ label: '角色',
+ selectMode: 'list',
+ children: [
{
- "label": '角色 1',
- "value": 'role1'
+ label: '角色 1',
+ value: 'role1'
},
{
- "label": '角色 2',
- "value": 'role2'
+ label: '角色 2',
+ value: 'role2'
},
{
- "label": '角色 3',
- "value": 'role3'
+ label: '角色 3',
+ value: 'role3'
},
{
- "label": '角色 4',
- "value": 'role4'
+ label: '角色 4',
+ value: 'role4'
}
]
},
{
- "label": '部门',
- "selectMode": 'tree',
- "children": [
+ label: '部门',
+ selectMode: 'tree',
+ children: [
{
- "label": '总部',
- "value": 'dep0',
- "children": [
+ label: '总部',
+ value: 'dep0',
+ children: [
{
- "label": '部门 1',
- "value": 'dep1',
- "children": [
+ label: '部门 1',
+ value: 'dep1',
+ children: [
{
- "label": '部门 4',
- "value": 'dep4'
+ label: '部门 4',
+ value: 'dep4'
},
{
- "label": '部门 5',
- "value": 'dep5'
+ label: '部门 5',
+ value: 'dep5'
}
]
},
{
- "label": '部门 2',
- "value": 'dep2'
+ label: '部门 2',
+ value: 'dep2'
},
{
- "label": '部门 3',
- "value": 'dep3'
+ label: '部门 3',
+ value: 'dep3'
}
]
}
]
}
],
- "onEvent": {
- "change": {
- "actions": [
+ onEvent: {
+ change: {
+ actions: [
{
- "actionType": 'toast',
- "args": {
- "msgType": 'info',
- "msg": '${event.data.value|json}'
+ actionType: 'toast',
+ args: {
+ msgType: 'info',
+ msg: '${event.data.value|json}'
}
}
]
@@ -1131,750 +1131,726 @@ export default {
}
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-tree",
- "name": "tree",
- "label": "树",
- "iconField": "icon",
- "value": "2",
- "options": [
+ type: 'input-tree',
+ name: 'tree',
+ label: '树',
+ iconField: 'icon',
+ value: '2',
+ options: [
{
- "label": "Folder A",
- "value": 1,
- "icon": "fa fa-bookmark",
- "children": [
+ label: 'Folder A',
+ value: 1,
+ icon: 'fa fa-bookmark',
+ children: [
{
- "label": "file A",
- "value": 2,
- "icon": "fa fa-star"
+ label: 'file A',
+ value: 2,
+ icon: 'fa fa-star'
},
{
- "label": "file B",
- "value": 3
+ label: 'file B',
+ value: 3
}
]
},
{
- "label": "file C",
- "value": 4
+ label: 'file C',
+ value: 4
},
{
- "label": "file D",
- "value": 5
+ label: 'file D',
+ value: 5
}
]
},
{
- "type": "input-tree",
- "name": "trees",
- "label": "树多选",
- "multiple": true,
- "value": "1-2,5",
- "options": [
+ type: 'input-tree',
+ name: 'trees',
+ label: '树多选',
+ multiple: true,
+ value: '1-2,5',
+ options: [
{
- "label": "Folder A",
- "value": 1,
- "children": [
+ label: 'Folder A',
+ value: 1,
+ children: [
{
- "label": "file A",
- "value": 2
+ label: 'file A',
+ value: 2
},
{
- "label": "file B",
- "value": 3
+ label: 'file B',
+ value: 3
}
]
},
{
- "label": "file C",
- "value": 4
+ label: 'file C',
+ value: 4
},
{
- "label": "file D",
- "value": 5
+ label: 'file D',
+ value: 5
}
]
},
{
- "type": "tree-select",
- "name": "selecttree",
- "label": "树选择器",
- "value": "5",
- "options": [
+ type: 'tree-select',
+ name: 'selecttree',
+ label: '树选择器',
+ value: '5',
+ options: [
{
- "label": "Folder A",
- "value": 1,
- "children": [
+ label: 'Folder A',
+ value: 1,
+ children: [
{
- "label": "file A",
- "value": 2
+ label: 'file A',
+ value: 2
},
{
- "label": "file B",
- "value": 3
+ label: 'file B',
+ value: 3
}
]
},
{
- "label": "file C",
- "value": 4
+ label: 'file C',
+ value: 4
},
{
- "label": "file D",
- "value": 5
+ label: 'file D',
+ value: 5
}
]
},
{
- "type": "tree-select",
- "name": "selecttrees",
- "label": "树多选选择器",
- "enableNodePath": true,
- "multiple": true,
- "value": "1-2,5",
- "options": [
+ type: 'tree-select',
+ name: 'selecttrees',
+ label: '树多选选择器',
+ enableNodePath: true,
+ multiple: true,
+ value: '1-2,5',
+ options: [
{
- "label": "Folder A",
- "value": 1,
- "children": [
+ label: 'Folder A',
+ value: 1,
+ children: [
{
- "label": "file A",
- "value": 2
+ label: 'file A',
+ value: 2
},
{
- "label": "file B",
- "value": 3
+ label: 'file B',
+ value: 3
}
]
},
{
- "label": "file C",
- "value": 4
+ label: 'file C',
+ value: 4
},
{
- "label": "file D",
- "value": 5
+ label: 'file D',
+ value: 5
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "nested-select",
- "name": "nestedSelect",
- "label": "级联选择器",
- "value": "definitions",
- "options": [
+ type: 'nested-select',
+ name: 'nestedSelect',
+ label: '级联选择器',
+ value: 'definitions',
+ options: [
{
- "label": "概念",
- "value": "concepts",
- "children": [
+ label: '概念',
+ value: 'concepts',
+ children: [
{
- "label": "配置与组件",
- "value": "schema"
+ label: '配置与组件',
+ value: 'schema'
},
{
- "label": "数据域与数据链",
- "value": "scope"
+ label: '数据域与数据链',
+ value: 'scope'
},
{
- "label": "模板",
- "value": "template"
+ label: '模板',
+ value: 'template'
},
{
- "label": "数据映射",
- "value": "data-mapping"
+ label: '数据映射',
+ value: 'data-mapping'
},
{
- "label": "表达式",
- "value": "expression"
+ label: '表达式',
+ value: 'expression'
},
{
- "label": "联动",
- "value": "linkage"
+ label: '联动',
+ value: 'linkage'
},
{
- "label": "行为",
- "value": "action"
+ label: '行为',
+ value: 'action'
},
{
- "label": "样式",
- "value": "style"
+ label: '样式',
+ value: 'style'
}
]
},
{
- "label": "类型",
- "value": "types",
- "children": [
+ label: '类型',
+ value: 'types',
+ children: [
{
- "label": "SchemaNode",
- "value": "schemanode"
+ label: 'SchemaNode',
+ value: 'schemanode'
},
{
- "label": "API",
- "value": "api"
+ label: 'API',
+ value: 'api'
},
{
- "label": "Definitions",
- "value": "definitions"
+ label: 'Definitions',
+ value: 'definitions'
}
]
},
{
- "label": "组件",
- "value": "zujian",
- "children": [
+ label: '组件',
+ value: 'zujian',
+ children: [
{
- "label": "布局",
- "value": "buju",
- "children": [
+ label: '布局',
+ value: 'buju',
+ children: [
{
- "label": "Page 页面",
- "value": "page"
+ label: 'Page 页面',
+ value: 'page'
},
{
- "label": "Container 容器",
- "value": "container"
+ label: 'Container 容器',
+ value: 'container'
},
{
- "label": "Collapse 折叠器",
- "value": "Collapse"
+ label: 'Collapse 折叠器',
+ value: 'Collapse'
}
]
},
{
- "label": "功能",
- "value": "gongneng",
- "children": [
+ label: '功能',
+ value: 'gongneng',
+ children: [
{
- "label": "Action 行为按钮",
- "value": "action-type"
+ label: 'Action 行为按钮',
+ value: 'action-type'
},
{
- "label": "App 多页应用",
- "value": "app"
+ label: 'App 多页应用',
+ value: 'app'
},
{
- "label": "Button 按钮",
- "value": "button"
+ label: 'Button 按钮',
+ value: 'button'
}
]
},
{
- "label": "数据输入",
- "value": "shujushuru",
- "children": [
+ label: '数据输入',
+ value: 'shujushuru',
+ children: [
{
- "label": "Form 表单",
- "value": "form"
+ label: 'Form 表单',
+ value: 'form'
},
{
- "label": "FormItem 表单项",
- "value": "formitem"
+ label: 'FormItem 表单项',
+ value: 'formitem'
},
{
- "label": "Options 选择器表单项",
- "value": "options"
+ label: 'Options 选择器表单项',
+ value: 'options'
}
]
},
{
- "label": "数据展示",
- "value": "shujuzhanshi",
- "children": [
+ label: '数据展示',
+ value: 'shujuzhanshi',
+ children: [
{
- "label": "CRUD 增删改查",
- "value": "crud"
+ label: 'CRUD 增删改查',
+ value: 'crud'
},
{
- "label": "Table 表格",
- "value": "table"
+ label: 'Table 表格',
+ value: 'table'
},
{
- "label": "Card 卡片",
- "value": "card"
+ label: 'Card 卡片',
+ value: 'card'
}
]
},
{
- "label": "反馈",
- "value": "fankui"
+ label: '反馈',
+ value: 'fankui'
}
]
}
]
},
{
- "type": "nested-select",
- "name": "nestedSelectMul",
- "label": "级联选择器多选",
- "multiple": true,
- "checkAll": false,
- "value": "definitions",
- "options": [
+ type: 'nested-select',
+ name: 'nestedSelectMul',
+ label: '级联选择器多选',
+ multiple: true,
+ checkAll: false,
+ value: 'definitions',
+ options: [
{
- "label": "概念",
- "value": "concepts",
- "children": [
+ label: '概念',
+ value: 'concepts',
+ children: [
{
- "label": "配置与组件",
- "value": "schema"
+ label: '配置与组件',
+ value: 'schema'
},
{
- "label": "数据域与数据链",
- "value": "scope"
+ label: '数据域与数据链',
+ value: 'scope'
},
{
- "label": "模板",
- "value": "template"
+ label: '模板',
+ value: 'template'
},
{
- "label": "数据映射",
- "value": "data-mapping"
+ label: '数据映射',
+ value: 'data-mapping'
},
{
- "label": "表达式",
- "value": "expression"
+ label: '表达式',
+ value: 'expression'
},
{
- "label": "联动",
- "value": "linkage"
+ label: '联动',
+ value: 'linkage'
},
{
- "label": "行为",
- "value": "action"
+ label: '行为',
+ value: 'action'
},
{
- "label": "样式",
- "value": "style"
+ label: '样式',
+ value: 'style'
}
]
},
{
- "label": "类型",
- "value": "types",
- "children": [
+ label: '类型',
+ value: 'types',
+ children: [
{
- "label": "SchemaNode",
- "value": "schemanode"
+ label: 'SchemaNode',
+ value: 'schemanode'
},
{
- "label": "API",
- "value": "api"
+ label: 'API',
+ value: 'api'
},
{
- "label": "Definitions",
- "value": "definitions"
+ label: 'Definitions',
+ value: 'definitions'
}
]
},
{
- "label": "组件",
- "value": "zujian",
- "children": [
+ label: '组件',
+ value: 'zujian',
+ children: [
{
- "label": "布局",
- "value": "buju",
- "children": [
+ label: '布局',
+ value: 'buju',
+ children: [
{
- "label": "Page 页面",
- "value": "page"
+ label: 'Page 页面',
+ value: 'page'
},
{
- "label": "Container 容器",
- "value": "container"
+ label: 'Container 容器',
+ value: 'container'
},
{
- "label": "Collapse 折叠器",
- "value": "Collapse"
+ label: 'Collapse 折叠器',
+ value: 'Collapse'
}
]
},
{
- "label": "功能",
- "value": "gongneng",
- "children": [
+ label: '功能',
+ value: 'gongneng',
+ children: [
{
- "label": "Action 行为按钮",
- "value": "action-type"
+ label: 'Action 行为按钮',
+ value: 'action-type'
},
{
- "label": "App 多页应用",
- "value": "app"
+ label: 'App 多页应用',
+ value: 'app'
},
{
- "label": "Button 按钮",
- "value": "button"
+ label: 'Button 按钮',
+ value: 'button'
}
]
},
{
- "label": "数据输入",
- "value": "shujushuru",
- "children": [
+ label: '数据输入',
+ value: 'shujushuru',
+ children: [
{
- "label": "Form 表单",
- "value": "form"
+ label: 'Form 表单',
+ value: 'form'
},
{
- "label": "FormItem 表单项",
- "value": "formitem"
+ label: 'FormItem 表单项',
+ value: 'formitem'
},
{
- "label": "Options 选择器表单项",
- "value": "options"
+ label: 'Options 选择器表单项',
+ value: 'options'
}
]
},
{
- "label": "数据展示",
- "value": "shujuzhanshi",
- "children": [
+ label: '数据展示',
+ value: 'shujuzhanshi',
+ children: [
{
- "label": "CRUD 增删改查",
- "value": "crud"
+ label: 'CRUD 增删改查',
+ value: 'crud'
},
{
- "label": "Table 表格",
- "value": "table"
+ label: 'Table 表格',
+ value: 'table'
},
{
- "label": "Card 卡片",
- "value": "card"
+ label: 'Card 卡片',
+ value: 'card'
}
]
},
{
- "label": "反馈",
- "value": "fankui"
+ label: '反馈',
+ value: 'fankui'
}
]
}
]
},
{
- "name": "select3",
- "type": "chained-select",
- "label": "链式下拉选择器",
- "source": "/api/mock2/options/chainedOptions?waitSeconds=1&parentId=$parentId&level=$level&maxLevel=4",
- "value": "a,b"
+ name: 'select3',
+ type: 'chained-select',
+ label: '链式下拉选择器',
+ source:
+ '/api/mock2/options/chainedOptions?waitSeconds=1&parentId=$parentId&level=$level&maxLevel=4',
+ value: 'a,b'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "matrix-checkboxes",
- "name": "matrix",
- "label": "矩阵开关",
- "rowLabel": "行标题说明",
- "value": [
+ type: 'matrix-checkboxes',
+ name: 'matrix',
+ label: '矩阵开关',
+ rowLabel: '行标题说明',
+ value: [
[
{
- "label": "列1",
- "checked": true
+ label: '列1',
+ checked: true
},
{
- "label": "列1",
- "checked": false
+ label: '列1',
+ checked: false
}
],
[
{
- "label": "列2",
- "checked": false
+ label: '列2',
+ checked: false
},
{
- "label": "列2",
- "checked": true
+ label: '列2',
+ checked: true
}
- ],
- ],
- "columns": [
- {
- "label": "列1"
- },
- {
- "label": "列2"
- }
- ],
- "rows": [
- {
- "label": "行1"
- },
- {
- "label": "行2"
- }
- ]
- },
- {
- "type": "divider"
- },
- {
- "type": "combo",
- "name": "combo",
- "label": "组合单条",
- "value": {
- "c-1": 1,
- "c-2": "a"
- },
- "items": [
- {
- "name": "c-1",
- "label": "名称",
- "type": "input-text",
- "placeholder": "A"
- },
- {
- "name": "c-2",
- "label": "信息",
- "type": "select",
- "options": [
- "a",
- "b",
- "c"
- ]
- }
- ]
- },
- {
- "type": "divider"
- },
- {
- "type": "combo",
- "name": "combo2",
- "label": "组合多条",
- "multiple": true,
- "value": [
- {
- "a": 1,
- "b": "a"
- },
- {
- "a": 2,
- "b": "b"
- },
- ],
- "items": [
- {
- "name": "a",
- "label": "名称:",
- "type": "input-text",
- "placeholder": "A"
- },
- {
- "name": "b",
- "label": "信息:",
- "type": "select",
- "options": [
- "a",
- "b",
- "c"
- ]
- }
- ]
- },
- {
- "name": "array",
- "label": "颜色集合",
- "type": "input-array",
- "value": [
- "red",
- "blue",
- "green"
- ],
- "inline": true,
- "items": {
- "type": "input-color",
- "clearable": false
- }
- },
- {
- "type": "input-kv",
- "name": "kv",
- "label": "键值对",
- "valueType": "input-number",
- "value": {
- "count1": 2,
- "count2": 4
- }
- },
- {
- "type": "input-kvs",
- "name": "dataModel",
- "label": "可嵌套键值对象",
- "addButtonText": "新增表",
- "keyItem": {
- "label": "表名",
- "mode": "horizontal",
- "type": "select",
- "options": [
- "table1",
- "table2",
- "table3"
]
- },
- "valueItems": [
+ ],
+ columns: [
{
- "type": "input-kvs",
- "addButtonText": "新增字段",
- "name": "column",
- "keyItem": {
- "label": "字段名",
- "mode": "horizontal",
- "type": "select",
- "options": [
- "id",
- "title",
- "content"
- ]
+ label: '列1'
+ },
+ {
+ label: '列2'
+ }
+ ],
+ rows: [
+ {
+ label: '行1'
+ },
+ {
+ label: '行2'
+ }
+ ]
+ },
+ {
+ type: 'divider'
+ },
+ {
+ type: 'combo',
+ name: 'combo',
+ label: '组合单条',
+ value: {
+ 'c-1': 1,
+ 'c-2': 'a'
+ },
+ items: [
+ {
+ name: 'c-1',
+ label: '名称',
+ type: 'input-text',
+ placeholder: 'A'
+ },
+ {
+ name: 'c-2',
+ label: '信息',
+ type: 'select',
+ options: ['a', 'b', 'c']
+ }
+ ]
+ },
+ {
+ type: 'divider'
+ },
+ {
+ type: 'combo',
+ name: 'combo2',
+ label: '组合多条',
+ multiple: true,
+ value: [
+ {
+ a: 1,
+ b: 'a'
+ },
+ {
+ a: 2,
+ b: 'b'
+ }
+ ],
+ items: [
+ {
+ name: 'a',
+ label: '名称:',
+ type: 'input-text',
+ placeholder: 'A'
+ },
+ {
+ name: 'b',
+ label: '信息:',
+ type: 'select',
+ options: ['a', 'b', 'c']
+ }
+ ]
+ },
+ {
+ name: 'array',
+ label: '颜色集合',
+ type: 'input-array',
+ value: ['red', 'blue', 'green'],
+ inline: true,
+ items: {
+ type: 'input-color',
+ clearable: false
+ }
+ },
+ {
+ type: 'input-kv',
+ name: 'kv',
+ label: '键值对',
+ valueType: 'input-number',
+ value: {
+ count1: 2,
+ count2: 4
+ }
+ },
+ {
+ type: 'input-kvs',
+ name: 'dataModel',
+ label: '可嵌套键值对象',
+ addButtonText: '新增表',
+ keyItem: {
+ label: '表名',
+ mode: 'horizontal',
+ type: 'select',
+ options: ['table1', 'table2', 'table3']
+ },
+ valueItems: [
+ {
+ type: 'input-kvs',
+ addButtonText: '新增字段',
+ name: 'column',
+ keyItem: {
+ label: '字段名',
+ mode: 'horizontal',
+ type: 'select',
+ options: ['id', 'title', 'content']
},
- "valueItems": [
+ valueItems: [
{
- "type": "switch",
- "name": "primary",
- "mode": "horizontal",
- "label": "是否是主键"
+ type: 'switch',
+ name: 'primary',
+ mode: 'horizontal',
+ label: '是否是主键'
},
{
- "type": "select",
- "name": "type",
- "label": "字段类型",
- "mode": "horizontal",
- "options": [
- "text",
- "int",
- "float"
- ]
+ type: 'select',
+ name: 'type',
+ label: '字段类型',
+ mode: 'horizontal',
+ options: ['text', 'int', 'float']
}
]
}
],
- "value": {
- "table1": {
- "column": {
- "id": {
- "primary": false,
- "type": "text"
+ value: {
+ table1: {
+ column: {
+ id: {
+ primary: false,
+ type: 'text'
},
- "title": {
- "type": "text"
+ title: {
+ type: 'text'
}
}
},
- "table2": {
- "column": {
- "title": {
- "type": "int"
+ table2: {
+ column: {
+ title: {
+ type: 'int'
}
}
}
}
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "input-range",
- "name": "range",
- "label": "范围",
- "value": 50
+ type: 'input-range',
+ name: 'range',
+ label: '范围',
+ value: 50
},
{
- "name": "city",
- "type": "input-city",
- "label": "城市",
- "searchable": true,
- "value": 210727
+ name: 'city',
+ type: 'input-city',
+ label: '城市',
+ searchable: true,
+ value: 210727
},
{
- "type": "location-picker",
- "label": "地理位置",
- "name": "location",
- "ak": "LiZT5dVbGTsPI91tFGcOlSpe5FDehpf7",
- "label": "地址"
+ type: 'location-picker',
+ label: '地理位置',
+ name: 'location',
+ ak: 'LiZT5dVbGTsPI91tFGcOlSpe5FDehpf7'
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "chart-radios",
- "label": "图表单选框",
- "name": "main",
- "chartValueField": "num",
- "value": "a",
- "options": [
+ type: 'chart-radios',
+ label: '图表单选框',
+ name: 'main',
+ chartValueField: 'num',
+ value: 'a',
+ options: [
{
- "label": "A",
- "num": 100,
- "value": "a"
+ label: 'A',
+ num: 100,
+ value: 'a'
},
{
- "label": "B",
- "num": 120,
- "value": "b"
+ label: 'B',
+ num: 120,
+ value: 'b'
},
{
- "label": "C",
- "num": 30,
- "value": "c"
+ label: 'C',
+ num: 30,
+ value: 'c'
},
{
- "label": "D",
- "num": 40,
- "value": "d"
+ label: 'D',
+ num: 40,
+ value: 'd'
}
]
},
{
- "type": "divider"
+ type: 'divider'
},
{
- "type": "button-toolbar",
- "name": "button-toolbar",
- "buttons": [
+ type: 'button-toolbar',
+ name: 'button-toolbar',
+ buttons: [
{
- "type": "button",
- "label": "切换为输入态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '切换为输入态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "nonstatic",
- "componentId": "myform"
+ actionType: 'nonstatic',
+ componentId: 'myform'
}
]
}
}
},
{
- "type": "button",
- "label": "切换为展示态",
- "level": "primary",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '切换为展示态',
+ level: 'primary',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "static",
- "componentId": "myform"
+ actionType: 'static',
+ componentId: 'myform'
}
]
}
}
},
{
- "type": "button",
- "label": "清空",
- "onEvent": {
- "click": {
- "actions": [
+ type: 'button',
+ label: '清空',
+ onEvent: {
+ click: {
+ actions: [
{
- "actionType": "clear",
- "componentId": "myform"
+ actionType: 'clear',
+ componentId: 'myform'
}
]
}
@@ -1883,7 +1859,7 @@ export default {
]
}
],
- "actions": []
+ actions: []
}
]
};
diff --git a/examples/components/MdRenderer.jsx b/examples/components/MdRenderer.jsx
index c0fef87ec..5a72a5011 100644
--- a/examples/components/MdRenderer.jsx
+++ b/examples/components/MdRenderer.jsx
@@ -157,6 +157,7 @@ class Preview extends React.Component {
}
export default function (doc) {
+ doc = doc.default || doc;
return class extends React.Component {
popoverDom = null;
diff --git a/examples/components/SchemaRender.jsx b/examples/components/SchemaRender.jsx
index ab69196dc..8a62aea1c 100644
--- a/examples/components/SchemaRender.jsx
+++ b/examples/components/SchemaRender.jsx
@@ -2,7 +2,6 @@ import React from 'react';
import {render, toast, Button, LazyComponent, Drawer} from 'amis';
import axios from 'axios';
import Portal from 'react-overlays/Portal';
-import {toast} from 'amis';
import {normalizeLink} from 'amis-core';
import {withRouter} from 'react-router';
import copy from 'copy-to-clipboard';
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..9ff917fc2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,111 @@
+
+
+
+
+ amis - 低代码前端框架
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
index e0cc0cddb..7192e9d36 100644
--- a/package.json
+++ b/package.json
@@ -7,10 +7,11 @@
"packages/amis"
],
"scripts": {
- "serve": "fis3 server start --www ./public --port 8888 --no-daemon --no-browse",
- "start": "concurrently --restart-tries -1 npm:serve npm:dev",
- "stop": "fis3 server stop",
- "dev": "fis3 release -cwd ./public",
+ "fis3-serve": "fis3 server start --www ./public --port 8888 --no-daemon --no-browse",
+ "fis3": "concurrently --restart-tries -1 npm:fis3-serve npm:fis3-dev",
+ "fis3-stop": "fis3 server stop",
+ "start": "vite",
+ "fis3-dev": "fis3 release -cwd ./public",
"deploy-gh-page": "sh ./deploy-gh-pages.sh",
"build": "npm run build --workspaces",
"test": "npm test --workspaces",
@@ -23,14 +24,18 @@
"publish-to-internal": "sh ./publish-to-internal.sh"
},
"dependencies": {
- "marked": "^4.0.16",
"postcss": "^8.4.14",
- "prismjs": "^1.28.0",
"qs": "6.9.7"
},
"devDependencies": {
+ "@types/express": "^4.17.14",
"@types/jest": "^28.1.0",
+ "@types/js-yaml": "^4.0.5",
+ "@types/marked": "^4.0.7",
+ "@types/prismjs": "^1.26.0",
+ "@vitejs/plugin-react": "^2.2.0",
"echarts": "5.4.0",
+ "express": "^4.18.2",
"fis-optimizer-terser": "^1.0.1",
"fis-parser-sass": "^1.2.0",
"fis-parser-svgr": "^1.0.0",
@@ -48,10 +53,20 @@
"husky": "^8.0.0",
"jest": "^29.0.3",
"jest-environment-jsdom": "^29.0.3",
+ "js-yaml": "^4.1.0",
"lerna": "^5.5.2",
+ "magic-string": "^0.26.7",
+ "marked": "^4.2.1",
+ "plugin-react-i18n": "^0.0.20",
+ "prismjs": "^1.29.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
+ "rollup-pluginutils": "^2.8.2",
+ "setprototypeof": "^1.2.0",
"ts-jest": "^29.0.2",
+ "vite": "^3.2.2",
+ "vite-plugin-monaco-editor": "^1.1.0",
+ "vite-plugin-svgr": "^2.2.2",
"zrender": "^5.3.2"
},
"jest": {
diff --git a/packages/amis-formula/.gitignore b/packages/amis-formula/.gitignore
index 31dae4e58..955d7bb36 100644
--- a/packages/amis-formula/.gitignore
+++ b/packages/amis-formula/.gitignore
@@ -1,2 +1,3 @@
/coverage
/lib
+/esm
diff --git a/packages/amis-formula/package.json b/packages/amis-formula/package.json
index 75ef5dc9e..b87101d5f 100644
--- a/packages/amis-formula/package.json
+++ b/packages/amis-formula/package.json
@@ -3,9 +3,10 @@
"version": "2.4.0",
"description": "负责 amis 里面的表达式实现,内置公式,编辑器等",
"main": "lib/index.js",
+ "module": "esm/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "build": "npm run clean-dist && NODE_ENV=production rollup -c && npm run genDoc && npm run declaration ",
+ "build": "npm run clean-dist && npm run genDoc && NODE_ENV=production rollup -c && cp src/doc.md lib/doc.md && cp src/doc.md esm/doc.md",
"lib": "npm run clean-dist && NODE_ENV=production IS_LIB=1 rollup -c",
"clean-dist": "rimraf lib/**",
"declaration": "tsc --project tsconfig-for-declaration.json --allowJs --declaration --emitDeclarationOnly --declarationDir ./lib --rootDir ./src",
@@ -14,6 +15,16 @@
"coverage": "jest --coverage",
"genDoc": "ts-node ./scripts/genDoc.ts"
},
+ "exports": {
+ ".": {
+ "require": "./lib/index.js",
+ "import": "./esm/index.js"
+ },
+ "./lib/*": {
+ "require": "./lib/*.js",
+ "import": "./esm/*.js"
+ }
+ },
"repository": {
"type": "git",
"url": "git+https://github.com/aisuda/amis-tpl.git"
@@ -25,7 +36,8 @@
"formula"
],
"files": [
- "lib"
+ "lib",
+ "esm"
],
"author": "fex",
"license": "MIT",
diff --git a/packages/amis-formula/rollup.config.js b/packages/amis-formula/rollup.config.js
index a0602bb1b..034182131 100644
--- a/packages/amis-formula/rollup.config.js
+++ b/packages/amis-formula/rollup.config.js
@@ -3,11 +3,16 @@ import commonjs from '@rollup/plugin-commonjs';
import json from '@rollup/plugin-json';
import resolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';
-import {terser} from 'rollup-plugin-terser';
import license from 'rollup-plugin-license';
-import {name, version, main, author, dependencies} from './package.json';
-
-const isForLib = process.env.IS_LIB || false;
+import {
+ name,
+ version,
+ main,
+ module,
+ author,
+ dependencies
+} from './package.json';
+import path from 'path';
const settings = {
globals: {}
@@ -23,52 +28,79 @@ const external = id =>
.join('|')})`
).test(id);
-export default {
- input: isForLib ? './scripts/lib.ts' : './src/index.ts',
- output: [
- {
- file: isForLib ? 'lib/formula.js' : main,
- name: isForLib ? 'formula' : main,
- ...settings,
- format: isForLib ? 'iife' : 'cjs',
- plugins: [isForLib && terser()],
- strict: !isForLib,
- footer: isForLib
- ? `var evaluate = formula.evaluate;
- var momentFormat = formula.momentFormat;
- var parse = formula.parse;`
- : ''
- }
- ],
- external: isForLib ? [] : external,
+export default [
+ {
+ input: ['./src/index.ts', './src/doc.ts'],
+ output: [
+ {
+ ...settings,
+ dir: path.dirname(main),
+ format: 'cjs',
+ exports: 'named',
+ preserveModulesRoot: './src',
+ preserveModules: true // Keep directory structure and files
+ }
+ ],
+ external: external,
+ plugins: getPlugins('cjs')
+ },
+ {
+ input: ['./src/index.ts', './src/doc.ts'],
+ output: [
+ {
+ ...settings,
+ dir: path.dirname(module),
+ format: 'esm',
+ exports: 'named',
+ preserveModulesRoot: './src',
+ preserveModules: true // Keep directory structure and files
+ }
+ ],
+ external: external,
+ plugins: getPlugins('esm')
+ }
+];
- plugins: [
+function getPlugins(format = 'esm') {
+ const typeScriptOptions = {
+ typescript: require('typescript'),
+ sourceMap: false,
+ outputToFilesystem: true,
+
+ ...(format === 'esm'
+ ? {
+ compilerOptions: {
+ rootDir: './src',
+ outDir: path.dirname(module)
+ }
+ }
+ : {
+ compilerOptions: {
+ rootDir: './src',
+ outDir: path.dirname(main)
+ }
+ })
+ };
+
+ return [
json(),
resolve({
jsnext: true,
main: true,
browser: true
}),
- typescript({
- typescript: require('typescript'),
- sourceMap: false,
- outputToFilesystem: true
+ typescript(typeScriptOptions),
+ commonjs({
+ include: 'node_modules/**',
+ extensions: ['.js'],
+ ignoreGlobal: false,
+ sourceMap: false
}),
- commonjs(
- isForLib
- ? {}
- : {
- include: 'node_modules/**',
- extensions: ['.js'],
- ignoreGlobal: false,
- sourceMap: false
- }
- ),
license({
banner: `
${name} v${version}
Copyright 2021<%= moment().format('YYYY') > 2021 ? '-' + moment().format('YYYY') : null %> ${author}
`
})
- ]
-};
+ ];
+}
diff --git a/packages/amis-formula/scripts/genDoc.ts b/packages/amis-formula/scripts/genDoc.ts
index dd408ee15..63b9eb52d 100644
--- a/packages/amis-formula/scripts/genDoc.ts
+++ b/packages/amis-formula/scripts/genDoc.ts
@@ -4,8 +4,8 @@ import doctrine from 'doctrine';
const workDir = path.resolve(path.dirname(__dirname));
const jsFile = path.join(workDir, 'src/evalutor.ts');
-const outputFile = path.join(workDir, 'lib/doc.js');
-const outputMD = path.join(workDir, 'lib/doc.md');
+const outputFile = path.join(workDir, 'src/doc.ts');
+const outputMD = path.join(workDir, 'src/doc.md');
function getFormulaComments(contents: string) {
const comments: Array<{
@@ -89,37 +89,29 @@ async function main(...params: Array) {
fs.writeFileSync(
outputFile,
- `/**\n * 公式文档\n */\nexports.doc = ${JSON.stringify(
- result,
- null,
- 2
- )}`.replace(/\"(\w+)\"\:/g, (_, key) => `${key}:`),
- 'utf8'
- );
- console.log(`公式文档生成 > ${outputFile}`);
- fs.writeFileSync(
- outputFile.replace(/\.js$/, '.d.ts'),
- // 可以通过以下命令生成
- // tsc --declaration --emitDeclarationOnly --allowJs doc.js
- [
- `export var doc: {`,
+ `/**\n * 公式文档 请运行 \`npm run genDoc\` 自动生成\n */\nexport const doc: ${[
+ `{`,
` name: string;`,
` description: string;`,
` example: string;`,
` params: {`,
- ` type: string;`,
- ` name: string;`,
- ` description: string;`,
+ ` type: string;`,
+ ` name: string;`,
+ ` description: string | null;`,
` }[];`,
` returns: {`,
- ` type: string;`,
- ` description: string;`,
+ ` type: string;`,
+ ` description: string | null;`,
` };`,
` namespace: string;`,
- `}[];`
- ].join('\n'),
+ `}[]`
+ ].join('\n')} = ${JSON.stringify(result, null, 2).replace(
+ /\"(\w+)\"\:/g,
+ (_, key) => `${key}:`
+ )};`,
'utf8'
);
+ console.log(`公式文档生成 > ${outputFile}`);
const grouped: any = {};
result.forEach((item: any) => {
diff --git a/packages/amis-formula/src/doc.md b/packages/amis-formula/src/doc.md
new file mode 100644
index 000000000..e6d677434
--- /dev/null
+++ b/packages/amis-formula/src/doc.md
@@ -0,0 +1,935 @@
+## 逻辑函数
+
+### IF
+
+用法:`IF(condition, consequent, alternate)`
+
+ * `condition:expression` 条件表达式.
+ * `consequent:any` 条件判断通过的返回结果
+ * `alternate:any` 条件判断不通过的返回结果
+
+返回:`any` 根据条件返回不同的结果
+
+示例:IF(A, B, C)
+
+如果满足条件A,则返回B,否则返回C,支持多层嵌套IF函数。
+
+也可以用表达式如:A ? B : C
+
+### AND
+
+用法:`AND(expression1, expression2, ...expressionN)`
+
+ * `conditions:...expression` 条件表达式.
+
+返回:`boolean`
+
+条件全部符合,返回 true,否则返回 false
+
+示例:AND(语文成绩>80, 数学成绩>80)
+
+语文成绩和数学成绩都大于 80,则返回 true,否则返回 false
+
+也可以直接用表达式如:语文成绩>80 && 数学成绩>80
+
+### OR
+
+用法:`OR(expression1, expression2, ...expressionN)`
+
+ * `conditions:...expression` 条件表达式.
+
+返回:`boolean`
+
+条件任意一个满足条件,返回 true,否则返回 false
+
+示例:OR(语文成绩>80, 数学成绩>80)
+
+语文成绩和数学成绩任意一个大于 80,则返回 true,否则返回 false
+
+也可以直接用表达式如:语文成绩>80 || 数学成绩>80
+
+### XOR
+
+用法:`XOR(condition1, condition2)`
+
+ * `condition1:expression` 条件表达式1
+ * `condition2:expression` 条件表达式2
+
+返回:`boolean`
+
+异或处理,多个表达式组中存在奇数个真时认为真。
+
+### IFS
+
+用法:`IFS(condition1, result1, condition2, result2,...conditionN, resultN)`
+
+ * `args:...any` 条件,返回值集合
+
+返回:`any` 第一个满足条件的结果,没有命中的返回 false。
+
+判断函数集合,相当于多个 else if 合并成一个。
+
+示例:IFS(语文成绩 > 80, "优秀", 语文成绩 > 60, "良", "继续努力")
+
+如果语文成绩大于 80,则返回优秀,否则判断大于 60 分,则返回良,否则返回继续努力。
+
+## 数学函数
+
+### ABS
+
+用法:`ABS(num)`
+
+ * `num:number` 数值
+
+返回:`number` 传入数值的绝对值
+
+返回传入数字的绝对值
+
+### MAX
+
+用法:`MAX(num1, num2, ...numN)`
+
+ * `num:...number` 数值
+
+返回:`number` 所有传入值中最大的那个
+
+获取最大值,如果只有一个参数且是数组,则计算这个数组内的值
+
+### MIN
+
+用法:`MIN(num1, num2, ...numN)`
+
+ * `num:...number` 数值
+
+返回:`number` 所有传入值中最小的那个
+
+获取最小值,如果只有一个参数且是数组,则计算这个数组内的值
+
+### SUM
+
+用法:`SUM(num1, num2, ...numN)`
+
+ * `num:...number` 数值
+
+返回:`number` 所有传入数值的总和
+
+求和,如果只有一个参数且是数组,则计算这个数组内的值
+
+### INT
+
+用法:`INT(num)`
+
+ * `num:number` 数值
+
+返回:`number` 数值对应的整形
+
+将数值向下取整为最接近的整数
+
+### MOD
+
+用法:`MOD(num, divisor)`
+
+ * `num:number` 被除数
+ * `divisor:number` 除数
+
+返回:`number` 两数相除的余数
+
+返回两数相除的余数,参数 number 是被除数,divisor 是除数
+
+### PI
+
+用法:`PI()`
+
+圆周率 3.1415...
+
+### ROUND
+
+用法:`ROUND(num[, numDigits = 2])`
+
+ * `num:number` 要处理的数字
+ * `numDigits:number` 小数位数
+
+返回:`number` 传入数值四舍五入后的结果
+
+将数字四舍五入到指定的位数,可以设置小数位。
+
+### FLOOR
+
+用法:`FLOOR(num[, numDigits=2])`
+
+ * `num:number` 要处理的数字
+ * `numDigits:number` 小数位数
+
+返回:`number` 传入数值向下取整后的结果
+
+将数字向下取整到指定的位数,可以设置小数位。
+
+### CEIL
+
+用法:`CEIL(num[, numDigits=2])`
+
+ * `num:number` 要处理的数字
+ * `numDigits:number` 小数位数
+
+返回:`number` 传入数值向上取整后的结果
+
+将数字向上取整到指定的位数,可以设置小数位。
+
+### SQRT
+
+用法:`SQRT(num)`
+
+ * `num:number` 要处理的数字
+
+返回:`number` 开平方的结果
+
+开平方,参数 number 为非负数
+
+### AVG
+
+用法:`AVG(num1, num2, ...numN)`
+
+ * `num:...number` 要处理的数字
+
+返回:`number` 所有数值的平均值
+
+返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值
+
+### DEVSQ
+
+用法:`DEVSQ(num1, num2, ...numN)`
+
+ * `num:...number` 要处理的数字
+
+返回:`number` 所有数值的平均值
+
+返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值
+
+### AVEDEV
+
+用法:`AVEDEV(num1, num2, ...numN)`
+
+ * `num:...number` 要处理的数字
+
+返回:`number` 所有数值的平均值
+
+数据点到其算术平均值的绝对偏差的平均值
+
+### HARMEAN
+
+用法:`HARMEAN(num1, num2, ...numN)`
+
+ * `num:...number` 要处理的数字
+
+返回:`number` 所有数值的平均值
+
+数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值
+
+### LARGE
+
+用法:`LARGE(array, k)`
+
+ * `nums:array` 要处理的数字
+ * `k:number` 第几大
+
+返回:`number` 所有数值的平均值
+
+数据集中第 k 个最大值
+
+### UPPERMONEY
+
+用法:`UPPERMONEY(num)`
+
+ * `num:number` 要处理的数字
+
+返回:`string` 数值中文大写字符
+
+将数值转为中文大写金额
+
+### RAND
+
+用法:`RAND()`
+
+返回大于等于 0 且小于 1 的均匀分布随机实数。每一次触发计算都会变化。
+
+示例:`RAND()*100`
+
+返回 0-100 之间的随机数
+
+### LAST
+
+用法:`LAST(array)`
+
+ * `arr:...number` 要处理的数组
+
+返回:`any` 最后一个值
+
+取数据最后一个
+
+## 文本函数
+
+### LEFT
+
+用法:`LEFT(text, len)`
+
+ * `text:string` 要处理的文本
+ * `len:number` 要处理的长度
+
+返回:`string` 对应字符串
+
+返回传入文本左侧的指定长度字符串。
+
+### RIGHT
+
+用法:`RIGHT(text, len)`
+
+ * `text:string` 要处理的文本
+ * `len:number` 要处理的长度
+
+返回:`string` 对应字符串
+
+返回传入文本右侧的指定长度字符串。
+
+### LEN
+
+用法:`LEN(text)`
+
+ * `text:string` 要处理的文本
+
+返回:`number` 长度
+
+计算文本的长度
+
+### LENGTH
+
+用法:`LENGTH(textArr)`
+
+ * `textArr:Array` 要处理的文本集合
+
+返回:`Array` 长度集合
+
+计算文本集合中所有文本的长度
+
+### ISEMPTY
+
+用法:`ISEMPTY(text)`
+
+ * `text:string` 要处理的文本
+
+返回:`boolean` 判断结果
+
+判断文本是否为空
+
+### CONCATENATE
+
+用法:`CONCATENATE(text1, text2, ...textN)`
+
+ * `text:...string` 文本集合
+
+返回:`string` 连接后的文本
+
+将多个传入值连接成文本
+
+### CHAR
+
+用法:`CHAR(code)`
+
+ * `code:number` 编码值
+
+返回:`string` 指定位置的字符
+
+返回计算机字符集的数字代码所对应的字符。
+
+`CHAR(97)` 等价于 "a"
+
+### LOWER
+
+用法:`LOWER(text)`
+
+ * `text:string` 文本
+
+返回:`string` 结果文本
+
+将传入文本转成小写
+
+### UPPER
+
+用法:`UPPER(text)`
+
+ * `text:string` 文本
+
+返回:`string` 结果文本
+
+将传入文本转成大写
+
+### UPPERFIRST
+
+用法:`UPPERFIRST(text)`
+
+ * `text:string` 文本
+
+返回:`string` 结果文本
+
+将传入文本首字母转成大写
+
+### PADSTART
+
+用法:`PADSTART(text)`
+
+ * `text:string` 文本
+ * `num:number` 目标长度
+ * `pad:string` 用于补齐的文本
+
+返回:`string` 结果文本
+
+向前补齐文本长度
+
+示例 `PADSTART("6", 2, "0")`
+
+返回 `06`
+
+### CAPITALIZE
+
+用法:`CAPITALIZE(text)`
+
+ * `text:string` 文本
+
+返回:`string` 结果文本
+
+将文本转成标题
+
+示例 `CAPITALIZE("star")`
+
+返回 `Star`
+
+### ESCAPE
+
+用法:`ESCAPE(text)`
+
+ * `text:string` 文本
+
+返回:`string` 结果文本
+
+对文本进行 HTML 转义
+
+示例 `ESCAPE("&")`
+
+返回 `<start>&`
+
+### TRUNCATE
+
+用法:`TRUNCATE(text, 6)`
+
+ * `text:string` 文本
+ * `text:number` 最长长度
+
+返回:`string` 结果文本
+
+对文本长度进行截断
+
+示例 `TRUNCATE("amis.baidu.com", 6)`
+
+返回 `amis...`
+
+### BEFORELAST
+
+用法:`BEFORELAST(text, '.')`
+
+ * `text:string` 文本
+ * `delimiter:string` 结束文本
+
+返回:`string` 判断结果
+
+取在某个分隔符之前的所有字符串
+
+### SPLIT
+
+用法:`SPLIT(text, ',')`
+
+ * `text:string` 文本
+ * `delimiter:string` 文本片段
+
+返回:`Array` 文本集
+
+将文本根据指定片段分割成数组
+
+示例:`SPLIT("a,b,c", ",")`
+
+返回 `["a", "b", "c"]`
+
+### TRIM
+
+用法:`TRIM(text)`
+
+ * `text:string` 文本
+
+返回:`string` 处理后的文本
+
+将文本去除前后空格
+
+### STRIPTAG
+
+用法:`STRIPTAG(text)`
+
+ * `text:string` 文本
+
+返回:`string` 处理后的文本
+
+去除文本中的 HTML 标签
+
+示例:`STRIPTAG("amis ")`
+
+返回:`amis`
+
+### LINEBREAK
+
+用法:`LINEBREAK(text)`
+
+ * `text:string` 文本
+
+返回:`string` 处理后的文本
+
+将字符串中的换行转成 HTML ` `,用于简单换行的场景
+
+示例:`LINEBREAK("\n")`
+
+返回:` `
+
+### STARTSWITH
+
+用法:`STARTSWITH(text, '片段')`
+
+ * `text:string` 文本
+ * `startString:string` 起始文本
+
+返回:`string` 判断结果
+
+判断字符串(text)是否以特定字符串(startString)开始,是则返回 True,否则返回 False
+
+### ENDSWITH
+
+用法:`ENDSWITH(text, '片段')`
+
+ * `text:string` 文本
+ * `endString:string` 结束文本
+
+返回:`string` 判断结果
+
+判断字符串(text)是否以特定字符串(endString)结束,是则返回 True,否则返回 False
+
+### CONTAINS
+
+用法:`CONTAINS(text, searchText)`
+
+ * `text:string` 文本
+ * `searchText:string` 搜索文本
+
+返回:`string` 判断结果
+
+判断参数 1 中的文本是否包含参数 2 中的文本。
+
+### REPLACE
+
+用法:`REPLACE(text, search, replace)`
+
+ * `text:string` 要处理的文本
+ * `search:string` 要被替换的文本
+ * `replace:string` 要替换的文本
+
+返回:`string` 处理结果
+
+对文本进行全量替换。
+
+### SEARCH
+
+用法:`SEARCH(text, search, 0)`
+
+ * `text:string` 要处理的文本
+ * `search:string` 用来搜索的文本
+ * `start:number` 起始位置
+
+返回:`number` 命中的位置
+
+对文本进行搜索,返回命中的位置
+
+### MID
+
+用法:`MID(text, from, len)`
+
+ * `text:string` 要处理的文本
+ * `from:number` 起始位置
+ * `len:number` 处理长度
+
+返回:`number` 命中的位置
+
+返回文本字符串中从指定位置开始的特定数目的字符
+
+### BASENAME
+
+用法:`BASENAME(text)`
+
+ * `text:string` 要处理的文本
+
+返回:`string` 文件名
+
+返回路径中的文件名
+
+示例:`/home/amis/a.json`
+
+返回:a.json`
+
+## 日期函数
+
+### DATE
+
+用法:`DATE('2021-12-06 08:20:00')`
+
+创建日期对象,可以通过特定格式的字符串,或者数值。
+
+需要注意的是,其中月份的数值是从0开始的,也就是说,
+如果是12月份,你应该传入数值11。
+
+### TIMESTAMP
+
+用法:`TIMESTAMP(date, 'x')`
+
+ * `date:date` 日期对象
+ * `format:string` 时间戳格式,带毫秒传入 'x'。默认为 'X' 不带毫秒的。
+
+返回:`number` 时间戳
+
+返回时间的时间戳
+
+### TODAY
+
+用法:`TODAY()`
+
+返回今天的日期
+
+### NOW
+
+用法:`NOW()`
+
+返回现在的日期
+
+### DATETOSTR
+
+用法:`DATETOSTR(date, 'YYYY-MM-DD')`
+
+ * `date:date` 日期对象
+ * `format:string` 日期格式,默认为 "YYYY-MM-DD HH:mm:ss"
+
+返回:`number` 日期字符串
+
+将日期转成日期字符串
+
+### STARTOF
+
+用法:`STARTOF(date[unit = "day"])`
+
+ * `date:date` 日期对象
+ * `unit:string` 比如可以传入 'day'、'month'、'year' 或者 `week` 等等
+
+返回:`date` 新的日期对象
+
+返回日期的指定范围的开端
+
+### ENDOF
+
+用法:`ENDOF(date[unit = "day"])`
+
+ * `date:date` 日期对象
+ * `unit:string` 比如可以传入 'day'、'month'、'year' 或者 `week` 等等
+
+返回:`date` 新的日期对象
+
+返回日期的指定范围的末尾
+
+### YEAR
+
+用法:`YEAR(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的年份
+
+### MONTH
+
+用法:`MONTH(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的月份,这里就是自然月份。
+
+### DAY
+
+用法:`DAY(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的天
+
+### HOUR
+
+用法:`HOUR(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的小时
+
+### MINUTE
+
+用法:`MINUTE(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的分
+
+### SECOND
+
+用法:`SECOND(date)`
+
+ * `date:date` 日期对象
+
+返回:`number` 数值
+
+返回日期的秒
+
+### YEARS
+
+用法:`YEARS(endDate, startDate)`
+
+ * `endDate:date` 日期对象
+ * `startDate:date` 日期对象
+
+返回:`number` 数值
+
+返回两个日期相差多少年
+
+### MINUTES
+
+用法:`MINUTES(endDate, startDate)`
+
+ * `endDate:date` 日期对象
+ * `startDate:date` 日期对象
+
+返回:`number` 数值
+
+返回两个日期相差多少分钟
+
+### DAYS
+
+用法:`DAYS(endDate, startDate)`
+
+ * `endDate:date` 日期对象
+ * `startDate:date` 日期对象
+
+返回:`number` 数值
+
+返回两个日期相差多少天
+
+### HOURS
+
+用法:`HOURS(endDate, startDate)`
+
+ * `endDate:date` 日期对象
+ * `startDate:date` 日期对象
+
+返回:`number` 数值
+
+返回两个日期相差多少小时
+
+### DATEMODIFY
+
+用法:`DATEMODIFY(date, 2, 'days')`
+
+ * `date:date` 日期对象
+ * `num:number` 数值
+ * `unit:string` 单位:支持年、月、天等等
+
+返回:`date` 日期对象
+
+修改日期,对日期进行加减天、月份、年等操作
+
+示例:
+
+DATEMODIFY(A, -2, 'month')
+
+对日期 A 进行往前减2月的操作。
+
+### STRTODATE
+
+用法:`STRTODATE(value[, format=""])`
+
+ * `value:string` 日期字符
+ * `format:string` 日期格式
+
+返回:`date` 日期对象
+
+将字符日期转成日期对象,可以指定日期格式。
+
+示例:STRTODATE('2021/12/6', 'YYYY/MM/DD')
+
+### ISBEFORE
+
+用法:`ISBEFORE(a, b)`
+
+ * `a:date` 第一个日期
+ * `b:date` 第二个日期
+ * `unit:string` 单位,默认是 'day', 即之比较到天
+
+返回:`boolean` 判断结果
+
+判断两个日期,是否第一个日期在第二个日期的前面
+
+### ISAFTER
+
+用法:`ISAFTER(a, b)`
+
+ * `a:date` 第一个日期
+ * `b:date` 第二个日期
+ * `unit:string` 单位,默认是 'day', 即之比较到天
+
+返回:`boolean` 判断结果
+
+判断两个日期,是否第一个日期在第二个日期的后面
+
+### ISSAMEORBEFORE
+
+用法:`ISSAMEORBEFORE(a, b)`
+
+ * `a:date` 第一个日期
+ * `b:date` 第二个日期
+ * `unit:string` 单位,默认是 'day', 即之比较到天
+
+返回:`boolean` 判断结果
+
+判断两个日期,是否第一个日期在第二个日期的前面或者相等
+
+### ISSAMEORAFTER
+
+用法:`ISSAMEORAFTER(a, b)`
+
+ * `a:date` 第一个日期
+ * `b:date` 第二个日期
+ * `unit:string` 单位,默认是 'day', 即之比较到天
+
+返回:`boolean` 判断结果
+
+判断两个日期,是否第一个日期在第二个日期的后面或者相等
+
+## 数组
+
+### COUNT
+
+用法:`COUNT(arr)`
+
+ * `arr:Array` 数组
+
+返回:`boolean` 结果
+
+返回数组的长度
+
+### ARRAYMAP
+
+用法:`ARRAYMAP(arr, item => item)`
+
+ * `arr:Array` 数组
+ * `iterator:Array` 箭头函数
+
+返回:`boolean` 结果
+
+数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
+
+### ARRAYFILTER
+
+用法:`ARRAYFILTER(arr, item => item)`
+
+ * `arr:Array` 数组
+ * `iterator:Array` 箭头函数
+
+返回:`boolean` 结果
+
+数据做数据过滤,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
+将第二个箭头函数返回为 false 的成员过滤掉。
+
+### COMPACT
+
+用法:`COMPACT(arr)`
+
+ * `arr:Array` 数组
+
+返回:`Array` 结果
+
+数组过滤掉 false、null、0 和 ""
+
+示例:
+
+COMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]
+
+### JOIN
+
+用法:`JOIN(arr, string)`
+
+ * `arr:Array` 数组
+ * `separator:String` 分隔符
+
+返回:`String` 结果
+
+数组转成字符串
+
+示例:
+
+JOIN(['a', 'b', 'c'], '=') 得到 'a=b=c'
+
+### CONCAT
+
+用法:`CONCAT(['a', 'b', 'c'], ['1'], ['3'])`
+
+ * `arr:Array` 数组
+
+返回:`Array` 结果
+
+数组合并
+
+示例:
+
+CONCAT(['a', 'b', 'c'], ['1'], ['3']) 得到 ['a', 'b', 'c', '1', '3']
+
+### UNIQ
+
+用法:`UNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'x')`
+
+ * `arr:Array` 数组
+ * `field:string` 字段
+
+返回:`Array` 结果
+
+数组去重,第二个参数「field」,可指定根据该字段去重
+
+示例:
+
+UNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'id')
+
+## 其他
+
+### ISTYPE
+
+用法:`ISTYPE([{a: '1'}, {b: '2'}, {a: '1'}], 'array')`
+
+ * `判断对象:string` null
+
+返回:`boolean` 结果结果
+
+判断是否为类型支持:string, number, array, date, plain-object。
+
diff --git a/packages/amis-formula/src/doc.ts b/packages/amis-formula/src/doc.ts
new file mode 100644
index 000000000..d1eead981
--- /dev/null
+++ b/packages/amis-formula/src/doc.ts
@@ -0,0 +1,1601 @@
+/**
+ * 公式文档 请运行 `npm run genDoc` 自动生成
+ */
+export const doc: {
+ name: string;
+ description: string;
+ example: string;
+ params: {
+ type: string;
+ name: string;
+ description: string | null;
+ }[];
+ returns: {
+ type: string;
+ description: string | null;
+ };
+ namespace: string;
+}[] = [
+ {
+ name: "IF",
+ description: "示例:IF(A, B, C)\n\n如果满足条件A,则返回B,否则返回C,支持多层嵌套IF函数。\n\n也可以用表达式如:A ? B : C",
+ example: "IF(condition, consequent, alternate)",
+ params: [
+ {
+ type: "expression",
+ name: "condition",
+ description: "条件表达式."
+ },
+ {
+ type: "any",
+ name: "consequent",
+ description: "条件判断通过的返回结果"
+ },
+ {
+ type: "any",
+ name: "alternate",
+ description: "条件判断不通过的返回结果"
+ }
+ ],
+ returns: {
+ type: "any",
+ description: "根据条件返回不同的结果"
+ },
+ namespace: "逻辑函数"
+ },
+ {
+ name: "AND",
+ description: "条件全部符合,返回 true,否则返回 false\n\n示例:AND(语文成绩>80, 数学成绩>80)\n\n语文成绩和数学成绩都大于 80,则返回 true,否则返回 false\n\n也可以直接用表达式如:语文成绩>80 && 数学成绩>80",
+ example: "AND(expression1, expression2, ...expressionN)",
+ params: [
+ {
+ type: "...expression",
+ name: "conditions",
+ description: "条件表达式."
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: null
+ },
+ namespace: "逻辑函数"
+ },
+ {
+ name: "OR",
+ description: "条件任意一个满足条件,返回 true,否则返回 false\n\n示例:OR(语文成绩>80, 数学成绩>80)\n\n语文成绩和数学成绩任意一个大于 80,则返回 true,否则返回 false\n\n也可以直接用表达式如:语文成绩>80 || 数学成绩>80",
+ example: "OR(expression1, expression2, ...expressionN)",
+ params: [
+ {
+ type: "...expression",
+ name: "conditions",
+ description: "条件表达式."
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: null
+ },
+ namespace: "逻辑函数"
+ },
+ {
+ name: "XOR",
+ description: "异或处理,多个表达式组中存在奇数个真时认为真。",
+ example: "XOR(condition1, condition2)",
+ params: [
+ {
+ type: "expression",
+ name: "condition1",
+ description: "条件表达式1"
+ },
+ {
+ type: "expression",
+ name: "condition2",
+ description: "条件表达式2"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: null
+ },
+ namespace: "逻辑函数"
+ },
+ {
+ name: "IFS",
+ description: "判断函数集合,相当于多个 else if 合并成一个。\n\n示例:IFS(语文成绩 > 80, \"优秀\", 语文成绩 > 60, \"良\", \"继续努力\")\n\n如果语文成绩大于 80,则返回优秀,否则判断大于 60 分,则返回良,否则返回继续努力。",
+ example: "IFS(condition1, result1, condition2, result2,...conditionN, resultN)",
+ params: [
+ {
+ type: "...any",
+ name: "args",
+ description: "条件,返回值集合"
+ }
+ ],
+ returns: {
+ type: "any",
+ description: "第一个满足条件的结果,没有命中的返回 false。"
+ },
+ namespace: "逻辑函数"
+ },
+ {
+ name: "ABS",
+ description: "返回传入数字的绝对值",
+ example: "ABS(num)",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "数值"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "传入数值的绝对值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "MAX",
+ description: "获取最大值,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "MAX(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "数值"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有传入值中最大的那个"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "MIN",
+ description: "获取最小值,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "MIN(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "数值"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有传入值中最小的那个"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "SUM",
+ description: "求和,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "SUM(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "数值"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有传入数值的总和"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "INT",
+ description: "将数值向下取整为最接近的整数",
+ example: "INT(num)",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "数值"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值对应的整形"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "MOD",
+ description: "返回两数相除的余数,参数 number 是被除数,divisor 是除数",
+ example: "MOD(num, divisor)",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "被除数"
+ },
+ {
+ type: "number",
+ name: "divisor",
+ description: "除数"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "两数相除的余数"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "PI",
+ description: "圆周率 3.1415...",
+ example: "PI()",
+ params: [],
+ returns: {
+ type: "number",
+ description: "圆周率数值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "ROUND",
+ description: "将数字四舍五入到指定的位数,可以设置小数位。",
+ example: "ROUND(num[, numDigits = 2])",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "要处理的数字"
+ },
+ {
+ type: "number",
+ name: "numDigits",
+ description: "小数位数"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "传入数值四舍五入后的结果"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "FLOOR",
+ description: "将数字向下取整到指定的位数,可以设置小数位。",
+ example: "FLOOR(num[, numDigits=2])",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "要处理的数字"
+ },
+ {
+ type: "number",
+ name: "numDigits",
+ description: "小数位数"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "传入数值向下取整后的结果"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "CEIL",
+ description: "将数字向上取整到指定的位数,可以设置小数位。",
+ example: "CEIL(num[, numDigits=2])",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "要处理的数字"
+ },
+ {
+ type: "number",
+ name: "numDigits",
+ description: "小数位数"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "传入数值向上取整后的结果"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "SQRT",
+ description: "开平方,参数 number 为非负数",
+ example: "SQRT(num)",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "开平方的结果"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "AVG",
+ description: "返回所有参数的平均值,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "AVG(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有数值的平均值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "DEVSQ",
+ description: "返回数据点与数据均值点之差(数据偏差)的平方和,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "DEVSQ(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有数值的平均值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "AVEDEV",
+ description: "数据点到其算术平均值的绝对偏差的平均值",
+ example: "AVEDEV(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有数值的平均值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "HARMEAN",
+ description: "数据点的调和平均值,如果只有一个参数且是数组,则计算这个数组内的值",
+ example: "HARMEAN(num1, num2, ...numN)",
+ params: [
+ {
+ type: "...number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有数值的平均值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "LARGE",
+ description: "数据集中第 k 个最大值",
+ example: "LARGE(array, k)",
+ params: [
+ {
+ type: "array",
+ name: "nums",
+ description: "要处理的数字"
+ },
+ {
+ type: "number",
+ name: "k",
+ description: "第几大"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "所有数值的平均值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "UPPERMONEY",
+ description: "将数值转为中文大写金额",
+ example: "UPPERMONEY(num)",
+ params: [
+ {
+ type: "number",
+ name: "num",
+ description: "要处理的数字"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "数值中文大写字符"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "RAND",
+ description: "返回大于等于 0 且小于 1 的均匀分布随机实数。每一次触发计算都会变化。\n\n示例:`RAND()*100`\n\n返回 0-100 之间的随机数",
+ example: "RAND()",
+ params: [],
+ returns: {
+ type: "number",
+ description: "随机数"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "LAST",
+ description: "取数据最后一个",
+ example: "LAST(array)",
+ params: [
+ {
+ type: "...number",
+ name: "arr",
+ description: "要处理的数组"
+ }
+ ],
+ returns: {
+ type: "any",
+ description: "最后一个值"
+ },
+ namespace: "数学函数"
+ },
+ {
+ name: "LEFT",
+ description: "返回传入文本左侧的指定长度字符串。",
+ example: "LEFT(text, len)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ },
+ {
+ type: "number",
+ name: "len",
+ description: "要处理的长度"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "对应字符串"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "RIGHT",
+ description: "返回传入文本右侧的指定长度字符串。",
+ example: "RIGHT(text, len)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ },
+ {
+ type: "number",
+ name: "len",
+ description: "要处理的长度"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "对应字符串"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "LEN",
+ description: "计算文本的长度",
+ example: "LEN(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "长度"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "LENGTH",
+ description: "计算文本集合中所有文本的长度",
+ example: "LENGTH(textArr)",
+ params: [
+ {
+ type: "Array",
+ name: "textArr",
+ description: "要处理的文本集合"
+ }
+ ],
+ returns: {
+ type: "Array",
+ description: "长度集合"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "ISEMPTY",
+ description: "判断文本是否为空",
+ example: "ISEMPTY(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "判断结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "CONCATENATE",
+ description: "将多个传入值连接成文本",
+ example: "CONCATENATE(text1, text2, ...textN)",
+ params: [
+ {
+ type: "...string",
+ name: "text",
+ description: "文本集合"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "连接后的文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "CHAR",
+ description: "返回计算机字符集的数字代码所对应的字符。\n\n`CHAR(97)` 等价于 \"a\"",
+ example: "CHAR(code)",
+ params: [
+ {
+ type: "number",
+ name: "code",
+ description: "编码值"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "指定位置的字符"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "LOWER",
+ description: "将传入文本转成小写",
+ example: "LOWER(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "UPPER",
+ description: "将传入文本转成大写",
+ example: "UPPER(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "UPPERFIRST",
+ description: "将传入文本首字母转成大写",
+ example: "UPPERFIRST(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "PADSTART",
+ description: "向前补齐文本长度\n\n示例 `PADSTART(\"6\", 2, \"0\")`\n\n返回 `06`",
+ example: "PADSTART(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "number",
+ name: "num",
+ description: "目标长度"
+ },
+ {
+ type: "string",
+ name: "pad",
+ description: "用于补齐的文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "CAPITALIZE",
+ description: "将文本转成标题\n\n示例 `CAPITALIZE(\"star\")`\n\n返回 `Star`",
+ example: "CAPITALIZE(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "ESCAPE",
+ description: "对文本进行 HTML 转义\n\n示例 `ESCAPE(\"&\")`\n\n返回 `<start>&`",
+ example: "ESCAPE(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "TRUNCATE",
+ description: "对文本长度进行截断\n\n示例 `TRUNCATE(\"amis.baidu.com\", 6)`\n\n返回 `amis...`",
+ example: "TRUNCATE(text, 6)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "number",
+ name: "text",
+ description: "最长长度"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "结果文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "BEFORELAST",
+ description: "取在某个分隔符之前的所有字符串",
+ example: "BEFORELAST(text, '.')",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "string",
+ name: "delimiter",
+ description: "结束文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "判断结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "SPLIT",
+ description: "将文本根据指定片段分割成数组\n\n示例:`SPLIT(\"a,b,c\", \",\")`\n\n返回 `[\"a\", \"b\", \"c\"]`",
+ example: "SPLIT(text, ',')",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "string",
+ name: "delimiter",
+ description: "文本片段"
+ }
+ ],
+ returns: {
+ type: "Array",
+ description: "文本集"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "TRIM",
+ description: "将文本去除前后空格",
+ example: "TRIM(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "处理后的文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "STRIPTAG",
+ description: "去除文本中的 HTML 标签\n\n示例:`STRIPTAG(\"amis \")`\n\n返回:`amis`",
+ example: "STRIPTAG(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "处理后的文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "LINEBREAK",
+ description: "将字符串中的换行转成 HTML ` `,用于简单换行的场景\n\n示例:`LINEBREAK(\"\\n\")`\n\n返回:` `",
+ example: "LINEBREAK(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "处理后的文本"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "STARTSWITH",
+ description: "判断字符串(text)是否以特定字符串(startString)开始,是则返回 True,否则返回 False",
+ example: "STARTSWITH(text, '片段')",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "string",
+ name: "startString",
+ description: "起始文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "判断结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "ENDSWITH",
+ description: "判断字符串(text)是否以特定字符串(endString)结束,是则返回 True,否则返回 False",
+ example: "ENDSWITH(text, '片段')",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "string",
+ name: "endString",
+ description: "结束文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "判断结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "CONTAINS",
+ description: "判断参数 1 中的文本是否包含参数 2 中的文本。",
+ example: "CONTAINS(text, searchText)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "文本"
+ },
+ {
+ type: "string",
+ name: "searchText",
+ description: "搜索文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "判断结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "REPLACE",
+ description: "对文本进行全量替换。",
+ example: "REPLACE(text, search, replace)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ },
+ {
+ type: "string",
+ name: "search",
+ description: "要被替换的文本"
+ },
+ {
+ type: "string",
+ name: "replace",
+ description: "要替换的文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "处理结果"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "SEARCH",
+ description: "对文本进行搜索,返回命中的位置",
+ example: "SEARCH(text, search, 0)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ },
+ {
+ type: "string",
+ name: "search",
+ description: "用来搜索的文本"
+ },
+ {
+ type: "number",
+ name: "start",
+ description: "起始位置"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "命中的位置"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "MID",
+ description: "返回文本字符串中从指定位置开始的特定数目的字符",
+ example: "MID(text, from, len)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ },
+ {
+ type: "number",
+ name: "from",
+ description: "起始位置"
+ },
+ {
+ type: "number",
+ name: "len",
+ description: "处理长度"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "命中的位置"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "BASENAME",
+ description: "返回路径中的文件名\n\n示例:`/home/amis/a.json`\n\n返回:a.json`",
+ example: "BASENAME(text)",
+ params: [
+ {
+ type: "string",
+ name: "text",
+ description: "要处理的文本"
+ }
+ ],
+ returns: {
+ type: "string",
+ description: "文件名"
+ },
+ namespace: "文本函数"
+ },
+ {
+ name: "DATE",
+ description: "创建日期对象,可以通过特定格式的字符串,或者数值。\n\n需要注意的是,其中月份的数值是从0开始的,也就是说,\n如果是12月份,你应该传入数值11。",
+ example: "DATE('2021-12-06 08:20:00')",
+ params: [],
+ returns: {
+ type: "Date",
+ description: "日期对象"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "TIMESTAMP",
+ description: "返回时间的时间戳",
+ example: "TIMESTAMP(date, 'x')",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ },
+ {
+ type: "string",
+ name: "format",
+ description: "时间戳格式,带毫秒传入 'x'。默认为 'X' 不带毫秒的。"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "时间戳"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "TODAY",
+ description: "返回今天的日期",
+ example: "TODAY()",
+ params: [],
+ returns: {
+ type: "number",
+ description: "日期"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "NOW",
+ description: "返回现在的日期",
+ example: "NOW()",
+ params: [],
+ returns: {
+ type: "number",
+ description: "日期"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "DATETOSTR",
+ description: "将日期转成日期字符串",
+ example: "DATETOSTR(date, 'YYYY-MM-DD')",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ },
+ {
+ type: "string",
+ name: "format",
+ description: "日期格式,默认为 \"YYYY-MM-DD HH:mm:ss\""
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "日期字符串"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "STARTOF",
+ description: "返回日期的指定范围的开端",
+ example: "STARTOF(date[unit = \"day\"])",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "比如可以传入 'day'、'month'、'year' 或者 `week` 等等"
+ }
+ ],
+ returns: {
+ type: "date",
+ description: "新的日期对象"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "ENDOF",
+ description: "返回日期的指定范围的末尾",
+ example: "ENDOF(date[unit = \"day\"])",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "比如可以传入 'day'、'month'、'year' 或者 `week` 等等"
+ }
+ ],
+ returns: {
+ type: "date",
+ description: "新的日期对象"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "YEAR",
+ description: "返回日期的年份",
+ example: "YEAR(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "MONTH",
+ description: "返回日期的月份,这里就是自然月份。",
+ example: "MONTH(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "DAY",
+ description: "返回日期的天",
+ example: "DAY(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "HOUR",
+ description: "返回日期的小时",
+ example: "HOUR(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "MINUTE",
+ description: "返回日期的分",
+ example: "MINUTE(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "SECOND",
+ description: "返回日期的秒",
+ example: "SECOND(date)",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "YEARS",
+ description: "返回两个日期相差多少年",
+ example: "YEARS(endDate, startDate)",
+ params: [
+ {
+ type: "date",
+ name: "endDate",
+ description: "日期对象"
+ },
+ {
+ type: "date",
+ name: "startDate",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "MINUTES",
+ description: "返回两个日期相差多少分钟",
+ example: "MINUTES(endDate, startDate)",
+ params: [
+ {
+ type: "date",
+ name: "endDate",
+ description: "日期对象"
+ },
+ {
+ type: "date",
+ name: "startDate",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "DAYS",
+ description: "返回两个日期相差多少天",
+ example: "DAYS(endDate, startDate)",
+ params: [
+ {
+ type: "date",
+ name: "endDate",
+ description: "日期对象"
+ },
+ {
+ type: "date",
+ name: "startDate",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "HOURS",
+ description: "返回两个日期相差多少小时",
+ example: "HOURS(endDate, startDate)",
+ params: [
+ {
+ type: "date",
+ name: "endDate",
+ description: "日期对象"
+ },
+ {
+ type: "date",
+ name: "startDate",
+ description: "日期对象"
+ }
+ ],
+ returns: {
+ type: "number",
+ description: "数值"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "DATEMODIFY",
+ description: "修改日期,对日期进行加减天、月份、年等操作\n\n示例:\n\nDATEMODIFY(A, -2, 'month')\n\n对日期 A 进行往前减2月的操作。",
+ example: "DATEMODIFY(date, 2, 'days')",
+ params: [
+ {
+ type: "date",
+ name: "date",
+ description: "日期对象"
+ },
+ {
+ type: "number",
+ name: "num",
+ description: "数值"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "单位:支持年、月、天等等"
+ }
+ ],
+ returns: {
+ type: "date",
+ description: "日期对象"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "STRTODATE",
+ description: "将字符日期转成日期对象,可以指定日期格式。\n\n示例:STRTODATE('2021/12/6', 'YYYY/MM/DD')",
+ example: "STRTODATE(value[, format=\"\"])",
+ params: [
+ {
+ type: "string",
+ name: "value",
+ description: "日期字符"
+ },
+ {
+ type: "string",
+ name: "format",
+ description: "日期格式"
+ }
+ ],
+ returns: {
+ type: "date",
+ description: "日期对象"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "ISBEFORE",
+ description: "判断两个日期,是否第一个日期在第二个日期的前面",
+ example: "ISBEFORE(a, b)",
+ params: [
+ {
+ type: "date",
+ name: "a",
+ description: "第一个日期"
+ },
+ {
+ type: "date",
+ name: "b",
+ description: "第二个日期"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "单位,默认是 'day', 即之比较到天"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "判断结果"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "ISAFTER",
+ description: "判断两个日期,是否第一个日期在第二个日期的后面",
+ example: "ISAFTER(a, b)",
+ params: [
+ {
+ type: "date",
+ name: "a",
+ description: "第一个日期"
+ },
+ {
+ type: "date",
+ name: "b",
+ description: "第二个日期"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "单位,默认是 'day', 即之比较到天"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "判断结果"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "ISSAMEORBEFORE",
+ description: "判断两个日期,是否第一个日期在第二个日期的前面或者相等",
+ example: "ISSAMEORBEFORE(a, b)",
+ params: [
+ {
+ type: "date",
+ name: "a",
+ description: "第一个日期"
+ },
+ {
+ type: "date",
+ name: "b",
+ description: "第二个日期"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "单位,默认是 'day', 即之比较到天"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "判断结果"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "ISSAMEORAFTER",
+ description: "判断两个日期,是否第一个日期在第二个日期的后面或者相等",
+ example: "ISSAMEORAFTER(a, b)",
+ params: [
+ {
+ type: "date",
+ name: "a",
+ description: "第一个日期"
+ },
+ {
+ type: "date",
+ name: "b",
+ description: "第二个日期"
+ },
+ {
+ type: "string",
+ name: "unit",
+ description: "单位,默认是 'day', 即之比较到天"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "判断结果"
+ },
+ namespace: "日期函数"
+ },
+ {
+ name: "COUNT",
+ description: "返回数组的长度",
+ example: "COUNT(arr)",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "ARRAYMAP",
+ description: "数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。",
+ example: "ARRAYMAP(arr, item => item)",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ },
+ {
+ type: "Array",
+ name: "iterator",
+ description: "箭头函数"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "ARRAYFILTER",
+ description: "数据做数据过滤,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。\n将第二个箭头函数返回为 false 的成员过滤掉。",
+ example: "ARRAYFILTER(arr, item => item)",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ },
+ {
+ type: "Array",
+ name: "iterator",
+ description: "箭头函数"
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "COMPACT",
+ description: "数组过滤掉 false、null、0 和 \"\"\n\n示例:\n\nCOMPACT([0, 1, false, 2, '', 3]) 得到 [1, 2, 3]",
+ example: "COMPACT(arr)",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ }
+ ],
+ returns: {
+ type: "Array",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "JOIN",
+ description: "数组转成字符串\n\n示例:\n\nJOIN(['a', 'b', 'c'], '=') 得到 'a=b=c'",
+ example: "JOIN(arr, string)",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ },
+ {
+ type: "String",
+ name: "separator",
+ description: "分隔符"
+ }
+ ],
+ returns: {
+ type: "String",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "CONCAT",
+ description: "数组合并\n\n示例:\n\nCONCAT(['a', 'b', 'c'], ['1'], ['3']) 得到 ['a', 'b', 'c', '1', '3']",
+ example: "CONCAT(['a', 'b', 'c'], ['1'], ['3'])",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ }
+ ],
+ returns: {
+ type: "Array",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "UNIQ",
+ description: "数组去重,第二个参数「field」,可指定根据该字段去重\n\n示例:\n\nUNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'id')",
+ example: "UNIQ([{a: '1'}, {b: '2'}, {a: '1'}], 'x')",
+ params: [
+ {
+ type: "Array",
+ name: "arr",
+ description: "数组"
+ },
+ {
+ type: "string",
+ name: "field",
+ description: "字段"
+ }
+ ],
+ returns: {
+ type: "Array",
+ description: "结果"
+ },
+ namespace: "数组"
+ },
+ {
+ name: "ISTYPE",
+ description: "判断是否为类型支持:string, number, array, date, plain-object。",
+ example: "ISTYPE([{a: '1'}, {b: '2'}, {a: '1'}], 'array')",
+ params: [
+ {
+ type: "string",
+ name: "判断对象",
+ description: null
+ }
+ ],
+ returns: {
+ type: "boolean",
+ description: "结果结果"
+ },
+ namespace: "其他"
+ }
+];
\ No newline at end of file
diff --git a/packages/amis-formula/src/filter.ts b/packages/amis-formula/src/filter.ts
index 21caabbf7..c1b2328f8 100644
--- a/packages/amis-formula/src/filter.ts
+++ b/packages/amis-formula/src/filter.ts
@@ -1,9 +1,7 @@
import {Evaluator} from './evalutor';
import {FilterMap} from './types';
-const entityMap: {
- [propName: string]: string;
-} = {
+const entityMap: any = {
'&': '&',
'<': '<',
'>': '>',
diff --git a/packages/amis-formula/tsconfig.json b/packages/amis-formula/tsconfig.json
index 8ca302181..be6f2fce7 100644
--- a/packages/amis-formula/tsconfig.json
+++ b/packages/amis-formula/tsconfig.json
@@ -3,12 +3,14 @@
"compilerOptions": {
"rootDir": "./",
"outDir": "./dist",
+ "baseUrl": "./",
"allowSyntheticDefaultImports": true,
"typeRoots": [
"../../types",
"./node_modules/@types",
"../../node_modules/@types"
- ]
+ ],
+ "paths": {}
},
"include": ["src/**/*", "scripts/**/*"],
"references": []
diff --git a/packages/amis-ui/package.json b/packages/amis-ui/package.json
index 916c949a0..a34b8f57f 100644
--- a/packages/amis-ui/package.json
+++ b/packages/amis-ui/package.json
@@ -9,6 +9,7 @@
"build": "npm run clean-dist && NODE_ENV=production rollup -c ",
"dev": "rollup -c -w",
"test": "jest",
+ "gen-doc": "ts-node ./scripts/genDoc.ts",
"update-snapshot": "jest --updateSnapshot",
"coverage": "jest --coverage",
"clean-dist": "rimraf lib/** esm/**"
@@ -93,7 +94,8 @@
"rollup-plugin-scss": "^3.0.0",
"sass": "^1.54.9",
"ts-jest": "^29.0.2",
- "typescript": "^4.6.4"
+ "typescript": "^4.6.4",
+ "ts-node": "^10.4.0"
},
"peerDependencies": {
"amis-core": "*",
diff --git a/packages/amis-ui/scripts/GenDoc.ts b/packages/amis-ui/scripts/GenDoc.ts
new file mode 100644
index 000000000..30d98fe5d
--- /dev/null
+++ b/packages/amis-ui/scripts/GenDoc.ts
@@ -0,0 +1,88 @@
+import path from 'path';
+import fs from 'fs';
+import {promisify} from 'util';
+
+const readdir = promisify(fs.readdir);
+const statPath = promisify(fs.stat);
+
+const DIR = path.join(__dirname, '../scss/helper');
+export async function main() {
+ const files = await getFiles(DIR);
+
+ for (const relativePath of files) {
+ const filepath = path.join(DIR, relativePath);
+ const contents = await readFileAsync(filepath);
+ const markdowns: Array = [];
+
+ contents.replace(
+ /\/\*\!markdown\n([\s\S]+?)\*\//g,
+ (_: string, md: string) => {
+ markdowns.push(md.trim());
+ return _;
+ }
+ );
+
+ if (markdowns.length) {
+ let mdFilePath = filepath.replace(/\.scss$/, '.md');
+ await writeFileAsync(mdFilePath, markdowns.join('\n'));
+ console.log(`write ${mdFilePath}`);
+ }
+ }
+
+ console.log('Done');
+}
+
+async function getFiles(
+ dir: string,
+ prefix: string = '',
+ ret: Array = []
+) {
+ const files = await readdir(dir);
+
+ for (let i = 0, len = files.length; i < len; i++) {
+ const name = files[i];
+ const filepath = path.join(dir, name);
+ const stat = await statPath(filepath);
+
+ if (stat.isDirectory()) {
+ await getFiles(filepath, prefix ? path.join(prefix, name) : name, ret);
+ } else {
+ ret.push(prefix ? path.join(prefix, name) : name);
+ }
+ }
+
+ return ret;
+}
+
+function readFileAsync(filename: string): Promise {
+ return new Promise((resolve, reject) => {
+ fs.readFile(filename, 'utf8', (err, data) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(data);
+ }
+ });
+ });
+}
+
+function writeFileAsync(filename: string, content: string): Promise {
+ return new Promise((resolve, reject) => {
+ fs.writeFile(
+ filename,
+ content,
+ {
+ encoding: 'utf8'
+ },
+ err => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve();
+ }
+ }
+ );
+ });
+}
+
+main().catch(e => console.error(e));
diff --git a/packages/amis-ui/scss/helper/background/_background-color.md b/packages/amis-ui/scss/helper/background/_background-color.md
new file mode 100644
index 000000000..8e1d53841
--- /dev/null
+++ b/packages/amis-ui/scss/helper/background/_background-color.md
@@ -0,0 +1,131 @@
+---
+title: 背景色
+---
+
+| Class | Properties | Demo |
+| ----------- | ------------------------ | -------- |
+| bg-none | background: none !important | |
+| bg-transparent | background: transparent |
|
+| bg-current | background: currentColor |
|
+| bg-black | background: #000 |
|
+| bg-white | background: #fff |
|
+| bg-primary | background: #007bff |
|
+| bg-secondary | background: #6c757d |
|
+| bg-success | background: #28a745 |
|
+| bg-info | background: #007bff |
|
+| bg-warning | background: #28a745 |
|
+| bg-danger | background: #dc3545 |
|
+| bg-light | background: #f8f9fa |
|
+| bg-dark | background: #343a40 |
|
+| bg-gray-transparent | background: transparent |
|
+| bg-gray-current | background: currentColor |
|
+| bg-gray-50 | background: #f9fafb |
|
+| bg-gray-100 | background: #f3f4f6 |
|
+| bg-gray-200 | background: #e5e7eb |
|
+| bg-gray-300 | background: #d1d5db |
|
+| bg-gray-400 | background: #9ca3af |
|
+| bg-gray-500 | background: #6b7280 |
|
+| bg-gray-600 | background: #4b5563 |
|
+| bg-gray-700 | background: #374151 |
|
+| bg-gray-800 | background: #1f2937 |
|
+| bg-gray-900 | background: #111827 |
|
+| bg-red-transparent | background: transparent |
|
+| bg-red-current | background: currentColor |
|
+| bg-red-50 | background: #fef2f2 |
|
+| bg-red-100 | background: #fee2e2 |
|
+| bg-red-200 | background: #fecaca |
|
+| bg-red-300 | background: #fca5a5 |
|
+| bg-red-400 | background: #f87171 |
|
+| bg-red-500 | background: #ef4444 |
|
+| bg-red-600 | background: #dc2626 |
|
+| bg-red-700 | background: #b91c1c |
|
+| bg-red-800 | background: #991b1b |
|
+| bg-red-900 | background: #7f1d1d |
|
+| bg-yellow-transparent | background: transparent |
|
+| bg-yellow-current | background: currentColor |
|
+| bg-yellow-50 | background: #fffbeb |
|
+| bg-yellow-100 | background: #fef3c7 |
|
+| bg-yellow-200 | background: #fde68a |
|
+| bg-yellow-300 | background: #fcd34d |
|
+| bg-yellow-400 | background: #fbbf24 |
|
+| bg-yellow-500 | background: #f59e0b |
|
+| bg-yellow-600 | background: #d97706 |
|
+| bg-yellow-700 | background: #b45309 |
|
+| bg-yellow-800 | background: #92400e |
|
+| bg-yellow-900 | background: #78350f |
|
+| bg-green-transparent | background: transparent |
|
+| bg-green-current | background: currentColor |
|
+| bg-green-50 | background: #ecfdf5 |
|
+| bg-green-100 | background: #d1fae5 |
|
+| bg-green-200 | background: #a7f3d0 |
|
+| bg-green-300 | background: #6ee7b7 |
|
+| bg-green-400 | background: #34d399 |
|
+| bg-green-500 | background: #10b981 |
|
+| bg-green-600 | background: #059669 |
|
+| bg-green-700 | background: #047857 |
|
+| bg-green-800 | background: #065f46 |
|
+| bg-green-900 | background: #064e3b |
|
+| bg-blue-transparent | background: transparent |
|
+| bg-blue-current | background: currentColor |
|
+| bg-blue-50 | background: #eff6ff |
|
+| bg-blue-100 | background: #dbeafe |
|
+| bg-blue-200 | background: #bfdbfe |
|
+| bg-blue-300 | background: #93c5fd |
|
+| bg-blue-400 | background: #60a5fa |
|
+| bg-blue-500 | background: #3b82f6 |
|
+| bg-blue-600 | background: #2563eb |
|
+| bg-blue-700 | background: #1d4ed8 |
|
+| bg-blue-800 | background: #1e40af |
|
+| bg-blue-900 | background: #1e3a8a |
|
+| bg-cyan-transparent | background: transparent |
|
+| bg-cyan-current | background: currentColor |
|
+| bg-cyan-50 | background: #ecfeff |
|
+| bg-cyan-100 | background: #cffafe |
|
+| bg-cyan-200 | background: #a5f3fc |
|
+| bg-cyan-300 | background: #67e8f9 |
|
+| bg-cyan-400 | background: #22d3ee |
|
+| bg-cyan-500 | background: #06b6d4 |
|
+| bg-cyan-600 | background: #0891b2 |
|
+| bg-cyan-700 | background: #0e7490 |
|
+| bg-cyan-800 | background: #155e75 |
|
+| bg-cyan-900 | background: #164e63 |
|
+| bg-indigo-transparent | background: transparent |
|
+| bg-indigo-current | background: currentColor |
|
+| bg-indigo-50 | background: #eef2ff |
|
+| bg-indigo-100 | background: #e0e7ff |
|
+| bg-indigo-200 | background: #c7d2fe |
|
+| bg-indigo-300 | background: #a5b4fc |
|
+| bg-indigo-400 | background: #818cf8 |
|
+| bg-indigo-500 | background: #6366f1 |
|
+| bg-indigo-600 | background: #4f46e5 |
|
+| bg-indigo-700 | background: #4338ca |
|
+| bg-indigo-800 | background: #3730a3 |
|
+| bg-indigo-900 | background: #312e81 |
|
+| bg-purple-transparent | background: transparent |
|
+| bg-purple-current | background: currentColor |
|
+| bg-purple-50 | background: #f5f3ff |
|
+| bg-purple-100 | background: #ede9fe |
|
+| bg-purple-200 | background: #ddd6fe |
|
+| bg-purple-300 | background: #c4b5fd |
|
+| bg-purple-400 | background: #a78bfa |
|
+| bg-purple-500 | background: #8b5cf6 |
|
+| bg-purple-600 | background: #7c3aed |
|
+| bg-purple-700 | background: #6d28d9 |
|
+| bg-purple-800 | background: #5b21b6 |
|
+| bg-purple-900 | background: #4c1d95 |
|
+| bg-pink-transparent | background: transparent |
|
+| bg-pink-current | background: currentColor |
|
+| bg-pink-50 | background: #fdf2f8 |
|
+| bg-pink-100 | background: #fce7f3 |
|
+| bg-pink-200 | background: #fbcfe8 |
|
+| bg-pink-300 | background: #f9a8d4 |
|
+| bg-pink-400 | background: #f472b6 |
|
+| bg-pink-500 | background: #ec4899 |
|
+| bg-pink-600 | background: #db2777 |
|
+| bg-pink-700 | background: #be185d |
|
+| bg-pink-800 | background: #9d174d |
|
+| bg-pink-900 | background: #831843 |
|
+
+还有 hover、active、focus、disabled 扩展,比如 `hover:bg-black`
+
+参考: [tailwindcss](https://tailwindcss.com/docs/background-color)
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/border/_border-color.md b/packages/amis-ui/scss/helper/border/_border-color.md
new file mode 100644
index 000000000..0a5c1df81
--- /dev/null
+++ b/packages/amis-ui/scss/helper/border/_border-color.md
@@ -0,0 +1,109 @@
+---
+title: 边框颜色
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| border-black | border-color: #000 |
+| border-white | border-color: #fff |
+| border-primary | border-color: #007bff |
+| border-secondary | border-color: #6c757d |
+| border-success | border-color: #28a745 |
+| border-info | border-color: #007bff |
+| border-warning | border-color: #28a745 |
+| border-danger | border-color: #dc3545 |
+| border-light | border-color: #f8f9fa |
+| border-dark | border-color: #343a40 |
+| border-gray-50 | border-color: #f9fafb |
+| border-gray-100 | border-color: #f3f4f6 |
+| border-gray-200 | border-color: #e5e7eb |
+| border-gray-300 | border-color: #d1d5db |
+| border-gray-400 | border-color: #9ca3af |
+| border-gray-500 | border-color: #6b7280 |
+| border-gray-600 | border-color: #4b5563 |
+| border-gray-700 | border-color: #374151 |
+| border-gray-800 | border-color: #1f2937 |
+| border-gray-900 | border-color: #111827 |
+| border-red-50 | border-color: #fef2f2 |
+| border-red-100 | border-color: #fee2e2 |
+| border-red-200 | border-color: #fecaca |
+| border-red-300 | border-color: #fca5a5 |
+| border-red-400 | border-color: #f87171 |
+| border-red-500 | border-color: #ef4444 |
+| border-red-600 | border-color: #dc2626 |
+| border-red-700 | border-color: #b91c1c |
+| border-red-800 | border-color: #991b1b |
+| border-red-900 | border-color: #7f1d1d |
+| border-yellow-50 | border-color: #fffbeb |
+| border-yellow-100 | border-color: #fef3c7 |
+| border-yellow-200 | border-color: #fde68a |
+| border-yellow-300 | border-color: #fcd34d |
+| border-yellow-400 | border-color: #fbbf24 |
+| border-yellow-500 | border-color: #f59e0b |
+| border-yellow-600 | border-color: #d97706 |
+| border-yellow-700 | border-color: #b45309 |
+| border-yellow-800 | border-color: #92400e |
+| border-yellow-900 | border-color: #78350f |
+| border-green-50 | border-color: #ecfdf5 |
+| border-green-100 | border-color: #d1fae5 |
+| border-green-200 | border-color: #a7f3d0 |
+| border-green-300 | border-color: #6ee7b7 |
+| border-green-400 | border-color: #34d399 |
+| border-green-500 | border-color: #10b981 |
+| border-green-600 | border-color: #059669 |
+| border-green-700 | border-color: #047857 |
+| border-green-800 | border-color: #065f46 |
+| border-green-900 | border-color: #064e3b |
+| border-blue-50 | border-color: #eff6ff |
+| border-blue-100 | border-color: #dbeafe |
+| border-blue-200 | border-color: #bfdbfe |
+| border-blue-300 | border-color: #93c5fd |
+| border-blue-400 | border-color: #60a5fa |
+| border-blue-500 | border-color: #3b82f6 |
+| border-blue-600 | border-color: #2563eb |
+| border-blue-700 | border-color: #1d4ed8 |
+| border-blue-800 | border-color: #1e40af |
+| border-blue-900 | border-color: #1e3a8a |
+| border-cyan-50 | border-color: #ecfeff |
+| border-cyan-100 | border-color: #cffafe |
+| border-cyan-200 | border-color: #a5f3fc |
+| border-cyan-300 | border-color: #67e8f9 |
+| border-cyan-400 | border-color: #22d3ee |
+| border-cyan-500 | border-color: #06b6d4 |
+| border-cyan-600 | border-color: #0891b2 |
+| border-cyan-700 | border-color: #0e7490 |
+| border-cyan-800 | border-color: #155e75 |
+| border-cyan-900 | border-color: #164e63 |
+| border-indigo-50 | border-color: #eef2ff |
+| border-indigo-100 | border-color: #e0e7ff |
+| border-indigo-200 | border-color: #c7d2fe |
+| border-indigo-300 | border-color: #a5b4fc |
+| border-indigo-400 | border-color: #818cf8 |
+| border-indigo-500 | border-color: #6366f1 |
+| border-indigo-600 | border-color: #4f46e5 |
+| border-indigo-700 | border-color: #4338ca |
+| border-indigo-800 | border-color: #3730a3 |
+| border-indigo-900 | border-color: #312e81 |
+| border-purple-50 | border-color: #f5f3ff |
+| border-purple-100 | border-color: #ede9fe |
+| border-purple-200 | border-color: #ddd6fe |
+| border-purple-300 | border-color: #c4b5fd |
+| border-purple-400 | border-color: #a78bfa |
+| border-purple-500 | border-color: #8b5cf6 |
+| border-purple-600 | border-color: #7c3aed |
+| border-purple-700 | border-color: #6d28d9 |
+| border-purple-800 | border-color: #5b21b6 |
+| border-purple-900 | border-color: #4c1d95 |
+| border-pink-50 | border-color: #fdf2f8 |
+| border-pink-100 | border-color: #fce7f3 |
+| border-pink-200 | border-color: #fbcfe8 |
+| border-pink-300 | border-color: #f9a8d4 |
+| border-pink-400 | border-color: #f472b6 |
+| border-pink-500 | border-color: #ec4899 |
+| border-pink-600 | border-color: #db2777 |
+| border-pink-700 | border-color: #be185d |
+| border-pink-800 | border-color: #9d174d |
+| border-pink-900 | border-color: #831843 |
+
+
+还有 hover、active、focus、disabled 扩展,比如 `hover:border-black`
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/border/_border-radius.md b/packages/amis-ui/scss/helper/border/_border-radius.md
new file mode 100644
index 000000000..dc1c7c309
--- /dev/null
+++ b/packages/amis-ui/scss/helper/border/_border-radius.md
@@ -0,0 +1,86 @@
+---
+title: 边框圆角
+---
+| Class | Properties |
+| ----------- | ------------------------ |
+| rounded-none | border-radius: 0px |
+| rounded-sm | border-radius: 0.125rem |
+| rounded | border-radius: 0.25rem |
+| rounded-md | border-radius: 0.375rem |
+| rounded-lg | border-radius: 0.5rem |
+| rounded-xl | border-radius: 0.75rem |
+| rounded-2xl | border-radius: 1rem |
+| rounded-3xl | border-radius: 1.5rem |
+| rounded-full | border-radius: 9999px |
+| rounded-t-none | border-top-left-radius: 0px; border-top-right-radius: 0px |
+| rounded-t-sm | border-top-left-radius: 0.125rem; border-top-right-radius: 0.125rem |
+| rounded-t | border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem |
+| rounded-t-md | border-top-left-radius: 0.375rem; border-top-right-radius: 0.375rem |
+| rounded-t-lg | border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem |
+| rounded-t-xl | border-top-left-radius: 0.75rem; border-top-right-radius: 0.75rem |
+| rounded-t-2xl | border-top-left-radius: 1rem; border-top-right-radius: 1rem |
+| rounded-t-3xl | border-top-left-radius: 1.5rem; border-top-right-radius: 1.5rem |
+| rounded-t-full | border-top-left-radius: 9999px; border-top-right-radius: 9999px |
+| rounded-r-none | border-top-right-radius: 0px; border-bottom-right-radius: 0px |
+| rounded-r-sm | border-top-right-radius: 0.125rem; border-bottom-right-radius: 0.125rem |
+| rounded-r | border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem |
+| rounded-r-md | border-top-right-radius: 0.375rem; border-bottom-right-radius: 0.375rem |
+| rounded-r-lg | border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem |
+| rounded-r-xl | border-top-right-radius: 0.75rem; border-bottom-right-radius: 0.75rem |
+| rounded-r-2xl | border-top-right-radius: 1rem; border-bottom-right-radius: 1rem |
+| rounded-r-3xl | border-top-right-radius: 1.5rem; border-bottom-right-radius: 1.5rem |
+| rounded-r-full | border-top-right-radius: 9999px; border-bottom-right-radius: 9999px |
+| rounded-b-none | border-bottom-right-radius: 0px; border-bottom-left-radius: 0px |
+| rounded-b-sm | border-bottom-right-radius: 0.125rem; border-bottom-left-radius: 0.125rem |
+| rounded-b | border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem |
+| rounded-b-md | border-bottom-right-radius: 0.375rem; border-bottom-left-radius: 0.375rem |
+| rounded-b-lg | border-bottom-right-radius: 0.5rem; border-bottom-left-radius: 0.5rem |
+| rounded-b-xl | border-bottom-right-radius: 0.75rem; border-bottom-left-radius: 0.75rem |
+| rounded-b-2xl | border-bottom-right-radius: 1rem; border-bottom-left-radius: 1rem |
+| rounded-b-3xl | border-bottom-right-radius: 1.5rem; border-bottom-left-radius: 1.5rem |
+| rounded-b-full | border-bottom-right-radius: 9999px; border-bottom-left-radius: 9999px |
+| rounded-l-none | border-top-left-radius: 0px; border-bottom-left-radius: 0px |
+| rounded-l-sm | border-top-left-radius: 0.125rem; border-bottom-left-radius: 0.125rem |
+| rounded-l | border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem |
+| rounded-l-md | border-top-left-radius: 0.375rem; border-bottom-left-radius: 0.375rem |
+| rounded-l-lg | border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem |
+| rounded-l-xl | border-top-left-radius: 0.75rem; border-bottom-left-radius: 0.75rem |
+| rounded-l-2xl | border-top-left-radius: 1rem; border-bottom-left-radius: 1rem |
+| rounded-l-3xl | border-top-left-radius: 1.5rem; border-bottom-left-radius: 1.5rem |
+| rounded-l-full | border-top-left-radius: 9999px; border-bottom-left-radius: 9999px |
+| rounded-tl-none | border-top-left-radius: 0px |
+| rounded-tr-none | border-top-right-radius: 0px |
+| rounded-br-none | border-bottom-right-radius: 0px |
+| rounded-bl-none | border-bottom-left-radius: 0px |
+| rounded-tl-sm | border-top-left-radius: 0.125rem |
+| rounded-tr-sm | border-top-right-radius: 0.125rem |
+| rounded-br-sm | border-bottom-right-radius: 0.125rem |
+| rounded-bl-sm | border-bottom-left-radius: 0.125rem |
+| rounded-tl | border-top-left-radius: 0.25rem |
+| rounded-tr | border-top-right-radius: 0.25rem |
+| rounded-br | border-bottom-right-radius: 0.25rem |
+| rounded-bl | border-bottom-left-radius: 0.25rem |
+| rounded-tl-md | border-top-left-radius: 0.375rem |
+| rounded-tr-md | border-top-right-radius: 0.375rem |
+| rounded-br-md | border-bottom-right-radius: 0.375rem |
+| rounded-bl-md | border-bottom-left-radius: 0.375rem |
+| rounded-tl-lg | border-top-left-radius: 0.5rem |
+| rounded-tr-lg | border-top-right-radius: 0.5rem |
+| rounded-br-lg | border-bottom-right-radius: 0.5rem |
+| rounded-bl-lg | border-bottom-left-radius: 0.5rem |
+| rounded-tl-xl | border-top-left-radius: 0.75rem |
+| rounded-tr-xl | border-top-right-radius: 0.75rem |
+| rounded-br-xl | border-bottom-right-radius: 0.75rem |
+| rounded-bl-xl | border-bottom-left-radius: 0.75rem |
+| rounded-tl-2xl | border-top-left-radius: 1rem |
+| rounded-tr-2xl | border-top-right-radius: 1rem |
+| rounded-br-2xl | border-bottom-right-radius: 1rem |
+| rounded-bl-2xl | border-bottom-left-radius: 1rem |
+| rounded-tl-3xl | border-top-left-radius: 1.5rem |
+| rounded-tr-3xl | border-top-right-radius: 1.5rem |
+| rounded-br-3xl | border-bottom-right-radius: 1.5rem |
+| rounded-bl-3xl | border-bottom-left-radius: 1.5rem |
+| rounded-tl-full | border-top-left-radius: 9999px |
+| rounded-tr-full | border-top-right-radius: 9999px |
+| rounded-br-full | border-bottom-right-radius: 9999px |
+| rounded-bl-full | border-bottom-left-radius: 9999px |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/border/_border-style.md b/packages/amis-ui/scss/helper/border/_border-style.md
new file mode 100644
index 000000000..bb1cb22f4
--- /dev/null
+++ b/packages/amis-ui/scss/helper/border/_border-style.md
@@ -0,0 +1,11 @@
+---
+title: 边框样式
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| border-solid | border-style: solid |
+| border-dashed | border-style: dashed |
+| border-dotted | border-style: dotted |
+| border-double | border-style: double |
+| border-none | border-style: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/border/_border-width.md b/packages/amis-ui/scss/helper/border/_border-width.md
new file mode 100644
index 000000000..8b05b3e3c
--- /dev/null
+++ b/packages/amis-ui/scss/helper/border/_border-width.md
@@ -0,0 +1,31 @@
+---
+title: 边框宽度
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| border | border-width: 1px |
+| border-0 | border-width: 0px |
+| border-2 | border-width: 2px |
+| border-4 | border-width: 4px |
+| border-8 | border-width: 8px |
+| border-t | border-top-width: 1px |
+| border-r | border-right-width: 1px |
+| border-b | border-bottom-width: 1px |
+| border-l | border-left-width: 1px |
+| border-t-0 | border-top-width: 0px |
+| border-r-0 | border-right-width: 0px |
+| border-b-0 | border-bottom-width: 0px |
+| border-l-0 | border-left-width: 0px |
+| border-t-2 | border-top-width: 2px |
+| border-r-2 | border-right-width: 2px |
+| border-b-2 | border-bottom-width: 2px |
+| border-l-2 | border-left-width: 2px |
+| border-t-4 | border-top-width: 4px |
+| border-r-4 | border-right-width: 4px |
+| border-b-4 | border-bottom-width: 4px |
+| border-l-4 | border-left-width: 4px |
+| border-t-8 | border-top-width: 8px |
+| border-r-8 | border-right-width: 8px |
+| border-b-8 | border-bottom-width: 8px |
+| border-l-8 | border-left-width: 8px |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_align-content.md b/packages/amis-ui/scss/helper/box-alignment/_align-content.md
new file mode 100644
index 000000000..98b517797
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_align-content.md
@@ -0,0 +1,12 @@
+---
+title: Align Content
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| content-center | align-content: center |
+| content-start | align-content: flex-start |
+| content-end | align-content: flex-end |
+| content-between | align-content: space-between |
+| content-around | align-content: space-around |
+| content-evenly | align-content: space-evenly |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_align-items.md b/packages/amis-ui/scss/helper/box-alignment/_align-items.md
new file mode 100644
index 000000000..70978052a
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_align-items.md
@@ -0,0 +1,11 @@
+---
+title: Align Items
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| items-start | align-items: flex-start |
+| items-end | align-items: flex-end |
+| items-center | align-items: center |
+| items-baseline | align-items: baseline |
+| items-stretch | align-items: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_align-self.md b/packages/amis-ui/scss/helper/box-alignment/_align-self.md
new file mode 100644
index 000000000..937382641
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_align-self.md
@@ -0,0 +1,11 @@
+---
+title: Align Self
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| self-auto | align-self: auto |
+| self-start | align-self: flex-start |
+| self-end | align-self: flex-end |
+| self-center | align-self: center |
+| self-stretch | align-self: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_justify-content.md b/packages/amis-ui/scss/helper/box-alignment/_justify-content.md
new file mode 100644
index 000000000..87e553498
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_justify-content.md
@@ -0,0 +1,12 @@
+---
+title: Jsutify Content
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| justify-start | justify-content: flex-start |
+| justify-end | justify-content: flex-end |
+| justify-center | justify-content: center |
+| justify-between | justify-content: space-between |
+| justify-around | justify-content: space-around |
+| justify-evenly | justify-content: space-evenly |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_justify-items.md b/packages/amis-ui/scss/helper/box-alignment/_justify-items.md
new file mode 100644
index 000000000..9e288967c
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_justify-items.md
@@ -0,0 +1,11 @@
+---
+title: Justify Items
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| justify-items-auto | justify-items: auto |
+| justify-items-start | justify-items: start |
+| justify-items-end | justify-items: end |
+| justify-items-center | justify-items: center |
+| justify-items-stretch | justify-items: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_justify-self.md b/packages/amis-ui/scss/helper/box-alignment/_justify-self.md
new file mode 100644
index 000000000..733a38b85
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_justify-self.md
@@ -0,0 +1,11 @@
+---
+title: Jsutify Self
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| justify-self-auto | justify-self: auto |
+| justify-self-start | justify-self: start |
+| justify-self-end | justify-self: end |
+| justify-self-center | justify-self: center |
+| justify-self-stretch | justify-self: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_place-content.md b/packages/amis-ui/scss/helper/box-alignment/_place-content.md
new file mode 100644
index 000000000..d91811c10
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_place-content.md
@@ -0,0 +1,13 @@
+---
+title: Place Content
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| place-content-center | place-content: center |
+| place-content-start | place-content: start |
+| place-content-end | place-content: end |
+| place-content-between | place-content: space-between |
+| place-content-around | place-content: space-around |
+| place-content-evenly | place-content: space-evenly |
+| place-content-stretch | place-content: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_place-items.md b/packages/amis-ui/scss/helper/box-alignment/_place-items.md
new file mode 100644
index 000000000..6ca5d6b29
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_place-items.md
@@ -0,0 +1,11 @@
+---
+title: Place Items
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| place-items-auto | place-items: auto |
+| place-items-start | place-items: start |
+| place-items-end | place-items: end |
+| place-items-center | place-items: center |
+| place-items-stretch | place-items: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/box-alignment/_place-self.md b/packages/amis-ui/scss/helper/box-alignment/_place-self.md
new file mode 100644
index 000000000..b080c81c1
--- /dev/null
+++ b/packages/amis-ui/scss/helper/box-alignment/_place-self.md
@@ -0,0 +1,11 @@
+---
+title: Place Self
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| place-self-auto | place-self: auto |
+| place-self-start | place-self: start |
+| place-self-end | place-self: end |
+| place-self-center | place-self: center |
+| place-self-stretch | place-self: stretch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/effect/_box-shadow.md b/packages/amis-ui/scss/helper/effect/_box-shadow.md
new file mode 100644
index 000000000..11d409092
--- /dev/null
+++ b/packages/amis-ui/scss/helper/effect/_box-shadow.md
@@ -0,0 +1,16 @@
+---
+title: Box Shadow
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| shadow-sm | box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) |
+| shadow | box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) |
+| shadow-md | box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) |
+| shadow-lg | box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) |
+| shadow-xl | box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1) , 0 10px 10px -5px rgba(0, 0, 0, 0.04) |
+| shadow-2xl | box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) |
+| shadow-inner | box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) |
+| shadow-none | box-shadow: none |
+
+还有 hover、active、focus 扩展,比如 `hover:shadow-sm`
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/effect/_opacity.md b/packages/amis-ui/scss/helper/effect/_opacity.md
new file mode 100644
index 000000000..4c38f4f73
--- /dev/null
+++ b/packages/amis-ui/scss/helper/effect/_opacity.md
@@ -0,0 +1,21 @@
+---
+title: Opacity
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| opacity-0 | opacity: 0 |
+| opacity-5 | opacity: 0.05 |
+| opacity-10 | opacity: 0.1 |
+| opacity-20 | opacity: 0.2 |
+| opacity-25 | opacity: 0.25 |
+| opacity-30 | opacity: 0.3 |
+| opacity-40 | opacity: 0.4 |
+| opacity-50 | opacity: 0.5 |
+| opacity-60 | opacity: 0.6 |
+| opacity-70 | opacity: 0.7 |
+| opacity-75 | opacity: 0.75 |
+| opacity-80 | opacity: 0.8 |
+| opacity-90 | opacity: 0.9 |
+| opacity-95 | opacity: 0.95 |
+| opacity-100 | opacity: 1 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_direction.md b/packages/amis-ui/scss/helper/flex/_direction.md
new file mode 100644
index 000000000..0986dda66
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_direction.md
@@ -0,0 +1,10 @@
+---
+title: Flex Direction
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| flex-row | flex-direction: row |
+| flex-row-reverse | flex-direction: row-reverse |
+| flex-col | flex-direction: column |
+| flex-col-reverse | flex-direction: column-reverse |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_flex.md b/packages/amis-ui/scss/helper/flex/_flex.md
new file mode 100644
index 000000000..53f1a48b6
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_flex.md
@@ -0,0 +1,10 @@
+---
+title: Flex
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| flex-1 | flex: 1 1 0% |
+| flex-auto | flex: 1 1 auto |
+| flex-initial | flex: 0 1 auto |
+| flex-none | flex: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_grow.md b/packages/amis-ui/scss/helper/flex/_grow.md
new file mode 100644
index 000000000..d9d688549
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_grow.md
@@ -0,0 +1,8 @@
+---
+title: Flex Grow
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| flex-grow-0 | flex-grow: 0 |
+| flex-grow | flex-grow: 1 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_order.md b/packages/amis-ui/scss/helper/flex/_order.md
new file mode 100644
index 000000000..4b4639455
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_order.md
@@ -0,0 +1,20 @@
+---
+title: Flex Order
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| order-1 | order: 1 |
+| order-2 | order: 2 |
+| order-3 | order: 3 |
+| order-4 | order: 4 |
+| order-5 | order: 5 |
+| order-6 | order: 6 |
+| order-7 | order: 7 |
+| order-8 | order: 8 |
+| order-9 | order: 9 |
+| order-10 | order: 10 |
+| order-11 | order: 11 |
+| order-12 | order: 12 |
+| order-first | order: -9999 |
+| order-last | order: 9999 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_shrink.md b/packages/amis-ui/scss/helper/flex/_shrink.md
new file mode 100644
index 000000000..58563a01b
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_shrink.md
@@ -0,0 +1,8 @@
+---
+title: Flex Shrink
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| flex-shrink-0 | flex-shrink: 0 |
+| flex-shrink | flex-shrink: 1 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/flex/_wrap.md b/packages/amis-ui/scss/helper/flex/_wrap.md
new file mode 100644
index 000000000..cdb6199e6
--- /dev/null
+++ b/packages/amis-ui/scss/helper/flex/_wrap.md
@@ -0,0 +1,9 @@
+---
+title: Flex Wrap
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| flex-wrap | flex-wrap: wrap |
+| flex-wrap-reverse | flex-wrap: wrap-reverse |
+| flex-nowrap | flex-wrap: nowrap |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_auto-columns.md b/packages/amis-ui/scss/helper/grid/_auto-columns.md
new file mode 100644
index 000000000..1c620a7cd
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_auto-columns.md
@@ -0,0 +1,10 @@
+---
+title: Grid Auto Columns
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| auto-cols-auto | grid-auto-columns: auto |
+| auto-cols-min | grid-auto-columns: min-content |
+| auto-cols-max | grid-auto-columns: max-content |
+| auto-cols-fr | grid-auto-columns: minmax(0, 1fr) |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_auto-flow.md b/packages/amis-ui/scss/helper/grid/_auto-flow.md
new file mode 100644
index 000000000..f881d55b7
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_auto-flow.md
@@ -0,0 +1,10 @@
+---
+title: Grid Auto Flow
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| grid-flow-row | grid-auto-flow: row |
+| grid-flow-col | grid-auto-flow: column |
+| grid-flow-row-dense | grid-auto-flow: row dense |
+| grid-flow-col-dense | grid-auto-flow: column dense |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_auto-rows.md b/packages/amis-ui/scss/helper/grid/_auto-rows.md
new file mode 100644
index 000000000..5a3e905f7
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_auto-rows.md
@@ -0,0 +1,10 @@
+---
+title: Grid Auto Flow
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| auto-rows-auto | grid-auto-rows: auto |
+| auto-rows-min | grid-auto-rows: min-content |
+| auto-rows-max | grid-auto-rows: max-content |
+| auto-rows-fr | grid-auto-rows: minmax(0, 1fr) |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_column-start-end.md b/packages/amis-ui/scss/helper/grid/_column-start-end.md
new file mode 100644
index 000000000..8ebd91ef3
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_column-start-end.md
@@ -0,0 +1,48 @@
+---
+title: Grid Row Start / End
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| col-auto | grid-column: auto |
+| col-span-1 | grid-column: span 1/span 1 |
+| col-span-2 | grid-column: span 2/span 2 |
+| col-span-3 | grid-column: span 3/span 3 |
+| col-span-4 | grid-column: span 4/span 4 |
+| col-span-5 | grid-column: span 5/span 5 |
+| col-span-6 | grid-column: span 6/span 6 |
+| col-span-7 | grid-column: span 7/span 7 |
+| col-span-8 | grid-column: span 8/span 8 |
+| col-span-9 | grid-column: span 9/span 9 |
+| col-span-10 | grid-column: span 10/span 10 |
+| col-span-11 | grid-column: span 11/span 1 |
+| col-span-12 | grid-column: span 12/span 12 |
+| col-span-full | grid-column: 1/-1 |
+| col-start-1 | grid-column-start: 1 |
+| col-start-2 | grid-column-start: 2 |
+| col-start-3 | grid-column-start: 3 |
+| col-start-4 | grid-column-start: 4 |
+| col-start-5 | grid-column-start: 5 |
+| col-start-6 | grid-column-start: 6 |
+| col-start-7 | grid-column-start: 7 |
+| col-start-8 | grid-column-start: 8 |
+| col-start-9 | grid-column-start: 9 |
+| col-start-10 | grid-column-start: 10 |
+| col-start-11 | grid-column-start: 11 |
+| col-start-12 | grid-column-start: 12 |
+| col-start-13 | grid-column-start: 13 |
+| col-start-auto | grid-column-start: auto |
+| col-end-1 | grid-column-end: 1 |
+| col-end-2 | grid-column-end: 2 |
+| col-end-3 | grid-column-end: 3 |
+| col-end-4 | grid-column-end: 4 |
+| col-end-5 | grid-column-end: 5 |
+| col-end-6 | grid-column-end: 6 |
+| col-end-7 | grid-column-end: 7 |
+| col-end-8 | grid-column-end: 8 |
+| col-end-9 | grid-column-end: 9 |
+| col-end-10 | grid-column-end: 10 |
+| col-end-11 | grid-column-end: 11 |
+| col-end-12 | grid-column-end: 12 |
+| col-end-13 | grid-column-end: 13 |
+| col-end-auto | grid-column-end: auto |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_columns.md b/packages/amis-ui/scss/helper/grid/_columns.md
new file mode 100644
index 000000000..8c39a6cba
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_columns.md
@@ -0,0 +1,19 @@
+---
+title: Grid Template Columns
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| grid-cols-1 | grid-template-columns: repeat(1, minmax(0, 1fr)) |
+| grid-cols-2 | grid-template-columns: repeat(2, minmax(0, 1fr)) |
+| grid-cols-3 | grid-template-columns: repeat(3, minmax(0, 1fr)) |
+| grid-cols-4 | grid-template-columns: repeat(4, minmax(0, 1fr)) |
+| grid-cols-5 | grid-template-columns: repeat(5, minmax(0, 1fr)) |
+| grid-cols-6 | grid-template-columns: repeat(6, minmax(0, 1fr)) |
+| grid-cols-7 | grid-template-columns: repeat(6, minmax(0, 1fr)) |
+| grid-cols-8 | grid-template-columns: repeat(8, minmax(0, 1fr)) |
+| grid-cols-9 | grid-template-columns: repeat(9, minmax(0, 1fr)) |
+| grid-cols-10 | grid-template-columns: repeat(10, minmax(0, 1fr)) |
+| grid-cols-11 | grid-template-columns: repeat(11, minmax(0, 1fr)) |
+| grid-cols-12 | grid-template-columns: repeat(12, minmax(0, 1fr)) |
+| grid-cols-none | grid-template-columns: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_gap.md b/packages/amis-ui/scss/helper/grid/_gap.md
new file mode 100644
index 000000000..6b487795b
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_gap.md
@@ -0,0 +1,117 @@
+---
+title: Gap
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| gap-px | gap: 0.0625rem |
+| gap-x-px | column-gap: 0.0625rem |
+| gap-y-px | row-gap: 0.0625rem |
+| gap-0 | gap: 0 |
+| gap-x-0 | column-gap: 0 |
+| gap-y-0 | row-gap: 0 |
+| gap-none | gap: 0 |
+| gap-x-none | column-gap: 0 |
+| gap-y-none | row-gap: 0 |
+| gap-0\.5 | gap: 0.125rem |
+| gap-x-0\.5 | column-gap: 0.125rem |
+| gap-y-0\.5 | row-gap: 0.125rem |
+| gap-1 | gap: 0.25rem |
+| gap-x-1 | column-gap: 0.25rem |
+| gap-y-1 | row-gap: 0.25rem |
+| gap-1\.5 | gap: 0.375rem |
+| gap-x-1\.5 | column-gap: 0.375rem |
+| gap-y-1\.5 | row-gap: 0.375rem |
+| gap-2 | gap: 0.5rem |
+| gap-x-2 | column-gap: 0.5rem |
+| gap-y-2 | row-gap: 0.5rem |
+| gap-2\.5 | gap: 0.625rem |
+| gap-x-2\.5 | column-gap: 0.625rem |
+| gap-y-2\.5 | row-gap: 0.625rem |
+| gap-3 | gap: 0.75rem |
+| gap-x-3 | column-gap: 0.75rem |
+| gap-y-3 | row-gap: 0.75rem |
+| gap-3\.5 | gap: 0.875rem |
+| gap-x-3\.5 | column-gap: 0.875rem |
+| gap-y-3\.5 | row-gap: 0.875rem |
+| gap-4 | gap: 1rem |
+| gap-x-4 | column-gap: 1rem |
+| gap-y-4 | row-gap: 1rem |
+| gap-5 | gap: 1.25rem |
+| gap-x-5 | column-gap: 1.25rem |
+| gap-y-5 | row-gap: 1.25rem |
+| gap-6 | gap: 1.5rem |
+| gap-x-6 | column-gap: 1.5rem |
+| gap-y-6 | row-gap: 1.5rem |
+| gap-7 | gap: 1.75rem |
+| gap-x-7 | column-gap: 1.75rem |
+| gap-y-7 | row-gap: 1.75rem |
+| gap-8 | gap: 2rem |
+| gap-x-8 | column-gap: 2rem |
+| gap-y-8 | row-gap: 2rem |
+| gap-9 | gap: 2.25rem |
+| gap-x-9 | column-gap: 2.25rem |
+| gap-y-9 | row-gap: 2.25rem |
+| gap-10 | gap: 2.5rem |
+| gap-x-10 | column-gap: 2.5rem |
+| gap-y-10 | row-gap: 2.5rem |
+| gap-11 | gap: 2.75rem |
+| gap-x-11 | column-gap: 2.75rem |
+| gap-y-11 | row-gap: 2.75rem |
+| gap-12 | gap: 3rem |
+| gap-x-12 | column-gap: 3rem |
+| gap-y-12 | row-gap: 3rem |
+| gap-14 | gap: 3.5rem |
+| gap-x-14 | column-gap: 3.5rem |
+| gap-y-14 | row-gap: 3.5rem |
+| gap-16 | gap: 4rem |
+| gap-x-16 | column-gap: 4rem |
+| gap-y-16 | row-gap: 4rem |
+| gap-18 | gap: 4.5rem |
+| gap-x-18 | column-gap: 4.5rem |
+| gap-y-18 | row-gap: 4.5rem |
+| gap-20 | gap: 5rem |
+| gap-x-20 | column-gap: 5rem |
+| gap-y-20 | row-gap: 5rem |
+| gap-24 | gap: 6rem |
+| gap-x-24 | column-gap: 6rem |
+| gap-y-24 | row-gap: 6rem |
+| gap-28 | gap: 7rem |
+| gap-x-28 | column-gap: 7rem |
+| gap-y-28 | row-gap: 7rem |
+| gap-32 | gap: 8rem |
+| gap-x-32 | column-gap: 8rem |
+| gap-y-32 | row-gap: 8rem |
+| gap-36 | gap: 9rem |
+| gap-x-36 | column-gap: 9rem |
+| gap-y-36 | row-gap: 9rem |
+| gap-40 | gap: 10rem |
+| gap-x-40 | column-gap: 10rem |
+| gap-y-40 | row-gap: 10rem |
+| gap-44 | gap: 11rem |
+| gap-x-44 | column-gap: 11rem |
+| gap-y-44 | row-gap: 11rem |
+| gap-48 | gap: 12rem |
+| gap-x-48 | column-gap: 12rem |
+| gap-y-48 | row-gap: 12rem |
+| gap-52 | gap: 13rem |
+| gap-x-52 | column-gap: 13rem |
+| gap-y-52 | row-gap: 13rem |
+| gap-56 | gap: 14rem |
+| gap-x-56 | column-gap: 14rem |
+| gap-y-56 | row-gap: 14rem |
+| gap-60 | gap: 15rem |
+| gap-x-60 | column-gap: 15rem |
+| gap-y-60 | row-gap: 15rem |
+| gap-64 | gap: 16rem |
+| gap-x-64 | column-gap: 16rem |
+| gap-y-64 | row-gap: 16rem |
+| gap-72 | gap: 18rem |
+| gap-x-72 | column-gap: 18rem |
+| gap-y-72 | row-gap: 18rem |
+| gap-80 | gap: 20rem |
+| gap-x-80 | column-gap: 20rem |
+| gap-y-80 | row-gap: 20rem |
+| gap-96 | gap: 24rem |
+| gap-x-96 | column-gap: 24rem |
+| gap-y-96 | row-gap: 24rem |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_row-start-end.md b/packages/amis-ui/scss/helper/grid/_row-start-end.md
new file mode 100644
index 000000000..712e070fd
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_row-start-end.md
@@ -0,0 +1,48 @@
+---
+title: Grid Row Start / End
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| row-auto | grid-row: auto |
+| row-span-1 | grid-row: span 1/span 1 |
+| row-span-2 | grid-row: span 2/span 2 |
+| row-span-3 | grid-row: span 3/span 3 |
+| row-span-4 | grid-row: span 4/span 4 |
+| row-span-5 | grid-row: span 5/span 5 |
+| row-span-6 | grid-row: span 6/span 6 |
+| row-span-7 | grid-row: span 7/span 7 |
+| row-span-8 | grid-row: span 8/span 8 |
+| row-span-9 | grid-row: span 9/span 9 |
+| row-span-10 | grid-row: span 10/span 10 |
+| row-span-11 | grid-row: span 11/span 1 |
+| row-span-12 | grid-row: span 12/span 12 |
+| row-span-full | grid-row: 1/-1 |
+| row-start-1 | grid-row-start: 1 |
+| row-start-2 | grid-row-start: 2 |
+| row-start-3 | grid-row-start: 3 |
+| row-start-4 | grid-row-start: 4 |
+| row-start-5 | grid-row-start: 5 |
+| row-start-6 | grid-row-start: 6 |
+| row-start-7 | grid-row-start: 7 |
+| row-start-8 | grid-row-start: 8 |
+| row-start-9 | grid-row-start: 9 |
+| row-start-10 | grid-row-start: 10 |
+| row-start-11 | grid-row-start: 11 |
+| row-start-12 | grid-row-start: 12 |
+| row-start-13 | grid-row-start: 13 |
+| row-start-auto | grid-row-start: auto |
+| row-end-1 | grid-row-end: 1 |
+| row-end-2 | grid-row-end: 2 |
+| row-end-3 | grid-row-end: 3 |
+| row-end-4 | grid-row-end: 4 |
+| row-end-5 | grid-row-end: 5 |
+| row-end-6 | grid-row-end: 6 |
+| row-end-7 | grid-row-end: 7 |
+| row-end-8 | grid-row-end: 8 |
+| row-end-9 | grid-row-end: 9 |
+| row-end-10 | grid-row-end: 10 |
+| row-end-11 | grid-row-end: 11 |
+| row-end-12 | grid-row-end: 12 |
+| row-end-13 | grid-row-end: 13 |
+| row-end-auto | grid-row-end: auto |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/grid/_rows.md b/packages/amis-ui/scss/helper/grid/_rows.md
new file mode 100644
index 000000000..553d76db2
--- /dev/null
+++ b/packages/amis-ui/scss/helper/grid/_rows.md
@@ -0,0 +1,13 @@
+---
+title: Grid Template Rows
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| grid-rows-1 | grid-template-rows: repeat(1, minmax(0, 1fr)) |
+| grid-rows-2 | grid-template-rows: repeat(2, minmax(0, 1fr)) |
+| grid-rows-3 | grid-template-rows: repeat(3, minmax(0, 1fr)) |
+| grid-rows-4 | grid-template-rows: repeat(4, minmax(0, 1fr)) |
+| grid-rows-5 | grid-template-rows: repeat(5, minmax(0, 1fr)) |
+| grid-rows-6 | grid-template-rows: repeat(6, minmax(0, 1fr)) |
+| grid-rows-none | grid-template-rows: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_box-sizing.md b/packages/amis-ui/scss/helper/layout/_box-sizing.md
new file mode 100644
index 000000000..5f416fb17
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_box-sizing.md
@@ -0,0 +1,35 @@
+---
+title: Box Sizing
+---
+
+Box Sizing 相关样式,主要区别在于设置宽高的时候,是否包含了 padding 和 border 的大小。
+
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| box-border | box-sizing: border-box; |
+| box-content | box-sizing: content-box; |
+
+## 用法
+
+比如这个例子:左侧是 box-border 类型,整体高宽 128px。而右侧只是内容区域是 128px + 边框(2 * 4px) + padding (2 * 16px) 一共160px。
+
+```html
+
+```
+
+## 响应式设计
+
+不支持 [「响应式设计前缀」](../../../docs/style/responsive-design.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_clear.md b/packages/amis-ui/scss/helper/layout/_clear.md
new file mode 100644
index 000000000..ba0d06fbf
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_clear.md
@@ -0,0 +1,27 @@
+---
+title: Clear
+---
+
+清除浮动相关样式。
+
+| Class | Properties |
+| ----------- | ------------- |
+| clear-right | clear: right; |
+| clear-left | clear: left; |
+| clear-none | clear: none; |
+| clear-both | clear: both; |
+
+## 用法
+
+请前往以下链接查看属性含义。
+
+https://www.w3school.com.cn/cssref/pr_class_clear.asp
+
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_display.md b/packages/amis-ui/scss/helper/layout/_display.md
new file mode 100644
index 000000000..6c6b95298
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_display.md
@@ -0,0 +1,41 @@
+---
+title: Display
+---
+
+布局相关样式。
+
+
+| Class | Properties |
+| ------------------ | ---------------------------- |
+| block | display: block; |
+| inline-block | display: inline-block; |
+| inline | display: inline; |
+| flex | display: flex; |
+| inline-flex | display: inline-flex; |
+| table | display: table; |
+| table-cell | display: table-cell; |
+| table-column | display: table-column; |
+| table-column-group | display: table-column-group; |
+| table-footer-group | display: table-footer-group; |
+| table-header-group | display: table-header-group; |
+| table-row-group | display: table-row-group; |
+| table-row | display: table-row; |
+| flow-root | display: flow-root; |
+| grid | display: grid; |
+| inline-grid | display: inline-grid; |
+| contents | display: contents; |
+| hidden | display: none; |
+
+## 用法
+css 相关的知识点就不介绍了,请参考:
+
+https://www.w3school.com.cn/cssref/pr_class_display.asp
+https://tailwindcss.com/docs/display
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_float.md b/packages/amis-ui/scss/helper/layout/_float.md
new file mode 100644
index 000000000..f0c33839e
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_float.md
@@ -0,0 +1,47 @@
+---
+title: Floats
+---
+
+浮动相关样式。
+
+| Class | Properties |
+| ----------- | ------------- |
+| float-right | float: right; |
+| float-left | float: left; |
+| float-none | float: none; |
+
+## 左浮
+
+```html
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam venenatis et lorem sit amet vehicula. Etiam vel nibh nec nisi euismod mollis ultrices condimentum velit. Proin velit libero, interdum ac rhoncus sit amet, pellentesque ac turpis. Quisque ac luctus turpis, vel efficitur ante. Cras convallis risus vel vehicula dapibus. Donec eget neque fringilla, faucibus mi quis, porttitor magna. Cras pellentesque leo est, et luctus neque rutrum eu. Aliquam consequat velit sed sem posuere, vitae sollicitudin mi consequat. Mauris eget ipsum sed dui rutrum fringilla. Donec varius vehicula magna sit amet auctor. Ut congue vehicula lectus in blandit. Vivamus suscipit eleifend turpis, nec sodales sem vulputate a. Curabitur pulvinar libero viverra, efficitur odio eu, finibus justo. Etiam eu vehicula felis.
+```
+
+## 右浮
+
+```html
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam venenatis et lorem sit amet vehicula. Etiam vel nibh nec nisi euismod mollis ultrices condimentum velit. Proin velit libero, interdum ac rhoncus sit amet, pellentesque ac turpis. Quisque ac luctus turpis, vel efficitur ante. Cras convallis risus vel vehicula dapibus. Donec eget neque fringilla, faucibus mi quis, porttitor magna. Cras pellentesque leo est, et luctus neque rutrum eu. Aliquam consequat velit sed sem posuere, vitae sollicitudin mi consequat. Mauris eget ipsum sed dui rutrum fringilla. Donec varius vehicula magna sit amet auctor. Ut congue vehicula lectus in blandit. Vivamus suscipit eleifend turpis, nec sodales sem vulputate a. Curabitur pulvinar libero viverra, efficitur odio eu, finibus justo. Etiam eu vehicula felis.
+```
+
+## 不浮动
+
+```html
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam venenatis et lorem sit amet vehicula. Etiam vel nibh nec nisi euismod mollis ultrices condimentum velit. Proin velit libero, interdum ac rhoncus sit amet, pellentesque ac turpis. Quisque ac luctus turpis, vel efficitur ante. Cras convallis risus vel vehicula dapibus. Donec eget neque fringilla, faucibus mi quis, porttitor magna. Cras pellentesque leo est, et luctus neque rutrum eu. Aliquam consequat velit sed sem posuere, vitae sollicitudin mi consequat. Mauris eget ipsum sed dui rutrum fringilla. Donec varius vehicula magna sit amet auctor. Ut congue vehicula lectus in blandit. Vivamus suscipit eleifend turpis, nec sodales sem vulputate a. Curabitur pulvinar libero viverra, efficitur odio eu, finibus justo. Etiam eu vehicula felis.
+```
+
+
+
+## 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+```html
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam venenatis et lorem sit amet vehicula. Etiam vel nibh nec nisi euismod mollis ultrices condimentum velit. Proin velit libero, interdum ac rhoncus sit amet, pellentesque ac turpis. Quisque ac luctus turpis, vel efficitur ante. Cras convallis risus vel vehicula dapibus. Donec eget neque fringilla, faucibus mi quis, porttitor magna. Cras pellentesque leo est, et luctus neque rutrum eu. Aliquam consequat velit sed sem posuere, vitae sollicitudin mi consequat. Mauris eget ipsum sed dui rutrum fringilla. Donec varius vehicula magna sit amet auctor. Ut congue vehicula lectus in blandit. Vivamus suscipit eleifend turpis, nec sodales sem vulputate a. Curabitur pulvinar libero viverra, efficitur odio eu, finibus justo. Etiam eu vehicula felis.
+```
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_overflow.md b/packages/amis-ui/scss/helper/layout/_overflow.md
new file mode 100644
index 000000000..27e5c0430
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_overflow.md
@@ -0,0 +1,34 @@
+---
+title: Overflow
+---
+
+内容超出相关样式。
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| overflow-auto | overflow: auto; |
+| overflow-hidden | overflow: hidden; |
+| overflow-visible | overflow: visible; |
+| overflow-scroll | overflow: scroll; |
+| overflow-x-auto | overflow-x: auto; |
+| overflow-y-auto | overflow-y: auto; |
+| overflow-x-hidden | overflow-x: hidden; |
+| overflow-y-hidden | overflow-y: hidden; |
+| overflow-x-visible | overflow-x: visible; |
+| overflow-y-visible | overflow-y: visible; |
+| overflow-x-scroll | overflow-x: scroll; |
+| overflow-y-scroll | overflow-y: scroll; |
+
+## 用法
+
+请前往一下文档查看属性含义。
+
+https://www.w3school.com.cn/cssref/pr_pos_overflow.asp
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_position.md b/packages/amis-ui/scss/helper/layout/_position.md
new file mode 100644
index 000000000..56457df02
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_position.md
@@ -0,0 +1,27 @@
+---
+title: Position
+---
+
+定位相关样式。
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| static | position: static; |
+| fixed | position: fixed; |
+| absolute | position: absolute; |
+| relative | position: relative; |
+| sticky | position: sticky; |
+
+## 用法
+
+请前往一下文档查看属性含义。
+
+https://www.w3school.com.cn/cssref/pr_class_position.asp
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_top-right-bottom-left.md b/packages/amis-ui/scss/helper/layout/_top-right-bottom-left.md
new file mode 100644
index 000000000..413a7cb9a
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_top-right-bottom-left.md
@@ -0,0 +1,150 @@
+---
+title: Top / Right / Bottom / Left
+---
+
+用来控制位置的样式集。
+
+| Class | Properties |
+| ------------ | --------------------------------------------------------------------------------- |
+| inset-0 | top: 0px; right: 0px; bottom: 0px; left: 0px; |
+| -inset-0 | top: 0px; right: 0px; bottom: 0px; left: 0px; |
+| inset-y-0 | top: 0px; bottom: 0px; |
+| inset-x-0 | right: 0px; left: 0px; |
+| -inset-y-0 | top: 0px; bottom: 0px; |
+| -inset-x-0 | right: 0px; left: 0px; |
+| top-0 | top: 0px; |
+| right-0 | right: 0px; |
+| bottom-0 | bottom: 0px; |
+| left-0 | left: 0px; |
+| -top-0 | top: 0px; |
+| -right-0 | right: 0px; |
+| -bottom-0 | bottom: 0px; |
+| -left-0 | left: 0px; |
+| inset-0.5 | top: 0.125rem; right: 0.125rem; bottom: 0.125rem; left: 0.125rem; |
+| -inset-0.5 | top: -0.125rem; right: -0.125rem; bottom: -0.125rem; left: -0.125rem; |
+| inset-y-0.5 | top: 0.125rem; bottom: 0.125rem; |
+| inset-x-0.5 | right: 0.125rem; left: 0.125rem; |
+| -inset-y-0.5 | top: -0.125rem; bottom: -0.125rem; |
+| -inset-x-0.5 | right: -0.125rem; left: -0.125rem; |
+| top-0.5 | top: 0.125rem; |
+| right-0.5 | right: 0.125rem; |
+| bottom-0.5 | bottom: 0.125rem; |
+| left-0.5 | left: 0.125rem; |
+| -top-0.5 | top: -0.125rem; |
+| -right-0.5 | right: -0.125rem; |
+| -bottom-0.5 | bottom: -0.125rem; |
+| -left-0.5 | left: -0.125rem; |
+
+按以下尺寸表依次类推
+
+| 尺寸 | 大小 |
+| ---- | -------------- |
+| 0 | 0 |
+| 0.5 | 0.125rem; |
+| 1 | 0.25rem |
+| 1.5 | 0.375rem |
+| 1.5 | 0.375rem |
+| 2 | 0.5rem |
+| 2.5 | 0.625rem |
+| 3 | 0.75rem |
+| 3.5 | 0.875rem |
+| 4 | 1rem |
+| 5 | 1.25rem |
+| 6 | 1.5rem |
+| 7 | 1.75rem |
+| 8 | 2rem |
+| 9 | 2.25rem |
+| 10 | 2.5rem |
+| 11 | 2.75rem |
+| 12 | 3rem |
+| 14 | 3.5rem |
+| 16 | 4rem |
+| 20 | 5rem |
+| 24 | 6rem |
+| 28 | 7rem |
+| 32 | 8rem |
+| 36 | 9rem |
+| 40 | 10rem |
+| 44 | 11rem |
+| 48 | 12rem |
+| 52 | 13rem |
+| 56 | 14rem |
+| 60 | 15rem |
+| 64 | 16rem |
+| 68 | 17rem |
+| 72 | 18rem |
+| 76 | 19rem |
+| 80 | 20rem |
+| 96 | 24rem |
+| auto | auto |
+| 1/2 | 50% |
+| 1/3 | 33.333333% |
+| 2/3 | 66.666667% |
+| 1/4 | 25%; |
+| 2/4 | 50%; |
+| 3/4 | 75%; |
+| full | 100%; |
+| px | 0.0625rem(1px) |
+
+## 用法
+
+结合 relative 和 absolute 定位 和位置样式 `{top|right|bottom|left|inset}-xxx`,可以很方便的实现各种组件布局。
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_visibility.md b/packages/amis-ui/scss/helper/layout/_visibility.md
new file mode 100644
index 000000000..e38017504
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_visibility.md
@@ -0,0 +1,21 @@
+---
+title: Visibility
+---
+
+显示与隐藏。
+
+| Class | Properties |
+| --------- | -------------------- |
+| visible | visibility: visible; |
+| invisible | visibility: hidden; |
+
+## 用法
+
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/layout/_z-index.md b/packages/amis-ui/scss/helper/layout/_z-index.md
new file mode 100644
index 000000000..0df0b5eec
--- /dev/null
+++ b/packages/amis-ui/scss/helper/layout/_z-index.md
@@ -0,0 +1,37 @@
+---
+title: Z-Index
+---
+
+Utilities for controlling the stack order of an element.
+
+
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| z-0 | z-index: 0 |
+| z-10 | z-index: 10 |
+| z-20 | z-index: 20 |
+| z-30 | z-index: 30 |
+| z-40 | z-index: 40 |
+| z-50 | z-index: 50 |
+| z-auto | z-index: auto |
+
+## 用法
+
+```html
+
+```
+
+# 响应式设计
+
+支持通过添加设备前缀 `m:` 或者 `pc:` 来分别针对「手机端」或者「pc端」设置样式,更多说明请前往[「响应式设计」](../../../docs/style/responsive-design.md)。
+
+## 状态前缀
+
+不支持[「状态前缀」](../../../docs/style/state.md),有需求请提 [issue](https://github.com/baidu/amis/issues)。
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/sizing/_height.md b/packages/amis-ui/scss/helper/sizing/_height.md
new file mode 100644
index 000000000..04549be46
--- /dev/null
+++ b/packages/amis-ui/scss/helper/sizing/_height.md
@@ -0,0 +1,103 @@
+---
+title: Height
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| h-px | height: 0.0625rem |
+| h-0 | height: 0 |
+| h-none | height: 0 |
+| h-0\.5 | height: 0.125rem |
+| h-1 | height: 0.25rem |
+| h-1\.5 | height: 0.375rem |
+| h-2 | height: 0.5rem |
+| h-2\.5 | height: 0.625rem |
+| h-3 | height: 0.75rem |
+| h-3\.5 | height: 0.875rem |
+| h-4 | height: 1rem |
+| h-5 | height: 1.25rem |
+| h-6 | height: 1.5rem |
+| h-7 | height: 1.75rem |
+| h-8 | height: 2rem |
+| h-9 | height: 2.25rem |
+| h-10 | height: 2.5rem |
+| h-11 | height: 2.75rem |
+| h-12 | height: 3rem |
+| h-14 | height: 3.5rem |
+| h-16 | height: 4rem |
+| h-18 | height: 4.5rem |
+| h-20 | height: 5rem |
+| h-24 | height: 6rem |
+| h-28 | height: 7rem |
+| h-32 | height: 8rem |
+| h-36 | height: 9rem |
+| h-40 | height: 10rem |
+| h-44 | height: 11rem |
+| h-48 | height: 12rem |
+| h-52 | height: 13rem |
+| h-56 | height: 14rem |
+| h-60 | height: 15rem |
+| h-64 | height: 16rem |
+| h-72 | height: 18rem |
+| h-80 | height: 20rem |
+| h-96 | height: 24rem |
+| h-auto | height: auto |
+| h-1\/2 | height: 50% |
+| h-1\/3 | height: 33.333333% |
+| h-2\/3 | height: 66.666667% |
+| h-1\/4 | height: 25% |
+| h-2\/4 | height: 50% |
+| h-3\/4 | height: 75% |
+| h-1\/5 | height: 20% |
+| h-2\/5 | height: 40% |
+| h-3\/5 | height: 60% |
+| h-4\/5 | height: 80% |
+| h-1\/6 | height: 16.666667% |
+| h-2\/6 | height: 33.333333% |
+| h-3\/6 | height: 50% |
+| h-4\/6 | height: 66.666667% |
+| h-5\/6 | height: 83.333333% |
+| h-full | height: 100% |
+| h-screen | height: 100vh |
+| min-h-0 | min-height: 0px |
+| min-h-full | min-height: 100% |
+| min-h-screen | min-height: 100vh |
+| max-h-px | max-height: 0.0625rem |
+| max-h-0 | max-height: 0 |
+| max-h-none | max-height: 0 |
+| max-h-0\.5 | max-height: 0.125rem |
+| max-h-1 | max-height: 0.25rem |
+| max-h-1\.5 | max-height: 0.375rem |
+| max-h-2 | max-height: 0.5rem |
+| max-h-2\.5 | max-height: 0.625rem |
+| max-h-3 | max-height: 0.75rem |
+| max-h-3\.5 | max-height: 0.875rem |
+| max-h-4 | max-height: 1rem |
+| max-h-5 | max-height: 1.25rem |
+| max-h-6 | max-height: 1.5rem |
+| max-h-7 | max-height: 1.75rem |
+| max-h-8 | max-height: 2rem |
+| max-h-9 | max-height: 2.25rem |
+| max-h-10 | max-height: 2.5rem |
+| max-h-11 | max-height: 2.75rem |
+| max-h-12 | max-height: 3rem |
+| max-h-14 | max-height: 3.5rem |
+| max-h-16 | max-height: 4rem |
+| max-h-18 | max-height: 4.5rem |
+| max-h-20 | max-height: 5rem |
+| max-h-24 | max-height: 6rem |
+| max-h-28 | max-height: 7rem |
+| max-h-32 | max-height: 8rem |
+| max-h-36 | max-height: 9rem |
+| max-h-40 | max-height: 10rem |
+| max-h-44 | max-height: 11rem |
+| max-h-48 | max-height: 12rem |
+| max-h-52 | max-height: 13rem |
+| max-h-56 | max-height: 14rem |
+| max-h-60 | max-height: 15rem |
+| max-h-64 | max-height: 16rem |
+| max-h-72 | max-height: 18rem |
+| max-h-80 | max-height: 20rem |
+| max-h-96 | max-height: 24rem |
+| max-h-full | max-height: 100% |
+| max-h-screen | max-height: 100vh |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/sizing/_width.md b/packages/amis-ui/scss/helper/sizing/_width.md
new file mode 100644
index 000000000..8b600f997
--- /dev/null
+++ b/packages/amis-ui/scss/helper/sizing/_width.md
@@ -0,0 +1,98 @@
+---
+title: Width
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| w-px | width: 0.0625rem |
+| w-0 | width: 0 |
+| w-none | width: 0 |
+| w-0\.5 | width: 0.125rem |
+| w-1 | width: 0.25rem |
+| w-1\.5 | width: 0.375rem |
+| w-2 | width: 0.5rem |
+| w-2\.5 | width: 0.625rem |
+| w-3 | width: 0.75rem |
+| w-3\.5 | width: 0.875rem |
+| w-4 | width: 1rem |
+| w-5 | width: 1.25rem |
+| w-6 | width: 1.5rem |
+| w-7 | width: 1.75rem |
+| w-8 | width: 2rem |
+| w-9 | width: 2.25rem |
+| w-10 | width: 2.5rem |
+| w-11 | width: 2.75rem |
+| w-12 | width: 3rem |
+| w-14 | width: 3.5rem |
+| w-16 | width: 4rem |
+| w-18 | width: 4.5rem |
+| w-20 | width: 5rem |
+| w-24 | width: 6rem |
+| w-28 | width: 7rem |
+| w-32 | width: 8rem |
+| w-36 | width: 9rem |
+| w-40 | width: 10rem |
+| w-44 | width: 11rem |
+| w-48 | width: 12rem |
+| w-52 | width: 13rem |
+| w-56 | width: 14rem |
+| w-60 | width: 15rem |
+| w-64 | width: 16rem |
+| w-72 | width: 18rem |
+| w-80 | width: 20rem |
+| w-96 | width: 24rem |
+| w-auto | width: auto |
+| w-1x | width: 1em |
+| w-2x | width: 2em |
+| w-3x | width: 3em |
+| w-1\/2 | width: 50% |
+| w-1\/3 | width: 33.333333% |
+| w-2\/3 | width: 66.666667% |
+| w-1\/4 | width: 25% |
+| w-2\/4 | width: 50% |
+| w-3\/4 | width: 75% |
+| w-1\/5 | width: 20% |
+| w-2\/5 | width: 40% |
+| w-3\/5 | width: 60% |
+| w-4\/5 | width: 80% |
+| w-1\/6 | width: 16.666667% |
+| w-2\/6 | width: 33.333333% |
+| w-3\/6 | width: 50% |
+| w-4\/6 | width: 66.666667% |
+| w-5\/6 | width: 83.333333% |
+| w-1\/12 | width: 8.333333% |
+| w-2\/12 | width: 16.666667% |
+| w-3\/12 | width: 25% |
+| w-4\/12 | width: 33.333333% |
+| w-5\/12 | width: 41.666667% |
+| w-6\/12 | width: 50% |
+| w-7\/12 | width: 58.333333% |
+| w-8\/12 | width: 66.666667% |
+| w-9\/12 | width: 75% |
+| w-10\/12 | width: 83.333333% |
+| w-11\/12 | width: 91.666667% |
+| w-full | width: 100% |
+| w-screen | width: 100vw |
+| w-min | width: min-content |
+| w-max | width: max-content |
+| min-w-0 | min-width: 0px |
+| min-w-full | min-width: 100% |
+| min-w-min | min-width: min-content |
+| min-w-max | min-width: max-content |
+| max-w-none | max-width: none |
+| max-w-0 | max-width: 0rem |
+| max-w-xs | max-width: 20rem |
+| max-w-sm | max-width: 24rem |
+| max-w-md | max-width: 28rem |
+| max-w-lg | max-width: 32rem |
+| max-w-xl | max-width: 36rem |
+| max-w-2xl | max-width: 42rem |
+| max-w-3xl | max-width: 48rem |
+| max-w-4xl | max-width: 56rem |
+| max-w-5xl | max-width: 64rem |
+| max-w-6xl | max-width: 72rem |
+| max-w-7xl | max-width: 80rem |
+| max-w-full | max-width: 100% |
+| max-w-min | max-width: min-content |
+| max-w-max | max-width: max-content |
+| max-w-prose | max-width: 65ch |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/spacing/_margin.md b/packages/amis-ui/scss/helper/spacing/_margin.md
new file mode 100644
index 000000000..4e4d6b301
--- /dev/null
+++ b/packages/amis-ui/scss/helper/spacing/_margin.md
@@ -0,0 +1,527 @@
+---
+title: Margin
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| m-px | margin: 0.0625rem |
+| m-0 | margin: 0 |
+| m-none | margin: 0 |
+| m-0\.5 | margin: 0.125rem |
+| m-1 | margin: 0.25rem |
+| m-1\.5 | margin: 0.375rem |
+| m-2 | margin: 0.5rem |
+| m-2\.5 | margin: 0.625rem |
+| m-3 | margin: 0.75rem |
+| m-3\.5 | margin: 0.875rem |
+| m-4 | margin: 1rem |
+| m-5 | margin: 1.25rem |
+| m-6 | margin: 1.5rem |
+| m-7 | margin: 1.75rem |
+| m-8 | margin: 2rem |
+| m-9 | margin: 2.25rem |
+| m-10 | margin: 2.5rem |
+| m-11 | margin: 2.75rem |
+| m-12 | margin: 3rem |
+| m-14 | margin: 3.5rem |
+| m-16 | margin: 4rem |
+| m-18 | margin: 4.5rem |
+| m-20 | margin: 5rem |
+| m-24 | margin: 6rem |
+| m-28 | margin: 7rem |
+| m-32 | margin: 8rem |
+| m-36 | margin: 9rem |
+| m-40 | margin: 10rem |
+| m-44 | margin: 11rem |
+| m-48 | margin: 12rem |
+| m-52 | margin: 13rem |
+| m-56 | margin: 14rem |
+| m-60 | margin: 15rem |
+| m-64 | margin: 16rem |
+| m-72 | margin: 18rem |
+| m-80 | margin: 20rem |
+| m-96 | margin: 24rem |
+| m-auto | margin: auto |
+| -m-px | margin: -0.0625rem |
+| -m-0 | margin: 0 |
+| -m-none | margin: 0 |
+| -m-0\.5 | margin: -0.125rem |
+| -m-1 | margin: -0.25rem |
+| -m-1\.5 | margin: -0.375rem |
+| -m-2 | margin: -0.5rem |
+| -m-2\.5 | margin: -0.625rem |
+| -m-3 | margin: -0.75rem |
+| -m-3\.5 | margin: -0.875rem |
+| -m-4 | margin: -1rem |
+| -m-5 | margin: -1.25rem |
+| -m-6 | margin: -1.5rem |
+| -m-7 | margin: -1.75rem |
+| -m-8 | margin: -2rem |
+| -m-9 | margin: -2.25rem |
+| -m-10 | margin: -2.5rem |
+| -m-11 | margin: -2.75rem |
+| -m-12 | margin: -3rem |
+| -m-14 | margin: -3.5rem |
+| -m-16 | margin: -4rem |
+| -m-18 | margin: -4.5rem |
+| -m-20 | margin: -5rem |
+| -m-24 | margin: -6rem |
+| -m-28 | margin: -7rem |
+| -m-32 | margin: -8rem |
+| -m-36 | margin: -9rem |
+| -m-40 | margin: -10rem |
+| -m-44 | margin: -11rem |
+| -m-48 | margin: -12rem |
+| -m-52 | margin: -13rem |
+| -m-56 | margin: -14rem |
+| -m-60 | margin: -15rem |
+| -m-64 | margin: -16rem |
+| -m-72 | margin: -18rem |
+| -m-80 | margin: -20rem |
+| -m-96 | margin: -24rem |
+| mx-px | margin-left: 0.0625rem; margin-right: 0.0625rem |
+| mx-0 | margin-left: 0; margin-right: 0 |
+| mx-none | margin-left: 0; margin-right: 0 |
+| mx-0\.5 | margin-left: 0.125rem; margin-right: 0.125rem |
+| mx-1 | margin-left: 0.25rem; margin-right: 0.25rem |
+| mx-1\.5 | margin-left: 0.375rem; margin-right: 0.375rem |
+| mx-2 | margin-left: 0.5rem; margin-right: 0.5rem |
+| mx-2\.5 | margin-left: 0.625rem; margin-right: 0.625rem |
+| mx-3 | margin-left: 0.75rem; margin-right: 0.75rem |
+| mx-3\.5 | margin-left: 0.875rem; margin-right: 0.875rem |
+| mx-4 | margin-left: 1rem; margin-right: 1rem |
+| mx-5 | margin-left: 1.25rem; margin-right: 1.25rem |
+| mx-6 | margin-left: 1.5rem; margin-right: 1.5rem |
+| mx-7 | margin-left: 1.75rem; margin-right: 1.75rem |
+| mx-8 | margin-left: 2rem; margin-right: 2rem |
+| mx-9 | margin-left: 2.25rem; margin-right: 2.25rem |
+| mx-10 | margin-left: 2.5rem; margin-right: 2.5rem |
+| mx-11 | margin-left: 2.75rem; margin-right: 2.75rem |
+| mx-12 | margin-left: 3rem; margin-right: 3rem |
+| mx-14 | margin-left: 3.5rem; margin-right: 3.5rem |
+| mx-16 | margin-left: 4rem; margin-right: 4rem |
+| mx-18 | margin-left: 4.5rem; margin-right: 4.5rem |
+| mx-20 | margin-left: 5rem; margin-right: 5rem |
+| mx-24 | margin-left: 6rem; margin-right: 6rem |
+| mx-28 | margin-left: 7rem; margin-right: 7rem |
+| mx-32 | margin-left: 8rem; margin-right: 8rem |
+| mx-36 | margin-left: 9rem; margin-right: 9rem |
+| mx-40 | margin-left: 10rem; margin-right: 10rem |
+| mx-44 | margin-left: 11rem; margin-right: 11rem |
+| mx-48 | margin-left: 12rem; margin-right: 12rem |
+| mx-52 | margin-left: 13rem; margin-right: 13rem |
+| mx-56 | margin-left: 14rem; margin-right: 14rem |
+| mx-60 | margin-left: 15rem; margin-right: 15rem |
+| mx-64 | margin-left: 16rem; margin-right: 16rem |
+| mx-72 | margin-left: 18rem; margin-right: 18rem |
+| mx-80 | margin-left: 20rem; margin-right: 20rem |
+| mx-96 | margin-left: 24rem; margin-right: 24rem |
+| mx-auto | margin-left: auto; margin-right: auto |
+| -mx-px | margin-left: -0.0625rem; margin-right: -0.0625rem |
+| -mx-0 | margin-left: 0; margin-right: 0 |
+| -mx-none | margin-left: 0; margin-right: 0 |
+| -mx-0\.5 | margin-left: -0.125rem; margin-right: -0.125rem |
+| -mx-1 | margin-left: -0.25rem; margin-right: -0.25rem |
+| -mx-1\.5 | margin-left: -0.375rem; margin-right: -0.375rem |
+| -mx-2 | margin-left: -0.5rem; margin-right: -0.5rem |
+| -mx-2\.5 | margin-left: -0.625rem; margin-right: -0.625rem |
+| -mx-3 | margin-left: -0.75rem; margin-right: -0.75rem |
+| -mx-3\.5 | margin-left: -0.875rem; margin-right: -0.875rem |
+| -mx-4 | margin-left: -1rem; margin-right: -1rem |
+| -mx-5 | margin-left: -1.25rem; margin-right: -1.25rem |
+| -mx-6 | margin-left: -1.5rem; margin-right: -1.5rem |
+| -mx-7 | margin-left: -1.75rem; margin-right: -1.75rem |
+| -mx-8 | margin-left: -2rem; margin-right: -2rem |
+| -mx-9 | margin-left: -2.25rem; margin-right: -2.25rem |
+| -mx-10 | margin-left: -2.5rem; margin-right: -2.5rem |
+| -mx-11 | margin-left: -2.75rem; margin-right: -2.75rem |
+| -mx-12 | margin-left: -3rem; margin-right: -3rem |
+| -mx-14 | margin-left: -3.5rem; margin-right: -3.5rem |
+| -mx-16 | margin-left: -4rem; margin-right: -4rem |
+| -mx-18 | margin-left: -4.5rem; margin-right: -4.5rem |
+| -mx-20 | margin-left: -5rem; margin-right: -5rem |
+| -mx-24 | margin-left: -6rem; margin-right: -6rem |
+| -mx-28 | margin-left: -7rem; margin-right: -7rem |
+| -mx-32 | margin-left: -8rem; margin-right: -8rem |
+| -mx-36 | margin-left: -9rem; margin-right: -9rem |
+| -mx-40 | margin-left: -10rem; margin-right: -10rem |
+| -mx-44 | margin-left: -11rem; margin-right: -11rem |
+| -mx-48 | margin-left: -12rem; margin-right: -12rem |
+| -mx-52 | margin-left: -13rem; margin-right: -13rem |
+| -mx-56 | margin-left: -14rem; margin-right: -14rem |
+| -mx-60 | margin-left: -15rem; margin-right: -15rem |
+| -mx-64 | margin-left: -16rem; margin-right: -16rem |
+| -mx-72 | margin-left: -18rem; margin-right: -18rem |
+| -mx-80 | margin-left: -20rem; margin-right: -20rem |
+| -mx-96 | margin-left: -24rem; margin-right: -24rem |
+| my-px | margin-top: 0.0625rem; margin-bottom: 0.0625rem |
+| my-0 | margin-top: 0; margin-bottom: 0 |
+| my-none | margin-top: 0; margin-bottom: 0 |
+| my-0\.5 | margin-top: 0.125rem; margin-bottom: 0.125rem |
+| my-1 | margin-top: 0.25rem; margin-bottom: 0.25rem |
+| my-1\.5 | margin-top: 0.375rem; margin-bottom: 0.375rem |
+| my-2 | margin-top: 0.5rem; margin-bottom: 0.5rem |
+| my-2\.5 | margin-top: 0.625rem; margin-bottom: 0.625rem |
+| my-3 | margin-top: 0.75rem; margin-bottom: 0.75rem |
+| my-3\.5 | margin-top: 0.875rem; margin-bottom: 0.875rem |
+| my-4 | margin-top: 1rem; margin-bottom: 1rem |
+| my-5 | margin-top: 1.25rem; margin-bottom: 1.25rem |
+| my-6 | margin-top: 1.5rem; margin-bottom: 1.5rem |
+| my-7 | margin-top: 1.75rem; margin-bottom: 1.75rem |
+| my-8 | margin-top: 2rem; margin-bottom: 2rem |
+| my-9 | margin-top: 2.25rem; margin-bottom: 2.25rem |
+| my-10 | margin-top: 2.5rem; margin-bottom: 2.5rem |
+| my-11 | margin-top: 2.75rem; margin-bottom: 2.75rem |
+| my-12 | margin-top: 3rem; margin-bottom: 3rem |
+| my-14 | margin-top: 3.5rem; margin-bottom: 3.5rem |
+| my-16 | margin-top: 4rem; margin-bottom: 4rem |
+| my-18 | margin-top: 4.5rem; margin-bottom: 4.5rem |
+| my-20 | margin-top: 5rem; margin-bottom: 5rem |
+| my-24 | margin-top: 6rem; margin-bottom: 6rem |
+| my-28 | margin-top: 7rem; margin-bottom: 7rem |
+| my-32 | margin-top: 8rem; margin-bottom: 8rem |
+| my-36 | margin-top: 9rem; margin-bottom: 9rem |
+| my-40 | margin-top: 10rem; margin-bottom: 10rem |
+| my-44 | margin-top: 11rem; margin-bottom: 11rem |
+| my-48 | margin-top: 12rem; margin-bottom: 12rem |
+| my-52 | margin-top: 13rem; margin-bottom: 13rem |
+| my-56 | margin-top: 14rem; margin-bottom: 14rem |
+| my-60 | margin-top: 15rem; margin-bottom: 15rem |
+| my-64 | margin-top: 16rem; margin-bottom: 16rem |
+| my-72 | margin-top: 18rem; margin-bottom: 18rem |
+| my-80 | margin-top: 20rem; margin-bottom: 20rem |
+| my-96 | margin-top: 24rem; margin-bottom: 24rem |
+| my-auto | margin-top: auto; margin-bottom: auto |
+| -my-px | margin-top: -0.0625rem; margin-bottom: -0.0625rem |
+| -my-0 | margin-top: 0; margin-bottom: 0 |
+| -my-none | margin-top: 0; margin-bottom: 0 |
+| -my-0\.5 | margin-top: -0.125rem; margin-bottom: -0.125rem |
+| -my-1 | margin-top: -0.25rem; margin-bottom: -0.25rem |
+| -my-1\.5 | margin-top: -0.375rem; margin-bottom: -0.375rem |
+| -my-2 | margin-top: -0.5rem; margin-bottom: -0.5rem |
+| -my-2\.5 | margin-top: -0.625rem; margin-bottom: -0.625rem |
+| -my-3 | margin-top: -0.75rem; margin-bottom: -0.75rem |
+| -my-3\.5 | margin-top: -0.875rem; margin-bottom: -0.875rem |
+| -my-4 | margin-top: -1rem; margin-bottom: -1rem |
+| -my-5 | margin-top: -1.25rem; margin-bottom: -1.25rem |
+| -my-6 | margin-top: -1.5rem; margin-bottom: -1.5rem |
+| -my-7 | margin-top: -1.75rem; margin-bottom: -1.75rem |
+| -my-8 | margin-top: -2rem; margin-bottom: -2rem |
+| -my-9 | margin-top: -2.25rem; margin-bottom: -2.25rem |
+| -my-10 | margin-top: -2.5rem; margin-bottom: -2.5rem |
+| -my-11 | margin-top: -2.75rem; margin-bottom: -2.75rem |
+| -my-12 | margin-top: -3rem; margin-bottom: -3rem |
+| -my-14 | margin-top: -3.5rem; margin-bottom: -3.5rem |
+| -my-16 | margin-top: -4rem; margin-bottom: -4rem |
+| -my-18 | margin-top: -4.5rem; margin-bottom: -4.5rem |
+| -my-20 | margin-top: -5rem; margin-bottom: -5rem |
+| -my-24 | margin-top: -6rem; margin-bottom: -6rem |
+| -my-28 | margin-top: -7rem; margin-bottom: -7rem |
+| -my-32 | margin-top: -8rem; margin-bottom: -8rem |
+| -my-36 | margin-top: -9rem; margin-bottom: -9rem |
+| -my-40 | margin-top: -10rem; margin-bottom: -10rem |
+| -my-44 | margin-top: -11rem; margin-bottom: -11rem |
+| -my-48 | margin-top: -12rem; margin-bottom: -12rem |
+| -my-52 | margin-top: -13rem; margin-bottom: -13rem |
+| -my-56 | margin-top: -14rem; margin-bottom: -14rem |
+| -my-60 | margin-top: -15rem; margin-bottom: -15rem |
+| -my-64 | margin-top: -16rem; margin-bottom: -16rem |
+| -my-72 | margin-top: -18rem; margin-bottom: -18rem |
+| -my-80 | margin-top: -20rem; margin-bottom: -20rem |
+| -my-96 | margin-top: -24rem; margin-bottom: -24rem |
+| mt-px | margin-top: 0.0625rem |
+| mt-0 | margin-top: 0 |
+| mt-none | margin-top: 0 |
+| mt-0\.5 | margin-top: 0.125rem |
+| mt-1 | margin-top: 0.25rem |
+| mt-1\.5 | margin-top: 0.375rem |
+| mt-2 | margin-top: 0.5rem |
+| mt-2\.5 | margin-top: 0.625rem |
+| mt-3 | margin-top: 0.75rem |
+| mt-3\.5 | margin-top: 0.875rem |
+| mt-4 | margin-top: 1rem |
+| mt-5 | margin-top: 1.25rem |
+| mt-6 | margin-top: 1.5rem |
+| mt-7 | margin-top: 1.75rem |
+| mt-8 | margin-top: 2rem |
+| mt-9 | margin-top: 2.25rem |
+| mt-10 | margin-top: 2.5rem |
+| mt-11 | margin-top: 2.75rem |
+| mt-12 | margin-top: 3rem |
+| mt-14 | margin-top: 3.5rem |
+| mt-16 | margin-top: 4rem |
+| mt-18 | margin-top: 4.5rem |
+| mt-20 | margin-top: 5rem |
+| mt-24 | margin-top: 6rem |
+| mt-28 | margin-top: 7rem |
+| mt-32 | margin-top: 8rem |
+| mt-36 | margin-top: 9rem |
+| mt-40 | margin-top: 10rem |
+| mt-44 | margin-top: 11rem |
+| mt-48 | margin-top: 12rem |
+| mt-52 | margin-top: 13rem |
+| mt-56 | margin-top: 14rem |
+| mt-60 | margin-top: 15rem |
+| mt-64 | margin-top: 16rem |
+| mt-72 | margin-top: 18rem |
+| mt-80 | margin-top: 20rem |
+| mt-96 | margin-top: 24rem |
+| -mt-px | margin-top: -0.0625rem |
+| -mt-0 | margin-top: 0 |
+| -mt-none | margin-top: 0 |
+| -mt-0\.5 | margin-top: -0.125rem |
+| -mt-1 | margin-top: -0.25rem |
+| -mt-1\.5 | margin-top: -0.375rem |
+| -mt-2 | margin-top: -0.5rem |
+| -mt-2\.5 | margin-top: -0.625rem |
+| -mt-3 | margin-top: -0.75rem |
+| -mt-3\.5 | margin-top: -0.875rem |
+| -mt-4 | margin-top: -1rem |
+| -mt-5 | margin-top: -1.25rem |
+| -mt-6 | margin-top: -1.5rem |
+| -mt-7 | margin-top: -1.75rem |
+| -mt-8 | margin-top: -2rem |
+| -mt-9 | margin-top: -2.25rem |
+| -mt-10 | margin-top: -2.5rem |
+| -mt-11 | margin-top: -2.75rem |
+| -mt-12 | margin-top: -3rem |
+| -mt-14 | margin-top: -3.5rem |
+| -mt-16 | margin-top: -4rem |
+| -mt-18 | margin-top: -4.5rem |
+| -mt-20 | margin-top: -5rem |
+| -mt-24 | margin-top: -6rem |
+| -mt-28 | margin-top: -7rem |
+| -mt-32 | margin-top: -8rem |
+| -mt-36 | margin-top: -9rem |
+| -mt-40 | margin-top: -10rem |
+| -mt-44 | margin-top: -11rem |
+| -mt-48 | margin-top: -12rem |
+| -mt-52 | margin-top: -13rem |
+| -mt-56 | margin-top: -14rem |
+| -mt-60 | margin-top: -15rem |
+| -mt-64 | margin-top: -16rem |
+| -mt-72 | margin-top: -18rem |
+| -mt-80 | margin-top: -20rem |
+| -mt-96 | margin-top: -24rem |
+| mr-px | margin-right: 0.0625rem |
+| mr-0 | margin-right: 0 |
+| mr-none | margin-right: 0 |
+| mr-0\.5 | margin-right: 0.125rem |
+| mr-1 | margin-right: 0.25rem |
+| mr-1\.5 | margin-right: 0.375rem |
+| mr-2 | margin-right: 0.5rem |
+| mr-2\.5 | margin-right: 0.625rem |
+| mr-3 | margin-right: 0.75rem |
+| mr-3\.5 | margin-right: 0.875rem |
+| mr-4 | margin-right: 1rem |
+| mr-5 | margin-right: 1.25rem |
+| mr-6 | margin-right: 1.5rem |
+| mr-7 | margin-right: 1.75rem |
+| mr-8 | margin-right: 2rem |
+| mr-9 | margin-right: 2.25rem |
+| mr-10 | margin-right: 2.5rem |
+| mr-11 | margin-right: 2.75rem |
+| mr-12 | margin-right: 3rem |
+| mr-14 | margin-right: 3.5rem |
+| mr-16 | margin-right: 4rem |
+| mr-18 | margin-right: 4.5rem |
+| mr-20 | margin-right: 5rem |
+| mr-24 | margin-right: 6rem |
+| mr-28 | margin-right: 7rem |
+| mr-32 | margin-right: 8rem |
+| mr-36 | margin-right: 9rem |
+| mr-40 | margin-right: 10rem |
+| mr-44 | margin-right: 11rem |
+| mr-48 | margin-right: 12rem |
+| mr-52 | margin-right: 13rem |
+| mr-56 | margin-right: 14rem |
+| mr-60 | margin-right: 15rem |
+| mr-64 | margin-right: 16rem |
+| mr-72 | margin-right: 18rem |
+| mr-80 | margin-right: 20rem |
+| mr-96 | margin-right: 24rem |
+| -mr-px | margin-right: -0.0625rem |
+| -mr-0 | margin-right: 0 |
+| -mr-none | margin-right: 0 |
+| -mr-0\.5 | margin-right: -0.125rem |
+| -mr-1 | margin-right: -0.25rem |
+| -mr-1\.5 | margin-right: -0.375rem |
+| -mr-2 | margin-right: -0.5rem |
+| -mr-2\.5 | margin-right: -0.625rem |
+| -mr-3 | margin-right: -0.75rem |
+| -mr-3\.5 | margin-right: -0.875rem |
+| -mr-4 | margin-right: -1rem |
+| -mr-5 | margin-right: -1.25rem |
+| -mr-6 | margin-right: -1.5rem |
+| -mr-7 | margin-right: -1.75rem |
+| -mr-8 | margin-right: -2rem |
+| -mr-9 | margin-right: -2.25rem |
+| -mr-10 | margin-right: -2.5rem |
+| -mr-11 | margin-right: -2.75rem |
+| -mr-12 | margin-right: -3rem |
+| -mr-14 | margin-right: -3.5rem |
+| -mr-16 | margin-right: -4rem |
+| -mr-18 | margin-right: -4.5rem |
+| -mr-20 | margin-right: -5rem |
+| -mr-24 | margin-right: -6rem |
+| -mr-28 | margin-right: -7rem |
+| -mr-32 | margin-right: -8rem |
+| -mr-36 | margin-right: -9rem |
+| -mr-40 | margin-right: -10rem |
+| -mr-44 | margin-right: -11rem |
+| -mr-48 | margin-right: -12rem |
+| -mr-52 | margin-right: -13rem |
+| -mr-56 | margin-right: -14rem |
+| -mr-60 | margin-right: -15rem |
+| -mr-64 | margin-right: -16rem |
+| -mr-72 | margin-right: -18rem |
+| -mr-80 | margin-right: -20rem |
+| -mr-96 | margin-right: -24rem |
+| mb-px | margin-bottom: 0.0625rem |
+| mb-0 | margin-bottom: 0 |
+| mb-none | margin-bottom: 0 |
+| mb-0\.5 | margin-bottom: 0.125rem |
+| mb-1 | margin-bottom: 0.25rem |
+| mb-1\.5 | margin-bottom: 0.375rem |
+| mb-2 | margin-bottom: 0.5rem |
+| mb-2\.5 | margin-bottom: 0.625rem |
+| mb-3 | margin-bottom: 0.75rem |
+| mb-3\.5 | margin-bottom: 0.875rem |
+| mb-4 | margin-bottom: 1rem |
+| mb-5 | margin-bottom: 1.25rem |
+| mb-6 | margin-bottom: 1.5rem |
+| mb-7 | margin-bottom: 1.75rem |
+| mb-8 | margin-bottom: 2rem |
+| mb-9 | margin-bottom: 2.25rem |
+| mb-10 | margin-bottom: 2.5rem |
+| mb-11 | margin-bottom: 2.75rem |
+| mb-12 | margin-bottom: 3rem |
+| mb-14 | margin-bottom: 3.5rem |
+| mb-16 | margin-bottom: 4rem |
+| mb-18 | margin-bottom: 4.5rem |
+| mb-20 | margin-bottom: 5rem |
+| mb-24 | margin-bottom: 6rem |
+| mb-28 | margin-bottom: 7rem |
+| mb-32 | margin-bottom: 8rem |
+| mb-36 | margin-bottom: 9rem |
+| mb-40 | margin-bottom: 10rem |
+| mb-44 | margin-bottom: 11rem |
+| mb-48 | margin-bottom: 12rem |
+| mb-52 | margin-bottom: 13rem |
+| mb-56 | margin-bottom: 14rem |
+| mb-60 | margin-bottom: 15rem |
+| mb-64 | margin-bottom: 16rem |
+| mb-72 | margin-bottom: 18rem |
+| mb-80 | margin-bottom: 20rem |
+| mb-96 | margin-bottom: 24rem |
+| -mb-px | margin-bottom: -0.0625rem |
+| -mb-0 | margin-bottom: 0 |
+| -mb-none | margin-bottom: 0 |
+| -mb-0\.5 | margin-bottom: -0.125rem |
+| -mb-1 | margin-bottom: -0.25rem |
+| -mb-1\.5 | margin-bottom: -0.375rem |
+| -mb-2 | margin-bottom: -0.5rem |
+| -mb-2\.5 | margin-bottom: -0.625rem |
+| -mb-3 | margin-bottom: -0.75rem |
+| -mb-3\.5 | margin-bottom: -0.875rem |
+| -mb-4 | margin-bottom: -1rem |
+| -mb-5 | margin-bottom: -1.25rem |
+| -mb-6 | margin-bottom: -1.5rem |
+| -mb-7 | margin-bottom: -1.75rem |
+| -mb-8 | margin-bottom: -2rem |
+| -mb-9 | margin-bottom: -2.25rem |
+| -mb-10 | margin-bottom: -2.5rem |
+| -mb-11 | margin-bottom: -2.75rem |
+| -mb-12 | margin-bottom: -3rem |
+| -mb-14 | margin-bottom: -3.5rem |
+| -mb-16 | margin-bottom: -4rem |
+| -mb-18 | margin-bottom: -4.5rem |
+| -mb-20 | margin-bottom: -5rem |
+| -mb-24 | margin-bottom: -6rem |
+| -mb-28 | margin-bottom: -7rem |
+| -mb-32 | margin-bottom: -8rem |
+| -mb-36 | margin-bottom: -9rem |
+| -mb-40 | margin-bottom: -10rem |
+| -mb-44 | margin-bottom: -11rem |
+| -mb-48 | margin-bottom: -12rem |
+| -mb-52 | margin-bottom: -13rem |
+| -mb-56 | margin-bottom: -14rem |
+| -mb-60 | margin-bottom: -15rem |
+| -mb-64 | margin-bottom: -16rem |
+| -mb-72 | margin-bottom: -18rem |
+| -mb-80 | margin-bottom: -20rem |
+| -mb-96 | margin-bottom: -24rem |
+| ml-px | margin-left: 0.0625rem |
+| ml-0 | margin-left: 0 |
+| ml-none | margin-left: 0 |
+| ml-0\.5 | margin-left: 0.125rem |
+| ml-1 | margin-left: 0.25rem |
+| ml-1\.5 | margin-left: 0.375rem |
+| ml-2 | margin-left: 0.5rem |
+| ml-2\.5 | margin-left: 0.625rem |
+| ml-3 | margin-left: 0.75rem |
+| ml-3\.5 | margin-left: 0.875rem |
+| ml-4 | margin-left: 1rem |
+| ml-5 | margin-left: 1.25rem |
+| ml-6 | margin-left: 1.5rem |
+| ml-7 | margin-left: 1.75rem |
+| ml-8 | margin-left: 2rem |
+| ml-9 | margin-left: 2.25rem |
+| ml-10 | margin-left: 2.5rem |
+| ml-11 | margin-left: 2.75rem |
+| ml-12 | margin-left: 3rem |
+| ml-14 | margin-left: 3.5rem |
+| ml-16 | margin-left: 4rem |
+| ml-18 | margin-left: 4.5rem |
+| ml-20 | margin-left: 5rem |
+| ml-24 | margin-left: 6rem |
+| ml-28 | margin-left: 7rem |
+| ml-32 | margin-left: 8rem |
+| ml-36 | margin-left: 9rem |
+| ml-40 | margin-left: 10rem |
+| ml-44 | margin-left: 11rem |
+| ml-48 | margin-left: 12rem |
+| ml-52 | margin-left: 13rem |
+| ml-56 | margin-left: 14rem |
+| ml-60 | margin-left: 15rem |
+| ml-64 | margin-left: 16rem |
+| ml-72 | margin-left: 18rem |
+| ml-80 | margin-left: 20rem |
+| ml-96 | margin-left: 24rem |
+| -ml-px | margin-left: -0.0625rem |
+| -ml-0 | margin-left: 0 |
+| -ml-none | margin-left: 0 |
+| -ml-0\.5 | margin-left: -0.125rem |
+| -ml-1 | margin-left: -0.25rem |
+| -ml-1\.5 | margin-left: -0.375rem |
+| -ml-2 | margin-left: -0.5rem |
+| -ml-2\.5 | margin-left: -0.625rem |
+| -ml-3 | margin-left: -0.75rem |
+| -ml-3\.5 | margin-left: -0.875rem |
+| -ml-4 | margin-left: -1rem |
+| -ml-5 | margin-left: -1.25rem |
+| -ml-6 | margin-left: -1.5rem |
+| -ml-7 | margin-left: -1.75rem |
+| -ml-8 | margin-left: -2rem |
+| -ml-9 | margin-left: -2.25rem |
+| -ml-10 | margin-left: -2.5rem |
+| -ml-11 | margin-left: -2.75rem |
+| -ml-12 | margin-left: -3rem |
+| -ml-14 | margin-left: -3.5rem |
+| -ml-16 | margin-left: -4rem |
+| -ml-18 | margin-left: -4.5rem |
+| -ml-20 | margin-left: -5rem |
+| -ml-24 | margin-left: -6rem |
+| -ml-28 | margin-left: -7rem |
+| -ml-32 | margin-left: -8rem |
+| -ml-36 | margin-left: -9rem |
+| -ml-40 | margin-left: -10rem |
+| -ml-44 | margin-left: -11rem |
+| -ml-48 | margin-left: -12rem |
+| -ml-52 | margin-left: -13rem |
+| -ml-56 | margin-left: -14rem |
+| -ml-60 | margin-left: -15rem |
+| -ml-64 | margin-left: -16rem |
+| -ml-72 | margin-left: -18rem |
+| -ml-80 | margin-left: -20rem |
+| -ml-96 | margin-left: -24rem |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/spacing/_padding.md b/packages/amis-ui/scss/helper/spacing/_padding.md
new file mode 100644
index 000000000..0f41331ba
--- /dev/null
+++ b/packages/amis-ui/scss/helper/spacing/_padding.md
@@ -0,0 +1,265 @@
+---
+title: Padding
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| p-px | padding: 0.0625rem |
+| p-0 | padding: 0 |
+| p-none | padding: 0 |
+| p-0\.5 | padding: 0.125rem |
+| p-1 | padding: 0.25rem |
+| p-1\.5 | padding: 0.375rem |
+| p-2 | padding: 0.5rem |
+| p-2\.5 | padding: 0.625rem |
+| p-3 | padding: 0.75rem |
+| p-3\.5 | padding: 0.875rem |
+| p-4 | padding: 1rem |
+| p-5 | padding: 1.25rem |
+| p-6 | padding: 1.5rem |
+| p-7 | padding: 1.75rem |
+| p-8 | padding: 2rem |
+| p-9 | padding: 2.25rem |
+| p-10 | padding: 2.5rem |
+| p-11 | padding: 2.75rem |
+| p-12 | padding: 3rem |
+| p-14 | padding: 3.5rem |
+| p-16 | padding: 4rem |
+| p-18 | padding: 4.5rem |
+| p-20 | padding: 5rem |
+| p-24 | padding: 6rem |
+| p-28 | padding: 7rem |
+| p-32 | padding: 8rem |
+| p-36 | padding: 9rem |
+| p-40 | padding: 10rem |
+| p-44 | padding: 11rem |
+| p-48 | padding: 12rem |
+| p-52 | padding: 13rem |
+| p-56 | padding: 14rem |
+| p-60 | padding: 15rem |
+| p-64 | padding: 16rem |
+| p-72 | padding: 18rem |
+| p-80 | padding: 20rem |
+| p-96 | padding: 24rem |
+| px-px | padding-left: 0.0625rem; padding-right: 0.0625rem |
+| px-0 | padding-left: 0; padding-right: 0 |
+| px-none | padding-left: 0; padding-right: 0 |
+| px-0\.5 | padding-left: 0.125rem; padding-right: 0.125rem |
+| px-1 | padding-left: 0.25rem; padding-right: 0.25rem |
+| px-1\.5 | padding-left: 0.375rem; padding-right: 0.375rem |
+| px-2 | padding-left: 0.5rem; padding-right: 0.5rem |
+| px-2\.5 | padding-left: 0.625rem; padding-right: 0.625rem |
+| px-3 | padding-left: 0.75rem; padding-right: 0.75rem |
+| px-3\.5 | padding-left: 0.875rem; padding-right: 0.875rem |
+| px-4 | padding-left: 1rem; padding-right: 1rem |
+| px-5 | padding-left: 1.25rem; padding-right: 1.25rem |
+| px-6 | padding-left: 1.5rem; padding-right: 1.5rem |
+| px-7 | padding-left: 1.75rem; padding-right: 1.75rem |
+| px-8 | padding-left: 2rem; padding-right: 2rem |
+| px-9 | padding-left: 2.25rem; padding-right: 2.25rem |
+| px-10 | padding-left: 2.5rem; padding-right: 2.5rem |
+| px-11 | padding-left: 2.75rem; padding-right: 2.75rem |
+| px-12 | padding-left: 3rem; padding-right: 3rem |
+| px-14 | padding-left: 3.5rem; padding-right: 3.5rem |
+| px-16 | padding-left: 4rem; padding-right: 4rem |
+| px-18 | padding-left: 4.5rem; padding-right: 4.5rem |
+| px-20 | padding-left: 5rem; padding-right: 5rem |
+| px-24 | padding-left: 6rem; padding-right: 6rem |
+| px-28 | padding-left: 7rem; padding-right: 7rem |
+| px-32 | padding-left: 8rem; padding-right: 8rem |
+| px-36 | padding-left: 9rem; padding-right: 9rem |
+| px-40 | padding-left: 10rem; padding-right: 10rem |
+| px-44 | padding-left: 11rem; padding-right: 11rem |
+| px-48 | padding-left: 12rem; padding-right: 12rem |
+| px-52 | padding-left: 13rem; padding-right: 13rem |
+| px-56 | padding-left: 14rem; padding-right: 14rem |
+| px-60 | padding-left: 15rem; padding-right: 15rem |
+| px-64 | padding-left: 16rem; padding-right: 16rem |
+| px-72 | padding-left: 18rem; padding-right: 18rem |
+| px-80 | padding-left: 20rem; padding-right: 20rem |
+| px-96 | padding-left: 24rem; padding-right: 24rem |
+| py-px | padding-top: 0.0625rem; padding-bottom: 0.0625rem |
+| py-0 | padding-top: 0; padding-bottom: 0 |
+| py-none | padding-top: 0; padding-bottom: 0 |
+| py-0\.5 | padding-top: 0.125rem; padding-bottom: 0.125rem |
+| py-1 | padding-top: 0.25rem; padding-bottom: 0.25rem |
+| py-1\.5 | padding-top: 0.375rem; padding-bottom: 0.375rem |
+| py-2 | padding-top: 0.5rem; padding-bottom: 0.5rem |
+| py-2\.5 | padding-top: 0.625rem; padding-bottom: 0.625rem |
+| py-3 | padding-top: 0.75rem; padding-bottom: 0.75rem |
+| py-3\.5 | padding-top: 0.875rem; padding-bottom: 0.875rem |
+| py-4 | padding-top: 1rem; padding-bottom: 1rem |
+| py-5 | padding-top: 1.25rem; padding-bottom: 1.25rem |
+| py-6 | padding-top: 1.5rem; padding-bottom: 1.5rem |
+| py-7 | padding-top: 1.75rem; padding-bottom: 1.75rem |
+| py-8 | padding-top: 2rem; padding-bottom: 2rem |
+| py-9 | padding-top: 2.25rem; padding-bottom: 2.25rem |
+| py-10 | padding-top: 2.5rem; padding-bottom: 2.5rem |
+| py-11 | padding-top: 2.75rem; padding-bottom: 2.75rem |
+| py-12 | padding-top: 3rem; padding-bottom: 3rem |
+| py-14 | padding-top: 3.5rem; padding-bottom: 3.5rem |
+| py-16 | padding-top: 4rem; padding-bottom: 4rem |
+| py-18 | padding-top: 4.5rem; padding-bottom: 4.5rem |
+| py-20 | padding-top: 5rem; padding-bottom: 5rem |
+| py-24 | padding-top: 6rem; padding-bottom: 6rem |
+| py-28 | padding-top: 7rem; padding-bottom: 7rem |
+| py-32 | padding-top: 8rem; padding-bottom: 8rem |
+| py-36 | padding-top: 9rem; padding-bottom: 9rem |
+| py-40 | padding-top: 10rem; padding-bottom: 10rem |
+| py-44 | padding-top: 11rem; padding-bottom: 11rem |
+| py-48 | padding-top: 12rem; padding-bottom: 12rem |
+| py-52 | padding-top: 13rem; padding-bottom: 13rem |
+| py-56 | padding-top: 14rem; padding-bottom: 14rem |
+| py-60 | padding-top: 15rem; padding-bottom: 15rem |
+| py-64 | padding-top: 16rem; padding-bottom: 16rem |
+| py-72 | padding-top: 18rem; padding-bottom: 18rem |
+| py-80 | padding-top: 20rem; padding-bottom: 20rem |
+| py-96 | padding-top: 24rem; padding-bottom: 24rem |
+| pt-px | padding-top: 0.0625rem |
+| pt-0 | padding-top: 0 |
+| pt-none | padding-top: 0 |
+| pt-0\.5 | padding-top: 0.125rem |
+| pt-1 | padding-top: 0.25rem |
+| pt-1\.5 | padding-top: 0.375rem |
+| pt-2 | padding-top: 0.5rem |
+| pt-2\.5 | padding-top: 0.625rem |
+| pt-3 | padding-top: 0.75rem |
+| pt-3\.5 | padding-top: 0.875rem |
+| pt-4 | padding-top: 1rem |
+| pt-5 | padding-top: 1.25rem |
+| pt-6 | padding-top: 1.5rem |
+| pt-7 | padding-top: 1.75rem |
+| pt-8 | padding-top: 2rem |
+| pt-9 | padding-top: 2.25rem |
+| pt-10 | padding-top: 2.5rem |
+| pt-11 | padding-top: 2.75rem |
+| pt-12 | padding-top: 3rem |
+| pt-14 | padding-top: 3.5rem |
+| pt-16 | padding-top: 4rem |
+| pt-18 | padding-top: 4.5rem |
+| pt-20 | padding-top: 5rem |
+| pt-24 | padding-top: 6rem |
+| pt-28 | padding-top: 7rem |
+| pt-32 | padding-top: 8rem |
+| pt-36 | padding-top: 9rem |
+| pt-40 | padding-top: 10rem |
+| pt-44 | padding-top: 11rem |
+| pt-48 | padding-top: 12rem |
+| pt-52 | padding-top: 13rem |
+| pt-56 | padding-top: 14rem |
+| pt-60 | padding-top: 15rem |
+| pt-64 | padding-top: 16rem |
+| pt-72 | padding-top: 18rem |
+| pt-80 | padding-top: 20rem |
+| pt-96 | padding-top: 24rem |
+| pr-px | padding-right: 0.0625rem |
+| pr-0 | padding-right: 0 |
+| pr-none | padding-right: 0 |
+| pr-0\.5 | padding-right: 0.125rem |
+| pr-1 | padding-right: 0.25rem |
+| pr-1\.5 | padding-right: 0.375rem |
+| pr-2 | padding-right: 0.5rem |
+| pr-2\.5 | padding-right: 0.625rem |
+| pr-3 | padding-right: 0.75rem |
+| pr-3\.5 | padding-right: 0.875rem |
+| pr-4 | padding-right: 1rem |
+| pr-5 | padding-right: 1.25rem |
+| pr-6 | padding-right: 1.5rem |
+| pr-7 | padding-right: 1.75rem |
+| pr-8 | padding-right: 2rem |
+| pr-9 | padding-right: 2.25rem |
+| pr-10 | padding-right: 2.5rem |
+| pr-11 | padding-right: 2.75rem |
+| pr-12 | padding-right: 3rem |
+| pr-14 | padding-right: 3.5rem |
+| pr-16 | padding-right: 4rem |
+| pr-18 | padding-right: 4.5rem |
+| pr-20 | padding-right: 5rem |
+| pr-24 | padding-right: 6rem |
+| pr-28 | padding-right: 7rem |
+| pr-32 | padding-right: 8rem |
+| pr-36 | padding-right: 9rem |
+| pr-40 | padding-right: 10rem |
+| pr-44 | padding-right: 11rem |
+| pr-48 | padding-right: 12rem |
+| pr-52 | padding-right: 13rem |
+| pr-56 | padding-right: 14rem |
+| pr-60 | padding-right: 15rem |
+| pr-64 | padding-right: 16rem |
+| pr-72 | padding-right: 18rem |
+| pr-80 | padding-right: 20rem |
+| pr-96 | padding-right: 24rem |
+| pb-px | padding-bottom: 0.0625rem |
+| pb-0 | padding-bottom: 0 |
+| pb-none | padding-bottom: 0 |
+| pb-0\.5 | padding-bottom: 0.125rem |
+| pb-1 | padding-bottom: 0.25rem |
+| pb-1\.5 | padding-bottom: 0.375rem |
+| pb-2 | padding-bottom: 0.5rem |
+| pb-2\.5 | padding-bottom: 0.625rem |
+| pb-3 | padding-bottom: 0.75rem |
+| pb-3\.5 | padding-bottom: 0.875rem |
+| pb-4 | padding-bottom: 1rem |
+| pb-5 | padding-bottom: 1.25rem |
+| pb-6 | padding-bottom: 1.5rem |
+| pb-7 | padding-bottom: 1.75rem |
+| pb-8 | padding-bottom: 2rem |
+| pb-9 | padding-bottom: 2.25rem |
+| pb-10 | padding-bottom: 2.5rem |
+| pb-11 | padding-bottom: 2.75rem |
+| pb-12 | padding-bottom: 3rem |
+| pb-14 | padding-bottom: 3.5rem |
+| pb-16 | padding-bottom: 4rem |
+| pb-18 | padding-bottom: 4.5rem |
+| pb-20 | padding-bottom: 5rem |
+| pb-24 | padding-bottom: 6rem |
+| pb-28 | padding-bottom: 7rem |
+| pb-32 | padding-bottom: 8rem |
+| pb-36 | padding-bottom: 9rem |
+| pb-40 | padding-bottom: 10rem |
+| pb-44 | padding-bottom: 11rem |
+| pb-48 | padding-bottom: 12rem |
+| pb-52 | padding-bottom: 13rem |
+| pb-56 | padding-bottom: 14rem |
+| pb-60 | padding-bottom: 15rem |
+| pb-64 | padding-bottom: 16rem |
+| pb-72 | padding-bottom: 18rem |
+| pb-80 | padding-bottom: 20rem |
+| pb-96 | padding-bottom: 24rem |
+| pl-px | padding-left: 0.0625rem |
+| pl-0 | padding-left: 0 |
+| pl-none | padding-left: 0 |
+| pl-0\.5 | padding-left: 0.125rem |
+| pl-1 | padding-left: 0.25rem |
+| pl-1\.5 | padding-left: 0.375rem |
+| pl-2 | padding-left: 0.5rem |
+| pl-2\.5 | padding-left: 0.625rem |
+| pl-3 | padding-left: 0.75rem |
+| pl-3\.5 | padding-left: 0.875rem |
+| pl-4 | padding-left: 1rem |
+| pl-5 | padding-left: 1.25rem |
+| pl-6 | padding-left: 1.5rem |
+| pl-7 | padding-left: 1.75rem |
+| pl-8 | padding-left: 2rem |
+| pl-9 | padding-left: 2.25rem |
+| pl-10 | padding-left: 2.5rem |
+| pl-11 | padding-left: 2.75rem |
+| pl-12 | padding-left: 3rem |
+| pl-14 | padding-left: 3.5rem |
+| pl-16 | padding-left: 4rem |
+| pl-18 | padding-left: 4.5rem |
+| pl-20 | padding-left: 5rem |
+| pl-24 | padding-left: 6rem |
+| pl-28 | padding-left: 7rem |
+| pl-32 | padding-left: 8rem |
+| pl-36 | padding-left: 9rem |
+| pl-40 | padding-left: 10rem |
+| pl-44 | padding-left: 11rem |
+| pl-48 | padding-left: 12rem |
+| pl-52 | padding-left: 13rem |
+| pl-56 | padding-left: 14rem |
+| pl-60 | padding-left: 15rem |
+| pl-64 | padding-left: 16rem |
+| pl-72 | padding-left: 18rem |
+| pl-80 | padding-left: 20rem |
+| pl-96 | padding-left: 24rem |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/spacing/_space-between.md b/packages/amis-ui/scss/helper/spacing/_space-between.md
new file mode 100644
index 000000000..3a83e91f7
--- /dev/null
+++ b/packages/amis-ui/scss/helper/spacing/_space-between.md
@@ -0,0 +1,155 @@
+---
+title: Space Between
+---
+
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| space-x-px | margin-left: 0.0625rem |
+| space-x-px.space-x-reverse | margin-right: 0.0625rem |
+| space-x-0 | margin-left: 0 |
+| space-x-0.space-x-reverse | margin-right: 0 |
+| space-x-none | margin-left: 0 |
+| space-x-none.space-x-reverse | margin-right: 0 |
+| space-x-0\.5 | margin-left: 0.125rem |
+| space-x-0\.5.space-x-reverse | margin-right: 0.125rem |
+| space-x-1 | margin-left: 0.25rem |
+| space-x-1.space-x-reverse | margin-right: 0.25rem |
+| space-x-1\.5 | margin-left: 0.375rem |
+| space-x-1\.5.space-x-reverse | margin-right: 0.375rem |
+| space-x-2 | margin-left: 0.5rem |
+| space-x-2.space-x-reverse | margin-right: 0.5rem |
+| space-x-2\.5 | margin-left: 0.625rem |
+| space-x-2\.5.space-x-reverse | margin-right: 0.625rem |
+| space-x-3 | margin-left: 0.75rem |
+| space-x-3.space-x-reverse | margin-right: 0.75rem |
+| space-x-3\.5 | margin-left: 0.875rem |
+| space-x-3\.5.space-x-reverse | margin-right: 0.875rem |
+| space-x-4 | margin-left: 1rem |
+| space-x-4.space-x-reverse | margin-right: 1rem |
+| space-x-5 | margin-left: 1.25rem |
+| space-x-5.space-x-reverse | margin-right: 1.25rem |
+| space-x-6 | margin-left: 1.5rem |
+| space-x-6.space-x-reverse | margin-right: 1.5rem |
+| space-x-7 | margin-left: 1.75rem |
+| space-x-7.space-x-reverse | margin-right: 1.75rem |
+| space-x-8 | margin-left: 2rem |
+| space-x-8.space-x-reverse | margin-right: 2rem |
+| space-x-9 | margin-left: 2.25rem |
+| space-x-9.space-x-reverse | margin-right: 2.25rem |
+| space-x-10 | margin-left: 2.5rem |
+| space-x-10.space-x-reverse | margin-right: 2.5rem |
+| space-x-11 | margin-left: 2.75rem |
+| space-x-11.space-x-reverse | margin-right: 2.75rem |
+| space-x-12 | margin-left: 3rem |
+| space-x-12.space-x-reverse | margin-right: 3rem |
+| space-x-14 | margin-left: 3.5rem |
+| space-x-14.space-x-reverse | margin-right: 3.5rem |
+| space-x-16 | margin-left: 4rem |
+| space-x-16.space-x-reverse | margin-right: 4rem |
+| space-x-18 | margin-left: 4.5rem |
+| space-x-18.space-x-reverse | margin-right: 4.5rem |
+| space-x-20 | margin-left: 5rem |
+| space-x-20.space-x-reverse | margin-right: 5rem |
+| space-x-24 | margin-left: 6rem |
+| space-x-24.space-x-reverse | margin-right: 6rem |
+| space-x-28 | margin-left: 7rem |
+| space-x-28.space-x-reverse | margin-right: 7rem |
+| space-x-32 | margin-left: 8rem |
+| space-x-32.space-x-reverse | margin-right: 8rem |
+| space-x-36 | margin-left: 9rem |
+| space-x-36.space-x-reverse | margin-right: 9rem |
+| space-x-40 | margin-left: 10rem |
+| space-x-40.space-x-reverse | margin-right: 10rem |
+| space-x-44 | margin-left: 11rem |
+| space-x-44.space-x-reverse | margin-right: 11rem |
+| space-x-48 | margin-left: 12rem |
+| space-x-48.space-x-reverse | margin-right: 12rem |
+| space-x-52 | margin-left: 13rem |
+| space-x-52.space-x-reverse | margin-right: 13rem |
+| space-x-56 | margin-left: 14rem |
+| space-x-56.space-x-reverse | margin-right: 14rem |
+| space-x-60 | margin-left: 15rem |
+| space-x-60.space-x-reverse | margin-right: 15rem |
+| space-x-64 | margin-left: 16rem |
+| space-x-64.space-x-reverse | margin-right: 16rem |
+| space-x-72 | margin-left: 18rem |
+| space-x-72.space-x-reverse | margin-right: 18rem |
+| space-x-80 | margin-left: 20rem |
+| space-x-80.space-x-reverse | margin-right: 20rem |
+| space-x-96 | margin-left: 24rem |
+| space-x-96.space-x-reverse | margin-right: 24rem |
+| space-y-px | margin-top: 0.0625rem |
+| space-y-px.space-y-reverse | margin-bottom: 0.0625rem |
+| space-y-0 | margin-top: 0 |
+| space-y-0.space-y-reverse | margin-bottom: 0 |
+| space-y-none | margin-top: 0 |
+| space-y-none.space-y-reverse | margin-bottom: 0 |
+| space-y-0\.5 | margin-top: 0.125rem |
+| space-y-0\.5.space-y-reverse | margin-bottom: 0.125rem |
+| space-y-1 | margin-top: 0.25rem |
+| space-y-1.space-y-reverse | margin-bottom: 0.25rem |
+| space-y-1\.5 | margin-top: 0.375rem |
+| space-y-1\.5.space-y-reverse | margin-bottom: 0.375rem |
+| space-y-2 | margin-top: 0.5rem |
+| space-y-2.space-y-reverse | margin-bottom: 0.5rem |
+| space-y-2\.5 | margin-top: 0.625rem |
+| space-y-2\.5.space-y-reverse | margin-bottom: 0.625rem |
+| space-y-3 | margin-top: 0.75rem |
+| space-y-3.space-y-reverse | margin-bottom: 0.75rem |
+| space-y-3\.5 | margin-top: 0.875rem |
+| space-y-3\.5.space-y-reverse | margin-bottom: 0.875rem |
+| space-y-4 | margin-top: 1rem |
+| space-y-4.space-y-reverse | margin-bottom: 1rem |
+| space-y-5 | margin-top: 1.25rem |
+| space-y-5.space-y-reverse | margin-bottom: 1.25rem |
+| space-y-6 | margin-top: 1.5rem |
+| space-y-6.space-y-reverse | margin-bottom: 1.5rem |
+| space-y-7 | margin-top: 1.75rem |
+| space-y-7.space-y-reverse | margin-bottom: 1.75rem |
+| space-y-8 | margin-top: 2rem |
+| space-y-8.space-y-reverse | margin-bottom: 2rem |
+| space-y-9 | margin-top: 2.25rem |
+| space-y-9.space-y-reverse | margin-bottom: 2.25rem |
+| space-y-10 | margin-top: 2.5rem |
+| space-y-10.space-y-reverse | margin-bottom: 2.5rem |
+| space-y-11 | margin-top: 2.75rem |
+| space-y-11.space-y-reverse | margin-bottom: 2.75rem |
+| space-y-12 | margin-top: 3rem |
+| space-y-12.space-y-reverse | margin-bottom: 3rem |
+| space-y-14 | margin-top: 3.5rem |
+| space-y-14.space-y-reverse | margin-bottom: 3.5rem |
+| space-y-16 | margin-top: 4rem |
+| space-y-16.space-y-reverse | margin-bottom: 4rem |
+| space-y-18 | margin-top: 4.5rem |
+| space-y-18.space-y-reverse | margin-bottom: 4.5rem |
+| space-y-20 | margin-top: 5rem |
+| space-y-20.space-y-reverse | margin-bottom: 5rem |
+| space-y-24 | margin-top: 6rem |
+| space-y-24.space-y-reverse | margin-bottom: 6rem |
+| space-y-28 | margin-top: 7rem |
+| space-y-28.space-y-reverse | margin-bottom: 7rem |
+| space-y-32 | margin-top: 8rem |
+| space-y-32.space-y-reverse | margin-bottom: 8rem |
+| space-y-36 | margin-top: 9rem |
+| space-y-36.space-y-reverse | margin-bottom: 9rem |
+| space-y-40 | margin-top: 10rem |
+| space-y-40.space-y-reverse | margin-bottom: 10rem |
+| space-y-44 | margin-top: 11rem |
+| space-y-44.space-y-reverse | margin-bottom: 11rem |
+| space-y-48 | margin-top: 12rem |
+| space-y-48.space-y-reverse | margin-bottom: 12rem |
+| space-y-52 | margin-top: 13rem |
+| space-y-52.space-y-reverse | margin-bottom: 13rem |
+| space-y-56 | margin-top: 14rem |
+| space-y-56.space-y-reverse | margin-bottom: 14rem |
+| space-y-60 | margin-top: 15rem |
+| space-y-60.space-y-reverse | margin-bottom: 15rem |
+| space-y-64 | margin-top: 16rem |
+| space-y-64.space-y-reverse | margin-bottom: 16rem |
+| space-y-72 | margin-top: 18rem |
+| space-y-72.space-y-reverse | margin-bottom: 18rem |
+| space-y-80 | margin-top: 20rem |
+| space-y-80.space-y-reverse | margin-bottom: 20rem |
+| space-y-96 | margin-top: 24rem |
+| space-y-96.space-y-reverse | margin-bottom: 24rem |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_font-family.md b/packages/amis-ui/scss/helper/typography/_font-family.md
new file mode 100644
index 000000000..4b11e0825
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_font-family.md
@@ -0,0 +1,9 @@
+---
+title: Font Family
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| font-sans | ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji' |
+| font-serif | font-family: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif |
+| font-mono | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_font-size.md b/packages/amis-ui/scss/helper/typography/_font-size.md
new file mode 100644
index 000000000..3577e1cf2
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_font-size.md
@@ -0,0 +1,19 @@
+---
+title: Font Size
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| text-xs | font-size: 0.75rem; line-height: 1rem |
+| text-sm | font-size: 0.875rem; line-height: 1.25rem |
+| text-base | font-size: 1rem; line-height: 1.5rem |
+| text-md | font-size: 1.125rem; line-height: 1.75rem |
+| text-lg | font-size: 1.25rem; line-height: 1.75rem |
+| text-xl | font-size: 1.5rem; line-height: 2rem |
+| text-2xl | font-size: 1.875rem; line-height: 2.25rem |
+| text-3xl | font-size: 2.25rem; line-height: 2.5rem |
+| text-4xl | font-size: 3rem; line-height: 1 |
+| text-5xl | font-size: 3.75rem; line-height: 1 |
+| text-6xl | font-size: 4.5rem; line-height: 1 |
+| text-7xl | font-size: 6rem; line-height: 1 |
+| text-8xl | font-size: 8rem; line-height: 1 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_font-style.md b/packages/amis-ui/scss/helper/typography/_font-style.md
new file mode 100644
index 000000000..6e756d0df
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_font-style.md
@@ -0,0 +1,8 @@
+---
+title: Font Style
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| italic | font-style: italic |
+| not-italic | font-style: normal |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_font-weight.md b/packages/amis-ui/scss/helper/typography/_font-weight.md
new file mode 100644
index 000000000..ee5678e5e
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_font-weight.md
@@ -0,0 +1,15 @@
+---
+title: Font Weight
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| font-thin | font-weight: 100 |
+| font-extralight | font-weight: 200 |
+| font-light | font-weight: 300 |
+| font-normal | font-weight: 400 |
+| font-medium | font-weight: 500 |
+| font-semibold | font-weight: 600 |
+| font-bold | font-weight: 700 |
+| font-extrabold | font-weight: 800 |
+| font-black | font-weight: 900 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_letter-spacing.md b/packages/amis-ui/scss/helper/typography/_letter-spacing.md
new file mode 100644
index 000000000..525951aa4
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_letter-spacing.md
@@ -0,0 +1,12 @@
+---
+title: Letter Spacing
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| tracking-tighter | letter-spacing: -0.05em |
+| tracking-tight | letter-spacing: -0.025em |
+| tracking-normal | letter-spacing: 0em |
+| tracking-wide | letter-spacing: 0.025 |
+| tracking-wider | letter-spacing: 0.05em |
+| tracking-widest | letter-spacing: 0.1em |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_line-height.md b/packages/amis-ui/scss/helper/typography/_line-height.md
new file mode 100644
index 000000000..5b0b68c65
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_line-height.md
@@ -0,0 +1,20 @@
+---
+title: Line Height
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| leading-3 | line-height: 0.75rem |
+| leading-4 | line-height: 1rem |
+| leading-5 | line-height: 1.25rem |
+| leading-6 | line-height: 1.5rem |
+| leading-7 | line-height: 1.75rem |
+| leading-8 | line-height: 2rem |
+| leading-9 | line-height: 2.25rem |
+| leading-10 | line-height: 2.5rem |
+| leading-none | line-height: 1 |
+| leading-tight | line-height: 1.25 |
+| leading-snug | line-height: 1.375 |
+| leading-normal | line-height: 1.5 |
+| leading-relaxed | line-height: 1.625 |
+| leading-loose | line-height: 2 |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_list-style-type.md b/packages/amis-ui/scss/helper/typography/_list-style-type.md
new file mode 100644
index 000000000..09f230e3c
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_list-style-type.md
@@ -0,0 +1,11 @@
+---
+title: List Style Type
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| list-none | list-style-type: none |
+| list-disc | list-style-type: disc |
+| list-decimal | list-style-type: decimal |
+| list-inside | list-style-position: inside |
+| list-outside | list-style-position: outside |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_text-align.md b/packages/amis-ui/scss/helper/typography/_text-align.md
new file mode 100644
index 000000000..30e76cfcb
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_text-align.md
@@ -0,0 +1,10 @@
+---
+title: Text Align
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| text-left | text-align: left |
+| text-center | text-align: center |
+| text-right | text-align: right |
+| text-justify | text-align: justify |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_text-color.md b/packages/amis-ui/scss/helper/typography/_text-color.md
new file mode 100644
index 000000000..31cc8fc85
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_text-color.md
@@ -0,0 +1,110 @@
+---
+title: Text Color
+---
+
+| Class | Properties | 示例效果 |
+| ----------- | ------------------------ | ------------------------ |
+| text-transparent | color: transparent | AaBbCcDd |
+| text-current | color: currentColor | AaBbCcDd |
+| text-black | color: #000 | AaBbCcDd |
+| text-white | color: #fff | AaBbCcDd |
+| text-primary | color: #007bff | AaBbCcDd |
+| text-secondary | color: #6c757d | AaBbCcDd |
+| text-success | color: #28a745 | AaBbCcDd |
+| text-info | color: #007bff | AaBbCcDd |
+| text-warning | color: #fad733 | AaBbCcDd |
+| text-danger | color: #dc3545 | AaBbCcDd |
+| text-light | color: #f8f9fa | AaBbCcDd |
+| text-dark | color: #343a40 | AaBbCcDd |
+| text-gray-50 | color: #f9fafb | AaBbCcDd |
+| text-gray-100 | color: #f3f4f6 | AaBbCcDd |
+| text-gray-200 | color: #e5e7eb | AaBbCcDd |
+| text-gray-300 | color: #d1d5db | AaBbCcDd |
+| text-gray-400 | color: #9ca3af | AaBbCcDd |
+| text-gray-500 | color: #6b7280 | AaBbCcDd |
+| text-gray-600 | color: #4b5563 | AaBbCcDd |
+| text-gray-700 | color: #374151 | AaBbCcDd |
+| text-gray-800 | color: #1f2937 | AaBbCcDd |
+| text-gray-900 | color: #111827 | AaBbCcDd |
+| text-red-50 | color: #fef2f2 | AaBbCcDd |
+| text-red-100 | color: #fee2e2 | AaBbCcDd |
+| text-red-200 | color: #fecaca | AaBbCcDd |
+| text-red-300 | color: #fca5a5 | AaBbCcDd |
+| text-red-400 | color: #f87171 | AaBbCcDd |
+| text-red-500 | color: #ef4444 | AaBbCcDd |
+| text-red-600 | color: #dc2626 | AaBbCcDd |
+| text-red-700 | color: #b91c1c | AaBbCcDd |
+| text-red-800 | color: #991b1b | AaBbCcDd |
+| text-red-900 | color: #7f1d1d | AaBbCcDd |
+| text-yellow-50 | color: #fffbeb | AaBbCcDd |
+| text-yellow-100 | color: #fef3c7 | AaBbCcDd |
+| text-yellow-200 | color: #fde68a | AaBbCcDd |
+| text-yellow-300 | color: #fcd34d | AaBbCcDd |
+| text-yellow-400 | color: #fbbf24 | AaBbCcDd |
+| text-yellow-500 | color: #f59e0b | AaBbCcDd |
+| text-yellow-600 | color: #d97706 | AaBbCcDd |
+| text-yellow-700 | color: #b45309 | AaBbCcDd |
+| text-yellow-800 | color: #92400e | AaBbCcDd |
+| text-yellow-900 | color: #78350f | AaBbCcDd |
+| text-green-50 | color: #ecfdf5 | AaBbCcDd |
+| text-green-100 | color: #d1fae5 | AaBbCcDd |
+| text-green-200 | color: #a7f3d0 | AaBbCcDd |
+| text-green-300 | color: #6ee7b7 | AaBbCcDd |
+| text-green-400 | color: #34d399 | AaBbCcDd |
+| text-green-500 | color: #10b981 | AaBbCcDd |
+| text-green-600 | color: #059669 | AaBbCcDd |
+| text-green-700 | color: #047857 | AaBbCcDd |
+| text-green-800 | color: #065f46 | AaBbCcDd |
+| text-green-900 | color: #064e3b | AaBbCcDd |
+| text-blue-50 | color: #eff6ff | AaBbCcDd |
+| text-blue-100 | color: #dbeafe | AaBbCcDd |
+| text-blue-200 | color: #bfdbfe | AaBbCcDd |
+| text-blue-300 | color: #93c5fd | AaBbCcDd |
+| text-blue-400 | color: #60a5fa | AaBbCcDd |
+| text-blue-500 | color: #3b82f6 | AaBbCcDd |
+| text-blue-600 | color: #2563eb | AaBbCcDd |
+| text-blue-700 | color: #1d4ed8 | AaBbCcDd |
+| text-blue-800 | color: #1e40af | AaBbCcDd |
+| text-blue-900 | color: #1e3a8a | AaBbCcDd |
+| text-cyan-50 | color: #ecfeff | AaBbCcDd |
+| text-cyan-100 | color: #cffafe | AaBbCcDd |
+| text-cyan-200 | color: #a5f3fc | AaBbCcDd |
+| text-cyan-300 | color: #67e8f9 | AaBbCcDd |
+| text-cyan-400 | color: #22d3ee | AaBbCcDd |
+| text-cyan-500 | color: #06b6d4 | AaBbCcDd |
+| text-cyan-600 | color: #0891b2 | AaBbCcDd |
+| text-cyan-700 | color: #0e7490 | AaBbCcDd |
+| text-cyan-800 | color: #155e75 | AaBbCcDd |
+| text-cyan-900 | color: #164e63 | AaBbCcDd |
+| text-indigo-50 | color: #eef2ff | AaBbCcDd |
+| text-indigo-100 | color: #e0e7ff | AaBbCcDd |
+| text-indigo-200 | color: #c7d2fe | AaBbCcDd |
+| text-indigo-300 | color: #a5b4fc | AaBbCcDd |
+| text-indigo-400 | color: #818cf8 | AaBbCcDd |
+| text-indigo-500 | color: #6366f1 | AaBbCcDd |
+| text-indigo-600 | color: #4f46e5 | AaBbCcDd |
+| text-indigo-700 | color: #4338ca | AaBbCcDd |
+| text-indigo-800 | color: #3730a3 | AaBbCcDd |
+| text-indigo-900 | color: #312e81 | AaBbCcDd |
+| text-purple-50 | color: #f5f3ff | AaBbCcDd |
+| text-purple-100 | color: #ede9fe | AaBbCcDd |
+| text-purple-200 | color: #ddd6fe | AaBbCcDd |
+| text-purple-300 | color: #c4b5fd | AaBbCcDd |
+| text-purple-400 | color: #a78bfa | AaBbCcDd |
+| text-purple-500 | color: #8b5cf6 | AaBbCcDd |
+| text-purple-600 | color: #7c3aed | AaBbCcDd |
+| text-purple-700 | color: #6d28d9 | AaBbCcDd |
+| text-purple-800 | color: #5b21b6 | AaBbCcDd |
+| text-purple-900 | color: #4c1d95 | AaBbCcDd |
+| text-pink-50 | color: #fdf2f8 | AaBbCcDd |
+| text-pink-100 | color: #fce7f3 | AaBbCcDd |
+| text-pink-200 | color: #fbcfe8 | AaBbCcDd |
+| text-pink-300 | color: #f9a8d4 | AaBbCcDd |
+| text-pink-400 | color: #f472b6 | AaBbCcDd |
+| text-pink-500 | color: #ec4899 | AaBbCcDd |
+| text-pink-600 | color: #db2777 | AaBbCcDd |
+| text-pink-700 | color: #be185d | AaBbCcDd |
+| text-pink-800 | color: #9d174d | AaBbCcDd |
+| text-pink-900 | color: #831843 | AaBbCcDd |
+
+还有 hover、active、focus、disabled 扩展,比如 `hover:text-black`
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_text-decoration.md b/packages/amis-ui/scss/helper/typography/_text-decoration.md
new file mode 100644
index 000000000..bdd194840
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_text-decoration.md
@@ -0,0 +1,9 @@
+---
+title: Text Decoration
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| underline | text-decoration: underline |
+| line-through | text-decoration: line-through |
+| no-underline | text-decoration: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_text-overflow.md b/packages/amis-ui/scss/helper/typography/_text-overflow.md
new file mode 100644
index 000000000..6e2605161
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_text-overflow.md
@@ -0,0 +1,9 @@
+---
+title: Text OverFlow
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| truncate | overflow: hidden; text-overflow: ellipsis; white-space: nowrap |
+| overflow-ellipsis | text-overflow: ellipsis |
+| overflow-clip | text-overflow: clip |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_text-transform.md b/packages/amis-ui/scss/helper/typography/_text-transform.md
new file mode 100644
index 000000000..68bd85662
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_text-transform.md
@@ -0,0 +1,10 @@
+---
+title: Text Transform
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| uppercase | text-transform: uppercase |
+| lowercase | text-transform: lowercase |
+| capitalize | text-transform: capitalize |
+| normal-case | text-transform: none |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_vertical-align.md b/packages/amis-ui/scss/helper/typography/_vertical-align.md
new file mode 100644
index 000000000..13ee9d3b3
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_vertical-align.md
@@ -0,0 +1,12 @@
+---
+title: Vertial Align
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| align-baseline | vertical-align: baseline |
+| align-top | vertical-align: top |
+| align-middle | vertical-align: middle |
+| align-bottom | vertical-align: bottom |
+| align-text-top | vertical-align: text-top |
+| align-text-bottom | vertical-align: text-bottom |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_whitespace.md b/packages/amis-ui/scss/helper/typography/_whitespace.md
new file mode 100644
index 000000000..8992456c9
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_whitespace.md
@@ -0,0 +1,11 @@
+---
+title: Whitespace
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| white-space-normal | align: normal |
+| white-space-nowrap | white-space: nowrap |
+| white-space-pre | white-space: pre |
+| white-space-pre-line | white-space: pre-line |
+| white-space-pre-wrap | white-space: pre-wrap |
\ No newline at end of file
diff --git a/packages/amis-ui/scss/helper/typography/_word-break.md b/packages/amis-ui/scss/helper/typography/_word-break.md
new file mode 100644
index 000000000..f5122eb0d
--- /dev/null
+++ b/packages/amis-ui/scss/helper/typography/_word-break.md
@@ -0,0 +1,9 @@
+---
+title: Word Break
+---
+
+| Class | Properties |
+| ----------- | ------------------------ |
+| break-normal | overflow-wrap: normal; word-break: normal |
+| break-words | overflow-wrap: break-word |
+| break-all | word-break: break-all |
\ No newline at end of file
diff --git a/packages/amis/src/renderers/Icon.tsx b/packages/amis/src/renderers/Icon.tsx
index 56f121f83..67f2394df 100644
--- a/packages/amis/src/renderers/Icon.tsx
+++ b/packages/amis/src/renderers/Icon.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import {Renderer, RendererProps, filter, IconCheckedSchema} from 'amis-core';
import {BaseSchema, SchemaTpl} from '../Schema';
import {BadgeObject, withBadge} from 'amis-ui';
-import {getIcon} from 'amis-ui/lib/components/icons';
+import {getIcon} from 'amis-ui';
import {isObject} from 'lodash';
/**
diff --git a/packages/amis/tsconfig.json b/packages/amis/tsconfig.json
index bcc963e38..6b2dd8b3a 100644
--- a/packages/amis/tsconfig.json
+++ b/packages/amis/tsconfig.json
@@ -3,6 +3,7 @@
"compilerOptions": {
"outDir": "lib",
"rootDir": "./",
+ "experimentalDecorators": true,
"typeRoots": [
"../../types",
"./node_modules/@types",
diff --git a/scripts/fis3plugin.ts b/scripts/fis3plugin.ts
new file mode 100644
index 000000000..c46d66434
--- /dev/null
+++ b/scripts/fis3plugin.ts
@@ -0,0 +1,62 @@
+import MagicString from 'magic-string';
+import {createFilter} from 'rollup-pluginutils';
+import type {Plugin} from 'vite';
+
+export default function fis3replace(
+ options: {
+ include?: any;
+ exclude?: any;
+ sourcemap?: boolean;
+ sourceMap?: boolean;
+ } = {}
+): Plugin {
+ const filter = createFilter(options.include, options.exclude);
+
+ return {
+ name: 'fis3',
+ enforce: 'pre',
+ apply: 'serve',
+
+ transform(code: string, id: string) {
+ if (!filter(id)) return null;
+
+ const magicString = new MagicString(code);
+
+ let hasReplacements = false;
+ let start;
+ let end;
+
+ code = code.replace(
+ /(__uri|__inline)\(\s*('|")(.*?)\2\s*\)/g,
+ (_, directive, quote, target, index) => {
+ hasReplacements = true;
+
+ start = index;
+ end = start + _.length;
+
+ if (directive === '__uri') {
+ let replacement = `new URL(${quote}${target}${quote}, import.meta.url).href`;
+ magicString.overwrite(start, end, replacement);
+ } else if (directive === '__inline') {
+ let varname = target
+ .replace(/[^a-zA-Z0-9]/g, '')
+ .replace(/^\d+/, '');
+
+ magicString.prepend(`import ${varname} from '${target}?inline';\n`);
+ magicString.overwrite(start, end, `${varname}`);
+ }
+
+ return _;
+ }
+ );
+
+ if (!hasReplacements) return null;
+
+ const result: any = {code: magicString.toString()};
+ if (options.sourceMap !== false && options.sourcemap !== false)
+ result.map = magicString.generateMap({hires: true});
+
+ return result;
+ }
+ };
+}
diff --git a/scripts/markdownPlugin.ts b/scripts/markdownPlugin.ts
new file mode 100644
index 000000000..a1f7d6df3
--- /dev/null
+++ b/scripts/markdownPlugin.ts
@@ -0,0 +1,251 @@
+import type {Plugin} from 'vite';
+import * as marked from 'marked';
+import * as prism from 'prismjs';
+import * as yaml from 'js-yaml';
+let loadLanguages = require('prismjs/components/');
+loadLanguages([
+ 'bash',
+ 'javascript',
+ 'java',
+ 'python',
+ 'jsx',
+ 'tsx',
+ 'css',
+ 'markup',
+ 'json'
+]);
+const rYml = /^\s*---([\s\S]*?)---\s/;
+const renderer = new marked.Renderer();
+(marked as any).setOptions({
+ renderer: renderer,
+ gfm: true,
+ tables: true,
+ breaks: false,
+ pedantic: false,
+ smartLists: true,
+ smartypants: false
+});
+
+// Synchronous highlighting with prism.js
+(marked as any).setOptions({
+ highlight: function (code: string, lang: string) {
+ if (lang) {
+ return prism.highlight(code, prism.languages[lang], lang);
+ } else {
+ return code;
+ }
+ }
+});
+
+// renderer.table = function(header, body) {
+// return '\n'
+// + '\n'
+// + header
+// + ' \n'
+// + '\n'
+// + body
+// + ' \n'
+// + '
\n';
+// };
+
+renderer.link = function (href: string, title: string, text: string) {
+ if ((this as any).options.sanitize) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return '';
+ }
+ if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
+ return '';
+ }
+ }
+ if (href && href[0] === '#') {
+ href =
+ '#' +
+ encodeURIComponent(
+ href
+ .substring(1)
+ .toLowerCase()
+ .replace(/[^\u4e00-\u9fa5_a-zA-Z0-9]+/g, '-')
+ );
+ }
+
+ var out = '' + text + ' ';
+ return out;
+};
+
+function markdown2js(content: string, file: string) {
+ var m = rYml.exec(content);
+ var info: any = {};
+ if (m && m[1]) {
+ info = (yaml as any).load(m[1]);
+ content = content.substring(m[0].length);
+ }
+
+ var toc: any = {
+ label: '目录',
+ type: 'toc',
+ children: [],
+ level: 0
+ };
+ var stack = [toc];
+
+ renderer.heading = function (text, level) {
+ var escapedText = encodeURIComponent(
+ text.toLowerCase().replace(/[^\u4e00-\u9fa5_a-zA-Z0-9]+/g, '-')
+ );
+
+ if (level < 5) {
+ var menu = {
+ label: text,
+ fragment: escapedText,
+ fullPath: '#' + escapedText,
+ level: level
+ };
+
+ while (stack.length && stack[0].level >= level) {
+ stack.shift();
+ }
+
+ stack[0].children = stack[0].children || [];
+ stack[0].children.push(menu);
+
+ stack.unshift(menu);
+ }
+
+ var anchor =
+ ' ';
+
+ return '' + anchor + text + ' ';
+
+ // return ' ' +
+ // text + ' ';
+ };
+
+ const placeholder: any = {};
+ let index = 1;
+
+ content = content
+ .replace(/\!\!\!include\s*\(([^\)]+?)\)\!\!\!/g, (_, val) => {
+ // todo
+ // const result = null;
+
+ // if (result) {
+ // // 暂时不支持嵌套 include
+ // return result.file.getContent();
+ // }
+
+ return _;
+ })
+ .replace(
+ /```(schema|html)(?::(.*?))?\n([\s\S]*?)```/g,
+ function (_, lang, attr, code) {
+ const setting: any = {};
+ attr &&
+ attr.split(/\s+/).forEach(function (item: string) {
+ var parts = item.split('=');
+
+ if (parts[1] && /^('|").*\1/.test(parts[1])) {
+ parts[1] = parts[1].substring(1, parts[1].length - 1);
+ }
+
+ setting[parts[0]] = parts[1] ? decodeURIComponent(parts[1]) : '';
+
+ if (parts[0] === 'height') {
+ setting.height = parseInt(setting.height, 10) /*编辑器的高度*/;
+ attr = attr.replace(item, `height="${setting.height}"`);
+ }
+ });
+
+ // placeholder[index] = ``;
+ if (lang === 'html') {
+ if (~code.indexOf('${code}
${prism.highlight(
+ code
+ .replace(/"data:(\w+\/\w+);.*?"/g, '"data:$1; ..."')
+ .replace(/]*)>[\s\S]*?<\/svg>/g, '... ')
+ .replace(/class="([^"]*?)\.\.\.([^"]*?)"/g, 'class="$1..."'),
+ prism.languages[lang],
+ lang
+ )}
`;
+ } else {
+ placeholder[
+ index
+ ] = `
`;
+ }
+
+ return `[[${index++}]]`;
+ }
+ );
+
+ content = (marked as any)
+ .parse(content)
+ .replace(/\[\[(\d+)\]\]<\/p>/g, function (_: string, id: string) {
+ return placeholder[id] || '';
+ });
+
+ // content = global.fis ? fis.compile.partial(content, file, 'html') : content;
+ // + `\n\n
`;
+ info.html =
+ '' +
+ content.replace(
+ /<\!\-\-amis\-preview\-(start|end)\-\-\>/g,
+ function (_, type) {
+ return type === 'start' ? '
' : '';
+ }
+ ) +
+ '
';
+ info.toc = toc;
+
+ return 'export default ' + JSON.stringify(info, null, 2) + ';';
+}
+
+export default function markdownPlugin(options: {} = {}): Plugin {
+ return {
+ name: 'markdown-as-js',
+ enforce: 'pre',
+ apply: 'serve',
+ transform(code: string, id: string) {
+ // if (id.endsWith('.scss') && /\/_[^\/]+\.scss$/.test(id)) {
+ // const markdowns: Array = [];
+
+ // code.replace(
+ // /\/\*\!markdown\n([\s\S]+?)\*\//g,
+ // (_: string, md: string) => {
+ // markdowns.push(md.trim());
+ // return _;
+ // }
+ // );
+
+ // if (markdowns.length) {
+ // return {code: markdown2js(markdowns.join('\n'), id) as string};
+ // }
+
+ // return null;
+ // }
+
+ if (!id.endsWith('.md')) return null;
+
+ return {code: markdown2js(code, id) as string};
+ }
+ };
+}
diff --git a/scripts/mockApiPlugin.ts b/scripts/mockApiPlugin.ts
new file mode 100644
index 000000000..4b11dda94
--- /dev/null
+++ b/scripts/mockApiPlugin.ts
@@ -0,0 +1,42 @@
+import type {Plugin} from 'vite';
+// @ts-ignore
+import handler from '../mock/index';
+import express, {query} from 'express';
+import setPrototypeOf from 'setprototypeof';
+import path from 'path';
+const app = express();
+
+function initExpress(req: any, res: any, next: any, callback: () => void) {
+ if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
+ (req as any).res = res;
+ res.req = req;
+ (req as any).next = next;
+
+ setPrototypeOf(req, app.request);
+ setPrototypeOf(res, app.response);
+
+ res.locals = res.locals || Object.create(null);
+
+ query({})(req as any, res, callback);
+}
+
+export default function mockApiPlugin(options: {} = {}): Plugin {
+ return {
+ name: 'mock-api',
+ enforce: 'pre' as 'pre',
+ apply: 'serve' as 'serve',
+ configureServer(server) {
+ server.middlewares.use('/api', (req, res, next) => {
+ initExpress(req, res, next, () => {
+ handler(req, res);
+ });
+ });
+
+ server.middlewares.use('/schema.json', (req, res, next) => {
+ initExpress(req, res, next, () => {
+ res.sendFile(path.resolve(__dirname, '../packages/amis/schema.json'));
+ });
+ });
+ }
+ };
+}
diff --git a/tsconfig.json b/tsconfig.json
index f9d2307ca..2730c92c0 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -28,6 +28,14 @@
}
},
"types": ["typePatches"],
- "references": [{"path": "packages/amis"}],
- "include": ["**.ts", "**.tsx", "packages/amis-ui/src/custom.d.ts"]
+ "references": [],
+ "include": [
+ "**.ts",
+ "**.tsx",
+ "**.jsx",
+ "scripts/fis3plugin.ts",
+ "scripts/markdownPlugin.ts",
+ "scripts/mockApiPlugin.ts",
+ "packages/amis-ui/src/custom.d.ts"
+ ]
}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 000000000..af5f1b805
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,79 @@
+import {defineConfig} from 'vite';
+import react from '@vitejs/plugin-react';
+import path from 'path';
+import svgr from 'vite-plugin-svgr';
+import monacoEditorPlugin from 'vite-plugin-monaco-editor';
+import replace from '@rollup/plugin-replace';
+import fis3 from './scripts/fis3plugin';
+import markdown from './scripts/markdownPlugin';
+import mockApi from './scripts/mockApiPlugin';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ fis3(),
+ markdown(),
+ mockApi(),
+
+ react({
+ babel: {
+ parserOpts: {
+ plugins: ['decorators-legacy', 'classProperties']
+ }
+ }
+ }),
+ svgr({
+ exportAsDefault: true,
+ svgrOptions: {
+ svgProps: {
+ className: 'icon'
+ },
+ prettier: false,
+ dimensions: false
+ }
+ }),
+ monacoEditorPlugin({}),
+ replace({
+ preventAssignment: true,
+ __buildDate__: () => JSON.stringify(new Date()),
+ __buildVersion: JSON.stringify('dev')
+ })
+ ],
+ optimizeDeps: {
+ include: ['amis-formula/lib/doc'],
+ esbuildOptions: {
+ target: 'esnext'
+ }
+ },
+ server: {
+ port: 8888
+ },
+ resolve: {
+ alias: [
+ {
+ find: 'amis-formula/lib',
+ replacement: path.resolve(__dirname, './packages/amis-formula/src')
+ },
+ {
+ find: 'amis-formula',
+ replacement: path.resolve(__dirname, './packages/amis-formula/src')
+ },
+ {
+ find: 'amis-ui/lib',
+ replacement: path.resolve(__dirname, './packages/amis-ui/src')
+ },
+ {
+ find: 'amis-ui',
+ replacement: path.resolve(__dirname, './packages/amis-ui/src')
+ },
+ {
+ find: 'amis-core',
+ replacement: path.resolve(__dirname, './packages/amis-core/src')
+ },
+ {
+ find: 'amis',
+ replacement: path.resolve(__dirname, './packages/amis/src')
+ }
+ ]
+ }
+});