mirror of
https://gitee.com/baidu/amis.git
synced 2024-12-04 04:59:17 +08:00
275 lines
6.1 KiB
React
275 lines
6.1 KiB
React
|
/**
|
|||
|
* @file 基于 amis 实现简单样式编辑
|
|||
|
*/
|
|||
|
|
|||
|
// 此文件是基于 https://github.com/ChromeDevTools/devtools-frontend/blob/master/third_party/blink/renderer/core/css/css_properties.json5 编译出来的
|
|||
|
const cssProperties = __inline('./css_properties.json');
|
|||
|
|
|||
|
const propertiesOptions = [];
|
|||
|
|
|||
|
const valueTypeControls = [];
|
|||
|
let valueControls = [];
|
|||
|
|
|||
|
cssProperties.data.sort((a, b) => {
|
|||
|
return a.name.localeCompare(b.name);
|
|||
|
});
|
|||
|
|
|||
|
for (const property of cssProperties.data) {
|
|||
|
if (property.svg || property.name.startsWith('-')) {
|
|||
|
// 忽略 svg 相关或古老的 -webkit 属性
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
propertiesOptions.push(property.name);
|
|||
|
|
|||
|
let valueTypeOptions = property.typedom_types || [];
|
|||
|
// 原来的定义中并没有这个类型
|
|||
|
if (property.type_name === 'StyleColor') {
|
|||
|
valueTypeOptions.push('Color');
|
|||
|
valueTypeOptions.push('ColorRGBA');
|
|||
|
}
|
|||
|
|
|||
|
valueTypeOptions.sort();
|
|||
|
|
|||
|
// 有些属性是中有 keyword 类型但没 keywords 列表,比如 scroll-margin-left,这时要去掉这个类型
|
|||
|
if (!property.keywords) {
|
|||
|
valueTypeOptions = valueTypeOptions.filter(function (item) {
|
|||
|
return item !== 'Keyword';
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (valueTypeOptions.length > 0) {
|
|||
|
valueTypeControls.push({
|
|||
|
name: 'valueType',
|
|||
|
label: '值类型',
|
|||
|
visibleOn: `data.property === "${property.name}"`,
|
|||
|
type: 'select',
|
|||
|
value: valueTypeOptions[0],
|
|||
|
options: valueTypeOptions
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (property.keywords) {
|
|||
|
const keywords = property.keywords;
|
|||
|
keywords.sort();
|
|||
|
valueControls.push({
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.property === "${property.name}" && data.valueType === "Keyword"`,
|
|||
|
label: '值',
|
|||
|
type: 'select',
|
|||
|
options: keywords
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
valueControls = valueControls.concat([
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Color"`,
|
|||
|
label: '值',
|
|||
|
type: 'color'
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
format: 'rgba',
|
|||
|
visibleOn: `data.valueType === "ColorRGBA"`,
|
|||
|
label: '值',
|
|||
|
type: 'color'
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Number"`,
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'input-group',
|
|||
|
label: '值',
|
|||
|
visibleOn: `data.valueType === "Length"`,
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'select',
|
|||
|
name: 'valueUnit',
|
|||
|
// https://www.w3.org/TR/css3-values/#lengths
|
|||
|
options: [
|
|||
|
'em',
|
|||
|
'ex',
|
|||
|
'ch',
|
|||
|
'rem',
|
|||
|
'vm',
|
|||
|
'vh',
|
|||
|
'vmin',
|
|||
|
'vmax',
|
|||
|
'cm',
|
|||
|
'mm',
|
|||
|
'Q',
|
|||
|
'in',
|
|||
|
'pt',
|
|||
|
'pc',
|
|||
|
'px'
|
|||
|
],
|
|||
|
value: 'px'
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Percentage"`,
|
|||
|
label: '值',
|
|||
|
type: 'text',
|
|||
|
addOn: {
|
|||
|
type: 'static',
|
|||
|
label: '%'
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Angle"`,
|
|||
|
label: '值',
|
|||
|
type: 'input-group',
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'select',
|
|||
|
name: 'valueUnit',
|
|||
|
// https://www.w3.org/TR/css3-values/#angles
|
|||
|
options: ['deg', 'grad', 'rad', 'turn'],
|
|||
|
value: 'px'
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Time"`,
|
|||
|
label: '值',
|
|||
|
type: 'input-group',
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'select',
|
|||
|
name: 'valueUnit',
|
|||
|
// https://www.w3.org/TR/css3-values/#time
|
|||
|
options: ['s', 'ms'],
|
|||
|
value: 's'
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Frequency"`,
|
|||
|
label: '值',
|
|||
|
type: 'input-group',
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'select',
|
|||
|
name: 'valueUnit',
|
|||
|
// https://www.w3.org/TR/css3-values/#frequency
|
|||
|
options: ['Hz', 'kHz'],
|
|||
|
value: 'Hz'
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Frequency"`,
|
|||
|
label: '值',
|
|||
|
type: 'input-group',
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
label: '值',
|
|||
|
type: 'number'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'select',
|
|||
|
name: 'valueUnit',
|
|||
|
// https://www.w3.org/TR/css3-values/#resolution
|
|||
|
options: ['dpi', 'dpcm', 'dppx'],
|
|||
|
value: 'dpi'
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `data.valueType === "Position"`,
|
|||
|
label: '值',
|
|||
|
|
|||
|
type: 'tag',
|
|||
|
// https://www.w3.org/TR/css3-values/#position
|
|||
|
options: ['top', 'left', 'bottom', 'right', 'center']
|
|||
|
},
|
|||
|
// 这些类型支持起来好麻烦,先不弄
|
|||
|
{
|
|||
|
name: 'value',
|
|||
|
visibleOn: `!data.valueType || data.valueType === "Flex" || data.valueType === "Transform" || data.valueType === "Unparsed"|| data.valueType === "Image"`,
|
|||
|
label: '值',
|
|||
|
type: 'text'
|
|||
|
}
|
|||
|
]);
|
|||
|
|
|||
|
export default {
|
|||
|
$schema: 'https://houtai.baidu.com/v2/schemas/page.json#',
|
|||
|
title: '样式编辑',
|
|||
|
data: {
|
|||
|
style: [
|
|||
|
{property: 'display', valueType: 'Keyword', value: 'inline'},
|
|||
|
{property: 'color', valueType: 'Color', value: '#5240a5'},
|
|||
|
{property: 'width', valueType: 'Percentage', value: '30'},
|
|||
|
{
|
|||
|
property: 'object-position',
|
|||
|
valueType: 'Position',
|
|||
|
value: ['left', '50%']
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
body: [
|
|||
|
{
|
|||
|
type: 'form',
|
|||
|
api: '/api/mock2/saveForm',
|
|||
|
title: '',
|
|||
|
controls: [
|
|||
|
{
|
|||
|
type: 'static',
|
|||
|
value:
|
|||
|
'演示基于 combo 及显隐联动来实现简易样式编辑,同时用来测试性能。'
|
|||
|
},
|
|||
|
{
|
|||
|
type: 'combo',
|
|||
|
name: 'style',
|
|||
|
label: '样式列表',
|
|||
|
multiple: true,
|
|||
|
controls: [
|
|||
|
{
|
|||
|
name: 'property',
|
|||
|
label: '属性',
|
|||
|
type: 'select',
|
|||
|
searchable: true,
|
|||
|
options: propertiesOptions
|
|||
|
},
|
|||
|
...valueTypeControls,
|
|||
|
...valueControls
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
};
|