@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,56 +1,783 @@
1
1
  import { BaseCustomWebComponentConstructorAppend, css, html, TypedEvent } from '@node-projects/base-custom-webcomponent';
2
+ import { combineNumericStyleInputValue, formatNumericStyleInputNumber, parseNumericStyleInputValue } from './NumericStyleInputValueHelpers.js';
3
+ export { parseNumericStyleInputValue, formatNumericStyleInputNumber, combineNumericStyleInputValue } from './NumericStyleInputValueHelpers.js';
4
+ const customOptionValue = '__node-projects-custom-value__';
5
+ const dragHandleGlyph = '⋮';
2
6
  export class NumericStyleInput extends BaseCustomWebComponentConstructorAppend {
3
7
  static style = css `
4
8
  :host {
9
+ display: block;
10
+ width: 100%;
11
+ min-width: 0;
5
12
  }
6
13
 
7
- input {
8
- cursor: ew-resize;
14
+ #container {
15
+ display: grid;
16
+ gap: 0;
17
+ grid-template-columns: minmax(0, 1fr) auto 16px;
18
+ width: 100%;
19
+ height: 24px;
20
+ align-items: stretch;
21
+ }
22
+
23
+ #value-wrapper {
24
+ display: grid;
25
+ grid-template-columns: 14px minmax(0, 1fr);
26
+ min-width: 0;
27
+ }
28
+
29
+ #scrubber,
30
+ #input,
31
+ #select,
32
+ #stepper button {
33
+ /* border: 1px solid var(--input-border-color, #596c7a); */
34
+ border: none;
35
+ box-sizing: border-box;
36
+ height: 24px;
37
+ min-height: 24px;
38
+ background: transparent;
39
+ color: inherit;
40
+ font: inherit;
41
+ outline: none;
42
+ box-shadow: none;
43
+ }
44
+
45
+ #scrubber,
46
+ #stepper button {
47
+ padding: 0;
48
+ line-height: 1;
49
+ }
50
+
51
+ #scrubber {
52
+ border-right: 0;
53
+ cursor: ns-resize;
54
+ font-size: 11px;
55
+ letter-spacing: -1px;
56
+ }
57
+
58
+ #input {
59
+ border-left: 0;
60
+ border-right: 0;
61
+ min-width: 0;
62
+ text-align: right;
63
+ }
64
+
65
+ #input:focus,
66
+ #select:focus,
67
+ #scrubber:focus,
68
+ #stepper button:focus {
69
+ outline: none;
70
+ box-shadow: none;
71
+ border-color: var(--input-border-color, #596c7a);
72
+ }
73
+
74
+ #input[disabled],
75
+ #scrubber[disabled] {
76
+ cursor: default;
77
+ }
78
+
79
+ #input[disabled] {
80
+ color: inherit;
81
+ opacity: 1;
82
+ -webkit-text-fill-color: currentColor;
83
+ }
84
+
85
+ #select {
86
+ border-left: 0;
87
+ padding: 0 15px 0 2px;
88
+ line-height: 1;
89
+ -webkit-appearance: none;
90
+ appearance: none;
91
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='4'%3E%3Cpath d='M0 0l4 4 4-4z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 2px center;
92
+ }
93
+
94
+ #measure {
95
+ position: absolute;
96
+ visibility: hidden;
97
+ white-space: nowrap;
98
+ font: inherit;
99
+ pointer-events: none;
100
+ }
101
+
102
+ #stepper {
103
+ display: grid;
104
+ height: 24px;
105
+ min-height: 24px;
106
+ overflow: hidden;
107
+ grid-template-rows: repeat(2, minmax(0, 1fr));
108
+ }
109
+
110
+ #stepper button {
111
+ height: auto;
112
+ min-height: 0;
113
+ width: 16px;
114
+ min-width: 16px;
115
+ font-size: 10px;
9
116
  }
10
117
  `;
11
118
  static template = html `
12
- <input id="input" type="text">
13
- <select id="select">
14
- <option>px</option>
15
- <option>%</option>
16
- <option>pt</option>
17
- </select>
119
+ <div id="container">
120
+ <div id="value-wrapper">
121
+ <button id="scrubber" type="button" aria-label="Drag to change value">${dragHandleGlyph}</button>
122
+ <input id="input" type="text" spellcheck="false">
123
+ </div>
124
+ <select id="select"></select>
125
+ <div id="stepper">
126
+ <button id="increase" type="button" aria-label="Increase value">+</button>
127
+ <button id="decrease" type="button" aria-label="Decrease value">-</button>
128
+ </div>
129
+ <span id="measure"></span>
130
+ </div>
18
131
  `;
19
- _value;
132
+ _value = '';
20
133
  get value() {
21
134
  return this._value;
22
135
  }
23
136
  set value(value) {
24
- const oldValue = this._value;
25
- this._value = value;
26
- this._updateValue();
27
- this.valueChanged.emit({ newValue: this._value, oldValue: oldValue });
137
+ this._setValue(value, false, false);
28
138
  }
29
139
  valueChanged = new TypedEvent();
140
+ valuePreviewChanged = new TypedEvent();
141
+ valuePreviewFinished = new TypedEvent();
142
+ _units = ['px', '%', 'pt'];
143
+ get units() {
144
+ return [...this._units];
145
+ }
146
+ set units(value) {
147
+ this._units = this._normalizeOptionValues(value);
148
+ this._lastNumericUnit = this._units[0] ?? this._lastNumericUnit;
149
+ this._updateValue();
150
+ }
151
+ _fixedValues = [];
152
+ get fixedValues() {
153
+ return [...this._fixedValues];
154
+ }
155
+ set fixedValues(value) {
156
+ this._fixedValues = this._normalizeOptionValues(value);
157
+ this._updateValue();
158
+ }
159
+ _step = 1;
160
+ get step() {
161
+ return this._step;
162
+ }
163
+ set step(value) {
164
+ this._step = Number.isFinite(value) && value > 0 ? value : 1;
165
+ }
166
+ _unitSteps = {};
167
+ get unitSteps() {
168
+ return { ...this._unitSteps };
169
+ }
170
+ set unitSteps(value) {
171
+ this._unitSteps = value ?? {};
172
+ }
173
+ _min = null;
174
+ get min() {
175
+ return this._min;
176
+ }
177
+ set min(value) {
178
+ this._min = Number.isFinite(value) ? value : null;
179
+ }
180
+ _max = null;
181
+ get max() {
182
+ return this._max;
183
+ }
184
+ set max(value) {
185
+ this._max = Number.isFinite(value) ? value : null;
186
+ }
187
+ _readOnly = false;
188
+ get readOnly() {
189
+ return this._readOnly;
190
+ }
191
+ set readOnly(value) {
192
+ this._readOnly = value;
193
+ this._applyReadonlyState();
194
+ }
195
+ get isInPreview() {
196
+ return this._previewStartValue != null;
197
+ }
198
+ _allowCustomValue = true;
199
+ get allowCustomValue() {
200
+ return this._allowCustomValue;
201
+ }
202
+ set allowCustomValue(value) {
203
+ this._allowCustomValue = value;
204
+ this._updateValue();
205
+ }
206
+ _unitValueConverter;
207
+ get unitValueConverter() {
208
+ return this._unitValueConverter;
209
+ }
210
+ set unitValueConverter(value) {
211
+ this._unitValueConverter = value;
212
+ }
30
213
  _input;
31
- //private _select: HTMLSelectElement;
214
+ _select;
215
+ _measure;
216
+ _scrubberButton;
217
+ _increaseButton;
218
+ _decreaseButton;
219
+ _lastNumericValue = 0;
220
+ _lastNumericUnit = 'px';
221
+ _dragPointerId = null;
222
+ _dragStartY = 0;
223
+ _dragStartNumericValue = 0;
224
+ _appliedDragSteps = 0;
225
+ _previewStartValue = null;
226
+ _previewChanged = false;
227
+ _displayValueLock = null;
228
+ _stepperPointerId = null;
229
+ _stepperDirection = 0;
230
+ _stepperRepeatTimeout = null;
231
+ _stepperRepeatInterval = null;
232
+ _windowDragPointerMoveHandler = (event) => this._handleWindowDragPointerMove(event);
233
+ _windowDragPointerUpHandler = (event) => this._finishDragInteractionForPointerEvent(event, false);
234
+ _windowDragPointerCancelHandler = (event) => this._finishDragInteractionForPointerEvent(event, true);
235
+ _windowDragBlurHandler = () => this._finishDragInteraction(false);
236
+ _windowPointerUpHandler = (event) => this._handleWindowStepperPointerEnd(event);
237
+ _windowPointerCancelHandler = (event) => this._handleWindowStepperPointerEnd(event);
238
+ _windowBlurHandler = () => this._finishStepperInteraction(false);
239
+ _preferCustomMode = false;
32
240
  constructor() {
33
241
  super();
242
+ this._restoreCachedInititalValues();
34
243
  this._input = this._getDomElement('input');
35
- //this._select = this._getDomElement<HTMLSelectElement>('select');
36
- let oldX = null;
37
- this._input.onpointerdown = (e) => {
38
- oldX = e.x;
39
- this._input.setPointerCapture(e.pointerId);
40
- };
41
- this._input.onpointermove = (e) => {
42
- if (oldX !== null) {
43
- let diffX = e.x - oldX;
44
- if (diffX != 0)
45
- this._input.value = parseInt(this._input.value) + diffX;
244
+ this._select = this._getDomElement('select');
245
+ this._measure = this._getDomElement('measure');
246
+ this._scrubberButton = this._getDomElement('scrubber');
247
+ this._increaseButton = this._getDomElement('increase');
248
+ this._decreaseButton = this._getDomElement('decrease');
249
+ }
250
+ ready() {
251
+ this._parseAttributesToProperties();
252
+ this._wireEvents();
253
+ this._updateValue();
254
+ }
255
+ _wireEvents() {
256
+ this._input.addEventListener('change', () => this._applyTypedValue());
257
+ this._input.addEventListener('keydown', e => {
258
+ if (e.key === 'Enter') {
259
+ this._applyTypedValue();
260
+ this._input.blur();
46
261
  }
47
- };
48
- this._input.onpointerup = (e) => {
49
- oldX = null;
50
- this._input.releasePointerCapture(e.pointerId);
51
- };
262
+ });
263
+ this._scrubberButton.addEventListener('pointerdown', e => this._handlePointerDown(e));
264
+ this._select.addEventListener('change', () => this._applySelectedMode());
265
+ this._increaseButton.addEventListener('pointerdown', e => this._handleStepperPointerDown(e, 1));
266
+ this._decreaseButton.addEventListener('pointerdown', e => this._handleStepperPointerDown(e, -1));
267
+ }
268
+ _handlePointerDown(event) {
269
+ if (this._readOnly)
270
+ return;
271
+ if (!this._isSelectedUnitMode()) {
272
+ if (!this._switchToUnitModeForInteraction())
273
+ return;
274
+ }
275
+ this._dragPointerId = event.pointerId;
276
+ this._dragStartY = event.clientY;
277
+ this._dragStartNumericValue = this._readEditableNumericValue(this._select.value);
278
+ this._appliedDragSteps = 0;
279
+ this._startPreviewSession();
280
+ this._attachDragWindowListeners();
281
+ try {
282
+ this._scrubberButton.setPointerCapture(event.pointerId);
283
+ }
284
+ catch {
285
+ }
286
+ event.preventDefault();
287
+ }
288
+ _handleWindowDragPointerMove(event) {
289
+ if (this._dragPointerId !== event.pointerId || !this._isSelectedUnitMode())
290
+ return;
291
+ const stepCount = this._calculateDraggedStepCount(this._dragStartY - event.clientY);
292
+ if (stepCount === this._appliedDragSteps)
293
+ return;
294
+ this._appliedDragSteps = stepCount;
295
+ const unit = this._select.value;
296
+ const step = this._getEffectiveStep(unit);
297
+ this._previewNumericValue(this._getInteractiveStepValue(this._dragStartNumericValue, stepCount, step), unit, step);
298
+ event.preventDefault();
299
+ }
300
+ _finishDragInteractionForPointerEvent(event, wasCancelled) {
301
+ if (this._dragPointerId !== event.pointerId)
302
+ return;
303
+ this._finishDragInteraction(wasCancelled, event.pointerId);
304
+ }
305
+ _finishDragInteraction(wasCancelled, pointerId) {
306
+ if (this._dragPointerId == null)
307
+ return;
308
+ this._dragPointerId = null;
309
+ this._appliedDragSteps = 0;
310
+ this._detachDragWindowListeners();
311
+ if (pointerId != null) {
312
+ try {
313
+ if (this._scrubberButton.hasPointerCapture(pointerId))
314
+ this._scrubberButton.releasePointerCapture(pointerId);
315
+ }
316
+ catch {
317
+ }
318
+ }
319
+ this._finishPreviewSession(wasCancelled);
320
+ }
321
+ _handleStepperPointerDown(event, direction) {
322
+ if (this._readOnly)
323
+ return;
324
+ if (!this._isSelectedUnitMode()) {
325
+ if (!this._switchToUnitModeForInteraction())
326
+ return;
327
+ }
328
+ this._finishStepperInteraction(true);
329
+ this._stepperPointerId = event.pointerId;
330
+ this._stepperDirection = direction;
331
+ this._attachStepperWindowListeners();
332
+ this._startPreviewSession();
333
+ this._applyStepPreview(direction);
334
+ this._stepperRepeatTimeout = window.setTimeout(() => {
335
+ this._stepperRepeatInterval = window.setInterval(() => this._applyStepPreview(this._stepperDirection), 50);
336
+ }, 350);
337
+ event.preventDefault();
338
+ }
339
+ _handleWindowStepperPointerEnd(event) {
340
+ if (this._stepperPointerId !== event.pointerId)
341
+ return;
342
+ this._finishStepperInteraction(false);
343
+ }
344
+ _finishStepperInteraction(wasCancelled) {
345
+ if (this._stepperPointerId == null)
346
+ return;
347
+ this._stepperPointerId = null;
348
+ this._stepperDirection = 0;
349
+ this._detachStepperWindowListeners();
350
+ this._stopStepperRepeat();
351
+ this._finishPreviewSession(wasCancelled);
352
+ }
353
+ _applySelectedMode() {
354
+ const selectedOption = this._select.selectedOptions.item(0);
355
+ if (!selectedOption)
356
+ return;
357
+ const selectedKind = selectedOption.dataset['kind'];
358
+ if (selectedKind === 'fixed') {
359
+ this._commitValue(selectedOption.value);
360
+ return;
361
+ }
362
+ if (selectedKind === 'custom') {
363
+ this._preferCustomMode = true;
364
+ this._updateValue();
365
+ requestAnimationFrame(() => {
366
+ this._input.focus();
367
+ this._input.select();
368
+ });
369
+ return;
370
+ }
371
+ const selectedUnit = selectedOption.value;
372
+ this._lastNumericUnit = selectedUnit;
373
+ this._preferCustomMode = false;
374
+ const parsedValue = parseNumericStyleInputValue(this._value);
375
+ if (parsedValue.kind === 'numeric') {
376
+ const convertedValue = this._convertNumericValue(parsedValue, selectedUnit);
377
+ this._commitValue(convertedValue);
378
+ return;
379
+ }
380
+ const resolvedCurrentValue = this._resolveCurrentValueForUnit(selectedUnit);
381
+ if (resolvedCurrentValue != null) {
382
+ this._commitValue(resolvedCurrentValue);
383
+ return;
384
+ }
385
+ if (parsedValue.kind === 'empty') {
386
+ this._updateValue();
387
+ this._input.focus();
388
+ return;
389
+ }
390
+ const typedNumericValue = Number(this._input.value);
391
+ if (!Number.isNaN(typedNumericValue)) {
392
+ this._applyNumericValue(typedNumericValue, selectedUnit);
393
+ return;
394
+ }
395
+ // Switching from a non-numeric value (e.g. unset/inherit) to a unit:
396
+ // clear the value so the unit mode is shown with an empty input
397
+ this._commitValue('');
398
+ this._input.focus();
399
+ }
400
+ _applyTypedValue() {
401
+ const selectedOption = this._select.selectedOptions.item(0);
402
+ const selectedKind = selectedOption?.dataset['kind'];
403
+ if (selectedKind === 'fixed')
404
+ return;
405
+ if (selectedKind === 'custom') {
406
+ this._commitValue(this._input.value);
407
+ return;
408
+ }
409
+ const numberText = this._input.value?.trim() ?? '';
410
+ if (!numberText) {
411
+ this._commitValue('');
412
+ return;
413
+ }
414
+ const numericValue = Number(numberText);
415
+ if (!Number.isNaN(numericValue))
416
+ this._lastNumericValue = this._clampNumericValue(numericValue);
417
+ this._commitValue(combineNumericStyleInputValue(numberText, selectedOption?.value ?? ''));
52
418
  }
53
419
  _updateValue() {
420
+ if (!this._input || !this._select)
421
+ return;
422
+ if (this._previewStartValue == null)
423
+ this._renderSelectOptions();
424
+ const displayState = this._getDisplayState(this._displayValueLock ?? this._value);
425
+ this._input.value = displayState.inputValue;
426
+ this._input.style.display = displayState.inputVisible ? '' : 'none';
427
+ this._input.disabled = this._readOnly || !displayState.inputEnabled;
428
+ this._select.value = displayState.selectValue;
429
+ this._autoSizeSelect();
430
+ if (displayState.mode === 'unit' && displayState.selectedUnit)
431
+ this._lastNumericUnit = displayState.selectedUnit;
432
+ if (displayState.mode === 'unit' && displayState.inputValue !== '') {
433
+ const typedNumericValue = Number(displayState.inputValue);
434
+ if (!Number.isNaN(typedNumericValue))
435
+ this._lastNumericValue = this._clampNumericValue(typedNumericValue);
436
+ }
437
+ const hasUnits = this._units.length > 0;
438
+ const interactionDisabled = this._readOnly || (!hasUnits || (displayState.mode === 'custom'));
439
+ this._scrubberButton.disabled = interactionDisabled;
440
+ this._increaseButton.disabled = interactionDisabled;
441
+ this._decreaseButton.disabled = interactionDisabled;
442
+ this._applyReadonlyState();
443
+ }
444
+ _getDisplayState(value) {
445
+ const parsedValue = parseNumericStyleInputValue(value);
446
+ if (parsedValue.kind === 'numeric') {
447
+ if (this._preferCustomMode)
448
+ return this._createCustomDisplayState(parsedValue.numberText);
449
+ if (parsedValue.unit && this._units.length && !this._units.includes(parsedValue.unit))
450
+ return this._createCustomDisplayState(value);
451
+ const selectedUnit = parsedValue.unit || this._lastNumericUnit || this._units[0] || '';
452
+ return {
453
+ mode: 'unit',
454
+ inputValue: parsedValue.numberText,
455
+ inputVisible: true,
456
+ inputEnabled: true,
457
+ selectValue: selectedUnit || this._select.value || customOptionValue,
458
+ selectedUnit
459
+ };
460
+ }
461
+ if (parsedValue.kind === 'text') {
462
+ if (!this._preferCustomMode && this._fixedValues.includes(parsedValue.text)) {
463
+ return {
464
+ mode: 'fixed',
465
+ inputValue: '',
466
+ inputVisible: true,
467
+ inputEnabled: false,
468
+ selectValue: parsedValue.text
469
+ };
470
+ }
471
+ return this._createCustomDisplayState(parsedValue.text);
472
+ }
473
+ if (this._preferCustomMode)
474
+ return this._createCustomDisplayState('');
475
+ const selectedUnit = this._lastNumericUnit || this._units[0];
476
+ if (selectedUnit) {
477
+ return {
478
+ mode: 'unit',
479
+ inputValue: '',
480
+ inputVisible: true,
481
+ inputEnabled: true,
482
+ selectValue: selectedUnit,
483
+ selectedUnit
484
+ };
485
+ }
486
+ return this._createCustomDisplayState('');
487
+ }
488
+ _createCustomDisplayState(text) {
489
+ if (!this._allowCustomValue && this._units.length) {
490
+ return {
491
+ mode: 'unit',
492
+ inputValue: text,
493
+ inputVisible: true,
494
+ inputEnabled: true,
495
+ selectValue: this._units[0],
496
+ selectedUnit: this._units[0]
497
+ };
498
+ }
499
+ return {
500
+ mode: 'custom',
501
+ inputValue: text,
502
+ inputVisible: true,
503
+ inputEnabled: true,
504
+ selectValue: customOptionValue
505
+ };
506
+ }
507
+ _renderSelectOptions() {
508
+ const selectedValue = this._select.value;
509
+ this._select.replaceChildren();
510
+ if (this._units.length) {
511
+ const group = document.createElement('optgroup');
512
+ group.label = 'Units';
513
+ for (const unit of this._units)
514
+ group.appendChild(this._createOption(unit, unit, 'unit'));
515
+ this._select.appendChild(group);
516
+ }
517
+ if (this._fixedValues.length) {
518
+ const group = document.createElement('optgroup');
519
+ group.label = 'Values';
520
+ for (const fixedValue of this._fixedValues)
521
+ group.appendChild(this._createOption(fixedValue, fixedValue, 'fixed'));
522
+ this._select.appendChild(group);
523
+ }
524
+ if (this._allowCustomValue || this._select.options.length === 0)
525
+ this._select.appendChild(this._createOption('custom', customOptionValue, 'custom'));
526
+ if (selectedValue)
527
+ this._select.value = selectedValue;
528
+ }
529
+ _createOption(label, value, kind) {
530
+ const option = document.createElement('option');
531
+ option.text = label;
532
+ option.value = value;
533
+ option.dataset['kind'] = kind;
534
+ return option;
535
+ }
536
+ _autoSizeSelect() {
537
+ if (!this._measure || !this._select)
538
+ return;
539
+ const selectedOption = this._select.selectedOptions.item(0);
540
+ this._measure.textContent = selectedOption?.text ?? '';
541
+ const textWidth = this._measure.offsetWidth;
542
+ if (textWidth > 0) {
543
+ // 14px accounts for the custom dropdown arrow + padding
544
+ this._select.style.width = (textWidth + 17) + 'px';
545
+ }
546
+ else {
547
+ // Element not yet laid out, defer measurement
548
+ requestAnimationFrame(() => this._autoSizeSelect());
549
+ }
550
+ }
551
+ _applyReadonlyState() {
552
+ if (!this._input || !this._select)
553
+ return;
554
+ this._input.readOnly = this._readOnly;
555
+ this._select.disabled = this._readOnly;
556
+ }
557
+ _convertNumericValue(parsedValue, selectedUnit) {
558
+ if (!selectedUnit)
559
+ return this._value;
560
+ const fromUnit = parsedValue.unit || selectedUnit;
561
+ const convertedValue = this._unitValueConverter?.({
562
+ value: parsedValue.value,
563
+ numberText: parsedValue.numberText,
564
+ rawValue: this._value,
565
+ fromUnit,
566
+ toUnit: selectedUnit
567
+ });
568
+ return convertedValue ?? combineNumericStyleInputValue(parsedValue.numberText, selectedUnit);
569
+ }
570
+ _resolveCurrentValueForUnit(selectedUnit) {
571
+ if (!selectedUnit)
572
+ return null;
573
+ const convertedValue = this._unitValueConverter?.({
574
+ value: Number.NaN,
575
+ numberText: '',
576
+ rawValue: this._value,
577
+ fromUnit: '',
578
+ toUnit: selectedUnit
579
+ })?.trim();
580
+ return convertedValue ? convertedValue : null;
581
+ }
582
+ _readEditableNumericValue(selectedUnit) {
583
+ const parsedValue = parseNumericStyleInputValue(this._value);
584
+ if (parsedValue.kind === 'numeric') {
585
+ const convertedValue = this._convertNumericValue(parsedValue, selectedUnit);
586
+ const convertedParsedValue = parseNumericStyleInputValue(convertedValue);
587
+ if (convertedParsedValue.kind === 'numeric')
588
+ return convertedParsedValue.value;
589
+ return parsedValue.value;
590
+ }
591
+ if (this._input.value?.trim()) {
592
+ const typedNumericValue = Number(this._input.value);
593
+ if (!Number.isNaN(typedNumericValue))
594
+ return typedNumericValue;
595
+ }
596
+ return this._lastNumericValue;
597
+ }
598
+ _applyNumericValue(value, unit) {
599
+ this._lastNumericValue = this._clampNumericValue(value);
600
+ this._lastNumericUnit = unit;
601
+ this._commitValue(combineNumericStyleInputValue(formatNumericStyleInputNumber(this._lastNumericValue), unit));
602
+ }
603
+ _previewNumericValue(value, unit, step) {
604
+ this._lastNumericValue = this._clampNumericValue(value);
605
+ this._lastNumericUnit = unit;
606
+ const effectiveStep = step ?? this._getEffectiveStep(unit);
607
+ this._setValue(combineNumericStyleInputValue(this._formatInteractiveNumericValue(this._lastNumericValue, effectiveStep), unit), false, true);
608
+ }
609
+ _commitValue(value) {
610
+ this._setValue(value, true, false);
611
+ }
612
+ _setValue(value, emitCommit, emitPreview) {
613
+ const normalizedValue = value ?? '';
614
+ if (!emitCommit && !emitPreview && this._previewStartValue != null)
615
+ return;
616
+ const oldValue = this._value;
617
+ this._value = normalizedValue;
618
+ if (emitPreview)
619
+ this._displayValueLock = normalizedValue;
620
+ else if (this._displayValueLock != null) {
621
+ if (normalizedValue === this._displayValueLock || normalizedValue !== oldValue)
622
+ this._displayValueLock = null;
623
+ }
624
+ this._preferCustomMode = false;
625
+ this._updateValue();
626
+ if (oldValue !== normalizedValue) {
627
+ if (emitPreview) {
628
+ this._previewChanged = true;
629
+ this.valuePreviewChanged.emit({ newValue: normalizedValue, oldValue: oldValue });
630
+ }
631
+ if (emitCommit)
632
+ this.valueChanged.emit({ newValue: normalizedValue, oldValue: oldValue });
633
+ }
634
+ }
635
+ _startPreviewSession() {
636
+ if (this._previewStartValue == null) {
637
+ this._previewStartValue = this._value;
638
+ this._previewChanged = false;
639
+ }
640
+ }
641
+ _finishPreviewSession(wasCancelled) {
642
+ if (this._previewStartValue == null)
643
+ return;
644
+ const oldValue = this._previewStartValue;
645
+ const newValue = this._displayValueLock ?? this._value;
646
+ const changed = this._previewChanged && oldValue !== newValue;
647
+ const finalWasCancelled = wasCancelled || !changed;
648
+ this._previewStartValue = null;
649
+ this._previewChanged = false;
650
+ if (finalWasCancelled) {
651
+ this._displayValueLock = null;
652
+ this._value = oldValue;
653
+ this._updateValue();
654
+ }
655
+ else {
656
+ this._displayValueLock = newValue;
657
+ this._updateValue();
658
+ }
659
+ this.valuePreviewFinished.emit({ newValue, oldValue, wasCancelled: finalWasCancelled });
660
+ }
661
+ _applyStepPreview(direction) {
662
+ const unit = this._select.value;
663
+ const step = this._getEffectiveStep(unit);
664
+ this._previewNumericValue(this._getInteractiveStepValue(this._readEditableNumericValue(unit), direction, step), unit, step);
665
+ }
666
+ _stopStepperRepeat() {
667
+ if (this._stepperRepeatTimeout != null) {
668
+ window.clearTimeout(this._stepperRepeatTimeout);
669
+ this._stepperRepeatTimeout = null;
670
+ }
671
+ if (this._stepperRepeatInterval != null) {
672
+ window.clearInterval(this._stepperRepeatInterval);
673
+ this._stepperRepeatInterval = null;
674
+ }
675
+ }
676
+ _attachStepperWindowListeners() {
677
+ window.addEventListener('pointerup', this._windowPointerUpHandler, true);
678
+ window.addEventListener('pointercancel', this._windowPointerCancelHandler, true);
679
+ window.addEventListener('blur', this._windowBlurHandler);
680
+ }
681
+ _attachDragWindowListeners() {
682
+ window.addEventListener('pointermove', this._windowDragPointerMoveHandler, true);
683
+ window.addEventListener('pointerup', this._windowDragPointerUpHandler, true);
684
+ window.addEventListener('pointercancel', this._windowDragPointerCancelHandler, true);
685
+ window.addEventListener('blur', this._windowDragBlurHandler);
686
+ }
687
+ _detachStepperWindowListeners() {
688
+ window.removeEventListener('pointerup', this._windowPointerUpHandler, true);
689
+ window.removeEventListener('pointercancel', this._windowPointerCancelHandler, true);
690
+ window.removeEventListener('blur', this._windowBlurHandler);
691
+ }
692
+ _detachDragWindowListeners() {
693
+ window.removeEventListener('pointermove', this._windowDragPointerMoveHandler, true);
694
+ window.removeEventListener('pointerup', this._windowDragPointerUpHandler, true);
695
+ window.removeEventListener('pointercancel', this._windowDragPointerCancelHandler, true);
696
+ window.removeEventListener('blur', this._windowDragBlurHandler);
697
+ }
698
+ _calculateDraggedStepCount(pixelDelta) {
699
+ const absolutePixels = Math.abs(pixelDelta);
700
+ const fineSteps = Math.min(absolutePixels, 20) / 5;
701
+ const mediumSteps = Math.max(Math.min(absolutePixels - 20, 40), 0) / 3;
702
+ const coarseSteps = Math.max(absolutePixels - 60, 0) / 2;
703
+ const stepCount = Math.trunc(fineSteps + mediumSteps + coarseSteps);
704
+ return Math.sign(pixelDelta) * stepCount;
705
+ }
706
+ _getEffectiveStep(unit) {
707
+ if (unit) {
708
+ const unitStep = this._unitSteps[unit];
709
+ if (Number.isFinite(unitStep) && unitStep > 0)
710
+ return unitStep;
711
+ }
712
+ return this._step;
713
+ }
714
+ _getInteractiveStepValue(value, stepCount, step) {
715
+ const effectiveStep = step ?? this._step;
716
+ const clampedValue = this._clampNumericValue(value);
717
+ if (!Number.isFinite(clampedValue) || !Number.isFinite(stepCount) || stepCount === 0)
718
+ return clampedValue;
719
+ const stepBase = this._min ?? 0;
720
+ const quotient = (clampedValue - stepBase) / effectiveStep;
721
+ const roundedQuotient = Math.round(quotient);
722
+ const isAligned = Math.abs(quotient - roundedQuotient) < 1e-9;
723
+ let targetIndex;
724
+ if (stepCount > 0) {
725
+ const firstIndex = isAligned ? roundedQuotient + 1 : Math.ceil(quotient);
726
+ targetIndex = firstIndex + stepCount - 1;
727
+ }
728
+ else {
729
+ const firstIndex = isAligned ? roundedQuotient - 1 : Math.floor(quotient);
730
+ targetIndex = firstIndex + stepCount + 1;
731
+ }
732
+ const targetValue = stepBase + (targetIndex * effectiveStep);
733
+ return this._clampNumericValue(this._roundToStepPrecision(targetValue, effectiveStep));
734
+ }
735
+ _formatInteractiveNumericValue(value, step) {
736
+ const effectiveStep = step ?? this._step;
737
+ return formatNumericStyleInputNumber(this._roundToStepPrecision(value, effectiveStep), this._getStepPrecision(effectiveStep));
738
+ }
739
+ _roundToStepPrecision(value, step) {
740
+ const precision = this._getStepPrecision(step);
741
+ const factor = 10 ** precision;
742
+ return Math.round(value * factor) / factor;
743
+ }
744
+ _getStepPrecision(step) {
745
+ const stepText = `${step ?? this._step}`.toLowerCase();
746
+ if (stepText.includes('e-')) {
747
+ const [coefficientText, exponentText] = stepText.split('e-');
748
+ const exponent = Number(exponentText);
749
+ const decimalPartLength = coefficientText.includes('.') ? coefficientText.length - coefficientText.indexOf('.') - 1 : 0;
750
+ return exponent + decimalPartLength;
751
+ }
752
+ const decimalIndex = stepText.indexOf('.');
753
+ return decimalIndex >= 0 ? stepText.length - decimalIndex - 1 : 0;
754
+ }
755
+ _switchToUnitModeForInteraction() {
756
+ const targetUnit = this._lastNumericUnit || this._units[0];
757
+ if (!targetUnit)
758
+ return false;
759
+ this._preferCustomMode = false;
760
+ const resolved = this._resolveCurrentValueForUnit(targetUnit);
761
+ if (resolved != null) {
762
+ this._commitValue(resolved);
763
+ return this._isSelectedUnitMode();
764
+ }
765
+ this._applyNumericValue(this._lastNumericValue, targetUnit);
766
+ return this._isSelectedUnitMode();
767
+ }
768
+ _isSelectedUnitMode() {
769
+ return this._select.selectedOptions.item(0)?.dataset['kind'] === 'unit';
770
+ }
771
+ _normalizeOptionValues(values) {
772
+ return [...new Set((values ?? []).map(x => x?.trim()).filter(x => !!x))];
773
+ }
774
+ _clampNumericValue(value) {
775
+ let result = value;
776
+ if (this._min != null)
777
+ result = Math.max(this._min, result);
778
+ if (this._max != null)
779
+ result = Math.min(this._max, result);
780
+ return result;
54
781
  }
55
782
  }
56
783
  customElements.define('node-projects-numeric-style-input', NumericStyleInput);