@itwin/imodel-components-react 4.0.0-dev.9 → 4.0.1

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 (374) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/README.md +2 -2
  3. package/lib/cjs/imodel-components-react/UiIModelComponents.d.ts +28 -28
  4. package/lib/cjs/imodel-components-react/UiIModelComponents.d.ts.map +1 -1
  5. package/lib/cjs/imodel-components-react/UiIModelComponents.js +75 -79
  6. package/lib/cjs/imodel-components-react/UiIModelComponents.js.map +1 -1
  7. package/lib/cjs/imodel-components-react/color/AlphaSlider.d.ts +36 -36
  8. package/lib/cjs/imodel-components-react/color/AlphaSlider.js +190 -186
  9. package/lib/cjs/imodel-components-react/color/AlphaSlider.js.map +1 -1
  10. package/lib/cjs/imodel-components-react/color/AlphaSlider.scss +63 -63
  11. package/lib/cjs/imodel-components-react/color/ColorPickerButton.d.ts +37 -37
  12. package/lib/cjs/imodel-components-react/color/ColorPickerButton.d.ts.map +1 -1
  13. package/lib/cjs/imodel-components-react/color/ColorPickerButton.js +112 -107
  14. package/lib/cjs/imodel-components-react/color/ColorPickerButton.js.map +1 -1
  15. package/lib/cjs/imodel-components-react/color/ColorPickerButton.scss +90 -90
  16. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.d.ts +23 -23
  17. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js +78 -74
  18. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  19. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.d.ts +44 -44
  20. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.d.ts.map +1 -1
  21. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js +143 -137
  22. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  23. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.scss +62 -63
  24. package/lib/cjs/imodel-components-react/color/HueSlider.d.ts +22 -22
  25. package/lib/cjs/imodel-components-react/color/HueSlider.js +203 -199
  26. package/lib/cjs/imodel-components-react/color/HueSlider.js.map +1 -1
  27. package/lib/cjs/imodel-components-react/color/HueSlider.scss +61 -61
  28. package/lib/cjs/imodel-components-react/color/SaturationPicker.d.ts +20 -20
  29. package/lib/cjs/imodel-components-react/color/SaturationPicker.js +217 -213
  30. package/lib/cjs/imodel-components-react/color/SaturationPicker.js.map +1 -1
  31. package/lib/cjs/imodel-components-react/color/SaturationPicker.scss +35 -35
  32. package/lib/cjs/imodel-components-react/color/Swatch.d.ts +22 -22
  33. package/lib/cjs/imodel-components-react/color/Swatch.js +64 -60
  34. package/lib/cjs/imodel-components-react/color/Swatch.js.map +1 -1
  35. package/lib/cjs/imodel-components-react/color/Swatch.scss +22 -23
  36. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.d.ts +6 -6
  37. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js +23 -23
  38. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  39. package/lib/cjs/imodel-components-react/editors/ColorEditor.d.ts +44 -44
  40. package/lib/cjs/imodel-components-react/editors/ColorEditor.js +155 -151
  41. package/lib/cjs/imodel-components-react/editors/ColorEditor.js.map +1 -1
  42. package/lib/cjs/imodel-components-react/editors/ColorEditor.scss +18 -18
  43. package/lib/cjs/imodel-components-react/editors/WeightEditor.d.ts +47 -47
  44. package/lib/cjs/imodel-components-react/editors/WeightEditor.js +164 -160
  45. package/lib/cjs/imodel-components-react/editors/WeightEditor.js.map +1 -1
  46. package/lib/cjs/imodel-components-react/editors/WeightEditor.scss +16 -16
  47. package/lib/cjs/imodel-components-react/inputs/QuantityInput.d.ts +25 -25
  48. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js +100 -96
  49. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  50. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts +44 -44
  51. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  52. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js +272 -265
  53. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  54. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.scss +106 -107
  55. package/lib/cjs/imodel-components-react/lineweight/Swatch.d.ts +33 -33
  56. package/lib/cjs/imodel-components-react/lineweight/Swatch.js +89 -85
  57. package/lib/cjs/imodel-components-react/lineweight/Swatch.js.map +1 -1
  58. package/lib/cjs/imodel-components-react/lineweight/Swatch.scss +48 -48
  59. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.d.ts +60 -60
  60. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js +163 -159
  61. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  62. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.scss +51 -52
  63. package/lib/cjs/imodel-components-react/navigationaids/Cube.d.ts +45 -45
  64. package/lib/cjs/imodel-components-react/navigationaids/Cube.js +131 -127
  65. package/lib/cjs/imodel-components-react/navigationaids/Cube.js.map +1 -1
  66. package/lib/cjs/imodel-components-react/navigationaids/Cube.scss +19 -19
  67. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.d.ts +154 -174
  68. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  69. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js +626 -634
  70. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  71. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -182
  72. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts +145 -145
  73. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts.map +1 -1
  74. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js +657 -647
  75. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  76. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -134
  77. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.d.ts +26 -26
  78. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js +103 -99
  79. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  80. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.scss +59 -63
  81. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.d.ts +17 -17
  82. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +56 -53
  83. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  84. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.d.ts +18 -18
  85. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.d.ts.map +1 -1
  86. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js +88 -83
  87. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  88. package/lib/cjs/imodel-components-react/quantityformat/FormatType.d.ts +17 -17
  89. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +89 -86
  90. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  91. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.d.ts +17 -17
  92. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +112 -109
  93. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  94. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.d.ts +19 -19
  95. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js +133 -133
  96. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  97. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.d.ts +21 -21
  98. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +187 -184
  99. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  100. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts +22 -22
  101. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js +149 -145
  102. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  103. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts +17 -17
  104. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js +63 -59
  105. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  106. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts +17 -17
  107. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js +51 -47
  108. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  109. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts +16 -16
  110. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js +58 -54
  111. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  112. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.d.ts +18 -18
  113. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js +52 -48
  114. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  115. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.d.ts +17 -17
  116. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js +54 -50
  117. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  118. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts +17 -17
  119. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +62 -58
  120. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  121. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts +17 -17
  122. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js +51 -47
  123. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  124. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts +17 -17
  125. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js +60 -56
  126. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  127. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts +17 -17
  128. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +98 -95
  129. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  130. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.d.ts +23 -23
  131. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js +123 -119
  132. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  133. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.d.ts +52 -52
  134. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.d.ts.map +1 -1
  135. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js +142 -143
  136. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  137. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts +31 -31
  138. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js +69 -69
  139. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  140. package/lib/cjs/imodel-components-react/timeline/InlineEdit.d.ts +27 -27
  141. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js +85 -81
  142. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  143. package/lib/cjs/imodel-components-react/timeline/InlineEdit.scss +26 -26
  144. package/lib/cjs/imodel-components-react/timeline/PlayerButton.d.ts +33 -33
  145. package/lib/cjs/imodel-components-react/timeline/PlayerButton.d.ts.map +1 -1
  146. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js +99 -91
  147. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  148. package/lib/cjs/imodel-components-react/timeline/PlayerButton.scss +28 -31
  149. package/lib/cjs/imodel-components-react/timeline/Scrubber.d.ts +54 -54
  150. package/lib/cjs/imodel-components-react/timeline/Scrubber.js +195 -191
  151. package/lib/cjs/imodel-components-react/timeline/Scrubber.js.map +1 -1
  152. package/lib/cjs/imodel-components-react/timeline/Scrubber.scss +105 -112
  153. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.d.ts +77 -77
  154. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.d.ts.map +1 -1
  155. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js +432 -424
  156. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  157. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.scss +359 -356
  158. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.d.ts +15 -15
  159. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js +58 -54
  160. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  161. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.scss +39 -39
  162. package/lib/cjs/imodel-components-react/timeline/Timeline.scss +164 -164
  163. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts +130 -133
  164. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  165. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js +398 -358
  166. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  167. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.scss +178 -164
  168. package/lib/cjs/imodel-components-react/timeline/interfaces.d.ts +145 -174
  169. package/lib/cjs/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  170. package/lib/cjs/imodel-components-react/timeline/interfaces.js +45 -45
  171. package/lib/cjs/imodel-components-react/timeline/interfaces.js.map +1 -1
  172. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts +42 -42
  173. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  174. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js +276 -274
  175. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  176. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.d.ts +106 -106
  177. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js +105 -105
  178. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  179. package/lib/cjs/imodel-components-react.d.ts +81 -82
  180. package/lib/cjs/imodel-components-react.d.ts.map +1 -1
  181. package/lib/cjs/imodel-components-react.js +104 -101
  182. package/lib/cjs/imodel-components-react.js.map +1 -1
  183. package/lib/esm/imodel-components-react/UiIModelComponents.d.ts +28 -28
  184. package/lib/esm/imodel-components-react/UiIModelComponents.d.ts.map +1 -1
  185. package/lib/esm/imodel-components-react/UiIModelComponents.js +72 -75
  186. package/lib/esm/imodel-components-react/UiIModelComponents.js.map +1 -1
  187. package/lib/esm/imodel-components-react/color/AlphaSlider.d.ts +36 -36
  188. package/lib/esm/imodel-components-react/color/AlphaSlider.js +160 -160
  189. package/lib/esm/imodel-components-react/color/AlphaSlider.js.map +1 -1
  190. package/lib/esm/imodel-components-react/color/AlphaSlider.scss +63 -63
  191. package/lib/esm/imodel-components-react/color/ColorPickerButton.d.ts +37 -37
  192. package/lib/esm/imodel-components-react/color/ColorPickerButton.d.ts.map +1 -1
  193. package/lib/esm/imodel-components-react/color/ColorPickerButton.js +83 -82
  194. package/lib/esm/imodel-components-react/color/ColorPickerButton.js.map +1 -1
  195. package/lib/esm/imodel-components-react/color/ColorPickerButton.scss +90 -90
  196. package/lib/esm/imodel-components-react/color/ColorPickerDialog.d.ts +23 -23
  197. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js +51 -51
  198. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  199. package/lib/esm/imodel-components-react/color/ColorPickerPopup.d.ts +44 -44
  200. package/lib/esm/imodel-components-react/color/ColorPickerPopup.d.ts.map +1 -1
  201. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js +114 -112
  202. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  203. package/lib/esm/imodel-components-react/color/ColorPickerPopup.scss +62 -63
  204. package/lib/esm/imodel-components-react/color/HueSlider.d.ts +22 -22
  205. package/lib/esm/imodel-components-react/color/HueSlider.js +173 -173
  206. package/lib/esm/imodel-components-react/color/HueSlider.js.map +1 -1
  207. package/lib/esm/imodel-components-react/color/HueSlider.scss +61 -61
  208. package/lib/esm/imodel-components-react/color/SaturationPicker.d.ts +20 -20
  209. package/lib/esm/imodel-components-react/color/SaturationPicker.js +187 -187
  210. package/lib/esm/imodel-components-react/color/SaturationPicker.js.map +1 -1
  211. package/lib/esm/imodel-components-react/color/SaturationPicker.scss +35 -35
  212. package/lib/esm/imodel-components-react/color/Swatch.d.ts +22 -22
  213. package/lib/esm/imodel-components-react/color/Swatch.js +34 -34
  214. package/lib/esm/imodel-components-react/color/Swatch.js.map +1 -1
  215. package/lib/esm/imodel-components-react/color/Swatch.scss +22 -23
  216. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.d.ts +6 -6
  217. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js +19 -19
  218. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  219. package/lib/esm/imodel-components-react/editors/ColorEditor.d.ts +44 -44
  220. package/lib/esm/imodel-components-react/editors/ColorEditor.js +124 -124
  221. package/lib/esm/imodel-components-react/editors/ColorEditor.js.map +1 -1
  222. package/lib/esm/imodel-components-react/editors/ColorEditor.scss +18 -18
  223. package/lib/esm/imodel-components-react/editors/WeightEditor.d.ts +47 -47
  224. package/lib/esm/imodel-components-react/editors/WeightEditor.js +133 -133
  225. package/lib/esm/imodel-components-react/editors/WeightEditor.js.map +1 -1
  226. package/lib/esm/imodel-components-react/editors/WeightEditor.scss +16 -16
  227. package/lib/esm/imodel-components-react/inputs/QuantityInput.d.ts +25 -25
  228. package/lib/esm/imodel-components-react/inputs/QuantityInput.js +70 -70
  229. package/lib/esm/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  230. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts +44 -44
  231. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  232. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js +243 -240
  233. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  234. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.scss +106 -107
  235. package/lib/esm/imodel-components-react/lineweight/Swatch.d.ts +33 -33
  236. package/lib/esm/imodel-components-react/lineweight/Swatch.js +59 -59
  237. package/lib/esm/imodel-components-react/lineweight/Swatch.js.map +1 -1
  238. package/lib/esm/imodel-components-react/lineweight/Swatch.scss +48 -48
  239. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.d.ts +60 -60
  240. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js +134 -133
  241. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  242. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.scss +51 -52
  243. package/lib/esm/imodel-components-react/navigationaids/Cube.d.ts +45 -45
  244. package/lib/esm/imodel-components-react/navigationaids/Cube.js +100 -100
  245. package/lib/esm/imodel-components-react/navigationaids/Cube.js.map +1 -1
  246. package/lib/esm/imodel-components-react/navigationaids/Cube.scss +19 -19
  247. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.d.ts +154 -174
  248. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  249. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js +596 -606
  250. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  251. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -182
  252. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts +145 -145
  253. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts.map +1 -1
  254. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js +627 -620
  255. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  256. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -134
  257. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.d.ts +26 -26
  258. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js +76 -76
  259. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  260. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.scss +59 -63
  261. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.d.ts +17 -17
  262. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +29 -30
  263. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  264. package/lib/esm/imodel-components-react/quantityformat/FormatSample.d.ts +18 -18
  265. package/lib/esm/imodel-components-react/quantityformat/FormatSample.d.ts.map +1 -1
  266. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js +61 -60
  267. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  268. package/lib/esm/imodel-components-react/quantityformat/FormatType.d.ts +17 -17
  269. package/lib/esm/imodel-components-react/quantityformat/FormatType.js +62 -63
  270. package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  271. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.d.ts +17 -17
  272. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +82 -83
  273. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  274. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.d.ts +19 -19
  275. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js +106 -110
  276. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  277. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.d.ts +21 -21
  278. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +157 -158
  279. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  280. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts +22 -22
  281. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js +122 -122
  282. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  283. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts +17 -17
  284. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js +36 -36
  285. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  286. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts +17 -17
  287. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js +24 -24
  288. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  289. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts +16 -16
  290. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js +31 -31
  291. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  292. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.d.ts +18 -18
  293. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js +25 -25
  294. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  295. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.d.ts +17 -17
  296. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js +27 -27
  297. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  298. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts +17 -17
  299. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +35 -35
  300. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  301. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts +17 -17
  302. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js +24 -24
  303. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  304. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts +17 -17
  305. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js +33 -33
  306. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  307. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts +17 -17
  308. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +68 -69
  309. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  310. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.d.ts +23 -23
  311. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js +96 -96
  312. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  313. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.d.ts +52 -52
  314. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.d.ts.map +1 -1
  315. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js +138 -139
  316. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  317. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts +31 -31
  318. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js +65 -65
  319. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  320. package/lib/esm/imodel-components-react/timeline/InlineEdit.d.ts +27 -27
  321. package/lib/esm/imodel-components-react/timeline/InlineEdit.js +55 -55
  322. package/lib/esm/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  323. package/lib/esm/imodel-components-react/timeline/InlineEdit.scss +26 -26
  324. package/lib/esm/imodel-components-react/timeline/PlayerButton.d.ts +33 -33
  325. package/lib/esm/imodel-components-react/timeline/PlayerButton.d.ts.map +1 -1
  326. package/lib/esm/imodel-components-react/timeline/PlayerButton.js +68 -64
  327. package/lib/esm/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  328. package/lib/esm/imodel-components-react/timeline/PlayerButton.scss +28 -31
  329. package/lib/esm/imodel-components-react/timeline/Scrubber.d.ts +54 -54
  330. package/lib/esm/imodel-components-react/timeline/Scrubber.js +164 -164
  331. package/lib/esm/imodel-components-react/timeline/Scrubber.js.map +1 -1
  332. package/lib/esm/imodel-components-react/timeline/Scrubber.scss +105 -112
  333. package/lib/esm/imodel-components-react/timeline/SolarTimeline.d.ts +77 -77
  334. package/lib/esm/imodel-components-react/timeline/SolarTimeline.d.ts.map +1 -1
  335. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js +402 -398
  336. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  337. package/lib/esm/imodel-components-react/timeline/SolarTimeline.scss +359 -356
  338. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.d.ts +15 -15
  339. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js +28 -28
  340. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  341. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.scss +39 -39
  342. package/lib/esm/imodel-components-react/timeline/Timeline.scss +164 -164
  343. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts +130 -133
  344. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  345. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js +368 -332
  346. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  347. package/lib/esm/imodel-components-react/timeline/TimelineComponent.scss +178 -164
  348. package/lib/esm/imodel-components-react/timeline/interfaces.d.ts +145 -174
  349. package/lib/esm/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  350. package/lib/esm/imodel-components-react/timeline/interfaces.js +42 -42
  351. package/lib/esm/imodel-components-react/timeline/interfaces.js.map +1 -1
  352. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts +42 -42
  353. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  354. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js +249 -251
  355. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  356. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.d.ts +106 -106
  357. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js +96 -95
  358. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  359. package/lib/esm/imodel-components-react.d.ts +81 -82
  360. package/lib/esm/imodel-components-react.d.ts.map +1 -1
  361. package/lib/esm/imodel-components-react.js +86 -87
  362. package/lib/esm/imodel-components-react.js.map +1 -1
  363. package/lib/public/locales/en/UiIModelComponents.json +139 -139
  364. package/package.json +35 -37
  365. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.d.ts +0 -22
  366. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.d.ts.map +0 -1
  367. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.js +0 -146
  368. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.js.map +0 -1
  369. package/lib/cjs/imodel-components-react/color/ColorPickerPanel.scss +0 -94
  370. package/lib/esm/imodel-components-react/color/ColorPickerPanel.d.ts +0 -22
  371. package/lib/esm/imodel-components-react/color/ColorPickerPanel.d.ts.map +0 -1
  372. package/lib/esm/imodel-components-react/color/ColorPickerPanel.js +0 -123
  373. package/lib/esm/imodel-components-react/color/ColorPickerPanel.js.map +0 -1
  374. package/lib/esm/imodel-components-react/color/ColorPickerPanel.scss +0 -94
@@ -1,425 +1,433 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module Timeline
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || function (mod) {
22
- if (mod && mod.__esModule) return mod;
23
- var result = {};
24
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
- __setModuleDefault(result, mod);
26
- return result;
27
- };
28
- var __importDefault = (this && this.__importDefault) || function (mod) {
29
- return (mod && mod.__esModule) ? mod : { "default": mod };
30
- };
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.SolarTimeline = void 0;
33
- // component is in alpha state - it may change after usability testing - test coverage not complete
34
- /* istanbul ignore file */
35
- require("./SolarTimeline.scss");
36
- const classnames_1 = __importDefault(require("classnames"));
37
- const React = __importStar(require("react"));
38
- const itwinui_react_1 = require("@itwin/itwinui-react");
39
- const core_common_1 = require("@itwin/core-common");
40
- const appui_abstract_1 = require("@itwin/appui-abstract");
41
- const core_react_1 = require("@itwin/core-react");
42
- const components_react_1 = require("@itwin/components-react");
43
- const HueSlider_1 = require("../color/HueSlider");
44
- const SaturationPicker_1 = require("../color/SaturationPicker");
45
- const Swatch_1 = require("../color/Swatch");
46
- const PlayerButton_1 = require("./PlayerButton");
47
- const SpeedTimeline_1 = require("./SpeedTimeline");
48
- const Scrubber_1 = require("./Scrubber");
49
- const UiIModelComponents_1 = require("../UiIModelComponents");
50
- // cSpell:ignore millisec solarsettings showticks shadowcolor solartimeline datepicker millisecs
51
- const millisecPerMinute = 1000 * 60;
52
- const millisecPerHour = millisecPerMinute * 60;
53
- // const millisecPerDay = millisecPerHour * 24;
54
- const defaultPlaybackDuration = 40 * 1000; // 40 seconds
55
- const addZero = (i) => {
56
- return (i < 10) ? `0${i}` : i;
57
- };
58
- function Timeline(props) {
59
- const sliderRef = React.useRef(null);
60
- const [sliderContainer, setSliderContainer] = React.useState();
61
- const [pointerPercent, setPointerPercent] = React.useState(0);
62
- React.useLayoutEffect(() => {
63
- // istanbul ignore else
64
- if (sliderRef.current) {
65
- const container = sliderRef.current.querySelector(".iui-slider-container");
66
- if (container && sliderContainer !== container) {
67
- setSliderContainer(container);
68
- }
69
- }
70
- }, [sliderContainer]);
71
- const thumbProps = () => {
72
- return {
73
- className: "components-timeline-thumb",
74
- children: React.createElement(Scrubber_1.CustomThumb, null),
75
- };
76
- };
77
- const tooltipProps = React.useCallback(() => {
78
- return { visible: false };
79
- }, []);
80
- const [showRailTooltip, setShowRailTooltip] = React.useState(false);
81
- const handlePointerEnter = React.useCallback(() => {
82
- setShowRailTooltip(true);
83
- }, []);
84
- const handlePointerLeave = React.useCallback(() => {
85
- setShowRailTooltip(false);
86
- }, []);
87
- const handlePointerMove = React.useCallback((event) => {
88
- sliderContainer &&
89
- setPointerPercent((0, Scrubber_1.getPercentageOfRectangle)(sliderContainer.getBoundingClientRect(), event.clientX));
90
- }, [sliderContainer]);
91
- const { formatTick, formatTime, onChange, onUpdate, dayStartMs, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, isPlaying } = props;
92
- const thumbHasFocus = (0, Scrubber_1.useFocusedThumb)(sliderContainer);
93
- const tickLabel = React.useMemo(() => {
94
- const showTip = isPlaying || showRailTooltip || thumbHasFocus;
95
- const totalDuration = sunSetOffsetMs - sunRiseOffsetMs;
96
- const percent = (isPlaying || thumbHasFocus) ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration : pointerPercent;
97
- const tooltipText = formatTime((isPlaying || thumbHasFocus) ? (dayStartMs + currentTimeOffsetMs) : (dayStartMs + (sunRiseOffsetMs + (pointerPercent * totalDuration))));
98
- return (React.createElement(Scrubber_1.RailMarkers, { showToolTip: showTip, percent: percent, tooltipText: tooltipText }));
99
- }, [isPlaying, showRailTooltip, thumbHasFocus, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, pointerPercent, formatTime, dayStartMs]);
100
- const className = (0, classnames_1.default)("solar-slider", props.className, formatTick && "showticks");
101
- const sunRiseFormat = formatTime(dayStartMs + sunRiseOffsetMs);
102
- const sunSetFormat = formatTime(dayStartMs + sunSetOffsetMs);
103
- return (React.createElement("div", { className: className },
104
- React.createElement(itwinui_react_1.Tooltip, { content: sunRiseFormat },
105
- React.createElement("span", { className: "sunrise" }, "\u2600")),
106
- React.createElement(itwinui_react_1.Slider, { ref: sliderRef, className: className, step: millisecPerMinute, min: sunRiseOffsetMs, max: sunSetOffsetMs, minLabel: "", maxLabel: "", onUpdate: onUpdate, onChange: onChange, values: [currentTimeOffsetMs], tooltipProps: tooltipProps, thumbProps: thumbProps, tickLabels: tickLabel, railContainerProps: {
107
- onPointerEnter: handlePointerEnter,
108
- onPointerMove: handlePointerMove,
109
- onPointerLeave: handlePointerLeave,
110
- } }),
111
- React.createElement(itwinui_react_1.Tooltip, { content: sunSetFormat },
112
- React.createElement("span", { className: "sunset" }, "\u263D"))));
113
- }
114
- /** Solar Timeline
115
- * @alpha
116
- */
117
- class SolarTimeline extends React.PureComponent {
118
- constructor(props) {
119
- super(props);
120
- this._datePicker = null;
121
- this._settings = null;
122
- this._requestFrame = 0;
123
- this._unmounted = false;
124
- this._timeLastCycle = 0;
125
- this._totalPlayTime = 0;
126
- this._settingsPopupTitle = UiIModelComponents_1.UiIModelComponents.translate("solarsettings.shadowcolor");
127
- this._playLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.play");
128
- this._settingLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.settings");
129
- this._loopLabel = UiIModelComponents_1.UiIModelComponents.translate("timeline.repeat");
130
- this._speedLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.speed");
131
- this._dateTimeLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.dateTime");
132
- this._months = [
133
- components_react_1.UiComponents.translate("month.short.january"),
134
- components_react_1.UiComponents.translate("month.short.february"),
135
- components_react_1.UiComponents.translate("month.short.march"),
136
- components_react_1.UiComponents.translate("month.short.april"),
137
- components_react_1.UiComponents.translate("month.short.may"),
138
- components_react_1.UiComponents.translate("month.short.june"),
139
- components_react_1.UiComponents.translate("month.short.july"),
140
- components_react_1.UiComponents.translate("month.short.august"),
141
- components_react_1.UiComponents.translate("month.short.september"),
142
- components_react_1.UiComponents.translate("month.short.october"),
143
- components_react_1.UiComponents.translate("month.short.november"),
144
- components_react_1.UiComponents.translate("month.short.december"),
145
- ];
146
- this._timeLabel = components_react_1.UiComponents.translate("datepicker.time");
147
- this._amLabel = components_react_1.UiComponents.translate("time.am");
148
- this._pmLabel = components_react_1.UiComponents.translate("time.pm");
149
- this._presetColors = [
150
- core_common_1.ColorDef.create(core_common_1.ColorByName.grey),
151
- core_common_1.ColorDef.create(core_common_1.ColorByName.lightGrey),
152
- core_common_1.ColorDef.create(core_common_1.ColorByName.darkGrey),
153
- core_common_1.ColorDef.create(core_common_1.ColorByName.lightBlue),
154
- core_common_1.ColorDef.create(core_common_1.ColorByName.lightGreen),
155
- core_common_1.ColorDef.create(core_common_1.ColorByName.darkGreen),
156
- core_common_1.ColorDef.create(core_common_1.ColorByName.tan),
157
- core_common_1.ColorDef.create(core_common_1.ColorByName.darkBrown),
158
- ];
159
- // recursively update the animation until we hit the end or the pause button is clicked
160
- this._updateAnimation = (_timestamp) => {
161
- // istanbul ignore else
162
- if (!this.state.isPlaying || this._unmounted) {
163
- window.cancelAnimationFrame(this._requestFrame);
164
- return;
165
- }
166
- const currentTime = new Date().getTime();
167
- this._totalPlayTime += (currentTime - this._timeLastCycle);
168
- this._timeLastCycle = currentTime;
169
- let percentComplete = this._totalPlayTime / this.state.adjustedDuration;
170
- if (percentComplete > 1)
171
- percentComplete = 1;
172
- let newPlayingState = true;
173
- // calculate the next sun time base on the percentage playback complete - should be int value as that is step amount for slider
174
- let nextSunOffset = Math.floor(this.state.sunRiseOffsetMs + (percentComplete * this.state.sunDeltaMs));
175
- if (percentComplete > 0.99) {
176
- if (!this.state.loop) {
177
- newPlayingState = false;
178
- nextSunOffset = this.state.sunSetOffsetMs;
179
- window.cancelAnimationFrame(this._requestFrame);
180
- }
181
- else {
182
- nextSunOffset = this.state.sunRiseOffsetMs;
183
- this._totalPlayTime = 0;
184
- }
185
- }
186
- if (this.props.dataProvider.onTimeChanged) {
187
- const currentSunTime = new Date(this.state.dayStartMs + nextSunOffset);
188
- this.props.dataProvider.onTimeChanged(currentSunTime);
189
- }
190
- this.setState({ isPlaying: newPlayingState, currentTimeOffsetMs: nextSunOffset }, () => {
191
- if (newPlayingState)
192
- this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
193
- });
194
- };
195
- // user clicked pause button
196
- this._onPause = () => {
197
- // istanbul ignore if
198
- if (!this.state.isPlaying)
199
- return;
200
- const currentTime = new Date().getTime();
201
- this._totalPlayTime += (currentTime - this._timeLastCycle);
202
- // stop requesting frames
203
- window.cancelAnimationFrame(this._requestFrame);
204
- // stop playing
205
- this.setState({ isPlaying: false });
206
- // istanbul ignore else
207
- if (this.props.onPlayPause)
208
- this.props.onPlayPause(false);
209
- };
210
- // user clicked play button
211
- this._onPlay = () => {
212
- // istanbul ignore if
213
- if (this.state.isPlaying)
214
- return;
215
- if (this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs || this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs) {
216
- this._totalPlayTime = 0;
217
- this._play(this.state.sunRiseOffsetMs);
218
- }
219
- else {
220
- this._play(this.state.currentTimeOffsetMs);
221
- }
222
- };
223
- /** note the day passed in is in the time of the current user not in project time because the date picker works in
224
- * local time */
225
- this._onDayClick = (day) => {
226
- const selectedDate = new Date(day.getTime() + this.state.currentTimeOffsetMs);
227
- this.props.dataProvider.setDateAndTime(selectedDate);
228
- const dayStartMs = this.props.dataProvider.dayStartMs;
229
- const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;
230
- const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;
231
- const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;
232
- const sunOffsetMs = this.ensureRange(this.state.currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);
233
- this.setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs);
234
- /** call dataProvider to update display style */
235
- if (this.props.dataProvider.onTimeChanged)
236
- this.props.dataProvider.onTimeChanged(this.props.dataProvider.timeOfDay);
237
- this.setState({ dayStartMs, sunRiseOffsetMs, sunSetOffsetMs, currentTimeOffsetMs: sunOffsetMs, sunDeltaMs, isDateOpened: false }, () => {
238
- this._timeLastCycle = new Date().getTime();
239
- });
240
- };
241
- this._onTimeChanged = (time) => {
242
- // compute the current date (with time)
243
- const dayStartMs = this.props.dataProvider.dayStartMs;
244
- const sunTime = (time.hours * millisecPerHour) + (time.minutes * millisecPerMinute);
245
- const dateWithNewTime = new Date(dayStartMs + sunTime);
246
- this.props.dataProvider.setDateAndTime(dateWithNewTime, true);
247
- // notify the provider to update style
248
- if (this.props.dataProvider.onTimeChanged)
249
- this.props.dataProvider.onTimeChanged(dateWithNewTime);
250
- const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);
251
- this.setPlaybackTimeBySunTime(currentTimeOffsetMs, this.state.sunRiseOffsetMs, this.state.sunDeltaMs);
252
- this._timeLastCycle = new Date().getTime();
253
- // update the timeline
254
- this.setState({ currentTimeOffsetMs });
255
- };
256
- this._onCloseDayPicker = () => {
257
- this.setState({ isDateOpened: false });
258
- };
259
- this._onOpenDayPicker = () => {
260
- this.setState((prevState) => ({ isDateOpened: !prevState.isDateOpened }));
261
- };
262
- this._onCloseSettingsPopup = () => {
263
- this.setState({ isSettingsOpened: false });
264
- };
265
- this._onOpenSettingsPopup = () => {
266
- this.setState((prevState) => ({ isSettingsOpened: !prevState.isSettingsOpened }));
267
- };
268
- this._onUpdate = (values) => {
269
- if (!this.state.isPlaying)
270
- this.processSunTimeChange(values[0]);
271
- };
272
- this._onChange = (values) => {
273
- if (!this.state.isPlaying)
274
- this.processSunTimeChange(values[0]);
275
- };
276
- this._onSpeedChange = (value) => {
277
- const adjustedDuration = this.state.duration / value;
278
- this.setState({ speed: value, adjustedDuration });
279
- };
280
- this._onToggleLoop = () => {
281
- this.setState((prevState) => ({ loop: !prevState.loop }));
282
- };
283
- this._formatTime = (millisec) => {
284
- const date = new Date(millisec);
285
- // convert project date to browser locale date
286
- const localTime = (0, components_react_1.adjustDateToTimezone)(date, this.props.dataProvider.timeZoneOffset * 60);
287
- let hours = localTime.getHours();
288
- const minutes = addZero(date.getMinutes());
289
- const abbrev = (hours < 12) ? this._amLabel : (hours === 24) ? this._amLabel : this._pmLabel;
290
- hours = (hours > 12) ? hours - 12 : hours;
291
- return `${hours}:${minutes} ${abbrev}`;
292
- };
293
- this._onPresetColorPick = (shadowColor) => {
294
- this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
295
- };
296
- this._handleHueOrSaturationChange = (hueOrSaturation) => {
297
- if (hueOrSaturation.s === 0) // for a ColorDef to be created from hsv s can't be 0
298
- hueOrSaturation = hueOrSaturation.clone(undefined, 0.5);
299
- const shadowColor = hueOrSaturation.toColorDef();
300
- this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
301
- };
302
- const dayStartMs = this.props.dataProvider.dayStartMs;
303
- const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;
304
- const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;
305
- const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;
306
- const sunOffsetMs = this.props.dataProvider.timeOfDay.getTime() - dayStartMs;
307
- const currentTimeOffsetMs = this.ensureRange(sunOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);
308
- const shadowColor = this.props.dataProvider.shadowColor;
309
- const duration = this.props.duration ? this.props.duration : defaultPlaybackDuration;
310
- const speed = this.props.speed ? this.props.speed : 2;
311
- const adjustedDuration = duration / speed;
312
- this.setPlaybackTimeBySunTime(currentTimeOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration);
313
- this.state = {
314
- isDateOpened: false,
315
- isSettingsOpened: false,
316
- isPlaying: false,
317
- dayStartMs,
318
- sunRiseOffsetMs,
319
- sunSetOffsetMs,
320
- sunDeltaMs,
321
- currentTimeOffsetMs,
322
- speed,
323
- loop: false,
324
- shadowColor,
325
- duration,
326
- adjustedDuration,
327
- };
328
- }
329
- componentWillUnmount() {
330
- window.cancelAnimationFrame(this._requestFrame);
331
- this._unmounted = true;
332
- }
333
- _play(sunTimeMs) {
334
- this._timeLastCycle = new Date().getTime();
335
- // start playing
336
- this.setState({ isPlaying: true, currentTimeOffsetMs: sunTimeMs }, () => {
337
- this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
338
- // istanbul ignore else
339
- if (this.props.onPlayPause)
340
- this.props.onPlayPause(true);
341
- });
342
- }
343
- setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration) {
344
- this._totalPlayTime = ((sunOffsetMs - sunRiseOffsetMs) / (sunDeltaMs)) * ((adjustedDuration) ? adjustedDuration : this.state.adjustedDuration);
345
- }
346
- ensureRange(value, min, max) {
347
- return Math.max(Math.min(value, max), min);
348
- }
349
- processSunTimeChange(sunTime) {
350
- if (sunTime === this.state.currentTimeOffsetMs)
351
- return;
352
- const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);
353
- if (this.props.dataProvider.onTimeChanged) {
354
- const currentSunTime = new Date(this.state.dayStartMs + currentTimeOffsetMs);
355
- this.props.dataProvider.onTimeChanged(currentSunTime);
356
- }
357
- this.setState({ currentTimeOffsetMs }, () => {
358
- const currentTime = new Date().getTime();
359
- this._timeLastCycle = currentTime;
360
- const percentComplete = (currentTimeOffsetMs - this.state.sunRiseOffsetMs) / this.state.sunDeltaMs;
361
- this._totalPlayTime = percentComplete * this.state.adjustedDuration;
362
- });
363
- }
364
- getLocalTime(ticks) {
365
- const projectTime = new Date(ticks);
366
- // convert project date to browser locale date
367
- return (0, components_react_1.adjustDateToTimezone)(projectTime, this.props.dataProvider.timeZoneOffset * 60);
368
- }
369
- render() {
370
- const { dataProvider } = this.props;
371
- const { speed, loop, currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs } = this.state;
372
- const localTime = this.getLocalTime(this.state.dayStartMs + this.state.currentTimeOffsetMs);
373
- const formattedTime = this._formatTime(dataProvider.dayStartMs + currentTimeOffsetMs);
374
- const formattedDate = `${this._months[localTime.getMonth()]}, ${localTime.getDate()}`;
375
- const colorSwatchStyle = {
376
- width: `100%`,
377
- height: `100%`,
378
- };
379
- return (React.createElement("div", { className: "solar-timeline-wrapper" },
380
- React.createElement("div", { className: "header" },
381
- React.createElement(PlayerButton_1.PlayButton, { tooltip: this._playLabel, className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause }),
382
- React.createElement("button", { "data-testid": "solar-date-time-button", title: this._dateTimeLabel, className: "current-date", ref: (element) => this._datePicker = element, onClick: this._onOpenDayPicker },
383
- React.createElement("span", null, formattedDate),
384
- React.createElement("span", null, "/"),
385
- React.createElement("span", null, formattedTime),
386
- React.createElement("span", { className: "icon icon-calendar" })),
387
- React.createElement(core_react_1.Popup, { style: { border: "none" }, offset: 11, target: this._datePicker, isOpen: this.state.isDateOpened, onClose: this._onCloseDayPicker, position: appui_abstract_1.RelativePosition.Top },
388
- React.createElement("div", { className: "components-date-picker-calendar-popup-panel", "data-testid": "components-date-picker-calendar-popup-panel" },
389
- React.createElement(components_react_1.DatePicker, { selected: localTime, onDateChange: this._onDayClick, showFocusOutline: false }),
390
- React.createElement("div", { className: "time-container" },
391
- React.createElement(core_react_1.BodyText, { className: "time-label" }, this._timeLabel),
392
- React.createElement(components_react_1.TimeField, { time: { hours: localTime.getHours(), minutes: localTime.getMinutes(), seconds: 0 }, timeDisplay: appui_abstract_1.TimeDisplay.H12MC, onTimeChange: this._onTimeChanged })))),
393
- React.createElement(Timeline, { className: "solar-timeline", dayStartMs: dataProvider.dayStartMs, sunSetOffsetMs: sunSetOffsetMs, sunRiseOffsetMs: sunRiseOffsetMs, currentTimeOffsetMs: currentTimeOffsetMs, onChange: this._onChange, onUpdate: this._onUpdate, formatTime: this._formatTime, isPlaying: this.state.isPlaying }),
394
- React.createElement("div", { className: "speed-container" },
395
- React.createElement("span", { title: this._speedLabel },
396
- speed,
397
- "x"),
398
- React.createElement(SpeedTimeline_1.SpeedTimeline, { className: "speed", onChange: this._onSpeedChange, speed: this.state.speed })),
399
- React.createElement("span", { title: this._loopLabel, className: (0, classnames_1.default)("icon", "icon-media-controls-loop", !loop && "no-loop-playback", loop && "loop-playback"), onClick: this._onToggleLoop, role: "button", tabIndex: -1 }),
400
- React.createElement("button", { "data-testid": "shadow-settings-button", title: this._settingLabel, className: "shadow-settings-button", ref: (element) => this._settings = element, onClick: this._onOpenSettingsPopup },
401
- React.createElement("span", { className: "icon icon-settings" })),
402
- React.createElement(core_react_1.Popup, { className: "shadow-settings-popup", target: this._settings, offset: 11, isOpen: this.state.isSettingsOpened, onClose: this._onCloseSettingsPopup, position: appui_abstract_1.RelativePosition.Top },
403
- React.createElement("div", { className: "shadow-settings-popup-container" },
404
- React.createElement("div", { className: "shadow-settings-header" }, this._settingsPopupTitle),
405
- React.createElement("div", { className: "shadow-settings-color" },
406
- React.createElement("div", { className: "shadow-settings-color-top" },
407
- React.createElement(SaturationPicker_1.SaturationPicker, { hsv: this.state.shadowColor.toHSV(), onSaturationChange: this._handleHueOrSaturationChange })),
408
- React.createElement("div", { className: "shadow-settings-color-bottom" },
409
- React.createElement("div", { className: "shadow-settings-color-bottom-left" },
410
- React.createElement(HueSlider_1.HueSlider, { hsv: this.state.shadowColor.toHSV(), onHueChange: this._handleHueOrSaturationChange, isHorizontal: true })),
411
- React.createElement("div", { className: "shadow-settings-color-bottom-right" },
412
- React.createElement(Swatch_1.ColorSwatch, { style: colorSwatchStyle, colorDef: this.state.shadowColor, round: false })))),
413
- React.createElement("div", { className: "shadow-settings-color-presets" },
414
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[0], round: false, onColorPick: this._onPresetColorPick }),
415
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[1], round: false, onColorPick: this._onPresetColorPick }),
416
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[2], round: false, onColorPick: this._onPresetColorPick }),
417
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[3], round: false, onColorPick: this._onPresetColorPick }),
418
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[4], round: false, onColorPick: this._onPresetColorPick }),
419
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[5], round: false, onColorPick: this._onPresetColorPick }),
420
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[6], round: false, onColorPick: this._onPresetColorPick }),
421
- React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[7], round: false, onColorPick: this._onPresetColorPick })))))));
422
- }
423
- }
424
- exports.SolarTimeline = SolarTimeline;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Timeline
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || function (mod) {
26
+ if (mod && mod.__esModule) return mod;
27
+ var result = {};
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
+ __setModuleDefault(result, mod);
30
+ return result;
31
+ };
32
+ var __importDefault = (this && this.__importDefault) || function (mod) {
33
+ return (mod && mod.__esModule) ? mod : { "default": mod };
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SolarTimeline = void 0;
37
+ // component is in alpha state - it may change after usability testing - test coverage not complete
38
+ /* istanbul ignore file */
39
+ require("./SolarTimeline.scss");
40
+ const classnames_1 = __importDefault(require("classnames"));
41
+ const React = __importStar(require("react"));
42
+ const itwinui_react_1 = require("@itwin/itwinui-react");
43
+ const core_common_1 = require("@itwin/core-common");
44
+ const appui_abstract_1 = require("@itwin/appui-abstract");
45
+ const core_react_1 = require("@itwin/core-react");
46
+ const components_react_1 = require("@itwin/components-react");
47
+ const HueSlider_1 = require("../color/HueSlider");
48
+ const SaturationPicker_1 = require("../color/SaturationPicker");
49
+ const Swatch_1 = require("../color/Swatch");
50
+ const PlayerButton_1 = require("./PlayerButton");
51
+ const SpeedTimeline_1 = require("./SpeedTimeline");
52
+ const Scrubber_1 = require("./Scrubber");
53
+ const UiIModelComponents_1 = require("../UiIModelComponents");
54
+ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
55
+ // cSpell:ignore millisec solarsettings showticks shadowcolor solartimeline datepicker millisecs
56
+ const millisecPerMinute = 1000 * 60;
57
+ const millisecPerHour = millisecPerMinute * 60;
58
+ // const millisecPerDay = millisecPerHour * 24;
59
+ const defaultPlaybackDuration = 40 * 1000; // 40 seconds
60
+ const addZero = (i) => {
61
+ return (i < 10) ? `0${i}` : i;
62
+ };
63
+ function Timeline(props) {
64
+ const sliderRef = React.useRef(null);
65
+ const [sliderContainer, setSliderContainer] = React.useState();
66
+ const [pointerPercent, setPointerPercent] = React.useState(0);
67
+ React.useLayoutEffect(() => {
68
+ // istanbul ignore else
69
+ if (sliderRef.current) {
70
+ const container = sliderRef.current.querySelector(".iui-slider-container");
71
+ if (container && sliderContainer !== container) {
72
+ setSliderContainer(container);
73
+ }
74
+ }
75
+ }, [sliderContainer]);
76
+ const thumbProps = () => {
77
+ return {
78
+ className: "components-timeline-thumb",
79
+ children: React.createElement(Scrubber_1.CustomThumb, null),
80
+ };
81
+ };
82
+ const tooltipProps = React.useCallback(() => {
83
+ return { visible: false };
84
+ }, []);
85
+ const [showRailTooltip, setShowRailTooltip] = React.useState(false);
86
+ const handlePointerEnter = React.useCallback(() => {
87
+ setShowRailTooltip(true);
88
+ }, []);
89
+ const handlePointerLeave = React.useCallback(() => {
90
+ setShowRailTooltip(false);
91
+ }, []);
92
+ const handlePointerMove = React.useCallback((event) => {
93
+ sliderContainer &&
94
+ setPointerPercent((0, Scrubber_1.getPercentageOfRectangle)(sliderContainer.getBoundingClientRect(), event.clientX));
95
+ }, [sliderContainer]);
96
+ const { formatTick, formatTime, onChange, onUpdate, dayStartMs, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, isPlaying } = props;
97
+ const thumbHasFocus = (0, Scrubber_1.useFocusedThumb)(sliderContainer);
98
+ const tickLabel = React.useMemo(() => {
99
+ const showTip = isPlaying || showRailTooltip || thumbHasFocus;
100
+ const totalDuration = sunSetOffsetMs - sunRiseOffsetMs;
101
+ const percent = (isPlaying || thumbHasFocus) ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration : pointerPercent;
102
+ const tooltipText = formatTime((isPlaying || thumbHasFocus) ? (dayStartMs + currentTimeOffsetMs) : (dayStartMs + (sunRiseOffsetMs + (pointerPercent * totalDuration))));
103
+ return (React.createElement(Scrubber_1.RailMarkers, { showToolTip: showTip, percent: percent, tooltipText: tooltipText }));
104
+ }, [isPlaying, showRailTooltip, thumbHasFocus, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, pointerPercent, formatTime, dayStartMs]);
105
+ const className = (0, classnames_1.default)("solar-slider", props.className, formatTick && "showticks");
106
+ const sunRiseFormat = formatTime(dayStartMs + sunRiseOffsetMs);
107
+ const sunSetFormat = formatTime(dayStartMs + sunSetOffsetMs);
108
+ return (React.createElement("div", { className: className },
109
+ React.createElement(itwinui_react_1.Tooltip, { content: sunRiseFormat },
110
+ React.createElement("span", { className: "sunrise" }, "\u2600")),
111
+ React.createElement(itwinui_react_1.Slider, { ref: sliderRef, className: className, step: millisecPerMinute, min: sunRiseOffsetMs, max: sunSetOffsetMs, minLabel: "", maxLabel: "", onUpdate: onUpdate, onChange: onChange, values: [currentTimeOffsetMs], tooltipProps: tooltipProps, thumbProps: thumbProps, tickLabels: tickLabel, railContainerProps: {
112
+ onPointerEnter: handlePointerEnter,
113
+ onPointerMove: handlePointerMove,
114
+ onPointerLeave: handlePointerLeave,
115
+ } }),
116
+ React.createElement(itwinui_react_1.Tooltip, { content: sunSetFormat },
117
+ React.createElement("span", { className: "sunset" }, "\u263D"))));
118
+ }
119
+ /** Solar Timeline
120
+ * @alpha
121
+ */
122
+ class SolarTimeline extends React.PureComponent {
123
+ constructor(props) {
124
+ super(props);
125
+ this._datePicker = null;
126
+ this._settings = null;
127
+ this._requestFrame = 0;
128
+ this._unmounted = false;
129
+ this._timeLastCycle = 0;
130
+ this._totalPlayTime = 0;
131
+ this._settingsPopupTitle = UiIModelComponents_1.UiIModelComponents.translate("solarsettings.shadowcolor");
132
+ this._playLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.play");
133
+ this._settingLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.settings");
134
+ this._loopLabel = UiIModelComponents_1.UiIModelComponents.translate("timeline.repeat");
135
+ this._speedLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.speed");
136
+ this._dateTimeLabel = UiIModelComponents_1.UiIModelComponents.translate("solartimeline.dateTime");
137
+ this._months = [
138
+ components_react_1.UiComponents.translate("month.short.january"),
139
+ components_react_1.UiComponents.translate("month.short.february"),
140
+ components_react_1.UiComponents.translate("month.short.march"),
141
+ components_react_1.UiComponents.translate("month.short.april"),
142
+ components_react_1.UiComponents.translate("month.short.may"),
143
+ components_react_1.UiComponents.translate("month.short.june"),
144
+ components_react_1.UiComponents.translate("month.short.july"),
145
+ components_react_1.UiComponents.translate("month.short.august"),
146
+ components_react_1.UiComponents.translate("month.short.september"),
147
+ components_react_1.UiComponents.translate("month.short.october"),
148
+ components_react_1.UiComponents.translate("month.short.november"),
149
+ components_react_1.UiComponents.translate("month.short.december"),
150
+ ];
151
+ this._timeLabel = components_react_1.UiComponents.translate("datepicker.time");
152
+ this._amLabel = components_react_1.UiComponents.translate("time.am");
153
+ this._pmLabel = components_react_1.UiComponents.translate("time.pm");
154
+ this._presetColors = [
155
+ core_common_1.ColorDef.create(core_common_1.ColorByName.grey),
156
+ core_common_1.ColorDef.create(core_common_1.ColorByName.lightGrey),
157
+ core_common_1.ColorDef.create(core_common_1.ColorByName.darkGrey),
158
+ core_common_1.ColorDef.create(core_common_1.ColorByName.lightBlue),
159
+ core_common_1.ColorDef.create(core_common_1.ColorByName.lightGreen),
160
+ core_common_1.ColorDef.create(core_common_1.ColorByName.darkGreen),
161
+ core_common_1.ColorDef.create(core_common_1.ColorByName.tan),
162
+ core_common_1.ColorDef.create(core_common_1.ColorByName.darkBrown),
163
+ ];
164
+ // recursively update the animation until we hit the end or the pause button is clicked
165
+ this._updateAnimation = (_timestamp) => {
166
+ // istanbul ignore else
167
+ if (!this.state.isPlaying || this._unmounted) {
168
+ window.cancelAnimationFrame(this._requestFrame);
169
+ return;
170
+ }
171
+ const currentTime = new Date().getTime();
172
+ this._totalPlayTime += (currentTime - this._timeLastCycle);
173
+ this._timeLastCycle = currentTime;
174
+ let percentComplete = this._totalPlayTime / this.state.adjustedDuration;
175
+ if (percentComplete > 1)
176
+ percentComplete = 1;
177
+ let newPlayingState = true;
178
+ // calculate the next sun time base on the percentage playback complete - should be int value as that is step amount for slider
179
+ let nextSunOffset = Math.floor(this.state.sunRiseOffsetMs + (percentComplete * this.state.sunDeltaMs));
180
+ if (percentComplete > 0.99) {
181
+ if (!this.state.loop) {
182
+ newPlayingState = false;
183
+ nextSunOffset = this.state.sunSetOffsetMs;
184
+ window.cancelAnimationFrame(this._requestFrame);
185
+ }
186
+ else {
187
+ nextSunOffset = this.state.sunRiseOffsetMs;
188
+ this._totalPlayTime = 0;
189
+ }
190
+ }
191
+ if (this.props.dataProvider.onTimeChanged) {
192
+ const currentSunTime = new Date(this.state.dayStartMs + nextSunOffset);
193
+ this.props.dataProvider.onTimeChanged(currentSunTime);
194
+ }
195
+ this.setState({ isPlaying: newPlayingState, currentTimeOffsetMs: nextSunOffset }, () => {
196
+ if (newPlayingState)
197
+ this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
198
+ });
199
+ };
200
+ // user clicked pause button
201
+ this._onPause = () => {
202
+ // istanbul ignore if
203
+ if (!this.state.isPlaying)
204
+ return;
205
+ const currentTime = new Date().getTime();
206
+ this._totalPlayTime += (currentTime - this._timeLastCycle);
207
+ // stop requesting frames
208
+ window.cancelAnimationFrame(this._requestFrame);
209
+ // stop playing
210
+ this.setState({ isPlaying: false });
211
+ // istanbul ignore else
212
+ if (this.props.onPlayPause)
213
+ this.props.onPlayPause(false);
214
+ };
215
+ // user clicked play button
216
+ this._onPlay = () => {
217
+ // istanbul ignore if
218
+ if (this.state.isPlaying)
219
+ return;
220
+ if (this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs || this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs) {
221
+ this._totalPlayTime = 0;
222
+ this._play(this.state.sunRiseOffsetMs);
223
+ }
224
+ else {
225
+ this._play(this.state.currentTimeOffsetMs);
226
+ }
227
+ };
228
+ /** note the day passed in is in the time of the current user not in project time because the date picker works in
229
+ * local time */
230
+ this._onDayClick = (day) => {
231
+ const selectedDate = new Date(day.getTime() + this.state.currentTimeOffsetMs);
232
+ this.props.dataProvider.setDateAndTime(selectedDate);
233
+ const dayStartMs = this.props.dataProvider.dayStartMs;
234
+ const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;
235
+ const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;
236
+ const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;
237
+ const sunOffsetMs = this.ensureRange(this.state.currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);
238
+ this.setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs);
239
+ /** call dataProvider to update display style */
240
+ if (this.props.dataProvider.onTimeChanged)
241
+ this.props.dataProvider.onTimeChanged(this.props.dataProvider.timeOfDay);
242
+ this.setState({ dayStartMs, sunRiseOffsetMs, sunSetOffsetMs, currentTimeOffsetMs: sunOffsetMs, sunDeltaMs, isDateOpened: false }, () => {
243
+ this._timeLastCycle = new Date().getTime();
244
+ });
245
+ };
246
+ this._onTimeChanged = (time) => {
247
+ // compute the current date (with time)
248
+ const dayStartMs = this.props.dataProvider.dayStartMs;
249
+ const sunTime = (time.hours * millisecPerHour) + (time.minutes * millisecPerMinute);
250
+ const dateWithNewTime = new Date(dayStartMs + sunTime);
251
+ this.props.dataProvider.setDateAndTime(dateWithNewTime, true);
252
+ // notify the provider to update style
253
+ if (this.props.dataProvider.onTimeChanged)
254
+ this.props.dataProvider.onTimeChanged(dateWithNewTime);
255
+ const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);
256
+ this.setPlaybackTimeBySunTime(currentTimeOffsetMs, this.state.sunRiseOffsetMs, this.state.sunDeltaMs);
257
+ this._timeLastCycle = new Date().getTime();
258
+ // update the timeline
259
+ this.setState({ currentTimeOffsetMs });
260
+ };
261
+ this._onCloseDayPicker = () => {
262
+ this.setState({ isDateOpened: false });
263
+ };
264
+ this._onOpenDayPicker = () => {
265
+ this.setState((prevState) => ({ isDateOpened: !prevState.isDateOpened }));
266
+ };
267
+ this._onCloseSettingsPopup = () => {
268
+ this.setState({ isSettingsOpened: false });
269
+ };
270
+ this._onOpenSettingsPopup = () => {
271
+ this.setState((prevState) => ({ isSettingsOpened: !prevState.isSettingsOpened }));
272
+ };
273
+ this._onUpdate = (values) => {
274
+ if (!this.state.isPlaying)
275
+ this.processSunTimeChange(values[0]);
276
+ };
277
+ this._onChange = (values) => {
278
+ if (!this.state.isPlaying)
279
+ this.processSunTimeChange(values[0]);
280
+ };
281
+ this._onSpeedChange = (value) => {
282
+ const adjustedDuration = this.state.duration / value;
283
+ this.setState({ speed: value, adjustedDuration });
284
+ };
285
+ this._onToggleLoop = () => {
286
+ this.setState((prevState) => ({ loop: !prevState.loop }));
287
+ };
288
+ this._formatTime = (millisec) => {
289
+ const date = new Date(millisec);
290
+ // convert project date to browser locale date
291
+ const localTime = (0, components_react_1.adjustDateToTimezone)(date, this.props.dataProvider.timeZoneOffset * 60);
292
+ let hours = localTime.getHours();
293
+ const minutes = addZero(date.getMinutes());
294
+ const abbrev = (hours < 12) ? this._amLabel : (hours === 24) ? this._amLabel : this._pmLabel;
295
+ hours = (hours > 12) ? hours - 12 : hours;
296
+ return `${hours}:${minutes} ${abbrev}`;
297
+ };
298
+ this._onPresetColorPick = (shadowColor) => {
299
+ this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
300
+ };
301
+ this._handleHueOrSaturationChange = (hueOrSaturation) => {
302
+ if (hueOrSaturation.s === 0) // for a ColorDef to be created from hsv s can't be 0
303
+ hueOrSaturation = hueOrSaturation.clone(undefined, 0.5);
304
+ const shadowColor = hueOrSaturation.toColorDef();
305
+ this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
306
+ };
307
+ const dayStartMs = this.props.dataProvider.dayStartMs;
308
+ const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;
309
+ const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;
310
+ const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;
311
+ const sunOffsetMs = this.props.dataProvider.timeOfDay.getTime() - dayStartMs;
312
+ const currentTimeOffsetMs = this.ensureRange(sunOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);
313
+ const shadowColor = this.props.dataProvider.shadowColor;
314
+ const duration = this.props.duration ? this.props.duration : defaultPlaybackDuration;
315
+ const speed = this.props.speed ? this.props.speed : 2;
316
+ const adjustedDuration = duration / speed;
317
+ this.setPlaybackTimeBySunTime(currentTimeOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration);
318
+ this.state = {
319
+ isDateOpened: false,
320
+ isSettingsOpened: false,
321
+ isPlaying: false,
322
+ dayStartMs,
323
+ sunRiseOffsetMs,
324
+ sunSetOffsetMs,
325
+ sunDeltaMs,
326
+ currentTimeOffsetMs,
327
+ speed,
328
+ loop: false,
329
+ shadowColor,
330
+ duration,
331
+ adjustedDuration,
332
+ };
333
+ }
334
+ componentWillUnmount() {
335
+ window.cancelAnimationFrame(this._requestFrame);
336
+ this._unmounted = true;
337
+ }
338
+ _play(sunTimeMs) {
339
+ this._timeLastCycle = new Date().getTime();
340
+ // start playing
341
+ this.setState({ isPlaying: true, currentTimeOffsetMs: sunTimeMs }, () => {
342
+ this._requestFrame = window.requestAnimationFrame(this._updateAnimation);
343
+ // istanbul ignore else
344
+ if (this.props.onPlayPause)
345
+ this.props.onPlayPause(true);
346
+ });
347
+ }
348
+ setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration) {
349
+ this._totalPlayTime = ((sunOffsetMs - sunRiseOffsetMs) / (sunDeltaMs)) * ((adjustedDuration) ? adjustedDuration : this.state.adjustedDuration);
350
+ }
351
+ ensureRange(value, min, max) {
352
+ return Math.max(Math.min(value, max), min);
353
+ }
354
+ processSunTimeChange(sunTime) {
355
+ if (sunTime === this.state.currentTimeOffsetMs)
356
+ return;
357
+ const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);
358
+ if (this.props.dataProvider.onTimeChanged) {
359
+ const currentSunTime = new Date(this.state.dayStartMs + currentTimeOffsetMs);
360
+ this.props.dataProvider.onTimeChanged(currentSunTime);
361
+ }
362
+ this.setState({ currentTimeOffsetMs }, () => {
363
+ const currentTime = new Date().getTime();
364
+ this._timeLastCycle = currentTime;
365
+ const percentComplete = (currentTimeOffsetMs - this.state.sunRiseOffsetMs) / this.state.sunDeltaMs;
366
+ this._totalPlayTime = percentComplete * this.state.adjustedDuration;
367
+ });
368
+ }
369
+ getLocalTime(ticks) {
370
+ const projectTime = new Date(ticks);
371
+ // convert project date to browser locale date
372
+ return (0, components_react_1.adjustDateToTimezone)(projectTime, this.props.dataProvider.timeZoneOffset * 60);
373
+ }
374
+ render() {
375
+ const { dataProvider } = this.props;
376
+ const { speed, loop, currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs } = this.state;
377
+ const localTime = this.getLocalTime(this.state.dayStartMs + this.state.currentTimeOffsetMs);
378
+ const formattedTime = this._formatTime(dataProvider.dayStartMs + currentTimeOffsetMs);
379
+ const formattedDate = `${this._months[localTime.getMonth()]}, ${localTime.getDate()}`;
380
+ const colorSwatchStyle = {
381
+ width: `100%`,
382
+ height: `100%`,
383
+ };
384
+ return (React.createElement("div", { className: "solar-timeline-wrapper" },
385
+ React.createElement("div", { className: "header" },
386
+ React.createElement(PlayerButton_1.PlayButton, { tooltip: this._playLabel, className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause }),
387
+ React.createElement("button", { "data-testid": "solar-date-time-button", title: this._dateTimeLabel, className: "current-date", ref: (element) => this._datePicker = element, onClick: this._onOpenDayPicker },
388
+ React.createElement("span", null, formattedDate),
389
+ React.createElement("span", null, "/"),
390
+ React.createElement("span", null, formattedTime),
391
+ React.createElement("span", { className: "icon" },
392
+ React.createElement(core_react_1.Icon, { iconSpec: React.createElement(itwinui_icons_react_1.SvgCalendar, null) }))),
393
+ React.createElement(core_react_1.Popup, { style: { border: "none" }, offset: 11, target: this._datePicker, isOpen: this.state.isDateOpened, onClose: this._onCloseDayPicker, position: appui_abstract_1.RelativePosition.Top },
394
+ React.createElement("div", { className: "components-date-picker-calendar-popup-panel", "data-testid": "components-date-picker-calendar-popup-panel" },
395
+ React.createElement(components_react_1.DatePicker, { selected: localTime, onDateChange: this._onDayClick, showFocusOutline: false }),
396
+ React.createElement("div", { className: "time-container" },
397
+ React.createElement(itwinui_react_1.Text, { variant: "body", className: "time-label" }, this._timeLabel),
398
+ React.createElement(components_react_1.TimeField, { time: { hours: localTime.getHours(), minutes: localTime.getMinutes(), seconds: 0 }, timeDisplay: appui_abstract_1.TimeDisplay.H12MC, onTimeChange: this._onTimeChanged })))),
399
+ React.createElement(Timeline, { className: "solar-timeline", dayStartMs: dataProvider.dayStartMs, sunSetOffsetMs: sunSetOffsetMs, sunRiseOffsetMs: sunRiseOffsetMs, currentTimeOffsetMs: currentTimeOffsetMs, onChange: this._onChange, onUpdate: this._onUpdate, formatTime: this._formatTime, isPlaying: this.state.isPlaying }),
400
+ React.createElement("div", { className: "speed-container" },
401
+ React.createElement("span", { title: this._speedLabel },
402
+ speed,
403
+ "x"),
404
+ React.createElement(SpeedTimeline_1.SpeedTimeline, { className: "speed", onChange: this._onSpeedChange, speed: this.state.speed })),
405
+ React.createElement("span", { title: this._loopLabel, className: (0, classnames_1.default)("icon", !loop && "no-loop-playback", loop && "loop-playback"), onClick: this._onToggleLoop, role: "button", tabIndex: -1 },
406
+ React.createElement(core_react_1.Icon, { iconSpec: React.createElement(itwinui_icons_react_1.SvgLoop, null) })),
407
+ React.createElement("button", { "data-testid": "shadow-settings-button", title: this._settingLabel, className: "shadow-settings-button", ref: (element) => this._settings = element, onClick: this._onOpenSettingsPopup },
408
+ React.createElement("span", { className: "icon" },
409
+ React.createElement(core_react_1.Icon, { iconSpec: React.createElement(itwinui_icons_react_1.SvgSettings, null) }))),
410
+ React.createElement(core_react_1.Popup, { className: "shadow-settings-popup", target: this._settings, offset: 11, isOpen: this.state.isSettingsOpened, onClose: this._onCloseSettingsPopup, position: appui_abstract_1.RelativePosition.Top },
411
+ React.createElement("div", { className: "shadow-settings-popup-container" },
412
+ React.createElement("div", { className: "shadow-settings-header" }, this._settingsPopupTitle),
413
+ React.createElement("div", { className: "shadow-settings-color" },
414
+ React.createElement("div", { className: "shadow-settings-color-top" },
415
+ React.createElement(SaturationPicker_1.SaturationPicker, { hsv: this.state.shadowColor.toHSV(), onSaturationChange: this._handleHueOrSaturationChange })),
416
+ React.createElement("div", { className: "shadow-settings-color-bottom" },
417
+ React.createElement("div", { className: "shadow-settings-color-bottom-left" },
418
+ React.createElement(HueSlider_1.HueSlider, { hsv: this.state.shadowColor.toHSV(), onHueChange: this._handleHueOrSaturationChange, isHorizontal: true })),
419
+ React.createElement("div", { className: "shadow-settings-color-bottom-right" },
420
+ React.createElement(Swatch_1.ColorSwatch, { style: colorSwatchStyle, colorDef: this.state.shadowColor, round: false })))),
421
+ React.createElement("div", { className: "shadow-settings-color-presets" },
422
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[0], round: false, onColorPick: this._onPresetColorPick }),
423
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[1], round: false, onColorPick: this._onPresetColorPick }),
424
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[2], round: false, onColorPick: this._onPresetColorPick }),
425
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[3], round: false, onColorPick: this._onPresetColorPick }),
426
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[4], round: false, onColorPick: this._onPresetColorPick }),
427
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[5], round: false, onColorPick: this._onPresetColorPick }),
428
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[6], round: false, onColorPick: this._onPresetColorPick }),
429
+ React.createElement(Swatch_1.ColorSwatch, { colorDef: this._presetColors[7], round: false, onColorPick: this._onPresetColorPick })))))));
430
+ }
431
+ }
432
+ exports.SolarTimeline = SolarTimeline;
425
433
  //# sourceMappingURL=SolarTimeline.js.map