@thienvu18/designable-react-settings-form 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +1 -0
  3. package/esm/SchemaField.d.ts +1580 -0
  4. package/esm/SchemaField.js +42 -0
  5. package/esm/SettingsForm.d.ts +4 -0
  6. package/esm/SettingsForm.js +54 -0
  7. package/esm/components/BackgroundStyleSetter/index.d.ts +6 -0
  8. package/esm/components/BackgroundStyleSetter/index.js +43 -0
  9. package/esm/components/BorderRadiusStyleSetter/index.d.ts +6 -0
  10. package/esm/components/BorderRadiusStyleSetter/index.js +11 -0
  11. package/esm/components/BorderStyleSetter/index.d.ts +7 -0
  12. package/esm/components/BorderStyleSetter/index.js +74 -0
  13. package/esm/components/BorderStyleSetter/styles.less +70 -0
  14. package/esm/components/BoxShadowStyleSetter/index.d.ts +8 -0
  15. package/esm/components/BoxShadowStyleSetter/index.js +25 -0
  16. package/esm/components/BoxStyleSetter/index.d.ts +9 -0
  17. package/esm/components/BoxStyleSetter/index.js +49 -0
  18. package/esm/components/CollapseItem/index.d.ts +8 -0
  19. package/esm/components/CollapseItem/index.js +16 -0
  20. package/esm/components/CollapseItem/styles.less +45 -0
  21. package/esm/components/ColorInput/index.d.ts +7 -0
  22. package/esm/components/ColorInput/index.js +18 -0
  23. package/esm/components/ColorInput/styles.less +17 -0
  24. package/esm/components/CornerInput/index.d.ts +9 -0
  25. package/esm/components/CornerInput/index.js +22 -0
  26. package/esm/components/CornerInput/styles.less +25 -0
  27. package/esm/components/DisplayStyleSetter/index.d.ts +9 -0
  28. package/esm/components/DisplayStyleSetter/index.js +34 -0
  29. package/esm/components/DisplayStyleSetter/styles.less +15 -0
  30. package/esm/components/DrawerSetter/index.d.ts +8 -0
  31. package/esm/components/DrawerSetter/index.js +43 -0
  32. package/esm/components/DrawerSetter/styles.less +54 -0
  33. package/esm/components/FlexStyleSetter/index.d.ts +7 -0
  34. package/esm/components/FlexStyleSetter/index.js +111 -0
  35. package/esm/components/FlexStyleSetter/styles.less +23 -0
  36. package/esm/components/FoldItem/index.d.ts +7 -0
  37. package/esm/components/FoldItem/index.js +49 -0
  38. package/esm/components/FoldItem/styles.less +42 -0
  39. package/esm/components/FontStyleSetter/index.d.ts +6 -0
  40. package/esm/components/FontStyleSetter/index.js +88 -0
  41. package/esm/components/ImageInput/index.d.ts +9 -0
  42. package/esm/components/ImageInput/index.js +41 -0
  43. package/esm/components/ImageInput/styles.less +3 -0
  44. package/esm/components/InputItems/index.d.ts +23 -0
  45. package/esm/components/InputItems/index.js +18 -0
  46. package/esm/components/InputItems/styles.less +45 -0
  47. package/esm/components/MonacoInput/config.d.ts +1 -0
  48. package/esm/components/MonacoInput/config.js +39 -0
  49. package/esm/components/MonacoInput/format.d.ts +1 -0
  50. package/esm/components/MonacoInput/format.js +31 -0
  51. package/esm/components/MonacoInput/index.d.ts +16 -0
  52. package/esm/components/MonacoInput/index.js +216 -0
  53. package/esm/components/MonacoInput/styles.less +33 -0
  54. package/esm/components/MonacoInput/themes/chrome.d.ts +39 -0
  55. package/esm/components/MonacoInput/themes/chrome.js +106 -0
  56. package/esm/components/MonacoInput/themes/monokai.d.ts +31 -0
  57. package/esm/components/MonacoInput/themes/monokai.js +140 -0
  58. package/esm/components/PolyInput/index.d.ts +21 -0
  59. package/esm/components/PolyInput/index.js +70 -0
  60. package/esm/components/PolyInput/styles.less +31 -0
  61. package/esm/components/PositionInput/index.d.ts +9 -0
  62. package/esm/components/PositionInput/index.js +22 -0
  63. package/esm/components/PositionInput/styles.less +28 -0
  64. package/esm/components/SizeInput/index.d.ts +3 -0
  65. package/esm/components/SizeInput/index.js +53 -0
  66. package/esm/components/SizeInput/styles.less +23 -0
  67. package/esm/components/ValueInput/index.d.ts +2 -0
  68. package/esm/components/ValueInput/index.js +81 -0
  69. package/esm/components/ValueInput/styles.less +0 -0
  70. package/esm/components/index.d.ts +20 -0
  71. package/esm/components/index.js +20 -0
  72. package/esm/effects/index.d.ts +2 -0
  73. package/esm/effects/index.js +2 -0
  74. package/esm/effects/useLocales.d.ts +2 -0
  75. package/esm/effects/useLocales.js +63 -0
  76. package/esm/effects/useSnapshot.d.ts +2 -0
  77. package/esm/effects/useSnapshot.js +10 -0
  78. package/esm/index.d.ts +5 -0
  79. package/esm/index.js +5 -0
  80. package/esm/locales/en-US.d.ts +13 -0
  81. package/esm/locales/en-US.js +12 -0
  82. package/esm/locales/index.d.ts +1 -0
  83. package/esm/locales/index.js +5 -0
  84. package/esm/locales/ko-KR.d.ts +13 -0
  85. package/esm/locales/ko-KR.js +12 -0
  86. package/esm/locales/zh-CN.d.ts +13 -0
  87. package/esm/locales/zh-CN.js +12 -0
  88. package/esm/registry.d.ts +2 -0
  89. package/esm/registry.js +13 -0
  90. package/esm/shared/context.d.ts +3 -0
  91. package/esm/shared/context.js +2 -0
  92. package/esm/shared/loadScript.d.ts +7 -0
  93. package/esm/shared/loadScript.js +29 -0
  94. package/esm/styles.less +121 -0
  95. package/esm/types.d.ts +10 -0
  96. package/esm/types.js +1 -0
  97. package/lib/SchemaField.d.ts +1580 -0
  98. package/lib/SchemaField.js +45 -0
  99. package/lib/SettingsForm.d.ts +4 -0
  100. package/lib/SettingsForm.js +60 -0
  101. package/lib/components/BackgroundStyleSetter/index.d.ts +6 -0
  102. package/lib/components/BackgroundStyleSetter/index.js +49 -0
  103. package/lib/components/BorderRadiusStyleSetter/index.d.ts +6 -0
  104. package/lib/components/BorderRadiusStyleSetter/index.js +15 -0
  105. package/lib/components/BorderStyleSetter/index.d.ts +7 -0
  106. package/lib/components/BorderStyleSetter/index.js +80 -0
  107. package/lib/components/BorderStyleSetter/styles.less +70 -0
  108. package/lib/components/BoxShadowStyleSetter/index.d.ts +8 -0
  109. package/lib/components/BoxShadowStyleSetter/index.js +31 -0
  110. package/lib/components/BoxStyleSetter/index.d.ts +9 -0
  111. package/lib/components/BoxStyleSetter/index.js +55 -0
  112. package/lib/components/CollapseItem/index.d.ts +8 -0
  113. package/lib/components/CollapseItem/index.js +22 -0
  114. package/lib/components/CollapseItem/styles.less +45 -0
  115. package/lib/components/ColorInput/index.d.ts +7 -0
  116. package/lib/components/ColorInput/index.js +22 -0
  117. package/lib/components/ColorInput/styles.less +17 -0
  118. package/lib/components/CornerInput/index.d.ts +9 -0
  119. package/lib/components/CornerInput/index.js +29 -0
  120. package/lib/components/CornerInput/styles.less +25 -0
  121. package/lib/components/DisplayStyleSetter/index.d.ts +9 -0
  122. package/lib/components/DisplayStyleSetter/index.js +40 -0
  123. package/lib/components/DisplayStyleSetter/styles.less +15 -0
  124. package/lib/components/DrawerSetter/index.d.ts +8 -0
  125. package/lib/components/DrawerSetter/index.js +49 -0
  126. package/lib/components/DrawerSetter/styles.less +54 -0
  127. package/lib/components/FlexStyleSetter/index.d.ts +7 -0
  128. package/lib/components/FlexStyleSetter/index.js +117 -0
  129. package/lib/components/FlexStyleSetter/styles.less +23 -0
  130. package/lib/components/FoldItem/index.d.ts +7 -0
  131. package/lib/components/FoldItem/index.js +78 -0
  132. package/lib/components/FoldItem/styles.less +42 -0
  133. package/lib/components/FontStyleSetter/index.d.ts +6 -0
  134. package/lib/components/FontStyleSetter/index.js +94 -0
  135. package/lib/components/ImageInput/index.d.ts +9 -0
  136. package/lib/components/ImageInput/index.js +49 -0
  137. package/lib/components/ImageInput/styles.less +3 -0
  138. package/lib/components/InputItems/index.d.ts +23 -0
  139. package/lib/components/InputItems/index.js +48 -0
  140. package/lib/components/InputItems/styles.less +45 -0
  141. package/lib/components/MonacoInput/config.d.ts +1 -0
  142. package/lib/components/MonacoInput/config.js +46 -0
  143. package/lib/components/MonacoInput/format.d.ts +1 -0
  144. package/lib/components/MonacoInput/format.js +35 -0
  145. package/lib/components/MonacoInput/index.d.ts +16 -0
  146. package/lib/components/MonacoInput/index.js +246 -0
  147. package/lib/components/MonacoInput/styles.less +33 -0
  148. package/lib/components/MonacoInput/themes/chrome.d.ts +39 -0
  149. package/lib/components/MonacoInput/themes/chrome.js +108 -0
  150. package/lib/components/MonacoInput/themes/monokai.d.ts +31 -0
  151. package/lib/components/MonacoInput/themes/monokai.js +142 -0
  152. package/lib/components/PolyInput/index.d.ts +21 -0
  153. package/lib/components/PolyInput/index.js +100 -0
  154. package/lib/components/PolyInput/styles.less +31 -0
  155. package/lib/components/PositionInput/index.d.ts +9 -0
  156. package/lib/components/PositionInput/index.js +29 -0
  157. package/lib/components/PositionInput/styles.less +28 -0
  158. package/lib/components/SizeInput/index.d.ts +3 -0
  159. package/lib/components/SizeInput/index.js +56 -0
  160. package/lib/components/SizeInput/styles.less +23 -0
  161. package/lib/components/ValueInput/index.d.ts +2 -0
  162. package/lib/components/ValueInput/index.js +84 -0
  163. package/lib/components/ValueInput/styles.less +0 -0
  164. package/lib/components/index.d.ts +20 -0
  165. package/lib/components/index.js +36 -0
  166. package/lib/effects/index.d.ts +2 -0
  167. package/lib/effects/index.js +18 -0
  168. package/lib/effects/useLocales.d.ts +2 -0
  169. package/lib/effects/useLocales.js +67 -0
  170. package/lib/effects/useSnapshot.d.ts +2 -0
  171. package/lib/effects/useSnapshot.js +14 -0
  172. package/lib/index.d.ts +5 -0
  173. package/lib/index.js +21 -0
  174. package/lib/locales/en-US.d.ts +13 -0
  175. package/lib/locales/en-US.js +14 -0
  176. package/lib/locales/index.d.ts +1 -0
  177. package/lib/locales/index.js +10 -0
  178. package/lib/locales/ko-KR.d.ts +13 -0
  179. package/lib/locales/ko-KR.js +14 -0
  180. package/lib/locales/zh-CN.d.ts +13 -0
  181. package/lib/locales/zh-CN.js +14 -0
  182. package/lib/registry.d.ts +2 -0
  183. package/lib/registry.js +21 -0
  184. package/lib/shared/context.d.ts +3 -0
  185. package/lib/shared/context.js +5 -0
  186. package/lib/shared/loadScript.d.ts +7 -0
  187. package/lib/shared/loadScript.js +33 -0
  188. package/lib/styles.less +121 -0
  189. package/lib/types.d.ts +10 -0
  190. package/lib/types.js +2 -0
  191. package/package.json +71 -0
@@ -0,0 +1,15 @@
1
+ @ant-prefix: ant;
2
+ .dn-display-style-setter {
3
+ &-radio {
4
+ display: flex !important;
5
+ width: 100%;
6
+
7
+ .@{ant-prefix}-radio-button-wrapper {
8
+ flex-grow: 1;
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: center;
12
+ padding: 0;
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { ButtonProps } from 'antd';
3
+ import './styles.less';
4
+ export interface IDrawerSetterProps {
5
+ text: React.ReactNode;
6
+ triggerProps: ButtonProps;
7
+ }
8
+ export declare const DrawerSetter: React.FC<IDrawerSetterProps>;
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useState, useLayoutEffect } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { observer, useField } from '@formily/react';
5
+ import { FormLayout } from '@thienvu18/formily-antd-v6';
6
+ import { IconWidget, usePrefix, useTreeNode } from '@thienvu18/designable-react';
7
+ import { Button } from 'antd';
8
+ import cls from 'classnames';
9
+ import './styles.less';
10
+ export const DrawerSetter = observer((props) => {
11
+ const node = useTreeNode();
12
+ const field = useField();
13
+ const [visible, setVisible] = useState(false);
14
+ const [remove, setRemove] = useState(false);
15
+ const [root, setRoot] = useState();
16
+ const prefix = usePrefix('drawer-setter');
17
+ const formWrapperCls = usePrefix('settings-form-wrapper');
18
+ useLayoutEffect(() => {
19
+ const wrapper = document.querySelector('.' + formWrapperCls);
20
+ if (wrapper) {
21
+ setRoot(wrapper);
22
+ }
23
+ }, [node]);
24
+ const renderDrawer = () => {
25
+ if (root && visible) {
26
+ return createPortal(_jsxs("div", { className: cls(prefix, 'animate__animated animate__slideInRight', {
27
+ animate__slideOutRight: remove,
28
+ }), children: [_jsxs("div", { className: prefix + '-header', onClick: handleClose, children: [_jsx(IconWidget, { infer: "Return", size: 18 }), _jsx("span", { className: prefix + '-header-text', children: props.text || field.title })] }), _jsx("div", { className: prefix + '-body', children: _jsx(FormLayout, { colon: false, labelWidth: 120, labelAlign: "left", wrapperAlign: "right", feedbackLayout: "none", tooltipLayout: "text", children: props.children }) })] }), root);
29
+ }
30
+ return null;
31
+ };
32
+ const handleOpen = () => {
33
+ setVisible(true);
34
+ };
35
+ const handleClose = () => {
36
+ setRemove(true);
37
+ setTimeout(() => {
38
+ setVisible(false);
39
+ setRemove(false);
40
+ }, 150);
41
+ };
42
+ return (_jsxs(Fragment, { children: [_jsx(Button, { block: true, onClick: handleOpen, ...props.triggerProps, children: props.text || field.title }), renderDrawer()] }));
43
+ });
@@ -0,0 +1,54 @@
1
+
2
+ .dn-drawer-setter {
3
+ position: absolute;
4
+ top: 0;
5
+ left: 0;
6
+ width: 100%;
7
+ bottom: 0;
8
+ background: var(--dn-composite-panel-tabs-content-bg-color);
9
+ z-index: 10;
10
+ display: flex;
11
+ flex-direction: column;
12
+
13
+ &-header {
14
+ display: flex;
15
+ align-items: center;
16
+ flex-shrink: 0;
17
+ flex-grow: 0;
18
+ padding: 5px 10px;
19
+ color: var(--dn-color-text, rgba(0, 0, 0, 0.88));
20
+ border-bottom: 1px solid var(--dn-color-border-secondary, rgba(5, 5, 5, 0.06));
21
+ cursor: pointer;
22
+ }
23
+
24
+ &-header-text {
25
+ margin-left: 4px;
26
+ }
27
+
28
+ &-body {
29
+ padding: 10px 20px;
30
+ overflow: overlay;
31
+ overflow-x: hidden;
32
+ flex-grow: 2;
33
+ }
34
+ }
35
+
36
+ .dn-drawer-wrapper {
37
+ transition: all 0.16s ease-in-out;
38
+
39
+ &-enter {
40
+ transform: translateX(100%);
41
+ }
42
+
43
+ &-enter-active {
44
+ transform: translateX(0);
45
+ }
46
+
47
+ &-exit {
48
+ transform: translateX(0);
49
+ }
50
+
51
+ &-exit-active {
52
+ transform: translateX(100%);
53
+ }
54
+ }
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import './styles.less';
3
+ export interface IFlexStyleSetterProps {
4
+ className?: string;
5
+ style?: React.CSSProperties;
6
+ }
7
+ export declare const FlexStyleSetter: React.FC<IFlexStyleSetterProps>;
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Field, useField, observer } from '@formily/react';
3
+ import { Radio } from '@thienvu18/formily-antd-v6';
4
+ import { usePrefix, IconWidget } from '@thienvu18/designable-react';
5
+ import { InputItems } from '../InputItems';
6
+ import cls from 'classnames';
7
+ import './styles.less';
8
+ export const FlexStyleSetter = observer((props) => {
9
+ const field = useField();
10
+ const prefix = usePrefix('flex-style-setter');
11
+ return (_jsx("div", { className: cls(prefix, props.className), style: props.style, children: _jsxs(InputItems, { vertical: true, children: [_jsx(Field, { name: "flexDirection", basePath: field.address.parent(), dataSource: [
12
+ {
13
+ label: _jsx(IconWidget, { infer: "FlexDirectionRow" }),
14
+ value: 'row',
15
+ },
16
+ {
17
+ label: _jsx(IconWidget, { infer: "FlexDirectionColumn" }),
18
+ value: 'column',
19
+ },
20
+ ], reactions: (field) => {
21
+ field.decorator[1].title = `Flex Direction : ${field.value || ''}`;
22
+ }, decorator: [InputItems.Item], component: [Radio.Group, { optionType: 'button' }] }), _jsx(Field, { name: "flexWrap", basePath: field.address.parent(), dataSource: [
23
+ {
24
+ label: _jsx(IconWidget, { infer: "FlexNoWrap" }),
25
+ value: 'nowrap',
26
+ },
27
+ {
28
+ label: _jsx(IconWidget, { infer: "FlexWrap" }),
29
+ value: 'wrap',
30
+ },
31
+ ], reactions: (field) => {
32
+ field.decorator[1].title = `Flex Wrap : ${field.value || ''}`;
33
+ }, decorator: [InputItems.Item], component: [Radio.Group, { optionType: 'button' }] }), _jsx(Field, { name: "alignContent", basePath: field.address.parent(), dataSource: [
34
+ {
35
+ label: _jsx(IconWidget, { infer: "FlexAlignContentCenter" }),
36
+ value: 'center',
37
+ },
38
+ {
39
+ label: _jsx(IconWidget, { infer: "FlexAlignContentStart" }),
40
+ value: 'flex-start',
41
+ },
42
+ {
43
+ label: _jsx(IconWidget, { infer: "FlexAlignContentEnd" }),
44
+ value: 'flex-end',
45
+ },
46
+ {
47
+ label: _jsx(IconWidget, { infer: "FlexAlignContentSpaceAround" }),
48
+ value: 'space-around',
49
+ },
50
+ {
51
+ label: _jsx(IconWidget, { infer: "FlexAlignContentSpaceBetween" }),
52
+ value: 'space-between',
53
+ },
54
+ {
55
+ label: _jsx(IconWidget, { infer: "FlexAlignContentStretch" }),
56
+ value: 'stretch',
57
+ },
58
+ ], reactions: (field) => {
59
+ field.decorator[1].title = `Align Content : ${field.value || ''}`;
60
+ }, decorator: [InputItems.Item], component: [Radio.Group, { optionType: 'button' }] }), _jsx(Field, { name: "justifyContent", basePath: field.address.parent(), dataSource: [
61
+ {
62
+ label: _jsx(IconWidget, { infer: "FlexJustifyCenter" }),
63
+ value: 'center',
64
+ },
65
+ {
66
+ label: _jsx(IconWidget, { infer: "FlexJustifyStart" }),
67
+ value: 'flex-start',
68
+ },
69
+ {
70
+ label: _jsx(IconWidget, { infer: "FlexJustifyEnd" }),
71
+ value: 'flex-end',
72
+ },
73
+ {
74
+ label: _jsx(IconWidget, { infer: "FlexJustifySpaceAround" }),
75
+ value: 'space-around',
76
+ },
77
+ {
78
+ label: _jsx(IconWidget, { infer: "FlexJustifySpaceBetween" }),
79
+ value: 'space-between',
80
+ },
81
+ {
82
+ label: _jsx(IconWidget, { infer: "FlexJustifySpaceEvenly" }),
83
+ value: 'space-evenly',
84
+ },
85
+ ], reactions: (field) => {
86
+ field.decorator[1].title = `Justify Content : ${field.value || ''}`;
87
+ }, decorator: [InputItems.Item], component: [Radio.Group, { optionType: 'button' }] }), _jsx(Field, { name: "alignItems", basePath: field.address.parent(), dataSource: [
88
+ {
89
+ label: _jsx(IconWidget, { infer: "FlexAlignItemsCenter" }),
90
+ value: 'center',
91
+ },
92
+ {
93
+ label: _jsx(IconWidget, { infer: "FlexAlignItemsStart" }),
94
+ value: 'flex-start',
95
+ },
96
+ {
97
+ label: _jsx(IconWidget, { infer: "FlexAlignItemsEnd" }),
98
+ value: 'flex-end',
99
+ },
100
+ {
101
+ label: _jsx(IconWidget, { infer: "FlexAlignItemsStretch" }),
102
+ value: 'stretch',
103
+ },
104
+ {
105
+ label: _jsx(IconWidget, { infer: "FlexAlignItemsBaseline" }),
106
+ value: 'baseline',
107
+ },
108
+ ], reactions: (field) => {
109
+ field.decorator[1].title = `Align Items : ${field.value || ''}`;
110
+ }, decorator: [InputItems.Item], component: [Radio.Group, { optionType: 'button' }] })] }) }));
111
+ });
@@ -0,0 +1,23 @@
1
+ @ant-prefix: ant;
2
+ .dn-flex-style-setter {
3
+ .dn-input-items {
4
+ margin-top: -10px;
5
+ margin-left: -10px;
6
+ margin-right: -10px;
7
+ margin-bottom: 10px;
8
+ padding: 10px 10px 0 10px;
9
+ background-color: var(--dn-color-border-secondary, rgba(5, 5, 5, 0.06));
10
+
11
+ .@{ant-prefix}-radio-group {
12
+ display: flex;
13
+ width: 100%;
14
+
15
+ .@{ant-prefix}-radio-button-wrapper {
16
+ flex-grow: 1;
17
+ display: flex;
18
+ justify-content: center;
19
+ padding: 0;
20
+ }
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { IFormItemProps } from '@thienvu18/formily-antd-v6';
3
+ import './styles.less';
4
+ export declare const FoldItem: React.FC<React.PropsWithChildren<IFormItemProps>> & {
5
+ Base?: React.FC<React.PropsWithChildren<{}>>;
6
+ Extra?: React.FC<React.PropsWithChildren<{}>>;
7
+ };
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { Fragment, useRef, useMemo } from 'react';
3
+ import { FormItem } from '@thienvu18/formily-antd-v6';
4
+ import { useField, observer } from '@formily/react';
5
+ import { observable } from '@formily/reactive';
6
+ import { IconWidget, usePrefix } from '@thienvu18/designable-react';
7
+ import cls from 'classnames';
8
+ import './styles.less';
9
+ const ExpandedMap = new Map();
10
+ export const FoldItem = observer(({ className, style, children, ...props }) => {
11
+ const prefix = usePrefix('fold-item');
12
+ const field = useField();
13
+ const expand = useMemo(() => observable.ref(ExpandedMap.get(field?.address?.toString() || '')), [field?.address]);
14
+ const slots = useRef({
15
+ base: null,
16
+ extra: null,
17
+ });
18
+ slots.current = { base: null, extra: null };
19
+ React.Children.forEach(children, (node) => {
20
+ if (React.isValidElement(node)) {
21
+ if (node?.type?.displayName === 'FoldItem.Base') {
22
+ slots.current.base = node.props?.children;
23
+ }
24
+ if (node?.type?.displayName === 'FoldItem.Extra') {
25
+ slots.current.extra = node.props?.children;
26
+ }
27
+ }
28
+ });
29
+ return (_jsxs("div", { className: cls(prefix, className), style: style, children: [_jsx("div", { className: prefix + '-base', onClick: () => {
30
+ expand.value = !expand.value;
31
+ if (field?.address) {
32
+ ExpandedMap.set(field.address.toString(), expand.value);
33
+ }
34
+ }, children: _jsx(FormItem.BaseItem, { ...props, label: _jsxs("span", { className: cls(prefix + '-title', {
35
+ expand: expand.value,
36
+ }), children: [slots.current.extra && _jsx(IconWidget, { infer: "Expand", size: 10 }), props.label] }), children: _jsx("div", { style: { width: '100%' }, onClick: (e) => {
37
+ e.stopPropagation();
38
+ }, children: slots.current.base }) }) }), expand.value && slots.current.extra && (_jsx("div", { className: prefix + '-extra', children: slots.current.extra }))] }));
39
+ });
40
+ const Base = () => {
41
+ return _jsx(Fragment, {});
42
+ };
43
+ Base.displayName = 'FoldItem.Base';
44
+ const Extra = () => {
45
+ return _jsx(Fragment, {});
46
+ };
47
+ Extra.displayName = 'FoldItem.Extra';
48
+ FoldItem.Base = Base;
49
+ FoldItem.Extra = Extra;
@@ -0,0 +1,42 @@
1
+ @ant-prefix: ant;
2
+ .dn-fold-item {
3
+ .@{ant-prefix}-formily-item-label-content {
4
+ overflow: visible;
5
+ }
6
+
7
+ &-base {
8
+ cursor: pointer;
9
+ }
10
+
11
+ &-title {
12
+ display: flex;
13
+ align-items: center;
14
+ margin-left: -10px;
15
+ cursor: pointer;
16
+ .dn-icon {
17
+ transform: translateX(-3px);
18
+
19
+ svg {
20
+ transition: all 0.15s ease-in-out;
21
+ transform: rotate(-90deg);
22
+ }
23
+ }
24
+
25
+ &.expand {
26
+ .dn-icon {
27
+ svg {
28
+ transform: rotate(0deg);
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ &-extra {
35
+ margin-top: -10px;
36
+ margin-left: -10px;
37
+ margin-right: -10px;
38
+ margin-bottom: 10px;
39
+ padding: 10px 10px 0 10px;
40
+ background-color: var(--dn-composite-panel-highlight-bg-color);
41
+ }
42
+ }
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface IFontStyleSetterProps {
3
+ className?: string;
4
+ style?: React.CSSProperties;
5
+ }
6
+ export declare const FontStyleSetter: React.FC<IFontStyleSetterProps>;
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { usePrefix, IconWidget } from '@thienvu18/designable-react';
3
+ import { useField, Field, observer } from '@formily/react';
4
+ import { Select, Radio, NumberPicker } from '@thienvu18/formily-antd-v6';
5
+ import { FoldItem } from '../FoldItem';
6
+ import { InputItems } from '../InputItems';
7
+ import { SizeInput } from '../SizeInput';
8
+ import { ColorInput } from '../ColorInput';
9
+ import cls from 'classnames';
10
+ const createFontFamilyOptions = (fonts) => {
11
+ return fonts.map((font) => {
12
+ const splited = font.split('=');
13
+ const label = splited?.[0];
14
+ const value = splited?.[1];
15
+ return {
16
+ label: _jsx("span", { style: { fontFamily: value }, children: label }),
17
+ value,
18
+ };
19
+ });
20
+ };
21
+ const FontFamilyOptions = createFontFamilyOptions([
22
+ '宋体=SimSun',
23
+ '微软雅黑=Microsoft Yahei',
24
+ '苹方=PingFang SC',
25
+ 'Andale Mono=andale mono,monospace',
26
+ 'Arial=arial,helvetica,sans-serif',
27
+ 'Arial Black=arial black,sans-serif',
28
+ 'Book Antiqua=book antiqua,palatino,serif',
29
+ 'Comic Sans MS=comic sans ms,sans-serif',
30
+ 'Courier New=courier new,courier,monospace',
31
+ 'Georgia=georgia,palatino,serif',
32
+ 'Helvetica Neue=Helvetica Neue',
33
+ 'Helvetica=helvetica,arial,sans-serif',
34
+ 'Impact=impact,sans-serif',
35
+ 'Symbol=symbol',
36
+ 'Tahoma=tahoma,arial,helvetica,sans-serif',
37
+ 'Terminal=terminal,monaco,monospace',
38
+ 'Times New Roman=times new roman,times,serif',
39
+ 'Trebuchet MS=trebuchet ms,geneva,sans-serif',
40
+ 'Verdana=verdana,geneva,sans-serif',
41
+ ]);
42
+ export const FontStyleSetter = observer((props) => {
43
+ const field = useField();
44
+ const prefix = usePrefix('font-style-setter');
45
+ return (_jsxs(FoldItem, { label: field.title, className: cls(prefix, props.className), style: props.style, children: [_jsx(FoldItem.Base, { children: _jsx(Field, { name: "fontFamily", basePath: field.address.parent(), component: [
46
+ Select,
47
+ { style: { width: '100%' }, placeholder: 'Helvetica Neue' },
48
+ ], dataSource: FontFamilyOptions }) }), _jsx(FoldItem.Extra, { children: _jsxs(InputItems, { children: [_jsx(InputItems.Item, { icon: "FontWeight", width: "50%", children: _jsx(Field, { name: "fontWeight", basePath: field.address.parent(), component: [NumberPicker, { placeholder: '400' }] }) }), _jsx(InputItems.Item, { icon: "FontStyle", width: "50%", children: _jsx(Field, { name: "fontStyle", basePath: field.address.parent(), dataSource: [
49
+ {
50
+ label: _jsx(IconWidget, { infer: "NormalFontStyle" }),
51
+ value: 'normal',
52
+ },
53
+ {
54
+ label: _jsx(IconWidget, { infer: "ItalicFontStyle" }),
55
+ value: 'italic',
56
+ },
57
+ ], component: [Radio.Group, { optionType: 'button' }] }) }), _jsx(InputItems.Item, { icon: "FontColor", width: "100%", children: _jsx(Field, { name: "color", basePath: field.address.parent(), component: [ColorInput] }) }), _jsx(InputItems.Item, { icon: "FontSize", width: "50%", children: _jsx(Field, { name: "fontSize", basePath: field.address.parent(), component: [SizeInput, { exclude: ['auto'] }] }) }), _jsx(InputItems.Item, { icon: "LineHeight", width: "50%", children: _jsx(Field, { name: "lineHeight", basePath: field.address.parent(), component: [SizeInput, { exclude: ['auto'] }] }) }), _jsx(InputItems.Item, { icon: "TextAlign", children: _jsx(Field, { name: "textAlign", basePath: field.address.parent(), dataSource: [
58
+ {
59
+ label: _jsx(IconWidget, { infer: "TextAlignLeft" }),
60
+ value: 'left',
61
+ },
62
+ {
63
+ label: _jsx(IconWidget, { infer: "TextAlignCenter" }),
64
+ value: 'center',
65
+ },
66
+ {
67
+ label: _jsx(IconWidget, { infer: "TextAlignRight" }),
68
+ value: 'right',
69
+ },
70
+ {
71
+ label: _jsx(IconWidget, { infer: "TextAlignJustify" }),
72
+ value: 'justify',
73
+ },
74
+ ], component: [Radio.Group, { optionType: 'button' }] }) }), _jsx(InputItems.Item, { icon: "TextDecoration", children: _jsx(Field, { name: "textDecoration", basePath: field.address.parent(), dataSource: [
75
+ {
76
+ label: '--',
77
+ value: 'none',
78
+ },
79
+ {
80
+ label: _jsx(IconWidget, { infer: "TextUnderline" }),
81
+ value: 'underline',
82
+ },
83
+ {
84
+ label: _jsx(IconWidget, { infer: "TextLineThrough" }),
85
+ value: 'line-through',
86
+ },
87
+ ], component: [Radio.Group, { optionType: 'button' }] }) })] }) })] }));
88
+ });
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { InputProps } from 'antd';
3
+ import './styles.less';
4
+ export interface ImageInputProps extends Omit<InputProps, 'onChange'> {
5
+ value?: string;
6
+ onChange?: (value: string) => void;
7
+ }
8
+ export declare const ImageInput: React.FC<ImageInputProps>;
9
+ export declare const BackgroundImageInput: React.FC<ImageInputProps>;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useContext } from 'react';
3
+ import { Input, Upload } from 'antd';
4
+ import { usePrefix, IconWidget } from '@thienvu18/designable-react';
5
+ import { SettingsFormContext } from '../../shared/context';
6
+ import cls from 'classnames';
7
+ import './styles.less';
8
+ export const ImageInput = ({ className, style, ...props }) => {
9
+ const prefix = usePrefix('image-input');
10
+ const context = useContext(SettingsFormContext);
11
+ return (_jsx("div", { className: cls(prefix, className), style: style, children: _jsx(Input, { ...props, onChange: (e) => {
12
+ props.onChange?.(e?.target?.['value']);
13
+ }, prefix: _jsx(Upload, { action: context.uploadAction, itemRender: () => null, maxCount: 1, onChange: (params) => {
14
+ const response = params.file?.response;
15
+ const url = response?.url ||
16
+ response?.downloadURL ||
17
+ response?.imageURL ||
18
+ response?.thumbUrl;
19
+ if (!url)
20
+ return;
21
+ props.onChange?.(url);
22
+ }, children: _jsx(IconWidget, { infer: "CloudUpload", style: { cursor: 'pointer' } }) }) }) }));
23
+ };
24
+ export const BackgroundImageInput = (props) => {
25
+ const addBgValue = (value) => {
26
+ if (/url\([^)]+\)/.test(value)) {
27
+ return value;
28
+ }
29
+ return `url(${value})`;
30
+ };
31
+ const removeBgValue = (value) => {
32
+ const matched = String(value).match(/url\(\s*([^)]+)\s*\)/);
33
+ if (matched?.[1]) {
34
+ return matched?.[1];
35
+ }
36
+ return value;
37
+ };
38
+ return (_jsx(ImageInput, { value: removeBgValue(props.value), onChange: (url) => {
39
+ props.onChange?.(addBgValue(url));
40
+ } }));
41
+ };
@@ -0,0 +1,3 @@
1
+ .dn-image-input {
2
+ width: 100%;
3
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import './styles.less';
3
+ export interface IInputItemsContext {
4
+ width?: string | number;
5
+ vertical?: boolean;
6
+ }
7
+ export interface IInputItemsProps {
8
+ className?: string;
9
+ style?: React.CSSProperties;
10
+ width?: string | number;
11
+ vertical?: boolean;
12
+ }
13
+ export interface IInputItemProps {
14
+ className?: string;
15
+ style?: React.CSSProperties;
16
+ icon?: React.ReactNode;
17
+ width?: string | number;
18
+ vertical?: boolean;
19
+ title?: React.ReactNode;
20
+ }
21
+ export declare const InputItems: React.FC<React.PropsWithChildren<IInputItemsProps>> & {
22
+ Item: React.FC<React.PropsWithChildren<IInputItemProps>>;
23
+ };
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useContext } from 'react';
3
+ import { usePrefix, IconWidget } from '@thienvu18/designable-react';
4
+ import cls from 'classnames';
5
+ import './styles.less';
6
+ const InputItemsContext = React.createContext(null);
7
+ export const InputItems = (props) => {
8
+ const { width = '100%', className, style, children } = props;
9
+ const prefix = usePrefix('input-items');
10
+ return (_jsx(InputItemsContext.Provider, { value: { width, vertical: props.vertical }, children: _jsx("div", { className: cls(prefix, className), style: style, children: children }) }));
11
+ };
12
+ InputItems.Item = (props) => {
13
+ const prefix = usePrefix('input-items-item');
14
+ const ctx = useContext(InputItemsContext);
15
+ return (_jsxs("div", { className: cls(prefix, props.className, {
16
+ vertical: props.vertical || ctx?.vertical,
17
+ }), style: { width: props.width || ctx?.width, ...props.style }, children: [props.icon && (_jsx("div", { className: prefix + '-icon', children: typeof props.icon === 'string' ? (_jsx(IconWidget, { infer: props.icon, size: 16 })) : (props.icon) })), props.title && _jsx("div", { className: prefix + '-title', children: props.title }), _jsx("div", { className: prefix + '-controller', children: props.children })] }));
18
+ };
@@ -0,0 +1,45 @@
1
+ @ant-prefix: ant;
2
+ .dn-input-items {
3
+ display: flex;
4
+ flex-wrap: wrap;
5
+ margin-left: -8px;
6
+
7
+ &-item {
8
+ display: flex;
9
+ align-items: center;
10
+ margin-bottom: 10px;
11
+ color: var(--dn-color-text, rgba(0, 0, 0, 0.88));
12
+ &-icon {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ margin: 0 8px;
17
+ flex-shrink: 0;
18
+ flex-grow: 0;
19
+ color: var(--dn-color-text, rgba(0, 0, 0, 0.88));
20
+ }
21
+
22
+ &-controller {
23
+ min-width: 0;
24
+ flex-shrink: 1;
25
+ flex-grow: 1;
26
+
27
+ .@{ant-prefix}-radio-group {
28
+ display: flex;
29
+
30
+ .@{ant-prefix}-radio-button-wrapper {
31
+ flex-grow: 1;
32
+ display: flex;
33
+ justify-content: center;
34
+ }
35
+ }
36
+ }
37
+ &.vertical {
38
+ flex-direction: column;
39
+ align-items: flex-start;
40
+ .dn-input-items-item-controller {
41
+ width: 100%;
42
+ }
43
+ }
44
+ }
45
+ }
@@ -0,0 +1 @@
1
+ export declare const initMonaco: () => void;
@@ -0,0 +1,39 @@
1
+ import { loader } from '@monaco-editor/react';
2
+ import chromeTheme from './themes/chrome';
3
+ import monokaiTheme from './themes/monokai';
4
+ import { format } from './format';
5
+ let initialized = false;
6
+ export const initMonaco = () => {
7
+ if (initialized)
8
+ return;
9
+ loader.init().then((monaco) => {
10
+ monaco.editor.defineTheme('monokai', monokaiTheme);
11
+ monaco.editor.defineTheme('chrome-devtools', chromeTheme);
12
+ monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
13
+ target: monaco.languages.typescript.ScriptTarget.Latest,
14
+ allowNonTsExtensions: true,
15
+ moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,
16
+ module: monaco.languages.typescript.ModuleKind.CommonJS,
17
+ noEmit: true,
18
+ esModuleInterop: true,
19
+ jsx: monaco.languages.typescript.JsxEmit.React,
20
+ reactNamespace: 'React',
21
+ allowJs: true,
22
+ });
23
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
24
+ noSemanticValidation: false,
25
+ noSyntaxValidation: true,
26
+ });
27
+ monaco.languages.registerDocumentFormattingEditProvider('typescript', {
28
+ async provideDocumentFormattingEdits(model) {
29
+ return [
30
+ {
31
+ text: await format(model['getDesignerLanguage']?.() || 'typescript', model.getValue()),
32
+ range: model.getFullModelRange(),
33
+ },
34
+ ];
35
+ },
36
+ });
37
+ initialized = true;
38
+ });
39
+ };
@@ -0,0 +1 @@
1
+ export declare const format: (language: string, source: string) => Promise<string>;