@oicl/openbridge-webcomponents-full-bundle 2.0.0-next.50 → 2.0.0-next.53

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 (244) hide show
  1. package/bundle/openbridge-webcomponents.bundle.js +18521 -17306
  2. package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
  3. package/custom-elements.json +857 -3
  4. package/dist/ar/building-blocks/poi-header/poi-header.css.js +8 -4
  5. package/dist/ar/building-blocks/poi-header/poi-header.css.js.map +1 -1
  6. package/dist/ar/chart-object-vessel-button/chart-object-vessel-button.css.js +7 -7
  7. package/dist/ar/poi-card-header/poi-card-header.css.js +12 -6
  8. package/dist/ar/poi-card-header/poi-card-header.css.js.map +1 -1
  9. package/dist/building-blocks/alert-list/alert-list.css.js +4 -2
  10. package/dist/building-blocks/alert-list/alert-list.css.js.map +1 -1
  11. package/dist/components/accordion-card/accordion-card.css.js +6 -3
  12. package/dist/components/accordion-card/accordion-card.css.js.map +1 -1
  13. package/dist/components/accordion-item/accordion-item.css.js +4 -2
  14. package/dist/components/accordion-item/accordion-item.css.js.map +1 -1
  15. package/dist/components/advice-button/advice-button.css.js +2 -1
  16. package/dist/components/advice-button/advice-button.css.js.map +1 -1
  17. package/dist/components/alert-button/alert-button.css.js +2 -1
  18. package/dist/components/alert-button/alert-button.css.js.map +1 -1
  19. package/dist/components/alert-frame/alert-frame.css.js +7 -3
  20. package/dist/components/alert-frame/alert-frame.css.js.map +1 -1
  21. package/dist/components/alert-list-details/alert-list-details.css.js +4 -2
  22. package/dist/components/alert-list-details/alert-list-details.css.js.map +1 -1
  23. package/dist/components/alert-menu/alert-menu.css.js +4 -2
  24. package/dist/components/alert-menu/alert-menu.css.js.map +1 -1
  25. package/dist/components/app-button/app-button.css.js +8 -4
  26. package/dist/components/app-button/app-button.css.js.map +1 -1
  27. package/dist/components/attachment-list-item/attachment-list-item.css.js +8 -4
  28. package/dist/components/attachment-list-item/attachment-list-item.css.js.map +1 -1
  29. package/dist/components/badge/badge.css.js +4 -2
  30. package/dist/components/badge/badge.css.js.map +1 -1
  31. package/dist/components/breadcrumb/breadcrumb.css.js +4 -2
  32. package/dist/components/breadcrumb/breadcrumb.css.js.map +1 -1
  33. package/dist/components/brilliance-menu/brilliance-menu.css.js +2 -1
  34. package/dist/components/brilliance-menu/brilliance-menu.css.js.map +1 -1
  35. package/dist/components/calendar/calendar.css.js +5 -3
  36. package/dist/components/calendar/calendar.css.js.map +1 -1
  37. package/dist/components/card/card.css.js +2 -1
  38. package/dist/components/card/card.css.js.map +1 -1
  39. package/dist/components/chat-message/chat-message.css.js +6 -3
  40. package/dist/components/chat-message/chat-message.css.js.map +1 -1
  41. package/dist/components/check-button/check-button.css.js +5 -3
  42. package/dist/components/check-button/check-button.css.js.map +1 -1
  43. package/dist/components/checkbox-item/checkbox-item.css.js +4 -2
  44. package/dist/components/checkbox-item/checkbox-item.css.js.map +1 -1
  45. package/dist/components/clock/clock.css.js +7 -3
  46. package/dist/components/clock/clock.css.js.map +1 -1
  47. package/dist/components/command-menu/command-menu.css.js +6 -3
  48. package/dist/components/command-menu/command-menu.css.js.map +1 -1
  49. package/dist/components/communication-table/communication-table.css.js +10 -5
  50. package/dist/components/communication-table/communication-table.css.js.map +1 -1
  51. package/dist/components/context-menu-input/context-menu-input.css.js +4 -2
  52. package/dist/components/context-menu-input/context-menu-input.css.js.map +1 -1
  53. package/dist/components/date-item/date-item.css.js +16 -8
  54. package/dist/components/date-item/date-item.css.js.map +1 -1
  55. package/dist/components/dropdown-button/dropdown-button.css.js +6 -3
  56. package/dist/components/dropdown-button/dropdown-button.css.js.map +1 -1
  57. package/dist/components/elevated-card/elevated-card.css.js +8 -4
  58. package/dist/components/elevated-card/elevated-card.css.js.map +1 -1
  59. package/dist/components/elevated-card-radio-group/elevated-card-radio-group.css.js +6 -3
  60. package/dist/components/elevated-card-radio-group/elevated-card-radio-group.css.js.map +1 -1
  61. package/dist/components/event-item/event-item.css.js +6 -3
  62. package/dist/components/event-item/event-item.css.js.map +1 -1
  63. package/dist/components/event-list/event-list.css.js +2 -1
  64. package/dist/components/event-list/event-list.css.js.map +1 -1
  65. package/dist/components/filter-chip/filter-chip.css.js +2 -1
  66. package/dist/components/filter-chip/filter-chip.css.js.map +1 -1
  67. package/dist/components/floating-item/floating-item.css.js +6 -3
  68. package/dist/components/floating-item/floating-item.css.js.map +1 -1
  69. package/dist/components/form-container/form-container.css.js +1 -1
  70. package/dist/components/form-group/form-group.css.js +4 -2
  71. package/dist/components/form-group/form-group.css.js.map +1 -1
  72. package/dist/components/form-item/form-item.css.js +4 -2
  73. package/dist/components/form-item/form-item.css.js.map +1 -1
  74. package/dist/components/icon-button/icon-button.css.js +20 -19
  75. package/dist/components/icon-button/icon-button.css.js.map +1 -1
  76. package/dist/components/icon-button/icon-button.d.ts +2 -0
  77. package/dist/components/icon-button/icon-button.d.ts.map +1 -1
  78. package/dist/components/icon-button/icon-button.js.map +1 -1
  79. package/dist/components/icon-check-button/icon-check-button.css.js +4 -2
  80. package/dist/components/icon-check-button/icon-check-button.css.js.map +1 -1
  81. package/dist/components/input-chip/input-chip.css.js +2 -1
  82. package/dist/components/input-chip/input-chip.css.js.map +1 -1
  83. package/dist/components/keyboard-full/keyboard-full.css.js +2 -1
  84. package/dist/components/keyboard-full/keyboard-full.css.js.map +1 -1
  85. package/dist/components/keyboard-numeric/keyboard-numeric.css.js +2 -1
  86. package/dist/components/keyboard-numeric/keyboard-numeric.css.js.map +1 -1
  87. package/dist/components/menu-button/menu-button.css.js +4 -2
  88. package/dist/components/menu-button/menu-button.css.js.map +1 -1
  89. package/dist/components/message-menu-item/message-menu-item.css.js +6 -3
  90. package/dist/components/message-menu-item/message-menu-item.css.js.map +1 -1
  91. package/dist/components/modal-window/modal-window.css.js +2 -1
  92. package/dist/components/modal-window/modal-window.css.js.map +1 -1
  93. package/dist/components/navigation-item/navigation-item.css.js +9 -4
  94. package/dist/components/navigation-item/navigation-item.css.js.map +1 -1
  95. package/dist/components/notification-badge-button/notification-badge-button.css.js +2 -1
  96. package/dist/components/notification-badge-button/notification-badge-button.css.js.map +1 -1
  97. package/dist/components/notification-button/notification-button.css.js +2 -1
  98. package/dist/components/notification-button/notification-button.css.js.map +1 -1
  99. package/dist/components/number-input-field/number-input-field.css.js +4 -2
  100. package/dist/components/number-input-field/number-input-field.css.js.map +1 -1
  101. package/dist/components/pivot-item/pivot-item.css.js +4 -2
  102. package/dist/components/pivot-item/pivot-item.css.js.map +1 -1
  103. package/dist/components/progress-bar/progress-bar.css.js +4 -2
  104. package/dist/components/progress-bar/progress-bar.css.js.map +1 -1
  105. package/dist/components/progress-button/progress-button.css.js +4 -2
  106. package/dist/components/progress-button/progress-button.css.js.map +1 -1
  107. package/dist/components/radio/radio.css.js +4 -2
  108. package/dist/components/radio/radio.css.js.map +1 -1
  109. package/dist/components/rich-button/rich-button.css.js +4 -2
  110. package/dist/components/rich-button/rich-button.css.js.map +1 -1
  111. package/dist/components/sequence-item/sequence-item.css.js +11 -6
  112. package/dist/components/sequence-item/sequence-item.css.js.map +1 -1
  113. package/dist/components/sequence-loading-spinner/sequence-loading-spinner.css.js +3 -3
  114. package/dist/components/sequence-step/sequence-step.css.js +2 -1
  115. package/dist/components/sequence-step/sequence-step.css.js.map +1 -1
  116. package/dist/components/slide-button/slide-button.css.js +2 -1
  117. package/dist/components/slide-button/slide-button.css.js.map +1 -1
  118. package/dist/components/slider-double/slider-double.css.js +2 -1
  119. package/dist/components/slider-double/slider-double.css.js.map +1 -1
  120. package/dist/components/start-stop-switch/start-stop-switch.css.js +16 -8
  121. package/dist/components/start-stop-switch/start-stop-switch.css.js.map +1 -1
  122. package/dist/components/status-indicator/status-indicator.css.js +4 -2
  123. package/dist/components/status-indicator/status-indicator.css.js.map +1 -1
  124. package/dist/components/stepper-box/stepper-box.css.js +2 -1
  125. package/dist/components/stepper-box/stepper-box.css.js.map +1 -1
  126. package/dist/components/system-menu/system-menu.css.js +26 -13
  127. package/dist/components/system-menu/system-menu.css.js.map +1 -1
  128. package/dist/components/tab-item/tab-item.css.js +8 -5
  129. package/dist/components/tab-item/tab-item.css.js.map +1 -1
  130. package/dist/components/tabbed-card/tabbed-card.css.js +4 -2
  131. package/dist/components/tabbed-card/tabbed-card.css.js.map +1 -1
  132. package/dist/components/table/table.css.js +8 -5
  133. package/dist/components/table/table.css.js.map +1 -1
  134. package/dist/components/table-header-item/table-header-item.css.js +2 -1
  135. package/dist/components/table-header-item/table-header-item.css.js.map +1 -1
  136. package/dist/components/tag/tag.css.js +4 -2
  137. package/dist/components/tag/tag.css.js.map +1 -1
  138. package/dist/components/text-input-field/text-input-field.css.js +6 -3
  139. package/dist/components/text-input-field/text-input-field.css.js.map +1 -1
  140. package/dist/components/textarea-field/textarea-field.css.js +6 -3
  141. package/dist/components/textarea-field/textarea-field.css.js.map +1 -1
  142. package/dist/components/title-container/title-container.css.js +3 -2
  143. package/dist/components/title-container/title-container.css.js.map +1 -1
  144. package/dist/components/toggle-button-option/toggle-button-option.css.js +19 -12
  145. package/dist/components/toggle-button-option/toggle-button-option.css.js.map +1 -1
  146. package/dist/components/toggle-button-vertical-option/toggle-button-vertical-option.css.js +4 -2
  147. package/dist/components/toggle-button-vertical-option/toggle-button-vertical-option.css.js.map +1 -1
  148. package/dist/components/toggle-switch/toggle-switch.css.js +6 -3
  149. package/dist/components/toggle-switch/toggle-switch.css.js.map +1 -1
  150. package/dist/components/toggletip/toggletip.css.js +4 -2
  151. package/dist/components/toggletip/toggletip.css.js.map +1 -1
  152. package/dist/components/tooltip/tooltip.css.js +2 -1
  153. package/dist/components/tooltip/tooltip.css.js.map +1 -1
  154. package/dist/components/top-bar/top-bar.css.js +4 -2
  155. package/dist/components/top-bar/top-bar.css.js.map +1 -1
  156. package/dist/components/topbar-message-item/topbar-message-item.css.js +10 -5
  157. package/dist/components/topbar-message-item/topbar-message-item.css.js.map +1 -1
  158. package/dist/components/user-button/user-button.css.js +12 -7
  159. package/dist/components/user-button/user-button.css.js.map +1 -1
  160. package/dist/components/user-menu/user-menu.css.js +4 -2
  161. package/dist/components/user-menu/user-menu.css.js.map +1 -1
  162. package/dist/integration-systems/integration-bar/integration-bar.css.js +97 -0
  163. package/dist/integration-systems/integration-bar/integration-bar.css.js.map +1 -0
  164. package/dist/integration-systems/integration-bar/integration-bar.d.ts +91 -0
  165. package/dist/integration-systems/integration-bar/integration-bar.d.ts.map +1 -0
  166. package/dist/integration-systems/integration-bar/integration-bar.js +279 -0
  167. package/dist/integration-systems/integration-bar/integration-bar.js.map +1 -0
  168. package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.css.js +2 -1
  169. package/dist/integration-systems/integration-bar-dropdown/integration-bar-dropdown.css.js.map +1 -1
  170. package/dist/integration-systems/integration-button/integration-button.css.js +472 -156
  171. package/dist/integration-systems/integration-button/integration-button.css.js.map +1 -1
  172. package/dist/integration-systems/integration-button/integration-button.d.ts +37 -1
  173. package/dist/integration-systems/integration-button/integration-button.d.ts.map +1 -1
  174. package/dist/integration-systems/integration-button/integration-button.js +202 -36
  175. package/dist/integration-systems/integration-button/integration-button.js.map +1 -1
  176. package/dist/integration-systems/integration-dropdown-button/integration-dropdown-button.css.js +17 -6
  177. package/dist/integration-systems/integration-dropdown-button/integration-dropdown-button.css.js.map +1 -1
  178. package/dist/integration-systems/integration-fleet-button/integration-fleet-button.css.js +12 -6
  179. package/dist/integration-systems/integration-fleet-button/integration-fleet-button.css.js.map +1 -1
  180. package/dist/integration-systems/integration-tabs/integration-tabs.css.js +3 -1
  181. package/dist/integration-systems/integration-tabs/integration-tabs.css.js.map +1 -1
  182. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.css.js +75 -0
  183. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.css.js.map +1 -0
  184. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.d.ts +37 -0
  185. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.d.ts.map +1 -0
  186. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.js +72 -0
  187. package/dist/integration-systems/integration-vessel-menu/integration-vessel-menu.js.map +1 -0
  188. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.css.js +21 -8
  189. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.css.js.map +1 -1
  190. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.d.ts +2 -0
  191. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.d.ts.map +1 -1
  192. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.js +5 -0
  193. package/dist/integration-systems/integration-vessel-selector/integration-vessel-selector.js.map +1 -1
  194. package/dist/navigation-instruments/azimuth-thruster-labeled/azimuth-thruster-labeled.css.js +3 -1
  195. package/dist/navigation-instruments/azimuth-thruster-labeled/azimuth-thruster-labeled.css.js.map +1 -1
  196. package/dist/navigation-instruments/instrument-field/instrument-field.css.js +4 -2
  197. package/dist/navigation-instruments/instrument-field/instrument-field.css.js.map +1 -1
  198. package/dist/navigation-instruments/readout/readout.css.js +4 -2
  199. package/dist/navigation-instruments/readout/readout.css.js.map +1 -1
  200. package/dist/navigation-instruments/watch/watch.css.js +3 -2
  201. package/dist/navigation-instruments/watch/watch.css.js.map +1 -1
  202. package/dist/navigation-instruments/watch-flat/watch-flat.css.js +3 -2
  203. package/dist/navigation-instruments/watch-flat/watch-flat.css.js.map +1 -1
  204. package/dist/openbridge.css +4 -2
  205. package/dist/pages/alert-detail-page/alert-detail-page.css.js +15 -8
  206. package/dist/pages/alert-detail-page/alert-detail-page.css.js.map +1 -1
  207. package/package.json +4 -4
  208. package/postcss.config.mjs +2 -1
  209. package/script/check-css-variables.ts +9 -30
  210. package/src/ar/chart-object-vessel-button/chart-object-vessel-button.css +7 -7
  211. package/src/ar/poi-layer/poi-layer.stories.ts +3 -0
  212. package/src/components/calendar/calendar.css +1 -1
  213. package/src/components/check-button/check-button.css +1 -1
  214. package/src/components/icon-button/icon-button.css +1 -1
  215. package/src/components/icon-button/icon-button.ts +2 -0
  216. package/src/components/sequence-item/sequence-item.css +5 -3
  217. package/src/components/sequence-loading-spinner/sequence-loading-spinner.css +3 -3
  218. package/src/components/tab-item/tab-item.css +2 -2
  219. package/src/components/table/table.css +2 -2
  220. package/src/components/toggle-button-option/toggle-button-option.css +1 -3
  221. package/src/integration-systems/integration-app-bar/integration-app-bar.stories.ts +1 -1
  222. package/src/integration-systems/integration-bar/integration-bar.css +86 -0
  223. package/src/integration-systems/integration-bar/integration-bar.stories.ts +479 -0
  224. package/src/integration-systems/integration-bar/integration-bar.ts +301 -0
  225. package/src/integration-systems/integration-bar-dropdown/integration-bar-dropdown.stories.ts +5 -3
  226. package/src/integration-systems/integration-button/integration-button.css +203 -64
  227. package/src/integration-systems/integration-button/integration-button.stories.ts +71 -5
  228. package/src/integration-systems/integration-button/integration-button.ts +242 -43
  229. package/src/integration-systems/integration-dropdown-button/integration-dropdown-button.css +7 -1
  230. package/src/integration-systems/integration-dropdown-button/integration-dropdown-button.stories.ts +1 -1
  231. package/src/integration-systems/integration-fleet-button/integration-fleet-button.stories.ts +1 -1
  232. package/src/integration-systems/integration-tabs/integration-tabs.stories.ts +1 -1
  233. package/src/integration-systems/integration-vessel-menu/integration-vessel-menu.css +59 -0
  234. package/src/integration-systems/integration-vessel-menu/integration-vessel-menu.stories.ts +180 -0
  235. package/src/integration-systems/integration-vessel-menu/integration-vessel-menu.ts +83 -0
  236. package/src/integration-systems/integration-vessel-selector/integration-vessel-selector.css +21 -9
  237. package/src/integration-systems/integration-vessel-selector/integration-vessel-selector.stories.ts +187 -3
  238. package/src/integration-systems/integration-vessel-selector/integration-vessel-selector.ts +5 -0
  239. package/src/mixins/alert.css +0 -29
  240. package/src/mixins/font-extras.css +103 -0
  241. package/src/mixins/fonts.css +26 -96
  242. package/src/navigation-instruments/watch/watch.css +1 -1
  243. package/src/navigation-instruments/watch-flat/watch-flat.css +1 -1
  244. package/src/pages/alert-detail-page/alert-detail-page.css +1 -1
@@ -9,6 +9,7 @@ import {customElement} from '../../decorator.js';
9
9
  * - `normal`: Standard appearance for most use cases.
10
10
  * - `raised`: Adds elevation/shadow for prominence.
11
11
  * - `flat`: Minimal, backgroundless style for subtle actions.
12
+ * - `integration`: For use in Integration Bar components
12
13
  */
13
14
  export enum IconButtonVariant {
14
15
  normal = 'normal',
@@ -29,6 +30,7 @@ export enum IconButtonVariant {
29
30
  * - `normal` (default): Standard appearance for most use cases.
30
31
  * - `raised`: Adds elevation/shadow for prominence.
31
32
  * - `flat`: Minimal, backgroundless style for subtle actions.
33
+ * - `integration`: For use in Integration Bar components
32
34
  * - **Progress Indicator:**
33
35
  * - Shows a circular progress spinner overlay when the `progress` property is set (0–100). Useful for indicating loading or ongoing actions.
34
36
  * - **Label Support:**
@@ -57,7 +57,7 @@
57
57
  .title-row,
58
58
  .meta-row {
59
59
  padding: var(
60
- --global-size-spacing-list-item-menu-padding-horizonal-list-item
60
+ --global-size-spacing-nav-item-and-menus-padding-horizonal-list-item
61
61
  )
62
62
  0;
63
63
  }
@@ -137,7 +137,9 @@
137
137
 
138
138
  .title-row {
139
139
  display: flex;
140
- gap: var(--global-size-spacing-list-item-menu-padding-horizonal-list-item);
140
+ gap: var(
141
+ --global-size-spacing-nav-item-and-menus-padding-horizonal-list-item
142
+ );
141
143
  justify-content: space-between;
142
144
  align-items: flex-start;
143
145
  }
@@ -186,7 +188,7 @@
186
188
  @mixin font-instrument-value-small-neutral;
187
189
  display: flex;
188
190
  flex-direction: column;
189
- gap: var(--alert-components-badge-label-spacing);
191
+ gap: var(--ui-components-badge-label-spacing);
190
192
  }
191
193
 
192
194
  /* === Label Variants === */
@@ -103,8 +103,8 @@
103
103
  background: conic-gradient(
104
104
  from 0deg,
105
105
  var(--element-neutral-enhanced-color) 0deg,
106
- var(--element-neutral-enhanced-color) var(--spinner-progress-deg),
107
- transparent var(--spinner-progress-deg),
106
+ var(--element-neutral-enhanced-color) var(--spinner-progress-deg, 0deg),
107
+ transparent var(--spinner-progress-deg, 0deg),
108
108
  transparent 360deg
109
109
  );
110
110
  }
@@ -120,7 +120,7 @@
120
120
  }
121
121
 
122
122
  .cap-end {
123
- transform: translate(-50%, -50%) rotate(var(--spinner-progress-deg))
123
+ transform: translate(-50%, -50%) rotate(var(--spinner-progress-deg, 0deg))
124
124
  translateY(calc(-1 * var(--spinner-radius)));
125
125
  }
126
126
  }
@@ -111,7 +111,7 @@
111
111
 
112
112
  .divider {
113
113
  width: 1px;
114
- height: var(--menu-navigation-components-tab-item-divider-height);
114
+ height: var(--menu-navigation-components-tab-action-button-divider-height);
115
115
  flex-shrink: 0;
116
116
  color: var(--border-divider-color);
117
117
  fill: var(--border-divider-color);
@@ -124,7 +124,7 @@
124
124
  position: absolute;
125
125
  left: 0;
126
126
  width: 1px;
127
- height: var(--menu-navigation-components-tab-item-divider-height);
127
+ height: var(--menu-navigation-components-tab-action-button-divider-height);
128
128
  background: var(--border-divider-color);
129
129
  }
130
130
 
@@ -10,7 +10,7 @@
10
10
  .grid-container {
11
11
  display: grid;
12
12
  height: 100%;
13
- grid-template-columns: repeat(var(--grid-columns), auto);
13
+ grid-template-columns: repeat(var(--grid-columns, 1), auto);
14
14
  align-content: start;
15
15
  grid-template-rows: min-content min-content 1fr;
16
16
 
@@ -20,7 +20,7 @@
20
20
  --selection-column-width,
21
21
  var(--menu-navigation-components-table-item-touch-target-size)
22
22
  )
23
- repeat(var(--grid-columns-rest), minmax(0, 1fr));
23
+ repeat(var(--grid-columns-rest, 1), minmax(0, 1fr));
24
24
  }
25
25
 
26
26
  .grid-header {
@@ -5,9 +5,7 @@
5
5
  .wrapper {
6
6
  height: var(--ui-components-button-touch-target-size);
7
7
  width: 100%;
8
- min-width: var(
9
- --ui-components-icon-toggle-button-horizontal-item-touch-target-size
10
- );
8
+ min-width: var(--ui-components-toggle-button-touch-target-size);
11
9
  min-height: var(
12
10
  --ui-components-toggle-button-toggle-button-item-touch-target-size
13
11
  );
@@ -7,7 +7,7 @@ import {html} from 'lit';
7
7
 
8
8
  const meta: Meta<typeof ObcIntegrationAppBar> = {
9
9
  title: 'Integration Systems/App Bar',
10
- tags: ['6.0'],
10
+ tags: ['alpha'],
11
11
  component: 'obc-integration-app-bar',
12
12
  args: {},
13
13
  render: () => html`
@@ -0,0 +1,86 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ :host {
6
+ display: block;
7
+ width: 100%;
8
+ }
9
+
10
+ .wrapper {
11
+ display: flex;
12
+ padding: 0 var(--app-components-integration-system-topbar-margin-global);
13
+ justify-content: space-between;
14
+ align-items: center;
15
+ background: var(--integration-container-global-color);
16
+ box-shadow: var(--shadow-flat-x) var(--shadow-flat-y) var(--shadow-flat-blur)
17
+ var(--shadow-flat-spread) var(--shadow-flat-color);
18
+ }
19
+
20
+ .content-container {
21
+ display: flex;
22
+ flex: 1;
23
+ }
24
+
25
+ .fleet-vessel-container {
26
+ display: flex;
27
+ align-items: flex-start;
28
+ flex: 1 1 auto;
29
+ }
30
+
31
+ .fleet-button {
32
+ flex: initial;
33
+ }
34
+
35
+ .vessel-container {
36
+ display: flex;
37
+ flex: 1 1 auto;
38
+ }
39
+
40
+ .integration-buttons-slot::slotted(obc-integration-button) {
41
+ flex: 1;
42
+ }
43
+
44
+ .hug-buttons-slot::slotted(obc-integration-button) {
45
+ flex: 0 1 auto;
46
+ }
47
+
48
+ .home-button,
49
+ .link-button {
50
+ width: var(--app-components-integration-system-icon-button-touch-target);
51
+ height: var(--app-components-integration-system-icon-button-touch-target);
52
+ justify-content: center;
53
+ align-items: center;
54
+ gap: 14px;
55
+ flex: initial;
56
+ }
57
+
58
+ .right-content-container {
59
+ display: flex;
60
+ align-self: stretch;
61
+ align-items: center;
62
+ flex: initial;
63
+ }
64
+
65
+ .right-content-container.buttons-on-bar {
66
+ border-left: var(
67
+ --app-components-integration-system-navigation-item-horizontal-stroke-weight-right,
68
+ 1px
69
+ )
70
+ solid
71
+ var(
72
+ --integration-beta-flat-enabled-border-color,
73
+ var(--integration-border-outline)
74
+ );
75
+ }
76
+
77
+ .right-side-system-menu-container {
78
+ position: absolute;
79
+ position-anchor: --settings-menu-anchor;
80
+ top: anchor(bottom);
81
+ justify-self: anchor-center;
82
+ }
83
+
84
+ .vessel-button-placeholder {
85
+ flex: 1 1 auto;
86
+ }
@@ -0,0 +1,479 @@
1
+ import type {Meta, StoryObj} from '@storybook/web-components-vite';
2
+ import {ObcIntegrationBar} from './integration-bar.js';
3
+ import './integration-bar.js';
4
+ import {html, nothing} from 'lit';
5
+ import '../../components/dropdown-button/dropdown-button.js';
6
+ import '../../components/clock/clock.js';
7
+ import '../integration-vessel-menu/integration-vessel-menu.js';
8
+ import {
9
+ IntegrationButtonType,
10
+ IntegrationButtonVariant,
11
+ } from '../integration-button/integration-button.js';
12
+
13
+ function makeStringShorter(str: string, maxLength: number): string {
14
+ if (str.length <= maxLength) {
15
+ return str;
16
+ }
17
+ return str.slice(0, maxLength);
18
+ }
19
+
20
+ function getIntegrationnButtonType(hug: boolean, rich: boolean) {
21
+ if (hug) {
22
+ return IntegrationButtonType.hug;
23
+ } else if (rich) {
24
+ return IntegrationButtonType.rich;
25
+ } else {
26
+ return IntegrationButtonType.regular;
27
+ }
28
+ }
29
+
30
+ function getColorForButton(color: string): string {
31
+ return `--integration-on-selected-active-color: var(--base-${color}-600); --integration-on-selected-neutral-color: var(--base-${color}-500); --integration-selected-enabled-background-color: var(--base-${color}-100); --integration-selected-enabled-border-color: var(--base-${color}-100); --integration-selected-hover-background-color: var(--base-${color}-100); --integration-selected-hover-border-color: var(--base-${color}-100);`;
32
+ }
33
+
34
+ const readouts = [
35
+ {label: 'Readout 1', value: 'Value 1', unit: 'Unit 1'},
36
+ {label: 'Readout 2', value: 'Value 2', unit: 'Unit 2'},
37
+ ];
38
+
39
+ type IntegrationBarStoryArgs = ObcIntegrationBar & {
40
+ date: string;
41
+ showDate: boolean;
42
+ showTimezone: boolean;
43
+ timeZoneOffsetHours: number;
44
+ clockMinimizeBreakpointPx: number;
45
+ showVesselIntegrationMenu: boolean;
46
+ hug: boolean;
47
+ rich: boolean;
48
+ makeLabelNamesShort: boolean;
49
+ containerWidthPx: number;
50
+ showStatus: boolean;
51
+ showIntegrationMenu: boolean;
52
+ customSelectedColors: boolean;
53
+ };
54
+
55
+ function renderIntegrationButtons({
56
+ onIntegrationButtonClick,
57
+ shortNames,
58
+ hug,
59
+ rich,
60
+ shouldShowDividerRight,
61
+ showStatus,
62
+ showIntegrationMenu,
63
+ customSelectedColors,
64
+ }: {
65
+ onIntegrationButtonClick: (event: Event, buttonIndex: number) => void;
66
+ shortNames: boolean;
67
+ hug: boolean;
68
+ rich: boolean;
69
+ shouldShowDividerRight: (buttonIndex: number) => boolean;
70
+ showStatus: boolean;
71
+ showIntegrationMenu: boolean;
72
+ customSelectedColors: boolean;
73
+ }) {
74
+ const slotName = hug ? 'hug-buttons' : 'integration-buttons';
75
+ const buttonType = getIntegrationnButtonType(hug, rich);
76
+ const button1styling = customSelectedColors ? getColorForButton('cyan') : '';
77
+ const button2styling = customSelectedColors
78
+ ? getColorForButton('indigo')
79
+ : '';
80
+ const button3styling = customSelectedColors ? getColorForButton('teal') : '';
81
+ const button4styling = customSelectedColors
82
+ ? getColorForButton('purple')
83
+ : '';
84
+
85
+ return html`
86
+ <obc-integration-button
87
+ hasLeadingIcon
88
+ style=${button1styling}
89
+ .variant=${IntegrationButtonVariant.flat}
90
+ .type=${buttonType}
91
+ .readouts=${readouts}
92
+ .hasStatus=${showStatus}
93
+ ?selected=${false}
94
+ ?activated=${false}
95
+ ?dividerRight=${shouldShowDividerRight(0)}
96
+ @click=${(e: Event) => onIntegrationButtonClick(e, 0)}
97
+ slot=${slotName}
98
+ >
99
+ <obi-ship slot="leading-icon"></obi-ship>
100
+ <span slot="label"
101
+ >${shortNames ? makeStringShorter('Boat', 2) : 'Boat'}</span
102
+ >
103
+ <div slot="info-label">Info Label</div>
104
+ <div slot="info-status">Info Status</div>
105
+ <div slot="status">Status</div>
106
+ ${showIntegrationMenu
107
+ ? html`<obc-integration-vessel-menu
108
+ slot="integration-vessel-menu"
109
+ numberOfButtons="2"
110
+ @button1-click=${() => console.log('Boat Button 1 clicked')}
111
+ @button2-click=${() => console.log('Boat Button 2 clicked')}
112
+ ><span slot="title">Boat</span
113
+ ><obi-placeholder slot="button-1-leading-icon"></obi-placeholder>
114
+ <div slot="button-1-label">Select</div>
115
+ <obi-placeholder slot="button-2-leading-icon"></obi-placeholder>
116
+ <div slot="button-2-label">Dismiss</div>
117
+ <div slot="content" style="padding: 24px;">
118
+ <p>Boat is working just fine.</p>
119
+ </div></obc-integration-vessel-menu
120
+ >`
121
+ : nothing}
122
+ </obc-integration-button>
123
+ <obc-integration-button
124
+ hasLeadingIcon
125
+ style=${button2styling}
126
+ .variant=${IntegrationButtonVariant.flat}
127
+ .type=${buttonType}
128
+ .readouts=${readouts}
129
+ .hasStatus=${showStatus}
130
+ ?selected=${false}
131
+ ?activated=${false}
132
+ ?dividerRight=${shouldShowDividerRight(1)}
133
+ @click=${(e: Event) => onIntegrationButtonClick(e, 1)}
134
+ slot=${slotName}
135
+ >
136
+ <obi-ship slot="leading-icon"></obi-ship>
137
+ <span slot="label"
138
+ >${shortNames ? makeStringShorter('Space Ship', 2) : 'Space Ship'}</span
139
+ >
140
+ <div slot="info-label">Info Label</div>
141
+ <div slot="info-status">Info Status</div>
142
+ <div slot="status">Status</div>
143
+ ${showIntegrationMenu
144
+ ? html`<obc-integration-vessel-menu
145
+ slot="integration-vessel-menu"
146
+ numberOfButtons="2"
147
+ @button1-click=${() => console.log('Space Ship Button 1 clicked')}
148
+ @button2-click=${() => console.log('Space Ship Button 2 clicked')}
149
+ ><span slot="title">Space Ship</span
150
+ ><obi-placeholder slot="button-1-leading-icon"></obi-placeholder>
151
+ <div slot="button-1-label">Select</div>
152
+ <obi-placeholder slot="button-2-leading-icon"></obi-placeholder>
153
+ <div slot="button-2-label">Dismiss</div>
154
+ <div slot="content" style="padding: 24px;">
155
+ <p>Space Ship is working just fine.</p>
156
+ </div></obc-integration-vessel-menu
157
+ >`
158
+ : nothing}
159
+ </obc-integration-button>
160
+ <obc-integration-button
161
+ hasLeadingIcon
162
+ style=${button3styling}
163
+ .variant=${IntegrationButtonVariant.flat}
164
+ .type=${buttonType}
165
+ .readouts=${readouts}
166
+ .hasStatus=${showStatus}
167
+ ?selected=${false}
168
+ ?activated=${true}
169
+ ?dividerRight=${shouldShowDividerRight(2)}
170
+ @click=${(e: Event) => onIntegrationButtonClick(e, 2)}
171
+ slot=${slotName}
172
+ >
173
+ <obi-ship slot="leading-icon"></obi-ship>
174
+ <span slot="label"
175
+ >${shortNames ? makeStringShorter('Vessel', 2) : 'Vessel'}</span
176
+ >
177
+ <div slot="info-label">Info Label</div>
178
+ <div slot="info-status">Info Status</div>
179
+ <div slot="status">Status</div>
180
+ ${showIntegrationMenu
181
+ ? html`<obc-integration-vessel-menu
182
+ slot="integration-vessel-menu"
183
+ numberOfButtons="2"
184
+ @button1-click=${() => console.log('Vessel Button 1 clicked')}
185
+ @button2-click=${() => console.log('Vessel Button 2 clicked')}
186
+ ><span slot="title">Vessel</span
187
+ ><obi-placeholder slot="button-1-leading-icon"></obi-placeholder>
188
+ <div slot="button-1-label">Select</div>
189
+ <obi-placeholder slot="button-2-leading-icon"></obi-placeholder>
190
+ <div slot="button-2-label">Dismiss</div>
191
+ <div slot="content" style="padding: 24px;">
192
+ <p>Vessel is working just fine.</p>
193
+ </div></obc-integration-vessel-menu
194
+ >`
195
+ : nothing}
196
+ </obc-integration-button>
197
+ <obc-integration-button
198
+ hasLeadingIcon
199
+ style=${button4styling}
200
+ .variant=${IntegrationButtonVariant.flat}
201
+ .type=${buttonType}
202
+ .readouts=${readouts}
203
+ .hasStatus=${showStatus}
204
+ ?selected=${true}
205
+ ?activated=${false}
206
+ ?dividerRight=${shouldShowDividerRight(3)}
207
+ @click=${(e: Event) => onIntegrationButtonClick(e, 3)}
208
+ slot=${slotName}
209
+ >
210
+ <obi-ship slot="leading-icon"></obi-ship>
211
+ <span slot="label"
212
+ >${shortNames ? makeStringShorter('Last', 2) : 'Last'}</span
213
+ >
214
+ <div slot="info-label">Info Label</div>
215
+ <div slot="info-status">Info Status</div>
216
+ <div slot="status">Status</div>
217
+ ${showIntegrationMenu
218
+ ? html`<obc-integration-vessel-menu
219
+ slot="integration-vessel-menu"
220
+ numberOfButtons="2"
221
+ @button1-click=${() => console.log('Last Button 1 clicked')}
222
+ @button2-click=${() => console.log('Last Button 2 clicked')}
223
+ ><span slot="title">Last</span
224
+ ><obi-placeholder slot="button-1-leading-icon"></obi-placeholder>
225
+ <div slot="button-1-label">Select</div>
226
+ <obi-placeholder slot="button-2-leading-icon"></obi-placeholder>
227
+ <div slot="button-2-label">Dismiss</div>
228
+ <div slot="content" style="padding: 24px;">
229
+ <p>Last is working just fine.</p>
230
+ </div></obc-integration-vessel-menu
231
+ >`
232
+ : nothing}
233
+ </obc-integration-button>
234
+ `;
235
+ }
236
+
237
+ const meta: Meta<IntegrationBarStoryArgs> = {
238
+ title: 'Integration Systems/Integration Bar',
239
+ tags: ['alpha'],
240
+ component: 'obc-integration-bar',
241
+ globals: {
242
+ viewport: {value: 'desktop'},
243
+ },
244
+ parameters: {
245
+ layout: 'fullscreen',
246
+ },
247
+ args: {
248
+ containerWidthPx: 1200,
249
+ showClock: true,
250
+ date: '2021-01-01T11:11:11.111Z',
251
+ clockMinimizeBreakpointPx: 600,
252
+ showDate: false,
253
+ showTimezone: false,
254
+ timeZoneOffsetHours: 1,
255
+ hideHomeButton: false,
256
+ hug: false,
257
+ rich: false,
258
+ showLinkButton: false,
259
+ linkButtonActivated: false,
260
+ showUserButton: true,
261
+ userButtonActivated: false,
262
+ showDimmingButton: true,
263
+ dimmingButtonActivated: false,
264
+ showSystemButton: true,
265
+ systemButtonActivated: false,
266
+ showScreenButton: true,
267
+ screenButtonActivated: false,
268
+ showNotificationButton: true,
269
+ notificationButtonActivated: false,
270
+ showAlertButton: true,
271
+ alertButtonActivated: false,
272
+ showVesselIntegrationMenu: false,
273
+ showStatus: false,
274
+ fleetButtonSelected: false,
275
+ fleetButtonActivated: false,
276
+ fleetButtonLabel: 'Fleet',
277
+ makeLabelNamesShort: false,
278
+ showIntegrationMenu: false,
279
+ customSelectedColors: false,
280
+ },
281
+ argTypes: {
282
+ containerWidthPx: {
283
+ control: {type: 'number'},
284
+ },
285
+ showDate: {
286
+ control: {type: 'boolean'},
287
+ },
288
+ showVesselIntegrationMenu: {
289
+ control: {type: 'boolean'},
290
+ },
291
+ hug: {
292
+ control: {type: 'boolean'},
293
+ },
294
+ rich: {
295
+ control: {type: 'boolean'},
296
+ },
297
+ showIntegrationMenu: {
298
+ control: {type: 'boolean'},
299
+ },
300
+ customSelectedColors: {
301
+ control: {type: 'boolean'},
302
+ },
303
+ },
304
+ render: (args) => {
305
+ type IntegrationButtonElement = HTMLElement & {
306
+ activated: boolean;
307
+ selected: boolean;
308
+ dividerRight: boolean;
309
+ };
310
+
311
+ const integrationButtonCount = 4;
312
+ // Track click phase for each button (0: both false, 1: activated true, 2: selected true)
313
+ const buttonStates: Map<number, number> = new Map([
314
+ [0, 0], // button 1
315
+ [1, 0], // button 2
316
+ [2, 1], // button 3 (currently activated=true)
317
+ [3, 2], // button 4 (currently selected=true)
318
+ ]);
319
+
320
+ const isActivatedOrSelected = (phase: number): boolean => {
321
+ return phase === 1 || phase === 2;
322
+ };
323
+
324
+ const shouldShowDividerRight = (buttonIndex: number): boolean => {
325
+ if (buttonIndex >= integrationButtonCount - 1) {
326
+ return false;
327
+ }
328
+ const currentPhase = buttonStates.get(buttonIndex) ?? 0;
329
+ const rightPhase = buttonStates.get(buttonIndex + 1) ?? 0;
330
+
331
+ return (
332
+ !isActivatedOrSelected(currentPhase) &&
333
+ !isActivatedOrSelected(rightPhase)
334
+ );
335
+ };
336
+
337
+ const updateIntegrationButtonDividers = (
338
+ button: IntegrationButtonElement
339
+ ) => {
340
+ const integrationBar = button.closest('obc-integration-bar');
341
+ if (!integrationBar) {
342
+ return;
343
+ }
344
+
345
+ const integrationButtons = Array.from(
346
+ integrationBar.querySelectorAll<IntegrationButtonElement>(
347
+ 'obc-integration-button[slot="integration-buttons"], obc-integration-button[slot="hug-buttons"]'
348
+ )
349
+ );
350
+
351
+ integrationButtons.forEach((integrationButton, index) => {
352
+ integrationButton.dividerRight = shouldShowDividerRight(index);
353
+ });
354
+ };
355
+
356
+ const onIntegrationButtonClick = (event: Event, buttonIndex: number) => {
357
+ const button = event.currentTarget as IntegrationButtonElement;
358
+ let phase = buttonStates.get(buttonIndex) ?? 0;
359
+
360
+ // Cycle: 0 → 1 → 2 → 0
361
+ phase = (phase + 1) % 3;
362
+ buttonStates.set(buttonIndex, phase);
363
+
364
+ const isActivated = phase === 1;
365
+ const isSelected = phase === 2;
366
+
367
+ button.activated = isActivated;
368
+ button.selected = isSelected;
369
+ updateIntegrationButtonDividers(button);
370
+ };
371
+
372
+ const onFleetButtonClick = (event: Event) => {
373
+ const integrationBar = event.currentTarget as ObcIntegrationBar;
374
+ if (integrationBar.fleetButtonActivated == true) {
375
+ integrationBar.fleetButtonActivated = false;
376
+ integrationBar.fleetButtonSelected = true;
377
+ } else if (integrationBar.fleetButtonSelected == true) {
378
+ integrationBar.fleetButtonSelected = false;
379
+ integrationBar.fleetButtonActivated = false;
380
+ } else {
381
+ integrationBar.fleetButtonActivated = true;
382
+ }
383
+ };
384
+
385
+ const wrapperStyle = args.showIntegrationMenu
386
+ ? 'width: 100%; min-height: 400px; overflow-x: auto; overflow-y: visible;'
387
+ : 'width: 100%; overflow-x: auto;';
388
+
389
+ return html` <div style=${wrapperStyle}>
390
+ <div style=${`width: ${args.containerWidthPx}px;`}>
391
+ <obc-integration-bar
392
+ showFleetButton=${true}
393
+ style="width: 100%;"
394
+ @fleet-button-click=${onFleetButtonClick}
395
+ .hideHomeButton=${args.hideHomeButton}
396
+ .showLinkButton=${args.showLinkButton}
397
+ .linkButtonActivated=${args.linkButtonActivated}
398
+ .showClock=${args.showClock}
399
+ .showUserButton=${args.showUserButton}
400
+ .userButtonActivated=${args.userButtonActivated}
401
+ .showDimmingButton=${args.showDimmingButton}
402
+ .dimmingButtonActivated=${args.dimmingButtonActivated}
403
+ .showSystemButton=${args.showSystemButton}
404
+ .systemButtonActivated=${args.systemButtonActivated}
405
+ .showAlertButton=${args.showAlertButton}
406
+ .alertButtonActivated=${args.alertButtonActivated}
407
+ .showScreenButton=${args.showScreenButton}
408
+ .screenButtonActivated=${args.screenButtonActivated}
409
+ .showNotificationButton=${args.showNotificationButton}
410
+ .notificationButtonActivated=${args.notificationButtonActivated}
411
+ .fleetButtonSelected=${args.fleetButtonSelected}
412
+ .fleetButtonActivated=${args.fleetButtonActivated}
413
+ .fleetButtonLabel=${args.fleetButtonLabel}
414
+ >
415
+ <obc-clock
416
+ integrationBarMode
417
+ .date=${args.date}
418
+ .showDate=${args.showDate}
419
+ slot="clock"
420
+ .showTimezone=${args.showTimezone}
421
+ .timeZoneOffsetHours=${args.timeZoneOffsetHours}
422
+ .blinkOnlyBreakpointPx=${args.clockMinimizeBreakpointPx}
423
+ ></obc-clock>
424
+
425
+ ${renderIntegrationButtons({
426
+ onIntegrationButtonClick,
427
+ shortNames: args.makeLabelNamesShort,
428
+ hug: args.hug,
429
+ rich: args.rich,
430
+ shouldShowDividerRight,
431
+ showStatus: args.showStatus,
432
+ showIntegrationMenu: args.showIntegrationMenu,
433
+ customSelectedColors: args.customSelectedColors,
434
+ })}
435
+ </obc-integration-bar>
436
+ </div>
437
+ </div>`;
438
+ },
439
+ } satisfies Meta<IntegrationBarStoryArgs>;
440
+
441
+ export default meta;
442
+ type Story = StoryObj<IntegrationBarStoryArgs>;
443
+
444
+ export const Primary: Story = {
445
+ args: {},
446
+ };
447
+
448
+ export const WithStatus: Story = {
449
+ args: {
450
+ showStatus: true,
451
+ },
452
+ };
453
+
454
+ export const Hug: Story = {
455
+ args: {
456
+ hug: true,
457
+ makeLabelNamesShort: true,
458
+ },
459
+ };
460
+
461
+ export const Rich: Story = {
462
+ args: {
463
+ makeLabelNamesShort: false,
464
+ rich: true,
465
+ containerWidthPx: 1920,
466
+ },
467
+ };
468
+
469
+ export const WithIntegrationMenu: Story = {
470
+ args: {
471
+ showIntegrationMenu: true,
472
+ },
473
+ };
474
+
475
+ export const CustomSelectedColors: Story = {
476
+ args: {
477
+ customSelectedColors: true,
478
+ },
479
+ };