@oicl/openbridge-webcomponents 0.0.7 → 0.0.8

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 (273) hide show
  1. package/.storybook/main.ts +2 -0
  2. package/.storybook/preview.ts +11 -0
  3. package/.vscode/launch.json +16 -0
  4. package/README.md +8 -0
  5. package/__snapshots__/alert-icon--primary.png +0 -0
  6. package/__snapshots__/application-alert-button--notification.png +0 -0
  7. package/__snapshots__/application-alert-button--running.png +0 -0
  8. package/__snapshots__/application-notification-message--large-single-message.png +0 -0
  9. package/__snapshots__/application-notification-message--large.png +0 -0
  10. package/__snapshots__/application-notification-message--primary.png +0 -0
  11. package/__snapshots__/button-rich-button--bottom-with-boarder.png +0 -0
  12. package/__snapshots__/button-rich-button--bottom.png +0 -0
  13. package/__snapshots__/button-rich-button--center.png +0 -0
  14. package/__snapshots__/button-rich-button--double-line.png +0 -0
  15. package/__snapshots__/button-rich-button--multi-line.png +0 -0
  16. package/__snapshots__/button-rich-button--regular-no-icons.png +0 -0
  17. package/__snapshots__/button-rich-button--regular.png +0 -0
  18. package/__snapshots__/button-rich-button--single-line.png +0 -0
  19. package/__snapshots__/button-rich-button--top-with-boarder.png +0 -0
  20. package/__snapshots__/button-rich-button--top.png +0 -0
  21. package/__snapshots__/button-rich-button--with-graphic-border.png +0 -0
  22. package/__snapshots__/button-rich-button--with-graphic.png +0 -0
  23. package/__snapshots__/button-rich-button--with-status.png +0 -0
  24. package/__snapshots__/button-vendor-button--primary.png +0 -0
  25. package/__snapshots__/icons-icon--list.png +0 -0
  26. package/__snapshots__/icons-icon--use-font-color.png +0 -0
  27. package/custom-elements.json +2331 -745
  28. package/dist/components/alert-button/alert-button.css.js +4 -12
  29. package/dist/components/alert-button/alert-button.css.js.map +1 -1
  30. package/dist/components/alert-button/alert-button.d.ts +11 -1
  31. package/dist/components/alert-button/alert-button.d.ts.map +1 -1
  32. package/dist/components/alert-button/alert-button.js +21 -1
  33. package/dist/components/alert-button/alert-button.js.map +1 -1
  34. package/dist/components/alert-icon/alert-icon.d.ts +36 -0
  35. package/dist/components/alert-icon/alert-icon.d.ts.map +1 -0
  36. package/dist/components/alert-icon/alert-icon.js +84 -0
  37. package/dist/components/alert-icon/alert-icon.js.map +1 -0
  38. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-a.d.ts +2 -0
  39. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-a.d.ts.map +1 -0
  40. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-a.js +13 -0
  41. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-a.js.map +1 -0
  42. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-b.d.ts +2 -0
  43. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-b.d.ts.map +1 -0
  44. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-b.js +20 -0
  45. package/dist/components/alert-icon/icons/icon-14-alarm-silenced-b.js.map +1 -0
  46. package/dist/components/alert-icon/icons/icon-14-alarm-unack-a.d.ts +2 -0
  47. package/dist/components/alert-icon/icons/icon-14-alarm-unack-a.d.ts.map +1 -0
  48. package/dist/components/alert-icon/icons/icon-14-alarm-unack-a.js +12 -0
  49. package/dist/components/alert-icon/icons/icon-14-alarm-unack-a.js.map +1 -0
  50. package/dist/components/alert-icon/icons/icon-14-alarm-unack-b.d.ts +2 -0
  51. package/dist/components/alert-icon/icons/icon-14-alarm-unack-b.d.ts.map +1 -0
  52. package/dist/components/alert-icon/icons/icon-14-alarm-unack-b.js +19 -0
  53. package/dist/components/alert-icon/icons/icon-14-alarm-unack-b.js.map +1 -0
  54. package/dist/components/alert-icon/icons/icon-14-warning-unack-a.d.ts +2 -0
  55. package/dist/components/alert-icon/icons/icon-14-warning-unack-a.d.ts.map +1 -0
  56. package/dist/components/alert-icon/icons/icon-14-warning-unack-a.js +12 -0
  57. package/dist/components/alert-icon/icons/icon-14-warning-unack-a.js.map +1 -0
  58. package/dist/components/alert-icon/icons/icon-14-warning-unack-b.d.ts +2 -0
  59. package/dist/components/alert-icon/icons/icon-14-warning-unack-b.d.ts.map +1 -0
  60. package/dist/components/alert-icon/icons/icon-14-warning-unack-b.js +12 -0
  61. package/dist/components/alert-icon/icons/icon-14-warning-unack-b.js.map +1 -0
  62. package/dist/components/alert-topbar-element/alert-topbar-element.d.ts +13 -0
  63. package/dist/components/alert-topbar-element/alert-topbar-element.d.ts.map +1 -1
  64. package/dist/components/alert-topbar-element/alert-topbar-element.js +10 -0
  65. package/dist/components/alert-topbar-element/alert-topbar-element.js.map +1 -1
  66. package/dist/components/rich-button/rich-button.css.js +182 -0
  67. package/dist/components/rich-button/rich-button.css.js.map +1 -0
  68. package/dist/components/rich-button/rich-button.d.ts +32 -0
  69. package/dist/components/rich-button/rich-button.d.ts.map +1 -0
  70. package/dist/components/rich-button/rich-button.js +113 -0
  71. package/dist/components/rich-button/rich-button.js.map +1 -0
  72. package/dist/components/vendor-button/vendor-button.css.js +48 -0
  73. package/dist/components/vendor-button/vendor-button.css.js.map +1 -0
  74. package/dist/components/vendor-button/vendor-button.d.ts +13 -0
  75. package/dist/components/vendor-button/vendor-button.d.ts.map +1 -0
  76. package/dist/components/vendor-button/vendor-button.js +42 -0
  77. package/dist/components/vendor-button/vendor-button.js.map +1 -0
  78. package/dist/icons/{icon-07-target-radar.d.ts → icon-01-content-copy.d.ts} +3 -3
  79. package/dist/icons/{icon-07-target-radar.d.ts.map → icon-01-content-copy.d.ts.map} +1 -1
  80. package/dist/icons/{icon-07-target-radar.js → icon-01-content-copy.js} +10 -10
  81. package/dist/icons/icon-01-content-copy.js.map +1 -0
  82. package/dist/icons/{icon-07-target-ias-selected.d.ts → icon-01-content-cut.d.ts} +3 -3
  83. package/dist/icons/icon-01-content-cut.d.ts.map +1 -0
  84. package/dist/icons/icon-01-content-cut.js +52 -0
  85. package/dist/icons/icon-01-content-cut.js.map +1 -0
  86. package/dist/icons/{icon-07-target-radar-selected.d.ts → icon-01-content-paste.d.ts} +3 -3
  87. package/dist/icons/icon-01-content-paste.d.ts.map +1 -0
  88. package/dist/icons/icon-01-content-paste.js +52 -0
  89. package/dist/icons/icon-01-content-paste.js.map +1 -0
  90. package/dist/icons/icon-02-dock-bottom.d.ts +14 -0
  91. package/dist/icons/icon-02-dock-bottom.d.ts.map +1 -0
  92. package/dist/icons/icon-02-dock-bottom.js +52 -0
  93. package/dist/icons/icon-02-dock-bottom.js.map +1 -0
  94. package/dist/icons/{icon-07-target-ias.d.ts → icon-02-dock-left.d.ts} +3 -3
  95. package/dist/icons/icon-02-dock-left.d.ts.map +1 -0
  96. package/dist/icons/{icon-07-target-ias.js → icon-02-dock-left.js} +10 -24
  97. package/dist/icons/icon-02-dock-left.js.map +1 -0
  98. package/dist/icons/icon-02-dock-right.d.ts +14 -0
  99. package/dist/icons/icon-02-dock-right.d.ts.map +1 -0
  100. package/dist/icons/icon-02-dock-right.js +52 -0
  101. package/dist/icons/icon-02-dock-right.js.map +1 -0
  102. package/dist/icons/icon-03-license.d.ts +14 -0
  103. package/dist/icons/icon-03-license.d.ts.map +1 -0
  104. package/dist/icons/icon-03-license.js +52 -0
  105. package/dist/icons/icon-03-license.js.map +1 -0
  106. package/dist/icons/icon-03-star-unchecked.js +1 -1
  107. package/dist/icons/icon-03-star-unchecked.js.map +1 -1
  108. package/dist/icons/icon-04-colorcalibrated.d.ts.map +1 -1
  109. package/dist/icons/icon-04-colorcalibrated.js +2 -14
  110. package/dist/icons/icon-04-colorcalibrated.js.map +1 -1
  111. package/dist/icons/icon-07-target-associated-ais-camera.d.ts +14 -0
  112. package/dist/icons/icon-07-target-associated-ais-camera.d.ts.map +1 -0
  113. package/dist/icons/icon-07-target-associated-ais-camera.js +54 -0
  114. package/dist/icons/icon-07-target-associated-ais-camera.js.map +1 -0
  115. package/dist/icons/icon-07-target-associated-camera-radar.d.ts +14 -0
  116. package/dist/icons/icon-07-target-associated-camera-radar.d.ts.map +1 -0
  117. package/dist/icons/icon-07-target-associated-camera-radar.js +52 -0
  118. package/dist/icons/icon-07-target-associated-camera-radar.js.map +1 -0
  119. package/dist/icons/icon-07-target-associated-radar-camera.d.ts +14 -0
  120. package/dist/icons/icon-07-target-associated-radar-camera.d.ts.map +1 -0
  121. package/dist/icons/icon-07-target-associated-radar-camera.js +54 -0
  122. package/dist/icons/icon-07-target-associated-radar-camera.js.map +1 -0
  123. package/dist/icons/icon-07-target-camera.d.ts +14 -0
  124. package/dist/icons/icon-07-target-camera.d.ts.map +1 -0
  125. package/dist/icons/icon-07-target-camera.js +52 -0
  126. package/dist/icons/icon-07-target-camera.js.map +1 -0
  127. package/dist/icons/icon-08-backward-fast.js +1 -1
  128. package/dist/icons/icon-08-backward-fast.js.map +1 -1
  129. package/dist/icons/icon-08-backward-stopped.js +1 -1
  130. package/dist/icons/icon-08-backward-stopped.js.map +1 -1
  131. package/dist/icons/icon-08-forward-fast.js +1 -1
  132. package/dist/icons/icon-08-forward-fast.js.map +1 -1
  133. package/dist/icons/icon-08-forward-stopped.js +1 -1
  134. package/dist/icons/icon-08-forward-stopped.js.map +1 -1
  135. package/dist/icons/icon-08-motor-off-horisontal.js +1 -1
  136. package/dist/icons/icon-08-motor-off-horisontal.js.map +1 -1
  137. package/dist/icons/icon-09-switch-horizontal-off-large.js +1 -1
  138. package/dist/icons/icon-09-switch-horizontal-off-large.js.map +1 -1
  139. package/dist/icons/icon-09-switch-horizontal-off.js +1 -1
  140. package/dist/icons/icon-09-switch-horizontal-off.js.map +1 -1
  141. package/dist/icons/icon-10-autonomous.js +3 -3
  142. package/dist/icons/icon-10-autonomous.js.map +1 -1
  143. package/dist/icons/icon-14-alert-rectified.js +1 -1
  144. package/dist/icons/icon-14-alert-rectified.js.map +1 -1
  145. package/dist/icons/icon-14-alertheader-aggregated-large.d.ts +14 -0
  146. package/dist/icons/icon-14-alertheader-aggregated-large.d.ts.map +1 -0
  147. package/dist/icons/icon-14-alertheader-aggregated-large.js +52 -0
  148. package/dist/icons/icon-14-alertheader-aggregated-large.js.map +1 -0
  149. package/dist/icons/icon-14-alertheader-group-large.d.ts +14 -0
  150. package/dist/icons/icon-14-alertheader-group-large.d.ts.map +1 -0
  151. package/dist/icons/icon-14-alertheader-group-large.js +54 -0
  152. package/dist/icons/icon-14-alertheader-group-large.js.map +1 -0
  153. package/dist/icons/icon-14-exclamationmark.js +4 -4
  154. package/dist/icons/icon-14-exclamationmark.js.map +1 -1
  155. package/dist/icons/icon-14-rectified.js +1 -1
  156. package/dist/icons/icon-14-rectified.js.map +1 -1
  157. package/dist/icons/icon-18-ais-anchored.js +4 -4
  158. package/dist/icons/icon-18-ais-anchored.js.map +1 -1
  159. package/dist/icons/icon-18-ais-notunderway.js +1 -1
  160. package/dist/icons/icon-18-ais-notunderway.js.map +1 -1
  161. package/dist/icons/icon-iec-02-ais-target-activated-selected.d.ts +14 -0
  162. package/dist/icons/icon-iec-02-ais-target-activated-selected.d.ts.map +1 -0
  163. package/dist/icons/icon-iec-02-ais-target-activated-selected.js +52 -0
  164. package/dist/icons/icon-iec-02-ais-target-activated-selected.js.map +1 -0
  165. package/dist/icons/icon-iec-02-ais-target-activated.d.ts +14 -0
  166. package/dist/icons/icon-iec-02-ais-target-activated.d.ts.map +1 -0
  167. package/dist/icons/icon-iec-02-ais-target-activated.js +52 -0
  168. package/dist/icons/icon-iec-02-ais-target-activated.js.map +1 -0
  169. package/dist/icons/icon-iec-02-associated-target-ais.d.ts +14 -0
  170. package/dist/icons/icon-iec-02-associated-target-ais.d.ts.map +1 -0
  171. package/dist/icons/icon-iec-02-associated-target-ais.js +52 -0
  172. package/dist/icons/icon-iec-02-associated-target-ais.js.map +1 -0
  173. package/dist/icons/icon-iec-02-associated-target-radar.d.ts +14 -0
  174. package/dist/icons/icon-iec-02-associated-target-radar.d.ts.map +1 -0
  175. package/dist/icons/icon-iec-02-associated-target-radar.js +52 -0
  176. package/dist/icons/icon-iec-02-associated-target-radar.js.map +1 -0
  177. package/dist/icons/icon-iec-02-radar-target-tracked-selected.d.ts +14 -0
  178. package/dist/icons/icon-iec-02-radar-target-tracked-selected.d.ts.map +1 -0
  179. package/dist/icons/icon-iec-02-radar-target-tracked-selected.js +60 -0
  180. package/dist/icons/icon-iec-02-radar-target-tracked-selected.js.map +1 -0
  181. package/dist/icons/icon-iec-02-radar-target-tracked.d.ts +14 -0
  182. package/dist/icons/icon-iec-02-radar-target-tracked.d.ts.map +1 -0
  183. package/dist/icons/icon-iec-02-radar-target-tracked.js +52 -0
  184. package/dist/icons/icon-iec-02-radar-target-tracked.js.map +1 -0
  185. package/dist/icons/index.d.ts +19 -4
  186. package/dist/icons/index.d.ts.map +1 -1
  187. package/dist/icons/index.js +19 -4
  188. package/dist/icons/index.js.map +1 -1
  189. package/dist/icons/names.d.ts.map +1 -1
  190. package/dist/icons/names.js +19 -4
  191. package/dist/icons/names.js.map +1 -1
  192. package/dist/navigation-instruments/thruster/thruster.d.ts +2 -1
  193. package/dist/navigation-instruments/thruster/thruster.d.ts.map +1 -1
  194. package/dist/navigation-instruments/thruster/thruster.js +45 -25
  195. package/dist/navigation-instruments/thruster/thruster.js.map +1 -1
  196. package/fix-generated.cjs +3 -0
  197. package/new-component.ts +7 -8
  198. package/package.json +5 -1
  199. package/script/convert-icons.ts +177 -0
  200. package/script/download-alert-icons.ts +180 -0
  201. package/script/download-icons.ts +7 -141
  202. package/src/components/alert-button/alert-button.css +1 -12
  203. package/src/components/alert-button/alert-button.stories.ts +2 -0
  204. package/src/components/alert-button/alert-button.ts +29 -4
  205. package/src/components/alert-icon/alert-icon.stories.ts +35 -0
  206. package/src/components/alert-icon/alert-icon.ts +75 -0
  207. package/src/components/alert-icon/icons/icon-14-alarm-silenced-a.ts +9 -0
  208. package/src/components/alert-icon/icons/icon-14-alarm-silenced-b.ts +16 -0
  209. package/src/components/alert-icon/icons/icon-14-alarm-unack-a.ts +8 -0
  210. package/src/components/alert-icon/icons/icon-14-alarm-unack-b.ts +15 -0
  211. package/src/components/alert-icon/icons/icon-14-warning-unack-a.ts +8 -0
  212. package/src/components/alert-icon/icons/icon-14-warning-unack-b.ts +8 -0
  213. package/src/components/alert-topbar-element/alert-topbar-element.stories.ts +4 -0
  214. package/src/components/alert-topbar-element/alert-topbar-element.ts +17 -0
  215. package/src/components/notification-message/notification-message.stories.ts +26 -10
  216. package/src/components/rich-button/rich-button.css +118 -0
  217. package/src/components/rich-button/rich-button.stories.ts +196 -0
  218. package/src/components/rich-button/rich-button.ts +95 -0
  219. package/src/components/vendor-button/vendor-button.css +10 -0
  220. package/src/components/vendor-button/vendor-button.stories.ts +19 -0
  221. package/src/components/vendor-button/vendor-button.ts +25 -0
  222. package/src/icons/icon-01-content-copy.ts +40 -0
  223. package/src/icons/icon-01-content-cut.ts +40 -0
  224. package/src/icons/icon-01-content-paste.ts +40 -0
  225. package/src/icons/icon-02-dock-bottom.ts +40 -0
  226. package/src/icons/icon-02-dock-left.ts +40 -0
  227. package/src/icons/icon-02-dock-right.ts +40 -0
  228. package/src/icons/icon-03-license.ts +40 -0
  229. package/src/icons/icon-03-star-unchecked.ts +1 -1
  230. package/src/icons/icon-04-colorcalibrated.ts +2 -14
  231. package/src/icons/icon-07-target-associated-ais-camera.ts +42 -0
  232. package/src/icons/icon-07-target-associated-camera-radar.ts +40 -0
  233. package/src/icons/icon-07-target-associated-radar-camera.ts +42 -0
  234. package/src/icons/icon-07-target-camera.ts +40 -0
  235. package/src/icons/icon-08-backward-fast.ts +1 -1
  236. package/src/icons/icon-08-backward-stopped.ts +1 -1
  237. package/src/icons/icon-08-forward-fast.ts +1 -1
  238. package/src/icons/icon-08-forward-stopped.ts +1 -1
  239. package/src/icons/icon-08-motor-off-horisontal.ts +1 -1
  240. package/src/icons/icon-09-switch-horizontal-off-large.ts +1 -1
  241. package/src/icons/icon-09-switch-horizontal-off.ts +1 -1
  242. package/src/icons/icon-10-autonomous.ts +3 -3
  243. package/src/icons/icon-14-alert-rectified.ts +1 -1
  244. package/src/icons/icon-14-alertheader-aggregated-large.ts +40 -0
  245. package/src/icons/icon-14-alertheader-group-large.ts +42 -0
  246. package/src/icons/icon-14-exclamationmark.ts +4 -4
  247. package/src/icons/icon-14-rectified.ts +1 -1
  248. package/src/icons/icon-18-ais-anchored.ts +4 -4
  249. package/src/icons/icon-18-ais-notunderway.ts +1 -1
  250. package/src/icons/icon-iec-02-ais-target-activated-selected.ts +40 -0
  251. package/src/icons/icon-iec-02-ais-target-activated.ts +40 -0
  252. package/src/icons/icon-iec-02-associated-target-ais.ts +40 -0
  253. package/src/icons/icon-iec-02-associated-target-radar.ts +40 -0
  254. package/src/icons/icon-iec-02-radar-target-tracked-selected.ts +48 -0
  255. package/src/icons/icon-iec-02-radar-target-tracked.ts +40 -0
  256. package/src/icons/index.ts +19 -4
  257. package/src/icons/names.ts +19 -4
  258. package/src/icons.stories.ts +78 -0
  259. package/src/navigation-instruments/thruster/thruster.stories.ts +18 -1
  260. package/src/navigation-instruments/thruster/thruster.ts +43 -27
  261. package/dist/icons/icon-07-target-ias-selected.d.ts.map +0 -1
  262. package/dist/icons/icon-07-target-ias-selected.js +0 -60
  263. package/dist/icons/icon-07-target-ias-selected.js.map +0 -1
  264. package/dist/icons/icon-07-target-ias.d.ts.map +0 -1
  265. package/dist/icons/icon-07-target-ias.js.map +0 -1
  266. package/dist/icons/icon-07-target-radar-selected.d.ts.map +0 -1
  267. package/dist/icons/icon-07-target-radar-selected.js +0 -60
  268. package/dist/icons/icon-07-target-radar-selected.js.map +0 -1
  269. package/dist/icons/icon-07-target-radar.js.map +0 -1
  270. package/src/icons/icon-07-target-ias-selected.ts +0 -48
  271. package/src/icons/icon-07-target-ias.ts +0 -54
  272. package/src/icons/icon-07-target-radar-selected.ts +0 -48
  273. package/src/icons/icon-07-target-radar.ts +0 -40
@@ -1,4 +1,4 @@
1
- import { LitElement, svg } from "lit";
1
+ import { css, LitElement, html, svg } from "lit";
2
2
  import { property, customElement } from "lit/decorators.js";
3
3
  import { Size, InstrumentState } from "../types.js";
4
4
  var __defProp = Object.defineProperty;
@@ -25,13 +25,26 @@ let ObcThruster = class extends LitElement {
25
25
  this.off = false;
26
26
  }
27
27
  render() {
28
- return thruster(this.thrust, this.setpoint, this.state, {
28
+ return html`<div class="container">
29
+ ${thruster(this.thrust, this.setpoint, this.state, {
29
30
  atSetpoint: this.atSetpoint,
30
31
  tunnel: this.tunnel,
31
32
  setpointAtZero: this.setpointAtZero
32
- });
33
+ })}
34
+ </div>`;
33
35
  }
34
36
  };
37
+ ObcThruster.styles = css`
38
+ .container {
39
+ height: 100%;
40
+ width: 100%;
41
+ }
42
+
43
+ .container > svg {
44
+ height: 100%;
45
+ width: 100%;
46
+ }
47
+ `;
35
48
  __decorateClass([
36
49
  property({ type: String })
37
50
  ], ObcThruster.prototype, "size", 2);
@@ -150,35 +163,42 @@ function thruster(thrust, setpoint, state, options) {
150
163
  const centerLine = svg`
151
164
  <rect x="-32" y="-2" width="64" height="4" fill=${zeroLineColor} stroke=${zeroLineColor}/>
152
165
  `;
153
- const thrusterSvg = svg`
154
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="-64 -160 128 320" x="-64" y="-160" width="128" height="320">
155
- ${thrusterTop(
156
- Math.max(thrust, 0),
157
- { box: boxColor, container: containerBackgroundColor },
158
- hideTicks
159
- )}
160
- ${thrusterBottom(
161
- Math.max(-thrust, 0),
162
- { box: boxColor, container: containerBackgroundColor },
163
- hideTicks
164
- )}
165
- ${centerLine}
166
- ${setpoint !== void 0 ? setpointSvg(setpoint, options.setpointAtZero, {
167
- fill: setPointColor,
168
- stroke: "var(--border-silhouette-color)"
169
- }) : null}
170
- ${options.tunnel ? null : arrowTop(arrowColor)}
171
- </svg>
172
- `;
166
+ const thrusterSvg = [
167
+ thrusterTop(
168
+ Math.max(thrust, 0),
169
+ { box: boxColor, container: containerBackgroundColor },
170
+ hideTicks
171
+ ),
172
+ thrusterBottom(
173
+ Math.max(-thrust, 0),
174
+ { box: boxColor, container: containerBackgroundColor },
175
+ hideTicks
176
+ ),
177
+ centerLine
178
+ ];
179
+ if (setpoint !== void 0) {
180
+ thrusterSvg.push(
181
+ setpointSvg(setpoint, options.setpointAtZero, {
182
+ fill: setPointColor,
183
+ stroke: "var(--border-silhouette-color)"
184
+ })
185
+ );
186
+ }
173
187
  if (options.tunnel) {
174
188
  return svg`
175
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="-160 -64 320 128" x="-160" y="-64" width="320" height="128">
189
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-160 -64 320 128" x="-160" y="-64">
176
190
  <g transform="rotate(90)">
177
191
  ${thrusterSvg}
178
192
  </g>
179
193
  </svg>`;
194
+ } else {
195
+ thrusterSvg.push(arrowTop(arrowColor));
196
+ return svg`
197
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-64 -160 128 320" x="-64" y="-160">
198
+ ${thrusterSvg}
199
+ </svg>
200
+ `;
180
201
  }
181
- return thrusterSvg;
182
202
  }
183
203
  export {
184
204
  ObcThruster,
@@ -1 +1 @@
1
- {"version":3,"file":"thruster.js","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"sourcesContent":["import {LitElement, svg} from 'lit';\nimport {customElement, property} from 'lit/decorators.js';\nimport {Size, InstrumentState} from '../types';\n\n/**\n * @element obc-thruster\n *\n * @prop {Size} size - The size of the thruster\n * @prop {number} thrust - The thrust of the thruster in percent (-100 - +100)\n */\n@customElement('obc-thruster')\nexport class ObcThruster extends LitElement {\n @property({type: String}) size: Size = Size.medium;\n @property({type: Number}) thrust: number = 0;\n @property({type: Number}) setpoint: number | undefined;\n @property({type: Boolean, attribute: 'at-setpoint'}) atSetpoint: boolean =\n false;\n @property({type: Boolean, attribute: 'setpoint-at-zero'})\n setpointAtZero: boolean = false;\n @property({type: String}) state: InstrumentState = InstrumentState.inCommand;\n @property({type: Boolean}) tunnel: boolean = false;\n @property({type: Boolean}) loading: boolean = false;\n @property({type: Boolean}) off: boolean = false;\n\n override render() {\n return thruster(this.thrust, this.setpoint, this.state, {\n atSetpoint: this.atSetpoint,\n tunnel: this.tunnel,\n setpointAtZero: this.setpointAtZero,\n });\n }\n}\nconst containerHeight = 134;\n\nfunction thrusterTop(\n value: number,\n colors: {box: string; container: string},\n hideTicks: boolean\n) {\n const container = svg`\n <path transform=\"translate(-33 -137)\" d=\"M1 9C1 4.58172 4.58172 1 9 1H57C61.4183 1 65 4.58172 65 9V135H1V9Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n const track = svg`<rect width=\"32\" height=\"134\" x=\"-16\" y=\"-136\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>`;\n\n const tickmarks = [];\n\n const nTicks = 4;\n const delta = containerHeight / nTicks;\n if (!hideTicks) {\n for (let i = 1; i < nTicks; i++) {\n tickmarks.push(\n svg`<line x1=\"-20\" x2=\"-28\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n tickmarks.push(\n svg`<line x1=\"20\" x2=\"28\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n }\n }\n\n const barHeight = (134 * value) / 100;\n const barY = -136 + 134 - barHeight;\n const bar = svg`<rect width=\"32\" height=${barHeight} x=\"-16\" y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n\n return [container, track, tickmarks, bar];\n}\n\nfunction thrusterBottom(\n value: number,\n colors: {box: string; container: string},\n hideTicks: boolean\n) {\n const container = svg`\n <g transform=\"rotate(180)\">\n ${thrusterTop(value, colors, hideTicks)}\n </g>\n `;\n return container;\n}\n\nfunction arrowTop(arrowColor: string) {\n return svg`\n<path transform=\"translate(-15 -156)\" d=\"M0.707007 14.2929L14.9999 0L29.2928 14.2929C29.9228 14.9229 29.4766 16 28.5857 16H1.41412C0.523211 16 0.0770419 14.9229 0.707007 14.2929Z\" fill=${arrowColor}/>`;\n}\n\nfunction setpointSvg(\n value: number,\n setpointAtZero: boolean,\n colors: {fill: string; stroke: string}\n) {\n const y =\n -12 +\n -(setpointAtZero\n ? 0\n : Math.sign(value) * ((containerHeight * Math.abs(value)) / 100 + 2));\n return svg`\n <g transform=\"translate(-40 ${y})\">\n <path d=\"M59.4001 11.1999C59.1483 11.3887 59 11.6852 59 12C59 12.3148 59.1483 12.6113 59.4001 12.8001L72.2001 22.3966C74.1773 23.879 77 22.4692 77 19.9971L77 4.0029C77 1.53076 74.1773 0.121035 72.2001 1.60338L59.4001 11.1999Z\" fill=${colors.fill} stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n <path d=\"M20.5999 12.8001C20.8517 12.6113 21 12.3148 21 12C21 11.6852 20.8517 11.3887 20.5999 11.1999L7.79986 1.60338C5.82268 0.121036 3 1.53075 3 4.0029L3 19.9971C3 22.4692 5.82268 23.879 7.79986 22.3966L20.5999 12.8001Z\" fill=${colors.fill} stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n </g>\n`;\n}\n\nexport function thruster(\n thrust: number,\n setpoint: number | undefined,\n state: InstrumentState,\n options: {atSetpoint: boolean; tunnel: boolean; setpointAtZero: boolean}\n) {\n let boxColor = 'var(--instrument-enhanced-secondary-color)';\n let setPointColor = boxColor;\n let arrowColor = 'var(--instrument-tick-mark-primary-color)';\n let containerBackgroundColor = 'var(--instrument-frame-primary-color)';\n let zeroLineColor = 'var(--instrument-enhanced-secondary-color)';\n let hideTicks = false;\n if (options.atSetpoint) {\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n }\n if (state === InstrumentState.active) {\n boxColor = 'var(--instrument-regular-secondary-color)';\n zeroLineColor = 'var(--instrument-regular-secondary-color)';\n setPointColor = boxColor;\n arrowColor = 'var(--instrument-regular-secondary-color)';\n if (options.atSetpoint) {\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n }\n } else if (state === InstrumentState.loading) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-regular-secondary-color)';\n thrust = 0;\n hideTicks = true;\n if (setpoint !== undefined) {\n setpoint = 0;\n }\n } else if (state === InstrumentState.off) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n thrust = 0;\n hideTicks = true;\n containerBackgroundColor = 'transparent';\n if (setpoint !== undefined) {\n setpoint = 0;\n }\n }\n\n const centerLine = svg`\n <rect x=\"-32\" y=\"-2\" width=\"64\" height=\"4\" fill=${zeroLineColor} stroke=${zeroLineColor}/>\n `;\n\n const thrusterSvg = svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-64 -160 128 320\" x=\"-64\" y=\"-160\" width=\"128\" height=\"320\">\n ${thrusterTop(\n Math.max(thrust, 0),\n {box: boxColor, container: containerBackgroundColor},\n hideTicks\n )}\n ${thrusterBottom(\n Math.max(-thrust, 0),\n {box: boxColor, container: containerBackgroundColor},\n hideTicks\n )}\n ${centerLine}\n ${\n setpoint !== undefined\n ? setpointSvg(setpoint, options.setpointAtZero, {\n fill: setPointColor,\n stroke: 'var(--border-silhouette-color)',\n })\n : null\n }\n ${options.tunnel ? null : arrowTop(arrowColor)}\n </svg>\n `;\n\n if (options.tunnel) {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-160 -64 320 128\" x=\"-160\" y=\"-64\" width=\"320\" height=\"128\">\n <g transform=\"rotate(90)\">\n ${thrusterSvg}\n </g>\n </svg>`;\n }\n\n return thrusterSvg;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-thruster': ObcThruster;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAWa,IAAA,cAAN,cAA0B,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AACqB,SAAA,OAAa,KAAK;AACD,SAAA,SAAA;AAGzC,SAAA,aAAA;AAEwB,SAAA,iBAAA;AACA,SAAA,QAAyB,gBAAgB;AACtB,SAAA,SAAA;AACC,SAAA,UAAA;AACJ,SAAA,MAAA;AAAA,EAAA;AAAA,EAEjC,SAAS;AAChB,WAAO,SAAS,KAAK,QAAQ,KAAK,UAAU,KAAK,OAAO;AAAA,MACtD,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK;AAAA,IAAA,CACtB;AAAA,EACH;AACF;AAnB4B,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,QAAO;AAAA,GADb,YACe,WAAA,QAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,QAAO;AAAA,GAFb,YAEe,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,QAAO;AAAA,GAHb,YAGe,WAAA,YAAA,CAAA;AAC2B,gBAAA;AAAA,EAApD,SAAS,EAAC,MAAM,SAAS,WAAW,eAAc;AAAA,GAJxC,YAI0C,WAAA,cAAA,CAAA;AAGrD,gBAAA;AAAA,EADC,SAAS,EAAC,MAAM,SAAS,WAAW,oBAAmB;AAAA,GAN7C,YAOX,WAAA,kBAAA,CAAA;AAC0B,gBAAA;AAAA,EAAzB,SAAS,EAAC,MAAM,QAAO;AAAA,GARb,YAQe,WAAA,SAAA,CAAA;AACC,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,SAAQ;AAAA,GATd,YASgB,WAAA,UAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,SAAQ;AAAA,GAVd,YAUgB,WAAA,WAAA,CAAA;AACA,gBAAA;AAAA,EAA1B,SAAS,EAAC,MAAM,SAAQ;AAAA,GAXd,YAWgB,WAAA,OAAA,CAAA;AAXhB,cAAN,gBAAA;AAAA,EADN,cAAc,cAAc;AAAA,GAChB,WAAA;AAqBb,MAAM,kBAAkB;AAExB,SAAS,YACP,OACA,QACA,WACA;AACA,QAAM,YAAY;AAAA,0HACsG,OAAO,SAAS;AAAA;AAExI,QAAM,QAAQ;AAEd,QAAM,YAAY,CAAA;AAElB,QAAM,SAAS;AACf,QAAM,QAAQ,kBAAkB;AAChC,MAAI,CAAC,WAAW;AACd,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AACrB,gBAAA;AAAA,QACR,iCAAiC,CAAC,IAAI,QAAQ,CAAC,QAC7C,CAAC,IAAI,QAAQ,CACf;AAAA,MAAA;AAEQ,gBAAA;AAAA,QACR,iCAAiC,CAAC,IAAI,QAAQ,CAAC,QAC7C,CAAC,IAAI,QAAQ,CACf;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAEM,QAAA,YAAa,MAAM,QAAS;AAC5B,QAAA,OAAO,OAAO,MAAM;AACpB,QAAA,MAAM,8BAA8B,SAAS,cAAc,IAAI,SAAS,OAAO,GAAG,WAAW,OAAO,GAAG;AAE7G,SAAO,CAAC,WAAW,OAAO,WAAW,GAAG;AAC1C;AAEA,SAAS,eACP,OACA,QACA,WACA;AACA,QAAM,YAAY;AAAA;AAAA,UAEV,YAAY,OAAO,QAAQ,SAAS,CAAC;AAAA;AAAA;AAGtC,SAAA;AACT;AAEA,SAAS,SAAS,YAAoB;AAC7B,SAAA;AAAA,2LACkL,UAAU;AACrM;AAEA,SAAS,YACP,OACA,gBACA,QACA;AACA,QAAM,IACJ,MACA,EAAE,iBACE,IACA,KAAK,KAAK,KAAK,KAAM,kBAAkB,KAAK,IAAI,KAAK,IAAK,MAAM;AAC/D,SAAA;AAAA,gCACuB,CAAC;AAAA,8OAC6M,OAAO,IAAI,WAAW,OAAO,MAAM;AAAA,0OACvC,OAAO,IAAI,WAAW,OAAO,MAAM;AAAA;AAAA;AAG7Q;AAEO,SAAS,SACd,QACA,UACA,OACA,SACA;AACA,MAAI,WAAW;AACf,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,2BAA2B;AAC/B,MAAI,gBAAgB;AACpB,MAAI,YAAY;AAChB,MAAI,QAAQ,YAAY;AACN,oBAAA;AAAA,EAClB;AACI,MAAA,UAAU,gBAAgB,QAAQ;AACzB,eAAA;AACK,oBAAA;AACA,oBAAA;AACH,iBAAA;AACb,QAAI,QAAQ,YAAY;AACN,sBAAA;AAAA,IAClB;AAAA,EAAA,WACS,UAAU,gBAAgB,SAAS;AACjC,eAAA;AACK,oBAAA;AACA,oBAAA;AACH,iBAAA;AACJ,aAAA;AACG,gBAAA;AACZ,QAAI,aAAa,QAAW;AACf,iBAAA;AAAA,IACb;AAAA,EAAA,WACS,UAAU,gBAAgB,KAAK;AAC7B,eAAA;AACK,oBAAA;AACH,iBAAA;AACG,oBAAA;AACP,aAAA;AACG,gBAAA;AACe,+BAAA;AAC3B,QAAI,aAAa,QAAW;AACf,iBAAA;AAAA,IACb;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,sDACiC,aAAa,WAAW,aAAa;AAAA;AAGzF,QAAM,cAAc;AAAA;AAAA,MAEhB;AAAA,IACA,KAAK,IAAI,QAAQ,CAAC;AAAA,IAClB,EAAC,KAAK,UAAU,WAAW,yBAAwB;AAAA,IACnD;AAAA,EAAA,CACD;AAAA,MACC;AAAA,IACA,KAAK,IAAI,CAAC,QAAQ,CAAC;AAAA,IACnB,EAAC,KAAK,UAAU,WAAW,yBAAwB;AAAA,IACnD;AAAA,EAAA,CACD;AAAA,MACC,UAAU;AAAA,MAEV,aAAa,SACT,YAAY,UAAU,QAAQ,gBAAgB;AAAA,IAC5C,MAAM;AAAA,IACN,QAAQ;AAAA,EACT,CAAA,IACD,IACN;AAAA,MACE,QAAQ,SAAS,OAAO,SAAS,UAAU,CAAC;AAAA;AAAA;AAIhD,MAAI,QAAQ,QAAQ;AACX,WAAA;AAAA;AAAA;AAAA,YAGC,WAAW;AAAA;AAAA;AAAA,EAGrB;AAEO,SAAA;AACT;"}
1
+ {"version":3,"file":"thruster.js","sources":["../../../src/navigation-instruments/thruster/thruster.ts"],"sourcesContent":["import {LitElement, svg, html, css} from 'lit';\nimport {customElement, property} from 'lit/decorators.js';\nimport {Size, InstrumentState} from '../types';\n\n/**\n * @element obc-thruster\n *\n * @prop {Size} size - The size of the thruster\n * @prop {number} thrust - The thrust of the thruster in percent (-100 - +100)\n */\n@customElement('obc-thruster')\nexport class ObcThruster extends LitElement {\n @property({type: String}) size: Size = Size.medium;\n @property({type: Number}) thrust: number = 0;\n @property({type: Number}) setpoint: number | undefined;\n @property({type: Boolean, attribute: 'at-setpoint'}) atSetpoint: boolean =\n false;\n @property({type: Boolean, attribute: 'setpoint-at-zero'})\n setpointAtZero: boolean = false;\n @property({type: String}) state: InstrumentState = InstrumentState.inCommand;\n @property({type: Boolean}) tunnel: boolean = false;\n @property({type: Boolean}) loading: boolean = false;\n @property({type: Boolean}) off: boolean = false;\n\n override render() {\n return html`<div class=\"container\">\n ${thruster(this.thrust, this.setpoint, this.state, {\n atSetpoint: this.atSetpoint,\n tunnel: this.tunnel,\n setpointAtZero: this.setpointAtZero,\n })}\n </div>`;\n }\n\n static override styles = css`\n .container {\n height: 100%;\n width: 100%;\n }\n\n .container > svg {\n height: 100%;\n width: 100%;\n }\n `;\n}\nconst containerHeight = 134;\n\nfunction thrusterTop(\n value: number,\n colors: {box: string; container: string},\n hideTicks: boolean\n) {\n const container = svg`\n <path transform=\"translate(-33 -137)\" d=\"M1 9C1 4.58172 4.58172 1 9 1H57C61.4183 1 65 4.58172 65 9V135H1V9Z\" fill=${colors.container} stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>\n `;\n const track = svg`<rect width=\"32\" height=\"134\" x=\"-16\" y=\"-136\" fill=\"var(--instrument-frame-secondary-color)\" stroke=\"var(--instrument-frame-tertiary-color)\" vector-effect=\"non-scaling-stroke\"/>`;\n\n const tickmarks = [];\n\n const nTicks = 4;\n const delta = containerHeight / nTicks;\n if (!hideTicks) {\n for (let i = 1; i < nTicks; i++) {\n tickmarks.push(\n svg`<line x1=\"-20\" x2=\"-28\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n tickmarks.push(\n svg`<line x1=\"20\" x2=\"28\" y1=${-i * delta - 2} y2=${\n -i * delta - 2\n } stroke=\"var(--instrument-frame-tertiary-color)\" stroke-width=\"1\" vector-effect=\"non-scaling-stroke\"/>`\n );\n }\n }\n\n const barHeight = (134 * value) / 100;\n const barY = -136 + 134 - barHeight;\n const bar = svg`<rect width=\"32\" height=${barHeight} x=\"-16\" y=${barY} fill=${colors.box} stroke=${colors.box} vector-effect=\"non-scaling-stroke\"/>`;\n\n return [container, track, tickmarks, bar];\n}\n\nfunction thrusterBottom(\n value: number,\n colors: {box: string; container: string},\n hideTicks: boolean\n) {\n const container = svg`\n <g transform=\"rotate(180)\">\n ${thrusterTop(value, colors, hideTicks)}\n </g>\n `;\n return container;\n}\n\nfunction arrowTop(arrowColor: string) {\n return svg`\n<path transform=\"translate(-15 -156)\" d=\"M0.707007 14.2929L14.9999 0L29.2928 14.2929C29.9228 14.9229 29.4766 16 28.5857 16H1.41412C0.523211 16 0.0770419 14.9229 0.707007 14.2929Z\" fill=${arrowColor}/>`;\n}\n\nfunction setpointSvg(\n value: number,\n setpointAtZero: boolean,\n colors: {fill: string; stroke: string}\n) {\n const y =\n -12 +\n -(setpointAtZero\n ? 0\n : Math.sign(value) * ((containerHeight * Math.abs(value)) / 100 + 2));\n return svg`\n <g transform=\"translate(-40 ${y})\">\n <path d=\"M59.4001 11.1999C59.1483 11.3887 59 11.6852 59 12C59 12.3148 59.1483 12.6113 59.4001 12.8001L72.2001 22.3966C74.1773 23.879 77 22.4692 77 19.9971L77 4.0029C77 1.53076 74.1773 0.121035 72.2001 1.60338L59.4001 11.1999Z\" fill=${colors.fill} stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n <path d=\"M20.5999 12.8001C20.8517 12.6113 21 12.3148 21 12C21 11.6852 20.8517 11.3887 20.5999 11.1999L7.79986 1.60338C5.82268 0.121036 3 1.53075 3 4.0029L3 19.9971C3 22.4692 5.82268 23.879 7.79986 22.3966L20.5999 12.8001Z\" fill=${colors.fill} stroke=${colors.stroke} stroke-width=\"2\" stroke-linejoin=\"round\" vector-effect=\"non-scaling-stroke\"/>\n </g>\n`;\n}\n\nexport function thruster(\n thrust: number,\n setpoint: number | undefined,\n state: InstrumentState,\n options: {atSetpoint: boolean; tunnel: boolean; setpointAtZero: boolean}\n) {\n let boxColor = 'var(--instrument-enhanced-secondary-color)';\n let setPointColor = boxColor;\n let arrowColor = 'var(--instrument-tick-mark-primary-color)';\n let containerBackgroundColor = 'var(--instrument-frame-primary-color)';\n let zeroLineColor = 'var(--instrument-enhanced-secondary-color)';\n let hideTicks = false;\n if (options.atSetpoint) {\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n }\n if (state === InstrumentState.active) {\n boxColor = 'var(--instrument-regular-secondary-color)';\n zeroLineColor = 'var(--instrument-regular-secondary-color)';\n setPointColor = boxColor;\n arrowColor = 'var(--instrument-regular-secondary-color)';\n if (options.atSetpoint) {\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n }\n } else if (state === InstrumentState.loading) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-regular-secondary-color)';\n thrust = 0;\n hideTicks = true;\n if (setpoint !== undefined) {\n setpoint = 0;\n }\n } else if (state === InstrumentState.off) {\n boxColor = 'transparent';\n setPointColor = 'var(--instrument-frame-tertiary-color)';\n arrowColor = 'var(--instrument-frame-tertiary-color)';\n zeroLineColor = 'var(--instrument-frame-tertiary-color)';\n thrust = 0;\n hideTicks = true;\n containerBackgroundColor = 'transparent';\n if (setpoint !== undefined) {\n setpoint = 0;\n }\n }\n\n const centerLine = svg`\n <rect x=\"-32\" y=\"-2\" width=\"64\" height=\"4\" fill=${zeroLineColor} stroke=${zeroLineColor}/>\n `;\n\n const thrusterSvg = [\n thrusterTop(\n Math.max(thrust, 0),\n {box: boxColor, container: containerBackgroundColor},\n hideTicks\n ),\n thrusterBottom(\n Math.max(-thrust, 0),\n {box: boxColor, container: containerBackgroundColor},\n hideTicks\n ),\n centerLine,\n ];\n if (setpoint !== undefined) {\n thrusterSvg.push(\n setpointSvg(setpoint, options.setpointAtZero, {\n fill: setPointColor,\n stroke: 'var(--border-silhouette-color)',\n })\n );\n }\n\n if (options.tunnel) {\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-160 -64 320 128\" x=\"-160\" y=\"-64\">\n <g transform=\"rotate(90)\">\n ${thrusterSvg}\n </g>\n </svg>`;\n } else {\n thrusterSvg.push(arrowTop(arrowColor));\n return svg`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-64 -160 128 320\" x=\"-64\" y=\"-160\">\n ${thrusterSvg}\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-thruster': ObcThruster;\n }\n}\n"],"names":[],"mappings":"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"}
package/fix-generated.cjs CHANGED
@@ -20,6 +20,8 @@ function addRepositoryToPackageJsonVue() {
20
20
  url: 'git+https://github.com/Ocean-Industries-Concept-Lab/openbridge-webcomponents.git',
21
21
  directory: 'packages/openbridge-webcomponents-vue',
22
22
  };
23
+ // add license
24
+ packageJson.license = 'Apache-2.0';
23
25
  fs.writeFileSync(
24
26
  '../openbridge-webcomponents-vue/package.json',
25
27
  JSON.stringify(packageJson, null, 2)
@@ -33,6 +35,7 @@ function addRepositoryToPackageJsonReact() {
33
35
  url: 'git+https://github.com/Ocean-Industries-Concept-Lab/openbridge-webcomponents.git',
34
36
  directory: 'packages/openbridge-webcomponents-react',
35
37
  };
38
+ packageJson.license = 'Apache-2.0';
36
39
  fs.writeFileSync(
37
40
  '../openbridge-webcomponents-react/package.json',
38
41
  JSON.stringify(packageJson, null, 2)
package/new-component.ts CHANGED
@@ -29,7 +29,7 @@ const files = await multiselect('Create files', {
29
29
  // Convert name to kebab-case
30
30
  const componentName = name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
31
31
 
32
- const parentDir = componentType[0].includes('ui')
32
+ const parentDir = componentType.includes('ui')
33
33
  ? 'components'
34
34
  : 'navigation-instruments';
35
35
  const dir = path.join('src', parentDir, componentName);
@@ -38,14 +38,13 @@ fs.mkdirSync(dir);
38
38
 
39
39
  // Create files
40
40
  if (files.includes('lit')) {
41
+ const hasCss = files.includes('css');
41
42
  const litFile = path.join(dir, `${componentName}.ts`);
42
- const content = `import { LitElement, html } from 'lit'
43
+ const content = `import { LitElement, html${
44
+ hasCss ? `, unsafeCSS ` : ` `
45
+ }} from 'lit'
43
46
  import { customElement } from 'lit/decorators.js'
44
- ${
45
- files.includes('css')
46
- ? `import compentStyle from "./${componentName}.style";`
47
- : ''
48
- }
47
+ ${hasCss ? `import compentStyle from "./${componentName}.css?inline";` : ''}
49
48
 
50
49
  @customElement('obc-${componentName}')
51
50
  export class Obc${name} extends LitElement {
@@ -57,7 +56,7 @@ export class Obc${name} extends LitElement {
57
56
  \`
58
57
  }
59
58
 
60
- ${files.includes('css') ? `static override styles = compentStyle;` : ''}
59
+ ${hasCss ? `static override styles = unsafeCSS(compentStyle);` : ''}
61
60
  }
62
61
 
63
62
  declare global {
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@oicl/openbridge-webcomponents",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/Ocean-Industries-Concept-Lab/openbridge-webcomponents.git",
8
8
  "directory": "packages/openbridge-webcomponents"
9
9
  },
10
+ "license": "Apache-2.0",
10
11
  "scripts": {
11
12
  "build": "yarn run typecheck && yarn run build:ts && yarn run analyze && yarn run build:wrappers",
12
13
  "build:ts": "vite build",
@@ -40,10 +41,13 @@
40
41
  "@lit-labs/gen-wrapper-vue": "^0.3.2",
41
42
  "@open-wc/lit-helpers": "^0.6.0",
42
43
  "@storybook/addon-essentials": "^7.6.7",
44
+ "@storybook/addon-interactions": "^7.6.17",
43
45
  "@storybook/addon-links": "^7.6.7",
46
+ "@storybook/addon-storysource": "^7.6.17",
44
47
  "@storybook/addon-themes": "^7.6.7",
45
48
  "@storybook/blocks": "^7.6.7",
46
49
  "@storybook/test-runner": "^0.16.0",
50
+ "@storybook/testing-library": "^0.2.2",
47
51
  "@storybook/web-components": "^7.6.7",
48
52
  "@storybook/web-components-vite": "^7.6.7",
49
53
  "@topcli/prompts": "^1.8.0",
@@ -0,0 +1,177 @@
1
+ import * as Figma from 'figma-api';
2
+ import * as dotenv from 'dotenv';
3
+
4
+ dotenv.config();
5
+
6
+ export interface IconRef {
7
+ name: string;
8
+ id: string;
9
+ javascriptName: string;
10
+ styles: {[colorCode: string]: {cssClass: string}};
11
+ }
12
+
13
+ export function getSingleColorIcon(imageData: string, icon: IconRef): string {
14
+ // replace fill color with currentColor
15
+ const fillRegex = /fill="[^"]+"/g;
16
+ const replace = 'fill="currentColor"';
17
+ let imageDataNew = imageData.replace(fillRegex, replace);
18
+
19
+ // remove fillOpacity
20
+ const fillOpacityRegex = /fill-opacity="[^"]+"/g;
21
+ imageDataNew = imageDataNew.replace(fillOpacityRegex, '');
22
+
23
+ return imageDataNew;
24
+ }
25
+
26
+ export function getCssColorIcon(imageData: string, icon: IconRef): string {
27
+ // replace fill color with currentColor
28
+ const fillRegex = /fill="([^"]+)"/g;
29
+
30
+ const replace = (match: string, color: string) => {
31
+ const cssClass = icon.styles[color];
32
+ if (cssClass === undefined) {
33
+ if (color === 'black') return 'fill="currentColor"';
34
+ if (color === 'none') return 'fill="none"';
35
+ if (color === 'white') return 'fill="none"';
36
+ if (color === '#C90000')
37
+ return 'fill="var(--alarm-enabled-background-color)"';
38
+ console.warn(
39
+ 'No css class for color',
40
+ color,
41
+ icon.name,
42
+ Object.keys(icon.styles)
43
+ );
44
+ return 'fill="currentColor"';
45
+ }
46
+ return `style="fill: var(--${cssClass.cssClass})"`;
47
+ };
48
+ imageData = imageData.replace(fillRegex, replace);
49
+
50
+ // remove fillOpacity
51
+ const fillOpacityRegex = /fill-opacity="[^"]+"/g;
52
+ imageData = imageData.replace(fillOpacityRegex, '');
53
+
54
+ // replace stroke color with currentColor
55
+ const strokeRegex = /stroke="([^"]+)"/g;
56
+ const replaceStroke = (match: string, color: string) => {
57
+ const cssClass = icon.styles[color];
58
+ if (cssClass === undefined) {
59
+ if (color === 'black') return 'stroke="currentColor"';
60
+ if (color === 'none') return 'stroke="none"';
61
+ if (color === 'white') return 'stroke="none"';
62
+ console.warn(
63
+ 'No css class for color',
64
+ color,
65
+ icon.name,
66
+ Object.keys(icon.styles)
67
+ );
68
+ return 'stroke="currentColor"';
69
+ }
70
+ return `style="stroke: var(--${cssClass.cssClass})"`;
71
+ };
72
+ imageData = imageData.replace(strokeRegex, replaceStroke);
73
+
74
+ // remove strokeOpacity
75
+ const strokeOpacityRegex = /stroke-opacity="[^"]+"/g;
76
+ imageData = imageData.replace(strokeOpacityRegex, '');
77
+
78
+ return imageData;
79
+ }
80
+
81
+ export function kebabToUpperCamelCase(kebabCase: string): string {
82
+ const words = kebabCase.replace(/ /g, '').split('-');
83
+ const upperCamelCase = words
84
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
85
+ .join('');
86
+ return upperCamelCase;
87
+ }
88
+
89
+ export function getStylesForNode(
90
+ node: Figma.Node,
91
+ styles: {[styleId: string]: Figma.Style}
92
+ ): {[colorCode: string]: {cssClass: string}} {
93
+ let out = {};
94
+
95
+ if ('children' in node) {
96
+ for (const child of node.children) {
97
+ out = {...out, ...getStylesForNode(child, styles)};
98
+ if ('fills' in child && 'styles' in child) {
99
+ let fils: string | undefined;
100
+ child.fills.forEach((fill) => {
101
+ if (fill.type === 'SOLID') {
102
+ if (fils !== undefined) {
103
+ console.warn(
104
+ 'Multiple fills',
105
+ fils,
106
+ rgbaToHexOrColorName(fill.color!)
107
+ );
108
+ }
109
+ fils = rgbaToHexOrColorName(fill.color!);
110
+ }
111
+ });
112
+ if (fils !== undefined && child.styles && 'fill' in child.styles) {
113
+ const styleId = child.styles.fill as string;
114
+ const figmaStyle = styles[styleId];
115
+ const cssClass = styleToCssClass(figmaStyle);
116
+ out[fils] = {cssClass: cssClass};
117
+ }
118
+ }
119
+ if ('strokes' in child && 'styles' in child) {
120
+ let strokes: string;
121
+ child.strokes.forEach((fill) => {
122
+ if (fill.type === 'SOLID') {
123
+ if (strokes !== undefined) {
124
+ console.warn(
125
+ 'Multiple strokes',
126
+ strokes,
127
+ rgbaToHexOrColorName(fill.color!)
128
+ );
129
+ }
130
+ strokes = rgbaToHexOrColorName(fill.color!);
131
+ }
132
+ });
133
+ if (strokes !== undefined && child.styles?.stroke) {
134
+ const styleId = child.styles.stroke;
135
+ const figmaStyle = styles[styleId];
136
+ const cssClass = styleToCssClass(figmaStyle);
137
+ out[strokes] = {cssClass: cssClass};
138
+ }
139
+ }
140
+ if ('fillOverrideTable' in child) {
141
+ for (const fill of Object.values(child.fillOverrideTable)) {
142
+ if (fill === null) continue;
143
+ if (!('inheritFillStyleId' in fill)) continue;
144
+ const styleId = fill.inheritFillStyleId;
145
+ const figmaStyle = styles[styleId];
146
+ const color = rgbaToHexOrColorName(fill.fills[0].color!);
147
+ const cssClass = styleToCssClass(figmaStyle);
148
+ out[color] = {cssClass: cssClass};
149
+ }
150
+ }
151
+ }
152
+ }
153
+ return out;
154
+ }
155
+
156
+ function decimalToHex(d: number): string {
157
+ const v = Math.round(d * 255).toString(16);
158
+ return v.length === 1 ? `0${v}` : v;
159
+ }
160
+
161
+ function rgbaToHexOrColorName(rgba: Figma.Color): string {
162
+ const isBlack = rgba.r === 0 && rgba.g === 0 && rgba.b === 0 && rgba.a === 1;
163
+ const isWhite = rgba.r === 1 && rgba.g === 1 && rgba.b === 1 && rgba.a === 1;
164
+ if (isBlack) {
165
+ return 'black';
166
+ } else if (isWhite) {
167
+ return 'white';
168
+ } else {
169
+ return `#${decimalToHex(rgba.r)}${decimalToHex(rgba.g)}${decimalToHex(
170
+ rgba.b
171
+ )}`.toUpperCase();
172
+ }
173
+ }
174
+
175
+ function styleToCssClass(style: Figma.Style): string {
176
+ return style.name.replace(/[\/ ]/g, '-').toLocaleLowerCase();
177
+ }
@@ -0,0 +1,180 @@
1
+ import * as Figma from 'figma-api';
2
+ import * as dotenv from 'dotenv';
3
+ import * as fs from 'fs';
4
+ import {GetFileResult} from 'figma-api/lib/api-types';
5
+ import {
6
+ IconRef,
7
+ getCssColorIcon,
8
+ getStylesForNode,
9
+ kebabToUpperCamelCase,
10
+ } from './convert-icons';
11
+
12
+ dotenv.config();
13
+
14
+ const documentId = 'TPoHGyeEtlcpnNekOa4lY3';
15
+
16
+ const useCache = false;
17
+
18
+ const iconMapUrl: {url: string; name: string; typeA: boolean}[] = [
19
+ {
20
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47442&mode=design&t=QA1ohadrbRZxW1ss-4',
21
+ name: '14-alarm-unack',
22
+ typeA: true,
23
+ },
24
+ {
25
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47508&mode=design&t=QA1ohadrbRZxW1ss-4',
26
+ name: '14-alarm-unack',
27
+ typeA: false,
28
+ },
29
+ {
30
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47481&mode=design&t=QA1ohadrbRZxW1ss-4',
31
+ name: '14-alarm-silenced',
32
+ typeA: true,
33
+ },
34
+ {
35
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47505&mode=design&t=QA1ohadrbRZxW1ss-4',
36
+ name: '14-alarm-silenced',
37
+ typeA: false,
38
+ },
39
+ {
40
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47445&mode=design&t=QA1ohadrbRZxW1ss-4',
41
+ name: '14-warning-unack',
42
+ typeA: true,
43
+ },
44
+ {
45
+ url: 'https://www.figma.com/file/TPoHGyeEtlcpnNekOa4lY3/OpenBridge-CAM?type=design&node-id=850-47475&mode=design&t=QA1ohadrbRZxW1ss-4',
46
+ name: '14-warning-unack',
47
+ typeA: false,
48
+ },
49
+ ];
50
+
51
+ const iconMap: {id: string; name: string; typeA: boolean}[] = iconMapUrl.map(
52
+ (icon) => {
53
+ let id = icon.url.match(/node-id=([0-9/-]+)/)![1];
54
+ // replace - with :
55
+ id = id.replace(/-/g, ':');
56
+ return {id, name: icon.name, typeA: icon.typeA};
57
+ }
58
+ );
59
+
60
+ const iconDir = './src/components/alert-icon/icons';
61
+
62
+ export async function main() {
63
+ // delete all icons
64
+
65
+ if (fs.existsSync(iconDir)) {
66
+ const files = fs.readdirSync(iconDir);
67
+ for (const file of files) {
68
+ fs.unlinkSync(`${iconDir}/${file}`);
69
+ }
70
+ } else {
71
+ fs.mkdirSync(iconDir);
72
+ }
73
+
74
+ const api = new Figma.Api({
75
+ personalAccessToken: process.env.FIGMA_TOKEN as string,
76
+ });
77
+
78
+ const cachepath = './script/.cache-figma-alert.json';
79
+ let file: GetFileResult;
80
+ if (fs.existsSync(cachepath) && useCache) {
81
+ file = JSON.parse(fs.readFileSync(cachepath, 'utf8'));
82
+ } else {
83
+ file = await api.getFile(documentId, {ids: ['850:47441']});
84
+ // save to cache
85
+ fs.writeFileSync(cachepath, JSON.stringify(file, null, 2));
86
+ }
87
+ console.log('Got page');
88
+ const page = file.document.children.find(
89
+ (p) => p.name === 'Icons'
90
+ ) as Figma.Node<'CANVAS'>;
91
+ const frames = page.children.filter(
92
+ (child) => child.name === 'Frame 3'
93
+ ) as Figma.Node<'FRAME'>[];
94
+ const styles = file.styles;
95
+
96
+ const knownIds = iconMap.map((icon) => icon.id);
97
+ let icons = frames.flatMap((frame): IconRef[] => {
98
+ return frame.children
99
+ .filter((child) => knownIds.includes(child.id))
100
+ .map((child) => {
101
+ const icon = iconMap.find((icon) => icon.id === child.id);
102
+ const name = icon!.name + (icon!.typeA ? '-a' : '-b');
103
+ const javascriptName = 'svg' + kebabToUpperCamelCase(name);
104
+ return {
105
+ name: name,
106
+ id: child.id,
107
+ javascriptName: javascriptName,
108
+ styles: getStylesForNode(child, styles),
109
+ };
110
+ });
111
+ });
112
+
113
+ // remove duplicate icon names
114
+ const seen = new Set();
115
+ icons = icons.filter((icon) => {
116
+ const duplicate = seen.has(icon.javascriptName);
117
+ seen.add(icon.javascriptName);
118
+ if (duplicate) {
119
+ console.log('Duplicate icon name', icon.name);
120
+ }
121
+ return !duplicate;
122
+ });
123
+
124
+ // download all icons
125
+ if (!useCache) {
126
+ const split = 50;
127
+ for (let i = 0; i < icons.length; i += split) {
128
+ console.log('Got images', i);
129
+ const iconChunks = icons.slice(i, i + split);
130
+ const images = await api.getImage(documentId, {
131
+ ids: iconChunks.map((icon) => icon.id).join(','),
132
+ scale: 1,
133
+ format: 'svg',
134
+ });
135
+
136
+ // write icons to disk
137
+ await Promise.all(
138
+ Object.keys(images.images).map(async (nodeId) => {
139
+ const icon = icons.find((icon) => icon.id === nodeId);
140
+ const imageUrl = images.images[nodeId];
141
+ if (icon && imageUrl) {
142
+ // download icons
143
+ const request = await fetch(imageUrl);
144
+ const imageData = await request.text();
145
+ fs.writeFileSync(
146
+ `./script/.cache/alert-icons/${icon.name}.svg`,
147
+ imageData
148
+ );
149
+ }
150
+ })
151
+ );
152
+ }
153
+ }
154
+
155
+ const fileImport: string[] = [];
156
+ for (const icon of icons) {
157
+ const imageData = fs.readFileSync(
158
+ `./script/.cache/alert-icons/${icon.name}.svg`,
159
+ 'utf8'
160
+ );
161
+ const cssColorIcon = getCssColorIcon(imageData, icon);
162
+
163
+ // convert icon.name from kebab case to upper cammel case
164
+ const name = icon.name.toLowerCase();
165
+
166
+ const component = `import {svg} from 'lit';
167
+ export const ${icon.javascriptName} = svg\`${cssColorIcon}\`;
168
+ `;
169
+ fs.writeFileSync(`${iconDir}/icon-${name}.ts`, component);
170
+ fileImport.push(
171
+ `import {${icon.javascriptName}} from './icons/icon-${name}';`
172
+ );
173
+ }
174
+
175
+ fileImport.sort();
176
+ console.log(fileImport.join('\n'));
177
+ console.log('done');
178
+ }
179
+
180
+ main();