@itwin/imodel-components-react 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/CHANGELOG.md +335 -327
  2. package/LICENSE.md +9 -9
  3. package/README.md +11 -11
  4. package/lib/cjs/imodel-components-react/UiIModelComponents.d.ts.map +1 -1
  5. package/lib/cjs/imodel-components-react/UiIModelComponents.js +13 -10
  6. package/lib/cjs/imodel-components-react/UiIModelComponents.js.map +1 -1
  7. package/lib/cjs/imodel-components-react/color/AlphaSlider.d.ts.map +1 -1
  8. package/lib/cjs/imodel-components-react/color/AlphaSlider.js +23 -17
  9. package/lib/cjs/imodel-components-react/color/AlphaSlider.js.map +1 -1
  10. package/lib/cjs/imodel-components-react/color/AlphaSlider.scss +71 -63
  11. package/lib/cjs/imodel-components-react/color/ColorPickerButton.d.ts +1 -1
  12. package/lib/cjs/imodel-components-react/color/ColorPickerButton.d.ts.map +1 -1
  13. package/lib/cjs/imodel-components-react/color/ColorPickerButton.js +11 -9
  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 +1 -1
  17. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.d.ts.map +1 -1
  18. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js +6 -8
  19. package/lib/cjs/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  20. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.d.ts +1 -1
  21. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.d.ts.map +1 -1
  22. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js +11 -12
  23. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  24. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.scss +62 -62
  25. package/lib/cjs/imodel-components-react/color/HueSlider.d.ts +1 -1
  26. package/lib/cjs/imodel-components-react/color/HueSlider.d.ts.map +1 -1
  27. package/lib/cjs/imodel-components-react/color/HueSlider.js +32 -15
  28. package/lib/cjs/imodel-components-react/color/HueSlider.js.map +1 -1
  29. package/lib/cjs/imodel-components-react/color/HueSlider.scss +78 -61
  30. package/lib/cjs/imodel-components-react/color/SaturationPicker.d.ts +1 -1
  31. package/lib/cjs/imodel-components-react/color/SaturationPicker.d.ts.map +1 -1
  32. package/lib/cjs/imodel-components-react/color/SaturationPicker.js +14 -11
  33. package/lib/cjs/imodel-components-react/color/SaturationPicker.js.map +1 -1
  34. package/lib/cjs/imodel-components-react/color/SaturationPicker.scss +36 -35
  35. package/lib/cjs/imodel-components-react/color/Swatch.d.ts.map +1 -1
  36. package/lib/cjs/imodel-components-react/color/Swatch.js +5 -8
  37. package/lib/cjs/imodel-components-react/color/Swatch.js.map +1 -1
  38. package/lib/cjs/imodel-components-react/color/Swatch.scss +22 -22
  39. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.d.ts.map +1 -1
  40. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js +3 -3
  41. package/lib/cjs/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  42. package/lib/cjs/imodel-components-react/editors/ColorEditor.d.ts.map +1 -1
  43. package/lib/cjs/imodel-components-react/editors/ColorEditor.js +17 -9
  44. package/lib/cjs/imodel-components-react/editors/ColorEditor.js.map +1 -1
  45. package/lib/cjs/imodel-components-react/editors/ColorEditor.scss +18 -18
  46. package/lib/cjs/imodel-components-react/editors/WeightEditor.d.ts.map +1 -1
  47. package/lib/cjs/imodel-components-react/editors/WeightEditor.js +8 -6
  48. package/lib/cjs/imodel-components-react/editors/WeightEditor.js.map +1 -1
  49. package/lib/cjs/imodel-components-react/editors/WeightEditor.scss +16 -16
  50. package/lib/cjs/imodel-components-react/inputs/QuantityInput.d.ts +1 -1
  51. package/lib/cjs/imodel-components-react/inputs/QuantityInput.d.ts.map +1 -1
  52. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js +18 -12
  53. package/lib/cjs/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  54. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts +1 -1
  55. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  56. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js +36 -22
  57. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  58. package/lib/cjs/imodel-components-react/inputs/QuantityNumberInput.scss +106 -106
  59. package/lib/cjs/imodel-components-react/lineweight/Swatch.d.ts.map +1 -1
  60. package/lib/cjs/imodel-components-react/lineweight/Swatch.js +12 -16
  61. package/lib/cjs/imodel-components-react/lineweight/Swatch.js.map +1 -1
  62. package/lib/cjs/imodel-components-react/lineweight/Swatch.scss +48 -48
  63. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.d.ts.map +1 -1
  64. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js +14 -10
  65. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  66. package/lib/cjs/imodel-components-react/lineweight/WeightPickerButton.scss +51 -51
  67. package/lib/cjs/imodel-components-react/navigationaids/Cube.d.ts.map +1 -1
  68. package/lib/cjs/imodel-components-react/navigationaids/Cube.js +31 -11
  69. package/lib/cjs/imodel-components-react/navigationaids/Cube.js.map +1 -1
  70. package/lib/cjs/imodel-components-react/navigationaids/Cube.scss +19 -19
  71. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  72. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js +103 -49
  73. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  74. package/lib/cjs/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -178
  75. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts.map +1 -1
  76. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js +171 -66
  77. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  78. package/lib/cjs/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -135
  79. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.d.ts.map +1 -1
  80. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js +20 -13
  81. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  82. package/lib/cjs/imodel-components-react/quantityformat/FormatPanel.scss +59 -59
  83. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
  84. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +4 -7
  85. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  86. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.d.ts.map +1 -1
  87. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js +14 -10
  88. package/lib/cjs/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  89. package/lib/cjs/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
  90. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +33 -11
  91. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  92. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
  93. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +16 -10
  94. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  95. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.d.ts.map +1 -1
  96. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js +32 -24
  97. package/lib/cjs/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  98. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
  99. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +58 -39
  100. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  101. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts.map +1 -1
  102. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js +8 -7
  103. package/lib/cjs/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  104. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts.map +1 -1
  105. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js +55 -16
  106. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  107. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts.map +1 -1
  108. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js +11 -5
  109. package/lib/cjs/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  110. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts.map +1 -1
  111. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js +39 -12
  112. package/lib/cjs/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  113. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.d.ts.map +1 -1
  114. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js +11 -5
  115. package/lib/cjs/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  116. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.d.ts.map +1 -1
  117. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js +19 -7
  118. package/lib/cjs/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  119. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts.map +1 -1
  120. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +21 -8
  121. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  122. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts.map +1 -1
  123. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js +11 -5
  124. package/lib/cjs/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  125. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts.map +1 -1
  126. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js +13 -6
  127. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  128. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
  129. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +22 -12
  130. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  131. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.d.ts.map +1 -1
  132. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js +30 -13
  133. package/lib/cjs/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  134. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.d.ts.map +1 -1
  135. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js +15 -7
  136. package/lib/cjs/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  137. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts.map +1 -1
  138. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js +11 -9
  139. package/lib/cjs/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  140. package/lib/cjs/imodel-components-react/timeline/InlineEdit.d.ts.map +1 -1
  141. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js +7 -4
  142. package/lib/cjs/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  143. package/lib/cjs/imodel-components-react/timeline/InlineEdit.scss +27 -27
  144. package/lib/cjs/imodel-components-react/timeline/PlayerButton.d.ts.map +1 -1
  145. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js +3 -3
  146. package/lib/cjs/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  147. package/lib/cjs/imodel-components-react/timeline/PlayerButton.scss +28 -28
  148. package/lib/cjs/imodel-components-react/timeline/Scrubber.d.ts +1 -1
  149. package/lib/cjs/imodel-components-react/timeline/Scrubber.d.ts.map +1 -1
  150. package/lib/cjs/imodel-components-react/timeline/Scrubber.js +32 -17
  151. package/lib/cjs/imodel-components-react/timeline/Scrubber.js.map +1 -1
  152. package/lib/cjs/imodel-components-react/timeline/Scrubber.scss +105 -105
  153. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.d.ts.map +1 -1
  154. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js +61 -27
  155. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  156. package/lib/cjs/imodel-components-react/timeline/SolarTimeline.scss +359 -359
  157. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.d.ts.map +1 -1
  158. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js +4 -5
  159. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  160. package/lib/cjs/imodel-components-react/timeline/SpeedTimeline.scss +40 -40
  161. package/lib/cjs/imodel-components-react/timeline/Timeline.scss +165 -165
  162. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  163. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js +56 -29
  164. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  165. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.scss +178 -178
  166. package/lib/cjs/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  167. package/lib/cjs/imodel-components-react/timeline/interfaces.js +3 -3
  168. package/lib/cjs/imodel-components-react/timeline/interfaces.js.map +1 -1
  169. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts +2 -2
  170. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  171. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js +45 -33
  172. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  173. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.d.ts.map +1 -1
  174. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js +5 -4
  175. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  176. package/lib/cjs/imodel-components-react.js +3 -3
  177. package/lib/cjs/imodel-components-react.js.map +1 -1
  178. package/lib/esm/imodel-components-react/UiIModelComponents.d.ts.map +1 -1
  179. package/lib/esm/imodel-components-react/UiIModelComponents.js +13 -10
  180. package/lib/esm/imodel-components-react/UiIModelComponents.js.map +1 -1
  181. package/lib/esm/imodel-components-react/color/AlphaSlider.d.ts.map +1 -1
  182. package/lib/esm/imodel-components-react/color/AlphaSlider.js +23 -17
  183. package/lib/esm/imodel-components-react/color/AlphaSlider.js.map +1 -1
  184. package/lib/esm/imodel-components-react/color/AlphaSlider.scss +71 -63
  185. package/lib/esm/imodel-components-react/color/ColorPickerButton.d.ts +1 -1
  186. package/lib/esm/imodel-components-react/color/ColorPickerButton.d.ts.map +1 -1
  187. package/lib/esm/imodel-components-react/color/ColorPickerButton.js +11 -9
  188. package/lib/esm/imodel-components-react/color/ColorPickerButton.js.map +1 -1
  189. package/lib/esm/imodel-components-react/color/ColorPickerButton.scss +90 -90
  190. package/lib/esm/imodel-components-react/color/ColorPickerDialog.d.ts +1 -1
  191. package/lib/esm/imodel-components-react/color/ColorPickerDialog.d.ts.map +1 -1
  192. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js +7 -9
  193. package/lib/esm/imodel-components-react/color/ColorPickerDialog.js.map +1 -1
  194. package/lib/esm/imodel-components-react/color/ColorPickerPopup.d.ts +1 -1
  195. package/lib/esm/imodel-components-react/color/ColorPickerPopup.d.ts.map +1 -1
  196. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js +13 -14
  197. package/lib/esm/imodel-components-react/color/ColorPickerPopup.js.map +1 -1
  198. package/lib/esm/imodel-components-react/color/ColorPickerPopup.scss +62 -62
  199. package/lib/esm/imodel-components-react/color/HueSlider.d.ts +1 -1
  200. package/lib/esm/imodel-components-react/color/HueSlider.d.ts.map +1 -1
  201. package/lib/esm/imodel-components-react/color/HueSlider.js +32 -15
  202. package/lib/esm/imodel-components-react/color/HueSlider.js.map +1 -1
  203. package/lib/esm/imodel-components-react/color/HueSlider.scss +78 -61
  204. package/lib/esm/imodel-components-react/color/SaturationPicker.d.ts +1 -1
  205. package/lib/esm/imodel-components-react/color/SaturationPicker.d.ts.map +1 -1
  206. package/lib/esm/imodel-components-react/color/SaturationPicker.js +14 -11
  207. package/lib/esm/imodel-components-react/color/SaturationPicker.js.map +1 -1
  208. package/lib/esm/imodel-components-react/color/SaturationPicker.scss +36 -35
  209. package/lib/esm/imodel-components-react/color/Swatch.d.ts.map +1 -1
  210. package/lib/esm/imodel-components-react/color/Swatch.js +5 -8
  211. package/lib/esm/imodel-components-react/color/Swatch.js.map +1 -1
  212. package/lib/esm/imodel-components-react/color/Swatch.scss +22 -22
  213. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.d.ts.map +1 -1
  214. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js +3 -3
  215. package/lib/esm/imodel-components-react/color/getCSSColorFromDef.js.map +1 -1
  216. package/lib/esm/imodel-components-react/editors/ColorEditor.d.ts.map +1 -1
  217. package/lib/esm/imodel-components-react/editors/ColorEditor.js +18 -10
  218. package/lib/esm/imodel-components-react/editors/ColorEditor.js.map +1 -1
  219. package/lib/esm/imodel-components-react/editors/ColorEditor.scss +18 -18
  220. package/lib/esm/imodel-components-react/editors/WeightEditor.d.ts.map +1 -1
  221. package/lib/esm/imodel-components-react/editors/WeightEditor.js +10 -8
  222. package/lib/esm/imodel-components-react/editors/WeightEditor.js.map +1 -1
  223. package/lib/esm/imodel-components-react/editors/WeightEditor.scss +16 -16
  224. package/lib/esm/imodel-components-react/inputs/QuantityInput.d.ts +1 -1
  225. package/lib/esm/imodel-components-react/inputs/QuantityInput.d.ts.map +1 -1
  226. package/lib/esm/imodel-components-react/inputs/QuantityInput.js +18 -12
  227. package/lib/esm/imodel-components-react/inputs/QuantityInput.js.map +1 -1
  228. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts +1 -1
  229. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.d.ts.map +1 -1
  230. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js +38 -24
  231. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.js.map +1 -1
  232. package/lib/esm/imodel-components-react/inputs/QuantityNumberInput.scss +106 -106
  233. package/lib/esm/imodel-components-react/lineweight/Swatch.d.ts.map +1 -1
  234. package/lib/esm/imodel-components-react/lineweight/Swatch.js +12 -16
  235. package/lib/esm/imodel-components-react/lineweight/Swatch.js.map +1 -1
  236. package/lib/esm/imodel-components-react/lineweight/Swatch.scss +48 -48
  237. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.d.ts.map +1 -1
  238. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js +14 -10
  239. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.js.map +1 -1
  240. package/lib/esm/imodel-components-react/lineweight/WeightPickerButton.scss +51 -51
  241. package/lib/esm/imodel-components-react/navigationaids/Cube.d.ts.map +1 -1
  242. package/lib/esm/imodel-components-react/navigationaids/Cube.js +31 -11
  243. package/lib/esm/imodel-components-react/navigationaids/Cube.js.map +1 -1
  244. package/lib/esm/imodel-components-react/navigationaids/Cube.scss +19 -19
  245. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.d.ts.map +1 -1
  246. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js +105 -51
  247. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.js.map +1 -1
  248. package/lib/esm/imodel-components-react/navigationaids/CubeNavigationAid.scss +178 -178
  249. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.d.ts.map +1 -1
  250. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js +173 -68
  251. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.js.map +1 -1
  252. package/lib/esm/imodel-components-react/navigationaids/DrawingNavigationAid.scss +135 -135
  253. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.d.ts.map +1 -1
  254. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js +20 -13
  255. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.js.map +1 -1
  256. package/lib/esm/imodel-components-react/quantityformat/FormatPanel.scss +59 -59
  257. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
  258. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +4 -7
  259. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  260. package/lib/esm/imodel-components-react/quantityformat/FormatSample.d.ts.map +1 -1
  261. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js +14 -10
  262. package/lib/esm/imodel-components-react/quantityformat/FormatSample.js.map +1 -1
  263. package/lib/esm/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
  264. package/lib/esm/imodel-components-react/quantityformat/FormatType.js +33 -11
  265. package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  266. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
  267. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +16 -10
  268. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  269. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.d.ts.map +1 -1
  270. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js +32 -24
  271. package/lib/esm/imodel-components-react/quantityformat/FormatUnits.js.map +1 -1
  272. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
  273. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +58 -39
  274. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  275. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.d.ts.map +1 -1
  276. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js +8 -7
  277. package/lib/esm/imodel-components-react/quantityformat/QuantityFormatPanel.js.map +1 -1
  278. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.d.ts.map +1 -1
  279. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js +55 -16
  280. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalPrecision.js.map +1 -1
  281. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.d.ts.map +1 -1
  282. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js +11 -5
  283. package/lib/esm/imodel-components-react/quantityformat/misc/DecimalSeparator.js.map +1 -1
  284. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.d.ts.map +1 -1
  285. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js +39 -12
  286. package/lib/esm/imodel-components-react/quantityformat/misc/FractionPrecision.js.map +1 -1
  287. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.d.ts.map +1 -1
  288. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js +11 -5
  289. package/lib/esm/imodel-components-react/quantityformat/misc/ScientificType.js.map +1 -1
  290. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.d.ts.map +1 -1
  291. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js +19 -7
  292. package/lib/esm/imodel-components-react/quantityformat/misc/SignOption.js.map +1 -1
  293. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.d.ts.map +1 -1
  294. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js +21 -8
  295. package/lib/esm/imodel-components-react/quantityformat/misc/StationSeparatorSelector.js.map +1 -1
  296. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.d.ts.map +1 -1
  297. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js +11 -5
  298. package/lib/esm/imodel-components-react/quantityformat/misc/StationSizeSelector.js.map +1 -1
  299. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.d.ts.map +1 -1
  300. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js +13 -6
  301. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSelector.js.map +1 -1
  302. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
  303. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +22 -12
  304. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  305. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.d.ts.map +1 -1
  306. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js +30 -13
  307. package/lib/esm/imodel-components-react/quantityformat/misc/UnitDescr.js.map +1 -1
  308. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.d.ts.map +1 -1
  309. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js +16 -8
  310. package/lib/esm/imodel-components-react/timeline/BaseSolarDataProvider.js.map +1 -1
  311. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.d.ts.map +1 -1
  312. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js +11 -9
  313. package/lib/esm/imodel-components-react/timeline/BaseTimelineDataProvider.js.map +1 -1
  314. package/lib/esm/imodel-components-react/timeline/InlineEdit.d.ts.map +1 -1
  315. package/lib/esm/imodel-components-react/timeline/InlineEdit.js +7 -4
  316. package/lib/esm/imodel-components-react/timeline/InlineEdit.js.map +1 -1
  317. package/lib/esm/imodel-components-react/timeline/InlineEdit.scss +27 -27
  318. package/lib/esm/imodel-components-react/timeline/PlayerButton.d.ts.map +1 -1
  319. package/lib/esm/imodel-components-react/timeline/PlayerButton.js +3 -3
  320. package/lib/esm/imodel-components-react/timeline/PlayerButton.js.map +1 -1
  321. package/lib/esm/imodel-components-react/timeline/PlayerButton.scss +28 -28
  322. package/lib/esm/imodel-components-react/timeline/Scrubber.d.ts +1 -1
  323. package/lib/esm/imodel-components-react/timeline/Scrubber.d.ts.map +1 -1
  324. package/lib/esm/imodel-components-react/timeline/Scrubber.js +32 -17
  325. package/lib/esm/imodel-components-react/timeline/Scrubber.js.map +1 -1
  326. package/lib/esm/imodel-components-react/timeline/Scrubber.scss +105 -105
  327. package/lib/esm/imodel-components-react/timeline/SolarTimeline.d.ts.map +1 -1
  328. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js +63 -29
  329. package/lib/esm/imodel-components-react/timeline/SolarTimeline.js.map +1 -1
  330. package/lib/esm/imodel-components-react/timeline/SolarTimeline.scss +359 -359
  331. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.d.ts.map +1 -1
  332. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js +4 -5
  333. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.js.map +1 -1
  334. package/lib/esm/imodel-components-react/timeline/SpeedTimeline.scss +40 -40
  335. package/lib/esm/imodel-components-react/timeline/Timeline.scss +165 -165
  336. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  337. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js +58 -31
  338. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  339. package/lib/esm/imodel-components-react/timeline/TimelineComponent.scss +178 -178
  340. package/lib/esm/imodel-components-react/timeline/interfaces.d.ts.map +1 -1
  341. package/lib/esm/imodel-components-react/timeline/interfaces.js +3 -3
  342. package/lib/esm/imodel-components-react/timeline/interfaces.js.map +1 -1
  343. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts +2 -2
  344. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  345. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js +47 -35
  346. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  347. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.d.ts.map +1 -1
  348. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js +5 -4
  349. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  350. package/lib/esm/imodel-components-react.js +3 -3
  351. package/lib/esm/imodel-components-react.js.map +1 -1
  352. package/lib/public/locales/en/UiIModelComponents.json +139 -139
  353. package/package.json +15 -24
@@ -1 +1 @@
1
- {"version":3,"file":"SolarTimeline.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/SolarTimeline.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,sBAAsB,CAAC;AAE9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAe,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAuHtD,UAAU,2BAA2B;IACnC,YAAY,EAAE,iBAAiB,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,2BAA2B;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,QAAQ,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK,CAAC,aAAa,CAAC,2BAA2B,EAAE,2BAA2B,CAAC;IAC9G,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAA6D;IACxF,OAAO,CAAC,UAAU,CAAsD;IACxE,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,WAAW,CAAuD;IAC1E,OAAO,CAAC,cAAc,CAA0D;IAEhF,OAAO,CAAC,OAAO,CAab;IAEF,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAS5B;gBAEU,KAAK,EAAE,2BAA2B;IAgC9B,oBAAoB;IAMpC,OAAO,CAAC,gBAAgB,CAuCtB;IAEF,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,QAAQ,CAiBd;IAGF,OAAO,CAAC,OAAO,CAWb;IAEF,OAAO,CAAC,wBAAwB;IAIhC;qBACiB;IACjB,OAAO,CAAC,WAAW,CAkBjB;IAEF,OAAO,CAAC,cAAc,CAkBpB;IAEF,OAAO,CAAC,iBAAiB,CAEvB;IAEF,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,qBAAqB,CAE3B;IAEF,OAAO,CAAC,oBAAoB,CAE1B;IAEF,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,WAAW,CASjB;IAEF,OAAO,CAAC,kBAAkB,CAExB;IAEF,OAAO,CAAC,4BAA4B,CAMlC;IAEK,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxB,MAAM;CAsFvB"}
1
+ {"version":3,"file":"SolarTimeline.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/SolarTimeline.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,sBAAsB,CAAC;AAE9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAe,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAc3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAyKtD,UAAU,2BAA2B;IACnC,YAAY,EAAE,iBAAiB,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,2BAA2B;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,QAAQ,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK,CAAC,aAAa,CACpD,2BAA2B,EAC3B,2BAA2B,CAC5B;IACC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAEzB;IACF,OAAO,CAAC,UAAU,CAAsD;IACxE,OAAO,CAAC,aAAa,CAEnB;IACF,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,WAAW,CAAuD;IAC1E,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,OAAO,CAab;IAEF,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAS5B;gBAEU,KAAK,EAAE,2BAA2B;IA8C9B,oBAAoB;IAMpC,OAAO,CAAC,gBAAgB,CA6CtB;IAEF,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,QAAQ,CAed;IAGF,OAAO,CAAC,OAAO,CAab;IAEF,OAAO,CAAC,wBAAwB;IAWhC;qBACiB;IACjB,OAAO,CAAC,WAAW,CAoCjB;IAEF,OAAO,CAAC,cAAc,CA2BpB;IAEF,OAAO,CAAC,iBAAiB,CAEvB;IAEF,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,qBAAqB,CAE3B;IAEF,OAAO,CAAC,oBAAoB,CAI1B;IAEF,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,SAAS,CAEf;IAEF,OAAO,CAAC,SAAS,CAEf;IAEF,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,WAAW,CAajB;IAEF,OAAO,CAAC,kBAAkB,CAKxB;IAEF,OAAO,CAAC,4BAA4B,CAUlC;IAEK,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASxB,MAAM;CAiNvB"}
@@ -1,7 +1,7 @@
1
1
  /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
5
  /** @packageDocumentation
6
6
  * @module Timeline
7
7
  */
@@ -14,13 +14,13 @@ import { Slider, Text, Tooltip } from "@itwin/itwinui-react";
14
14
  import { ColorByName, ColorDef } from "@itwin/core-common";
15
15
  import { RelativePosition, TimeDisplay } from "@itwin/appui-abstract";
16
16
  import { Icon, Popup } from "@itwin/core-react";
17
- import { adjustDateToTimezone, DatePicker, TimeField, UiComponents } from "@itwin/components-react";
17
+ import { adjustDateToTimezone, DatePicker, TimeField, UiComponents, } from "@itwin/components-react";
18
18
  import { HueSlider } from "../color/HueSlider";
19
19
  import { SaturationPicker } from "../color/SaturationPicker";
20
20
  import { ColorSwatch } from "../color/Swatch";
21
21
  import { PlayButton } from "./PlayerButton";
22
22
  import { SpeedTimeline } from "./SpeedTimeline";
23
- import { CustomThumb, getPercentageOfRectangle, RailMarkers, useFocusedThumb } from "./Scrubber";
23
+ import { CustomThumb, getPercentageOfRectangle, RailMarkers, useFocusedThumb, } from "./Scrubber";
24
24
  import { UiIModelComponents } from "../UiIModelComponents";
25
25
  import { SvgCalendar, SvgLoop, SvgSettings } from "@itwin/itwinui-icons-react";
26
26
  // cSpell:ignore millisec solarsettings showticks shadowcolor solartimeline datepicker millisecs
@@ -29,7 +29,7 @@ const millisecPerHour = millisecPerMinute * 60;
29
29
  // const millisecPerDay = millisecPerHour * 24;
30
30
  const defaultPlaybackDuration = 40 * 1000; // 40 seconds
31
31
  const addZero = (i) => {
32
- return (i < 10) ? `0${i}` : i;
32
+ return i < 10 ? `0${i}` : i;
33
33
  };
34
34
  function Timeline(props) {
35
35
  const sliderRef = React.useRef(null);
@@ -64,15 +64,29 @@ function Timeline(props) {
64
64
  sliderContainer &&
65
65
  setPointerPercent(getPercentageOfRectangle(sliderContainer.getBoundingClientRect(), event.clientX));
66
66
  }, [sliderContainer]);
67
- const { formatTick, formatTime, onChange, onUpdate, dayStartMs, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, isPlaying } = props;
67
+ const { formatTick, formatTime, onChange, onUpdate, dayStartMs, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, isPlaying, } = props;
68
68
  const thumbHasFocus = useFocusedThumb(sliderContainer);
69
69
  const tickLabel = React.useMemo(() => {
70
70
  const showTip = isPlaying || showRailTooltip || thumbHasFocus;
71
71
  const totalDuration = sunSetOffsetMs - sunRiseOffsetMs;
72
- const percent = (isPlaying || thumbHasFocus) ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration : pointerPercent;
73
- const tooltipText = formatTime((isPlaying || thumbHasFocus) ? (dayStartMs + currentTimeOffsetMs) : (dayStartMs + (sunRiseOffsetMs + (pointerPercent * totalDuration))));
72
+ const percent = isPlaying || thumbHasFocus
73
+ ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration
74
+ : pointerPercent;
75
+ const tooltipText = formatTime(isPlaying || thumbHasFocus
76
+ ? dayStartMs + currentTimeOffsetMs
77
+ : dayStartMs + (sunRiseOffsetMs + pointerPercent * totalDuration));
74
78
  return (React.createElement(RailMarkers, { showToolTip: showTip, percent: percent, tooltipText: tooltipText }));
75
- }, [isPlaying, showRailTooltip, thumbHasFocus, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, pointerPercent, formatTime, dayStartMs]);
79
+ }, [
80
+ isPlaying,
81
+ showRailTooltip,
82
+ thumbHasFocus,
83
+ sunSetOffsetMs,
84
+ sunRiseOffsetMs,
85
+ currentTimeOffsetMs,
86
+ pointerPercent,
87
+ formatTime,
88
+ dayStartMs,
89
+ ]);
76
90
  const className = classnames("solar-slider", props.className, formatTick && "showticks");
77
91
  const sunRiseFormat = formatTime(dayStartMs + sunRiseOffsetMs);
78
92
  const sunSetFormat = formatTime(dayStartMs + sunSetOffsetMs);
@@ -140,14 +154,14 @@ export class SolarTimeline extends React.PureComponent {
140
154
  return;
141
155
  }
142
156
  const currentTime = new Date().getTime();
143
- this._totalPlayTime += (currentTime - this._timeLastCycle);
157
+ this._totalPlayTime += currentTime - this._timeLastCycle;
144
158
  this._timeLastCycle = currentTime;
145
159
  let percentComplete = this._totalPlayTime / this.state.adjustedDuration;
146
160
  if (percentComplete > 1)
147
161
  percentComplete = 1;
148
162
  let newPlayingState = true;
149
163
  // calculate the next sun time base on the percentage playback complete - should be int value as that is step amount for slider
150
- let nextSunOffset = Math.floor(this.state.sunRiseOffsetMs + (percentComplete * this.state.sunDeltaMs));
164
+ let nextSunOffset = Math.floor(this.state.sunRiseOffsetMs + percentComplete * this.state.sunDeltaMs);
151
165
  if (percentComplete > 0.99) {
152
166
  if (!this.state.loop) {
153
167
  newPlayingState = false;
@@ -174,7 +188,7 @@ export class SolarTimeline extends React.PureComponent {
174
188
  if (!this.state.isPlaying)
175
189
  return;
176
190
  const currentTime = new Date().getTime();
177
- this._totalPlayTime += (currentTime - this._timeLastCycle);
191
+ this._totalPlayTime += currentTime - this._timeLastCycle;
178
192
  // stop requesting frames
179
193
  window.cancelAnimationFrame(this._requestFrame);
180
194
  // stop playing
@@ -188,7 +202,8 @@ export class SolarTimeline extends React.PureComponent {
188
202
  // istanbul ignore if
189
203
  if (this.state.isPlaying)
190
204
  return;
191
- if (this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs || this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs) {
205
+ if (this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs ||
206
+ this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs) {
192
207
  this._totalPlayTime = 0;
193
208
  this._play(this.state.sunRiseOffsetMs);
194
209
  }
@@ -210,14 +225,21 @@ export class SolarTimeline extends React.PureComponent {
210
225
  /** call dataProvider to update display style */
211
226
  if (this.props.dataProvider.onTimeChanged)
212
227
  this.props.dataProvider.onTimeChanged(this.props.dataProvider.timeOfDay);
213
- this.setState({ dayStartMs, sunRiseOffsetMs, sunSetOffsetMs, currentTimeOffsetMs: sunOffsetMs, sunDeltaMs, isDateOpened: false }, () => {
228
+ this.setState({
229
+ dayStartMs,
230
+ sunRiseOffsetMs,
231
+ sunSetOffsetMs,
232
+ currentTimeOffsetMs: sunOffsetMs,
233
+ sunDeltaMs,
234
+ isDateOpened: false,
235
+ }, () => {
214
236
  this._timeLastCycle = new Date().getTime();
215
237
  });
216
238
  };
217
239
  this._onTimeChanged = (time) => {
218
240
  // compute the current date (with time)
219
241
  const dayStartMs = this.props.dataProvider.dayStartMs;
220
- const sunTime = (time.hours * millisecPerHour) + (time.minutes * millisecPerMinute);
242
+ const sunTime = time.hours * millisecPerHour + time.minutes * millisecPerMinute;
221
243
  const dateWithNewTime = new Date(dayStartMs + sunTime);
222
244
  this.props.dataProvider.setDateAndTime(dateWithNewTime, true);
223
245
  // notify the provider to update style
@@ -239,7 +261,9 @@ export class SolarTimeline extends React.PureComponent {
239
261
  this.setState({ isSettingsOpened: false });
240
262
  };
241
263
  this._onOpenSettingsPopup = () => {
242
- this.setState((prevState) => ({ isSettingsOpened: !prevState.isSettingsOpened }));
264
+ this.setState((prevState) => ({
265
+ isSettingsOpened: !prevState.isSettingsOpened,
266
+ }));
243
267
  };
244
268
  this._onUpdate = (values) => {
245
269
  if (!this.state.isPlaying)
@@ -262,18 +286,19 @@ export class SolarTimeline extends React.PureComponent {
262
286
  const localTime = adjustDateToTimezone(date, this.props.dataProvider.timeZoneOffset * 60);
263
287
  let hours = localTime.getHours();
264
288
  const minutes = addZero(date.getMinutes());
265
- const abbrev = (hours < 12) ? this._amLabel : (hours === 24) ? this._amLabel : this._pmLabel;
266
- hours = (hours > 12) ? hours - 12 : hours;
289
+ const abbrev = hours < 12 ? this._amLabel : hours === 24 ? this._amLabel : this._pmLabel;
290
+ hours = hours > 12 ? hours - 12 : hours;
267
291
  return `${hours}:${minutes} ${abbrev}`;
268
292
  };
269
293
  this._onPresetColorPick = (shadowColor) => {
270
- this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
294
+ this.setState({ shadowColor }, () => (this.props.dataProvider.shadowColor = shadowColor));
271
295
  };
272
296
  this._handleHueOrSaturationChange = (hueOrSaturation) => {
273
- if (hueOrSaturation.s === 0) // for a ColorDef to be created from hsv s can't be 0
297
+ if (hueOrSaturation.s === 0)
298
+ // for a ColorDef to be created from hsv s can't be 0
274
299
  hueOrSaturation = hueOrSaturation.clone(undefined, 0.5);
275
300
  const shadowColor = hueOrSaturation.toColorDef();
276
- this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);
301
+ this.setState({ shadowColor }, () => (this.props.dataProvider.shadowColor = shadowColor));
277
302
  };
278
303
  const dayStartMs = this.props.dataProvider.dayStartMs;
279
304
  const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;
@@ -282,7 +307,9 @@ export class SolarTimeline extends React.PureComponent {
282
307
  const sunOffsetMs = this.props.dataProvider.timeOfDay.getTime() - dayStartMs;
283
308
  const currentTimeOffsetMs = this.ensureRange(sunOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);
284
309
  const shadowColor = this.props.dataProvider.shadowColor;
285
- const duration = this.props.duration ? this.props.duration : defaultPlaybackDuration;
310
+ const duration = this.props.duration
311
+ ? this.props.duration
312
+ : defaultPlaybackDuration;
286
313
  const speed = this.props.speed ? this.props.speed : 2;
287
314
  const adjustedDuration = duration / speed;
288
315
  this.setPlaybackTimeBySunTime(currentTimeOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration);
@@ -317,7 +344,9 @@ export class SolarTimeline extends React.PureComponent {
317
344
  });
318
345
  }
319
346
  setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration) {
320
- this._totalPlayTime = ((sunOffsetMs - sunRiseOffsetMs) / (sunDeltaMs)) * ((adjustedDuration) ? adjustedDuration : this.state.adjustedDuration);
347
+ this._totalPlayTime =
348
+ ((sunOffsetMs - sunRiseOffsetMs) / sunDeltaMs) *
349
+ (adjustedDuration ? adjustedDuration : this.state.adjustedDuration);
321
350
  }
322
351
  ensureRange(value, min, max) {
323
352
  return Math.max(Math.min(value, max), min);
@@ -333,7 +362,8 @@ export class SolarTimeline extends React.PureComponent {
333
362
  this.setState({ currentTimeOffsetMs }, () => {
334
363
  const currentTime = new Date().getTime();
335
364
  this._timeLastCycle = currentTime;
336
- const percentComplete = (currentTimeOffsetMs - this.state.sunRiseOffsetMs) / this.state.sunDeltaMs;
365
+ const percentComplete = (currentTimeOffsetMs - this.state.sunRiseOffsetMs) /
366
+ this.state.sunDeltaMs;
337
367
  this._totalPlayTime = percentComplete * this.state.adjustedDuration;
338
368
  });
339
369
  }
@@ -344,7 +374,7 @@ export class SolarTimeline extends React.PureComponent {
344
374
  }
345
375
  render() {
346
376
  const { dataProvider } = this.props;
347
- const { speed, loop, currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs } = this.state;
377
+ const { speed, loop, currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs, } = this.state;
348
378
  const localTime = this.getLocalTime(this.state.dayStartMs + this.state.currentTimeOffsetMs);
349
379
  const formattedTime = this._formatTime(dataProvider.dayStartMs + currentTimeOffsetMs);
350
380
  const formattedDate = `${this._months[localTime.getMonth()]}, ${localTime.getDate()}`;
@@ -355,7 +385,7 @@ export class SolarTimeline extends React.PureComponent {
355
385
  return (React.createElement("div", { className: "solar-timeline-wrapper" },
356
386
  React.createElement("div", { className: "header" },
357
387
  React.createElement(PlayButton, { tooltip: this._playLabel, className: "play-button", isPlaying: this.state.isPlaying, onPlay: this._onPlay, onPause: this._onPause }),
358
- 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("button", { "data-testid": "solar-date-time-button", title: this._dateTimeLabel, className: "current-date", ref: (element) => (this._datePicker = element), onClick: this._onOpenDayPicker },
359
389
  React.createElement("span", null, formattedDate),
360
390
  React.createElement("span", null, "/"),
361
391
  React.createElement("span", null, formattedTime),
@@ -366,7 +396,11 @@ export class SolarTimeline extends React.PureComponent {
366
396
  React.createElement(DatePicker, { selected: localTime, onDateChange: this._onDayClick, showFocusOutline: false }),
367
397
  React.createElement("div", { className: "time-container" },
368
398
  React.createElement(Text, { variant: "body", className: "time-label" }, this._timeLabel),
369
- React.createElement(TimeField, { time: { hours: localTime.getHours(), minutes: localTime.getMinutes(), seconds: 0 }, timeDisplay: TimeDisplay.H12MC, onTimeChange: this._onTimeChanged })))),
399
+ React.createElement(TimeField, { time: {
400
+ hours: localTime.getHours(),
401
+ minutes: localTime.getMinutes(),
402
+ seconds: 0,
403
+ }, timeDisplay: TimeDisplay.H12MC, onTimeChange: this._onTimeChanged })))),
370
404
  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 }),
371
405
  React.createElement("div", { className: "speed-container" },
372
406
  React.createElement("span", { title: this._speedLabel },
@@ -375,7 +409,7 @@ export class SolarTimeline extends React.PureComponent {
375
409
  React.createElement(SpeedTimeline, { className: "speed", onChange: this._onSpeedChange, speed: this.state.speed })),
376
410
  React.createElement("span", { title: this._loopLabel, className: classnames("icon", !loop && "no-loop-playback", loop && "loop-playback"), onClick: this._onToggleLoop, role: "button", tabIndex: -1 },
377
411
  React.createElement(Icon, { iconSpec: React.createElement(SvgLoop, null) })),
378
- React.createElement("button", { "data-testid": "shadow-settings-button", title: this._settingLabel, className: "shadow-settings-button", ref: (element) => this._settings = element, onClick: this._onOpenSettingsPopup },
412
+ React.createElement("button", { "data-testid": "shadow-settings-button", title: this._settingLabel, className: "shadow-settings-button", ref: (element) => (this._settings = element), onClick: this._onOpenSettingsPopup },
379
413
  React.createElement("span", { className: "icon" },
380
414
  React.createElement(Icon, { iconSpec: React.createElement(SvgSettings, null) }))),
381
415
  React.createElement(Popup, { className: "shadow-settings-popup", target: this._settings, offset: 11, isOpen: this.state.isSettingsOpened, onClose: this._onCloseSettingsPopup, position: RelativePosition.Top },
@@ -1 +1 @@
1
- {"version":3,"file":"SolarTimeline.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/SolarTimeline.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Timeline\r\n */\r\n\r\n// component is in alpha state - it may change after usability testing - test coverage not complete\r\n/* istanbul ignore file */\r\n\r\nimport \"./SolarTimeline.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { Slider, Text, Tooltip } from \"@itwin/itwinui-react\";\r\n\r\nimport type { HSVColor } from \"@itwin/core-common\";\r\nimport { ColorByName, ColorDef } from \"@itwin/core-common\";\r\nimport { RelativePosition, TimeDisplay } from \"@itwin/appui-abstract\";\r\nimport type { CommonProps} from \"@itwin/core-react\";\r\nimport { Icon, Popup } from \"@itwin/core-react\";\r\nimport type { TimeSpec} from \"@itwin/components-react\";\r\nimport { adjustDateToTimezone, DatePicker, TimeField, UiComponents } from \"@itwin/components-react\";\r\nimport { HueSlider } from \"../color/HueSlider\";\r\nimport { SaturationPicker } from \"../color/SaturationPicker\";\r\nimport { ColorSwatch } from \"../color/Swatch\";\r\nimport type { SolarDataProvider } from \"./interfaces\";\r\nimport { PlayButton } from \"./PlayerButton\";\r\nimport { SpeedTimeline } from \"./SpeedTimeline\";\r\nimport { CustomThumb, getPercentageOfRectangle, RailMarkers, useFocusedThumb } from \"./Scrubber\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\nimport { SvgCalendar, SvgLoop, SvgSettings } from \"@itwin/itwinui-icons-react\";\r\n\r\n// cSpell:ignore millisec solarsettings showticks shadowcolor solartimeline datepicker millisecs\r\n\r\nconst millisecPerMinute = 1000 * 60;\r\nconst millisecPerHour = millisecPerMinute * 60;\r\n// const millisecPerDay = millisecPerHour * 24;\r\nconst defaultPlaybackDuration = 40 * 1000; // 40 seconds\r\nconst addZero = (i: number) => {\r\n return (i < 10) ? `0${i}` : i;\r\n};\r\n\r\ninterface TimelineProps extends CommonProps {\r\n dayStartMs: number;\r\n sunRiseOffsetMs: number;\r\n sunSetOffsetMs: number;\r\n currentTimeOffsetMs: number;\r\n isPlaying: boolean;\r\n formatTick?: (millisec: number) => string;\r\n formatTime: (millisec: number) => string;\r\n onChange?: (values: ReadonlyArray<number>) => void;\r\n onUpdate?: (values: ReadonlyArray<number>) => void;\r\n}\r\nfunction Timeline(props: TimelineProps) {\r\n const sliderRef = React.useRef<HTMLDivElement>(null);\r\n const [sliderContainer, setSliderContainer] = React.useState<HTMLDivElement>();\r\n const [pointerPercent, setPointerPercent] = React.useState(0);\r\n\r\n React.useLayoutEffect(() => {\r\n // istanbul ignore else\r\n if (sliderRef.current) {\r\n const container = sliderRef.current.querySelector(\".iui-slider-container\");\r\n if (container && sliderContainer !== container) {\r\n setSliderContainer(container as HTMLDivElement);\r\n }\r\n }\r\n }, [sliderContainer]);\r\n\r\n const thumbProps = () => {\r\n return {\r\n className: \"components-timeline-thumb\",\r\n children: <CustomThumb />,\r\n };\r\n };\r\n\r\n const tooltipProps = React.useCallback(() => {\r\n return { visible: false };\r\n }, []);\r\n\r\n const [showRailTooltip, setShowRailTooltip] = React.useState(false);\r\n\r\n const handlePointerEnter = React.useCallback(() => {\r\n setShowRailTooltip(true);\r\n }, []);\r\n\r\n const handlePointerLeave = React.useCallback(() => {\r\n setShowRailTooltip(false);\r\n }, []);\r\n\r\n const handlePointerMove = React.useCallback((event: React.PointerEvent) => {\r\n sliderContainer &&\r\n setPointerPercent(getPercentageOfRectangle(sliderContainer.getBoundingClientRect(), event.clientX));\r\n }, [sliderContainer]);\r\n\r\n const { formatTick, formatTime, onChange, onUpdate, dayStartMs, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, isPlaying } = props;\r\n\r\n const thumbHasFocus = useFocusedThumb(sliderContainer);\r\n\r\n const tickLabel = React.useMemo(() => {\r\n const showTip = isPlaying || showRailTooltip || thumbHasFocus;\r\n const totalDuration = sunSetOffsetMs - sunRiseOffsetMs;\r\n const percent = (isPlaying || thumbHasFocus) ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration : pointerPercent;\r\n const tooltipText = formatTime((isPlaying || thumbHasFocus) ? (dayStartMs + currentTimeOffsetMs) : (dayStartMs + (sunRiseOffsetMs + (pointerPercent * totalDuration))));\r\n return (<RailMarkers showToolTip={showTip} percent={percent} tooltipText={tooltipText} />);\r\n }, [isPlaying, showRailTooltip, thumbHasFocus, sunSetOffsetMs, sunRiseOffsetMs, currentTimeOffsetMs, pointerPercent, formatTime, dayStartMs]);\r\n\r\n const className = classnames(\"solar-slider\", props.className, formatTick && \"showticks\");\r\n const sunRiseFormat = formatTime(dayStartMs + sunRiseOffsetMs);\r\n const sunSetFormat = formatTime(dayStartMs + sunSetOffsetMs);\r\n return (\r\n <div className={className}>\r\n <Tooltip content={sunRiseFormat}>\r\n <span className=\"sunrise\">\r\n &#x2600;\r\n </span>\r\n </Tooltip>\r\n <Slider ref={sliderRef}\r\n className={className}\r\n step={millisecPerMinute}\r\n min={sunRiseOffsetMs}\r\n max={sunSetOffsetMs}\r\n minLabel=\"\"\r\n maxLabel=\"\"\r\n onUpdate={onUpdate}\r\n onChange={onChange}\r\n values={[currentTimeOffsetMs]}\r\n tooltipProps={tooltipProps}\r\n thumbProps={thumbProps}\r\n tickLabels={tickLabel}\r\n railContainerProps={{\r\n onPointerEnter: handlePointerEnter,\r\n onPointerMove: handlePointerMove,\r\n onPointerLeave: handlePointerLeave,\r\n }}\r\n />\r\n <Tooltip content={sunSetFormat}>\r\n <span className=\"sunset\">\r\n &#x263D;\r\n </span>\r\n </Tooltip>\r\n </div>\r\n );\r\n}\r\n\r\ninterface SolarTimelineComponentProps {\r\n dataProvider: SolarDataProvider; // provides date, sunrise, sunset in millisecs, also contains timezone offset from UTC, and updates the display style to current time.\r\n onPlayPause?: (playing: boolean) => void; // callback triggered when play/pause button is pressed\r\n duration?: number; // playback duration in milliseconds\r\n speed?: number;\r\n}\r\n\r\ninterface SolarTimelineComponentState {\r\n isPlaying: boolean; // timeline is currently playing or paused\r\n isDateOpened: boolean; // date picker is opened\r\n isSettingsOpened: boolean; // settings popup is opened\r\n dayStartMs: number;\r\n sunRiseOffsetMs: number;\r\n sunSetOffsetMs: number;\r\n sunDeltaMs: number;\r\n currentTimeOffsetMs: number;\r\n speed: number;\r\n loop: boolean;\r\n shadowColor: ColorDef;\r\n duration: number; // playback duration in milliseconds\r\n adjustedDuration: number; // playback duration in milliseconds/ speed\r\n}\r\n\r\n/** Solar Timeline\r\n * @alpha\r\n */\r\nexport class SolarTimeline extends React.PureComponent<SolarTimelineComponentProps, SolarTimelineComponentState> {\r\n private _datePicker: HTMLElement | null = null;\r\n private _settings: HTMLElement | null = null;\r\n private _requestFrame = 0;\r\n private _unmounted = false;\r\n private _timeLastCycle = 0;\r\n private _totalPlayTime = 0;\r\n private _settingsPopupTitle = UiIModelComponents.translate(\"solarsettings.shadowcolor\");\r\n private _playLabel = UiIModelComponents.translate(\"solartimeline.play\");\r\n private _settingLabel = UiIModelComponents.translate(\"solartimeline.settings\");\r\n private _loopLabel = UiIModelComponents.translate(\"timeline.repeat\");\r\n private _speedLabel = UiIModelComponents.translate(\"solartimeline.speed\");\r\n private _dateTimeLabel = UiIModelComponents.translate(\"solartimeline.dateTime\");\r\n\r\n private _months = [\r\n UiComponents.translate(\"month.short.january\"),\r\n UiComponents.translate(\"month.short.february\"),\r\n UiComponents.translate(\"month.short.march\"),\r\n UiComponents.translate(\"month.short.april\"),\r\n UiComponents.translate(\"month.short.may\"),\r\n UiComponents.translate(\"month.short.june\"),\r\n UiComponents.translate(\"month.short.july\"),\r\n UiComponents.translate(\"month.short.august\"),\r\n UiComponents.translate(\"month.short.september\"),\r\n UiComponents.translate(\"month.short.october\"),\r\n UiComponents.translate(\"month.short.november\"),\r\n UiComponents.translate(\"month.short.december\"),\r\n ];\r\n\r\n private _timeLabel = UiComponents.translate(\"datepicker.time\");\r\n private _amLabel = UiComponents.translate(\"time.am\");\r\n private _pmLabel = UiComponents.translate(\"time.pm\");\r\n private readonly _presetColors = [\r\n ColorDef.create(ColorByName.grey),\r\n ColorDef.create(ColorByName.lightGrey),\r\n ColorDef.create(ColorByName.darkGrey),\r\n ColorDef.create(ColorByName.lightBlue),\r\n ColorDef.create(ColorByName.lightGreen),\r\n ColorDef.create(ColorByName.darkGreen),\r\n ColorDef.create(ColorByName.tan),\r\n ColorDef.create(ColorByName.darkBrown),\r\n ];\r\n\r\n constructor(props: SolarTimelineComponentProps) {\r\n super(props);\r\n\r\n const dayStartMs = this.props.dataProvider.dayStartMs;\r\n const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;\r\n const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;\r\n const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;\r\n const sunOffsetMs = this.props.dataProvider.timeOfDay.getTime() - dayStartMs;\r\n const currentTimeOffsetMs = this.ensureRange(sunOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);\r\n const shadowColor = this.props.dataProvider.shadowColor;\r\n const duration = this.props.duration ? this.props.duration : defaultPlaybackDuration;\r\n const speed = this.props.speed ? this.props.speed : 2;\r\n const adjustedDuration = duration / speed;\r\n this.setPlaybackTimeBySunTime(currentTimeOffsetMs, sunRiseOffsetMs, sunDeltaMs, adjustedDuration);\r\n\r\n this.state = {\r\n isDateOpened: false,\r\n isSettingsOpened: false,\r\n isPlaying: false,\r\n dayStartMs,\r\n sunRiseOffsetMs,\r\n sunSetOffsetMs,\r\n sunDeltaMs,\r\n currentTimeOffsetMs,\r\n speed,\r\n loop: false,\r\n shadowColor,\r\n duration,\r\n adjustedDuration,\r\n };\r\n }\r\n\r\n public override componentWillUnmount() {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this._unmounted = true;\r\n }\r\n\r\n // recursively update the animation until we hit the end or the pause button is clicked\r\n private _updateAnimation = (_timestamp: number) => {\r\n // istanbul ignore else\r\n if (!this.state.isPlaying || this._unmounted) {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n return;\r\n }\r\n\r\n const currentTime = new Date().getTime();\r\n this._totalPlayTime += (currentTime - this._timeLastCycle);\r\n this._timeLastCycle = currentTime;\r\n let percentComplete = this._totalPlayTime / this.state.adjustedDuration;\r\n if (percentComplete > 1)\r\n percentComplete = 1;\r\n\r\n let newPlayingState = true;\r\n\r\n // calculate the next sun time base on the percentage playback complete - should be int value as that is step amount for slider\r\n let nextSunOffset = Math.floor(this.state.sunRiseOffsetMs + (percentComplete * this.state.sunDeltaMs));\r\n\r\n if (percentComplete > 0.99) {\r\n if (!this.state.loop) {\r\n newPlayingState = false;\r\n nextSunOffset = this.state.sunSetOffsetMs;\r\n window.cancelAnimationFrame(this._requestFrame);\r\n } else {\r\n nextSunOffset = this.state.sunRiseOffsetMs;\r\n this._totalPlayTime = 0;\r\n }\r\n }\r\n\r\n if (this.props.dataProvider.onTimeChanged) {\r\n const currentSunTime = new Date(this.state.dayStartMs + nextSunOffset);\r\n this.props.dataProvider.onTimeChanged(currentSunTime);\r\n }\r\n\r\n this.setState({ isPlaying: newPlayingState, currentTimeOffsetMs: nextSunOffset }, () => {\r\n if (newPlayingState)\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n });\r\n };\r\n\r\n private _play(sunTimeMs: number) {\r\n this._timeLastCycle = new Date().getTime();\r\n\r\n // start playing\r\n this.setState({ isPlaying: true, currentTimeOffsetMs: sunTimeMs }, () => {\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(true);\r\n });\r\n }\r\n\r\n // user clicked pause button\r\n private _onPause = () => {\r\n // istanbul ignore if\r\n if (!this.state.isPlaying)\r\n return;\r\n\r\n const currentTime = new Date().getTime();\r\n this._totalPlayTime += (currentTime - this._timeLastCycle);\r\n\r\n // stop requesting frames\r\n window.cancelAnimationFrame(this._requestFrame);\r\n\r\n // stop playing\r\n this.setState({ isPlaying: false });\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n };\r\n\r\n // user clicked play button\r\n private _onPlay = () => {\r\n // istanbul ignore if\r\n if (this.state.isPlaying)\r\n return;\r\n\r\n if (this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs || this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs) {\r\n this._totalPlayTime = 0;\r\n this._play(this.state.sunRiseOffsetMs);\r\n } else {\r\n this._play(this.state.currentTimeOffsetMs);\r\n }\r\n };\r\n\r\n private setPlaybackTimeBySunTime(sunOffsetMs: number, sunRiseOffsetMs: number, sunDeltaMs: number, adjustedDuration?: number) {\r\n this._totalPlayTime = ((sunOffsetMs - sunRiseOffsetMs) / (sunDeltaMs)) * ((adjustedDuration) ? adjustedDuration : this.state.adjustedDuration);\r\n }\r\n\r\n /** note the day passed in is in the time of the current user not in project time because the date picker works in\r\n * local time */\r\n private _onDayClick = (day: Date) => {\r\n const selectedDate = new Date(day.getTime() + this.state.currentTimeOffsetMs);\r\n this.props.dataProvider.setDateAndTime(selectedDate);\r\n const dayStartMs = this.props.dataProvider.dayStartMs;\r\n const sunRiseOffsetMs = this.props.dataProvider.sunrise.getTime() - dayStartMs;\r\n const sunSetOffsetMs = this.props.dataProvider.sunset.getTime() - dayStartMs;\r\n const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;\r\n\r\n const sunOffsetMs = this.ensureRange(this.state.currentTimeOffsetMs, sunRiseOffsetMs, sunSetOffsetMs);\r\n this.setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs);\r\n\r\n /** call dataProvider to update display style */\r\n if (this.props.dataProvider.onTimeChanged)\r\n this.props.dataProvider.onTimeChanged(this.props.dataProvider.timeOfDay);\r\n\r\n this.setState({ dayStartMs, sunRiseOffsetMs, sunSetOffsetMs, currentTimeOffsetMs: sunOffsetMs, sunDeltaMs, isDateOpened: false }, () => {\r\n this._timeLastCycle = new Date().getTime();\r\n });\r\n };\r\n\r\n private _onTimeChanged = (time: TimeSpec) => {\r\n // compute the current date (with time)\r\n const dayStartMs = this.props.dataProvider.dayStartMs;\r\n const sunTime = (time.hours * millisecPerHour) + (time.minutes * millisecPerMinute);\r\n const dateWithNewTime = new Date(dayStartMs + sunTime);\r\n this.props.dataProvider.setDateAndTime(dateWithNewTime, true);\r\n\r\n // notify the provider to update style\r\n if (this.props.dataProvider.onTimeChanged)\r\n this.props.dataProvider.onTimeChanged(dateWithNewTime);\r\n\r\n const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);\r\n\r\n this.setPlaybackTimeBySunTime(currentTimeOffsetMs, this.state.sunRiseOffsetMs, this.state.sunDeltaMs);\r\n this._timeLastCycle = new Date().getTime();\r\n\r\n // update the timeline\r\n this.setState({ currentTimeOffsetMs });\r\n };\r\n\r\n private _onCloseDayPicker = () => {\r\n this.setState({ isDateOpened: false });\r\n };\r\n\r\n private _onOpenDayPicker = () => {\r\n this.setState((prevState) => ({ isDateOpened: !prevState.isDateOpened }));\r\n };\r\n\r\n private _onCloseSettingsPopup = () => {\r\n this.setState({ isSettingsOpened: false });\r\n };\r\n\r\n private _onOpenSettingsPopup = () => {\r\n this.setState((prevState) => ({ isSettingsOpened: !prevState.isSettingsOpened }));\r\n };\r\n\r\n private ensureRange(value: number, min: number, max: number): number {\r\n return Math.max(Math.min(value, max), min);\r\n }\r\n\r\n private processSunTimeChange(sunTime: number) {\r\n if (sunTime === this.state.currentTimeOffsetMs)\r\n return;\r\n\r\n const currentTimeOffsetMs = this.ensureRange(sunTime, this.state.sunRiseOffsetMs, this.state.sunSetOffsetMs);\r\n\r\n if (this.props.dataProvider.onTimeChanged) {\r\n const currentSunTime = new Date(this.state.dayStartMs + currentTimeOffsetMs);\r\n this.props.dataProvider.onTimeChanged(currentSunTime);\r\n }\r\n\r\n this.setState({ currentTimeOffsetMs }, () => {\r\n const currentTime = new Date().getTime();\r\n this._timeLastCycle = currentTime;\r\n const percentComplete = (currentTimeOffsetMs - this.state.sunRiseOffsetMs) / this.state.sunDeltaMs;\r\n this._totalPlayTime = percentComplete * this.state.adjustedDuration;\r\n });\r\n }\r\n\r\n private _onUpdate = (values: ReadonlyArray<number>) => {\r\n if (!this.state.isPlaying)\r\n this.processSunTimeChange(values[0]);\r\n };\r\n\r\n private _onChange = (values: ReadonlyArray<number>) => {\r\n if (!this.state.isPlaying)\r\n this.processSunTimeChange(values[0]);\r\n };\r\n\r\n private _onSpeedChange = (value: number) => {\r\n const adjustedDuration = this.state.duration / value;\r\n this.setState({ speed: value, adjustedDuration });\r\n };\r\n\r\n private _onToggleLoop = () => {\r\n this.setState((prevState) => ({ loop: !prevState.loop }));\r\n };\r\n\r\n private _formatTime = (millisec: number) => {\r\n const date = new Date(millisec);\r\n // convert project date to browser locale date\r\n const localTime = adjustDateToTimezone(date, this.props.dataProvider.timeZoneOffset * 60);\r\n let hours = localTime.getHours();\r\n const minutes = addZero(date.getMinutes());\r\n const abbrev = (hours < 12) ? this._amLabel : (hours === 24) ? this._amLabel : this._pmLabel;\r\n hours = (hours > 12) ? hours - 12 : hours;\r\n return `${hours}:${minutes} ${abbrev}`;\r\n };\r\n\r\n private _onPresetColorPick = (shadowColor: ColorDef) => {\r\n this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);\r\n };\r\n\r\n private _handleHueOrSaturationChange = (hueOrSaturation: HSVColor) => {\r\n if (hueOrSaturation.s === 0) // for a ColorDef to be created from hsv s can't be 0\r\n hueOrSaturation = hueOrSaturation.clone(undefined, 0.5);\r\n\r\n const shadowColor = hueOrSaturation.toColorDef();\r\n this.setState({ shadowColor }, () => this.props.dataProvider.shadowColor = shadowColor);\r\n };\r\n\r\n public getLocalTime(ticks: number): Date {\r\n const projectTime = new Date(ticks);\r\n // convert project date to browser locale date\r\n return adjustDateToTimezone(projectTime, this.props.dataProvider.timeZoneOffset * 60);\r\n }\r\n\r\n public override render() {\r\n const { dataProvider } = this.props;\r\n const { speed, loop, currentTimeOffsetMs,\r\n sunRiseOffsetMs, sunSetOffsetMs } = this.state;\r\n const localTime = this.getLocalTime(this.state.dayStartMs + this.state.currentTimeOffsetMs);\r\n const formattedTime = this._formatTime(dataProvider.dayStartMs + currentTimeOffsetMs);\r\n const formattedDate = `${this._months[localTime.getMonth()]}, ${localTime.getDate()}`;\r\n\r\n const colorSwatchStyle: React.CSSProperties = {\r\n width: `100%`,\r\n height: `100%`,\r\n };\r\n\r\n return (\r\n <div className={\"solar-timeline-wrapper\"} >\r\n <div className=\"header\">\r\n <PlayButton tooltip={this._playLabel} className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} />\r\n <button data-testid=\"solar-date-time-button\" title={this._dateTimeLabel} className=\"current-date\" ref={(element) => this._datePicker = element} onClick={this._onOpenDayPicker}>\r\n <span>{formattedDate}</span>\r\n <span>/</span>\r\n <span>{formattedTime}</span>\r\n <span className=\"icon\"><Icon iconSpec={<SvgCalendar />} /></span>\r\n </button>\r\n <Popup style={{ border: \"none\" }} offset={11} target={this._datePicker} isOpen={this.state.isDateOpened} onClose={this._onCloseDayPicker} position={RelativePosition.Top}>\r\n <div className=\"components-date-picker-calendar-popup-panel\" data-testid=\"components-date-picker-calendar-popup-panel\">\r\n <DatePicker selected={localTime} onDateChange={this._onDayClick} showFocusOutline={false} />\r\n <div className=\"time-container\">\r\n <Text variant=\"body\" className=\"time-label\">{this._timeLabel}</Text>\r\n <TimeField time={{ hours: localTime.getHours(), minutes: localTime.getMinutes(), seconds: 0 }} timeDisplay={TimeDisplay.H12MC} onTimeChange={this._onTimeChanged} />\r\n </div>\r\n </div>\r\n </Popup>\r\n <Timeline className=\"solar-timeline\"\r\n dayStartMs={dataProvider.dayStartMs}\r\n sunSetOffsetMs={sunSetOffsetMs}\r\n sunRiseOffsetMs={sunRiseOffsetMs}\r\n currentTimeOffsetMs={currentTimeOffsetMs}\r\n onChange={this._onChange}\r\n onUpdate={this._onUpdate}\r\n formatTime={this._formatTime}\r\n isPlaying={this.state.isPlaying}\r\n />\r\n <div className=\"speed-container\">\r\n <span title={this._speedLabel}>{speed}x</span>\r\n <SpeedTimeline className=\"speed\" onChange={this._onSpeedChange} speed={this.state.speed} />\r\n </div>\r\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\r\n <span title={this._loopLabel}\r\n className={classnames(\"icon\", !loop && \"no-loop-playback\", loop && \"loop-playback\")} onClick={this._onToggleLoop}\r\n role=\"button\" tabIndex={-1}\r\n ><Icon iconSpec={<SvgLoop />} /></span>\r\n <button data-testid=\"shadow-settings-button\" title={this._settingLabel} className=\"shadow-settings-button\" ref={(element) => this._settings = element} onClick={this._onOpenSettingsPopup}>\r\n <span className=\"icon\"><Icon iconSpec={<SvgSettings />} /></span>\r\n </button>\r\n <Popup className=\"shadow-settings-popup\" target={this._settings} offset={11} isOpen={this.state.isSettingsOpened} onClose={this._onCloseSettingsPopup} position={RelativePosition.Top}>\r\n <div className=\"shadow-settings-popup-container\" >\r\n <div className=\"shadow-settings-header\">{this._settingsPopupTitle}</div>\r\n <div className=\"shadow-settings-color\">\r\n <div className=\"shadow-settings-color-top\">\r\n <SaturationPicker hsv={this.state.shadowColor.toHSV()} onSaturationChange={this._handleHueOrSaturationChange} />\r\n </div>\r\n <div className=\"shadow-settings-color-bottom\">\r\n <div className=\"shadow-settings-color-bottom-left\">\r\n <HueSlider hsv={this.state.shadowColor.toHSV()} onHueChange={this._handleHueOrSaturationChange} isHorizontal={true} />\r\n </div>\r\n <div className=\"shadow-settings-color-bottom-right\">\r\n <ColorSwatch style={colorSwatchStyle} colorDef={this.state.shadowColor} round={false} />\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"shadow-settings-color-presets\">\r\n <ColorSwatch colorDef={this._presetColors[0]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[1]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[2]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[3]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[4]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[5]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[6]} round={false} onColorPick={this._onPresetColorPick} />\r\n <ColorSwatch colorDef={this._presetColors[7]} round={false} onColorPick={this._onPresetColorPick} />\r\n </div>\r\n </div>\r\n </Popup>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SolarTimeline.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/SolarTimeline.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Timeline\n */\n\n// component is in alpha state - it may change after usability testing - test coverage not complete\n/* istanbul ignore file */\n\nimport \"./SolarTimeline.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { Slider, Text, Tooltip } from \"@itwin/itwinui-react\";\n\nimport type { HSVColor } from \"@itwin/core-common\";\nimport { ColorByName, ColorDef } from \"@itwin/core-common\";\nimport { RelativePosition, TimeDisplay } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Icon, Popup } from \"@itwin/core-react\";\nimport type { TimeSpec } from \"@itwin/components-react\";\nimport {\n adjustDateToTimezone,\n DatePicker,\n TimeField,\n UiComponents,\n} from \"@itwin/components-react\";\nimport { HueSlider } from \"../color/HueSlider\";\nimport { SaturationPicker } from \"../color/SaturationPicker\";\nimport { ColorSwatch } from \"../color/Swatch\";\nimport type { SolarDataProvider } from \"./interfaces\";\nimport { PlayButton } from \"./PlayerButton\";\nimport { SpeedTimeline } from \"./SpeedTimeline\";\nimport {\n CustomThumb,\n getPercentageOfRectangle,\n RailMarkers,\n useFocusedThumb,\n} from \"./Scrubber\";\nimport { UiIModelComponents } from \"../UiIModelComponents\";\nimport { SvgCalendar, SvgLoop, SvgSettings } from \"@itwin/itwinui-icons-react\";\n\n// cSpell:ignore millisec solarsettings showticks shadowcolor solartimeline datepicker millisecs\n\nconst millisecPerMinute = 1000 * 60;\nconst millisecPerHour = millisecPerMinute * 60;\n// const millisecPerDay = millisecPerHour * 24;\nconst defaultPlaybackDuration = 40 * 1000; // 40 seconds\nconst addZero = (i: number) => {\n return i < 10 ? `0${i}` : i;\n};\n\ninterface TimelineProps extends CommonProps {\n dayStartMs: number;\n sunRiseOffsetMs: number;\n sunSetOffsetMs: number;\n currentTimeOffsetMs: number;\n isPlaying: boolean;\n formatTick?: (millisec: number) => string;\n formatTime: (millisec: number) => string;\n onChange?: (values: ReadonlyArray<number>) => void;\n onUpdate?: (values: ReadonlyArray<number>) => void;\n}\nfunction Timeline(props: TimelineProps) {\n const sliderRef = React.useRef<HTMLDivElement>(null);\n const [sliderContainer, setSliderContainer] =\n React.useState<HTMLDivElement>();\n const [pointerPercent, setPointerPercent] = React.useState(0);\n\n React.useLayoutEffect(() => {\n // istanbul ignore else\n if (sliderRef.current) {\n const container = sliderRef.current.querySelector(\n \".iui-slider-container\"\n );\n if (container && sliderContainer !== container) {\n setSliderContainer(container as HTMLDivElement);\n }\n }\n }, [sliderContainer]);\n\n const thumbProps = () => {\n return {\n className: \"components-timeline-thumb\",\n children: <CustomThumb />,\n };\n };\n\n const tooltipProps = React.useCallback(() => {\n return { visible: false };\n }, []);\n\n const [showRailTooltip, setShowRailTooltip] = React.useState(false);\n\n const handlePointerEnter = React.useCallback(() => {\n setShowRailTooltip(true);\n }, []);\n\n const handlePointerLeave = React.useCallback(() => {\n setShowRailTooltip(false);\n }, []);\n\n const handlePointerMove = React.useCallback(\n (event: React.PointerEvent) => {\n sliderContainer &&\n setPointerPercent(\n getPercentageOfRectangle(\n sliderContainer.getBoundingClientRect(),\n event.clientX\n )\n );\n },\n [sliderContainer]\n );\n\n const {\n formatTick,\n formatTime,\n onChange,\n onUpdate,\n dayStartMs,\n sunSetOffsetMs,\n sunRiseOffsetMs,\n currentTimeOffsetMs,\n isPlaying,\n } = props;\n\n const thumbHasFocus = useFocusedThumb(sliderContainer);\n\n const tickLabel = React.useMemo(() => {\n const showTip = isPlaying || showRailTooltip || thumbHasFocus;\n const totalDuration = sunSetOffsetMs - sunRiseOffsetMs;\n const percent =\n isPlaying || thumbHasFocus\n ? (currentTimeOffsetMs - sunRiseOffsetMs) / totalDuration\n : pointerPercent;\n const tooltipText = formatTime(\n isPlaying || thumbHasFocus\n ? dayStartMs + currentTimeOffsetMs\n : dayStartMs + (sunRiseOffsetMs + pointerPercent * totalDuration)\n );\n return (\n <RailMarkers\n showToolTip={showTip}\n percent={percent}\n tooltipText={tooltipText}\n />\n );\n }, [\n isPlaying,\n showRailTooltip,\n thumbHasFocus,\n sunSetOffsetMs,\n sunRiseOffsetMs,\n currentTimeOffsetMs,\n pointerPercent,\n formatTime,\n dayStartMs,\n ]);\n\n const className = classnames(\n \"solar-slider\",\n props.className,\n formatTick && \"showticks\"\n );\n const sunRiseFormat = formatTime(dayStartMs + sunRiseOffsetMs);\n const sunSetFormat = formatTime(dayStartMs + sunSetOffsetMs);\n return (\n <div className={className}>\n <Tooltip content={sunRiseFormat}>\n <span className=\"sunrise\">&#x2600;</span>\n </Tooltip>\n <Slider\n ref={sliderRef}\n className={className}\n step={millisecPerMinute}\n min={sunRiseOffsetMs}\n max={sunSetOffsetMs}\n minLabel=\"\"\n maxLabel=\"\"\n onUpdate={onUpdate}\n onChange={onChange}\n values={[currentTimeOffsetMs]}\n tooltipProps={tooltipProps}\n thumbProps={thumbProps}\n tickLabels={tickLabel}\n railContainerProps={{\n onPointerEnter: handlePointerEnter,\n onPointerMove: handlePointerMove,\n onPointerLeave: handlePointerLeave,\n }}\n />\n <Tooltip content={sunSetFormat}>\n <span className=\"sunset\">&#x263D;</span>\n </Tooltip>\n </div>\n );\n}\n\ninterface SolarTimelineComponentProps {\n dataProvider: SolarDataProvider; // provides date, sunrise, sunset in millisecs, also contains timezone offset from UTC, and updates the display style to current time.\n onPlayPause?: (playing: boolean) => void; // callback triggered when play/pause button is pressed\n duration?: number; // playback duration in milliseconds\n speed?: number;\n}\n\ninterface SolarTimelineComponentState {\n isPlaying: boolean; // timeline is currently playing or paused\n isDateOpened: boolean; // date picker is opened\n isSettingsOpened: boolean; // settings popup is opened\n dayStartMs: number;\n sunRiseOffsetMs: number;\n sunSetOffsetMs: number;\n sunDeltaMs: number;\n currentTimeOffsetMs: number;\n speed: number;\n loop: boolean;\n shadowColor: ColorDef;\n duration: number; // playback duration in milliseconds\n adjustedDuration: number; // playback duration in milliseconds/ speed\n}\n\n/** Solar Timeline\n * @alpha\n */\nexport class SolarTimeline extends React.PureComponent<\n SolarTimelineComponentProps,\n SolarTimelineComponentState\n> {\n private _datePicker: HTMLElement | null = null;\n private _settings: HTMLElement | null = null;\n private _requestFrame = 0;\n private _unmounted = false;\n private _timeLastCycle = 0;\n private _totalPlayTime = 0;\n private _settingsPopupTitle = UiIModelComponents.translate(\n \"solarsettings.shadowcolor\"\n );\n private _playLabel = UiIModelComponents.translate(\"solartimeline.play\");\n private _settingLabel = UiIModelComponents.translate(\n \"solartimeline.settings\"\n );\n private _loopLabel = UiIModelComponents.translate(\"timeline.repeat\");\n private _speedLabel = UiIModelComponents.translate(\"solartimeline.speed\");\n private _dateTimeLabel = UiIModelComponents.translate(\n \"solartimeline.dateTime\"\n );\n\n private _months = [\n UiComponents.translate(\"month.short.january\"),\n UiComponents.translate(\"month.short.february\"),\n UiComponents.translate(\"month.short.march\"),\n UiComponents.translate(\"month.short.april\"),\n UiComponents.translate(\"month.short.may\"),\n UiComponents.translate(\"month.short.june\"),\n UiComponents.translate(\"month.short.july\"),\n UiComponents.translate(\"month.short.august\"),\n UiComponents.translate(\"month.short.september\"),\n UiComponents.translate(\"month.short.october\"),\n UiComponents.translate(\"month.short.november\"),\n UiComponents.translate(\"month.short.december\"),\n ];\n\n private _timeLabel = UiComponents.translate(\"datepicker.time\");\n private _amLabel = UiComponents.translate(\"time.am\");\n private _pmLabel = UiComponents.translate(\"time.pm\");\n private readonly _presetColors = [\n ColorDef.create(ColorByName.grey),\n ColorDef.create(ColorByName.lightGrey),\n ColorDef.create(ColorByName.darkGrey),\n ColorDef.create(ColorByName.lightBlue),\n ColorDef.create(ColorByName.lightGreen),\n ColorDef.create(ColorByName.darkGreen),\n ColorDef.create(ColorByName.tan),\n ColorDef.create(ColorByName.darkBrown),\n ];\n\n constructor(props: SolarTimelineComponentProps) {\n super(props);\n\n const dayStartMs = this.props.dataProvider.dayStartMs;\n const sunRiseOffsetMs =\n this.props.dataProvider.sunrise.getTime() - dayStartMs;\n const sunSetOffsetMs =\n this.props.dataProvider.sunset.getTime() - dayStartMs;\n const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;\n const sunOffsetMs =\n this.props.dataProvider.timeOfDay.getTime() - dayStartMs;\n const currentTimeOffsetMs = this.ensureRange(\n sunOffsetMs,\n sunRiseOffsetMs,\n sunSetOffsetMs\n );\n const shadowColor = this.props.dataProvider.shadowColor;\n const duration = this.props.duration\n ? this.props.duration\n : defaultPlaybackDuration;\n const speed = this.props.speed ? this.props.speed : 2;\n const adjustedDuration = duration / speed;\n this.setPlaybackTimeBySunTime(\n currentTimeOffsetMs,\n sunRiseOffsetMs,\n sunDeltaMs,\n adjustedDuration\n );\n\n this.state = {\n isDateOpened: false,\n isSettingsOpened: false,\n isPlaying: false,\n dayStartMs,\n sunRiseOffsetMs,\n sunSetOffsetMs,\n sunDeltaMs,\n currentTimeOffsetMs,\n speed,\n loop: false,\n shadowColor,\n duration,\n adjustedDuration,\n };\n }\n\n public override componentWillUnmount() {\n window.cancelAnimationFrame(this._requestFrame);\n this._unmounted = true;\n }\n\n // recursively update the animation until we hit the end or the pause button is clicked\n private _updateAnimation = (_timestamp: number) => {\n // istanbul ignore else\n if (!this.state.isPlaying || this._unmounted) {\n window.cancelAnimationFrame(this._requestFrame);\n return;\n }\n\n const currentTime = new Date().getTime();\n this._totalPlayTime += currentTime - this._timeLastCycle;\n this._timeLastCycle = currentTime;\n let percentComplete = this._totalPlayTime / this.state.adjustedDuration;\n if (percentComplete > 1) percentComplete = 1;\n\n let newPlayingState = true;\n\n // calculate the next sun time base on the percentage playback complete - should be int value as that is step amount for slider\n let nextSunOffset = Math.floor(\n this.state.sunRiseOffsetMs + percentComplete * this.state.sunDeltaMs\n );\n\n if (percentComplete > 0.99) {\n if (!this.state.loop) {\n newPlayingState = false;\n nextSunOffset = this.state.sunSetOffsetMs;\n window.cancelAnimationFrame(this._requestFrame);\n } else {\n nextSunOffset = this.state.sunRiseOffsetMs;\n this._totalPlayTime = 0;\n }\n }\n\n if (this.props.dataProvider.onTimeChanged) {\n const currentSunTime = new Date(this.state.dayStartMs + nextSunOffset);\n this.props.dataProvider.onTimeChanged(currentSunTime);\n }\n\n this.setState(\n { isPlaying: newPlayingState, currentTimeOffsetMs: nextSunOffset },\n () => {\n if (newPlayingState)\n this._requestFrame = window.requestAnimationFrame(\n this._updateAnimation\n );\n }\n );\n };\n\n private _play(sunTimeMs: number) {\n this._timeLastCycle = new Date().getTime();\n\n // start playing\n this.setState({ isPlaying: true, currentTimeOffsetMs: sunTimeMs }, () => {\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\n // istanbul ignore else\n if (this.props.onPlayPause) this.props.onPlayPause(true);\n });\n }\n\n // user clicked pause button\n private _onPause = () => {\n // istanbul ignore if\n if (!this.state.isPlaying) return;\n\n const currentTime = new Date().getTime();\n this._totalPlayTime += currentTime - this._timeLastCycle;\n\n // stop requesting frames\n window.cancelAnimationFrame(this._requestFrame);\n\n // stop playing\n this.setState({ isPlaying: false });\n\n // istanbul ignore else\n if (this.props.onPlayPause) this.props.onPlayPause(false);\n };\n\n // user clicked play button\n private _onPlay = () => {\n // istanbul ignore if\n if (this.state.isPlaying) return;\n\n if (\n this.state.currentTimeOffsetMs >= this.state.sunSetOffsetMs ||\n this.state.currentTimeOffsetMs <= this.state.sunRiseOffsetMs\n ) {\n this._totalPlayTime = 0;\n this._play(this.state.sunRiseOffsetMs);\n } else {\n this._play(this.state.currentTimeOffsetMs);\n }\n };\n\n private setPlaybackTimeBySunTime(\n sunOffsetMs: number,\n sunRiseOffsetMs: number,\n sunDeltaMs: number,\n adjustedDuration?: number\n ) {\n this._totalPlayTime =\n ((sunOffsetMs - sunRiseOffsetMs) / sunDeltaMs) *\n (adjustedDuration ? adjustedDuration : this.state.adjustedDuration);\n }\n\n /** note the day passed in is in the time of the current user not in project time because the date picker works in\n * local time */\n private _onDayClick = (day: Date) => {\n const selectedDate = new Date(\n day.getTime() + this.state.currentTimeOffsetMs\n );\n this.props.dataProvider.setDateAndTime(selectedDate);\n const dayStartMs = this.props.dataProvider.dayStartMs;\n const sunRiseOffsetMs =\n this.props.dataProvider.sunrise.getTime() - dayStartMs;\n const sunSetOffsetMs =\n this.props.dataProvider.sunset.getTime() - dayStartMs;\n const sunDeltaMs = sunSetOffsetMs - sunRiseOffsetMs;\n\n const sunOffsetMs = this.ensureRange(\n this.state.currentTimeOffsetMs,\n sunRiseOffsetMs,\n sunSetOffsetMs\n );\n this.setPlaybackTimeBySunTime(sunOffsetMs, sunRiseOffsetMs, sunDeltaMs);\n\n /** call dataProvider to update display style */\n if (this.props.dataProvider.onTimeChanged)\n this.props.dataProvider.onTimeChanged(this.props.dataProvider.timeOfDay);\n\n this.setState(\n {\n dayStartMs,\n sunRiseOffsetMs,\n sunSetOffsetMs,\n currentTimeOffsetMs: sunOffsetMs,\n sunDeltaMs,\n isDateOpened: false,\n },\n () => {\n this._timeLastCycle = new Date().getTime();\n }\n );\n };\n\n private _onTimeChanged = (time: TimeSpec) => {\n // compute the current date (with time)\n const dayStartMs = this.props.dataProvider.dayStartMs;\n const sunTime =\n time.hours * millisecPerHour + time.minutes * millisecPerMinute;\n const dateWithNewTime = new Date(dayStartMs + sunTime);\n this.props.dataProvider.setDateAndTime(dateWithNewTime, true);\n\n // notify the provider to update style\n if (this.props.dataProvider.onTimeChanged)\n this.props.dataProvider.onTimeChanged(dateWithNewTime);\n\n const currentTimeOffsetMs = this.ensureRange(\n sunTime,\n this.state.sunRiseOffsetMs,\n this.state.sunSetOffsetMs\n );\n\n this.setPlaybackTimeBySunTime(\n currentTimeOffsetMs,\n this.state.sunRiseOffsetMs,\n this.state.sunDeltaMs\n );\n this._timeLastCycle = new Date().getTime();\n\n // update the timeline\n this.setState({ currentTimeOffsetMs });\n };\n\n private _onCloseDayPicker = () => {\n this.setState({ isDateOpened: false });\n };\n\n private _onOpenDayPicker = () => {\n this.setState((prevState) => ({ isDateOpened: !prevState.isDateOpened }));\n };\n\n private _onCloseSettingsPopup = () => {\n this.setState({ isSettingsOpened: false });\n };\n\n private _onOpenSettingsPopup = () => {\n this.setState((prevState) => ({\n isSettingsOpened: !prevState.isSettingsOpened,\n }));\n };\n\n private ensureRange(value: number, min: number, max: number): number {\n return Math.max(Math.min(value, max), min);\n }\n\n private processSunTimeChange(sunTime: number) {\n if (sunTime === this.state.currentTimeOffsetMs) return;\n\n const currentTimeOffsetMs = this.ensureRange(\n sunTime,\n this.state.sunRiseOffsetMs,\n this.state.sunSetOffsetMs\n );\n\n if (this.props.dataProvider.onTimeChanged) {\n const currentSunTime = new Date(\n this.state.dayStartMs + currentTimeOffsetMs\n );\n this.props.dataProvider.onTimeChanged(currentSunTime);\n }\n\n this.setState({ currentTimeOffsetMs }, () => {\n const currentTime = new Date().getTime();\n this._timeLastCycle = currentTime;\n const percentComplete =\n (currentTimeOffsetMs - this.state.sunRiseOffsetMs) /\n this.state.sunDeltaMs;\n this._totalPlayTime = percentComplete * this.state.adjustedDuration;\n });\n }\n\n private _onUpdate = (values: ReadonlyArray<number>) => {\n if (!this.state.isPlaying) this.processSunTimeChange(values[0]);\n };\n\n private _onChange = (values: ReadonlyArray<number>) => {\n if (!this.state.isPlaying) this.processSunTimeChange(values[0]);\n };\n\n private _onSpeedChange = (value: number) => {\n const adjustedDuration = this.state.duration / value;\n this.setState({ speed: value, adjustedDuration });\n };\n\n private _onToggleLoop = () => {\n this.setState((prevState) => ({ loop: !prevState.loop }));\n };\n\n private _formatTime = (millisec: number) => {\n const date = new Date(millisec);\n // convert project date to browser locale date\n const localTime = adjustDateToTimezone(\n date,\n this.props.dataProvider.timeZoneOffset * 60\n );\n let hours = localTime.getHours();\n const minutes = addZero(date.getMinutes());\n const abbrev =\n hours < 12 ? this._amLabel : hours === 24 ? this._amLabel : this._pmLabel;\n hours = hours > 12 ? hours - 12 : hours;\n return `${hours}:${minutes} ${abbrev}`;\n };\n\n private _onPresetColorPick = (shadowColor: ColorDef) => {\n this.setState(\n { shadowColor },\n () => (this.props.dataProvider.shadowColor = shadowColor)\n );\n };\n\n private _handleHueOrSaturationChange = (hueOrSaturation: HSVColor) => {\n if (hueOrSaturation.s === 0)\n // for a ColorDef to be created from hsv s can't be 0\n hueOrSaturation = hueOrSaturation.clone(undefined, 0.5);\n\n const shadowColor = hueOrSaturation.toColorDef();\n this.setState(\n { shadowColor },\n () => (this.props.dataProvider.shadowColor = shadowColor)\n );\n };\n\n public getLocalTime(ticks: number): Date {\n const projectTime = new Date(ticks);\n // convert project date to browser locale date\n return adjustDateToTimezone(\n projectTime,\n this.props.dataProvider.timeZoneOffset * 60\n );\n }\n\n public override render() {\n const { dataProvider } = this.props;\n const {\n speed,\n loop,\n currentTimeOffsetMs,\n sunRiseOffsetMs,\n sunSetOffsetMs,\n } = this.state;\n const localTime = this.getLocalTime(\n this.state.dayStartMs + this.state.currentTimeOffsetMs\n );\n const formattedTime = this._formatTime(\n dataProvider.dayStartMs + currentTimeOffsetMs\n );\n const formattedDate = `${\n this._months[localTime.getMonth()]\n }, ${localTime.getDate()}`;\n\n const colorSwatchStyle: React.CSSProperties = {\n width: `100%`,\n height: `100%`,\n };\n\n return (\n <div className={\"solar-timeline-wrapper\"}>\n <div className=\"header\">\n <PlayButton\n tooltip={this._playLabel}\n className=\"play-button\"\n isPlaying={this.state.isPlaying}\n onPlay={this._onPlay}\n onPause={this._onPause}\n />\n <button\n data-testid=\"solar-date-time-button\"\n title={this._dateTimeLabel}\n className=\"current-date\"\n ref={(element) => (this._datePicker = element)}\n onClick={this._onOpenDayPicker}\n >\n <span>{formattedDate}</span>\n <span>/</span>\n <span>{formattedTime}</span>\n <span className=\"icon\">\n <Icon iconSpec={<SvgCalendar />} />\n </span>\n </button>\n <Popup\n style={{ border: \"none\" }}\n offset={11}\n target={this._datePicker}\n isOpen={this.state.isDateOpened}\n onClose={this._onCloseDayPicker}\n position={RelativePosition.Top}\n >\n <div\n className=\"components-date-picker-calendar-popup-panel\"\n data-testid=\"components-date-picker-calendar-popup-panel\"\n >\n <DatePicker\n selected={localTime}\n onDateChange={this._onDayClick}\n showFocusOutline={false}\n />\n <div className=\"time-container\">\n <Text variant=\"body\" className=\"time-label\">\n {this._timeLabel}\n </Text>\n <TimeField\n time={{\n hours: localTime.getHours(),\n minutes: localTime.getMinutes(),\n seconds: 0,\n }}\n timeDisplay={TimeDisplay.H12MC}\n onTimeChange={this._onTimeChanged}\n />\n </div>\n </div>\n </Popup>\n <Timeline\n className=\"solar-timeline\"\n dayStartMs={dataProvider.dayStartMs}\n sunSetOffsetMs={sunSetOffsetMs}\n sunRiseOffsetMs={sunRiseOffsetMs}\n currentTimeOffsetMs={currentTimeOffsetMs}\n onChange={this._onChange}\n onUpdate={this._onUpdate}\n formatTime={this._formatTime}\n isPlaying={this.state.isPlaying}\n />\n <div className=\"speed-container\">\n <span title={this._speedLabel}>{speed}x</span>\n <SpeedTimeline\n className=\"speed\"\n onChange={this._onSpeedChange}\n speed={this.state.speed}\n />\n </div>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <span\n title={this._loopLabel}\n className={classnames(\n \"icon\",\n !loop && \"no-loop-playback\",\n loop && \"loop-playback\"\n )}\n onClick={this._onToggleLoop}\n role=\"button\"\n tabIndex={-1}\n >\n <Icon iconSpec={<SvgLoop />} />\n </span>\n <button\n data-testid=\"shadow-settings-button\"\n title={this._settingLabel}\n className=\"shadow-settings-button\"\n ref={(element) => (this._settings = element)}\n onClick={this._onOpenSettingsPopup}\n >\n <span className=\"icon\">\n <Icon iconSpec={<SvgSettings />} />\n </span>\n </button>\n <Popup\n className=\"shadow-settings-popup\"\n target={this._settings}\n offset={11}\n isOpen={this.state.isSettingsOpened}\n onClose={this._onCloseSettingsPopup}\n position={RelativePosition.Top}\n >\n <div className=\"shadow-settings-popup-container\">\n <div className=\"shadow-settings-header\">\n {this._settingsPopupTitle}\n </div>\n <div className=\"shadow-settings-color\">\n <div className=\"shadow-settings-color-top\">\n <SaturationPicker\n hsv={this.state.shadowColor.toHSV()}\n onSaturationChange={this._handleHueOrSaturationChange}\n />\n </div>\n <div className=\"shadow-settings-color-bottom\">\n <div className=\"shadow-settings-color-bottom-left\">\n <HueSlider\n hsv={this.state.shadowColor.toHSV()}\n onHueChange={this._handleHueOrSaturationChange}\n isHorizontal={true}\n />\n </div>\n <div className=\"shadow-settings-color-bottom-right\">\n <ColorSwatch\n style={colorSwatchStyle}\n colorDef={this.state.shadowColor}\n round={false}\n />\n </div>\n </div>\n </div>\n <div className=\"shadow-settings-color-presets\">\n <ColorSwatch\n colorDef={this._presetColors[0]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[1]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[2]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[3]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[4]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[5]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[6]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n <ColorSwatch\n colorDef={this._presetColors[7]}\n round={false}\n onColorPick={this._onPresetColorPick}\n />\n </div>\n </div>\n </Popup>\n </div>\n </div>\n );\n }\n}\n"]}