@oicl/openbridge-webcomponents 0.0.20260407101310 → 0.0.20260408055359
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/dist/building-blocks/instrument-radial/instrument-radial.d.ts +3 -0
- package/dist/building-blocks/instrument-radial/instrument-radial.d.ts.map +1 -1
- package/dist/building-blocks/instrument-radial/instrument-radial.js +50 -22
- package/dist/building-blocks/instrument-radial/instrument-radial.js.map +1 -1
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.css.js +88 -78
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.css.js.map +1 -1
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.d.ts +18 -7
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.d.ts.map +1 -1
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.js +122 -21
- package/dist/components/sequence-loading-spinner/sequence-loading-spinner.js.map +1 -1
- package/dist/navigation-instruments/compass/arrow.d.ts +1 -1
- package/dist/navigation-instruments/compass/arrow.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/arrow.js +3 -3
- package/dist/navigation-instruments/compass/arrow.js.map +1 -1
- package/dist/navigation-instruments/compass/compass.d.ts +12 -6
- package/dist/navigation-instruments/compass/compass.d.ts.map +1 -1
- package/dist/navigation-instruments/compass/compass.js +29 -24
- package/dist/navigation-instruments/compass/compass.js.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts +37 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.d.ts.map +1 -1
- package/dist/navigation-instruments/compass-flat/compass-flat.js +34 -3
- package/dist/navigation-instruments/compass-flat/compass-flat.js.map +1 -1
- package/dist/navigation-instruments/compass-sector/compass-sector.css.js +34 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.css.js.map +1 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts +101 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.d.ts.map +1 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.js +404 -0
- package/dist/navigation-instruments/compass-sector/compass-sector.js.map +1 -0
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts +15 -2
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.d.ts.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js +50 -18
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.controller.js.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts +40 -6
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.d.ts.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js +40 -47
- package/dist/navigation-instruments/rate-of-turn/rate-of-turn.js.map +1 -1
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts +63 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.d.ts.map +1 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.js +211 -0
- package/dist/navigation-instruments/rate-of-turn/rot-renderer.js.map +1 -0
- package/dist/navigation-instruments/rot-sector/rot-sector.d.ts +10 -4
- package/dist/navigation-instruments/rot-sector/rot-sector.d.ts.map +1 -1
- package/dist/navigation-instruments/rot-sector/rot-sector.js +13 -3
- package/dist/navigation-instruments/rot-sector/rot-sector.js.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.d.ts +4 -0
- package/dist/navigation-instruments/rudder/rudder.d.ts.map +1 -1
- package/dist/navigation-instruments/rudder/rudder.js +55 -19
- package/dist/navigation-instruments/rudder/rudder.js.map +1 -1
- package/dist/navigation-instruments/watch/advice.d.ts +3 -3
- package/dist/navigation-instruments/watch/advice.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/advice.js +68 -16
- package/dist/navigation-instruments/watch/advice.js.map +1 -1
- package/dist/navigation-instruments/watch/tickmark.d.ts +2 -1
- package/dist/navigation-instruments/watch/tickmark.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/tickmark.js +15 -13
- package/dist/navigation-instruments/watch/tickmark.js.map +1 -1
- package/dist/navigation-instruments/watch/watch.d.ts +29 -0
- package/dist/navigation-instruments/watch/watch.d.ts.map +1 -1
- package/dist/navigation-instruments/watch/watch.js +256 -44
- package/dist/navigation-instruments/watch/watch.js.map +1 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.d.ts +29 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.d.ts.map +1 -1
- package/dist/navigation-instruments/watch-flat/watch-flat.js +162 -17
- package/dist/navigation-instruments/watch-flat/watch-flat.js.map +1 -1
- package/dist/svghelpers/arc-frame.d.ts +42 -0
- package/dist/svghelpers/arc-frame.d.ts.map +1 -0
- package/dist/svghelpers/arc-frame.js +123 -0
- package/dist/svghelpers/arc-frame.js.map +1 -0
- package/package.json +1 -1
- package/dist/navigation-instruments/compass/rot.d.ts +0 -4
- package/dist/navigation-instruments/compass/rot.d.ts.map +0 -1
- package/dist/navigation-instruments/compass/rot.js +0 -11
- package/dist/navigation-instruments/compass/rot.js.map +0 -1
|
@@ -46,6 +46,9 @@ export declare class ObcInstrumentRadial extends ObcInstrumentRadial_base {
|
|
|
46
46
|
advices: GaugeRadialAdvice[];
|
|
47
47
|
clipTop: number;
|
|
48
48
|
clipBottom: number;
|
|
49
|
+
zoomToFitArc: boolean;
|
|
50
|
+
private _radiusOffset;
|
|
51
|
+
private _arcFrame;
|
|
49
52
|
get minAngle(): number;
|
|
50
53
|
get maxAngle(): number;
|
|
51
54
|
private get _derivedNeedleColor();
|
|
@@ -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;AAGxD,OAAO,EAEL,UAAU,EAEX,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAC,QAAQ,EAAC,MAAM,gDAAgD,CAAC;AAExE,OAAO,EAAC,aAAa,EAAC,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,uCAAuC,CAAC;
|
|
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;AAGxD,OAAO,EAEL,UAAU,EAEX,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAC,QAAQ,EAAC,MAAM,gDAAgD,CAAC;AAExE,OAAO,EAAC,aAAa,EAAC,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAC,eAAe,EAAE,QAAQ,EAAC,MAAM,uCAAuC,CAAC;AAWhF,oBAAY,kBAAkB;IAC5B,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;;AACD,qBACa,mBAAoB,SAAQ,wBAAyB;IAKtC,KAAK,EAAE,eAAe,CAA0B;IAChD,QAAQ,EAAE,QAAQ,CAAoB;IAEtC,KAAK,SAAK;IACV,QAAQ,SAAO;IACf,QAAQ,SAAK;IACT,QAAQ,EAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAS;IACvD;;;OAGG;IACuB,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAM;IAC3E;;;OAGG;IACuB,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAM;IAC7E;;;OAGG;IACuB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAC1D;IACc,IAAI,EAAE,kBAAkB,CACtB;IACF,UAAU,EAAE,kBAAkB,CAC5B;IACD,eAAe,EAAE,OAAO,CAAS;IAClC,aAAa,EAAE,aAAa,CAC9B;IACmB,OAAO,EAAE,iBAAiB,EAAE,CAAM;IACnD,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACtB,YAAY,EAAE,OAAO,CAAS;IAEzD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAgC;IAEjD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,OAAO,KAAK,mBAAmB,GAU9B;IAED,OAAO,KAAK,gBAAgB,GAe3B;IAEQ,MAAM;IAsFf,OAAO,KAAK,OAAO,GAmBlB;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAkI1B;IAED,OAAO,KAAK,QAAQ,GAkBnB;IAED,OAAgB,MAAM,0BAmCpB;CACH;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,uBAAuB,EAAE,mBAAmB,CAAC;KAC9C;CACF"}
|
|
@@ -2,10 +2,11 @@ import { LitElement, html, nothing, svg, css } from "lit";
|
|
|
2
2
|
import { property } from "lit/decorators.js";
|
|
3
3
|
import { customElement } from "../../decorator.js";
|
|
4
4
|
import { AdviceState } from "../../navigation-instruments/watch/advice.js";
|
|
5
|
-
import { WatchCircleType } from "../../navigation-instruments/watch/watch.js";
|
|
5
|
+
import { WatchCircleType, innerRingRadiusFor, OUTER_RING_RADIUS } from "../../navigation-instruments/watch/watch.js";
|
|
6
6
|
import { TickmarkStyle, TickmarkType } from "../../navigation-instruments/watch/tickmark.js";
|
|
7
7
|
import { InstrumentState, Priority } from "../../navigation-instruments/types.js";
|
|
8
8
|
import { SetpointMixin } from "../../svghelpers/setpoint-mixin.js";
|
|
9
|
+
import { computeZoomToFitArcFrame } from "../../svghelpers/arc-frame.js";
|
|
9
10
|
var __defProp = Object.defineProperty;
|
|
10
11
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
11
12
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -41,8 +42,9 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
41
42
|
this.advices = [];
|
|
42
43
|
this.clipTop = 0;
|
|
43
44
|
this.clipBottom = 0;
|
|
45
|
+
this.zoomToFitArc = false;
|
|
46
|
+
this._radiusOffset = 0;
|
|
44
47
|
}
|
|
45
|
-
// in percent of height
|
|
46
48
|
get minAngle() {
|
|
47
49
|
return this.getAngle(this.minValue);
|
|
48
50
|
}
|
|
@@ -75,10 +77,37 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
75
77
|
fillColor: barColor
|
|
76
78
|
}
|
|
77
79
|
];
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const areas = [
|
|
81
|
+
{
|
|
82
|
+
startAngle: this.minAngle,
|
|
83
|
+
endAngle: this.maxAngle,
|
|
84
|
+
roundInsideCut: true,
|
|
85
|
+
roundOutsideCut: true
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
const watchCircleType = this.type === "needle" ? WatchCircleType.single : WatchCircleType.double;
|
|
89
|
+
let viewBox;
|
|
90
|
+
if (this.zoomToFitArc) {
|
|
91
|
+
const ext = 48;
|
|
92
|
+
const targetSize = (176 + ext) * 2;
|
|
93
|
+
const frame = computeZoomToFitArcFrame({
|
|
94
|
+
areas,
|
|
95
|
+
outerRadius: OUTER_RING_RADIUS,
|
|
96
|
+
innerRadius: innerRingRadiusFor(watchCircleType),
|
|
97
|
+
extension: ext,
|
|
98
|
+
targetSize
|
|
99
|
+
});
|
|
100
|
+
viewBox = frame.viewBox;
|
|
101
|
+
this._radiusOffset = frame.radiusOffset;
|
|
102
|
+
this._arcFrame = frame;
|
|
103
|
+
} else {
|
|
104
|
+
this._radiusOffset = 0;
|
|
105
|
+
this._arcFrame = void 0;
|
|
106
|
+
const width = 448;
|
|
107
|
+
const height = width * (1 - this.clipTop / 100 - this.clipBottom / 100);
|
|
108
|
+
const top = -width / 2 + width * this.clipTop / 100;
|
|
109
|
+
viewBox = `${-width / 2} ${top} ${width} ${height}`;
|
|
110
|
+
}
|
|
82
111
|
return html`
|
|
83
112
|
<div class="container">
|
|
84
113
|
<obc-watch
|
|
@@ -95,18 +124,13 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
95
124
|
.tickmarksInside=${this.tickmarksInside}
|
|
96
125
|
.tickmarkStyle=${this.tickmarkStyle}
|
|
97
126
|
.advices=${this._advices}
|
|
98
|
-
.areas=${
|
|
99
|
-
|
|
100
|
-
startAngle: this.minAngle,
|
|
101
|
-
endAngle: this.maxAngle,
|
|
102
|
-
roundInsideCut: true,
|
|
103
|
-
roundOutsideCut: true
|
|
104
|
-
}
|
|
105
|
-
]}
|
|
106
|
-
.watchCircleType=${this.type === "needle" ? WatchCircleType.single : WatchCircleType.double}
|
|
127
|
+
.areas=${areas}
|
|
128
|
+
.watchCircleType=${watchCircleType}
|
|
107
129
|
.barAreas=${barAreas}
|
|
108
|
-
.clipTop=${this.clipTop}
|
|
109
|
-
.clipBottom=${this.clipBottom}
|
|
130
|
+
.clipTop=${this.zoomToFitArc ? 0 : this.clipTop}
|
|
131
|
+
.clipBottom=${this.zoomToFitArc ? 0 : this.clipBottom}
|
|
132
|
+
.zoomToFitArc=${this.zoomToFitArc}
|
|
133
|
+
.arcFrame=${this._arcFrame}
|
|
110
134
|
></obc-watch>
|
|
111
135
|
<svg class="gauge-radial" viewBox=${viewBox}>${this._needle}</svg>
|
|
112
136
|
</div>
|
|
@@ -117,17 +141,18 @@ let ObcInstrumentRadial = class extends SetpointMixin(LitElement) {
|
|
|
117
141
|
return nothing;
|
|
118
142
|
}
|
|
119
143
|
const needleColor = this.needleColor ?? this._derivedNeedleColor;
|
|
144
|
+
const rOff = this._radiusOffset;
|
|
120
145
|
if (this.type === "needle") {
|
|
121
146
|
return svg`<g transform="rotate(${this.getAngle(this.value)}) translate(-256, -256)">
|
|
122
147
|
<circle cx="256" cy="256" r="14" fill=${needleColor}/>
|
|
123
|
-
<rect x="250" y="96" width="12" height="192" rx="6" fill=${needleColor}/>
|
|
124
|
-
<rect x="252" y="98" width="8" height="188" rx="4" stroke=${needleColor} fill=${needleColor} stroke-width="4"/>
|
|
125
|
-
</
|
|
148
|
+
<rect x="250" y="${96 - rOff}" width="12" height="${192 + rOff}" rx="6" fill=${needleColor}/>
|
|
149
|
+
<rect x="252" y="${98 - rOff}" width="8" height="${188 + rOff}" rx="4" stroke=${needleColor} fill=${needleColor} stroke-width="4"/>
|
|
150
|
+
</g>
|
|
126
151
|
`;
|
|
127
152
|
} else {
|
|
128
153
|
return svg`<g transform="rotate(${this.getAngle(this.value)}) translate(-256, -256)">
|
|
129
|
-
<rect x="252" y="96" width="8" height="48" rx="4" fill=${needleColor} stroke="var(--border-silhouette-color)"/>
|
|
130
|
-
</
|
|
154
|
+
<rect x="252" y="${96 - rOff}" width="8" height="48" rx="4" fill=${needleColor} stroke="var(--border-silhouette-color)"/>
|
|
155
|
+
</g>
|
|
131
156
|
`;
|
|
132
157
|
}
|
|
133
158
|
}
|
|
@@ -332,6 +357,9 @@ __decorateClass([
|
|
|
332
357
|
__decorateClass([
|
|
333
358
|
property({ type: Number })
|
|
334
359
|
], ObcInstrumentRadial.prototype, "clipBottom", 2);
|
|
360
|
+
__decorateClass([
|
|
361
|
+
property({ type: Boolean })
|
|
362
|
+
], ObcInstrumentRadial.prototype, "zoomToFitArc", 2);
|
|
335
363
|
ObcInstrumentRadial = __decorateClass([
|
|
336
364
|
customElement("obc-instrument-radial")
|
|
337
365
|
], 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';\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@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 @property({type: String}) needleColor: string | undefined;\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 @property({type: Number}) clipTop: number = 0; // in percent of height\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n\n get minAngle(): number {\n return this.getAngle(this.minValue);\n }\n\n get maxAngle(): number {\n return this.getAngle(this.maxValue);\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 setpointAngle =\n this.setpoint !== undefined ? this.getAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.getAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.getAngle(0),\n endAngle: this.getAngle(this.value),\n fillColor: barColor,\n },\n ];\n\n const width = 448;\n const height = width * (1 - this.clipTop / 100 - this.clipBottom / 100);\n const top = -width / 2 + (width * this.clipTop) / 100;\n const viewBox = `-${width / 2} ${top} ${width} ${height}`;\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(this.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=${[\n {\n startAngle: this.minAngle,\n endAngle: this.maxAngle,\n roundInsideCut: true,\n roundOutsideCut: true,\n },\n ]}\n .watchCircleType=${this.type === ObcGaugeRadialType.needle\n ? WatchCircleType.single\n : WatchCircleType.double}\n .barAreas=${barAreas}\n .clipTop=${this.clipTop}\n .clipBottom=${this.clipBottom}\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 if (this.type === ObcGaugeRadialType.needle) {\n return svg`<g transform=\"rotate(${this.getAngle(this.value)}) translate(-256, -256)\">\n <circle cx=\"256\" cy=\"256\" r=\"14\" fill=${needleColor}/>\n <rect x=\"250\" y=\"96\" width=\"12\" height=\"192\" rx=\"6\" fill=${needleColor}/>\n <rect x=\"252\" y=\"98\" width=\"8\" height=\"188\" rx=\"4\" stroke=${needleColor} fill=${needleColor} stroke-width=\"4\"/>\n </svg> \n`;\n } else {\n return svg`<g transform=\"rotate(${this.getAngle(this.value)}) translate(-256, -256)\">\n<rect x=\"252\" y=\"96\" width=\"8\" height=\"48\" rx=\"4\" fill=${needleColor} stroke=\"var(--border-silhouette-color)\"/>\n</svg>\n `;\n }\n }\n\n get tickmarks(): Tickmark[] {\n const tickmarks: Tickmark[] = [];\n\n // Primary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const primaryInterval = this.primaryTickmarkInterval;\n if (\n primaryInterval !== undefined &&\n primaryInterval > 0 &&\n Number.isFinite(primaryInterval)\n ) {\n for (let i = primaryInterval; i < this.maxValue; i += primaryInterval) {\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.primary,\n text: this.showLabels ? i.toString() : undefined,\n });\n }\n\n if (this.showLabels && this.maxValue % primaryInterval === 0) {\n tickmarks.push({\n angle: this.getAngle(this.maxValue),\n type: TickmarkType.textOnly,\n text: this.showLabels ? this.maxValue.toString() : undefined,\n });\n }\n\n for (let i = -primaryInterval; i > this.minValue; i -= primaryInterval) {\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.primary,\n text: this.showLabels ? i.toString() : undefined,\n });\n }\n\n if (this.showLabels && this.minValue % primaryInterval === 0) {\n tickmarks.push({\n angle: this.getAngle(this.minValue),\n type: TickmarkType.textOnly,\n text: this.showLabels ? this.minValue.toString() : undefined,\n });\n }\n }\n\n // Secondary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const secondaryInterval = this.secondaryTickmarkInterval;\n if (\n secondaryInterval !== undefined &&\n secondaryInterval > 0 &&\n Number.isFinite(secondaryInterval)\n ) {\n const existingTickmarks = tickmarks.map((t) => t.angle);\n\n for (\n let i = secondaryInterval;\n i < this.maxValue;\n i += secondaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.secondary,\n });\n }\n\n for (\n let i = -secondaryInterval;\n i > this.minValue;\n i -= secondaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.secondary,\n });\n }\n }\n\n // Tertiary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const tertiaryInterval = this.tertiaryTickmarkInterval;\n if (\n tertiaryInterval !== undefined &&\n tertiaryInterval > 0 &&\n Number.isFinite(tertiaryInterval)\n ) {\n const existingTickmarks = tickmarks.map((t) => t.angle);\n\n for (let i = tertiaryInterval; i < this.maxValue; i += tertiaryInterval) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.tertiary,\n });\n }\n\n for (\n let i = -tertiaryInterval;\n i > this.minValue;\n i -= tertiaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.tertiary,\n });\n }\n }\n\n // Add the zero tickmark\n\n const zeroTickmark = tickmarks.find((t) => t.angle === this.getAngle(0));\n if (zeroTickmark) {\n zeroTickmark.type =\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly;\n } else {\n tickmarks.push({\n angle: this.getAngle(0),\n type: this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n text: this.showLabels ? '0' : undefined,\n });\n }\n\n return tickmarks;\n }\n\n private get _advices(): AngleAdviceRaw[] {\n return this.advices.map((advice) => {\n const minAngle = this.getAngle(advice.minValue);\n const maxAngle = this.getAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (this.value >= advice.minValue && this.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, 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\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@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 @property({type: String}) needleColor: string | undefined;\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 @property({type: Number}) clipTop: number = 0; // in percent of height\n @property({type: Number}) clipBottom: number = 0; // in percent of height\n @property({type: Boolean}) zoomToFitArc: boolean = false;\n\n private _radiusOffset = 0;\n private _arcFrame: ZoomToFitArcFrame | undefined;\n\n get minAngle(): number {\n return this.getAngle(this.minValue);\n }\n\n get maxAngle(): number {\n return this.getAngle(this.maxValue);\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 setpointAngle =\n this.setpoint !== undefined ? this.getAngle(this.setpoint) : undefined;\n const newSetpointAngle =\n this.newSetpoint !== undefined\n ? this.getAngle(this.newSetpoint)\n : undefined;\n\n const barAreas =\n this.type === ObcGaugeRadialType.needle\n ? []\n : [\n {\n startAngle: this.getAngle(0),\n endAngle: this.getAngle(this.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 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 viewBox = frame.viewBox;\n this._radiusOffset = frame.radiusOffset;\n this._arcFrame = frame;\n } else {\n this._radiusOffset = 0;\n this._arcFrame = undefined;\n const width = 448;\n const height = width * (1 - this.clipTop / 100 - this.clipBottom / 100);\n const top = -width / 2 + (width * this.clipTop) / 100;\n viewBox = `${-width / 2} ${top} ${width} ${height}`;\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(this.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 : this.clipTop}\n .clipBottom=${this.zoomToFitArc ? 0 : this.clipBottom}\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 if (this.type === ObcGaugeRadialType.needle) {\n return svg`<g transform=\"rotate(${this.getAngle(this.value)}) translate(-256, -256)\">\n <circle cx=\"256\" cy=\"256\" r=\"14\" fill=${needleColor}/>\n <rect x=\"250\" y=\"${96 - rOff}\" width=\"12\" height=\"${192 + rOff}\" rx=\"6\" fill=${needleColor}/>\n <rect x=\"252\" y=\"${98 - rOff}\" width=\"8\" height=\"${188 + rOff}\" rx=\"4\" stroke=${needleColor} fill=${needleColor} stroke-width=\"4\"/>\n </g>\n`;\n } else {\n return svg`<g transform=\"rotate(${this.getAngle(this.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 tickmarks: Tickmark[] = [];\n\n // Primary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const primaryInterval = this.primaryTickmarkInterval;\n if (\n primaryInterval !== undefined &&\n primaryInterval > 0 &&\n Number.isFinite(primaryInterval)\n ) {\n for (let i = primaryInterval; i < this.maxValue; i += primaryInterval) {\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.primary,\n text: this.showLabels ? i.toString() : undefined,\n });\n }\n\n if (this.showLabels && this.maxValue % primaryInterval === 0) {\n tickmarks.push({\n angle: this.getAngle(this.maxValue),\n type: TickmarkType.textOnly,\n text: this.showLabels ? this.maxValue.toString() : undefined,\n });\n }\n\n for (let i = -primaryInterval; i > this.minValue; i -= primaryInterval) {\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.primary,\n text: this.showLabels ? i.toString() : undefined,\n });\n }\n\n if (this.showLabels && this.minValue % primaryInterval === 0) {\n tickmarks.push({\n angle: this.getAngle(this.minValue),\n type: TickmarkType.textOnly,\n text: this.showLabels ? this.minValue.toString() : undefined,\n });\n }\n }\n\n // Secondary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const secondaryInterval = this.secondaryTickmarkInterval;\n if (\n secondaryInterval !== undefined &&\n secondaryInterval > 0 &&\n Number.isFinite(secondaryInterval)\n ) {\n const existingTickmarks = tickmarks.map((t) => t.angle);\n\n for (\n let i = secondaryInterval;\n i < this.maxValue;\n i += secondaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.secondary,\n });\n }\n\n for (\n let i = -secondaryInterval;\n i > this.minValue;\n i -= secondaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.secondary,\n });\n }\n }\n\n // Tertiary tickmarks — skip when undefined or <= 0 to prevent infinite loops\n const tertiaryInterval = this.tertiaryTickmarkInterval;\n if (\n tertiaryInterval !== undefined &&\n tertiaryInterval > 0 &&\n Number.isFinite(tertiaryInterval)\n ) {\n const existingTickmarks = tickmarks.map((t) => t.angle);\n\n for (let i = tertiaryInterval; i < this.maxValue; i += tertiaryInterval) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.tertiary,\n });\n }\n\n for (\n let i = -tertiaryInterval;\n i > this.minValue;\n i -= tertiaryInterval\n ) {\n if (existingTickmarks.includes(this.getAngle(i))) {\n continue;\n }\n tickmarks.push({\n angle: this.getAngle(i),\n type: TickmarkType.tertiary,\n });\n }\n }\n\n // Add the zero tickmark\n\n const zeroTickmark = tickmarks.find((t) => t.angle === this.getAngle(0));\n if (zeroTickmark) {\n zeroTickmark.type =\n this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly;\n } else {\n tickmarks.push({\n angle: this.getAngle(0),\n type: this.minValue < 0 ? TickmarkType.main : TickmarkType.textOnly,\n text: this.showLabels ? '0' : undefined,\n });\n }\n\n return tickmarks;\n }\n\n private get _advices(): AngleAdviceRaw[] {\n return this.advices.map((advice) => {\n const minAngle = this.getAngle(advice.minValue);\n const maxAngle = this.getAngle(advice.maxValue);\n let state = advice.hinted ? AdviceState.hinted : AdviceState.regular;\n if (this.value >= advice.minValue && this.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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"}
|
|
@@ -58,25 +58,12 @@ const componentStyle = css`
|
|
|
58
58
|
height: 100%;
|
|
59
59
|
border-radius: 50%;
|
|
60
60
|
overflow: hidden;
|
|
61
|
-
animation: loading-spin var(--spinner-rotation-duration, 1000ms) linear
|
|
62
|
-
infinite;
|
|
63
61
|
--spinner-radius: calc(
|
|
64
62
|
(var(--spinner-size) - var(--spinner-stroke-width)) / 2
|
|
65
63
|
);
|
|
66
64
|
--spinner-cap-size: var(--spinner-stroke-width);
|
|
67
65
|
}
|
|
68
66
|
|
|
69
|
-
:is(.sequence-loading-spinner .spinner) .cap {
|
|
70
|
-
position: absolute;
|
|
71
|
-
top: 50%;
|
|
72
|
-
left: 50%;
|
|
73
|
-
width: var(--spinner-cap-size);
|
|
74
|
-
height: var(--spinner-cap-size);
|
|
75
|
-
border-radius: 50%;
|
|
76
|
-
pointer-events: none;
|
|
77
|
-
z-index: 2;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
67
|
:is(.sequence-loading-spinner .spinner)::before,:is(.sequence-loading-spinner .spinner)::after {
|
|
81
68
|
content: "";
|
|
82
69
|
position: absolute;
|
|
@@ -97,76 +84,99 @@ const componentStyle = css`
|
|
|
97
84
|
transparent calc(100% - var(--spinner-stroke-width)),
|
|
98
85
|
black calc(100% - var(--spinner-stroke-width))
|
|
99
86
|
);
|
|
87
|
+
mask: radial-gradient(
|
|
88
|
+
farthest-side,
|
|
89
|
+
transparent calc(100% - var(--spinner-stroke-width)),
|
|
90
|
+
black calc(100% - var(--spinner-stroke-width))
|
|
91
|
+
);
|
|
100
92
|
}
|
|
101
93
|
|
|
102
|
-
:is(.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
:is(.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
165deg,
|
|
140
|
-
color-mix(
|
|
141
|
-
in srgb,
|
|
142
|
-
var(--base-blue-500) 45%,
|
|
143
|
-
var(--element-disabled-color)
|
|
144
|
-
)
|
|
145
|
-
220deg,
|
|
146
|
-
color-mix(
|
|
147
|
-
in srgb,
|
|
148
|
-
var(--base-blue-500) 20%,
|
|
149
|
-
var(--element-disabled-color)
|
|
150
|
-
)
|
|
151
|
-
289deg,
|
|
152
|
-
var(--element-disabled-color) 360deg
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
.progression-scanning :is(.sequence-loading-spinner .spinner) {
|
|
157
|
-
--spinner-scanning-start-deg: 226deg;
|
|
94
|
+
:is(.sequence-loading-spinner .spinner) .cap {
|
|
95
|
+
position: absolute;
|
|
96
|
+
top: 50%;
|
|
97
|
+
left: 50%;
|
|
98
|
+
width: var(--spinner-cap-size);
|
|
99
|
+
height: var(--spinner-cap-size);
|
|
100
|
+
border-radius: 50%;
|
|
101
|
+
pointer-events: none;
|
|
102
|
+
z-index: 2;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
:is(.sequence-loading-spinner.progression-determinate .spinner)::after {
|
|
106
|
+
background: conic-gradient(
|
|
107
|
+
from 0deg,
|
|
108
|
+
var(--element-neutral-enhanced-color) 0deg,
|
|
109
|
+
var(--element-neutral-enhanced-color) var(--spinner-progress-deg),
|
|
110
|
+
transparent var(--spinner-progress-deg),
|
|
111
|
+
transparent 360deg
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
:is(.sequence-loading-spinner.progression-determinate .spinner) .cap-start,:is(.sequence-loading-spinner.progression-determinate .spinner) .cap-end {
|
|
116
|
+
background: var(--element-neutral-enhanced-color);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
:is(.sequence-loading-spinner.progression-determinate .spinner) .cap-start {
|
|
120
|
+
transform: translate(-50%, -50%) rotate(0deg)
|
|
121
|
+
translateY(calc(-1 * var(--spinner-radius)));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
:is(.sequence-loading-spinner.progression-determinate .spinner) .cap-end {
|
|
125
|
+
transform: translate(-50%, -50%) rotate(var(--spinner-progress-deg))
|
|
126
|
+
translateY(calc(-1 * var(--spinner-radius)));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:is(.sequence-loading-spinner.progression-determinate:is(.progress-empty,.progress-full) .spinner) .cap-start,:is(.sequence-loading-spinner.progression-determinate:is(.progress-empty,.progress-full) .spinner) .cap-end {
|
|
130
|
+
opacity: 0;
|
|
158
131
|
}
|
|
159
132
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
133
|
+
.sequence-loading-spinner.progression-scanning .spinner {
|
|
134
|
+
animation: loading-spin var(--spinner-rotation-duration, 1000ms) linear
|
|
135
|
+
infinite;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
:is(.sequence-loading-spinner.progression-scanning .spinner)::after {
|
|
139
|
+
background: conic-gradient(
|
|
140
|
+
from 90deg,
|
|
141
|
+
var(--element-disabled-color) 0deg,
|
|
142
|
+
var(--element-disabled-color) 135deg,
|
|
143
|
+
var(--element-disabled-color) 136deg,
|
|
144
|
+
color-mix(
|
|
145
|
+
in srgb,
|
|
146
|
+
var(--base-blue-500) 20%,
|
|
147
|
+
var(--element-disabled-color)
|
|
148
|
+
)
|
|
149
|
+
207deg,
|
|
150
|
+
color-mix(
|
|
151
|
+
in srgb,
|
|
152
|
+
var(--base-blue-500) 45%,
|
|
153
|
+
var(--element-disabled-color)
|
|
154
|
+
)
|
|
155
|
+
276deg,
|
|
156
|
+
color-mix(
|
|
157
|
+
in srgb,
|
|
158
|
+
var(--base-blue-500) 96%,
|
|
159
|
+
var(--element-disabled-color)
|
|
160
|
+
)
|
|
161
|
+
331deg,
|
|
162
|
+
var(--base-blue-500) 360deg
|
|
163
|
+
);
|
|
164
|
+
}
|
|
166
165
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
166
|
+
.sequence-loading-spinner.progression-scanning .spinner {
|
|
167
|
+
|
|
168
|
+
--spinner-scanning-head-deg: 90deg;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
:is(.sequence-loading-spinner.progression-scanning .spinner) .cap-start {
|
|
172
|
+
background: var(--base-blue-500);
|
|
173
|
+
transform: translate(-50%, -50%) rotate(var(--spinner-scanning-head-deg))
|
|
174
|
+
translateY(calc(-1 * var(--spinner-radius)));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
:is(.sequence-loading-spinner.progression-scanning .spinner) .cap-end {
|
|
178
|
+
opacity: 0;
|
|
179
|
+
}
|
|
170
180
|
|
|
171
181
|
@keyframes loading-spin {
|
|
172
182
|
to {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-loading-spinner.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sequence-loading-spinner.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
1
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
2
2
|
export declare enum SequenceLoadingSpinnerType {
|
|
3
3
|
indicator = "indicator",
|
|
4
4
|
indicatorPoint = "indicator-point",
|
|
@@ -21,11 +21,14 @@ export declare enum SequenceLoadingSpinnerProgressionType {
|
|
|
21
21
|
* - `type`: `indicator | indicator-point | tag | tag-point | button | button-point`.
|
|
22
22
|
* - `progression`: `determinate | scanning`.
|
|
23
23
|
* - `progress-percent`: number `0–100` (used when `progression="determinate"`).
|
|
24
|
+
* - Determinate progression uses a built-in fill animation from the current arc toward full completion.
|
|
24
25
|
* - `rotation-duration-ms`: number in ms (controls spin speed).
|
|
25
26
|
*
|
|
26
27
|
* Usage Guidelines:
|
|
27
28
|
* - Use `type` to match the surrounding element size.
|
|
28
|
-
* -
|
|
29
|
+
* - With `progression="determinate"`, the arc starts at 12 o'clock on the ring and grows clockwise.
|
|
30
|
+
* - `progress-percent` is used as the starting offset for the determinate fill. After a short delay, the arc animates smoothly from that start value toward full completion.
|
|
31
|
+
* - Changing `progress-percent` during determinate progression restarts the fill from the new start value.
|
|
29
32
|
*
|
|
30
33
|
* Slots / Content:
|
|
31
34
|
* - None.
|
|
@@ -42,22 +45,30 @@ export declare enum SequenceLoadingSpinnerProgressionType {
|
|
|
42
45
|
* <obc-sequence-loading-spinner
|
|
43
46
|
* type="button"
|
|
44
47
|
* progression="determinate"
|
|
45
|
-
* progress-percent="
|
|
46
|
-
* rotation-duration-ms="1200"
|
|
48
|
+
* progress-percent="25"
|
|
47
49
|
* ></obc-sequence-loading-spinner>
|
|
48
50
|
* ```
|
|
49
|
-
*
|
|
50
|
-
* Keywords: sequence, loading, spinner, progress, determinate, scanning.
|
|
51
51
|
*/
|
|
52
52
|
export declare class ObcSequenceLoadingSpinner extends LitElement {
|
|
53
53
|
type: SequenceLoadingSpinnerType;
|
|
54
54
|
progression: SequenceLoadingSpinnerProgressionType;
|
|
55
55
|
rotationDurationMs: number;
|
|
56
56
|
progressPercent: number;
|
|
57
|
-
private
|
|
57
|
+
private determinateDisplayPercent;
|
|
58
|
+
private fillAnimGeneration;
|
|
59
|
+
private determinateFillFrame?;
|
|
60
|
+
private determinateStartDelayTimeout?;
|
|
58
61
|
private get isButtonType();
|
|
59
62
|
private get clampedRotationDurationMs();
|
|
60
63
|
private get clampedProgressPercent();
|
|
64
|
+
private get determinateRenderPercent();
|
|
65
|
+
private get rootClasses();
|
|
66
|
+
private get spinnerStyle();
|
|
67
|
+
disconnectedCallback(): void;
|
|
68
|
+
connectedCallback(): void;
|
|
69
|
+
updated(changed: PropertyValues): void;
|
|
70
|
+
private clearFillAnimation;
|
|
71
|
+
private startDeterminateFillAnimation;
|
|
61
72
|
render(): import('lit-html').TemplateResult<1>;
|
|
62
73
|
static styles: import('lit').CSSResult;
|
|
63
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-loading-spinner.d.ts","sourceRoot":"","sources":["../../../src/components/sequence-loading-spinner/sequence-loading-spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAkB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"sequence-loading-spinner.d.ts","sourceRoot":"","sources":["../../../src/components/sequence-loading-spinner/sequence-loading-spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAkB,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,KAAK,CAAC;AAWxC,oBAAY,0BAA0B;IACpC,SAAS,cAAc;IACvB,cAAc,oBAAoB;IAClC,GAAG,QAAQ;IACX,QAAQ,cAAc;IACtB,MAAM,WAAW;IACjB,WAAW,iBAAiB;CAC7B;AAED,oBAAY,qCAAqC;IAC/C,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBACa,yBAA0B,SAAQ,UAAU;IAC7B,IAAI,EAAE,0BAA0B,CACnB;IACb,WAAW,EAAE,qCAAqC,CACxB;IAEpD,kBAAkB,SAAQ;IAE1B,eAAe,SAAK;IAEX,OAAO,CAAC,yBAAyB,CAAK;IAE/C,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,oBAAoB,CAAC,CAAS;IACtC,OAAO,CAAC,4BAA4B,CAAC,CAAS;IAE9C,OAAO,KAAK,YAAY,GAKvB;IAED,OAAO,KAAK,yBAAyB,GAKpC;IAED,OAAO,KAAK,sBAAsB,GAKjC;IAED,OAAO,KAAK,wBAAwB,GAInC;IAED,OAAO,KAAK,WAAW,GAWtB;IAED,OAAO,KAAK,YAAY,GAUvB;IAEQ,oBAAoB,IAAI,IAAI;IAK5B,iBAAiB,IAAI,IAAI;IAczB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAoB/C,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,6BAA6B;IA2C5B,MAAM;IA4Bf,OAAgB,MAAM,0BAA6B;CACpD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,8BAA8B,EAAE,yBAAyB,CAAC;KAC3D;CACF"}
|