|
11 | 11 | ZOOM_MINIMUM_WINDOW_SIZE
|
12 | 12 | } from './Devilstable_DEFAULTS.json';
|
13 | 13 |
|
| 14 | + import { siglaFromHandle, metadataFromHandle } from '$lib/functions'; |
| 15 | +
|
14 | 16 | /** @type {{codices: any, width?: number, height?: number,data?: {values: boolean[], label: string}[], selection: {start: number, end: number}}} */
|
15 | 17 | let { codices, width = 400, height = 400, data = [], selection = $bindable() } = $props();
|
16 | 18 | let marginTop = 30;
|
|
141 | 143 | };
|
142 | 144 | }
|
143 | 145 |
|
144 |
| - const popupFractions = $state({}); |
| 146 | + const popupFragments = $state({}); |
145 | 147 | const popupLabels = $state({});
|
146 |
| - const openPopupFractions = (e, verseNumber) => { |
| 148 | + const openPopupFragments = (e, verseNumber) => { |
147 | 149 | e.preventDefault();
|
148 | 150 | e.stopPropagation();
|
149 | 151 | const reference = e.currentTarget;
|
150 |
| - const popup = popupFractions[verseNumber]; |
| 152 | + const popup = popupFragments[verseNumber]; |
151 | 153 | if (popup && reference) {
|
152 | 154 | computePosition(reference, popup, {
|
153 | 155 | placement: 'top'
|
|
207 | 209 | )
|
208 | 210 | );
|
209 | 211 | let verse = $derived(Math.floor(y.invert(mousePos[1])));
|
210 |
| - let manuscript = $derived( |
| 212 | + let frValues = $derived(data.find((d) => d.label === 'fr')?.values); |
| 213 | + let manuscriptHandles = $derived( |
211 | 214 | scaleBandInvert(x)(mousePos[0]) === 'fr'
|
212 |
| - ? data.find((d) => d.label === 'fr')?.values[verse - selection.start] || 'fr' |
| 215 | + ? frValues?.[verse - selection.start] || 'fr' |
213 | 216 | : scaleBandInvert(x)(mousePos[0])
|
214 | 217 | );
|
215 |
| - // $inspect(contigousData); |
216 | 218 | $effect(() => {
|
217 | 219 | d3.select(gy)
|
218 | 220 | .call(
|
|
283 | 285 | data-popup="popupVerse"
|
284 | 286 | bind:this={floating}
|
285 | 287 | >
|
286 |
| - {#if Array.isArray(manuscript)} |
| 288 | + <!-- if manuscriptHandles is an array, we create a list of Links, if it if either Fassungen or fr, we just create a paragraph that informs about the verse.--> |
| 289 | + {#if Array.isArray(manuscriptHandles)} |
287 | 290 | <ul>
|
288 |
| - {#each manuscript as sigla} |
| 291 | + {#each manuscriptHandles as mHandle} |
289 | 292 | <li>
|
290 |
| - <a href={`${base}/textzeugen/${sigla}/${verse}`} class="hover:text-secondary-900"> |
291 |
| - {sigla} |
292 |
| - {verse} |
| 293 | + <!-- These links are not clickable since it's not possible to put the cursor over it, but it might be possible to access the links with ARIA means. --> |
| 294 | + <a href={`${base}/textzeugen/${mHandle}/${verse}`} class="hover:text-secondary-900"> |
| 295 | + {@html siglaFromHandle(mHandle)}: {verse} |
293 | 296 | </a>
|
294 | 297 | </li>
|
295 | 298 | {/each}
|
296 | 299 | </ul>
|
| 300 | + {:else if manuscriptHandles === summaryLabel} |
| 301 | + <p>Dreißiger {verse}</p> |
| 302 | + {:else if manuscriptHandles === 'fr'} |
| 303 | + <p>Fragment {verse}</p> |
297 | 304 | {:else}
|
298 |
| - <p>{manuscript} {verse}</p> |
| 305 | + <p>{@html siglaFromHandle(String(manuscriptHandles))}: {verse}</p> |
299 | 306 | {/if}
|
300 | 307 | </div>
|
301 |
| -{#each data.map((d) => d.label) as label} |
| 308 | +<!-- clickable popups on column labels --> |
| 309 | +{#each data.map((d) => d.label) as handle} |
| 310 | + {@const metadata = metadataFromHandle(handle)} |
302 | 311 | <div
|
303 |
| - class="card p-1 variant-filled-primary absolute opacity-0 top-0 left-0 w-max" |
304 |
| - bind:this={popupLabels[label]} |
| 312 | + class="card p-1 variant-filled-primary absolute opacity-0 top-0 left-0 max-w-prose prose" |
| 313 | + bind:this={popupLabels[handle]} |
305 | 314 | >
|
306 |
| - <p>Hier stehen Erläuterungen zu {label}</p> |
| 315 | + <strong class="">{@html metadata?.['info-h1']}</strong> |
| 316 | + {@html metadata?.['info-h2']} |
| 317 | + {@html metadata?.info} |
307 | 318 | </div>
|
308 | 319 | {/each}
|
309 |
| -{#each data.find((d) => d.label === 'fr')?.values || [] as fraction, i} |
310 |
| - {#if Array.isArray(fraction)} |
| 320 | +<!-- popups for fragments --> |
| 321 | +{#each frValues || [] as fragment, i} |
| 322 | + {#if Array.isArray(fragment)} |
311 | 323 | {@const verse = i + selection.start}
|
312 | 324 | <div
|
313 | 325 | class="card p-1 variant-filled-primary top-0 left-0 w-max absolute opacity-0"
|
314 |
| - bind:this={popupFractions[verse]} |
| 326 | + bind:this={popupFragments[verse]} |
315 | 327 | >
|
316 | 328 | <ul>
|
317 |
| - {#each fraction as sigla} |
| 329 | + {#each fragment as handle} |
318 | 330 | <li>
|
319 |
| - <a href={`${base}/textzeugen/${sigla}/${verse}`} class="hover:text-secondary-900"> |
320 |
| - {sigla} |
| 331 | + <a href={`${base}/textzeugen/${handle}/${verse}`} class="hover:text-secondary-900"> |
| 332 | + {@html siglaFromHandle(handle)} |
321 | 333 | {verse}
|
322 | 334 | </a>
|
323 | 335 | </li>
|
|
347 | 359 | {#if values}
|
348 | 360 | {#if isNaN(values[1])}
|
349 | 361 | {@const verseNumber = i + selection.start}
|
350 |
| - {#if values.length === 1} |
| 362 | + {#if values?.lenth === 1} |
351 | 363 | <a
|
352 | 364 | href={`${base}/textzeugen/${values[0]}/${verseNumber}`}
|
353 | 365 | aria-label={`${values[0]}.${verseNumber}`}
|
|
367 | 379 | role="button"
|
368 | 380 | tabindex="0"
|
369 | 381 | href="#"
|
370 |
| - onkeydown={(e) => openPopupFractions(e, verseNumber)} |
| 382 | + onkeydown={(e) => openPopupFragments(e, verseNumber)} |
371 | 383 | onclick={(e) => {
|
372 |
| - openPopupFractions(e, verseNumber); |
| 384 | + openPopupFragments(e, verseNumber); |
373 | 385 | }}
|
374 | 386 | aria-label={`Mehrere Fr in Vers ${verseNumber}`}
|
375 | 387 | onblur={() => {
|
376 |
| - popupFractions[verseNumber].style.opacity = '0'; |
| 388 | + popupFragments[verseNumber].style.opacity = '0'; |
377 | 389 | }}
|
378 | 390 | >
|
379 | 391 | <rect
|
|
0 commit comments