@tellegen/svelte 0.1.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 (121) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +70 -0
  3. package/dist/Sparkline.svelte +100 -0
  4. package/dist/Sparkline.svelte.d.ts +8 -0
  5. package/dist/Sparkline.svelte.d.ts.map +1 -0
  6. package/dist/TellegenMap.svelte +1430 -0
  7. package/dist/TellegenMap.svelte.d.ts +14 -0
  8. package/dist/TellegenMap.svelte.d.ts.map +1 -0
  9. package/dist/TellegenProvider.svelte +38 -0
  10. package/dist/TellegenProvider.svelte.d.ts +9 -0
  11. package/dist/TellegenProvider.svelte.d.ts.map +1 -0
  12. package/dist/TellegenShell.svelte +126 -0
  13. package/dist/TellegenShell.svelte.d.ts +4 -0
  14. package/dist/TellegenShell.svelte.d.ts.map +1 -0
  15. package/dist/TellegenViewer.svelte +19 -0
  16. package/dist/TellegenViewer.svelte.d.ts +4 -0
  17. package/dist/TellegenViewer.svelte.d.ts.map +1 -0
  18. package/dist/api.d.ts +44 -0
  19. package/dist/api.d.ts.map +1 -0
  20. package/dist/api.js +137 -0
  21. package/dist/colors.d.ts +51 -0
  22. package/dist/colors.d.ts.map +1 -0
  23. package/dist/colors.js +140 -0
  24. package/dist/components/AppFooter.svelte +73 -0
  25. package/dist/components/AppFooter.svelte.d.ts +19 -0
  26. package/dist/components/AppFooter.svelte.d.ts.map +1 -0
  27. package/dist/components/AppHeader.svelte +405 -0
  28. package/dist/components/AppHeader.svelte.d.ts +4 -0
  29. package/dist/components/AppHeader.svelte.d.ts.map +1 -0
  30. package/dist/components/BindingLines.svelte +101 -0
  31. package/dist/components/BindingLines.svelte.d.ts +4 -0
  32. package/dist/components/BindingLines.svelte.d.ts.map +1 -0
  33. package/dist/components/BusPicker.svelte +227 -0
  34. package/dist/components/BusPicker.svelte.d.ts +4 -0
  35. package/dist/components/BusPicker.svelte.d.ts.map +1 -0
  36. package/dist/components/ControlPanel.svelte +154 -0
  37. package/dist/components/ControlPanel.svelte.d.ts +19 -0
  38. package/dist/components/ControlPanel.svelte.d.ts.map +1 -0
  39. package/dist/components/DemandSlider.svelte +271 -0
  40. package/dist/components/DemandSlider.svelte.d.ts +4 -0
  41. package/dist/components/DemandSlider.svelte.d.ts.map +1 -0
  42. package/dist/components/DisplayControls.svelte +81 -0
  43. package/dist/components/DisplayControls.svelte.d.ts +19 -0
  44. package/dist/components/DisplayControls.svelte.d.ts.map +1 -0
  45. package/dist/components/DropZone.svelte +46 -0
  46. package/dist/components/DropZone.svelte.d.ts +19 -0
  47. package/dist/components/DropZone.svelte.d.ts.map +1 -0
  48. package/dist/components/FormulationSelector.svelte +82 -0
  49. package/dist/components/FormulationSelector.svelte.d.ts +19 -0
  50. package/dist/components/FormulationSelector.svelte.d.ts.map +1 -0
  51. package/dist/components/LocalCaseDetails.svelte +253 -0
  52. package/dist/components/LocalCaseDetails.svelte.d.ts +4 -0
  53. package/dist/components/LocalCaseDetails.svelte.d.ts.map +1 -0
  54. package/dist/components/MulticonductorDetails.svelte +280 -0
  55. package/dist/components/MulticonductorDetails.svelte.d.ts +19 -0
  56. package/dist/components/MulticonductorDetails.svelte.d.ts.map +1 -0
  57. package/dist/components/NetworkStats.svelte +75 -0
  58. package/dist/components/NetworkStats.svelte.d.ts +19 -0
  59. package/dist/components/NetworkStats.svelte.d.ts.map +1 -0
  60. package/dist/components/PlacementCue.svelte +35 -0
  61. package/dist/components/PlacementCue.svelte.d.ts +19 -0
  62. package/dist/components/PlacementCue.svelte.d.ts.map +1 -0
  63. package/dist/components/RatingSlider.svelte +273 -0
  64. package/dist/components/RatingSlider.svelte.d.ts +4 -0
  65. package/dist/components/RatingSlider.svelte.d.ts.map +1 -0
  66. package/dist/components/RestoreDefaultsButton.svelte +34 -0
  67. package/dist/components/RestoreDefaultsButton.svelte.d.ts +19 -0
  68. package/dist/components/RestoreDefaultsButton.svelte.d.ts.map +1 -0
  69. package/dist/components/SensitivityReadout.svelte +126 -0
  70. package/dist/components/SensitivityReadout.svelte.d.ts +4 -0
  71. package/dist/components/SensitivityReadout.svelte.d.ts.map +1 -0
  72. package/dist/components/SizeLegend.svelte +55 -0
  73. package/dist/components/SizeLegend.svelte.d.ts +19 -0
  74. package/dist/components/SizeLegend.svelte.d.ts.map +1 -0
  75. package/dist/components/SolveCard.svelte +84 -0
  76. package/dist/components/SolveCard.svelte.d.ts +4 -0
  77. package/dist/components/SolveCard.svelte.d.ts.map +1 -0
  78. package/dist/components/TopMovers.svelte +68 -0
  79. package/dist/components/TopMovers.svelte.d.ts +19 -0
  80. package/dist/components/TopMovers.svelte.d.ts.map +1 -0
  81. package/dist/components.d.ts +19 -0
  82. package/dist/components.d.ts.map +1 -0
  83. package/dist/components.js +18 -0
  84. package/dist/context.svelte.d.ts +20 -0
  85. package/dist/context.svelte.d.ts.map +1 -0
  86. package/dist/context.svelte.js +43 -0
  87. package/dist/controller.svelte.d.ts +334 -0
  88. package/dist/controller.svelte.d.ts.map +1 -0
  89. package/dist/controller.svelte.js +2026 -0
  90. package/dist/display.d.ts +31 -0
  91. package/dist/display.d.ts.map +1 -0
  92. package/dist/display.js +63 -0
  93. package/dist/drop-classify.d.ts +48 -0
  94. package/dist/drop-classify.d.ts.map +1 -0
  95. package/dist/drop-classify.js +92 -0
  96. package/dist/format.d.ts +30 -0
  97. package/dist/format.d.ts.map +1 -0
  98. package/dist/format.js +49 -0
  99. package/dist/index.d.ts +21 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +12 -0
  102. package/dist/map.d.ts +9 -0
  103. package/dist/map.d.ts.map +1 -0
  104. package/dist/map.js +4 -0
  105. package/dist/multiconductor.d.ts +63 -0
  106. package/dist/multiconductor.d.ts.map +1 -0
  107. package/dist/multiconductor.js +255 -0
  108. package/dist/state.svelte.d.ts +258 -0
  109. package/dist/state.svelte.d.ts.map +1 -0
  110. package/dist/state.svelte.js +323 -0
  111. package/dist/study-package.d.ts +9 -0
  112. package/dist/study-package.d.ts.map +1 -0
  113. package/dist/study-package.js +17 -0
  114. package/dist/styles.css +393 -0
  115. package/dist/synthetic-layout.d.ts +12 -0
  116. package/dist/synthetic-layout.d.ts.map +1 -0
  117. package/dist/synthetic-layout.js +271 -0
  118. package/dist/types.d.ts +6 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +1 -0
  121. package/package.json +67 -0
@@ -0,0 +1,81 @@
1
+ <script lang="ts">
2
+ import { getAppState, getController } from '../context.svelte.js';
3
+ import { displayFmt, formulationLabel } from '../format.js';
4
+
5
+ const app = getAppState();
6
+ const ctrl = getController();
7
+ </script>
8
+
9
+ <div class="mode display-mode">
10
+ <div class="segment mono" aria-label="bus color variable">
11
+ {#each ctrl.displayOptions as option (option.mode)}
12
+ <button
13
+ type="button"
14
+ class:active={app.displayMode === option.mode}
15
+ aria-pressed={app.displayMode === option.mode}
16
+ onclick={() => (app.displayMode = option.mode)}>{option.label}</button
17
+ >
18
+ {/each}
19
+ </div>
20
+ <span class="mono dim">{ctrl.activeDisplay?.unit ?? ''}</span>
21
+ {#if app.sensitivityLoading}
22
+ <span class="mono dim blink">&part; loading&hellip;</span>
23
+ {/if}
24
+ </div>
25
+ {#if ctrl.activeDisplay && ctrl.displayStats}
26
+ {#if ctrl.activeDisplay.mode === 'lmp'}
27
+ <div class="legend-heading">
28
+ <span class="legend-title">Locational marginal price</span>
29
+ <span
30
+ class="hint-dot mono"
31
+ title={ctrl.activeDisplay.copy}
32
+ aria-label={ctrl.activeDisplay.copy}>i</span
33
+ >
34
+ </div>
35
+ {:else}
36
+ <p class="dim small">{ctrl.activeDisplay.copy}</p>
37
+ {/if}
38
+ <div class="legend" style:background={ctrl.activeDisplay.gradient}></div>
39
+ <div class="legend-labels mono">
40
+ {#if ctrl.displayStats.uniform !== null}
41
+ <span>
42
+ uniform {displayFmt(ctrl.activeDisplay.mode, ctrl.displayStats.uniform)}
43
+ {ctrl.activeDisplay.unit}
44
+ </span>
45
+ {:else}
46
+ <span>
47
+ {ctrl.displayStats.lo.clamped ? '≤' : ''}{displayFmt(
48
+ ctrl.activeDisplay.mode,
49
+ ctrl.displayStats.lo.value
50
+ )}
51
+ {ctrl.activeDisplay.unit}
52
+ </span>
53
+ <span>
54
+ {ctrl.displayStats.hi.clamped ? '≥' : ''}{displayFmt(
55
+ ctrl.activeDisplay.mode,
56
+ ctrl.displayStats.hi.value
57
+ )}
58
+ {ctrl.activeDisplay.unit}
59
+ </span>
60
+ {/if}
61
+ </div>
62
+ {:else}
63
+ <p class="dim small blink">Solving {formulationLabel(ctrl.activeFormulation)}&hellip;</p>
64
+ {/if}
65
+
66
+ <style>
67
+ .legend-heading {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 6px;
71
+ margin-top: 10px;
72
+ }
73
+
74
+ .legend-title {
75
+ font-size: 12px;
76
+ font-weight: 600;
77
+ color: var(--ink);
78
+ }
79
+
80
+ /* .hint-dot lives in the shared stylesheet; SensitivityReadout uses it too. */
81
+ </style>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const DisplayControls: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type DisplayControls = InstanceType<typeof DisplayControls>;
18
+ export default DisplayControls;
19
+ //# sourceMappingURL=DisplayControls.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplayControls.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/DisplayControls.svelte.ts"],"names":[],"mappings":"AAkEA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,eAAe;;kBAA+E,CAAC;AACnF,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ import { getAppState } from '../context.svelte.js';
3
+
4
+ const app = getAppState();
5
+ </script>
6
+
7
+ {#if app.dragOver}
8
+ <div class="dropzone" aria-hidden="true">
9
+ <div class="dropframe">
10
+ <p class="mono">drop to parse: case files or geographic files</p>
11
+ <p class="mono hint">parsed in your browser; the file never uploads</p>
12
+ </div>
13
+ </div>
14
+ {/if}
15
+
16
+ <style>
17
+ .dropzone {
18
+ position: fixed;
19
+ inset: 0;
20
+ z-index: 20;
21
+ pointer-events: none;
22
+ background: rgba(236, 233, 226, 0.75);
23
+ }
24
+
25
+ .dropframe {
26
+ position: absolute;
27
+ inset: 14px;
28
+ border: 1.5px dashed var(--accent);
29
+ border-radius: 3px;
30
+ display: flex;
31
+ flex-direction: column;
32
+ align-items: center;
33
+ justify-content: center;
34
+ gap: 6px;
35
+ }
36
+
37
+ .dropframe p {
38
+ margin: 0;
39
+ font-size: 13px;
40
+ }
41
+
42
+ .dropframe .hint {
43
+ font-size: 11px;
44
+ color: var(--text-secondary);
45
+ }
46
+ </style>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const DropZone: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type DropZone = InstanceType<typeof DropZone>;
18
+ export default DropZone;
19
+ //# sourceMappingURL=DropZone.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropZone.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/DropZone.svelte.ts"],"names":[],"mappings":"AAwBA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,QAAQ;;kBAA+E,CAAC;AAC5E,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAChD,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,82 @@
1
+ <script lang="ts">
2
+ import { getController } from '../context.svelte.js';
3
+ import { formulationHint } from '../format.js';
4
+ import { FORMULATIONS, type Formulation } from '@tellegen/engine';
5
+
6
+ const ctrl = getController();
7
+ </script>
8
+
9
+ {#if ctrl.activeSolvable}
10
+ {@const c = ctrl.activeSolvable}
11
+ <div class="formulation">
12
+ <label
13
+ class="formulation-row mono"
14
+ for="formulation-select"
15
+ title={formulationHint(c.formulation)}
16
+ >
17
+ <span>formulation</span>
18
+ <select
19
+ id="formulation-select"
20
+ class="mono"
21
+ disabled={c.solving}
22
+ value={c.formulation}
23
+ onchange={(e) => ctrl.changeFormulation(c, e.currentTarget.value as Formulation)}
24
+ >
25
+ {#each FORMULATIONS as f (f.id)}
26
+ <option value={f.id} disabled={f.disabled}>
27
+ {f.label}{f.disabled ? ' (coming soon)' : ''}
28
+ </option>
29
+ {/each}
30
+ </select>
31
+ </label>
32
+ </div>
33
+ {/if}
34
+
35
+ <style>
36
+ .formulation {
37
+ margin-top: 10px;
38
+ }
39
+
40
+ .formulation-row {
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ gap: 10px;
45
+ font-size: 12px;
46
+ color: var(--ink);
47
+ }
48
+
49
+ .formulation-row select {
50
+ font-family: var(--font-mono);
51
+ font-size: 11px;
52
+ padding: 3px 22px 3px 8px;
53
+ border: 1px solid var(--line);
54
+ border-radius: 2px;
55
+ background: var(--surface-control);
56
+ color: var(--ink);
57
+ cursor: pointer;
58
+ /* Native arrow on the right, drawn so the control reads as a control in the panel. */
59
+ appearance: none;
60
+ -webkit-appearance: none;
61
+ background-image:
62
+ linear-gradient(45deg, transparent 50%, var(--ink-dim) 50%),
63
+ linear-gradient(135deg, var(--ink-dim) 50%, transparent 50%);
64
+ background-position:
65
+ right 10px center,
66
+ right 6px center;
67
+ background-size:
68
+ 4px 4px,
69
+ 4px 4px;
70
+ background-repeat: no-repeat;
71
+ }
72
+
73
+ .formulation-row select:hover:not(:disabled) {
74
+ border-color: var(--accent);
75
+ color: var(--text-accent);
76
+ }
77
+
78
+ .formulation-row select:disabled {
79
+ opacity: 0.55;
80
+ cursor: progress;
81
+ }
82
+ </style>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const FormulationSelector: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type FormulationSelector = InstanceType<typeof FormulationSelector>;
18
+ export default FormulationSelector;
19
+ //# sourceMappingURL=FormulationSelector.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormulationSelector.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/FormulationSelector.svelte.ts"],"names":[],"mappings":"AAmCA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,mBAAmB;;kBAA+E,CAAC;AACvF,KAAK,mBAAmB,GAAG,YAAY,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,253 @@
1
+ <script lang="ts">
2
+ import { getAppState, getController } from '../context.svelte.js';
3
+ import { fmt } from '../format.js';
4
+ import type { LocalCase } from '../state.svelte.js';
5
+
6
+ const app = getAppState();
7
+ const ctrl = getController();
8
+
9
+ // Powerio writer tokens the committed state exports to; label carries the extension.
10
+ const EXPORT_FORMATS = [
11
+ { token: 'matpower', label: 'MATPOWER (.m)' },
12
+ { token: 'psse', label: 'PSS/E (.raw)' },
13
+ { token: 'powermodels-json', label: 'PowerModels (.json)' },
14
+ { token: 'pandapower-json', label: 'pandapower (.json)' },
15
+ { token: 'powerio-json', label: 'PowerIO (.json)' }
16
+ ];
17
+
18
+ let busy = $state(false);
19
+ let exportOpen = $state(false);
20
+ let exportWarnings = $state<string[]>([]);
21
+
22
+ async function saveStudy(lc: LocalCase) {
23
+ busy = true;
24
+ exportWarnings = [];
25
+ try {
26
+ await ctrl.saveStudyPackage(lc);
27
+ } finally {
28
+ busy = false;
29
+ }
30
+ }
31
+
32
+ async function exportStudy(lc: LocalCase, token: string) {
33
+ busy = true;
34
+ try {
35
+ exportWarnings = await ctrl.exportStudyAs(lc, token);
36
+ exportOpen = false;
37
+ } finally {
38
+ busy = false;
39
+ }
40
+ }
41
+
42
+ async function downloadLayout(lc: LocalCase) {
43
+ busy = true;
44
+ try {
45
+ await ctrl.downloadGeoLayer(lc);
46
+ } finally {
47
+ busy = false;
48
+ }
49
+ }
50
+ </script>
51
+
52
+ {#if app.activeLocal}
53
+ {@const lc = app.activeLocal}
54
+ <h2>{lc.label} <span class="region mono">via {lc.fileName}</span></h2>
55
+ {#if lc.substations}
56
+ <dl class="mono">
57
+ <div>
58
+ <dt>substations</dt>
59
+ <dd>{lc.substations.points.length}</dd>
60
+ </div>
61
+ </dl>
62
+ <p class="footnote mono">
63
+ display only: positions inferred from the PowerWorld diagram, not surveyed latitude and
64
+ longitude
65
+ </p>
66
+ <p class="footnote mono">decoded in your browser by powerio (wasm); never uploaded</p>
67
+ {:else if lc.summary}
68
+ <dl class="mono">
69
+ <div>
70
+ <dt>buses</dt>
71
+ <dd>{lc.summary.n_bus}</dd>
72
+ </div>
73
+ <div>
74
+ <dt>branches</dt>
75
+ <dd>{lc.summary.n_branch}</dd>
76
+ </div>
77
+ <div>
78
+ <dt>generators</dt>
79
+ <dd>{lc.summary.n_gen}</dd>
80
+ </div>
81
+ <div>
82
+ <dt>load</dt>
83
+ <dd>{fmt.format(lc.summary.load_mw)} MW</dd>
84
+ </div>
85
+ <div>
86
+ <dt>gen capacity</dt>
87
+ <dd>{fmt.format(lc.summary.gen_mw)} MW</dd>
88
+ </div>
89
+ <div>
90
+ <dt>base MVA</dt>
91
+ <dd>{fmt.format(lc.summary.base_mva)}</dd>
92
+ </div>
93
+ </dl>
94
+ {#if lc.summary.warnings.length > 0}
95
+ <ul class="warnings mono">
96
+ {#each lc.summary.warnings.slice(0, 4) as w, i (i)}
97
+ <li>{w}</li>
98
+ {/each}
99
+ {#if lc.summary.warnings.length > 4}
100
+ <li>+{lc.summary.warnings.length - 4} more</li>
101
+ {/if}
102
+ </ul>
103
+ {/if}
104
+ {#if !lc.view}
105
+ <p class="footnote mono">
106
+ no coordinates in this file: click the map or drop a geographic file
107
+ </p>
108
+ {:else if lc.coordsKind === 'synthetic' || lc.coordsKind === 'manual'}
109
+ <p class="footnote mono">
110
+ coordinates: {lc.coordsKind} topology layout centered where it was placed
111
+ </p>
112
+ {:else if lc.coordsKind === 'geofile'}
113
+ <p class="footnote mono">
114
+ coordinates: geographic file data from {lc.geoSource}
115
+ </p>
116
+ {/if}
117
+ {#if lc.geoWarnings && lc.geoWarnings.length > 0}
118
+ <ul class="warnings mono">
119
+ {#each lc.geoWarnings.slice(0, 4) as w, i (i)}
120
+ <li>{w}</li>
121
+ {/each}
122
+ {#if lc.geoWarnings.length > 4}
123
+ <li>+{lc.geoWarnings.length - 4} more</li>
124
+ {/if}
125
+ </ul>
126
+ {/if}
127
+ <p class="footnote mono">parsed in your browser by powerio (wasm); never uploaded</p>
128
+ {#if lc.networkJson}
129
+ <div class="study">
130
+ <button class="reset mono" disabled={busy} onclick={() => saveStudy(lc)}>
131
+ save study (.pio.json)
132
+ </button>
133
+ <div class="export">
134
+ <button
135
+ class="reset mono"
136
+ disabled={busy}
137
+ aria-expanded={exportOpen}
138
+ onclick={() => (exportOpen = !exportOpen)}
139
+ >
140
+ export committed state…
141
+ </button>
142
+ {#if exportOpen}
143
+ <ul class="export-menu mono">
144
+ {#each EXPORT_FORMATS as f (f.token)}
145
+ <li>
146
+ <button class="reset mono" disabled={busy} onclick={() => exportStudy(lc, f.token)}>
147
+ {f.label}
148
+ </button>
149
+ </li>
150
+ {/each}
151
+ </ul>
152
+ {/if}
153
+ </div>
154
+ {#if lc.view}
155
+ <button class="reset mono" disabled={busy} onclick={() => downloadLayout(lc)}>
156
+ download layout (.geo.json)
157
+ </button>
158
+ {/if}
159
+ </div>
160
+ {#if exportWarnings.length > 0}
161
+ <ul class="warnings mono">
162
+ {#each exportWarnings.slice(0, 4) as w, i (i)}
163
+ <li>{w}</li>
164
+ {/each}
165
+ {#if exportWarnings.length > 4}
166
+ <li>+{exportWarnings.length - 4} more</li>
167
+ {/if}
168
+ </ul>
169
+ {/if}
170
+ {/if}
171
+ {/if}
172
+ {#if lc.topology && lc.coordsKind !== 'file'}
173
+ <button class="reset mono" onclick={() => ctrl.moveLocalCase(lc)}>
174
+ {lc.coordsKind === 'synthetic_pending'
175
+ ? 'place on map'
176
+ : lc.coordsKind === 'geofile'
177
+ ? 'place manually'
178
+ : 'move layout'}
179
+ </button>
180
+ {/if}
181
+ <button class="reset mono" onclick={() => ctrl.removeLocalCase(lc)}>remove</button>
182
+ {/if}
183
+
184
+ <style>
185
+ h2 {
186
+ margin: 0 0 12px;
187
+ font-size: 16px;
188
+ font-weight: 600;
189
+ }
190
+
191
+ dl {
192
+ margin: 0;
193
+ font-size: 12.5px;
194
+ }
195
+
196
+ dl div {
197
+ display: flex;
198
+ justify-content: space-between;
199
+ padding: 3px 0;
200
+ }
201
+
202
+ dt {
203
+ color: var(--text-secondary);
204
+ }
205
+
206
+ dd {
207
+ margin: 0;
208
+ }
209
+
210
+ .footnote {
211
+ margin: 8px 0 0;
212
+ font-size: 10px;
213
+ color: var(--text-tertiary);
214
+ letter-spacing: 0;
215
+ }
216
+
217
+ .warnings {
218
+ margin: 8px 0 0;
219
+ padding: 0;
220
+ list-style: none;
221
+ font-size: 10.5px;
222
+ line-height: 1.5;
223
+ color: var(--text-accent);
224
+ }
225
+
226
+ .study {
227
+ display: flex;
228
+ flex-wrap: wrap;
229
+ gap: 8px;
230
+ margin-top: 10px;
231
+ }
232
+
233
+ .export {
234
+ position: relative;
235
+ }
236
+
237
+ .export-menu {
238
+ position: absolute;
239
+ z-index: 1;
240
+ margin: 4px 0 0;
241
+ padding: 4px;
242
+ list-style: none;
243
+ min-width: 100%;
244
+ background: var(--surface, #fff);
245
+ border: 1px solid var(--border, rgba(0, 0, 0, 0.15));
246
+ border-radius: 6px;
247
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
248
+ }
249
+
250
+ .export-menu li {
251
+ white-space: nowrap;
252
+ }
253
+ </style>
@@ -0,0 +1,4 @@
1
+ declare const LocalCaseDetails: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type LocalCaseDetails = ReturnType<typeof LocalCaseDetails>;
3
+ export default LocalCaseDetails;
4
+ //# sourceMappingURL=LocalCaseDetails.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalCaseDetails.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/LocalCaseDetails.svelte.ts"],"names":[],"mappings":"AA6LA,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}