@node-projects/web-component-designer 0.1.353 → 0.2.2

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 (206) hide show
  1. package/dist/elements/controls/NumericStyleInput.d.ts +114 -2
  2. package/dist/elements/controls/NumericStyleInput.js +757 -30
  3. package/dist/elements/controls/NumericStyleInput.js.map +1 -1
  4. package/dist/elements/controls/NumericStyleInputValueHelpers.d.ts +14 -0
  5. package/dist/elements/controls/NumericStyleInputValueHelpers.js +31 -0
  6. package/dist/elements/controls/NumericStyleInputValueHelpers.js.map +1 -0
  7. package/dist/elements/documentContainer.js +1 -1
  8. package/dist/elements/documentContainer.js.map +1 -1
  9. package/dist/elements/helper/GridHelper.d.ts +41 -20
  10. package/dist/elements/helper/GridHelper.js +118 -19
  11. package/dist/elements/helper/GridHelper.js.map +1 -1
  12. package/dist/elements/helper/contextMenu/ContextMenu.js +3 -3
  13. package/dist/elements/helper/contextMenu/ContextMenu.js.map +1 -1
  14. package/dist/elements/helper/getBoxQuads.d.ts +2 -1
  15. package/dist/elements/helper/getBoxQuads.js +419 -154
  16. package/dist/elements/helper/getBoxQuads.js.map +1 -1
  17. package/dist/elements/item/DesignItem.js +46 -7
  18. package/dist/elements/item/DesignItem.js.map +1 -1
  19. package/dist/elements/services/DefaultServiceBootstrap.js +15 -12
  20. package/dist/elements/services/DefaultServiceBootstrap.js.map +1 -1
  21. package/dist/elements/services/InstanceServiceContainer.d.ts +20 -3
  22. package/dist/elements/services/InstanceServiceContainer.js +5 -3
  23. package/dist/elements/services/InstanceServiceContainer.js.map +1 -1
  24. package/dist/elements/services/ServiceContainer.d.ts +0 -2
  25. package/dist/elements/services/ServiceContainer.js.map +1 -1
  26. package/dist/elements/services/bindingsService/SpecialTagsBindingService.js +1 -1
  27. package/dist/elements/services/collaborationService/CollaborationNodeIndex.js +1 -1
  28. package/dist/elements/services/contentService/IContentChanged.js +10 -0
  29. package/dist/elements/services/contentService/IContentChanged.js.map +1 -1
  30. package/dist/elements/services/copyPasteService/PasteFormatSnapshot.d.ts +2 -1
  31. package/dist/elements/services/copyPasteService/PasteFormatSnapshot.js +14 -3
  32. package/dist/elements/services/copyPasteService/PasteFormatSnapshot.js.map +1 -1
  33. package/dist/elements/services/placementService/GridPlacementService.js +54 -70
  34. package/dist/elements/services/placementService/GridPlacementService.js.map +1 -1
  35. package/dist/elements/services/propertiesService/DefaultEditorTypesService.js +4 -6
  36. package/dist/elements/services/propertiesService/DefaultEditorTypesService.js.map +1 -1
  37. package/dist/elements/services/propertiesService/IProperty.d.ts +6 -1
  38. package/dist/elements/services/propertiesService/PropertyMutationHandling.d.ts +6 -0
  39. package/dist/elements/services/propertiesService/PropertyMutationHandling.js +89 -0
  40. package/dist/elements/services/propertiesService/PropertyMutationHandling.js.map +1 -0
  41. package/dist/elements/services/propertiesService/propertyEditors/BasePropertyEditor.d.ts +2 -0
  42. package/dist/elements/services/propertiesService/propertyEditors/BasePropertyEditor.js +12 -0
  43. package/dist/elements/services/propertiesService/propertyEditors/BasePropertyEditor.js.map +1 -1
  44. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditor.d.ts +1 -0
  45. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditor.js +2 -0
  46. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditor.js.map +1 -0
  47. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditorConfig.d.ts +3 -0
  48. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditorConfig.js +4 -0
  49. package/dist/elements/services/propertiesService/propertyEditors/CssLengthPropertyEditorConfig.js.map +1 -0
  50. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditor.d.ts +10 -0
  51. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditor.js +34 -0
  52. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditor.js.map +1 -0
  53. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditorConfig.d.ts +30 -0
  54. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditorConfig.js +475 -0
  55. package/dist/elements/services/propertiesService/propertyEditors/CssNumericPropertyEditorConfig.js.map +1 -0
  56. package/dist/elements/services/propertiesService/services/AbstractCssPropertiesService.d.ts +1 -0
  57. package/dist/elements/services/propertiesService/services/AbstractCssPropertiesService.js +4 -0
  58. package/dist/elements/services/propertiesService/services/AbstractCssPropertiesService.js.map +1 -1
  59. package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js +6 -4
  60. package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js.map +1 -1
  61. package/dist/elements/services/propertiesService/services/CssCustomPropertiesService.js +3 -3
  62. package/dist/elements/services/propertiesService/services/CssCustomPropertiesService.js.map +1 -1
  63. package/dist/elements/services/propertiesService/services/CssPropertiesService.js +3 -3
  64. package/dist/elements/services/propertiesService/services/CssPropertiesService.js.map +1 -1
  65. package/dist/elements/services/propertiesService/services/IJsonPropertyDefinition.d.ts +2 -0
  66. package/dist/elements/services/selectionService/SelectionService.js +1 -1
  67. package/dist/elements/services/undoService/ChangeGroup.d.ts +8 -4
  68. package/dist/elements/services/undoService/ChangeGroup.js +25 -4
  69. package/dist/elements/services/undoService/ChangeGroup.js.map +1 -1
  70. package/dist/elements/services/undoService/ITransactionItem.d.ts +3 -2
  71. package/dist/elements/services/undoService/ITransactionItem.js.map +1 -1
  72. package/dist/elements/services/undoService/UndoService.js +15 -8
  73. package/dist/elements/services/undoService/UndoService.js.map +1 -1
  74. package/dist/elements/services/undoService/transactionItems/AttributeAndPropertyChangeAction.d.ts +3 -2
  75. package/dist/elements/services/undoService/transactionItems/AttributeAndPropertyChangeAction.js +12 -8
  76. package/dist/elements/services/undoService/transactionItems/AttributeAndPropertyChangeAction.js.map +1 -1
  77. package/dist/elements/services/undoService/transactionItems/AttributeChangeAction.d.ts +3 -2
  78. package/dist/elements/services/undoService/transactionItems/AttributeChangeAction.js +12 -8
  79. package/dist/elements/services/undoService/transactionItems/AttributeChangeAction.js.map +1 -1
  80. package/dist/elements/services/undoService/transactionItems/CssStyleChangeAction.d.ts +3 -2
  81. package/dist/elements/services/undoService/transactionItems/CssStyleChangeAction.js +4 -2
  82. package/dist/elements/services/undoService/transactionItems/CssStyleChangeAction.js.map +1 -1
  83. package/dist/elements/services/undoService/transactionItems/DeleteAction.d.ts +3 -2
  84. package/dist/elements/services/undoService/transactionItems/DeleteAction.js +2 -2
  85. package/dist/elements/services/undoService/transactionItems/DeleteAction.js.map +1 -1
  86. package/dist/elements/services/undoService/transactionItems/InsertAction.d.ts +3 -2
  87. package/dist/elements/services/undoService/transactionItems/InsertAction.js +2 -2
  88. package/dist/elements/services/undoService/transactionItems/InsertAction.js.map +1 -1
  89. package/dist/elements/services/undoService/transactionItems/InsertChildAction.d.ts +3 -2
  90. package/dist/elements/services/undoService/transactionItems/InsertChildAction.js +3 -3
  91. package/dist/elements/services/undoService/transactionItems/InsertChildAction.js.map +1 -1
  92. package/dist/elements/services/undoService/transactionItems/PropertyChangeAction.d.ts +3 -2
  93. package/dist/elements/services/undoService/transactionItems/PropertyChangeAction.js +2 -0
  94. package/dist/elements/services/undoService/transactionItems/PropertyChangeAction.js.map +1 -1
  95. package/dist/elements/services/undoService/transactionItems/SelectionChangedAction.d.ts +3 -2
  96. package/dist/elements/services/undoService/transactionItems/SelectionChangedAction.js +2 -0
  97. package/dist/elements/services/undoService/transactionItems/SelectionChangedAction.js.map +1 -1
  98. package/dist/elements/services/undoService/transactionItems/SetDesignItemsAction.d.ts +3 -2
  99. package/dist/elements/services/undoService/transactionItems/SetDesignItemsAction.js +2 -0
  100. package/dist/elements/services/undoService/transactionItems/SetDesignItemsAction.js.map +1 -1
  101. package/dist/elements/services/undoService/transactionItems/StylesheetChangedAction.d.ts +3 -2
  102. package/dist/elements/services/undoService/transactionItems/StylesheetChangedAction.js +2 -0
  103. package/dist/elements/services/undoService/transactionItems/StylesheetChangedAction.js.map +1 -1
  104. package/dist/elements/services/undoService/transactionItems/TextContentChangeAction.d.ts +3 -2
  105. package/dist/elements/services/undoService/transactionItems/TextContentChangeAction.js +2 -0
  106. package/dist/elements/services/undoService/transactionItems/TextContentChangeAction.js.map +1 -1
  107. package/dist/elements/widgets/designerView/DomConverter.d.ts +1 -1
  108. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +0 -2
  109. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
  110. package/dist/elements/widgets/designerView/designerCanvas.js +14 -7
  111. package/dist/elements/widgets/designerView/designerCanvas.js.map +1 -1
  112. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -1
  113. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +20 -18
  114. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js.map +1 -1
  115. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
  116. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
  117. package/dist/elements/widgets/designerView/extensions/ExtensionType.js.map +1 -1
  118. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -1
  119. package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +19 -10
  120. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +179 -52
  121. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js.map +1 -1
  122. package/dist/elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js +1 -1
  123. package/dist/elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js.map +1 -1
  124. package/dist/elements/widgets/designerView/extensions/contextMenu/BasicContextMenu.d.ts +15 -0
  125. package/dist/elements/widgets/designerView/extensions/contextMenu/BasicContextMenu.js +15 -0
  126. package/dist/elements/widgets/designerView/extensions/contextMenu/BasicContextMenu.js.map +1 -0
  127. package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu copy.d.ts +11 -0
  128. package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu copy.js +16 -0
  129. package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu copy.js.map +1 -0
  130. package/dist/elements/widgets/designerView/extensions/contextMenu/PasteFormatContextMenu.js +1 -0
  131. package/dist/elements/widgets/designerView/extensions/contextMenu/PasteFormatContextMenu.js.map +1 -1
  132. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtension.d.ts +11 -0
  133. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtension.js +20 -0
  134. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtension.js.map +1 -0
  135. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtensionProvider.d.ts +11 -0
  136. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtensionProvider.js +18 -0
  137. package/dist/elements/widgets/designerView/extensions/flex/FlexboxExtensionProvider.js.map +1 -0
  138. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +10 -12
  139. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js.map +1 -1
  140. package/dist/elements/widgets/designerView/extensions/grid/EditGridColumnRowSizesExtension.d.ts +1 -0
  141. package/dist/elements/widgets/designerView/extensions/grid/EditGridColumnRowSizesExtension.js +16 -13
  142. package/dist/elements/widgets/designerView/extensions/grid/EditGridColumnRowSizesExtension.js.map +1 -1
  143. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.js +6 -39
  144. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.js.map +1 -1
  145. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtension.d.ts +33 -0
  146. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtension.js +337 -0
  147. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtension.js.map +1 -0
  148. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtensionProvider.d.ts +10 -0
  149. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtensionProvider.js +22 -0
  150. package/dist/elements/widgets/designerView/extensions/transforms/ProjectiveTransformExtensionProvider.js.map +1 -0
  151. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtension.d.ts +16 -0
  152. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtension.js +109 -0
  153. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtension.js.map +1 -0
  154. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtensionProvider.d.ts +12 -0
  155. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtensionProvider.js +25 -0
  156. package/dist/elements/widgets/designerView/extensions/transforms/RotateExtensionProvider.js.map +1 -0
  157. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtension.d.ts +29 -0
  158. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtension.js +229 -0
  159. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtension.js.map +1 -0
  160. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtensionProvider.d.ts +10 -0
  161. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtensionProvider.js +20 -0
  162. package/dist/elements/widgets/designerView/extensions/transforms/RotateGroupExtensionProvider.js.map +1 -0
  163. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtension.d.ts +30 -0
  164. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtension.js +291 -0
  165. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtension.js.map +1 -0
  166. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtensionProvider.d.ts +10 -0
  167. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtensionProvider.js +20 -0
  168. package/dist/elements/widgets/designerView/extensions/transforms/SkewExtensionProvider.js.map +1 -0
  169. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtension.d.ts +16 -0
  170. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtension.js +122 -0
  171. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtension.js.map +1 -0
  172. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtensionProvider.d.ts +12 -0
  173. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtensionProvider.js +34 -0
  174. package/dist/elements/widgets/designerView/extensions/transforms/TransformOriginExtensionProvider.js.map +1 -0
  175. package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -2
  176. package/dist/elements/widgets/designerView/tools/PointerTool.js.map +1 -1
  177. package/dist/elements/widgets/miniatureView/miniatureView.js +1 -1
  178. package/dist/elements/widgets/miniatureView/miniatureView.js.map +1 -1
  179. package/dist/elements/widgets/propertyGrid/PropertyGrid.d.ts +3 -3
  180. package/dist/elements/widgets/propertyGrid/PropertyGrid.js +7 -7
  181. package/dist/elements/widgets/propertyGrid/PropertyGrid.js.map +1 -1
  182. package/dist/elements/widgets/propertyGrid/PropertyGridMutationHandling.d.ts +5 -0
  183. package/dist/elements/widgets/propertyGrid/PropertyGridMutationHandling.js +13 -0
  184. package/dist/elements/widgets/propertyGrid/PropertyGridMutationHandling.js.map +1 -0
  185. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.d.ts +2 -0
  186. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js +45 -24
  187. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyList.js.map +1 -1
  188. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyStructureSignature.d.ts +4 -0
  189. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyStructureSignature.js +31 -0
  190. package/dist/elements/widgets/propertyGrid/PropertyGridPropertyStructureSignature.js.map +1 -0
  191. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.d.ts +1 -0
  192. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +52 -42
  193. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js.map +1 -1
  194. package/dist/elements/widgets/treeView/treeView.js +3 -3
  195. package/dist/elements/widgets/treeView/treeView.js.map +1 -1
  196. package/dist/index-min.js +7 -7
  197. package/dist/index-min.js.map +4 -4
  198. package/dist/index.d.ts +16 -15
  199. package/dist/index.js +16 -13
  200. package/dist/index.js.map +1 -1
  201. package/package.json +1 -1
  202. package/tests/ContextMenu.test.ts +0 -133
  203. package/tests/CssCombiner.test.ts +0 -340
  204. package/tests/PasteFormatSnapshot.test.ts +0 -92
  205. package/tests/PathDataPolyfill.test.ts +0 -49
  206. package/tests/SpecificityCalculator.test.ts +0 -625
@@ -1,340 +0,0 @@
1
- import { afterAll, afterEach, beforeAll, beforeEach, expect, test } from '@jest/globals';
2
-
3
- const camelToDashCase = (text: string) => text.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`);
4
-
5
- const compressBoxValues = (top: string, right: string, bottom: string, left: string) => {
6
- if (top === right && top === bottom && top === left)
7
- return top;
8
- if (top === bottom && right === left)
9
- return `${top} ${right}`;
10
- if (right === left)
11
- return `${top} ${right} ${bottom}`;
12
- return `${top} ${right} ${bottom} ${left}`;
13
- };
14
-
15
- const expandBoxValues = (value: string) => {
16
- const values = value.trim().split(/\s+/);
17
- if (values.length === 1)
18
- return [values[0], values[0], values[0], values[0]];
19
- if (values.length === 2)
20
- return [values[0], values[1], values[0], values[1]];
21
- if (values.length === 3)
22
- return [values[0], values[1], values[2], values[1]];
23
- return [values[0], values[1], values[2], values[3]];
24
- };
25
-
26
- class FakeStyleStore {
27
- private declarations = new Map<string, string>();
28
-
29
- reset() {
30
- this.declarations.clear();
31
- }
32
-
33
- setProperty(name: string, value: string) {
34
- this.declarations.set(name, value);
35
- }
36
-
37
- getPropertyValue(name: string) {
38
- const directValue = this.declarations.get(name);
39
- if (directValue != null)
40
- return directValue;
41
-
42
- const boxSideMap: Record<string, [string, number]> = {
43
- 'margin-top': ['margin', 0],
44
- 'margin-right': ['margin', 1],
45
- 'margin-bottom': ['margin', 2],
46
- 'margin-left': ['margin', 3],
47
- 'padding-top': ['padding', 0],
48
- 'padding-right': ['padding', 1],
49
- 'padding-bottom': ['padding', 2],
50
- 'padding-left': ['padding', 3],
51
- 'top': ['inset', 0],
52
- 'right': ['inset', 1],
53
- 'bottom': ['inset', 2],
54
- 'left': ['inset', 3],
55
- 'border-top-width': ['border-width', 0],
56
- 'border-right-width': ['border-width', 1],
57
- 'border-bottom-width': ['border-width', 2],
58
- 'border-left-width': ['border-width', 3],
59
- 'border-top-style': ['border-style', 0],
60
- 'border-right-style': ['border-style', 1],
61
- 'border-bottom-style': ['border-style', 2],
62
- 'border-left-style': ['border-style', 3],
63
- 'border-top-color': ['border-color', 0],
64
- 'border-right-color': ['border-color', 1],
65
- 'border-bottom-color': ['border-color', 2],
66
- 'border-left-color': ['border-color', 3]
67
- };
68
-
69
- const boxSide = boxSideMap[name];
70
- if (boxSide) {
71
- const boxValue = this.declarations.get(boxSide[0]);
72
- if (boxValue != null)
73
- return expandBoxValues(boxValue)[boxSide[1]];
74
- }
75
-
76
- const gap = this.declarations.get('gap');
77
- if (gap && (name === 'row-gap' || name === 'column-gap')) {
78
- const [rowGap, columnGap = rowGap] = gap.trim().split(/\s+/, 2);
79
- return name === 'row-gap' ? rowGap : columnGap;
80
- }
81
-
82
- const flexFlow = this.declarations.get('flex-flow');
83
- if (flexFlow && (name === 'flex-direction' || name === 'flex-wrap')) {
84
- const [flexDirection = '', flexWrap = ''] = flexFlow.trim().split(/\s+/, 2);
85
- return name === 'flex-direction' ? flexDirection : flexWrap;
86
- }
87
-
88
- const placeContent = this.declarations.get('place-content');
89
- if (placeContent && (name === 'align-content' || name === 'justify-content')) {
90
- const [alignContent = '', justifyContent = alignContent] = placeContent.trim().split(/\s+/, 2);
91
- return name === 'align-content' ? alignContent : justifyContent;
92
- }
93
-
94
- return '';
95
- }
96
-
97
- get cssText() {
98
- const serialized: [string, string][] = [];
99
- const consumed = new Set<string>();
100
- const get = (name: string) => this.declarations.get(name);
101
-
102
- const append = (name: string, value: string, consumedNames: string[] = [name]) => {
103
- serialized.push([name, value]);
104
- for (const consumedName of consumedNames)
105
- consumed.add(consumedName);
106
- };
107
-
108
- const appendDirect = (name: string) => {
109
- const value = get(name);
110
- if (value)
111
- append(name, value);
112
- };
113
-
114
- appendDirect('border');
115
- appendDirect('border-width');
116
- appendDirect('border-style');
117
- appendDirect('border-color');
118
- appendDirect('background');
119
- appendDirect('font');
120
-
121
- const marginTop = get('margin-top');
122
- const marginRight = get('margin-right');
123
- const marginBottom = get('margin-bottom');
124
- const marginLeft = get('margin-left');
125
- if (!consumed.has('margin') && marginTop && marginRight && marginBottom && marginLeft)
126
- append('margin', compressBoxValues(marginTop, marginRight, marginBottom, marginLeft), ['margin-top', 'margin-right', 'margin-bottom', 'margin-left']);
127
-
128
- const paddingTop = get('padding-top');
129
- const paddingRight = get('padding-right');
130
- const paddingBottom = get('padding-bottom');
131
- const paddingLeft = get('padding-left');
132
- if (!consumed.has('padding') && paddingTop && paddingRight && paddingBottom && paddingLeft)
133
- append('padding', compressBoxValues(paddingTop, paddingRight, paddingBottom, paddingLeft), ['padding-top', 'padding-right', 'padding-bottom', 'padding-left']);
134
-
135
- const top = get('top');
136
- const right = get('right');
137
- const bottom = get('bottom');
138
- const left = get('left');
139
- if (!consumed.has('inset') && top && right && bottom && left)
140
- append('inset', compressBoxValues(top, right, bottom, left), ['top', 'right', 'bottom', 'left']);
141
-
142
- const rowGap = get('row-gap');
143
- const columnGap = get('column-gap');
144
- if (rowGap && columnGap)
145
- append('gap', `${rowGap} ${columnGap}`, ['row-gap', 'column-gap']);
146
-
147
- const flexDirection = get('flex-direction');
148
- const flexWrap = get('flex-wrap');
149
- if (flexDirection && flexWrap)
150
- append('flex-flow', `${flexDirection} ${flexWrap}`, ['flex-direction', 'flex-wrap']);
151
-
152
- const alignContent = get('align-content');
153
- const justifyContent = get('justify-content');
154
- if (alignContent && justifyContent)
155
- append('place-content', `${alignContent} ${justifyContent}`, ['align-content', 'justify-content']);
156
-
157
- const borderTop = get('border-top');
158
- const borderLeft = get('border-left');
159
- const borderStyle = get('border-style');
160
- if (borderStyle && (borderTop || borderLeft)) {
161
- const [topStyle, rightStyle, bottomStyle, leftStyle] = expandBoxValues(borderStyle);
162
- if (borderTop && topStyle)
163
- append('border-top', `${borderTop} ${topStyle}`.trim(), ['border-top']);
164
- if (borderLeft && leftStyle)
165
- append('border-left', `${borderLeft} ${leftStyle}`.trim(), ['border-left']);
166
- if (rightStyle)
167
- append('border-right-style', rightStyle, ['border-style']);
168
- if (bottomStyle)
169
- append('border-bottom-style', bottomStyle, ['border-style']);
170
- }
171
-
172
- for (const [name, value] of this.declarations) {
173
- if (!consumed.has(name) && !serialized.some(x => x[0] === name))
174
- append(name, value);
175
- }
176
-
177
- return serialized.map(([name, value]) => `${name}: ${value};`).join(' ');
178
- }
179
- }
180
-
181
- const createFakeStyle = () => {
182
- const store = new FakeStyleStore();
183
- return new Proxy(store as any, {
184
- get(target, prop) {
185
- if (typeof prop === 'string' && !(prop in target))
186
- return target.getPropertyValue(camelToDashCase(prop));
187
-
188
- const value = target[prop];
189
- return typeof value === 'function' ? value.bind(target) : value;
190
- },
191
- set(target, prop, value) {
192
- if (typeof prop === 'string' && !(prop in target)) {
193
- target.setProperty(camelToDashCase(prop), String(value));
194
- return true;
195
- }
196
-
197
- target[prop] = value;
198
- return true;
199
- }
200
- });
201
- };
202
-
203
- class FakeHelperElement {
204
- style = createFakeStyle();
205
-
206
- setAttribute(name: string, value: string) {
207
- if (name === 'style' && value === '')
208
- this.style.reset();
209
- }
210
- }
211
-
212
- let CssCombiner: typeof import('../src/elements/helper/CssCombiner').CssCombiner;
213
- let originalDocument: unknown;
214
- let originalHelperElement: unknown;
215
-
216
- beforeAll(async () => {
217
- originalDocument = (<any>globalThis).document;
218
- (<any>globalThis).document = {
219
- createElement: () => new FakeHelperElement()
220
- };
221
-
222
- ({ CssCombiner } = await import('../src/elements/helper/CssCombiner'));
223
- });
224
-
225
- afterAll(() => {
226
- (<any>globalThis).document = originalDocument;
227
- });
228
-
229
- beforeEach(() => {
230
- originalHelperElement = (<any>CssCombiner)._helperElement;
231
- (<any>CssCombiner)._helperElement = new FakeHelperElement();
232
- });
233
-
234
- afterEach(() => {
235
- (<any>CssCombiner)._helperElement = originalHelperElement;
236
- });
237
-
238
- const combine = (styles: Record<string, string>, globalStyles?: Record<string, string>) =>
239
- CssCombiner.combine(
240
- new Map(Object.entries(styles)),
241
- globalStyles ? new Map(Object.entries(globalStyles)) : undefined
242
- );
243
-
244
- test('combines border and font longhands into shorthand declarations', () => {
245
- const result = combine({
246
- 'border-top-style': 'solid',
247
- 'border-right-style': 'solid',
248
- 'border-bottom-style': 'solid',
249
- 'border-left-style': 'solid',
250
- 'border-top-color': 'red',
251
- 'border-right-color': 'red',
252
- 'border-bottom-color': 'red',
253
- 'border-left-color': 'red',
254
- 'border-top-width': '1px',
255
- 'border-right-width': '1px',
256
- 'border-bottom-width': '1px',
257
- 'border-left-width': '1px',
258
- 'font-style': 'italic',
259
- 'font-weight': '700',
260
- 'font-size': '16px',
261
- 'line-height': '24px',
262
- 'font-family': '"Fira Code", monospace'
263
- });
264
-
265
- expect(result.get('border')).toBe('1px solid red');
266
- expect(result.has('border-top-width')).toBe(false);
267
- expect(result.has('border-right-width')).toBe(false);
268
- expect(result.has('border-bottom-width')).toBe(false);
269
- expect(result.has('border-left-width')).toBe(false);
270
-
271
- const font = result.get('font');
272
- expect(font).toContain('italic');
273
- expect(font).toContain('700');
274
- expect(font).toContain('16px');
275
- expect(font).toContain('24px');
276
- expect(font).toContain('Fira Code');
277
- expect(result.has('font-style')).toBe(false);
278
- expect(result.has('font-weight')).toBe(false);
279
- expect(result.has('font-size')).toBe(false);
280
- expect(result.has('line-height')).toBe(false);
281
- expect(result.has('font-family')).toBe(false);
282
- });
283
-
284
- test('combines additional browser-supported shorthand groups through CSSOM serialization', () => {
285
- const result = combine({
286
- 'row-gap': '4px',
287
- 'column-gap': '8px',
288
- 'flex-direction': 'column',
289
- 'flex-wrap': 'wrap',
290
- 'align-content': 'center',
291
- 'justify-content': 'space-between'
292
- });
293
-
294
- expect(result.get('gap')).toBe('4px 8px');
295
- expect(result.get('flex-flow')).toBe('column wrap');
296
- expect(result.get('place-content')).toBe('center space-between');
297
-
298
- expect(result.has('row-gap')).toBe(false);
299
- expect(result.has('column-gap')).toBe(false);
300
- expect(result.has('flex-direction')).toBe(false);
301
- expect(result.has('flex-wrap')).toBe(false);
302
- expect(result.has('align-content')).toBe(false);
303
- expect(result.has('justify-content')).toBe(false);
304
- });
305
-
306
- test('keeps custom properties and removes shorthand declarations that match global styles', () => {
307
- const result = combine({
308
- '--brand-color': '#c00',
309
- 'row-gap': '4px',
310
- 'column-gap': '8px'
311
- }, {
312
- 'gap': '4px 8px'
313
- });
314
-
315
- expect(result.get('--brand-color')).toBe('#c00');
316
- expect(result.has('gap')).toBe(false);
317
- });
318
-
319
- test('parses cssText declarations with semicolons inside urls', () => {
320
- const result = (<any>CssCombiner).parseStyleDeclarationList(
321
- 'background: url("data:image/svg+xml;utf8,<svg viewBox=\\"0 0 1 1\\"></svg>") no-repeat center / cover; color: red;'
322
- );
323
-
324
- expect(result.get('background')).toBe('url("data:image/svg+xml;utf8,<svg viewBox=\\"0 0 1 1\\"></svg>") no-repeat center / cover');
325
- expect(result.get('color')).toBe('red');
326
- });
327
-
328
- test('does not replace declarations with longer browser cssText expansions', () => {
329
- const result = combine({
330
- 'border-top': '4px',
331
- 'border-left': '2px',
332
- 'border-style': 'solid'
333
- });
334
-
335
- expect(result.get('border-top')).toBe('4px');
336
- expect(result.get('border-left')).toBe('2px');
337
- expect(result.get('border-style')).toBe('solid');
338
- expect(result.has('border-right-style')).toBe(false);
339
- expect(result.has('border-bottom-style')).toBe(false);
340
- });
@@ -1,92 +0,0 @@
1
- import { expect, test } from '@jest/globals';
2
- import { createPasteFormatSnapshot, createPasteFormatSnapshotFromEntries, getPasteFormatEntries } from '../src/elements/services/copyPasteService/PasteFormatSnapshot';
3
-
4
- test('collects border, background, and text properties and skips unrelated styles', () => {
5
- const values: Record<string, string> = {
6
- 'background-color': ' rgb(1, 2, 3) ',
7
- 'border-top-color': ' red ',
8
- 'border-top-style': ' solid ',
9
- 'font-family': ' Fira Code ',
10
- 'line-height': ' 24px ',
11
- 'color': ' white ',
12
- 'display': ' grid '
13
- };
14
-
15
- const fakeStyle = {
16
- length: 7,
17
- 0: 'background-color',
18
- 1: 'border-top-color',
19
- 2: 'border-top-style',
20
- 3: 'font-family',
21
- 4: 'line-height',
22
- 5: 'color',
23
- 6: 'display',
24
- getPropertyValue(name: string) {
25
- return values[name] ?? '';
26
- }
27
- } as Pick<CSSStyleDeclaration, 'getPropertyValue' | 'length'> & ArrayLike<string>;
28
-
29
- const snapshot = createPasteFormatSnapshot(fakeStyle);
30
-
31
- expect(snapshot.background).toEqual([{ name: 'background-color', value: 'rgb(1, 2, 3)' }]);
32
- expect(snapshot.border).toEqual([
33
- { name: 'border-top-color', value: 'red' },
34
- { name: 'border-top-style', value: 'solid' }
35
- ]);
36
- expect(snapshot.text).toEqual([
37
- { name: 'font-family', value: 'Fira Code' },
38
- { name: 'line-height', value: '24px' },
39
- { name: 'color', value: 'white' }
40
- ]);
41
- expect(getPasteFormatEntries(snapshot, 'all')).toEqual([
42
- { name: 'border-top-color', value: 'red' },
43
- { name: 'border-top-style', value: 'solid' },
44
- { name: 'background-color', value: 'rgb(1, 2, 3)' },
45
- { name: 'font-family', value: 'Fira Code' },
46
- { name: 'line-height', value: '24px' },
47
- { name: 'color', value: 'white' }
48
- ]);
49
- });
50
-
51
- test('keeps duplicate properties out of the all group', () => {
52
- const values: Record<string, string> = {
53
- 'background-image': 'none',
54
- 'background-color': 'transparent',
55
- 'background-color-duplicate': ''
56
- };
57
-
58
- const fakeStyle = {
59
- length: 4,
60
- 0: 'background-image',
61
- 1: 'background-color',
62
- 2: 'background-image',
63
- 3: 'background-color-duplicate',
64
- getPropertyValue(name: string) {
65
- return values[name] ?? '';
66
- }
67
- } as Pick<CSSStyleDeclaration, 'getPropertyValue' | 'length'> & ArrayLike<string>;
68
-
69
- const snapshot = createPasteFormatSnapshot(fakeStyle);
70
-
71
- expect(snapshot.background).toEqual([
72
- { name: 'background-image', value: 'none' },
73
- { name: 'background-color', value: 'transparent' }
74
- ]);
75
- expect(snapshot.all).toEqual(snapshot.background);
76
- });
77
-
78
- test('creates a snapshot from design item style entries', () => {
79
- const snapshot = createPasteFormatSnapshotFromEntries([
80
- ['border-top-color', ' red '],
81
- ['background-color', ' rgb(1, 2, 3) '],
82
- ['font-family', ' Fira Code '],
83
- ['color', ' white ']
84
- ]);
85
-
86
- expect(snapshot?.border).toEqual([{ name: 'border-top-color', value: 'red' }]);
87
- expect(snapshot?.background).toEqual([{ name: 'background-color', value: 'rgb(1, 2, 3)' }]);
88
- expect(snapshot?.text).toEqual([
89
- { name: 'font-family', value: 'Fira Code' },
90
- { name: 'color', value: 'white' }
91
- ]);
92
- });
@@ -1,49 +0,0 @@
1
- import { afterAll, beforeAll, expect, test } from '@jest/globals';
2
-
3
- const svgElementGlobals = [
4
- 'SVGPathElement',
5
- 'SVGRectElement',
6
- 'SVGCircleElement',
7
- 'SVGEllipseElement',
8
- 'SVGLineElement',
9
- 'SVGPolylineElement',
10
- 'SVGPolygonElement'
11
- ] as const;
12
-
13
- type SvgElementGlobalName = (typeof svgElementGlobals)[number];
14
-
15
- let straightenLine: typeof import('../src/elements/helper/PathDataPolyfill').straightenLine;
16
- const originalGlobals = new Map<SvgElementGlobalName, unknown>();
17
-
18
- beforeAll(async () => {
19
- for (const globalName of svgElementGlobals) {
20
- originalGlobals.set(globalName, (<any>globalThis)[globalName]);
21
- (<any>globalThis)[globalName] = class { };
22
- }
23
-
24
- ({ straightenLine } = await import('../src/elements/helper/PathDataPolyfill'));
25
- });
26
-
27
- afterAll(() => {
28
- for (const globalName of svgElementGlobals) {
29
- const originalGlobal = originalGlobals.get(globalName);
30
- if (originalGlobal === undefined)
31
- delete (<any>globalThis)[globalName];
32
- else
33
- (<any>globalThis)[globalName] = originalGlobal;
34
- }
35
- });
36
-
37
- test('straightenLine keeps upward vertical snap upward', () => {
38
- const result = straightenLine({ x: 10, y: 10 }, { x: 10, y: 0 }, 90);
39
-
40
- expect(result.x).toBeCloseTo(10);
41
- expect(result.y).toBeCloseTo(0);
42
- });
43
-
44
- test('straightenLine keeps downward vertical snap downward', () => {
45
- const result = straightenLine({ x: 10, y: 10 }, { x: 10, y: 25 }, 90);
46
-
47
- expect(result.x).toBeCloseTo(10);
48
- expect(result.y).toBeCloseTo(25);
49
- });