@tellegen/svelte 0.4.3 → 0.4.5
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/README.md +45 -0
- package/dist/TellegenMap.svelte +63 -22
- package/dist/TellegenProvider.svelte +7 -4
- package/dist/TellegenShell.svelte +12 -1
- package/dist/TellegenViewer.svelte +2 -0
- package/dist/basemap.d.ts +14 -0
- package/dist/basemap.js +27 -0
- package/dist/colors.d.ts +6 -1
- package/dist/colors.js +11 -4
- package/dist/components/DiagnosticLogView.svelte +176 -0
- package/dist/components/DiagnosticLogView.svelte.d.ts +11 -0
- package/dist/components/FormulationSelector.svelte +1 -1
- package/dist/components/LocalCaseDetails.svelte +18 -3
- package/dist/components/LogEntryView.svelte +188 -0
- package/dist/components/LogEntryView.svelte.d.ts +11 -0
- package/dist/components/LogPanel.svelte +25 -0
- package/dist/components/LogPanel.svelte.d.ts +3 -0
- package/dist/components/McResults.svelte +18 -3
- package/dist/components/McWorkbench.svelte +688 -0
- package/dist/components/McWorkbench.svelte.d.ts +38 -0
- package/dist/components/MultiWire.svelte +136 -0
- package/dist/components/MultiWire.svelte.d.ts +7 -0
- package/dist/components/MulticonductorDetails.svelte +7 -0
- package/dist/components/NotificationCenter.svelte +37 -6
- package/dist/components/OmniSearch.svelte +163 -0
- package/dist/components/OmniSearch.svelte.d.ts +14 -0
- package/dist/components/ResultsTable.svelte +259 -0
- package/dist/components/ResultsTable.svelte.d.ts +13 -0
- package/dist/components/SchematicCanvas.svelte +1896 -0
- package/dist/components/SchematicCanvas.svelte.d.ts +13 -0
- package/dist/components/SolveCard.svelte +6 -0
- package/dist/components/schematic/PickCard.svelte +126 -0
- package/dist/components/schematic/PickCard.svelte.d.ts +56 -0
- package/dist/components/schematic/export.d.ts +21 -0
- package/dist/components/schematic/export.js +110 -0
- package/dist/components/schematic/layers.d.ts +161 -0
- package/dist/components/schematic/layers.js +756 -0
- package/dist/components/schematic/paint.d.ts +28 -0
- package/dist/components/schematic/paint.js +69 -0
- package/dist/components/schematic/palette.d.ts +34 -0
- package/dist/components/schematic/palette.js +54 -0
- package/dist/components/schematic/text.d.ts +83 -0
- package/dist/components/schematic/text.js +190 -0
- package/dist/components/schematic/view-prefs.svelte.d.ts +30 -0
- package/dist/components/schematic/view-prefs.svelte.js +77 -0
- package/dist/components.d.ts +4 -0
- package/dist/components.js +4 -0
- package/dist/context.svelte.d.ts +2 -0
- package/dist/context.svelte.js +2 -0
- package/dist/controller.svelte.d.ts +40 -5
- package/dist/controller.svelte.js +230 -25
- package/dist/diagram/basemap.d.ts +28 -0
- package/dist/diagram/basemap.js +39 -0
- package/dist/diagram/bus-stacks.d.ts +19 -0
- package/dist/diagram/bus-stacks.js +99 -0
- package/dist/diagram/colour-modes.d.ts +18 -0
- package/dist/diagram/colour-modes.js +33 -0
- package/dist/diagram/connections.d.ts +30 -0
- package/dist/diagram/connections.js +129 -0
- package/dist/diagram/display-tree.d.ts +21 -0
- package/dist/diagram/display-tree.js +65 -0
- package/dist/diagram/energisation.d.ts +10 -0
- package/dist/diagram/energisation.js +31 -0
- package/dist/diagram/feeders.d.ts +30 -0
- package/dist/diagram/feeders.js +57 -0
- package/dist/diagram/galvanic-zones.d.ts +60 -0
- package/dist/diagram/galvanic-zones.js +210 -0
- package/dist/diagram/graph-inputs.d.ts +18 -0
- package/dist/diagram/graph-inputs.js +103 -0
- package/dist/diagram/index.d.ts +28 -0
- package/dist/diagram/index.js +28 -0
- package/dist/diagram/landmarks.d.ts +50 -0
- package/dist/diagram/landmarks.js +153 -0
- package/dist/diagram/layout-morph.d.ts +15 -0
- package/dist/diagram/layout-morph.js +32 -0
- package/dist/diagram/multi-wire.d.ts +44 -0
- package/dist/diagram/multi-wire.js +65 -0
- package/dist/diagram/phase-bars.d.ts +35 -0
- package/dist/diagram/phase-bars.js +44 -0
- package/dist/diagram/results-table.d.ts +47 -0
- package/dist/diagram/results-table.js +173 -0
- package/dist/diagram/schematic-equipment.d.ts +133 -0
- package/dist/diagram/schematic-equipment.js +645 -0
- package/dist/diagram/schematic-layout.d.ts +51 -0
- package/dist/diagram/schematic-layout.js +240 -0
- package/dist/diagram/search.d.ts +36 -0
- package/dist/diagram/search.js +48 -0
- package/dist/diagram/shared-routes.d.ts +21 -0
- package/dist/diagram/shared-routes.js +40 -0
- package/dist/diagram/short-names.d.ts +11 -0
- package/dist/diagram/short-names.js +54 -0
- package/dist/diagram/snapshot.d.ts +115 -0
- package/dist/diagram/snapshot.js +242 -0
- package/dist/diagram/summary.d.ts +65 -0
- package/dist/diagram/summary.js +144 -0
- package/dist/diagram/svg-export.d.ts +80 -0
- package/dist/diagram/svg-export.js +108 -0
- package/dist/diagram/tree-walk.d.ts +13 -0
- package/dist/diagram/tree-walk.js +83 -0
- package/dist/diagram/value-labels.d.ts +24 -0
- package/dist/diagram/value-labels.js +69 -0
- package/dist/diagram/view-state.d.ts +12 -0
- package/dist/diagram/view-state.js +22 -0
- package/dist/diagram/voltage-levels.d.ts +14 -0
- package/dist/diagram/voltage-levels.js +20 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/log.svelte.d.ts +77 -0
- package/dist/log.svelte.js +149 -0
- package/dist/notices.svelte.d.ts +3 -0
- package/dist/state.svelte.d.ts +42 -5
- package/dist/state.svelte.js +56 -4
- package/dist/transformer-icon.d.ts +22 -13
- package/dist/transformer-icon.js +23 -13
- package/package.json +2 -2
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { queryTable, type TableModel } from '../diagram/index.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
model,
|
|
6
|
+
selected,
|
|
7
|
+
onselect,
|
|
8
|
+
hovered = -1,
|
|
9
|
+
onhover
|
|
10
|
+
}: {
|
|
11
|
+
model: TableModel;
|
|
12
|
+
/** Row index (network order) of the current selection, or −1. */
|
|
13
|
+
selected: number;
|
|
14
|
+
onselect: (index: number) => void;
|
|
15
|
+
/** Row under the pointer here or in a linked view (−1 for none). */
|
|
16
|
+
hovered?: number;
|
|
17
|
+
onhover?: (index: number) => void;
|
|
18
|
+
} = $props();
|
|
19
|
+
|
|
20
|
+
const ROW = 22;
|
|
21
|
+
const HEIGHT = 240;
|
|
22
|
+
const OVERSCAN = 6;
|
|
23
|
+
let text = $state('');
|
|
24
|
+
let issuesOnly = $state(false);
|
|
25
|
+
let sortKey = $state<string | null>(null);
|
|
26
|
+
let descending = $state(false);
|
|
27
|
+
let scrollTop = $state(0);
|
|
28
|
+
let scroller = $state<HTMLDivElement>();
|
|
29
|
+
|
|
30
|
+
const rows = $derived(queryTable(model, { text, issuesOnly, sortKey, descending }));
|
|
31
|
+
const first = $derived(Math.max(0, Math.floor(scrollTop / ROW) - OVERSCAN));
|
|
32
|
+
const last = $derived(Math.min(rows.length, first + Math.ceil(HEIGHT / ROW) + 2 * OVERSCAN));
|
|
33
|
+
const visible = $derived(Array.from(rows.subarray(first, last)));
|
|
34
|
+
const template = $derived(
|
|
35
|
+
model.columns
|
|
36
|
+
.map((c) =>
|
|
37
|
+
c.numeric
|
|
38
|
+
? 'minmax(64px, 0.8fr)'
|
|
39
|
+
: c.key === 'id'
|
|
40
|
+
? 'minmax(110px, 1.5fr)'
|
|
41
|
+
: 'minmax(70px, 1fr)'
|
|
42
|
+
)
|
|
43
|
+
.join(' ')
|
|
44
|
+
);
|
|
45
|
+
const format = (v: unknown, digits = 2) =>
|
|
46
|
+
v === null || v === undefined
|
|
47
|
+
? '—'
|
|
48
|
+
: typeof v === 'number'
|
|
49
|
+
? v.toLocaleString(undefined, {
|
|
50
|
+
minimumFractionDigits: digits,
|
|
51
|
+
maximumFractionDigits: digits
|
|
52
|
+
})
|
|
53
|
+
: String(v);
|
|
54
|
+
|
|
55
|
+
function sort(key: string, numeric?: boolean) {
|
|
56
|
+
// Numbers start largest-first, text A–Z; a second click reverses.
|
|
57
|
+
descending = sortKey === key ? !descending : !!numeric;
|
|
58
|
+
sortKey = key;
|
|
59
|
+
}
|
|
60
|
+
// Bring the selection into view when it changes elsewhere (map, issues, search).
|
|
61
|
+
$effect(() => {
|
|
62
|
+
const k = rows.indexOf(selected);
|
|
63
|
+
if (k < 0 || !scroller) return;
|
|
64
|
+
const y = k * ROW;
|
|
65
|
+
if (y < scroller.scrollTop || y + ROW > scroller.scrollTop + HEIGHT)
|
|
66
|
+
scroller.scrollTop = y - HEIGHT / 2;
|
|
67
|
+
});
|
|
68
|
+
function onkeydown(e: KeyboardEvent) {
|
|
69
|
+
if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key) || !rows.length) return;
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
const k = rows.indexOf(selected);
|
|
72
|
+
const next =
|
|
73
|
+
e.key === 'Home'
|
|
74
|
+
? 0
|
|
75
|
+
: e.key === 'End'
|
|
76
|
+
? rows.length - 1
|
|
77
|
+
: Math.max(
|
|
78
|
+
0,
|
|
79
|
+
Math.min(rows.length - 1, (k < 0 ? -1 : k) + (e.key === 'ArrowDown' ? 1 : -1))
|
|
80
|
+
);
|
|
81
|
+
onselect(rows[next]);
|
|
82
|
+
}
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<div class="table">
|
|
86
|
+
<div class="toolbar">
|
|
87
|
+
<input
|
|
88
|
+
type="search"
|
|
89
|
+
placeholder="Filter by ID or endpoint"
|
|
90
|
+
aria-label="Filter rows"
|
|
91
|
+
bind:value={text}
|
|
92
|
+
/>
|
|
93
|
+
<label><input type="checkbox" bind:checked={issuesOnly} /> Issues only</label>
|
|
94
|
+
</div>
|
|
95
|
+
<!-- The grid is a keyboard target: arrow keys move the shared selection. -->
|
|
96
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
97
|
+
<div
|
|
98
|
+
class="scroll"
|
|
99
|
+
role="grid"
|
|
100
|
+
aria-label="Results by {model.kind === 'bus' ? 'bus' : 'branch'}"
|
|
101
|
+
aria-rowcount={rows.length}
|
|
102
|
+
tabindex="0"
|
|
103
|
+
style:height="{HEIGHT}px"
|
|
104
|
+
bind:this={scroller}
|
|
105
|
+
onscroll={(e) => (scrollTop = e.currentTarget.scrollTop)}
|
|
106
|
+
{onkeydown}
|
|
107
|
+
>
|
|
108
|
+
<div class="head" role="row" style:grid-template-columns={template}>
|
|
109
|
+
{#each model.columns as c (c.key)}
|
|
110
|
+
<div
|
|
111
|
+
role="columnheader"
|
|
112
|
+
class:num={c.numeric}
|
|
113
|
+
aria-sort={sortKey === c.key ? (descending ? 'descending' : 'ascending') : 'none'}
|
|
114
|
+
>
|
|
115
|
+
<button title={c.title ?? `Sort by ${c.label}`} onclick={() => sort(c.key, c.numeric)}
|
|
116
|
+
>{c.label}{#if c.unit}<small>{c.unit}</small>{/if}</button
|
|
117
|
+
>
|
|
118
|
+
</div>
|
|
119
|
+
{/each}
|
|
120
|
+
</div>
|
|
121
|
+
<div class="body" style:height="{rows.length * ROW}px">
|
|
122
|
+
{#each visible as i, n (i)}
|
|
123
|
+
{@const row = model.row(i)}
|
|
124
|
+
<!-- Arrow keys on the grid move the selection; a click is the pointer equivalent. -->
|
|
125
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
126
|
+
<div
|
|
127
|
+
class="row {row.state}"
|
|
128
|
+
role="row"
|
|
129
|
+
tabindex="-1"
|
|
130
|
+
aria-selected={i === selected}
|
|
131
|
+
class:hovered={i === hovered}
|
|
132
|
+
style:top="{(first + n) * ROW}px"
|
|
133
|
+
style:grid-template-columns={template}
|
|
134
|
+
onclick={() => onselect(i)}
|
|
135
|
+
onpointerenter={() => onhover?.(i)}
|
|
136
|
+
onpointerleave={() => onhover?.(-1)}
|
|
137
|
+
>
|
|
138
|
+
{#each model.columns as c (c.key)}
|
|
139
|
+
<span role="gridcell" class:num={c.numeric}>{format(row[c.key], c.digits)}</span>
|
|
140
|
+
{/each}
|
|
141
|
+
</div>
|
|
142
|
+
{/each}
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<p class="count">{rows.length.toLocaleString()} of {model.count.toLocaleString()} rows</p>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<style>
|
|
149
|
+
.table {
|
|
150
|
+
font-size: 11px;
|
|
151
|
+
}
|
|
152
|
+
.toolbar {
|
|
153
|
+
display: flex;
|
|
154
|
+
gap: 8px;
|
|
155
|
+
align-items: center;
|
|
156
|
+
margin-bottom: 4px;
|
|
157
|
+
}
|
|
158
|
+
.toolbar input[type='search'] {
|
|
159
|
+
flex: 1;
|
|
160
|
+
min-width: 0;
|
|
161
|
+
font: 11px var(--font-mono);
|
|
162
|
+
color: var(--ink);
|
|
163
|
+
background: var(--paper);
|
|
164
|
+
border: 1px solid var(--line);
|
|
165
|
+
border-radius: 3px;
|
|
166
|
+
padding: 5px 7px;
|
|
167
|
+
}
|
|
168
|
+
.toolbar label,
|
|
169
|
+
.count,
|
|
170
|
+
small {
|
|
171
|
+
color: var(--text-secondary);
|
|
172
|
+
}
|
|
173
|
+
.scroll {
|
|
174
|
+
position: relative;
|
|
175
|
+
overflow: auto;
|
|
176
|
+
border: 1px solid var(--line);
|
|
177
|
+
border-radius: 3px;
|
|
178
|
+
font: 10px var(--font-mono);
|
|
179
|
+
}
|
|
180
|
+
.scroll:focus-visible {
|
|
181
|
+
outline: 2px solid var(--accent);
|
|
182
|
+
outline-offset: 2px;
|
|
183
|
+
}
|
|
184
|
+
.head {
|
|
185
|
+
position: sticky;
|
|
186
|
+
top: 0;
|
|
187
|
+
z-index: 1;
|
|
188
|
+
display: grid;
|
|
189
|
+
min-width: max-content;
|
|
190
|
+
background: var(--surface-control);
|
|
191
|
+
border-bottom: 1px solid var(--line);
|
|
192
|
+
}
|
|
193
|
+
.head button {
|
|
194
|
+
width: 100%;
|
|
195
|
+
padding: 4px 6px;
|
|
196
|
+
text-align: left;
|
|
197
|
+
font: inherit;
|
|
198
|
+
color: var(--text-secondary);
|
|
199
|
+
background: transparent;
|
|
200
|
+
border: 0;
|
|
201
|
+
cursor: pointer;
|
|
202
|
+
white-space: nowrap;
|
|
203
|
+
}
|
|
204
|
+
.head .num button {
|
|
205
|
+
text-align: right;
|
|
206
|
+
}
|
|
207
|
+
.head [aria-sort='ascending'] button,
|
|
208
|
+
.head [aria-sort='descending'] button {
|
|
209
|
+
color: var(--ink);
|
|
210
|
+
}
|
|
211
|
+
small {
|
|
212
|
+
display: block;
|
|
213
|
+
font-size: 9px;
|
|
214
|
+
}
|
|
215
|
+
.body {
|
|
216
|
+
position: relative;
|
|
217
|
+
min-width: max-content;
|
|
218
|
+
}
|
|
219
|
+
.row {
|
|
220
|
+
position: absolute;
|
|
221
|
+
left: 0;
|
|
222
|
+
right: 0;
|
|
223
|
+
height: 22px;
|
|
224
|
+
display: grid;
|
|
225
|
+
align-items: center;
|
|
226
|
+
cursor: pointer;
|
|
227
|
+
border-bottom: 1px solid color-mix(in srgb, var(--line) 50%, transparent);
|
|
228
|
+
}
|
|
229
|
+
.row span {
|
|
230
|
+
padding: 0 6px;
|
|
231
|
+
overflow: hidden;
|
|
232
|
+
text-overflow: ellipsis;
|
|
233
|
+
white-space: nowrap;
|
|
234
|
+
}
|
|
235
|
+
.num {
|
|
236
|
+
text-align: right;
|
|
237
|
+
}
|
|
238
|
+
.row.hovered {
|
|
239
|
+
box-shadow: inset 3px 0 var(--line-strong, var(--text-secondary));
|
|
240
|
+
}
|
|
241
|
+
.row[aria-selected='true'] {
|
|
242
|
+
background: var(--accent-soft);
|
|
243
|
+
box-shadow: inset 3px 0 var(--accent);
|
|
244
|
+
}
|
|
245
|
+
.violation span:last-child {
|
|
246
|
+
color: var(--text-danger);
|
|
247
|
+
}
|
|
248
|
+
.warning span:last-child {
|
|
249
|
+
color: var(--text-accent);
|
|
250
|
+
}
|
|
251
|
+
.inactive,
|
|
252
|
+
.missing,
|
|
253
|
+
.unbounded {
|
|
254
|
+
color: var(--text-secondary);
|
|
255
|
+
}
|
|
256
|
+
.count {
|
|
257
|
+
margin: 4px 0 0;
|
|
258
|
+
}
|
|
259
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type TableModel } from '../diagram/index.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
model: TableModel;
|
|
4
|
+
/** Row index (network order) of the current selection, or −1. */
|
|
5
|
+
selected: number;
|
|
6
|
+
onselect: (index: number) => void;
|
|
7
|
+
/** Row under the pointer here or in a linked view (−1 for none). */
|
|
8
|
+
hovered?: number;
|
|
9
|
+
onhover?: (index: number) => void;
|
|
10
|
+
};
|
|
11
|
+
declare const ResultsTable: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
12
|
+
type ResultsTable = ReturnType<typeof ResultsTable>;
|
|
13
|
+
export default ResultsTable;
|