@tellegen/svelte 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +46 -0
  2. package/dist/Sparkline.svelte.d.ts +0 -1
  3. package/dist/TellegenMap.svelte +328 -200
  4. package/dist/TellegenMap.svelte.d.ts +0 -1
  5. package/dist/TellegenProvider.svelte +4 -0
  6. package/dist/TellegenProvider.svelte.d.ts +0 -1
  7. package/dist/TellegenShell.svelte +19 -13
  8. package/dist/TellegenShell.svelte.d.ts +0 -1
  9. package/dist/TellegenViewer.svelte.d.ts +0 -1
  10. package/dist/api.d.ts +8 -2
  11. package/dist/api.js +6 -2
  12. package/dist/colors.d.ts +7 -8
  13. package/dist/colors.js +13 -13
  14. package/dist/components/AppFooter.svelte.d.ts +0 -1
  15. package/dist/components/AppHeader.svelte +27 -13
  16. package/dist/components/AppHeader.svelte.d.ts +0 -1
  17. package/dist/components/BindingLines.svelte +3 -6
  18. package/dist/components/BindingLines.svelte.d.ts +0 -1
  19. package/dist/components/BusPicker.svelte +8 -2
  20. package/dist/components/BusPicker.svelte.d.ts +0 -1
  21. package/dist/components/ControlPanel.svelte +106 -343
  22. package/dist/components/ControlPanel.svelte.d.ts +0 -1
  23. package/dist/components/DemandSlider.svelte +26 -8
  24. package/dist/components/DemandSlider.svelte.d.ts +0 -1
  25. package/dist/components/DiagramCanvas.svelte +486 -0
  26. package/dist/components/DiagramCanvas.svelte.d.ts +13 -0
  27. package/dist/components/DisplayControls.svelte +4 -2
  28. package/dist/components/DisplayControls.svelte.d.ts +0 -1
  29. package/dist/components/DropZone.svelte.d.ts +0 -1
  30. package/dist/components/FormulationSelector.svelte +8 -3
  31. package/dist/components/FormulationSelector.svelte.d.ts +0 -1
  32. package/dist/components/LocalCaseDetails.svelte +57 -44
  33. package/dist/components/LocalCaseDetails.svelte.d.ts +0 -1
  34. package/dist/components/McResults.svelte +365 -0
  35. package/dist/components/McResults.svelte.d.ts +11 -0
  36. package/dist/components/ModelDetails.svelte +230 -0
  37. package/dist/components/ModelDetails.svelte.d.ts +7 -0
  38. package/dist/components/MulticonductorDetails.svelte +227 -78
  39. package/dist/components/MulticonductorDetails.svelte.d.ts +0 -1
  40. package/dist/components/NetworkStats.svelte +20 -18
  41. package/dist/components/NetworkStats.svelte.d.ts +0 -1
  42. package/dist/components/NotificationCenter.svelte +243 -0
  43. package/dist/components/NotificationCenter.svelte.d.ts +3 -0
  44. package/dist/components/PanelCard.svelte +319 -0
  45. package/dist/components/PanelCard.svelte.d.ts +9 -0
  46. package/dist/components/PanelFrame.svelte +46 -0
  47. package/dist/components/PanelFrame.svelte.d.ts +16 -0
  48. package/dist/components/PanelHost.svelte +212 -0
  49. package/dist/components/PanelHost.svelte.d.ts +3 -0
  50. package/dist/components/PlacementCue.svelte.d.ts +0 -1
  51. package/dist/components/PowerFlowDetails.svelte +99 -0
  52. package/dist/components/PowerFlowDetails.svelte.d.ts +3 -0
  53. package/dist/components/RatingSlider.svelte +5 -9
  54. package/dist/components/RatingSlider.svelte.d.ts +0 -1
  55. package/dist/components/RestoreDefaultsButton.svelte.d.ts +0 -1
  56. package/dist/components/SavedNetworkDetails.svelte +214 -0
  57. package/dist/components/SavedNetworkDetails.svelte.d.ts +3 -0
  58. package/dist/components/SensitivityReadout.svelte +24 -16
  59. package/dist/components/SensitivityReadout.svelte.d.ts +0 -1
  60. package/dist/components/SizeLegend.svelte.d.ts +0 -1
  61. package/dist/components/SolveCard.svelte +46 -49
  62. package/dist/components/SolveCard.svelte.d.ts +0 -1
  63. package/dist/components/TopMovers.svelte +8 -3
  64. package/dist/components/TopMovers.svelte.d.ts +2 -18
  65. package/dist/components.d.ts +2 -1
  66. package/dist/components.js +2 -0
  67. package/dist/context.svelte.d.ts +0 -1
  68. package/dist/controller.svelte.d.ts +74 -41
  69. package/dist/controller.svelte.js +1095 -284
  70. package/dist/diagram-labels.d.ts +9 -0
  71. package/dist/diagram-labels.js +40 -0
  72. package/dist/display.d.ts +3 -8
  73. package/dist/display.js +31 -27
  74. package/dist/drop-classify.d.ts +5 -42
  75. package/dist/drop-classify.js +5 -78
  76. package/dist/drop-limits.d.ts +27 -0
  77. package/dist/drop-limits.js +83 -0
  78. package/dist/format.d.ts +0 -1
  79. package/dist/format.js +5 -4
  80. package/dist/index.d.ts +11 -7
  81. package/dist/index.js +8 -3
  82. package/dist/map-bounds.d.ts +5 -0
  83. package/dist/map-bounds.js +41 -0
  84. package/dist/map.d.ts +1 -2
  85. package/dist/map.js +1 -1
  86. package/dist/multiconductor.d.ts +11 -3
  87. package/dist/multiconductor.js +107 -14
  88. package/dist/notices.svelte.d.ts +29 -0
  89. package/dist/notices.svelte.js +82 -0
  90. package/dist/panels.svelte.d.ts +65 -0
  91. package/dist/panels.svelte.js +215 -0
  92. package/dist/state.svelte.d.ts +90 -24
  93. package/dist/state.svelte.js +94 -20
  94. package/dist/synthetic-layout.d.ts +0 -1
  95. package/dist/synthetic-layout.js +17 -2
  96. package/dist/transformer-icon.d.ts +0 -1
  97. package/dist/types.d.ts +0 -1
  98. package/package.json +28 -12
  99. package/dist/Sparkline.svelte.d.ts.map +0 -1
  100. package/dist/TellegenMap.svelte.d.ts.map +0 -1
  101. package/dist/TellegenProvider.svelte.d.ts.map +0 -1
  102. package/dist/TellegenShell.svelte.d.ts.map +0 -1
  103. package/dist/TellegenViewer.svelte.d.ts.map +0 -1
  104. package/dist/api.d.ts.map +0 -1
  105. package/dist/colors.d.ts.map +0 -1
  106. package/dist/components/AppFooter.svelte.d.ts.map +0 -1
  107. package/dist/components/AppHeader.svelte.d.ts.map +0 -1
  108. package/dist/components/BindingLines.svelte.d.ts.map +0 -1
  109. package/dist/components/BusPicker.svelte.d.ts.map +0 -1
  110. package/dist/components/ControlPanel.svelte.d.ts.map +0 -1
  111. package/dist/components/DemandSlider.svelte.d.ts.map +0 -1
  112. package/dist/components/DisplayControls.svelte.d.ts.map +0 -1
  113. package/dist/components/DropZone.svelte.d.ts.map +0 -1
  114. package/dist/components/FormulationSelector.svelte.d.ts.map +0 -1
  115. package/dist/components/LocalCaseDetails.svelte.d.ts.map +0 -1
  116. package/dist/components/MulticonductorDetails.svelte.d.ts.map +0 -1
  117. package/dist/components/NetworkStats.svelte.d.ts.map +0 -1
  118. package/dist/components/PlacementCue.svelte.d.ts.map +0 -1
  119. package/dist/components/RatingSlider.svelte.d.ts.map +0 -1
  120. package/dist/components/RestoreDefaultsButton.svelte.d.ts.map +0 -1
  121. package/dist/components/SensitivityReadout.svelte.d.ts.map +0 -1
  122. package/dist/components/SizeLegend.svelte.d.ts.map +0 -1
  123. package/dist/components/SolveCard.svelte.d.ts.map +0 -1
  124. package/dist/components/TopMovers.svelte.d.ts.map +0 -1
  125. package/dist/components.d.ts.map +0 -1
  126. package/dist/context.svelte.d.ts.map +0 -1
  127. package/dist/controller.svelte.d.ts.map +0 -1
  128. package/dist/display.d.ts.map +0 -1
  129. package/dist/drop-classify.d.ts.map +0 -1
  130. package/dist/format.d.ts.map +0 -1
  131. package/dist/index.d.ts.map +0 -1
  132. package/dist/map.d.ts.map +0 -1
  133. package/dist/multiconductor.d.ts.map +0 -1
  134. package/dist/state.svelte.d.ts.map +0 -1
  135. package/dist/study-package.d.ts +0 -9
  136. package/dist/study-package.d.ts.map +0 -1
  137. package/dist/study-package.js +0 -17
  138. package/dist/synthetic-layout.d.ts.map +0 -1
  139. package/dist/transformer-icon.d.ts.map +0 -1
  140. package/dist/types.d.ts.map +0 -1
@@ -1,14 +1,28 @@
1
1
  import type { CaseSummary, DemandDeltas, Network, NetworkBranch, NetworkBus, SensitivityColumn, Solution, SolveIteration } from './api.js';
2
- import { type BranchRatingDeltas, type CaseFileSummary, type DistGraph, type IngestedDistCase, type SensTarget, type Topology } from '@tellegen/engine';
2
+ import { type StudyView, type BranchRatingDeltas, type BrowserMcPfSession, type CaseFileSummary, type DistGraph, type Formulation, type IngestedDistCase, type McPfResult, type McLoadBranchState, type McLoadPowerEdit, type McStudySnapshot, type SensTarget, type Topology } from '@tellegen/engine';
3
3
  import type { MultiView } from './multiconductor.js';
4
4
  export type SolveBackend = 'clarabel-wasm' | 'clarabel-wasm-server-sensitivity' | 'rust-server';
5
5
  /** A map framing request: a case id, 'all', or one branch to center. */
6
6
  export type FrameTarget = string | 'all' | {
7
7
  caseId: string;
8
8
  branchId: number;
9
+ } | {
10
+ caseId: string;
11
+ busId: number;
9
12
  };
13
+ export interface CameraSnapshot {
14
+ center: [number, number];
15
+ zoom: number;
16
+ bearing: number;
17
+ pitch: number;
18
+ }
19
+ export interface DiagramCameraSnapshot {
20
+ caseId: string;
21
+ center: [number, number];
22
+ scale: number;
23
+ }
10
24
  export type DemandRangeMode = 'local' | 'full';
11
- export type DisplayMode = 'lmp' | 'angle' | 'voltage';
25
+ export type DisplayMode = 'price' | 'angle' | 'voltage';
12
26
  /** The case a removal promoted to active, so the caller can hydrate it: a backend
13
27
  * case needs its network/solution loaded, a local needs a browser solve, and
14
28
  * `none` means nothing remains (or the removal left the active case untouched). */
@@ -34,6 +48,7 @@ export interface LocalSubstations {
34
48
  }
35
49
  type CoordsKind = 'file' | 'synthetic_pending' | 'synthetic' | 'manual' | 'geofile';
36
50
  type LocalView = {
51
+ coordinate_space?: 'geographic' | 'diagram';
37
52
  buses: NetworkBus[];
38
53
  branches: NetworkBranch[];
39
54
  };
@@ -42,8 +57,11 @@ export interface LocalCaseInit {
42
57
  id: string;
43
58
  label: string;
44
59
  fileName: string;
60
+ formulation?: Formulation;
61
+ declaredFormulation?: Formulation;
45
62
  summary?: CaseFileSummary | null;
46
- networkJson?: string;
63
+ /** Retained PowerIO module used to construct solver studies. */
64
+ studyInputJson?: string;
47
65
  topology?: Topology;
48
66
  coordsKind?: CoordsKind;
49
67
  view?: LocalView | null;
@@ -59,10 +77,11 @@ export declare class LocalCase {
59
77
  readonly id: string;
60
78
  readonly label: string;
61
79
  readonly fileName: string;
80
+ readonly declaredFormulation?: Formulation;
62
81
  /** Case stats; null for a .pwd display only entry. */
63
82
  summary: CaseFileSummary | null;
64
- /** Raw powerio Network JSON for the browser solver branch. */
65
- networkJson: string | undefined;
83
+ /** Generation 2 PowerIO IR used for display edits and solver studies. */
84
+ studyInputJson: string | undefined;
66
85
  /** Topology for synthetic placement when the file has no coordinates. */
67
86
  topology: Topology | undefined;
68
87
  coordsKind: CoordsKind | undefined;
@@ -72,6 +91,13 @@ export declare class LocalCase {
72
91
  lon: number;
73
92
  lat: number;
74
93
  } | undefined;
94
+ diagram: {
95
+ view: LocalView;
96
+ layer: string;
97
+ name: string;
98
+ warnings: string[];
99
+ } | null;
100
+ displayMode: 'geographic' | 'diagram';
75
101
  geoSource: string | undefined;
76
102
  geoWarnings: string[] | undefined;
77
103
  network: Network | null;
@@ -81,8 +107,7 @@ export declare class LocalCase {
81
107
  deltas: DemandDeltas;
82
108
  /** Committed branch rating deltas (MW from base, keyed by branch). */
83
109
  ratings: BranchRatingDeltas;
84
- /** The OPF formulation the browser Study solves for this case: DC OPF (default),
85
- * full AC OPF, or the SOCWR relaxation. Changing it rebuilds the Study. */
110
+ /** The selected calculation. Changing it rebuilds the numerical Study. */
86
111
  formulation: import("@tellegen/engine").BrowserFormulation;
87
112
  iterations: SolveIteration[];
88
113
  solving: boolean;
@@ -91,6 +116,8 @@ export declare class LocalCase {
91
116
  solveFallbackReason: string | null;
92
117
  /** Monotone token: only the latest solve may write this case. */
93
118
  solveSeq: number;
119
+ /** Monotone generation for external optimistic concurrency. */
120
+ revisionGeneration: number;
94
121
  /** Monotone token: only the latest sensitivity request may write this case. */
95
122
  sensitivitySeq: number;
96
123
  predictedObjective: number | null;
@@ -104,9 +131,10 @@ export declare class LocalCase {
104
131
  export declare class CaseState {
105
132
  readonly id: string;
106
133
  readonly name: string;
134
+ readonly unavailableReason: string | null;
107
135
  network: Network | null;
108
- /** Raw powerio Network JSON for the browser solver; fetched lazily. */
109
- networkJson: string | null;
136
+ /** Retained PowerIO module for the browser solver; fetched lazily. */
137
+ studyInputJson: string | null;
110
138
  /** Boot solution at base demand; never changes. */
111
139
  baseSolution: Solution | null;
112
140
  /** Exact solution at the current committed perturbation. */
@@ -126,6 +154,8 @@ export declare class CaseState {
126
154
  solveFallbackReason: string | null;
127
155
  /** Monotone token: only the latest solve may write this case. */
128
156
  solveSeq: number;
157
+ /** Monotone generation for external optimistic concurrency. */
158
+ revisionGeneration: number;
129
159
  /** Monotone token: only the latest sensitivity request may write this case. */
130
160
  sensitivitySeq: number;
131
161
  /** Closer for this case's in-flight server solve stream, if any. Owned per
@@ -140,27 +170,39 @@ export declare class CaseState {
140
170
  /** A case the solver can run: a server-backed case or a browser-parsed local case. */
141
171
  export type SolvableCase = CaseState | LocalCase;
142
172
  /** The multiconductor ingest payload without the graph: the summary counts,
143
- * connected load/generation, coordinate provenance, and warnings. */
173
+ * connected load/generation, coordinate provenance, and diagnostics. */
144
174
  export type MultiCaseSummary = Omit<IngestedDistCase, 'graph'>;
145
- /** How a multiconductor case is placed on the map. `geographic` positions drop
146
- * straight on; `planar`/`synthetic` need a map center, so they sit `pending`
147
- * until the user places them. */
175
+ /** Geographic coordinates use the map; other positions use the diagram canvas. */
148
176
  export type MultiCoordsKind = 'geographic' | 'planar' | 'synthetic';
149
- /** A multiconductor distribution case parsed in the browser, viewed only: no
150
- * formulation, no sliders, no Study. It carries the bus/terminal graph, its
151
- * placed map view, and the selected bus whose terminal detail expands. Fields
152
- * are reactive like the solvable cases so the panel and map track them. */
177
+ /** A conductor-resolved case with retained electrical inputs and terminal results. */
153
178
  export declare class MulticonductorCase {
154
179
  readonly id: string;
155
180
  readonly label: string;
156
181
  readonly fileName: string;
182
+ moduleJson: string | null;
183
+ geoLayer: string | null;
184
+ geoWarnings: string[];
185
+ result: McPfResult | null;
186
+ mcSnapshot: McStudySnapshot | null;
187
+ mcSession: BrowserMcPfSession | null;
188
+ mcLoadBranches: McLoadBranchState[];
189
+ mcLoadEdits: McLoadPowerEdit[];
190
+ mcEditRevision: number;
191
+ mcEditRunning: boolean;
192
+ mcEditTimer: ReturnType<typeof setTimeout> | null;
193
+ mcSavedAt: string | null;
194
+ solving: boolean;
195
+ solveMs: number | null;
196
+ solveSeq: number;
197
+ revisionGeneration: number;
198
+ solveAbort: AbortController | null;
157
199
  /** Summary counts and coordinate provenance from the parse. */
158
200
  summary: MultiCaseSummary | null;
159
201
  /** The render-ready bus/terminal graph. */
160
202
  graph: DistGraph | null;
161
203
  /** Placement kind resolved at ingest from the case's coordinate space. */
162
204
  coordsKind: MultiCoordsKind;
163
- /** The placed map view; null until placed (planar/synthetic await a center). */
205
+ /** The map or diagram positions. */
164
206
  view: MultiView | null;
165
207
  syntheticCenter: {
166
208
  lon: number;
@@ -181,6 +223,8 @@ export declare class MulticonductorCase {
181
223
  coordsKind: MultiCoordsKind;
182
224
  view?: MultiView | null;
183
225
  });
226
+ get mcPfReason(): string | null;
227
+ get mcPfSupported(): boolean;
184
228
  /** Whether the case is placed and ready to render. */
185
229
  get placed(): boolean;
186
230
  /** The selected bus's placed detail, or null. */
@@ -188,8 +232,30 @@ export declare class MulticonductorCase {
188
232
  /** The selected edge's placed detail, or null. */
189
233
  get selectedEdge(): import("./multiconductor.js").PlacedMultiEdge | null;
190
234
  }
235
+ export interface StudyDisplaySnapshot {
236
+ id: string;
237
+ studyId: string;
238
+ caseId: string;
239
+ revision: number;
240
+ label: string;
241
+ formulation: Formulation;
242
+ network: Network;
243
+ solution: StudyView | null;
244
+ inputJson?: string;
245
+ baseDemandMw?: Record<string, number>;
246
+ }
191
247
  export declare class AppState {
192
248
  #private;
249
+ camera: CameraSnapshot | null;
250
+ cameraRequest: CameraSnapshot | null;
251
+ cameraSeq: number;
252
+ diagramCamera: DiagramCameraSnapshot | null;
253
+ diagramCameraRequest: DiagramCameraSnapshot | null;
254
+ diagramCameraSeq: number;
255
+ requestDiagramCamera(caseId: string, snapshot: Omit<DiagramCameraSnapshot, 'caseId'>): void;
256
+ requestCamera(snapshot: CameraSnapshot): void;
257
+ /** Saved Study inspection is independent of the editable case and its solution. */
258
+ studyView: StudyDisplaySnapshot | null;
193
259
  cases: CaseState[];
194
260
  activeCaseId: string | null;
195
261
  /** Selected bus in the active case. */
@@ -200,21 +266,22 @@ export declare class AppState {
200
266
  previewDeltaMw: number | null;
201
267
  /** Live rating slider value (MW from base) before commit; null when idle. */
202
268
  previewRatingMw: number | null;
203
- /** True while the demand control should keep the map in LMP preview mode. */
269
+ /** True while the demand control should keep the map in nodal value preview mode. */
204
270
  previewActive: boolean;
205
- /** Engine first-order LMP preview for the live drag: predicted change in LMP
206
- * ($/MWh) per bus at the previewed edit, scoped to the case and selection
271
+ /** Engine first order nodal value preview for the live drag, scoped to the case and selection
207
272
  * target (bus or branch) it was computed for. Set by the Study path; null when
208
273
  * no Study preview applies (the map then falls back to the JS
209
274
  * sensitivity-times-step preview). Reassigned wholesale, so $state.raw. */
210
- previewLmp: {
275
+ previewPrices: {
211
276
  caseId: string;
212
277
  target: SensTarget;
213
278
  delta: Map<number, number>;
279
+ units: string;
214
280
  } | null;
215
281
  demandRangeMode: DemandRangeMode;
216
282
  displayMode: DisplayMode;
217
283
  sensitivityLoading: boolean;
284
+ errorRevision: number;
218
285
  /** Re-runs the operation behind the current `error`, when one applies. Every
219
286
  * write to `error` clears it, so a retry op can never outlive its message. */
220
287
  errorRetry: (() => void) | null;
@@ -225,7 +292,7 @@ export declare class AppState {
225
292
  /** Local case the panel shows; clicking a bundled case or a bus clears it. */
226
293
  activeLocalId: string | null;
227
294
  placingLocalId: string | null;
228
- /** Multiconductor distribution cases parsed in the browser (viewing only). */
295
+ /** Multiconductor cases with retained inputs and AC power flow results. */
229
296
  multiCases: MulticonductorCase[];
230
297
  /** Multiconductor case the panel shows; mutually exclusive with the solvable
231
298
  * active ids. */
@@ -273,4 +340,3 @@ export declare class AppState {
273
340
  }
274
341
  export declare function createAppState(): AppState;
275
342
  export {};
276
- //# sourceMappingURL=state.svelte.d.ts.map
@@ -12,16 +12,19 @@ export class LocalCase {
12
12
  id;
13
13
  label;
14
14
  fileName;
15
+ declaredFormulation;
15
16
  /** Case stats; null for a .pwd display only entry. */
16
17
  summary = $state.raw(null);
17
- /** Raw powerio Network JSON for the browser solver branch. */
18
- networkJson = $state.raw(undefined);
18
+ /** Generation 2 PowerIO IR used for display edits and solver studies. */
19
+ studyInputJson = $state.raw(undefined);
19
20
  /** Topology for synthetic placement when the file has no coordinates. */
20
21
  topology = $state.raw(undefined);
21
22
  coordsKind = $state.raw(undefined);
22
23
  /** Map geometry when the file carried or received coordinates. */
23
24
  view = $state.raw(null);
24
25
  syntheticCenter = $state.raw(undefined);
26
+ diagram = $state.raw(null);
27
+ displayMode = $state('geographic');
25
28
  geoSource = $state.raw(undefined);
26
29
  geoWarnings = $state.raw(undefined);
27
30
  network = $state.raw(null);
@@ -31,8 +34,7 @@ export class LocalCase {
31
34
  deltas = $state.raw({});
32
35
  /** Committed branch rating deltas (MW from base, keyed by branch). */
33
36
  ratings = $state.raw({});
34
- /** The OPF formulation the browser Study solves for this case: DC OPF (default),
35
- * full AC OPF, or the SOCWR relaxation. Changing it rebuilds the Study. */
37
+ /** The selected calculation. Changing it rebuilds the numerical Study. */
36
38
  formulation = $state(DEFAULT_FORMULATION);
37
39
  iterations = $state.raw([]);
38
40
  solving = $state(false);
@@ -41,6 +43,8 @@ export class LocalCase {
41
43
  solveFallbackReason = $state(null);
42
44
  /** Monotone token: only the latest solve may write this case. */
43
45
  solveSeq = 0;
46
+ /** Monotone generation for external optimistic concurrency. */
47
+ revisionGeneration = $state(0);
44
48
  /** Monotone token: only the latest sensitivity request may write this case. */
45
49
  sensitivitySeq = 0;
46
50
  predictedObjective = $state(null);
@@ -50,8 +54,10 @@ export class LocalCase {
50
54
  this.id = init.id;
51
55
  this.label = init.label;
52
56
  this.fileName = init.fileName;
57
+ this.formulation = init.formulation ?? DEFAULT_FORMULATION;
58
+ this.declaredFormulation = init.declaredFormulation;
53
59
  this.summary = init.summary ?? null;
54
- this.networkJson = init.networkJson;
60
+ this.studyInputJson = init.studyInputJson;
55
61
  this.topology = init.topology;
56
62
  this.coordsKind = init.coordsKind;
57
63
  this.view = init.view ?? null;
@@ -66,9 +72,10 @@ export class LocalCase {
66
72
  export class CaseState {
67
73
  id;
68
74
  name;
75
+ unavailableReason;
69
76
  network = $state.raw(null);
70
- /** Raw powerio Network JSON for the browser solver; fetched lazily. */
71
- networkJson = $state.raw(null);
77
+ /** Retained PowerIO module for the browser solver; fetched lazily. */
78
+ studyInputJson = $state.raw(null);
72
79
  /** Boot solution at base demand; never changes. */
73
80
  baseSolution = $state.raw(null);
74
81
  /** Exact solution at the current committed perturbation. */
@@ -88,6 +95,8 @@ export class CaseState {
88
95
  solveFallbackReason = $state(null);
89
96
  /** Monotone token: only the latest solve may write this case. */
90
97
  solveSeq = 0;
98
+ /** Monotone generation for external optimistic concurrency. */
99
+ revisionGeneration = $state(0);
91
100
  /** Monotone token: only the latest sensitivity request may write this case. */
92
101
  sensitivitySeq = 0;
93
102
  /** Closer for this case's in-flight server solve stream, if any. Owned per
@@ -99,26 +108,41 @@ export class CaseState {
99
108
  constructor(summary) {
100
109
  this.id = summary.id;
101
110
  this.name = summary.name;
111
+ this.unavailableReason = summary.unavailable_reason ?? null;
102
112
  }
103
113
  get perturbed() {
104
114
  return hasPerturbation(this.deltas) || hasPerturbation(this.ratings);
105
115
  }
106
116
  }
107
- /** A multiconductor distribution case parsed in the browser, viewed only: no
108
- * formulation, no sliders, no Study. It carries the bus/terminal graph, its
109
- * placed map view, and the selected bus whose terminal detail expands. Fields
110
- * are reactive like the solvable cases so the panel and map track them. */
117
+ /** A conductor-resolved case with retained electrical inputs and terminal results. */
111
118
  export class MulticonductorCase {
112
119
  id;
113
120
  label;
114
121
  fileName;
122
+ moduleJson = $state.raw(null);
123
+ geoLayer = $state.raw(null);
124
+ geoWarnings = $state.raw([]);
125
+ result = $state.raw(null);
126
+ mcSnapshot = $state.raw(null);
127
+ mcSession = $state.raw(null);
128
+ mcLoadBranches = $state.raw([]);
129
+ mcLoadEdits = $state.raw([]);
130
+ mcEditRevision = 0;
131
+ mcEditRunning = false;
132
+ mcEditTimer = null;
133
+ mcSavedAt = $state(null);
134
+ solving = $state(false);
135
+ solveMs = $state(null);
136
+ solveSeq = 0;
137
+ revisionGeneration = $state(0);
138
+ solveAbort = null;
115
139
  /** Summary counts and coordinate provenance from the parse. */
116
140
  summary = $state.raw(null);
117
141
  /** The render-ready bus/terminal graph. */
118
142
  graph = $state.raw(null);
119
143
  /** Placement kind resolved at ingest from the case's coordinate space. */
120
144
  coordsKind = $state.raw('synthetic');
121
- /** The placed map view; null until placed (planar/synthetic await a center). */
145
+ /** The map or diagram positions. */
122
146
  view = $state.raw(null);
123
147
  syntheticCenter = $state.raw(undefined);
124
148
  /** The selected bus id, whose terminal stack and incident conductors expand;
@@ -132,10 +156,24 @@ export class MulticonductorCase {
132
156
  this.label = init.label;
133
157
  this.fileName = init.fileName;
134
158
  this.summary = init.summary;
159
+ this.moduleJson = init.summary.module_json ?? null;
160
+ this.geoLayer = init.summary.geo_layer ?? null;
135
161
  this.graph = init.graph;
136
162
  this.coordsKind = init.coordsKind;
137
163
  this.view = init.view ?? null;
138
164
  }
165
+ get mcPfReason() {
166
+ if (!this.moduleJson)
167
+ return 'This case has no retained electrical input';
168
+ if (this.summary?.mc_pf_enabled !== true)
169
+ return 'AC power flow is unavailable in this build';
170
+ return (this.summary.mc_pf_reason ??
171
+ this.summary.mc_pf_unavailable_reason ??
172
+ (this.summary.mc_pf_supported !== true ? 'AC power flow is unavailable for this case' : null));
173
+ }
174
+ get mcPfSupported() {
175
+ return this.mcPfReason === null;
176
+ }
139
177
  /** Whether the case is placed and ready to render. */
140
178
  get placed() {
141
179
  return this.view !== null;
@@ -154,6 +192,40 @@ export class MulticonductorCase {
154
192
  }
155
193
  }
156
194
  export class AppState {
195
+ camera = $state.raw(null);
196
+ cameraRequest = $state.raw(null);
197
+ cameraSeq = $state(0);
198
+ diagramCamera = $state.raw(null);
199
+ diagramCameraRequest = $state.raw(null);
200
+ diagramCameraSeq = $state(0);
201
+ requestDiagramCamera(caseId, snapshot) {
202
+ if (!Array.isArray(snapshot.center) ||
203
+ snapshot.center.length !== 2 ||
204
+ ![...snapshot.center, snapshot.scale].every(Number.isFinite) ||
205
+ snapshot.scale <= 0) {
206
+ throw new Error('Invalid saved drawing view');
207
+ }
208
+ this.settleFrame();
209
+ this.diagramCameraRequest = { caseId, center: [...snapshot.center], scale: snapshot.scale };
210
+ this.diagramCameraSeq++;
211
+ }
212
+ requestCamera(snapshot) {
213
+ if (!Array.isArray(snapshot.center) ||
214
+ snapshot.center.length !== 2 ||
215
+ ![...snapshot.center, snapshot.zoom, snapshot.bearing, snapshot.pitch].every(Number.isFinite) ||
216
+ Math.abs(snapshot.center[1]) > 90 ||
217
+ snapshot.zoom < 0 ||
218
+ snapshot.zoom > 24 ||
219
+ snapshot.pitch < 0 ||
220
+ snapshot.pitch > 85) {
221
+ throw new Error('Invalid saved camera position');
222
+ }
223
+ this.settleFrame();
224
+ this.cameraRequest = { ...snapshot, center: [...snapshot.center] };
225
+ this.cameraSeq++;
226
+ }
227
+ /** Saved Study inspection is independent of the editable case and its solution. */
228
+ studyView = $state.raw(null);
157
229
  cases = $state.raw([]);
158
230
  activeCaseId = $state(null);
159
231
  /** Selected bus in the active case. */
@@ -164,18 +236,18 @@ export class AppState {
164
236
  previewDeltaMw = $state(null);
165
237
  /** Live rating slider value (MW from base) before commit; null when idle. */
166
238
  previewRatingMw = $state(null);
167
- /** True while the demand control should keep the map in LMP preview mode. */
239
+ /** True while the demand control should keep the map in nodal value preview mode. */
168
240
  previewActive = $state(false);
169
- /** Engine first-order LMP preview for the live drag: predicted change in LMP
170
- * ($/MWh) per bus at the previewed edit, scoped to the case and selection
241
+ /** Engine first order nodal value preview for the live drag, scoped to the case and selection
171
242
  * target (bus or branch) it was computed for. Set by the Study path; null when
172
243
  * no Study preview applies (the map then falls back to the JS
173
244
  * sensitivity-times-step preview). Reassigned wholesale, so $state.raw. */
174
- previewLmp = $state.raw(null);
245
+ previewPrices = $state.raw(null);
175
246
  demandRangeMode = $state('local');
176
- displayMode = $state('lmp');
247
+ displayMode = $state('price');
177
248
  sensitivityLoading = $state(false);
178
249
  #error = $state(null);
250
+ errorRevision = $state(0);
179
251
  /** Re-runs the operation behind the current `error`, when one applies. Every
180
252
  * write to `error` clears it, so a retry op can never outlive its message. */
181
253
  errorRetry = $state.raw(null);
@@ -184,6 +256,8 @@ export class AppState {
184
256
  }
185
257
  set error(message) {
186
258
  this.#error = message;
259
+ if (message)
260
+ this.errorRevision++;
187
261
  this.errorRetry = null;
188
262
  }
189
263
  /** Case files parsed in the browser via the powerio wasm module. */
@@ -191,7 +265,7 @@ export class AppState {
191
265
  /** Local case the panel shows; clicking a bundled case or a bus clears it. */
192
266
  activeLocalId = $state(null);
193
267
  placingLocalId = $state(null);
194
- /** Multiconductor distribution cases parsed in the browser (viewing only). */
268
+ /** Multiconductor cases with retained inputs and AC power flow results. */
195
269
  multiCases = $state.raw([]);
196
270
  /** Multiconductor case the panel shows; mutually exclusive with the solvable
197
271
  * active ids. */
@@ -273,7 +347,7 @@ export class AppState {
273
347
  this.previewDeltaMw = null;
274
348
  this.previewRatingMw = null;
275
349
  this.previewActive = false;
276
- this.previewLmp = null;
350
+ this.previewPrices = null;
277
351
  this.demandRangeMode = 'local';
278
352
  this.sensitivityLoading = false;
279
353
  return this.activateFallback();
@@ -295,7 +369,7 @@ export class AppState {
295
369
  // else a remaining local case that can render (a view or substations) or is
296
370
  // awaiting placement, else the first remaining local. Frames whatever it picks.
297
371
  activateFallback() {
298
- this.activeCaseId = this.cases[0]?.id ?? null;
372
+ this.activeCaseId = this.cases.find((c) => !c.unavailableReason)?.id ?? null;
299
373
  if (this.activeCaseId) {
300
374
  this.requestFrame(this.activeCaseId);
301
375
  return { kind: 'backend', id: this.activeCaseId };
@@ -11,4 +11,3 @@ export interface PlacementCenter {
11
11
  export declare function placeSyntheticTopology(topology: Topology, center: PlacementCenter, opts?: {
12
12
  roots?: number[];
13
13
  }): PlacedNetwork;
14
- //# sourceMappingURL=synthetic-layout.d.ts.map
@@ -27,13 +27,23 @@ export function placeSyntheticTopology(topology, center, opts) {
27
27
  return {
28
28
  buses: buses.map((bus) => {
29
29
  const [lon, lat] = coords.get(bus.id);
30
- return { id: bus.id, uid: bus.uid, lon, lat, demand_mw: bus.demand_mw, gen_mw: bus.gen_mw };
30
+ return {
31
+ ...bus,
32
+ id: bus.id,
33
+ uid: bus.uid,
34
+ editable: bus.editable,
35
+ lon,
36
+ lat,
37
+ demand_mw: bus.demand_mw,
38
+ gen_mw: bus.gen_mw
39
+ };
31
40
  }),
32
41
  branches: topology.branches
33
42
  .filter((branch) => coords.has(branch.from) && coords.has(branch.to))
34
43
  .map((branch) => ({
35
44
  id: branch.id,
36
45
  uid: branch.uid,
46
+ editable: branch.editable,
37
47
  from: branch.from,
38
48
  to: branch.to,
39
49
  rate_mw: branch.rate_mw,
@@ -145,7 +155,12 @@ function treeLayout(n, adjacency, components, roots) {
145
155
  let slotCursor = 0;
146
156
  for (const comp of components) {
147
157
  const hinted = comp.filter((node) => roots.has(node));
148
- const root = hinted.length > 0 ? Math.min(...hinted) : diameterEndpoint(comp[0], adjacency);
158
+ // Not `Math.min(...hinted)`: a case with tens of thousands of source buses
159
+ // exceeds the engine's argument limit and throws. Same trap as `extent()`
160
+ // in format.ts.
161
+ const root = hinted.length > 0
162
+ ? hinted.reduce((a, b) => (a < b ? a : b))
163
+ : diameterEndpoint(comp[0], adjacency);
149
164
  // BFS spanning tree from the root; chords of a near-tree are simply not
150
165
  // tree edges and draw between wherever their endpoints land.
151
166
  const parent = new Map();
@@ -13,4 +13,3 @@ export interface TransformerIcon {
13
13
  * modules load, so document is always available here. The 128 px backing keeps
14
14
  * a ~16 px on-screen symbol crisp on 2x/3x displays. */
15
15
  export declare function transformerIcon(): TransformerIcon;
16
- //# sourceMappingURL=transformer-icon.d.ts.map
package/dist/types.d.ts CHANGED
@@ -3,4 +3,3 @@ export type { DisplayOption } from './display.js';
3
3
  export type { PlacedNetwork, PlacementCenter } from './synthetic-layout.js';
4
4
  export type { DemandRangeMode, DisplayMode, FallbackTarget, LocalCaseInit, LocalSubstations, SolvableCase, SolveBackend } from './state.svelte.js';
5
5
  export type { AppliedGeoCase, CaseFileSummary, DisplayPreview, Formulation, GeoApplyReport, IngestedCase, ParsedGeoLayer, StampedLayoutCase, Topology, TopologyBranch, TopologyBus } from '@tellegen/engine';
6
- //# sourceMappingURL=types.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,20 @@
1
1
  {
2
2
  "name": "@tellegen/svelte",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "description": "Svelte components for tellegen power system maps, local case files, and browser solves.",
5
+ "keywords": [
6
+ "svelte",
7
+ "sveltekit",
8
+ "power-flow",
9
+ "optimal-power-flow",
10
+ "power-systems",
11
+ "map",
12
+ "maplibre",
13
+ "deck.gl",
14
+ "webassembly",
15
+ "visualization",
16
+ "grid"
17
+ ],
5
18
  "license": "MIT",
6
19
  "type": "module",
7
20
  "repository": {
@@ -18,6 +31,9 @@
18
31
  "files": [
19
32
  "dist"
20
33
  ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
21
37
  "sideEffects": [
22
38
  "**/*.css"
23
39
  ],
@@ -46,22 +62,22 @@
46
62
  "pack:dry-run": "npm pack --dry-run --cache ../../node_modules/.cache/npm-pack"
47
63
  },
48
64
  "dependencies": {
49
- "@deck.gl/core": "^9.1.0",
50
- "@deck.gl/layers": "^9.1.0",
51
- "@deck.gl/mapbox": "^9.1.0",
52
- "@tellegen/engine": "^0.1.0",
53
- "maplibre-gl": "^5.0.0"
65
+ "@deck.gl/core": "^9.4.0",
66
+ "@deck.gl/layers": "^9.4.0",
67
+ "@deck.gl/maplibre": "^9.4.0",
68
+ "@tellegen/engine": "^0.3.0",
69
+ "maplibre-gl": "^6.10.0"
54
70
  },
55
71
  "peerDependencies": {
56
72
  "svelte": ">=5.30 <6"
57
73
  },
58
74
  "devDependencies": {
59
75
  "@sveltejs/package": "^2.3.0",
60
- "@sveltejs/vite-plugin-svelte": "^5.0.0",
61
- "svelte": "^5.30.0",
62
- "svelte-check": "^4.1.0",
63
- "typescript": "^5.7.0",
64
- "vite": "^6.3.0",
65
- "vitest": "^4.1.9"
76
+ "@sveltejs/vite-plugin-svelte": "^7.3.0",
77
+ "svelte": "^5.57.0",
78
+ "svelte-check": "^4.7.6",
79
+ "typescript": "^6.0.3",
80
+ "vite": "^8.2.2",
81
+ "vitest": "^5.0.0"
66
82
  }
67
83
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sparkline.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Sparkline.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9C,KAAK,gBAAgB,GAAI;IAAE,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC;AAiD3D,QAAA,MAAM,SAAS,sDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TellegenMap.svelte.d.ts","sourceRoot":"","sources":["../src/lib/TellegenMap.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,kCAAkC,CAAC;AAoEzC,KAAK,gBAAgB,GAAI;IACxB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AA+qCH,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TellegenProvider.svelte.d.ts","sourceRoot":"","sources":["../src/lib/TellegenProvider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAKL,KAAK,iBAAiB,EACtB,MAAM,qBAAqB,CAAC;AAK7B,UAAU,KAAM,SAAQ,iBAAiB;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAiCF,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TellegenShell.svelte.d.ts","sourceRoot":"","sources":["../src/lib/TellegenShell.svelte.ts"],"names":[],"mappings":"AAqJA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TellegenViewer.svelte.d.ts","sourceRoot":"","sources":["../src/lib/TellegenViewer.svelte.ts"],"names":[],"mappings":"AAsBA,QAAA,MAAM,cAAc,6FAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
package/dist/api.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACX,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,MAAM,kBAAkB,CAAC;AAE1B,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE1E,MAAM,WAAW,wBAAwB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACnC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,cAAc,CACb,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,oBAAoB,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B;;+BAE2B;IAC3B,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,eAAe,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,EAAE,mBAAmB,GAC3B,MAAM,IAAI,CAAC;CACd;AAwBD;;;6CAG6C;AAC7C,qBAAa,QAAS,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;CAMzE;AA6CD,MAAM,WAAW,mBAAmB;IACnC,UAAU,CAAC,EAAE,CACZ,GAAG,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,KAC5E,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,wBAA6B,GAAG,iBAAiB,CAyEzF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/lib/colors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACd;AAqCD,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,KAAG,IAA0B,CAAC;AAChE,eAAO,MAAM,WAAW,QAAyB,CAAC;AAElD;;;;;wCAKwC;AACxC,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAStE;AAED;;wDAEwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAQ5F;AAcD,mBAAmB;AACnB,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,IAAqC,CAAC;AAC5E,eAAO,MAAM,YAAY,QAA0B,CAAC;AACpD,eAAO,MAAM,WAAW,EAAE,IAAoB,CAAC;AAC/C,eAAO,MAAM,UAAU,EAAE,IAA2B,CAAC;AAIrD,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,IAAI,CAG3E;AAED;;;;;kBAKkB;AAClB,wBAAgB,eAAe,CAC9B,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,MAAM,CAAC,EACjD,UAAU,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAGf;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAuBrE;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAMrE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;0EAC0E;AAC1E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppFooter.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AppFooter.svelte.ts"],"names":[],"mappings":"AAKC,KAAK,gBAAgB,GAAI;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAwB/C,QAAA,MAAM,SAAS,sDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppHeader.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AppHeader.svelte.ts"],"names":[],"mappings":"AA6FA,QAAA,MAAM,SAAS,2DAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BindingLines.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/BindingLines.svelte.ts"],"names":[],"mappings":"AA0DA,QAAA,MAAM,YAAY,2DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}