@oicl/openbridge-webcomponents 2.0.0-next.101 → 2.0.0-next.103
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.
- package/bundle/openbridge-webcomponents.bundle.js +580 -143
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +629 -407
- package/dist/bars-graphs/donut-chart/donut-chart.d.ts +18 -16
- package/dist/bars-graphs/donut-chart/donut-chart.d.ts.map +1 -1
- package/dist/bars-graphs/donut-chart/donut-chart.js.map +1 -1
- package/dist/bars-graphs/pie-chart/pie-chart.d.ts +14 -12
- package/dist/bars-graphs/pie-chart/pie-chart.d.ts.map +1 -1
- package/dist/bars-graphs/pie-chart/pie-chart.js.map +1 -1
- package/dist/bars-graphs/polar-chart/polar-chart.d.ts +19 -16
- package/dist/bars-graphs/polar-chart/polar-chart.d.ts.map +1 -1
- package/dist/bars-graphs/polar-chart/polar-chart.js.map +1 -1
- package/dist/bars-graphs/radial-bar-chart/radial-bar-chart.d.ts +8 -8
- package/dist/bars-graphs/radial-bar-chart/radial-bar-chart.d.ts.map +1 -1
- package/dist/bars-graphs/radial-bar-chart/radial-bar-chart.js.map +1 -1
- package/dist/building-blocks/chart-line/chart-line-base.d.ts +8 -25
- package/dist/building-blocks/chart-line/chart-line-base.d.ts.map +1 -1
- package/dist/building-blocks/chart-line/chart-line-base.js.map +1 -1
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts +22 -2
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts.map +1 -1
- package/dist/building-blocks/instrument-radial/instrument-radial.js +61 -37
- package/dist/building-blocks/instrument-radial/instrument-radial.js.map +1 -1
- package/dist/integration-systems/integration-bar/integration-bar.d.ts +20 -24
- package/dist/integration-systems/integration-bar/integration-bar.d.ts.map +1 -1
- package/dist/integration-systems/integration-bar/integration-bar.js.map +1 -1
- package/dist/integration-systems/integration-button/integration-button.d.ts +15 -13
- package/dist/integration-systems/integration-button/integration-button.d.ts.map +1 -1
- package/dist/integration-systems/integration-button/integration-button.js.map +1 -1
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.d.ts +14 -0
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.d.ts.map +1 -1
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.js +30 -11
- package/dist/navigation-instruments/azimuth-thruster/azimuth-thruster.js.map +1 -1
- package/dist/navigation-instruments/compass/compass.d.ts +68 -31
- package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/compass.js +36 -16
- package/dist/navigation-instruments/compass/compass.js.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts +8 -9
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.js.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js +34 -2
- package/dist/navigation-instruments/gauge-radial/gauge-radial.css.js.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts +15 -0
- package/dist/navigation-instruments/gauge-radial/gauge-radial.d.ts.map +1 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js +35 -1
- package/dist/navigation-instruments/gauge-radial/gauge-radial.js.map +1 -1
- package/dist/navigation-instruments/gauge-trend/gauge-trend.d.ts +0 -5
- package/dist/navigation-instruments/gauge-trend/gauge-trend.d.ts.map +1 -1
- package/dist/navigation-instruments/gauge-trend/gauge-trend.js.map +1 -1
- package/dist/navigation-instruments/graph-mini/graph-mini.d.ts +1 -1
- package/dist/navigation-instruments/graph-mini/graph-mini.d.ts.map +1 -1
- package/dist/navigation-instruments/graph-mini/graph-mini.js.map +1 -1
- package/dist/navigation-instruments/heading/heading.d.ts +19 -1
- package/dist/navigation-instruments/heading/heading.d.ts.map +1 -1
- package/dist/navigation-instruments/heading/heading.js +34 -16
- package/dist/navigation-instruments/heading/heading.js.map +1 -1
- package/dist/navigation-instruments/indicator-graph/indicator-graph.d.ts +1 -1
- package/dist/navigation-instruments/indicator-graph/indicator-graph.d.ts.map +1 -1
- package/dist/navigation-instruments/indicator-graph/indicator-graph.js.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.d.ts +15 -2
- package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.js +36 -26
- package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.d.ts +15 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.d.ts.map +1 -1
- package/dist/navigation-instruments/speed-gauge/speed-gauge.js +31 -3
- package/dist/navigation-instruments/speed-gauge/speed-gauge.js.map +1 -1
- package/dist/navigation-instruments/watch/watch.d.ts +45 -17
- package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/watch.js +53 -38
- package/dist/navigation-instruments/watch/watch.js.map +1 -1
- package/dist/svghelpers/radial-frame.d.ts +122 -0
- package/dist/svghelpers/radial-frame.d.ts.map +1 -0
- package/dist/svghelpers/radial-frame.js +259 -0
- package/dist/svghelpers/radial-frame.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
1
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
2
2
|
import { AdviceType } from '../../navigation-instruments/watch/advice.js';
|
|
3
3
|
import { Tickmark, TickmarkStyle } from '../../navigation-instruments/watch/tickmark.js';
|
|
4
4
|
import { InstrumentState, Priority } from '../../navigation-instruments/types.js';
|
|
5
|
+
import { RadialFrame } from '../../svghelpers/radial-frame.js';
|
|
5
6
|
export declare enum ObcGaugeRadialType {
|
|
6
7
|
filled = "filled",
|
|
7
8
|
bar = "bar",
|
|
@@ -15,6 +16,9 @@ export interface GaugeRadialAdvice {
|
|
|
15
16
|
}
|
|
16
17
|
declare const ObcInstrumentRadial_base: (new (...args: any[]) => import('../../svghelpers/setpoint-mixin.js').SetpointMixinInterface) & typeof LitElement;
|
|
17
18
|
/**
|
|
19
|
+
* @fires frame-changed {CustomEvent<RadialFrame>} Fired after render when the
|
|
20
|
+
* computed radial frame changed (viewBox, label visibility, or pinned host
|
|
21
|
+
* size). Wrappers use it to align sibling overlays/readouts with the dial.
|
|
18
22
|
* @experimental
|
|
19
23
|
*/
|
|
20
24
|
export declare class ObcInstrumentRadial extends ObcInstrumentRadial_base {
|
|
@@ -64,8 +68,24 @@ export declare class ObcInstrumentRadial extends ObcInstrumentRadial_base {
|
|
|
64
68
|
*/
|
|
65
69
|
endLabelsMaxMin: boolean;
|
|
66
70
|
zoomToFitArc: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Outer-ring diameter in CSS pixels. When set, the instrument renders at a
|
|
73
|
+
* fixed intrinsic size derived from the ring, arc shape and label reserve —
|
|
74
|
+
* so instruments sharing the same value have identical ring circumference
|
|
75
|
+
* regardless of label width or arc extent (like obc-donut-chart's
|
|
76
|
+
* fixedHeight). When unset (default), the instrument fills its container.
|
|
77
|
+
*/
|
|
78
|
+
faceDiameter: number | undefined;
|
|
67
79
|
private _radiusOffset;
|
|
68
|
-
private
|
|
80
|
+
private _frame;
|
|
81
|
+
private _lastFrameKey;
|
|
82
|
+
private _resizeController;
|
|
83
|
+
firstUpdated(changed: PropertyValues): void;
|
|
84
|
+
/** The frame computed for the current render (viewBox, label reserve …). */
|
|
85
|
+
get frame(): RadialFrame | undefined;
|
|
86
|
+
/** Whether the host size styles were set by applyPinnedHostSize. */
|
|
87
|
+
private _hostSizePinned;
|
|
88
|
+
updated(changed: PropertyValues): void;
|
|
69
89
|
private get clampedValue();
|
|
70
90
|
private get minAngle();
|
|
71
91
|
private get maxAngle();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-radial.d.ts","sourceRoot":"","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,UAAU,EAAqB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument-radial.d.ts","sourceRoot":"","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { LitElement, html, nothing, svg, css } from "lit";
|
|
2
2
|
import { property } from "lit/decorators.js";
|
|
3
|
+
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
3
4
|
import { customElement } from "../../decorator.js";
|
|
4
5
|
import { AdviceState } from "../../navigation-instruments/watch/advice.js";
|
|
5
|
-
import { WatchCircleType, innerRingRadiusFor
|
|
6
|
+
import { WatchCircleType, innerRingRadiusFor } from "../../navigation-instruments/watch/watch.js";
|
|
6
7
|
import { TickmarkStyle, TickmarkType } from "../../navigation-instruments/watch/tickmark.js";
|
|
7
8
|
import { InstrumentState, Priority } from "../../navigation-instruments/types.js";
|
|
8
9
|
import { SetpointMixin } from "../../svghelpers/setpoint-mixin.js";
|
|
9
|
-
import {
|
|
10
|
+
import { observeInnerBox, applyPinnedHostSize, computeRadialFrame, END_MAXMIN_LABEL_DROP_PX, SIDE_LABEL_DROP_PX, measureContainerPx, estimateLabelWidthPx } from "../../svghelpers/radial-frame.js";
|
|
10
11
|
var __defProp = Object.defineProperty;
|
|
11
12
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
13
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -17,7 +18,6 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
17
18
|
if (kind && result) __defProp(target, key, result);
|
|
18
19
|
return result;
|
|
19
20
|
};
|
|
20
|
-
const WATCH_DEFAULT_VIEWBOX = 448;
|
|
21
21
|
var ObcGaugeRadialType = /* @__PURE__ */ ((ObcGaugeRadialType2) => {
|
|
22
22
|
ObcGaugeRadialType2["filled"] = "filled";
|
|
23
23
|
ObcGaugeRadialType2["bar"] = "bar";
|
|
@@ -92,6 +92,36 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
92
92
|
this.endLabelsMaxMin = false;
|
|
93
93
|
this.zoomToFitArc = false;
|
|
94
94
|
this._radiusOffset = 0;
|
|
95
|
+
this._lastFrameKey = "";
|
|
96
|
+
this._resizeController = new ResizeController(this, {});
|
|
97
|
+
this._hostSizePinned = false;
|
|
98
|
+
}
|
|
99
|
+
firstUpdated(changed) {
|
|
100
|
+
super.firstUpdated(changed);
|
|
101
|
+
observeInnerBox(this._resizeController, this.renderRoot);
|
|
102
|
+
}
|
|
103
|
+
/** The frame computed for the current render (viewBox, label reserve …). */
|
|
104
|
+
get frame() {
|
|
105
|
+
return this._frame;
|
|
106
|
+
}
|
|
107
|
+
updated(changed) {
|
|
108
|
+
super.updated(changed);
|
|
109
|
+
this._hostSizePinned = applyPinnedHostSize(
|
|
110
|
+
this,
|
|
111
|
+
this._frame,
|
|
112
|
+
this._hostSizePinned
|
|
113
|
+
);
|
|
114
|
+
const frame = this._frame;
|
|
115
|
+
if (!frame) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const key = `${frame.viewBox}|${frame.labelsHidden}|${frame.hostWidthPx ?? ""}|${frame.hostHeightPx ?? ""}`;
|
|
119
|
+
if (key !== this._lastFrameKey) {
|
|
120
|
+
this._lastFrameKey = key;
|
|
121
|
+
this.dispatchEvent(
|
|
122
|
+
new CustomEvent("frame-changed", { detail: frame })
|
|
123
|
+
);
|
|
124
|
+
}
|
|
95
125
|
}
|
|
96
126
|
get clampedValue() {
|
|
97
127
|
const lowerBound = Math.min(this.minValue, this.maxValue);
|
|
@@ -158,31 +188,28 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
158
188
|
}
|
|
159
189
|
];
|
|
160
190
|
const watchCircleType = this.type === "needle" ? WatchCircleType.single : WatchCircleType.double;
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.
|
|
174
|
-
|
|
175
|
-
this.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const top = -full / 2 + full * clips.top / 100;
|
|
184
|
-
viewBox = `${left} ${top} ${w} ${h}`;
|
|
185
|
-
}
|
|
191
|
+
const tickmarks = this.tickmarks;
|
|
192
|
+
const hasHorizontalEndLabels = tickmarks.some((t) => {
|
|
193
|
+
if (t.text === void 0) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const angle = (t.angle % 360 + 360) % 360;
|
|
197
|
+
return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;
|
|
198
|
+
});
|
|
199
|
+
const frame = computeRadialFrame({
|
|
200
|
+
basePadding: 48,
|
|
201
|
+
labelWidthPx: this.tickmarksInside ? 0 : estimateLabelWidthPx(tickmarks.map((t) => t.text)),
|
|
202
|
+
labelDropPx: this.tickmarksInside || !hasHorizontalEndLabels ? 0 : this.endLabelsMaxMin ? END_MAXMIN_LABEL_DROP_PX : SIDE_LABEL_DROP_PX,
|
|
203
|
+
clips: this.zoomToFitArc ? void 0 : this.safeClips,
|
|
204
|
+
containerPx: measureContainerPx(this),
|
|
205
|
+
faceDiameter: this.faceDiameter,
|
|
206
|
+
zoomToFitArc: this.zoomToFitArc,
|
|
207
|
+
areas,
|
|
208
|
+
innerRadius: innerRingRadiusFor(watchCircleType)
|
|
209
|
+
});
|
|
210
|
+
this._radiusOffset = frame.radiusOffset;
|
|
211
|
+
this._frame = frame;
|
|
212
|
+
const shownTickmarks = frame.labelsHidden ? tickmarks.map((t) => ({ ...t, text: void 0 })) : tickmarks;
|
|
186
213
|
return html`
|
|
187
214
|
<div class="container">
|
|
188
215
|
<obc-watch
|
|
@@ -194,23 +221,17 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
194
221
|
.angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}
|
|
195
222
|
.setpointOverride=${this.setpointOverride}
|
|
196
223
|
.animateSetpoint=${this.animateSetpoint}
|
|
197
|
-
.
|
|
198
|
-
.tickmarks=${this.tickmarks}
|
|
224
|
+
.tickmarks=${shownTickmarks}
|
|
199
225
|
.tickmarksInside=${this.tickmarksInside}
|
|
200
226
|
.tickmarkStyle=${this.tickmarkStyle}
|
|
201
227
|
.advices=${this._advices}
|
|
202
228
|
.areas=${areas}
|
|
203
229
|
.watchCircleType=${watchCircleType}
|
|
204
230
|
.barAreas=${barAreas}
|
|
205
|
-
.clipTop=${this.zoomToFitArc ? 0 : clips.top}
|
|
206
|
-
.clipBottom=${this.zoomToFitArc ? 0 : clips.bottom}
|
|
207
|
-
.clipLeft=${this.zoomToFitArc ? 0 : clips.left}
|
|
208
|
-
.clipRight=${this.zoomToFitArc ? 0 : clips.right}
|
|
209
231
|
.endLabelsMaxMin=${this.endLabelsMaxMin}
|
|
210
|
-
.
|
|
211
|
-
.arcFrame=${this._arcFrame}
|
|
232
|
+
.arcFrame=${frame}
|
|
212
233
|
></obc-watch>
|
|
213
|
-
<svg class="gauge-radial" viewBox=${viewBox}>${this._needle}</svg>
|
|
234
|
+
<svg class="gauge-radial" viewBox=${frame.viewBox}>${this._needle}</svg>
|
|
214
235
|
</div>
|
|
215
236
|
`;
|
|
216
237
|
}
|
|
@@ -434,6 +455,9 @@ __decorateClass([
|
|
|
434
455
|
__decorateClass([
|
|
435
456
|
property({ type: Boolean })
|
|
436
457
|
], ObcInstrumentRadial.prototype, "zoomToFitArc", 2);
|
|
458
|
+
__decorateClass([
|
|
459
|
+
property({ type: Number, attribute: "face-diameter" })
|
|
460
|
+
], ObcInstrumentRadial.prototype, "faceDiameter", 2);
|
|
437
461
|
ObcInstrumentRadial = __decorateClass([
|
|
438
462
|
customElement("obc-instrument-radial")
|
|
439
463
|
], ObcInstrumentRadial);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-radial.js","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"sourcesContent":["import {css, LitElement, html, svg, nothing} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport {\n AdviceState,\n AdviceType,\n AngleAdviceRaw,\n} from '../../navigation-instruments/watch/advice.js';\nimport {WatchCircleType} from '../../navigation-instruments/watch/watch.js';\nimport {Tickmark} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkType} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkStyle} from '../../navigation-instruments/watch/tickmark.js';\nimport {InstrumentState, Priority} from '../../navigation-instruments/types.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {\n OUTER_RING_RADIUS,\n innerRingRadiusFor,\n} from '../../navigation-instruments/watch/watch.js';\nimport {\n computeZoomToFitArcFrame,\n type ZoomToFitArcFrame,\n} from '../../svghelpers/arc-frame.js';\n\n// Must match obc-watch's un-zoomed viewBox `(176 + getPadding()) * 2`\n// (default padding 48 → 448); instrument-radial overlays obc-watch 1:1.\nconst WATCH_DEFAULT_VIEWBOX = 448;\n\nexport enum ObcGaugeRadialType {\n filled = 'filled',\n bar = 'bar',\n needle = 'needle',\n}\n\nexport interface GaugeRadialAdvice {\n minValue: number;\n maxValue: number;\n type: AdviceType;\n hinted: boolean;\n}\n\nconst NEEDLE_TIP_RADIUS = 160;\nconst NEEDLE_TIP_GAP = 5; // tip stops this far short of the scale\nconst NEEDLE_WIDTH = 8;\nconst NEEDLE_HUB_RADIUS = 16;\n\nfunction rangeIncludesZero(minValue: number, maxValue: number): boolean {\n return minValue <= 0 && maxValue >= 0;\n}\n\nfunction strongerTickmarkType(\n existing: TickmarkType,\n candidate: TickmarkType\n): TickmarkType {\n const priority: Record<TickmarkType, number> = {\n [TickmarkType.zeroLineThick]: 6,\n [TickmarkType.zeroLine]: 5,\n [TickmarkType.main]: 4,\n [TickmarkType.primary]: 3,\n [TickmarkType.secondary]: 2,\n [TickmarkType.tertiary]: 1,\n [TickmarkType.textOnly]: 0,\n };\n\n return priority[candidate] > priority[existing] ? candidate : existing;\n}\n\ninterface Clips {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/** Clamp a clip percentage to [0, 100]; non-finite returns 0. */\nfunction clampClipPercent(n: number): number {\n return Number.isFinite(n) ? Math.min(Math.max(n, 0), 100) : 0;\n}\n\n/**\n * Clamp the four clips to [0, 100] and drop any opposite pair that would\n * collapse the viewBox (sum >= 100), so a bad clip can't produce a zero- or\n * negative-size box. Valid clips pass through unchanged.\n */\nfunction normalizeClips(clips: Clips): Clips {\n let top = clampClipPercent(clips.top);\n let bottom = clampClipPercent(clips.bottom);\n let left = clampClipPercent(clips.left);\n let right = clampClipPercent(clips.right);\n if (top + bottom >= 100) {\n top = 0;\n bottom = 0;\n }\n if (left + right >= 100) {\n left = 0;\n right = 0;\n }\n return {top, bottom, left, right};\n}\n\n/**\n * Fallback value-to-angle mapping when no `getAngle` is supplied: linear over\n * the historical 270° sweep (-135 to 135). Returns -135 for a non-positive or\n * non-finite span.\n */\nfunction defaultGaugeAngle(\n value: number,\n minValue: number,\n maxValue: number\n): number {\n const span = maxValue - minValue;\n if (!Number.isFinite(span) || span <= 0) {\n return -135;\n }\n return ((value - minValue) / span) * 270 - 135;\n}\n\n/**\n * @experimental\n */\n@customElement('obc-instrument-radial')\nexport class ObcInstrumentRadial extends SetpointMixin(LitElement) {\n // setpoint, newSetpoint, atSetpoint, touching, autoAtSetpoint,\n // autoAtSetpointDeadband, setpointAtZeroDeadband, setpointOverride\n // — all inherited from SetpointMixin\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n @property({type: Number}) value = 0;\n @property({type: Number}) maxValue = 100;\n @property({type: Number}) minValue = 0;\n @property({attribute: false}) getAngle!: (v: number) => number;\n /** @availableWhen type!=filled */\n @property({type: String}) needleColor: string | undefined;\n /** @availableWhen type!=needle */\n @property({type: String}) barColor: string | undefined;\n @property({type: Boolean}) showLabels: boolean = false;\n /**\n * Interval for primary tickmarks in value units.\n * When undefined or <= 0, no primary tickmarks are shown.\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 50;\n /**\n * Interval for secondary tickmarks in value units.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined = 10;\n /**\n * Interval for tertiary tickmarks in value units.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: String}) type: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: String}) needleType: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Array, attribute: false}) advices: GaugeRadialAdvice[] = [];\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipTop: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipLeft: number = 0; // in percent of width\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipRight: number = 0; // in percent of width\n /**\n * Place the horizontal end labels (±90°, e.g. min/max) below the tick instead\n * of beside it — the \"Max-min\" placement from the radial label model\n * (External / Internal / Max-min). See PR #903 / design discussion.\n */\n @property({type: Boolean}) endLabelsMaxMin: boolean = false;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n\n private _radiusOffset = 0;\n private _arcFrame: ZoomToFitArcFrame | undefined;\n\n private get clampedValue(): number {\n const lowerBound = Math.min(this.minValue, this.maxValue);\n const upperBound = Math.max(this.minValue, this.maxValue);\n return Math.max(lowerBound, Math.min(this.value, upperBound));\n }\n\n private get minAngle(): number {\n return this.mapAngle(this.minValue);\n }\n\n private get maxAngle(): number {\n return this.mapAngle(this.maxValue);\n }\n\n // Map a value to an angle via the consumer's `getAngle`, guarding a missing\n // or non-finite mapping so a misconfigured consumer can't emit NaN geometry.\n private mapAngle(value: number): number {\n const fn = this.getAngle;\n const angle =\n typeof fn === 'function'\n ? fn(value)\n : defaultGaugeAngle(value, this.minValue, this.maxValue);\n return Number.isFinite(angle) ? angle : 0;\n }\n\n // Clamped clips, reused for the overlay viewBox and the clips forwarded to\n // obc-watch.\n private get safeClips(): Clips {\n return normalizeClips({\n top: this.clipTop,\n bottom: this.clipBottom,\n left: this.clipLeft,\n right: this.clipRight,\n });\n }\n\n private get _derivedNeedleColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get _derivedBarColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n if (this.type === ObcGaugeRadialType.filled) {\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n override render() {\n const barColor = this.barColor ?? this._derivedBarColor;\n const barStartValue = Math.max(this.minValue, Math.min(0, this.maxValue));\n const value = this.clampedValue;\n const setpointAngle =\n this.setpoint !== undefined ? this.mapAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.mapAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.mapAngle(barStartValue),\n endAngle: this.mapAngle(value),\n fillColor: barColor,\n },\n ];\n\n const areas = [\n {\n startAngle: this.minAngle,\n endAngle: this.maxAngle,\n roundInsideCut: true,\n roundOutsideCut: true,\n },\n ];\n\n const watchCircleType =\n this.type === ObcGaugeRadialType.needle\n ? WatchCircleType.single\n : WatchCircleType.double;\n\n const clips = this.safeClips;\n let viewBox: string;\n if (this.zoomToFitArc) {\n const ext = 48;\n const targetSize = (176 + ext) * 2;\n const frame = computeZoomToFitArcFrame({\n areas,\n outerRadius: OUTER_RING_RADIUS,\n innerRadius: innerRingRadiusFor(watchCircleType),\n extension: ext,\n targetSize,\n });\n this._radiusOffset = frame.radiusOffset;\n viewBox = frame.viewBox;\n this._arcFrame = frame;\n } else {\n this._radiusOffset = 0;\n this._arcFrame = undefined;\n const full = WATCH_DEFAULT_VIEWBOX;\n const w = full * (1 - clips.left / 100 - clips.right / 100);\n const h = full * (1 - clips.top / 100 - clips.bottom / 100);\n const left = -full / 2 + (full * clips.left) / 100;\n const top = -full / 2 + (full * clips.top) / 100;\n viewBox = `${left} ${top} ${w} ${h}`;\n }\n\n return html`\n <div class=\"container\">\n <obc-watch\n .state=${this.state}\n .priority=${this.priority}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.computeAtSetpoint(value)}\n .angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}\n .setpointOverride=${this.setpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .padding=${48}\n .tickmarks=${this.tickmarks}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n .advices=${this._advices}\n .areas=${areas}\n .watchCircleType=${watchCircleType}\n .barAreas=${barAreas}\n .clipTop=${this.zoomToFitArc ? 0 : clips.top}\n .clipBottom=${this.zoomToFitArc ? 0 : clips.bottom}\n .clipLeft=${this.zoomToFitArc ? 0 : clips.left}\n .clipRight=${this.zoomToFitArc ? 0 : clips.right}\n .endLabelsMaxMin=${this.endLabelsMaxMin}\n .zoomToFitArc=${this.zoomToFitArc}\n .arcFrame=${this._arcFrame}\n ></obc-watch>\n <svg class=\"gauge-radial\" viewBox=${viewBox}>${this._needle}</svg>\n </div>\n `;\n }\n\n private get _needle() {\n if (this.type === ObcGaugeRadialType.filled) {\n return nothing;\n }\n const needleColor = this.needleColor ?? this._derivedNeedleColor;\n const rOff = this._radiusOffset;\n const value = this.clampedValue;\n if (this.type === ObcGaugeRadialType.needle) {\n // Rod runs from the value tip down to the center hub. Width is constant;\n // the tip shifts outward additively under zoom.\n const tipY = 256 - (NEEDLE_TIP_RADIUS - NEEDLE_TIP_GAP) - rOff;\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n <rect x=\"${256 - NEEDLE_WIDTH / 2}\" y=\"${tipY}\" width=\"${NEEDLE_WIDTH}\" height=\"${256 - tipY}\" rx=\"${NEEDLE_WIDTH / 2}\" fill=${needleColor} stroke=${needleColor}/>\n <circle cx=\"256\" cy=\"256\" r=\"${NEEDLE_HUB_RADIUS}\" fill=${needleColor}/>\n </g>\n`;\n } else {\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n<rect x=\"252\" y=\"${96 - rOff}\" width=\"8\" height=\"48\" rx=\"4\" fill=${needleColor} stroke=\"var(--border-silhouette-color)\"/>\n</g>\n `;\n }\n }\n\n get tickmarks(): Tickmark[] {\n const tickmarksByValue = new Map<number, Tickmark>();\n const normalizeValue = (value: number) =>\n Math.abs(value) < 1e-9 ? 0 : Number(value.toFixed(6));\n\n const upsertTickmark = (\n value: number,\n type: TickmarkType,\n text?: string\n ) => {\n if (\n !Number.isFinite(value) ||\n value < this.minValue ||\n value > this.maxValue\n ) {\n return;\n }\n\n const normalizedValue = normalizeValue(value);\n const existing = tickmarksByValue.get(normalizedValue);\n if (existing) {\n existing.type = strongerTickmarkType(existing.type, type);\n if (text !== undefined) {\n existing.text = text;\n }\n return;\n }\n\n tickmarksByValue.set(normalizedValue, {\n angle: this.mapAngle(normalizedValue),\n type,\n text,\n });\n };\n\n const addTickmarksAtInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (\n interval === undefined ||\n interval <= 0 ||\n !Number.isFinite(interval)\n ) {\n return;\n }\n\n const epsilon = Math.abs(interval) * 1e-6;\n const startValue =\n Math.ceil((this.minValue - epsilon) / interval) * interval;\n\n for (\n let value = startValue;\n value < this.maxValue - epsilon;\n value += interval\n ) {\n const normalizedValue = normalizeValue(value);\n if (\n normalizedValue <= this.minValue + epsilon ||\n normalizedValue >= this.maxValue - epsilon\n ) {\n continue;\n }\n\n upsertTickmark(\n normalizedValue,\n type,\n withLabels && this.showLabels ? normalizedValue.toString() : undefined\n );\n }\n };\n\n addTickmarksAtInterval(\n this.primaryTickmarkInterval,\n TickmarkType.primary,\n true\n );\n addTickmarksAtInterval(\n this.secondaryTickmarkInterval,\n TickmarkType.secondary\n );\n addTickmarksAtInterval(\n this.tertiaryTickmarkInterval,\n TickmarkType.tertiary\n );\n\n if (rangeIncludesZero(this.minValue, this.maxValue)) {\n upsertTickmark(\n 0,\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n this.showLabels ? '0' : undefined\n );\n }\n\n if (this.showLabels) {\n upsertTickmark(\n this.minValue,\n TickmarkType.textOnly,\n this.minValue.toString()\n );\n upsertTickmark(\n this.maxValue,\n TickmarkType.textOnly,\n this.maxValue.toString()\n );\n }\n\n return [...tickmarksByValue.values()].sort((a, b) => a.angle - b.angle);\n }\n\n private get _advices(): AngleAdviceRaw[] {\n const value = this.clampedValue;\n\n return this.advices.map((advice) => {\n const minAngle = this.mapAngle(advice.minValue);\n const maxAngle = this.mapAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (value >= advice.minValue && value <= advice.maxValue) {\n state = AdviceState.triggered;\n }\n\n return {\n minAngle,\n maxAngle,\n type: advice.type,\n state,\n hideMinTickmark: advice.minValue === this.minValue,\n hideMaxTickmark: advice.maxValue === this.maxValue,\n };\n });\n }\n\n static override styles = css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n obc-watch {\n anchor-name: --watch;\n }\n\n .speed-gauge-value {\n position: absolute;\n top: clamp(\n 70%,\n calc(80% - (anchor-size(--watch height) - 200px) * 0.2),\n 80%\n );\n left: 50%;\n transform: translateX(-50%);\n width: fit-content;\n height: fit-content;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-instrument-radial': ObcInstrumentRadial;\n }\n}\n"],"names":["ObcGaugeRadialType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instrument-radial.js","sources":["../../../src/building-blocks/instrument-radial/instrument-radial.ts"],"sourcesContent":["import {css, LitElement, PropertyValues, html, svg, nothing} from 'lit';\nimport {property} from 'lit/decorators.js';\nimport {ResizeController} from '@lit-labs/observers/resize-controller.js';\nimport {customElement} from '../../decorator.js';\nimport {\n AdviceState,\n AdviceType,\n AngleAdviceRaw,\n} from '../../navigation-instruments/watch/advice.js';\nimport {WatchCircleType} from '../../navigation-instruments/watch/watch.js';\nimport {Tickmark} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkType} from '../../navigation-instruments/watch/tickmark.js';\nimport {TickmarkStyle} from '../../navigation-instruments/watch/tickmark.js';\nimport {InstrumentState, Priority} from '../../navigation-instruments/types.js';\nimport {SetpointMixin} from '../../svghelpers/setpoint-mixin.js';\nimport {innerRingRadiusFor} from '../../navigation-instruments/watch/watch.js';\nimport {\n applyPinnedHostSize,\n computeRadialFrame,\n END_MAXMIN_LABEL_DROP_PX,\n estimateLabelWidthPx,\n measureContainerPx,\n observeInnerBox,\n SIDE_LABEL_DROP_PX,\n type RadialFrame,\n} from '../../svghelpers/radial-frame.js';\n\nexport enum ObcGaugeRadialType {\n filled = 'filled',\n bar = 'bar',\n needle = 'needle',\n}\n\nexport interface GaugeRadialAdvice {\n minValue: number;\n maxValue: number;\n type: AdviceType;\n hinted: boolean;\n}\n\nconst NEEDLE_TIP_RADIUS = 160;\nconst NEEDLE_TIP_GAP = 5; // tip stops this far short of the scale\nconst NEEDLE_WIDTH = 8;\nconst NEEDLE_HUB_RADIUS = 16;\n\nfunction rangeIncludesZero(minValue: number, maxValue: number): boolean {\n return minValue <= 0 && maxValue >= 0;\n}\n\nfunction strongerTickmarkType(\n existing: TickmarkType,\n candidate: TickmarkType\n): TickmarkType {\n const priority: Record<TickmarkType, number> = {\n [TickmarkType.zeroLineThick]: 6,\n [TickmarkType.zeroLine]: 5,\n [TickmarkType.main]: 4,\n [TickmarkType.primary]: 3,\n [TickmarkType.secondary]: 2,\n [TickmarkType.tertiary]: 1,\n [TickmarkType.textOnly]: 0,\n };\n\n return priority[candidate] > priority[existing] ? candidate : existing;\n}\n\ninterface Clips {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/** Clamp a clip percentage to [0, 100]; non-finite returns 0. */\nfunction clampClipPercent(n: number): number {\n return Number.isFinite(n) ? Math.min(Math.max(n, 0), 100) : 0;\n}\n\n/**\n * Clamp the four clips to [0, 100] and drop any opposite pair that would\n * collapse the viewBox (sum >= 100), so a bad clip can't produce a zero- or\n * negative-size box. Valid clips pass through unchanged.\n */\nfunction normalizeClips(clips: Clips): Clips {\n let top = clampClipPercent(clips.top);\n let bottom = clampClipPercent(clips.bottom);\n let left = clampClipPercent(clips.left);\n let right = clampClipPercent(clips.right);\n if (top + bottom >= 100) {\n top = 0;\n bottom = 0;\n }\n if (left + right >= 100) {\n left = 0;\n right = 0;\n }\n return {top, bottom, left, right};\n}\n\n/**\n * Fallback value-to-angle mapping when no `getAngle` is supplied: linear over\n * the historical 270° sweep (-135 to 135). Returns -135 for a non-positive or\n * non-finite span.\n */\nfunction defaultGaugeAngle(\n value: number,\n minValue: number,\n maxValue: number\n): number {\n const span = maxValue - minValue;\n if (!Number.isFinite(span) || span <= 0) {\n return -135;\n }\n return ((value - minValue) / span) * 270 - 135;\n}\n\n/**\n * @fires frame-changed {CustomEvent<RadialFrame>} Fired after render when the\n * computed radial frame changed (viewBox, label visibility, or pinned host\n * size). Wrappers use it to align sibling overlays/readouts with the dial.\n * @experimental\n */\n@customElement('obc-instrument-radial')\nexport class ObcInstrumentRadial extends SetpointMixin(LitElement) {\n // setpoint, newSetpoint, atSetpoint, touching, autoAtSetpoint,\n // autoAtSetpointDeadband, setpointAtZeroDeadband, setpointOverride\n // — all inherited from SetpointMixin\n\n @property({type: String}) state: InstrumentState = InstrumentState.active;\n @property({type: String}) priority: Priority = Priority.regular;\n\n @property({type: Number}) value = 0;\n @property({type: Number}) maxValue = 100;\n @property({type: Number}) minValue = 0;\n @property({attribute: false}) getAngle!: (v: number) => number;\n /** @availableWhen type!=filled */\n @property({type: String}) needleColor: string | undefined;\n /** @availableWhen type!=needle */\n @property({type: String}) barColor: string | undefined;\n @property({type: Boolean}) showLabels: boolean = false;\n /**\n * Interval for primary tickmarks in value units.\n * When undefined or <= 0, no primary tickmarks are shown.\n */\n @property({type: Number}) primaryTickmarkInterval: number | undefined = 50;\n /**\n * Interval for secondary tickmarks in value units.\n * When undefined or <= 0, no secondary tickmarks are shown.\n */\n @property({type: Number}) secondaryTickmarkInterval: number | undefined = 10;\n /**\n * Interval for tertiary tickmarks in value units.\n * When undefined or <= 0, no tertiary tickmarks are shown.\n */\n @property({type: Number}) tertiaryTickmarkInterval: number | undefined =\n undefined;\n @property({type: String}) type: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: String}) needleType: ObcGaugeRadialType =\n ObcGaugeRadialType.filled;\n @property({type: Boolean}) tickmarksInside: boolean = false;\n @property({type: String}) tickmarkStyle: TickmarkStyle =\n TickmarkStyle.regular;\n @property({type: Array, attribute: false}) advices: GaugeRadialAdvice[] = [];\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipTop: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipLeft: number = 0; // in percent of width\n /** @availableWhen zoomToFitArc==false */\n @property({type: Number}) clipRight: number = 0; // in percent of width\n /**\n * Place the horizontal end labels (±90°, e.g. min/max) below the tick instead\n * of beside it — the \"Max-min\" placement from the radial label model\n * (External / Internal / Max-min). See PR #903 / design discussion.\n */\n @property({type: Boolean}) endLabelsMaxMin: boolean = false;\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n /**\n * Outer-ring diameter in CSS pixels. When set, the instrument renders at a\n * fixed intrinsic size derived from the ring, arc shape and label reserve —\n * so instruments sharing the same value have identical ring circumference\n * regardless of label width or arc extent (like obc-donut-chart's\n * fixedHeight). When unset (default), the instrument fills its container.\n */\n @property({type: Number, attribute: 'face-diameter'})\n faceDiameter: number | undefined;\n\n private _radiusOffset = 0;\n private _frame: RadialFrame | undefined;\n private _lastFrameKey = '';\n\n private _resizeController = new ResizeController(this, {});\n\n override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n observeInnerBox(this._resizeController, this.renderRoot);\n }\n\n /** The frame computed for the current render (viewBox, label reserve …). */\n get frame(): RadialFrame | undefined {\n return this._frame;\n }\n\n /** Whether the host size styles were set by applyPinnedHostSize. */\n private _hostSizePinned = false;\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n this._hostSizePinned = applyPinnedHostSize(\n this,\n this._frame,\n this._hostSizePinned\n );\n const frame = this._frame;\n if (!frame) {\n return;\n }\n const key = `${frame.viewBox}|${frame.labelsHidden}|${frame.hostWidthPx ?? ''}|${frame.hostHeightPx ?? ''}`;\n if (key !== this._lastFrameKey) {\n this._lastFrameKey = key;\n this.dispatchEvent(\n new CustomEvent<RadialFrame>('frame-changed', {detail: frame})\n );\n }\n }\n\n private get clampedValue(): number {\n const lowerBound = Math.min(this.minValue, this.maxValue);\n const upperBound = Math.max(this.minValue, this.maxValue);\n return Math.max(lowerBound, Math.min(this.value, upperBound));\n }\n\n private get minAngle(): number {\n return this.mapAngle(this.minValue);\n }\n\n private get maxAngle(): number {\n return this.mapAngle(this.maxValue);\n }\n\n // Map a value to an angle via the consumer's `getAngle`, guarding a missing\n // or non-finite mapping so a misconfigured consumer can't emit NaN geometry.\n private mapAngle(value: number): number {\n const fn = this.getAngle;\n const angle =\n typeof fn === 'function'\n ? fn(value)\n : defaultGaugeAngle(value, this.minValue, this.maxValue);\n return Number.isFinite(angle) ? angle : 0;\n }\n\n // Clamped clips, reused for the overlay viewBox and the clips forwarded to\n // obc-watch.\n private get safeClips(): Clips {\n return normalizeClips({\n top: this.clipTop,\n bottom: this.clipBottom,\n left: this.clipLeft,\n right: this.clipRight,\n });\n }\n\n private get _derivedNeedleColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n\n private get _derivedBarColor(): string {\n if (\n this.state === InstrumentState.loading ||\n this.state === InstrumentState.off\n ) {\n return 'transparent';\n }\n if (this.type === ObcGaugeRadialType.filled) {\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-secondary-color)'\n : 'var(--instrument-regular-secondary-color)';\n }\n return this.priority === Priority.enhanced\n ? 'var(--instrument-enhanced-tertiary-color)'\n : 'var(--instrument-regular-tertiary-color)';\n }\n\n override render() {\n const barColor = this.barColor ?? this._derivedBarColor;\n const barStartValue = Math.max(this.minValue, Math.min(0, this.maxValue));\n const value = this.clampedValue;\n const setpointAngle =\n this.setpoint !== undefined ? this.mapAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.mapAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.mapAngle(barStartValue),\n endAngle: this.mapAngle(value),\n fillColor: barColor,\n },\n ];\n\n const areas = [\n {\n startAngle: this.minAngle,\n endAngle: this.maxAngle,\n roundInsideCut: true,\n roundOutsideCut: true,\n },\n ];\n\n const watchCircleType =\n this.type === ObcGaugeRadialType.needle\n ? WatchCircleType.single\n : WatchCircleType.double;\n\n const tickmarks = this.tickmarks;\n // Labels hang past the ±90° line only when a labeled tick actually sits\n // there (e.g. the 180°/90° sector ends) — a ±60° sector like rot-sector\n // must not reserve a drop it never uses.\n const hasHorizontalEndLabels = tickmarks.some((t) => {\n if (t.text === undefined) {\n return false;\n }\n const angle = ((t.angle % 360) + 360) % 360;\n return Math.abs(angle - 90) < 1 || Math.abs(angle - 270) < 1;\n });\n const frame = computeRadialFrame({\n basePadding: 48,\n labelWidthPx: this.tickmarksInside\n ? 0\n : estimateLabelWidthPx(tickmarks.map((t) => t.text)),\n labelDropPx:\n this.tickmarksInside || !hasHorizontalEndLabels\n ? 0\n : this.endLabelsMaxMin\n ? END_MAXMIN_LABEL_DROP_PX\n : SIDE_LABEL_DROP_PX,\n clips: this.zoomToFitArc ? undefined : this.safeClips,\n containerPx: measureContainerPx(this),\n faceDiameter: this.faceDiameter,\n zoomToFitArc: this.zoomToFitArc,\n areas,\n innerRadius: innerRingRadiusFor(watchCircleType),\n });\n this._radiusOffset = frame.radiusOffset;\n this._frame = frame;\n const shownTickmarks = frame.labelsHidden\n ? tickmarks.map((t) => ({...t, text: undefined}))\n : tickmarks;\n\n return html`\n <div class=\"container\">\n <obc-watch\n .state=${this.state}\n .priority=${this.priority}\n .angleSetpoint=${setpointAngle}\n .newAngleSetpoint=${newSetpointAngle}\n .atAngleSetpoint=${this.computeAtSetpoint(value)}\n .angleSetpointAtZeroDeadband=${this.setpointAtZeroDeadband}\n .setpointOverride=${this.setpointOverride}\n .animateSetpoint=${this.animateSetpoint}\n .tickmarks=${shownTickmarks}\n .tickmarksInside=${this.tickmarksInside}\n .tickmarkStyle=${this.tickmarkStyle}\n .advices=${this._advices}\n .areas=${areas}\n .watchCircleType=${watchCircleType}\n .barAreas=${barAreas}\n .endLabelsMaxMin=${this.endLabelsMaxMin}\n .arcFrame=${frame}\n ></obc-watch>\n <svg class=\"gauge-radial\" viewBox=${frame.viewBox}>${this._needle}</svg>\n </div>\n `;\n }\n\n private get _needle() {\n if (this.type === ObcGaugeRadialType.filled) {\n return nothing;\n }\n const needleColor = this.needleColor ?? this._derivedNeedleColor;\n const rOff = this._radiusOffset;\n const value = this.clampedValue;\n if (this.type === ObcGaugeRadialType.needle) {\n // Rod runs from the value tip down to the center hub. Width is constant;\n // the tip shifts outward additively under zoom.\n const tipY = 256 - (NEEDLE_TIP_RADIUS - NEEDLE_TIP_GAP) - rOff;\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n <rect x=\"${256 - NEEDLE_WIDTH / 2}\" y=\"${tipY}\" width=\"${NEEDLE_WIDTH}\" height=\"${256 - tipY}\" rx=\"${NEEDLE_WIDTH / 2}\" fill=${needleColor} stroke=${needleColor}/>\n <circle cx=\"256\" cy=\"256\" r=\"${NEEDLE_HUB_RADIUS}\" fill=${needleColor}/>\n </g>\n`;\n } else {\n return svg`<g transform=\"rotate(${this.mapAngle(value)}) translate(-256, -256)\">\n<rect x=\"252\" y=\"${96 - rOff}\" width=\"8\" height=\"48\" rx=\"4\" fill=${needleColor} stroke=\"var(--border-silhouette-color)\"/>\n</g>\n `;\n }\n }\n\n get tickmarks(): Tickmark[] {\n const tickmarksByValue = new Map<number, Tickmark>();\n const normalizeValue = (value: number) =>\n Math.abs(value) < 1e-9 ? 0 : Number(value.toFixed(6));\n\n const upsertTickmark = (\n value: number,\n type: TickmarkType,\n text?: string\n ) => {\n if (\n !Number.isFinite(value) ||\n value < this.minValue ||\n value > this.maxValue\n ) {\n return;\n }\n\n const normalizedValue = normalizeValue(value);\n const existing = tickmarksByValue.get(normalizedValue);\n if (existing) {\n existing.type = strongerTickmarkType(existing.type, type);\n if (text !== undefined) {\n existing.text = text;\n }\n return;\n }\n\n tickmarksByValue.set(normalizedValue, {\n angle: this.mapAngle(normalizedValue),\n type,\n text,\n });\n };\n\n const addTickmarksAtInterval = (\n interval: number | undefined,\n type: TickmarkType,\n withLabels = false\n ) => {\n if (\n interval === undefined ||\n interval <= 0 ||\n !Number.isFinite(interval)\n ) {\n return;\n }\n\n const epsilon = Math.abs(interval) * 1e-6;\n const startValue =\n Math.ceil((this.minValue - epsilon) / interval) * interval;\n\n for (\n let value = startValue;\n value < this.maxValue - epsilon;\n value += interval\n ) {\n const normalizedValue = normalizeValue(value);\n if (\n normalizedValue <= this.minValue + epsilon ||\n normalizedValue >= this.maxValue - epsilon\n ) {\n continue;\n }\n\n upsertTickmark(\n normalizedValue,\n type,\n withLabels && this.showLabels ? normalizedValue.toString() : undefined\n );\n }\n };\n\n addTickmarksAtInterval(\n this.primaryTickmarkInterval,\n TickmarkType.primary,\n true\n );\n addTickmarksAtInterval(\n this.secondaryTickmarkInterval,\n TickmarkType.secondary\n );\n addTickmarksAtInterval(\n this.tertiaryTickmarkInterval,\n TickmarkType.tertiary\n );\n\n if (rangeIncludesZero(this.minValue, this.maxValue)) {\n upsertTickmark(\n 0,\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n this.showLabels ? '0' : undefined\n );\n }\n\n if (this.showLabels) {\n upsertTickmark(\n this.minValue,\n TickmarkType.textOnly,\n this.minValue.toString()\n );\n upsertTickmark(\n this.maxValue,\n TickmarkType.textOnly,\n this.maxValue.toString()\n );\n }\n\n return [...tickmarksByValue.values()].sort((a, b) => a.angle - b.angle);\n }\n\n private get _advices(): AngleAdviceRaw[] {\n const value = this.clampedValue;\n\n return this.advices.map((advice) => {\n const minAngle = this.mapAngle(advice.minValue);\n const maxAngle = this.mapAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (value >= advice.minValue && value <= advice.maxValue) {\n state = AdviceState.triggered;\n }\n\n return {\n minAngle,\n maxAngle,\n type: advice.type,\n state,\n hideMinTickmark: advice.minValue === this.minValue,\n hideMaxTickmark: advice.maxValue === this.maxValue,\n };\n });\n }\n\n static override styles = css`\n * {\n box-sizing: border-box;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .container > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n obc-watch {\n anchor-name: --watch;\n }\n\n .speed-gauge-value {\n position: absolute;\n top: clamp(\n 70%,\n calc(80% - (anchor-size(--watch height) - 200px) * 0.2),\n 80%\n );\n left: 50%;\n transform: translateX(-50%);\n width: fit-content;\n height: fit-content;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-instrument-radial': ObcInstrumentRadial;\n }\n}\n"],"names":["ObcGaugeRadialType"],"mappings":"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"}
|
|
@@ -21,30 +21,6 @@ import '../../icons/icon-link.js';
|
|
|
21
21
|
* @slot clock - Custom clock content, rendered when `showClock` is true
|
|
22
22
|
* @slot integration-buttons - Regular vessel integration buttons
|
|
23
23
|
* @slot hug-buttons - Compact vessel integration buttons; slotted integration buttons are forced to hug type
|
|
24
|
-
* @property {IntegrationBarType} type - Integration bar mode for fleet/vessel presentation
|
|
25
|
-
* @property {boolean} hideHomeButton - Hides the home button when true
|
|
26
|
-
* @property {boolean} showClock - Toggles rendering of the clock slot
|
|
27
|
-
* @property {boolean} showLinkButton - Toggles visibility of link button
|
|
28
|
-
* @property {boolean} linkButtonActivated - Activated state of link button
|
|
29
|
-
* @property {boolean} showUserButton - Toggles visibility of user button
|
|
30
|
-
* @property {boolean} userButtonActivated - Activated state of user button
|
|
31
|
-
* @property {boolean} showDimmingButton - Toggles visibility of dimming button
|
|
32
|
-
* @property {boolean} dimmingButtonActivated - Activated state of dimming button
|
|
33
|
-
* @property {boolean} showSystemButton - Toggles visibility of system button
|
|
34
|
-
* @property {boolean} systemButtonActivated - Activated state of system button
|
|
35
|
-
* @property {boolean} showScreenButton - Toggles visibility of screen button
|
|
36
|
-
* @property {boolean} screenButtonActivated - Activated state of screen button
|
|
37
|
-
* @property {boolean} showNotificationButton - Toggles visibility of notification button
|
|
38
|
-
* @property {boolean} notificationButtonActivated - Activated state of notification button
|
|
39
|
-
* @property {boolean} showAlertButton - Toggles visibility of alert button
|
|
40
|
-
* @property {boolean} alertButtonActivated - Activated state of alert button
|
|
41
|
-
* @property {boolean} showFleetButton - Toggles visibility of fleet button
|
|
42
|
-
* @property {boolean} fleetButtonSelected - Selected state of fleet button
|
|
43
|
-
* @property {boolean} fleetButtonActivated - Active state of fleet button while selection is pending
|
|
44
|
-
* @property {string} fleetButtonLabel - Label for the fleet button
|
|
45
|
-
* @property {string} selectedVesselValue - Selected vessel value
|
|
46
|
-
* @property {string} activeVesselValue - Active vessel value while selection is pending
|
|
47
|
-
* @property {{value: string; label: string}[]} vesselSelectorOptions - Available vessel options
|
|
48
24
|
* @fires fleet-button-click - Fired when the fleet button is clicked
|
|
49
25
|
* @fires link-button-clicked - Fired when the link button is clicked
|
|
50
26
|
* @fires alert-button-clicked - Fired when the alert button is clicked
|
|
@@ -56,25 +32,45 @@ import '../../icons/icon-link.js';
|
|
|
56
32
|
* @experimental
|
|
57
33
|
*/
|
|
58
34
|
export declare class ObcIntegrationBar extends LitElement {
|
|
35
|
+
/** Hides the home button when true */
|
|
59
36
|
hideHomeButton: boolean;
|
|
37
|
+
/** Toggles rendering of the clock slot */
|
|
60
38
|
showClock: boolean;
|
|
39
|
+
/** Toggles visibility of link button */
|
|
61
40
|
showLinkButton: boolean;
|
|
41
|
+
/** Activated state of link button */
|
|
62
42
|
linkButtonActivated: boolean;
|
|
43
|
+
/** Toggles visibility of user button */
|
|
63
44
|
showUserButton: boolean;
|
|
45
|
+
/** Activated state of user button */
|
|
64
46
|
userButtonActivated: boolean;
|
|
47
|
+
/** Toggles visibility of dimming button */
|
|
65
48
|
showDimmingButton: boolean;
|
|
49
|
+
/** Activated state of dimming button */
|
|
66
50
|
dimmingButtonActivated: boolean;
|
|
51
|
+
/** Toggles visibility of system button */
|
|
67
52
|
showSystemButton: boolean;
|
|
53
|
+
/** Activated state of system button */
|
|
68
54
|
systemButtonActivated: boolean;
|
|
55
|
+
/** Toggles visibility of screen button */
|
|
69
56
|
showScreenButton: boolean;
|
|
57
|
+
/** Activated state of screen button */
|
|
70
58
|
screenButtonActivated: boolean;
|
|
59
|
+
/** Toggles visibility of notification button */
|
|
71
60
|
showNotificationButton: boolean;
|
|
61
|
+
/** Activated state of notification button */
|
|
72
62
|
notificationButtonActivated: boolean;
|
|
63
|
+
/** Toggles visibility of alert button */
|
|
73
64
|
showAlertButton: boolean;
|
|
65
|
+
/** Activated state of alert button */
|
|
74
66
|
alertButtonActivated: boolean;
|
|
67
|
+
/** Toggles visibility of fleet button */
|
|
75
68
|
showFleetButton: boolean;
|
|
69
|
+
/** Selected state of fleet button */
|
|
76
70
|
fleetButtonSelected: boolean;
|
|
71
|
+
/** Active state of fleet button while selection is pending */
|
|
77
72
|
fleetButtonActivated: boolean;
|
|
73
|
+
/** Label for the fleet button */
|
|
78
74
|
fleetButtonLabel: string;
|
|
79
75
|
private buttonsOnBar;
|
|
80
76
|
private onFleetButtonClick;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-bar.d.ts","sourceRoot":"","sources":["../../../src/integration-systems/integration-bar/integration-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA2B,MAAM,KAAK,CAAC;AAGzD,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAKrD,OAAO,iCAAiC,CAAC;AACzC,OAAO,6CAA6C,CAAC;AACrD,OAAO,2CAA2C,CAAC;AACnD,OAAO,0BAA0B,CAAC;AAClC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,0BAA0B,CAAC;AAClC,OAAO,0BAA0B,CAAC;AAClC,OAAO,iCAAiC,CAAC;AACzC,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAIlC
|
|
1
|
+
{"version":3,"file":"integration-bar.d.ts","sourceRoot":"","sources":["../../../src/integration-systems/integration-bar/integration-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA2B,MAAM,KAAK,CAAC;AAGzD,OAAO,yCAAyC,CAAC;AACjD,OAAO,6CAA6C,CAAC;AAKrD,OAAO,iCAAiC,CAAC;AACzC,OAAO,6CAA6C,CAAC;AACrD,OAAO,2CAA2C,CAAC;AACnD,OAAO,0BAA0B,CAAC;AAClC,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,0BAA0B,CAAC;AAClC,OAAO,0BAA0B,CAAC;AAClC,OAAO,iCAAiC,CAAC;AACzC,OAAO,4BAA4B,CAAC;AACpC,OAAO,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,sCAAsC;IACX,cAAc,UAAS;IAClD,0CAA0C;IACf,SAAS,UAAS;IAC7C,wCAAwC;IACb,cAAc,UAAS;IAClD,qCAAqC;IACV,mBAAmB,UAAS;IACvD,wCAAwC;IACb,cAAc,UAAS;IAClD,qCAAqC;IACV,mBAAmB,UAAS;IACvD,2CAA2C;IAChB,iBAAiB,UAAS;IACrD,wCAAwC;IACb,sBAAsB,UAAS;IAC1D,0CAA0C;IACf,gBAAgB,UAAS;IACpD,uCAAuC;IACZ,qBAAqB,UAAS;IACzD,0CAA0C;IACf,gBAAgB,UAAS;IACpD,uCAAuC;IACZ,qBAAqB,UAAS;IACzD,gDAAgD;IACrB,sBAAsB,UAAS;IAC1D,6CAA6C;IAClB,2BAA2B,UAAS;IAC/D,yCAAyC;IACd,eAAe,UAAS;IACnD,sCAAsC;IACX,oBAAoB,UAAS;IACxD,yCAAyC;IACd,eAAe,UAAS;IACnD,qCAAqC;IACV,mBAAmB,UAAS;IACvD,8DAA8D;IACnC,oBAAoB,UAAS;IACxD,iCAAiC;IACP,gBAAgB,SAAW;IAE5C,OAAO,CAAC,YAAY,CAAS;IAEtC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,mBAAmB;IAIlB,MAAM;IAmLf,OAAgB,MAAM,0BAA2B;CAClD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,iBAAiB,CAAC;KAC1C;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-bar.js","sources":["../../../src/integration-systems/integration-bar/integration-bar.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS, nothing} from 'lit';\nimport {customElement} from '../../decorator.js';\nimport compentStyle from './integration-bar.css?inline';\nimport '../integration-tabs/integration-tabs.js';\nimport '../integration-button/integration-button.js';\nimport {\n IntegrationButtonType,\n IntegrationButtonVariant,\n} from '../integration-button/integration-button.js';\nimport '../../components/clock/clock.js';\nimport '../../components/icon-button/icon-button.js';\nimport '../../icons/icon-palette-day-night-iec.js';\nimport '../../icons/icon-user.js';\nimport '../../icons/icon-configure.js';\nimport '../../icons/icon-notification.js';\nimport '../../icons/icon-home.js';\nimport '../../icons/icon-ship.js';\nimport '../../icons/icon-screen-desk.js';\nimport '../../icons/icon-alerts.js';\nimport '../../icons/icon-link.js';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\n/**\n * `<obc-integration-bar>` – A compact top-level integration header for vessel and system navigation controls.\n *\n * Provides a configurable integration bar with home/navigation controls, optional fleet and vessel selection,\n * and optional utility actions such as alerts, notifications, screen, system, dimming, user, and clock.\n *\n * @slot clock - Custom clock content, rendered when `showClock` is true\n * @slot integration-buttons - Regular vessel integration buttons\n * @slot hug-buttons - Compact vessel integration buttons; slotted integration buttons are forced to hug type\n * @property {IntegrationBarType} type - Integration bar mode for fleet/vessel presentation\n * @property {boolean} hideHomeButton - Hides the home button when true\n * @property {boolean} showClock - Toggles rendering of the clock slot\n * @property {boolean} showLinkButton - Toggles visibility of link button\n * @property {boolean} linkButtonActivated - Activated state of link button\n * @property {boolean} showUserButton - Toggles visibility of user button\n * @property {boolean} userButtonActivated - Activated state of user button\n * @property {boolean} showDimmingButton - Toggles visibility of dimming button\n * @property {boolean} dimmingButtonActivated - Activated state of dimming button\n * @property {boolean} showSystemButton - Toggles visibility of system button\n * @property {boolean} systemButtonActivated - Activated state of system button\n * @property {boolean} showScreenButton - Toggles visibility of screen button\n * @property {boolean} screenButtonActivated - Activated state of screen button\n * @property {boolean} showNotificationButton - Toggles visibility of notification button\n * @property {boolean} notificationButtonActivated - Activated state of notification button\n * @property {boolean} showAlertButton - Toggles visibility of alert button\n * @property {boolean} alertButtonActivated - Activated state of alert button\n * @property {boolean} showFleetButton - Toggles visibility of fleet button\n * @property {boolean} fleetButtonSelected - Selected state of fleet button\n * @property {boolean} fleetButtonActivated - Active state of fleet button while selection is pending\n * @property {string} fleetButtonLabel - Label for the fleet button\n * @property {string} selectedVesselValue - Selected vessel value\n * @property {string} activeVesselValue - Active vessel value while selection is pending\n * @property {{value: string; label: string}[]} vesselSelectorOptions - Available vessel options\n * @fires fleet-button-click - Fired when the fleet button is clicked\n * @fires link-button-clicked - Fired when the link button is clicked\n * @fires alert-button-clicked - Fired when the alert button is clicked\n * @fires notification-button-clicked - Fired when the notification button is clicked\n * @fires screen-button-clicked - Fired when the screen button is clicked\n * @fires system-button-clicked - Fired when the system button is clicked\n * @fires dimming-button-clicked - Fired when the dimming button is clicked\n * @fires user-button-clicked - Fired when the user button is clicked\n * @experimental\n */\n@customElement('obc-integration-bar')\nexport class ObcIntegrationBar extends LitElement {\n @property({type: Boolean}) hideHomeButton = false;\n @property({type: Boolean}) showClock = false;\n @property({type: Boolean}) showLinkButton = false;\n @property({type: Boolean}) linkButtonActivated = false;\n @property({type: Boolean}) showUserButton = false;\n @property({type: Boolean}) userButtonActivated = false;\n @property({type: Boolean}) showDimmingButton = false;\n @property({type: Boolean}) dimmingButtonActivated = false;\n @property({type: Boolean}) showSystemButton = false;\n @property({type: Boolean}) systemButtonActivated = false;\n @property({type: Boolean}) showScreenButton = false;\n @property({type: Boolean}) screenButtonActivated = false;\n @property({type: Boolean}) showNotificationButton = false;\n @property({type: Boolean}) notificationButtonActivated = false;\n @property({type: Boolean}) showAlertButton = false;\n @property({type: Boolean}) alertButtonActivated = false;\n @property({type: Boolean}) showFleetButton = false;\n @property({type: Boolean}) fleetButtonSelected = false;\n @property({type: Boolean}) fleetButtonActivated = false;\n @property({type: String}) fleetButtonLabel = 'Fleet';\n\n @state() private buttonsOnBar = false;\n\n private onFleetButtonClick() {\n this.dispatchEvent(new CustomEvent('fleet-button-click'));\n }\n\n private onHugButtonsSlotChange(event: Event) {\n const slot = event.currentTarget as HTMLSlotElement;\n const assignedElements = slot.assignedElements({flatten: true});\n\n assignedElements.forEach((element) => {\n if (element.tagName === 'OBC-INTEGRATION-BUTTON') {\n const integrationButton = element as unknown as HTMLElement & {\n type: IntegrationButtonType;\n };\n integrationButton.type = IntegrationButtonType.hug;\n }\n });\n this.buttonsOnBar = true;\n }\n\n private onButtonsSlotChange() {\n this.buttonsOnBar = true;\n }\n\n override render() {\n const isFleetButtonAnchored = this.fleetButtonActivated;\n return html`\n <nav class=\"wrapper\">\n <div class=\"content-container\">\n ${!this.hideHomeButton\n ? html`<obc-icon-button class=\"home-button\" variant=\"integration\">\n <obi-home></obi-home>\n </obc-icon-button>`\n : null}\n ${this.showLinkButton\n ? html`<obc-icon-button\n class=${classMap({\n 'link-button': true,\n activated: this.linkButtonActivated,\n })}\n part=\"link-button\"\n variant=\"integration\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent('link-button-clicked'))}\n ?activated=${this.linkButtonActivated}\n >\n <obi-link></obi-link>\n </obc-icon-button>`\n : null}\n <div class=${classMap({'fleet-vessel-container': true})}>\n ${this.showFleetButton\n ? html`<obc-integration-button\n class=\"fleet-button\"\n .variant=${IntegrationButtonVariant.normal}\n ?selected=${this.fleetButtonSelected}\n ?activated=${this.fleetButtonActivated}\n style=${isFleetButtonAnchored\n ? 'anchor-name: --integration-menu-anchor;'\n : ''}\n @click=${() => this.onFleetButtonClick()}\n >\n <span slot=\"label\">${this.fleetButtonLabel}</span>\n </obc-integration-button>`\n : nothing}\n <div class=\"vessel-container\">\n ${this.buttonsOnBar\n ? nothing\n : html`<div class=\"vessel-button-placeholder\"></div>`}\n <slot\n class=\"hug-buttons-slot\"\n name=\"hug-buttons\"\n @slotchange=${this.onHugButtonsSlotChange}\n ></slot>\n <slot\n class=\"integration-buttons-slot\"\n name=\"integration-buttons\"\n @slotchange=${this.onButtonsSlotChange}\n ></slot>\n </div>\n </div>\n </div>\n <div\n class=${classMap({\n 'buttons-on-bar': this.buttonsOnBar,\n 'right-content-container': true,\n })}\n >\n ${this.showAlertButton\n ? html`<obc-icon-button\n class=${classMap({\n 'alert-button': true,\n activated: this.alertButtonActivated,\n })}\n part=\"alert-button\"\n variant=\"integration\"\n style=${this.alertButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('alert-button-clicked'))}\n ?activated=${this.alertButtonActivated}\n >\n <obi-alerts></obi-alerts>\n </obc-icon-button>`\n : null}\n ${this.showNotificationButton\n ? html`<obc-icon-button\n class=${classMap({\n 'notification-button': true,\n activated: this.notificationButtonActivated,\n })}\n part=\"notification-button\"\n variant=\"integration\"\n style=${this.notificationButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent('notification-button-clicked')\n )}\n ?activated=${this.notificationButtonActivated}\n >\n <obi-notification></obi-notification>\n </obc-icon-button>`\n : null}\n ${this.showScreenButton\n ? html`<obc-icon-button\n class=${classMap({\n 'screen-button': true,\n activated: this.screenButtonActivated,\n })}\n part=\"screen-button\"\n variant=\"integration\"\n style=${this.screenButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('screen-button-clicked'))}\n ?activated=${this.screenButtonActivated}\n >\n <obi-screen-desk></obi-screen-desk>\n </obc-icon-button>`\n : null}\n ${this.showSystemButton\n ? html`<obc-icon-button\n class=${classMap({\n 'system-button': true,\n activated: this.systemButtonActivated,\n })}\n part=\"system-button\"\n variant=\"integration\"\n style=${this.systemButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('system-button-clicked'))}\n ?activated=${this.systemButtonActivated}\n >\n <obi-configure></obi-configure>\n </obc-icon-button>`\n : null}\n ${this.showDimmingButton\n ? html`<obc-icon-button\n class=${classMap({\n 'dimming-button': true,\n activated: this.dimmingButtonActivated,\n })}\n part=\"dimming-button\"\n variant=\"integration\"\n style=${this.dimmingButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('dimming-button-clicked'))}\n ?activated=${this.dimmingButtonActivated}\n >\n <obi-palette-day-night-iec></obi-palette-day-night-iec>\n </obc-icon-button>`\n : null}\n ${this.showUserButton\n ? html`<obc-icon-button\n class=${classMap({\n 'user-button': true,\n activated: this.userButtonActivated,\n })}\n part=\"user-button\"\n variant=\"integration\"\n style=${this.userButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('user-button-clicked'))}\n ?activated=${this.userButtonActivated}\n >\n <obi-user></obi-user>\n </obc-icon-button>`\n : null}\n ${this.showClock ? html`<slot name=\"clock\"></slot>` : null}\n </div>\n </nav>\n `;\n }\n\n static override styles = unsafeCSS(compentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-integration-bar': ObcIntegrationBar;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"integration-bar.js","sources":["../../../src/integration-systems/integration-bar/integration-bar.ts"],"sourcesContent":["import {LitElement, html, unsafeCSS, nothing} from 'lit';\nimport {customElement} from '../../decorator.js';\nimport compentStyle from './integration-bar.css?inline';\nimport '../integration-tabs/integration-tabs.js';\nimport '../integration-button/integration-button.js';\nimport {\n IntegrationButtonType,\n IntegrationButtonVariant,\n} from '../integration-button/integration-button.js';\nimport '../../components/clock/clock.js';\nimport '../../components/icon-button/icon-button.js';\nimport '../../icons/icon-palette-day-night-iec.js';\nimport '../../icons/icon-user.js';\nimport '../../icons/icon-configure.js';\nimport '../../icons/icon-notification.js';\nimport '../../icons/icon-home.js';\nimport '../../icons/icon-ship.js';\nimport '../../icons/icon-screen-desk.js';\nimport '../../icons/icon-alerts.js';\nimport '../../icons/icon-link.js';\nimport {property, state} from 'lit/decorators.js';\nimport {classMap} from 'lit/directives/class-map.js';\n\n/**\n * `<obc-integration-bar>` – A compact top-level integration header for vessel and system navigation controls.\n *\n * Provides a configurable integration bar with home/navigation controls, optional fleet and vessel selection,\n * and optional utility actions such as alerts, notifications, screen, system, dimming, user, and clock.\n *\n * @slot clock - Custom clock content, rendered when `showClock` is true\n * @slot integration-buttons - Regular vessel integration buttons\n * @slot hug-buttons - Compact vessel integration buttons; slotted integration buttons are forced to hug type\n * @fires fleet-button-click - Fired when the fleet button is clicked\n * @fires link-button-clicked - Fired when the link button is clicked\n * @fires alert-button-clicked - Fired when the alert button is clicked\n * @fires notification-button-clicked - Fired when the notification button is clicked\n * @fires screen-button-clicked - Fired when the screen button is clicked\n * @fires system-button-clicked - Fired when the system button is clicked\n * @fires dimming-button-clicked - Fired when the dimming button is clicked\n * @fires user-button-clicked - Fired when the user button is clicked\n * @experimental\n */\n@customElement('obc-integration-bar')\nexport class ObcIntegrationBar extends LitElement {\n /** Hides the home button when true */\n @property({type: Boolean}) hideHomeButton = false;\n /** Toggles rendering of the clock slot */\n @property({type: Boolean}) showClock = false;\n /** Toggles visibility of link button */\n @property({type: Boolean}) showLinkButton = false;\n /** Activated state of link button */\n @property({type: Boolean}) linkButtonActivated = false;\n /** Toggles visibility of user button */\n @property({type: Boolean}) showUserButton = false;\n /** Activated state of user button */\n @property({type: Boolean}) userButtonActivated = false;\n /** Toggles visibility of dimming button */\n @property({type: Boolean}) showDimmingButton = false;\n /** Activated state of dimming button */\n @property({type: Boolean}) dimmingButtonActivated = false;\n /** Toggles visibility of system button */\n @property({type: Boolean}) showSystemButton = false;\n /** Activated state of system button */\n @property({type: Boolean}) systemButtonActivated = false;\n /** Toggles visibility of screen button */\n @property({type: Boolean}) showScreenButton = false;\n /** Activated state of screen button */\n @property({type: Boolean}) screenButtonActivated = false;\n /** Toggles visibility of notification button */\n @property({type: Boolean}) showNotificationButton = false;\n /** Activated state of notification button */\n @property({type: Boolean}) notificationButtonActivated = false;\n /** Toggles visibility of alert button */\n @property({type: Boolean}) showAlertButton = false;\n /** Activated state of alert button */\n @property({type: Boolean}) alertButtonActivated = false;\n /** Toggles visibility of fleet button */\n @property({type: Boolean}) showFleetButton = false;\n /** Selected state of fleet button */\n @property({type: Boolean}) fleetButtonSelected = false;\n /** Active state of fleet button while selection is pending */\n @property({type: Boolean}) fleetButtonActivated = false;\n /** Label for the fleet button */\n @property({type: String}) fleetButtonLabel = 'Fleet';\n\n @state() private buttonsOnBar = false;\n\n private onFleetButtonClick() {\n this.dispatchEvent(new CustomEvent('fleet-button-click'));\n }\n\n private onHugButtonsSlotChange(event: Event) {\n const slot = event.currentTarget as HTMLSlotElement;\n const assignedElements = slot.assignedElements({flatten: true});\n\n assignedElements.forEach((element) => {\n if (element.tagName === 'OBC-INTEGRATION-BUTTON') {\n const integrationButton = element as unknown as HTMLElement & {\n type: IntegrationButtonType;\n };\n integrationButton.type = IntegrationButtonType.hug;\n }\n });\n this.buttonsOnBar = true;\n }\n\n private onButtonsSlotChange() {\n this.buttonsOnBar = true;\n }\n\n override render() {\n const isFleetButtonAnchored = this.fleetButtonActivated;\n return html`\n <nav class=\"wrapper\">\n <div class=\"content-container\">\n ${!this.hideHomeButton\n ? html`<obc-icon-button class=\"home-button\" variant=\"integration\">\n <obi-home></obi-home>\n </obc-icon-button>`\n : null}\n ${this.showLinkButton\n ? html`<obc-icon-button\n class=${classMap({\n 'link-button': true,\n activated: this.linkButtonActivated,\n })}\n part=\"link-button\"\n variant=\"integration\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent('link-button-clicked'))}\n ?activated=${this.linkButtonActivated}\n >\n <obi-link></obi-link>\n </obc-icon-button>`\n : null}\n <div class=${classMap({'fleet-vessel-container': true})}>\n ${this.showFleetButton\n ? html`<obc-integration-button\n class=\"fleet-button\"\n .variant=${IntegrationButtonVariant.normal}\n ?selected=${this.fleetButtonSelected}\n ?activated=${this.fleetButtonActivated}\n style=${isFleetButtonAnchored\n ? 'anchor-name: --integration-menu-anchor;'\n : ''}\n @click=${() => this.onFleetButtonClick()}\n >\n <span slot=\"label\">${this.fleetButtonLabel}</span>\n </obc-integration-button>`\n : nothing}\n <div class=\"vessel-container\">\n ${this.buttonsOnBar\n ? nothing\n : html`<div class=\"vessel-button-placeholder\"></div>`}\n <slot\n class=\"hug-buttons-slot\"\n name=\"hug-buttons\"\n @slotchange=${this.onHugButtonsSlotChange}\n ></slot>\n <slot\n class=\"integration-buttons-slot\"\n name=\"integration-buttons\"\n @slotchange=${this.onButtonsSlotChange}\n ></slot>\n </div>\n </div>\n </div>\n <div\n class=${classMap({\n 'buttons-on-bar': this.buttonsOnBar,\n 'right-content-container': true,\n })}\n >\n ${this.showAlertButton\n ? html`<obc-icon-button\n class=${classMap({\n 'alert-button': true,\n activated: this.alertButtonActivated,\n })}\n part=\"alert-button\"\n variant=\"integration\"\n style=${this.alertButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('alert-button-clicked'))}\n ?activated=${this.alertButtonActivated}\n >\n <obi-alerts></obi-alerts>\n </obc-icon-button>`\n : null}\n ${this.showNotificationButton\n ? html`<obc-icon-button\n class=${classMap({\n 'notification-button': true,\n activated: this.notificationButtonActivated,\n })}\n part=\"notification-button\"\n variant=\"integration\"\n style=${this.notificationButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent('notification-button-clicked')\n )}\n ?activated=${this.notificationButtonActivated}\n >\n <obi-notification></obi-notification>\n </obc-icon-button>`\n : null}\n ${this.showScreenButton\n ? html`<obc-icon-button\n class=${classMap({\n 'screen-button': true,\n activated: this.screenButtonActivated,\n })}\n part=\"screen-button\"\n variant=\"integration\"\n style=${this.screenButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('screen-button-clicked'))}\n ?activated=${this.screenButtonActivated}\n >\n <obi-screen-desk></obi-screen-desk>\n </obc-icon-button>`\n : null}\n ${this.showSystemButton\n ? html`<obc-icon-button\n class=${classMap({\n 'system-button': true,\n activated: this.systemButtonActivated,\n })}\n part=\"system-button\"\n variant=\"integration\"\n style=${this.systemButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('system-button-clicked'))}\n ?activated=${this.systemButtonActivated}\n >\n <obi-configure></obi-configure>\n </obc-icon-button>`\n : null}\n ${this.showDimmingButton\n ? html`<obc-icon-button\n class=${classMap({\n 'dimming-button': true,\n activated: this.dimmingButtonActivated,\n })}\n part=\"dimming-button\"\n variant=\"integration\"\n style=${this.dimmingButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('dimming-button-clicked'))}\n ?activated=${this.dimmingButtonActivated}\n >\n <obi-palette-day-night-iec></obi-palette-day-night-iec>\n </obc-icon-button>`\n : null}\n ${this.showUserButton\n ? html`<obc-icon-button\n class=${classMap({\n 'user-button': true,\n activated: this.userButtonActivated,\n })}\n part=\"user-button\"\n variant=\"integration\"\n style=${this.userButtonActivated\n ? 'anchor-name: --settings-menu-anchor;'\n : ''}\n @click=${() =>\n this.dispatchEvent(new CustomEvent('user-button-clicked'))}\n ?activated=${this.userButtonActivated}\n >\n <obi-user></obi-user>\n </obc-icon-button>`\n : null}\n ${this.showClock ? html`<slot name=\"clock\"></slot>` : null}\n </div>\n </nav>\n `;\n }\n\n static override styles = unsafeCSS(compentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-integration-bar': ObcIntegrationBar;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -27,33 +27,35 @@ export declare enum IntegrationButtonType {
|
|
|
27
27
|
*
|
|
28
28
|
* @fires click - Fired when the internal button is activated.
|
|
29
29
|
*
|
|
30
|
-
* @property {boolean} hasTrailingIcon - Shows the `trailing-icon` slot.
|
|
31
|
-
* @property {boolean} hasTrailingIcon2 - Shows the `trailing-icon2` slot.
|
|
32
|
-
* @property {boolean} hasLeadingIcon - Shows the `leading-icon` slot.
|
|
33
|
-
* @property {boolean} hasstatus - Shows the `status` slot.
|
|
34
|
-
* @property {IntegrationButtonReadout[]} readouts - List of readout items shown in the rich type.
|
|
35
|
-
* @property {boolean} disabled - Disables the internal button.
|
|
36
|
-
* @property {boolean} activated - Applies active state styling while a selection is pending.
|
|
37
|
-
* @property {boolean} selected - Applies selected state styling.
|
|
38
|
-
* @property {boolean} dividerBottom - Shows a bottom divider under the button.
|
|
39
|
-
* @property {boolean} dividerRight - Shows a right divider to separate from adjacent buttons.
|
|
40
|
-
* @property {IntegrationButtonVariant} variant - Visual variant (`normal` or `flat`).
|
|
41
|
-
* @property {IntegrationButtonType} type - Layout type (`hug`, `regular`, or `rich`).
|
|
42
30
|
* @experimental
|
|
43
31
|
*/
|
|
44
32
|
export declare class ObcIntegrationButton extends LitElement {
|
|
33
|
+
/** Shows the `trailing-icon` slot. */
|
|
45
34
|
hasTrailingIcon: boolean;
|
|
46
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Shows the `trailing-icon2` slot.
|
|
37
|
+
* @availableWhen hasTrailingIcon==true
|
|
38
|
+
*/
|
|
47
39
|
hasTrailingIcon2: boolean;
|
|
40
|
+
/** Shows the `leading-icon` slot. */
|
|
48
41
|
hasLeadingIcon: boolean;
|
|
42
|
+
/** Shows the `status` slot. */
|
|
49
43
|
hasStatus: boolean;
|
|
44
|
+
/** List of readout items shown in the rich type. */
|
|
50
45
|
readouts: IntegrationButtonReadout[];
|
|
46
|
+
/** Disables the internal button. */
|
|
51
47
|
disabled: boolean;
|
|
48
|
+
/** Applies active state styling while a selection is pending. */
|
|
52
49
|
activated: boolean;
|
|
50
|
+
/** Applies selected state styling. */
|
|
53
51
|
selected: boolean;
|
|
52
|
+
/** Shows a bottom divider under the button. */
|
|
54
53
|
dividerBottom: boolean;
|
|
54
|
+
/** Shows a right divider to separate from adjacent buttons. */
|
|
55
55
|
dividerRight: boolean;
|
|
56
|
+
/** Visual variant (`normal` or `flat`). */
|
|
56
57
|
variant: IntegrationButtonVariant;
|
|
58
|
+
/** Layout type (`hug`, `regular`, or `rich`). */
|
|
57
59
|
type: IntegrationButtonType;
|
|
58
60
|
private getButtonClasses;
|
|
59
61
|
private onIntegrationVesselMenuClick;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-button.d.ts","sourceRoot":"","sources":["../../../src/integration-systems/integration-button/integration-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA2B,MAAM,KAAK,CAAC;AAMzD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oBAAY,wBAAwB;IAClC,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,oBAAY,qBAAqB;IAC/B,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,IAAI,SAAS;CACd;AAED
|
|
1
|
+
{"version":3,"file":"integration-button.d.ts","sourceRoot":"","sources":["../../../src/integration-systems/integration-button/integration-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAA2B,MAAM,KAAK,CAAC;AAMzD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oBAAY,wBAAwB;IAClC,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,oBAAY,qBAAqB;IAC/B,GAAG,QAAQ;IACX,OAAO,YAAY;IACnB,IAAI,SAAS;CACd;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBACa,oBAAqB,SAAQ,UAAU;IAClD,sCAAsC;IACX,eAAe,UAAS;IACnD;;;OAGG;IACwB,gBAAgB,UAAS;IACpD,qCAAqC;IACV,cAAc,UAAS;IAClD,+BAA+B;IACJ,SAAS,UAAS;IAC7C,oDAAoD;IAEpD,QAAQ,EAAE,wBAAwB,EAAE,CAAM;IAC1C,oCAAoC;IACT,QAAQ,UAAS;IAC5C,iEAAiE;IACtC,SAAS,UAAS;IAC7C,sCAAsC;IACX,QAAQ,UAAS;IAC5C,+CAA+C;IACpB,aAAa,UAAS;IACjD,+DAA+D;IACpC,YAAY,UAAS;IAChD,2CAA2C;IACjB,OAAO,EAAE,wBAAwB,CACzB;IAClC,iDAAiD;IACvB,IAAI,EAAE,qBAAqB,CACrB;IAEhC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,4BAA4B;IAIpC,UAAU;IA2EV,aAAa;IAgDb,SAAS;IAgDA,MAAM;IAef,OAAgB,MAAM,0BAA2B;IAExC,OAAO;CAajB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,wBAAwB,EAAE,oBAAoB,CAAC;KAChD;CACF"}
|