@vscada/primitives 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/annotation/index.d.ts +9 -0
  3. package/dist/annotation/index.d.ts.map +1 -0
  4. package/dist/annotation/off-page/index.d.ts +3 -0
  5. package/dist/annotation/off-page/index.d.ts.map +1 -0
  6. package/dist/annotation/off-page/off-page.stories.d.ts +7 -0
  7. package/dist/annotation/off-page/off-page.stories.d.ts.map +1 -0
  8. package/dist/annotation/story-kit.d.ts +28 -0
  9. package/dist/annotation/story-kit.d.ts.map +1 -0
  10. package/dist/annotation.js +44 -0
  11. package/dist/base-CByO_2mM.js +87 -0
  12. package/dist/bevel-DnmDNvyc.js +14 -0
  13. package/dist/chrome/bevel.d.ts +21 -0
  14. package/dist/chrome/bevel.d.ts.map +1 -0
  15. package/dist/controls/index.d.ts +4 -0
  16. package/dist/controls/index.d.ts.map +1 -0
  17. package/dist/controls/motor-starter-panel/index.d.ts +4 -0
  18. package/dist/controls/motor-starter-panel/index.d.ts.map +1 -0
  19. package/dist/controls/motor-starter-panel/motor-starter-panel.stories.d.ts +10 -0
  20. package/dist/controls/motor-starter-panel/motor-starter-panel.stories.d.ts.map +1 -0
  21. package/dist/controls/pushbutton/index.d.ts +4 -0
  22. package/dist/controls/pushbutton/index.d.ts.map +1 -0
  23. package/dist/controls/pushbutton/pushbutton.stories.d.ts +7 -0
  24. package/dist/controls/pushbutton/pushbutton.stories.d.ts.map +1 -0
  25. package/dist/controls/selector-switch/index.d.ts +4 -0
  26. package/dist/controls/selector-switch/index.d.ts.map +1 -0
  27. package/dist/controls/selector-switch/selector-switch.stories.d.ts +8 -0
  28. package/dist/controls/selector-switch/selector-switch.stories.d.ts.map +1 -0
  29. package/dist/controls/story-kit.d.ts +31 -0
  30. package/dist/controls/story-kit.d.ts.map +1 -0
  31. package/dist/controls.js +149 -0
  32. package/dist/conveyance/conveyor/conveyor.stories.d.ts +9 -0
  33. package/dist/conveyance/conveyor/conveyor.stories.d.ts.map +1 -0
  34. package/dist/conveyance/conveyor/index.d.ts +4 -0
  35. package/dist/conveyance/conveyor/index.d.ts.map +1 -0
  36. package/dist/conveyance/duct/duct.stories.d.ts +7 -0
  37. package/dist/conveyance/duct/duct.stories.d.ts.map +1 -0
  38. package/dist/conveyance/duct/index.d.ts +4 -0
  39. package/dist/conveyance/duct/index.d.ts.map +1 -0
  40. package/dist/conveyance/index.d.ts +5 -0
  41. package/dist/conveyance/index.d.ts.map +1 -0
  42. package/dist/conveyance/pipe/dash.d.ts +28 -0
  43. package/dist/conveyance/pipe/dash.d.ts.map +1 -0
  44. package/dist/conveyance/pipe/flange.d.ts +9 -0
  45. package/dist/conveyance/pipe/flange.d.ts.map +1 -0
  46. package/dist/conveyance/pipe/index.d.ts +3 -0
  47. package/dist/conveyance/pipe/index.d.ts.map +1 -0
  48. package/dist/conveyance/pipe/wave.d.ts +29 -0
  49. package/dist/conveyance/pipe/wave.d.ts.map +1 -0
  50. package/dist/conveyance/screw-feeder/index.d.ts +4 -0
  51. package/dist/conveyance/screw-feeder/index.d.ts.map +1 -0
  52. package/dist/conveyance/screw-feeder/screw-feeder.stories.d.ts +7 -0
  53. package/dist/conveyance/screw-feeder/screw-feeder.stories.d.ts.map +1 -0
  54. package/dist/conveyance/story-kit.d.ts +28 -0
  55. package/dist/conveyance/story-kit.d.ts.map +1 -0
  56. package/dist/conveyance.js +345 -0
  57. package/dist/electrical/base.d.ts +54 -0
  58. package/dist/electrical/base.d.ts.map +1 -0
  59. package/dist/electrical/breaker/breaker.stories.d.ts +9 -0
  60. package/dist/electrical/breaker/breaker.stories.d.ts.map +1 -0
  61. package/dist/electrical/breaker/index.d.ts +4 -0
  62. package/dist/electrical/breaker/index.d.ts.map +1 -0
  63. package/dist/electrical/busbar/busbar.stories.d.ts +8 -0
  64. package/dist/electrical/busbar/busbar.stories.d.ts.map +1 -0
  65. package/dist/electrical/busbar/index.d.ts +4 -0
  66. package/dist/electrical/busbar/index.d.ts.map +1 -0
  67. package/dist/electrical/generator/generator.stories.d.ts +9 -0
  68. package/dist/electrical/generator/generator.stories.d.ts.map +1 -0
  69. package/dist/electrical/generator/index.d.ts +4 -0
  70. package/dist/electrical/generator/index.d.ts.map +1 -0
  71. package/dist/electrical/index.d.ts +4 -0
  72. package/dist/electrical/index.d.ts.map +1 -0
  73. package/dist/electrical/single-line.stories.d.ts +15 -0
  74. package/dist/electrical/single-line.stories.d.ts.map +1 -0
  75. package/dist/electrical/story-kit.d.ts +34 -0
  76. package/dist/electrical/story-kit.d.ts.map +1 -0
  77. package/dist/electrical/transformer/index.d.ts +4 -0
  78. package/dist/electrical/transformer/index.d.ts.map +1 -0
  79. package/dist/electrical/transformer/transformer.stories.d.ts +8 -0
  80. package/dist/electrical/transformer/transformer.stories.d.ts.map +1 -0
  81. package/dist/electrical.js +214 -0
  82. package/dist/filtration/bag-filter/bag-filter.stories.d.ts +6 -0
  83. package/dist/filtration/bag-filter/bag-filter.stories.d.ts.map +1 -0
  84. package/dist/filtration/bag-filter/index.d.ts +3 -0
  85. package/dist/filtration/bag-filter/index.d.ts.map +1 -0
  86. package/dist/filtration/base.d.ts +25 -0
  87. package/dist/filtration/base.d.ts.map +1 -0
  88. package/dist/filtration/cyclone/cyclone.stories.d.ts +6 -0
  89. package/dist/filtration/cyclone/cyclone.stories.d.ts.map +1 -0
  90. package/dist/filtration/cyclone/index.d.ts +3 -0
  91. package/dist/filtration/cyclone/index.d.ts.map +1 -0
  92. package/dist/filtration/index.d.ts +9 -0
  93. package/dist/filtration/index.d.ts.map +1 -0
  94. package/dist/filtration/scrubber/index.d.ts +3 -0
  95. package/dist/filtration/scrubber/index.d.ts.map +1 -0
  96. package/dist/filtration/scrubber/scrubber.stories.d.ts +6 -0
  97. package/dist/filtration/scrubber/scrubber.stories.d.ts.map +1 -0
  98. package/dist/filtration/stack/index.d.ts +3 -0
  99. package/dist/filtration/stack/index.d.ts.map +1 -0
  100. package/dist/filtration/stack/stack.stories.d.ts +6 -0
  101. package/dist/filtration/stack/stack.stories.d.ts.map +1 -0
  102. package/dist/filtration/story-kit.d.ts +27 -0
  103. package/dist/filtration/story-kit.d.ts.map +1 -0
  104. package/dist/filtration.js +163 -0
  105. package/dist/gradients/pipe-gradient.d.ts +35 -0
  106. package/dist/gradients/pipe-gradient.d.ts.map +1 -0
  107. package/dist/heat/base.d.ts +28 -0
  108. package/dist/heat/base.d.ts.map +1 -0
  109. package/dist/heat/boiler/boiler.stories.d.ts +8 -0
  110. package/dist/heat/boiler/boiler.stories.d.ts.map +1 -0
  111. package/dist/heat/boiler/index.d.ts +3 -0
  112. package/dist/heat/boiler/index.d.ts.map +1 -0
  113. package/dist/heat/coil/coil.stories.d.ts +6 -0
  114. package/dist/heat/coil/coil.stories.d.ts.map +1 -0
  115. package/dist/heat/coil/index.d.ts +3 -0
  116. package/dist/heat/coil/index.d.ts.map +1 -0
  117. package/dist/heat/condenser/condenser.stories.d.ts +6 -0
  118. package/dist/heat/condenser/condenser.stories.d.ts.map +1 -0
  119. package/dist/heat/condenser/index.d.ts +3 -0
  120. package/dist/heat/condenser/index.d.ts.map +1 -0
  121. package/dist/heat/cooling-tower/cooling-tower.stories.d.ts +6 -0
  122. package/dist/heat/cooling-tower/cooling-tower.stories.d.ts.map +1 -0
  123. package/dist/heat/cooling-tower/index.d.ts +3 -0
  124. package/dist/heat/cooling-tower/index.d.ts.map +1 -0
  125. package/dist/heat/furnace/furnace.stories.d.ts +8 -0
  126. package/dist/heat/furnace/furnace.stories.d.ts.map +1 -0
  127. package/dist/heat/furnace/index.d.ts +3 -0
  128. package/dist/heat/furnace/index.d.ts.map +1 -0
  129. package/dist/heat/index.d.ts +9 -0
  130. package/dist/heat/index.d.ts.map +1 -0
  131. package/dist/heat/shell-tube/index.d.ts +3 -0
  132. package/dist/heat/shell-tube/index.d.ts.map +1 -0
  133. package/dist/heat/shell-tube/shell-tube.stories.d.ts +6 -0
  134. package/dist/heat/shell-tube/shell-tube.stories.d.ts.map +1 -0
  135. package/dist/heat/story-kit.d.ts +27 -0
  136. package/dist/heat/story-kit.d.ts.map +1 -0
  137. package/dist/heat.js +290 -0
  138. package/dist/index.d.ts +2 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +4 -0
  141. package/dist/instruments/bargraph/bargraph.stories.d.ts +8 -0
  142. package/dist/instruments/bargraph/bargraph.stories.d.ts.map +1 -0
  143. package/dist/instruments/bargraph/index.d.ts +3 -0
  144. package/dist/instruments/bargraph/index.d.ts.map +1 -0
  145. package/dist/instruments/face.d.ts +15 -0
  146. package/dist/instruments/face.d.ts.map +1 -0
  147. package/dist/instruments/gauge-analog/gauge-analog.stories.d.ts +11 -0
  148. package/dist/instruments/gauge-analog/gauge-analog.stories.d.ts.map +1 -0
  149. package/dist/instruments/gauge-analog/index.d.ts +3 -0
  150. package/dist/instruments/gauge-analog/index.d.ts.map +1 -0
  151. package/dist/instruments/gauge-digital/gauge-digital.stories.d.ts +7 -0
  152. package/dist/instruments/gauge-digital/gauge-digital.stories.d.ts.map +1 -0
  153. package/dist/instruments/gauge-digital/index.d.ts +3 -0
  154. package/dist/instruments/gauge-digital/index.d.ts.map +1 -0
  155. package/dist/instruments/index.d.ts +10 -0
  156. package/dist/instruments/index.d.ts.map +1 -0
  157. package/dist/instruments/indicator-lamp/index.d.ts +3 -0
  158. package/dist/instruments/indicator-lamp/index.d.ts.map +1 -0
  159. package/dist/instruments/indicator-lamp/indicator-lamp.stories.d.ts +9 -0
  160. package/dist/instruments/indicator-lamp/indicator-lamp.stories.d.ts.map +1 -0
  161. package/dist/instruments/readout-panel/index.d.ts +3 -0
  162. package/dist/instruments/readout-panel/index.d.ts.map +1 -0
  163. package/dist/instruments/readout-panel/readout-panel.stories.d.ts +6 -0
  164. package/dist/instruments/readout-panel/readout-panel.stories.d.ts.map +1 -0
  165. package/dist/instruments/story-kit.d.ts +29 -0
  166. package/dist/instruments/story-kit.d.ts.map +1 -0
  167. package/dist/instruments/trend-mini/index.d.ts +3 -0
  168. package/dist/instruments/trend-mini/index.d.ts.map +1 -0
  169. package/dist/instruments/trend-mini/trend-mini.stories.d.ts +6 -0
  170. package/dist/instruments/trend-mini/trend-mini.stories.d.ts.map +1 -0
  171. package/dist/instruments.js +347 -0
  172. package/dist/motion/seamless-loop.d.ts +14 -0
  173. package/dist/motion/seamless-loop.d.ts.map +1 -0
  174. package/dist/pipe-gradient-B538FEvi.js +18 -0
  175. package/dist/readout/index.d.ts +3 -0
  176. package/dist/readout/index.d.ts.map +1 -0
  177. package/dist/readout/readout.stories.d.ts +8 -0
  178. package/dist/readout/readout.stories.d.ts.map +1 -0
  179. package/dist/readout/story-kit.d.ts +27 -0
  180. package/dist/readout/story-kit.d.ts.map +1 -0
  181. package/dist/readout.js +33 -0
  182. package/dist/recipe-BxxL1vV1.js +383 -0
  183. package/dist/rotating/compressor/compressor.stories.d.ts +28 -0
  184. package/dist/rotating/compressor/compressor.stories.d.ts.map +1 -0
  185. package/dist/rotating/compressor/index.d.ts +3 -0
  186. package/dist/rotating/compressor/index.d.ts.map +1 -0
  187. package/dist/rotating/fan-axial/fan-axial.stories.d.ts +31 -0
  188. package/dist/rotating/fan-axial/fan-axial.stories.d.ts.map +1 -0
  189. package/dist/rotating/fan-axial/index.d.ts +3 -0
  190. package/dist/rotating/fan-axial/index.d.ts.map +1 -0
  191. package/dist/rotating/fan-centrifugal/fan-centrifugal.stories.d.ts +31 -0
  192. package/dist/rotating/fan-centrifugal/fan-centrifugal.stories.d.ts.map +1 -0
  193. package/dist/rotating/fan-centrifugal/index.d.ts +3 -0
  194. package/dist/rotating/fan-centrifugal/index.d.ts.map +1 -0
  195. package/dist/rotating/index.d.ts +12 -0
  196. package/dist/rotating/index.d.ts.map +1 -0
  197. package/dist/rotating/motor/index.d.ts +3 -0
  198. package/dist/rotating/motor/index.d.ts.map +1 -0
  199. package/dist/rotating/motor/motor.stories.d.ts +28 -0
  200. package/dist/rotating/motor/motor.stories.d.ts.map +1 -0
  201. package/dist/rotating/pump-centrifugal/index.d.ts +3 -0
  202. package/dist/rotating/pump-centrifugal/index.d.ts.map +1 -0
  203. package/dist/rotating/pump-centrifugal/pump-centrifugal.stories.d.ts +29 -0
  204. package/dist/rotating/pump-centrifugal/pump-centrifugal.stories.d.ts.map +1 -0
  205. package/dist/rotating/pump-positive-displacement/index.d.ts +3 -0
  206. package/dist/rotating/pump-positive-displacement/index.d.ts.map +1 -0
  207. package/dist/rotating/pump-positive-displacement/pump-positive-displacement.stories.d.ts +28 -0
  208. package/dist/rotating/pump-positive-displacement/pump-positive-displacement.stories.d.ts.map +1 -0
  209. package/dist/rotating/story-kit.d.ts +65 -0
  210. package/dist/rotating/story-kit.d.ts.map +1 -0
  211. package/dist/rotating/turbine/index.d.ts +3 -0
  212. package/dist/rotating/turbine/index.d.ts.map +1 -0
  213. package/dist/rotating/turbine/turbine.stories.d.ts +29 -0
  214. package/dist/rotating/turbine/turbine.stories.d.ts.map +1 -0
  215. package/dist/rotating.js +513 -0
  216. package/dist/rotation-drive/base.d.ts +110 -0
  217. package/dist/rotation-drive/base.d.ts.map +1 -0
  218. package/dist/valves/ball/ball.stories.d.ts +26 -0
  219. package/dist/valves/ball/ball.stories.d.ts.map +1 -0
  220. package/dist/valves/ball/index.d.ts +3 -0
  221. package/dist/valves/ball/index.d.ts.map +1 -0
  222. package/dist/valves/base.d.ts +70 -0
  223. package/dist/valves/base.d.ts.map +1 -0
  224. package/dist/valves/butterfly/butterfly.stories.d.ts +26 -0
  225. package/dist/valves/butterfly/butterfly.stories.d.ts.map +1 -0
  226. package/dist/valves/butterfly/index.d.ts +3 -0
  227. package/dist/valves/butterfly/index.d.ts.map +1 -0
  228. package/dist/valves/check/check.stories.d.ts +25 -0
  229. package/dist/valves/check/check.stories.d.ts.map +1 -0
  230. package/dist/valves/check/index.d.ts +3 -0
  231. package/dist/valves/check/index.d.ts.map +1 -0
  232. package/dist/valves/control/control.stories.d.ts +26 -0
  233. package/dist/valves/control/control.stories.d.ts.map +1 -0
  234. package/dist/valves/control/index.d.ts +3 -0
  235. package/dist/valves/control/index.d.ts.map +1 -0
  236. package/dist/valves/gate/gate.stories.d.ts +26 -0
  237. package/dist/valves/gate/gate.stories.d.ts.map +1 -0
  238. package/dist/valves/gate/index.d.ts +3 -0
  239. package/dist/valves/gate/index.d.ts.map +1 -0
  240. package/dist/valves/index.d.ts +8 -0
  241. package/dist/valves/index.d.ts.map +1 -0
  242. package/dist/valves/relief/index.d.ts +3 -0
  243. package/dist/valves/relief/index.d.ts.map +1 -0
  244. package/dist/valves/relief/relief.stories.d.ts +26 -0
  245. package/dist/valves/relief/relief.stories.d.ts.map +1 -0
  246. package/dist/valves/story-kit.d.ts +54 -0
  247. package/dist/valves/story-kit.d.ts.map +1 -0
  248. package/dist/valves.js +424 -0
  249. package/dist/vapor/base.d.ts +42 -0
  250. package/dist/vapor/base.d.ts.map +1 -0
  251. package/dist/vapor/billow-layer.d.ts +33 -0
  252. package/dist/vapor/billow-layer.d.ts.map +1 -0
  253. package/dist/vapor/billow-path.d.ts +36 -0
  254. package/dist/vapor/billow-path.d.ts.map +1 -0
  255. package/dist/vapor/index.d.ts +8 -0
  256. package/dist/vapor/index.d.ts.map +1 -0
  257. package/dist/vapor/plume/index.d.ts +3 -0
  258. package/dist/vapor/plume/index.d.ts.map +1 -0
  259. package/dist/vapor/plume/plume.stories.d.ts +9 -0
  260. package/dist/vapor/plume/plume.stories.d.ts.map +1 -0
  261. package/dist/vapor/steam-vent/index.d.ts +3 -0
  262. package/dist/vapor/steam-vent/index.d.ts.map +1 -0
  263. package/dist/vapor/steam-vent/steam-vent.stories.d.ts +9 -0
  264. package/dist/vapor/steam-vent/steam-vent.stories.d.ts.map +1 -0
  265. package/dist/vapor/story-kit.d.ts +28 -0
  266. package/dist/vapor/story-kit.d.ts.map +1 -0
  267. package/dist/vapor.js +194 -0
  268. package/dist/vessel-body/hardware.d.ts +13 -0
  269. package/dist/vessel-body/hardware.d.ts.map +1 -0
  270. package/dist/vessel-body/liquid/dished-bottom.d.ts +33 -0
  271. package/dist/vessel-body/liquid/dished-bottom.d.ts.map +1 -0
  272. package/dist/vessel-body/liquid/index.d.ts +11 -0
  273. package/dist/vessel-body/liquid/index.d.ts.map +1 -0
  274. package/dist/vessel-body/liquid/wave-layer.d.ts +57 -0
  275. package/dist/vessel-body/liquid/wave-layer.d.ts.map +1 -0
  276. package/dist/vessel-body/liquid/wave-path.d.ts +45 -0
  277. package/dist/vessel-body/liquid/wave-path.d.ts.map +1 -0
  278. package/dist/vessel-body/recipe.d.ts +85 -0
  279. package/dist/vessel-body/recipe.d.ts.map +1 -0
  280. package/dist/vessel-body/shapes.d.ts +78 -0
  281. package/dist/vessel-body/shapes.d.ts.map +1 -0
  282. package/dist/vessels/drum/drum.stories.d.ts +33 -0
  283. package/dist/vessels/drum/drum.stories.d.ts.map +1 -0
  284. package/dist/vessels/drum/index.d.ts +3 -0
  285. package/dist/vessels/drum/index.d.ts.map +1 -0
  286. package/dist/vessels/hopper/hopper.stories.d.ts +39 -0
  287. package/dist/vessels/hopper/hopper.stories.d.ts.map +1 -0
  288. package/dist/vessels/hopper/index.d.ts +3 -0
  289. package/dist/vessels/hopper/index.d.ts.map +1 -0
  290. package/dist/vessels/index.d.ts +10 -0
  291. package/dist/vessels/index.d.ts.map +1 -0
  292. package/dist/vessels/silo/index.d.ts +3 -0
  293. package/dist/vessels/silo/index.d.ts.map +1 -0
  294. package/dist/vessels/silo/silo.stories.d.ts +33 -0
  295. package/dist/vessels/silo/silo.stories.d.ts.map +1 -0
  296. package/dist/vessels/story-kit.d.ts +83 -0
  297. package/dist/vessels/story-kit.d.ts.map +1 -0
  298. package/dist/vessels/tank-horizontal/index.d.ts +3 -0
  299. package/dist/vessels/tank-horizontal/index.d.ts.map +1 -0
  300. package/dist/vessels/tank-horizontal/tank-horizontal.stories.d.ts +33 -0
  301. package/dist/vessels/tank-horizontal/tank-horizontal.stories.d.ts.map +1 -0
  302. package/dist/vessels/tank-spherical/index.d.ts +3 -0
  303. package/dist/vessels/tank-spherical/index.d.ts.map +1 -0
  304. package/dist/vessels/tank-spherical/tank-spherical.stories.d.ts +33 -0
  305. package/dist/vessels/tank-spherical/tank-spherical.stories.d.ts.map +1 -0
  306. package/dist/vessels/tank-vertical/index.d.ts +3 -0
  307. package/dist/vessels/tank-vertical/index.d.ts.map +1 -0
  308. package/dist/vessels/tank-vertical/tank-vertical.stories.d.ts +47 -0
  309. package/dist/vessels/tank-vertical/tank-vertical.stories.d.ts.map +1 -0
  310. package/dist/vessels.js +198 -0
  311. package/package.json +76 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-kit.d.ts","sourceRoot":"","sources":["../../src/vapor/story-kit.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,SAAS,EACT,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,QAAQ,EAEb,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAoCtB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAwCD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACpC,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,kIAAkI;IAClI,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CAkBxJ"}
package/dist/vapor.js ADDED
@@ -0,0 +1,194 @@
1
+ import { resolveEmissionIntensity as e, resolveMediumStyle as t } from "@vscada/core";
2
+ function n(e, t, n, r) {
3
+ return t + n * Math.sin(2 * Math.PI * e / r);
4
+ }
5
+ function r(e, t, r, i, a = 6) {
6
+ let o = [], s = a > 0 ? a : 6;
7
+ for (let a = 0; a < e; a += s) o.push({
8
+ x: n(a, t, r, i),
9
+ y: a
10
+ });
11
+ return o.push({
12
+ x: n(e, t, r, i),
13
+ y: e
14
+ }), o;
15
+ }
16
+ function i(e, t, n, i, a = 6) {
17
+ let o = r(e, t, n, i, a), s = [...o].reverse();
18
+ return [
19
+ ...o.map((e, t) => `${t === 0 ? "M" : "L"}${e.x},${e.y}`),
20
+ ...s.map((e) => `L${-e.x},${e.y}`),
21
+ "Z"
22
+ ].join(" ");
23
+ }
24
+ //#endregion
25
+ //#region src/motion/seamless-loop.ts
26
+ function a(e, t, n, r, i) {
27
+ let a = t === "x" ? "translateX(0px)" : "translateY(0px)", o = t === "x" ? `translateX(-${n}px)` : `translateY(-${n}px)`;
28
+ return i.animateTransform(e, [a, o], r);
29
+ }
30
+ //#endregion
31
+ //#region src/vapor/billow-layer.ts
32
+ var o = "http://www.w3.org/2000/svg", s = 3e3;
33
+ function c(e, t) {
34
+ let { containerHeight: n, centerX: r, baseHalfWidth: c, wobble: l, period: u, color: d, durationMs: f = s } = e, p = i(n + u, c, l, u), m = document.createElementNS(o, "g");
35
+ m.setAttribute("class", "vscada-vapor-billow-carrier"), m.setAttribute("transform", `translate(${r}, 0)`);
36
+ let h = document.createElementNS(o, "g");
37
+ h.setAttribute("class", "vscada-vapor-billow-loop"), m.appendChild(h);
38
+ let g = document.createElementNS(o, "path");
39
+ return g.setAttribute("class", "vscada-vapor-billow-fill"), g.setAttribute("d", p), g.setAttribute("fill", d), g.setAttribute("fill-opacity", "0"), g.setAttribute("stroke", "none"), h.appendChild(g), {
40
+ carrier: m,
41
+ fill: g,
42
+ control: a(h, "y", u, f, t)
43
+ };
44
+ }
45
+ //#endregion
46
+ //#region src/vapor/base.ts
47
+ function l(e) {}
48
+ function u(t) {
49
+ let { element: n, group: r, layers: i, staticGlyph: a, plumeStyle: o, brightnessFactor: s = 1, onWarning: c = l } = t, u = n.bindings.find((e) => e.type === "emission");
50
+ if (!u) return { handles: {} };
51
+ let d = {
52
+ kind: "numeric",
53
+ write(t, n) {
54
+ n < 0 && c({
55
+ code: "NEGATIVE_EMISSION_VALUE",
56
+ message: `Tag "${u.tag}": emission value ${n} is negative`,
57
+ tag: u.tag
58
+ });
59
+ let l = e(u, n);
60
+ t.setAttr(r, "opacity", l > 0 ? "1" : "0");
61
+ let d = Math.min(1, l * o.opacity * s);
62
+ for (let e of i) t.setAttr(e.fill, "fill-opacity", String(d)), e.control.setPlaybackRate(l * o.driftSpeed);
63
+ a && t.setAttr(a, "fill-opacity", String(d));
64
+ }
65
+ };
66
+ return { handles: { [u.tag]: d } };
67
+ }
68
+ function d(e, t, n) {
69
+ if (!n) return {};
70
+ let r = n, i = {
71
+ kind: "static-representation",
72
+ activate() {
73
+ for (let e of t) e.carrier.style.display = "none";
74
+ r.style.display = "";
75
+ },
76
+ deactivate() {
77
+ for (let e of t) e.carrier.style.display = "";
78
+ r.style.display = "none";
79
+ }
80
+ };
81
+ return { [`__vapor-static-representation-${e}`]: i };
82
+ }
83
+ function f(e, t) {
84
+ return t.length === 0 ? {} : { [`__vapor-drift-animation-${e}`]: {
85
+ kind: "animation",
86
+ pause() {
87
+ for (let e of t) e.control.pause();
88
+ },
89
+ resume() {
90
+ for (let e of t) e.control.resume();
91
+ },
92
+ seek(e) {
93
+ for (let n of t) n.control.seek(e);
94
+ }
95
+ } };
96
+ }
97
+ //#endregion
98
+ //#region src/vapor/plume/index.ts
99
+ var p = "http://www.w3.org/2000/svg", m = 3, h = .35, g = .9, _ = .6;
100
+ function v(e, n, r) {
101
+ let a = document.createElementNS(p, "g");
102
+ a.setAttribute("data-element-id", e.id), a.setAttribute("class", "vscada-vapor-plume"), a.setAttribute("opacity", "0");
103
+ let o = t(n.tokens.medium, e.medium);
104
+ if (!o?.plume) return {
105
+ svg: a,
106
+ handles: {}
107
+ };
108
+ let { w: l, h: v } = e, y = l / 2, b = Math.max(8, v * g), x = [];
109
+ for (let e = 0; e < m; e++) {
110
+ let t = Math.max(2, l / 2 * (1 - e * .18)), n = c({
111
+ containerHeight: v,
112
+ centerX: y,
113
+ baseHalfWidth: t,
114
+ wobble: t * h,
115
+ period: b,
116
+ color: o.color,
117
+ durationMs: s * (1 + e * _)
118
+ }, r);
119
+ a.appendChild(n.carrier), x.push(n);
120
+ }
121
+ let S = document.createElementNS(p, "path");
122
+ S.setAttribute("class", "vscada-vapor-plume-static"), S.setAttribute("transform", `translate(${y}, 0)`), S.setAttribute("d", i(v, l * .32, l * .32 * h, b)), S.setAttribute("fill", o.color), S.setAttribute("fill-opacity", "0"), S.setAttribute("stroke", "none"), S.style.display = "none", a.appendChild(S);
123
+ let C = u({
124
+ element: e,
125
+ group: a,
126
+ layers: x,
127
+ staticGlyph: S,
128
+ plumeStyle: o.plume
129
+ }), w = f(e.id, x), T = d(e.id, x, S);
130
+ return {
131
+ svg: a,
132
+ handles: {
133
+ ...C.handles,
134
+ ...w,
135
+ ...T
136
+ }
137
+ };
138
+ }
139
+ var y = Object.freeze({
140
+ group: "vapor",
141
+ primitives: Object.freeze({ plume: { build: v } })
142
+ }), b = "http://www.w3.org/2000/svg", x = 2, S = .3, C = .7, w = .5, T = .4, E = 1.6, D = "steam";
143
+ function O(e, n, r) {
144
+ let a = document.createElementNS(b, "g");
145
+ a.setAttribute("data-element-id", e.id), a.setAttribute("class", "vscada-vapor-steam-vent"), a.setAttribute("opacity", "0");
146
+ let o = t(n.tokens.medium, e.medium ?? D);
147
+ if (!o?.plume) return {
148
+ svg: a,
149
+ handles: {}
150
+ };
151
+ let { w: l, h: p } = e, m = l / 2, h = Math.max(6, p * C), g = [];
152
+ for (let e = 0; e < x; e++) {
153
+ let t = Math.max(1.5, l / 2 * (1 - e * .2)), n = c({
154
+ containerHeight: p,
155
+ centerX: m,
156
+ baseHalfWidth: t,
157
+ wobble: t * S,
158
+ period: h,
159
+ color: o.color,
160
+ durationMs: s * w * (1 + e * T)
161
+ }, r);
162
+ a.appendChild(n.carrier), g.push(n);
163
+ }
164
+ let _ = document.createElementNS(b, "path");
165
+ _.setAttribute("class", "vscada-vapor-steam-vent-static"), _.setAttribute("transform", `translate(${m}, 0)`), _.setAttribute("d", i(p, l * .28, l * .28 * S, h)), _.setAttribute("fill", o.color), _.setAttribute("fill-opacity", "0"), _.setAttribute("stroke", "none"), _.style.display = "none", a.appendChild(_);
166
+ let v = u({
167
+ element: e,
168
+ group: a,
169
+ layers: g,
170
+ staticGlyph: _,
171
+ plumeStyle: o.plume,
172
+ brightnessFactor: E
173
+ }), y = f(e.id, g), O = d(e.id, g, _);
174
+ return {
175
+ svg: a,
176
+ handles: {
177
+ ...v.handles,
178
+ ...y,
179
+ ...O
180
+ }
181
+ };
182
+ }
183
+ var k = Object.freeze({
184
+ group: "vapor",
185
+ primitives: Object.freeze({ "steam-vent": { build: O } })
186
+ }), A = Object.freeze({
187
+ group: "vapor",
188
+ primitives: Object.freeze({
189
+ ...y.primitives,
190
+ ...k.primitives
191
+ })
192
+ });
193
+ //#endregion
194
+ export { A as vapor };
@@ -0,0 +1,13 @@
1
+ import type { VesselTokens } from '@vscada/core';
2
+ /** §7.2 layer 6's "which small details" per vessel silhouette — one shared builder, a variant switch, never a per-vessel fork. */
3
+ export type VesselHardwareVariant = 'tank-vertical' | 'tank-horizontal' | 'drum' | 'sphere' | 'hopper' | 'silo';
4
+ /**
5
+ * §7.2 layer 6: "three or four small details convince more than a perfect
6
+ * outline" — deliberately NOT exhaustive per vessel. Every dimension is a
7
+ * function of `w`/`h` (parametric, AD-3); every color/width is a token
8
+ * (AD-7, via the small `rect`/`circle`/`weldLine`/… helpers above, which
9
+ * degrade to `'none'` exactly like every other primitive here when a token
10
+ * is unregistered).
11
+ */
12
+ export declare function buildHardwareLayer(w: number, h: number, variant: VesselHardwareVariant, tokens: VesselTokens | undefined): SVGGElement;
13
+ //# sourceMappingURL=hardware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardware.d.ts","sourceRoot":"","sources":["../../src/vessel-body/hardware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,kIAAkI;AAClI,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAgFhH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,CA6DtI"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Dished-bottom tank head clip geometry (Story 3.2 Task 3, §7.2: "Rim
3
+ * details — top and bottom ellipses for tank heads (ellipse ratio ~0.18 of
4
+ * width)"). Story 1.5 shipped a plain full-rect clip; that's fine at high
5
+ * fill but wrong at low fill — a real dished bottom narrows to a point, so
6
+ * a 2% level should read as a thin LENS at the vessel's horizontal center,
7
+ * not a full-width sliver. This module owns that shape as pure geometry so
8
+ * it's testable without a browser (jsdom does not rasterize clip-path).
9
+ */
10
+ /** §7.2's constant — the dish's height as a fraction of the vessel's WIDTH (not height). */
11
+ export declare const DISH_WIDTH_RATIO = 0.18;
12
+ /** Clamped so a very short/squat vessel can't have a dish taller than the vessel itself. */
13
+ export declare function dishHeightFor(w: number, h: number, ratio?: number): number;
14
+ /**
15
+ * Clip path `d` for the vessel's liquid area: a flat-sided rect down to
16
+ * `h - dish`, then a half-ellipse (rx = w/2, ry = dish) sweeping through
17
+ * the bottom-center point (w/2, h) back up to the opposite side. Sweep
18
+ * flag 1 draws the LOWER half of the ellipse (the two endpoints sit on the
19
+ * ellipse's horizontal axis, so sweep alone picks top-half vs bottom-half
20
+ * for this exactly-180-degree arc) — i.e. the bulge goes down, not up.
21
+ * Built ONCE per element (cached by clip id, same pattern as Story 1.5's
22
+ * plain-rect clip) — never regenerated per frame or per level change.
23
+ */
24
+ export declare function dishedBottomClipPathD(w: number, h: number, ratio?: number): string;
25
+ /**
26
+ * The visible liquid width at `depthFromTip` px above the vessel's very
27
+ * bottom point (0 at the tip, growing to the full `w` once `depthFromTip`
28
+ * reaches the dish's height). Pure ellipse cross-section math — exists so
29
+ * the "0-5% level" AC is verifiable directly (a thin puddle must compute
30
+ * to LESS than the full width) without needing real SVG rendering.
31
+ */
32
+ export declare function dishWidthAtDepth(w: number, h: number, depthFromTip: number, ratio?: number): number;
33
+ //# sourceMappingURL=dished-bottom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dished-bottom.d.ts","sourceRoot":"","sources":["../../../src/vessel-body/liquid/dished-bottom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAyB,GAAG,MAAM,CAE5F;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAyB,GAAG,MAAM,CAKpG;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,MAAyB,GAAG,MAAM,CAUrH"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Liquid wave module (Story 3.2) — shared by every vessel primitive with a
3
+ * clipped liquid `<g>` (tank-vertical today; tank-horizontal/spherical/etc.
4
+ * in Story 3.3+ reuse the same wave/clip geometry). Deliberately exports
5
+ * pure geometry (`wave-path`, `dished-bottom`) separately from the DOM
6
+ * builder (`wave-layer`) so both halves stay independently unit-testable.
7
+ */
8
+ export { buildWaveCrestPathD, buildWaveCrestPoints, buildWavePathD, WAVE_SAMPLE_STEP_PX, type WavePoint } from './wave-path';
9
+ export { BASE_WAVE_DURATION_MS, DEFAULT_SPECULAR, DEFAULT_WAVE_AMPLITUDE, DEFAULT_WAVE_PERIOD, DEFAULT_WAVE_SPEED, buildWaveLayer, type WaveLayer, type WaveLayerParams, } from './wave-layer';
10
+ export { DISH_WIDTH_RATIO, dishedBottomClipPathD, dishHeightFor, dishWidthAtDepth } from './dished-bottom';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vessel-body/liquid/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7H,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { AnimationControl, Renderer, SpecularStyle } from '@vscada/core';
2
+ /** Reference duration for one full `translateX(-period)` loop at playbackRate 1 — same "documented default, not spec-pinned" convention as the pipe's `BASE_DASH_DURATION_MS` (Story 1.4). */
3
+ export declare const BASE_WAVE_DURATION_MS = 4000;
4
+ /**
5
+ * Motion fallbacks used only when a vessel's resolved medium has no
6
+ * registered wave params (no `medium` tokens at all, or a medium missing
7
+ * these optional §7.4 fields) — plain px/dimensionless defaults, never a
8
+ * color (AD-7 bans literal COLORS in primitives; a documented motion
9
+ * magnitude is the same convention `dash.ts`'s `BASE_DASH_DURATION_MS`
10
+ * already uses).
11
+ */
12
+ export declare const DEFAULT_WAVE_AMPLITUDE = 3;
13
+ export declare const DEFAULT_WAVE_PERIOD = 80;
14
+ export declare const DEFAULT_WAVE_SPEED = 1;
15
+ export declare const DEFAULT_SPECULAR: SpecularStyle;
16
+ export interface WaveLayerParams {
17
+ /**
18
+ * The vessel's own width — the path is built at LEAST 2x THIS (AC 1:
19
+ * "built once at 2x container width"), and wider still whenever `period`
20
+ * exceeds `containerWidth` (Bug 1 fix): the WAAPI loop translates the
21
+ * built path by `-period` px, so seamless coverage requires the built
22
+ * path to span at least `containerWidth + period`, not a fixed 2x.
23
+ */
24
+ containerWidth: number;
25
+ amplitude: number;
26
+ period: number;
27
+ /** Multiplier applied to the loop's WAAPI playbackRate at build time — the medium's `waveSpeed` ("viscosity reads as slowness", §7.4's primary characterization lever). */
28
+ speedFactor: number;
29
+ /** Already-resolved theme/medium color — never a literal hex (AD-7). */
30
+ color: string;
31
+ /** Wave ribbon fill opacity. */
32
+ opacity: number;
33
+ specular: SpecularStyle;
34
+ }
35
+ export interface WaveLayer {
36
+ /** Y-translated by the tank's EXISTING level write (Story 1.5's tween) — never a second/new tween (Task 1). */
37
+ carrier: SVGGElement;
38
+ /** The one WAAPI loop control for this layer — pause/resume/seek reach it via the primitive's own `AnimationHandle`, which is core's AD-5 registry entry point. */
39
+ control: AnimationControl;
40
+ }
41
+ /**
42
+ * Builds ONE wave layer: a carrier group (Y, level-driven, transform-only)
43
+ * wrapping a loop group (X, WAAPI-driven seamless loop) wrapping the wave
44
+ * path(s). `buildWavePathD` is called exactly ONCE here — every other
45
+ * change to this layer (level, playback rate, freeze) is a transform or a
46
+ * WAAPI control call, never a re-build (AD-2/Task 1's hard constraint).
47
+ *
48
+ * `specular` strokes a SEPARATE crest-only path (Bug 7 fix — the closed
49
+ * fill ribbon's `d` also includes the flat `bandDepth` baseline and
50
+ * vertical end-caps, which a stroke pass would draw as straight seams, not
51
+ * "a soft band along the crest"): 'sharp' (water) = thin bright crest
52
+ * line, 'diffuse' (oil) = wide soft band, 'none' (slurry, AC 2's named
53
+ * case) = omitted entirely — matte is the ABSENCE of the element, not a
54
+ * muted version of it.
55
+ */
56
+ export declare function buildWaveLayer(params: WaveLayerParams, renderer: Renderer): WaveLayer;
57
+ //# sourceMappingURL=wave-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-layer.d.ts","sourceRoot":"","sources":["../../../src/vessel-body/liquid/wave-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK9E,8LAA8L;AAC9L,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,gBAAgB,EAAE,aAAuB,CAAC;AAOvD,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,2KAA2K;IAC3K,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,+GAA+G;IAC/G,OAAO,EAAE,WAAW,CAAC;IACrB,mKAAmK;IACnK,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAuDrF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Sine-wave path geometry (Story 3.2 Task 1, §7.3's technique pulled into
3
+ * v1 per spec-amendments §B1): "each path built once at 2x container
4
+ * width, animated only via `transform: translateX(-period)`, linear
5
+ * infinite. Because the path is periodic, translating by exactly one
6
+ * period is seamless."
7
+ *
8
+ * Pure math — no DOM here — so the periodicity claim (AD-2's "structure
9
+ * once" hinges on it: if this weren't exactly periodic, a translateX loop
10
+ * would visibly jump at the seam) is directly unit-testable without a
11
+ * browser.
12
+ */
13
+ /** Px between samples along the wave crest — small enough to read as a smooth curve at typical vessel widths, large enough to keep the `d` string short. */
14
+ export declare const WAVE_SAMPLE_STEP_PX = 6;
15
+ export interface WavePoint {
16
+ x: number;
17
+ y: number;
18
+ }
19
+ /**
20
+ * The crest of the wave: `y = -amplitude * sin(2*pi*x/period)`, sampled
21
+ * from `x = 0` to `x = width` inclusive. Negative sign so a positive
22
+ * amplitude bulges the crest UP (toward the surface) at x=0, matching how
23
+ * the wave layer is anchored to the liquid surface (§7.3).
24
+ */
25
+ export declare function buildWaveCrestPoints(width: number, amplitude: number, period: number, sampleStep?: number): WavePoint[];
26
+ /**
27
+ * The crest ALONE as an open path `d` (`M`/`L` polyline, no baseline, no
28
+ * close): what `buildWavePathD` draws as its top edge, exposed separately
29
+ * so a stroked "highlight the crest" pass (the specular treatment, Story
30
+ * 3.2 Bug 7 fix) can reuse just this curve instead of the closed fill
31
+ * ribbon — reusing the closed ribbon's `d` for a stroke also strokes its
32
+ * flat `bandDepth` baseline and vertical end-caps, which is NOT "a soft
33
+ * band along the crest."
34
+ */
35
+ export declare function buildWaveCrestPathD(width: number, amplitude: number, period: number, sampleStep?: number): string;
36
+ /**
37
+ * The wave layer's fillable `d`: the crest polyline, then straight down to
38
+ * a flat `bandDepth` baseline and back — a shallow ribbon riding the
39
+ * surface, not a filled-to-the-floor shape (§7.3's "gentle wave layer",
40
+ * not a redrawn liquid body). Built exactly ONCE per element (AD-2); every
41
+ * subsequent level/playback change is transform-only — this function must
42
+ * never be called again outside `build()`.
43
+ */
44
+ export declare function buildWavePathD(width: number, amplitude: number, period: number, bandDepth: number, sampleStep?: number): string;
45
+ //# sourceMappingURL=wave-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wave-path.d.ts","sourceRoot":"","sources":["../../../src/vessel-body/liquid/wave-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,4JAA4J;AAC5J,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,SAAS,EAAE,CAS5I;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,MAAM,CAGtI;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAA4B,GAAG,MAAM,CAGpJ"}
@@ -0,0 +1,85 @@
1
+ import type { HandleMap, Renderer, SceneElement, ThemeContext } from '@vscada/core';
2
+ import { type VesselHardwareVariant } from './hardware';
3
+ /**
4
+ * Story 3.3 Task 1 — the shared §7.2 seven-layer vessel recipe. ONE module,
5
+ * every vessel (tank-vertical retrofitted, plus tank-horizontal/-spherical/
6
+ * hopper/silo/drum) parameterizes this with geometry only (Dev Notes: "if a
7
+ * vessel needs recipe-module changes, change the module — never fork it").
8
+ *
9
+ * Layers, back to front, exactly per §7.2:
10
+ * 1. body base — vertical gradient, mid-tone -> darker
11
+ * 2. cylindrical shading overlay — the "does most of the work" layer;
12
+ * linear (orientation-dependent axis) for cylinders, radial highlight
13
+ * for spheres
14
+ * 3. liquid group — Story 3.2's wave module, reused verbatim, clipped to
15
+ * THIS vessel's own shape (never the wave/dish code itself changed)
16
+ * 4. specular strip — narrow near-white band, opacity 0.12
17
+ * 5. rim ellipses — darker stroke + lighter upper arc + optional crown
18
+ * ribbing
19
+ * 6. hardware — nozzles/manway/lugs/skirt/weld seams (`hardware.ts`)
20
+ * 7. contact shadow at the base
21
+ *
22
+ * Threshold wall markers + the alarm-band-colored liquid surface indicator
23
+ * (AC2) are additive, built alongside layer 3/on top of layer 6 — not one
24
+ * of the seven, but driven by the SAME per-frame level write so no second
25
+ * tween/mechanism is introduced.
26
+ *
27
+ * Bug 1 fix (adversarial review, post-3.3): the surface-alarm indicator is
28
+ * carried by whichever element is ACTUALLY the visible surface read for
29
+ * this medium, never a second competing one — restoring the exact
30
+ * suppression rule Story 3.2's own review fix established
31
+ * (`hasMediumSpecularParams = mediumStyle?.specular !== undefined`, see
32
+ * `tank-vertical`'s pre-3.3 history): when the resolved medium has ANY
33
+ * specular field (the wave module's own crest-only highlight,
34
+ * `.vscada-liquid-wave-specular`, built by `buildWaveLayer` in
35
+ * `liquid/wave-layer.ts`), that highlight IS the surface read, and it's
36
+ * recolored per alarm band in place — the plain `surfaceLine` is omitted
37
+ * entirely. Only media with no resolved specular params at all (no
38
+ * `medium` tokens registered, or a medium with no `specular` field — e.g.
39
+ * steam/flue-gas) fall back to the plain, always-alarm-colored
40
+ * `surfaceLine`. The two are mutually exclusive by construction — never
41
+ * both present for the same build.
42
+ */
43
+ export type VesselOrientation = 'vertical' | 'horizontal' | 'spherical';
44
+ export interface RimEllipse {
45
+ cx: number;
46
+ cy: number;
47
+ rx: number;
48
+ ry: number;
49
+ /** A handful of short radial tick lines near the ellipse's top arc — §7.2's "radial ribbing around the crown". */
50
+ crownRibbing?: boolean;
51
+ }
52
+ export interface VesselGeometry {
53
+ orientation: VesselOrientation;
54
+ /** The vessel's own silhouette — layers 1/2/4/5 (and the liquid clip, unless `liquidClipPathD` is given) are clipped/drawn to this. */
55
+ bodyPathD: string;
56
+ /** Defaults to `bodyPathD` — only silo's liquid clip (the straight cylindrical section, not the roofed outline) differs; see `shapes.ts`'s own doc. */
57
+ liquidClipPathD?: string;
58
+ /**
59
+ * Bug 2 fix — topmost Y (local element space, same units as `h`) a
60
+ * threshold wall marker may ever be drawn at. Defaults to `0` (no
61
+ * clamp): every vessel except silo has `liquidClipPathD` spanning the
62
+ * same y-range as `bodyPathD`, so a marker anywhere in `[0, h]` is
63
+ * always inside the actual silhouette. Silo's liquid clip plateaus at
64
+ * its roofline (`siloCylinderTop`) — without this clamp, a threshold
65
+ * above that fill-fraction draws its tick inside/above the conical
66
+ * roof, a region the liquid (and thus the marker it represents) can
67
+ * never actually reach.
68
+ */
69
+ markerMinY?: number;
70
+ rims: readonly RimEllipse[];
71
+ hardware: VesselHardwareVariant;
72
+ }
73
+ export interface BuildVesselOptions {
74
+ element: SceneElement;
75
+ theme: ThemeContext;
76
+ renderer: Renderer;
77
+ geometry: VesselGeometry;
78
+ }
79
+ /** Layer class names, in the exact §7.2 back-to-front order — the single source of truth `recipe.ts` builds against and `recipe.test.ts` asserts against. */
80
+ export declare const VESSEL_LAYER_CLASSES: readonly ["vscada-vessel-body-base", "vscada-vessel-shading", "vscada-vessel-liquid", "vscada-vessel-specular", "vscada-vessel-rim", "vscada-vessel-hardware", "vscada-vessel-shadow"];
81
+ export declare function buildVesselRecipe({ element, theme, renderer, geometry }: BuildVesselOptions): {
82
+ svg: SVGElement;
83
+ handles: HandleMap;
84
+ };
85
+ //# sourceMappingURL=recipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/vessel-body/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAuB,YAAY,EAAgB,MAAM,cAAc,CAAC;AAEjJ,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAa5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,kHAAkH;IAClH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,uIAAuI;IACvI,SAAS,EAAE,MAAM,CAAC;IAClB,uJAAuJ;IACvJ,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,6JAA6J;AAC7J,eAAO,MAAM,oBAAoB,wLAQvB,CAAC;AAiPX,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAqOrI"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Body-silhouette / liquid-clip geometry for the five Story 3.3 vessel
3
+ * shapes (tank-vertical's own dished-bottom head lives in `liquid/
4
+ * dished-bottom.ts` — Story 3.2 built it first and it's reused verbatim,
5
+ * not duplicated here). Pure path math, same convention as
6
+ * `dished-bottom.ts`: no DOM, independently unit-testable, called exactly
7
+ * once per element build (`recipe.ts` never regenerates a `d` per frame —
8
+ * AD-2).
9
+ *
10
+ * Every shape here reuses `DISH_WIDTH_RATIO` (§7.2's "ellipse ratio ~0.18 of
11
+ * width") as its own head/cap/roof proportion — one spec constant, five
12
+ * consumers, never five independently-tuned magic numbers.
13
+ */
14
+ /** Fraction of a hopper's total height given to the straight cylindrical section before the converging cone starts. */
15
+ export declare const HOPPER_CYLINDER_RATIO = 0.5;
16
+ /** Fraction of a hopper's width left open at the discharge throat (bottom). */
17
+ export declare const HOPPER_THROAT_RATIO = 0.18;
18
+ /** Fraction of a silo's total height given to the conical roof. */
19
+ export declare const SILO_ROOF_RATIO = 0.18;
20
+ /**
21
+ * tank-horizontal / drum body+liquid-clip: a "stadium"/capsule shape — a
22
+ * straight mid-section with elliptical end caps bulging outward left and
23
+ * right. The vertical-tank equivalent of `dishedBottomClipPathD` rotated
24
+ * 90°: there the round cross-section is horizontal (left-right), so its
25
+ * dish is a bottom-only cap; here the cylinder's AXIS is horizontal, so the
26
+ * round cross-section is vertical (top-bottom) and BOTH ends get a cap.
27
+ * `ry` is always the full half-height — a true semicircular-ish end, not a
28
+ * shallow dish — since a horizontal vessel's end head is seen near
29
+ * side-on, not foreshortened the way a vertical tank's top/bottom is.
30
+ */
31
+ export declare function capsulePathD(w: number, h: number, ratio?: number): string;
32
+ /** The capsule's own half-cap width, exposed so callers (rim placement) don't recompute/duplicate the clamp logic above. */
33
+ export declare function capsuleCapWidth(w: number, h: number, ratio?: number): number;
34
+ /**
35
+ * The sphere's actual inscribed-circle center/radius (diameter = min(w, h))
36
+ * — the SINGLE source of truth `spherePathD` builds its outline from.
37
+ * Bug 5 fix: `buildSpecular`'s spherical branch and tank-spherical's rim
38
+ * placement used to compute their own positions from `w`/`h` independently
39
+ * rather than calling this, so for a non-square element box (w !== h) the
40
+ * decorative glint/rim could land outside the visible circle (silently
41
+ * clipped away by the body clip-path). Every spherical-vessel consumer that
42
+ * needs "where is the circle" must call this, never re-derive `r`/center
43
+ * with its own math.
44
+ */
45
+ export declare function sphereGeometry(w: number, h: number): {
46
+ cx: number;
47
+ cy: number;
48
+ r: number;
49
+ };
50
+ /** tank-spherical body+liquid-clip: a plain circle inscribed in the element's box (diameter = min(w, h)) — no foreshortening, spec §7.2's own "spherical vessels use the same recipe" carve-out replaces banding with a radial highlight instead, not the outline itself. */
51
+ export declare function spherePathD(w: number, h: number): string;
52
+ /**
53
+ * hopper body+liquid-clip: a straight-sided cylindrical top section down to
54
+ * `HOPPER_CYLINDER_RATIO * h`, then a converging trapezoid down to a
55
+ * narrow discharge throat (`HOPPER_THROAT_RATIO * w` wide) at the very
56
+ * bottom. The SAME path is used for the liquid clip (Dev Notes: level
57
+ * maps LINEARLY to height in v1 — see the hopper primitive's own doc for
58
+ * why that's a documented simplification, not volume-accurate).
59
+ */
60
+ export declare function hopperPathD(w: number, h: number, cylinderRatio?: number, throatRatio?: number): string;
61
+ /** silo body outline: a tall straight cylinder with a triangular/conical roof. Bottom is flat (a real discharge cone, when drawn, is a `hardware` detail — see `hardware.ts` — not part of the outline). */
62
+ export declare function siloPathD(w: number, h: number, roofRatio?: number): string;
63
+ /** Y of the roofline / top of the straight cylindrical section — silo's liquid clip (see `siloLiquidClipPathD`) starts here, never inside the pointed roof. */
64
+ export declare function siloCylinderTop(h: number, roofRatio?: number): number;
65
+ /**
66
+ * silo liquid clip: a plain rect for JUST the straight cylindrical section
67
+ * (below the roofline) — deliberately NOT the same path as
68
+ * `siloPathD` (the one documented exception to "body path == liquid clip
69
+ * path" every other vessel here follows). A real silo's product never
70
+ * visibly fills into the pointed roof; clipping the liquid to the full
71
+ * roofed outline would let a near-full level narrow to a point at the top,
72
+ * which reads as wrong. The plain rect naturally plateaus the visible fill
73
+ * at the roofline for any level fraction whose unclipped top edge would
74
+ * otherwise land inside the roof — an acceptable v1 simplification (Dev
75
+ * Notes: "level maps linearly to height").
76
+ */
77
+ export declare function siloLiquidClipPathD(w: number, h: number, roofRatio?: number): string;
78
+ //# sourceMappingURL=shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../src/vessel-body/shapes.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,uHAAuH;AACvH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,mEAAmE;AACnE,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAyB,GAAG,MAAM,CAK3F;AAED,4HAA4H;AAC5H,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAyB,GAAG,MAAM,CAE9F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAE1F;AAED,6QAA6Q;AAC7Q,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,aAAa,GAAE,MAA8B,EAC7C,WAAW,GAAE,MAA4B,GACxC,MAAM,CAMR;AAED,4MAA4M;AAC5M,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAwB,GAAG,MAAM,CAG3F;AAED,+JAA+J;AAC/J,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAwB,GAAG,MAAM,CAEtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAwB,GAAG,MAAM,CAGrG"}
@@ -0,0 +1,33 @@
1
+ import { type VesselStory, type VesselStoryArgs, type VesselStoryMeta } from '../story-kit';
2
+ /** Story 3.3 Task 4 — same reference pattern as `tank-vertical.stories.ts`; see that file's doc. */
3
+ export declare const meta: VesselStoryMeta;
4
+ export declare const argTypes: {
5
+ readonly level: {
6
+ readonly control: {
7
+ readonly type: "range";
8
+ readonly min: 0;
9
+ readonly max: 100;
10
+ readonly step: 1;
11
+ };
12
+ };
13
+ readonly medium: {
14
+ readonly control: {
15
+ readonly type: "select";
16
+ };
17
+ readonly options: readonly ["water", "oil", "fuel-diesel", "slurry-sludge", "acid-chemical", "molten-hot", "condensate", "feedwater", "hydraulic-oil"];
18
+ };
19
+ readonly thresholdDemo: {
20
+ readonly control: "boolean";
21
+ };
22
+ readonly stale: {
23
+ readonly control: "boolean";
24
+ };
25
+ };
26
+ export declare const Default: VesselStory;
27
+ export declare const LevelSweep: VesselStory;
28
+ export declare const MediumSwitch: VesselStory;
29
+ export declare const ThresholdDemo: VesselStory;
30
+ export declare const StaleFreeze: VesselStory;
31
+ export declare function render(container: HTMLElement, args?: Partial<VesselStoryArgs>): import("../story-kit").MountedVesselStory;
32
+ export default meta;
33
+ //# sourceMappingURL=drum.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drum.stories.d.ts","sourceRoot":"","sources":["../../../src/vessels/drum/drum.stories.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEtI,oGAAoG;AACpG,eAAO,MAAM,IAAI,EAAE,eAKlB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;CAAyB,CAAC;AAE/C,eAAO,MAAM,OAAO,EAAE,WAAiC,CAAC;AACxD,eAAO,MAAM,UAAU,EAAE,WAA0D,CAAC;AACpF,eAAO,MAAM,YAAY,EAAE,WAAoF,CAAC;AAChH,eAAO,MAAM,aAAa,EAAE,WAAyF,CAAC;AACtH,eAAO,MAAM,WAAW,EAAE,WAA0E,CAAC;AAErG,wBAAgB,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,GAAE,OAAO,CAAC,eAAe,CAAM,6CAEjF;AAED,eAAe,IAAI,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PrimitiveGroup } from '@vscada/core';
2
+ export declare const drum: PrimitiveGroup;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vessels/drum/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAyD,MAAM,cAAc,CAAC;AAkCrH,eAAO,MAAM,IAAI,EAAE,cAGjB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type VesselStory, type VesselStoryArgs, type VesselStoryMeta } from '../story-kit';
2
+ /**
3
+ * Story 3.3 Task 4 — same reference pattern as `tank-vertical.stories.ts`;
4
+ * see that file's doc. The level sweep here also doubles as a demonstration
5
+ * of the documented v1 simplification (`hopper/index.ts`'s own doc): watch
6
+ * the fill visibly narrow through the funnel as the level drops — the
7
+ * PIXEL-height mapping is linear, not the true (smaller) volume fraction.
8
+ */
9
+ export declare const meta: VesselStoryMeta;
10
+ export declare const argTypes: {
11
+ readonly level: {
12
+ readonly control: {
13
+ readonly type: "range";
14
+ readonly min: 0;
15
+ readonly max: 100;
16
+ readonly step: 1;
17
+ };
18
+ };
19
+ readonly medium: {
20
+ readonly control: {
21
+ readonly type: "select";
22
+ };
23
+ readonly options: readonly ["water", "oil", "fuel-diesel", "slurry-sludge", "acid-chemical", "molten-hot", "condensate", "feedwater", "hydraulic-oil"];
24
+ };
25
+ readonly thresholdDemo: {
26
+ readonly control: "boolean";
27
+ };
28
+ readonly stale: {
29
+ readonly control: "boolean";
30
+ };
31
+ };
32
+ export declare const Default: VesselStory;
33
+ export declare const LevelSweep: VesselStory;
34
+ export declare const MediumSwitch: VesselStory;
35
+ export declare const ThresholdDemo: VesselStory;
36
+ export declare const StaleFreeze: VesselStory;
37
+ export declare function render(container: HTMLElement, args?: Partial<VesselStoryArgs>): import("../story-kit").MountedVesselStory;
38
+ export default meta;
39
+ //# sourceMappingURL=hopper.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hopper.stories.d.ts","sourceRoot":"","sources":["../../../src/vessels/hopper/hopper.stories.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEtI;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,eAKlB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;CAAyB,CAAC;AAE/C,eAAO,MAAM,OAAO,EAAE,WAAiC,CAAC;AACxD,eAAO,MAAM,UAAU,EAAE,WAA0D,CAAC;AACpF,eAAO,MAAM,YAAY,EAAE,WAA0F,CAAC;AACtH,eAAO,MAAM,aAAa,EAAE,WAAwF,CAAC;AACrH,eAAO,MAAM,WAAW,EAAE,WAA0E,CAAC;AAErG,wBAAgB,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,GAAE,OAAO,CAAC,eAAe,CAAM,6CAEjF;AAED,eAAe,IAAI,CAAC"}