mirror of
https://github.com/Theodor-Springmann-Stiftung/musenalm.git
synced 2026-02-04 18:45:31 +00:00
+density on list
This commit is contained in:
@@ -132,26 +132,45 @@
|
||||
<span data-role="contents-htmx-label">Eintrag wird geladen</span>
|
||||
</div>
|
||||
<input type="hidden" name="csrf_token" value="{{ $model.csrf_token }}" data-role="csrf-token" />
|
||||
<div class="flex items-center justify-end gap-2 px-4">
|
||||
<button type="button" class="resetbutton w-auto px-3 py-2 flex items-center gap-2" data-role="contents-collapse-all" data-state="expanded">
|
||||
<i class="ri-arrow-up-s-line" data-role="contents-collapse-all-icon"></i>
|
||||
<span data-role="contents-collapse-all-label">Alle Eintraege einklappen</span>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="resetbutton w-auto px-3 py-2 flex items-center gap-2"
|
||||
data-role="contents-create"
|
||||
data-loading-label="Eintrag wird geladen"
|
||||
hx-post="/almanach/{{ $model.result.Entry.MusenalmID }}/contents/insert"
|
||||
hx-target="[data-role='contents-list']"
|
||||
hx-swap="beforeend"
|
||||
hx-include="[data-role='csrf-token']"
|
||||
hx-vals='{"position":"after","content_id":""}'>
|
||||
<i class="ri-add-line"></i>
|
||||
<span>Eintrag anlegen</span>
|
||||
</button>
|
||||
<div class="flex items-center gap-3 px-4">
|
||||
<form
|
||||
method="POST"
|
||||
action="/almanach/{{ $model.result.Entry.MusenalmID }}/contents/edit/extent"
|
||||
class="extent-inline flex-1 grid grid-cols-[max-content_minmax(12rem,1fr)_max-content] items-center gap-2">
|
||||
<input type="hidden" name="csrf_token" value="{{ $model.csrf_token }}" />
|
||||
<label for="contents-extent" class="text-sm font-bold text-gray-700">Struktur</label>
|
||||
<input
|
||||
id="contents-extent"
|
||||
name="extent"
|
||||
type="text"
|
||||
class="min-w-[10rem] w-full max-w-none flex-1 border border-slate-300 rounded-xs bg-white px-2 py-1 text-sm leading-5 text-gray-800 focus:outline-none focus:ring-2 focus:ring-slate-400/30"
|
||||
placeholder="z. B. 12 Bl., 3 Taf."
|
||||
value="{{- $model.result.Entry.Extent -}}" />
|
||||
<button type="submit" class="rounded-xs border border-slate-300 bg-stone-100 px-3 py-1 text-sm font-semibold text-gray-700 hover:bg-stone-200">
|
||||
Speichern
|
||||
</button>
|
||||
</form>
|
||||
<div class="flex items-center gap-2">
|
||||
<button type="button" class="resetbutton w-auto px-3 py-2 flex items-center gap-2" data-role="contents-collapse-all" data-state="expanded">
|
||||
<i class="ri-arrow-up-s-line" data-role="contents-collapse-all-icon"></i>
|
||||
<span data-role="contents-collapse-all-label">Alle Eintraege einklappen</span>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="resetbutton w-auto px-3 py-2 flex items-center gap-2"
|
||||
data-role="contents-create"
|
||||
data-loading-label="Eintrag wird geladen"
|
||||
hx-post="/almanach/{{ $model.result.Entry.MusenalmID }}/contents/insert"
|
||||
hx-target="[data-role='contents-list']"
|
||||
hx-swap="beforeend"
|
||||
hx-include="[data-role='csrf-token']"
|
||||
hx-vals='{"position":"after","content_id":""}'>
|
||||
<i class="ri-add-line"></i>
|
||||
<span>Eintrag anlegen</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-1"
|
||||
<div class="flex flex-col gap-0.5"
|
||||
data-role="contents-list"
|
||||
data-insert-endpoint="/almanach/{{ $model.result.Entry.MusenalmID }}/contents/insert"
|
||||
data-edit-endpoint="/almanach/{{ $model.result.Entry.MusenalmID }}/contents/edit/form"
|
||||
@@ -263,7 +282,7 @@
|
||||
}
|
||||
};
|
||||
const setEditSpacing = (active) => {
|
||||
list.style.rowGap = active ? "0.75rem" : "";
|
||||
list.style.rowGap = active ? "0.5rem" : "";
|
||||
list.style.paddingTop = active ? "0.25rem" : "";
|
||||
list.style.paddingBottom = active ? "0.25rem" : "";
|
||||
};
|
||||
@@ -317,6 +336,51 @@
|
||||
}
|
||||
};
|
||||
|
||||
const deleteContent = (item, dialog) => {
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
if (item.dataset.contentTemp === "true") {
|
||||
dialog?.close();
|
||||
removeItem(item);
|
||||
return;
|
||||
}
|
||||
const contentId = item.dataset.contentId || "";
|
||||
if (!contentId || !csrfToken) {
|
||||
return;
|
||||
}
|
||||
if (window.htmx?.ajax) {
|
||||
window.htmx.ajax("POST", deleteEndpoint, {
|
||||
target: item,
|
||||
swap: "outerHTML",
|
||||
values: {
|
||||
csrf_token: csrfToken,
|
||||
content_id: contentId,
|
||||
},
|
||||
});
|
||||
dialog?.close();
|
||||
return;
|
||||
}
|
||||
const payload = new URLSearchParams();
|
||||
payload.set("csrf_token", csrfToken);
|
||||
payload.set("content_id", contentId);
|
||||
fetch(deleteEndpoint, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"HX-Request": "true",
|
||||
},
|
||||
body: payload.toString(),
|
||||
})
|
||||
.then(() => {
|
||||
removeItem(item);
|
||||
})
|
||||
.catch(() => null)
|
||||
.finally(() => {
|
||||
dialog?.close();
|
||||
});
|
||||
};
|
||||
|
||||
const performOrderSync = () => {
|
||||
if (!list || !orderEndpoint || !csrfToken || isOrderSyncing) {
|
||||
pendingOrderSync = true;
|
||||
@@ -442,10 +506,16 @@
|
||||
item.dataset.init = "true";
|
||||
|
||||
const editButton = item.querySelector("[data-role='content-edit-button']");
|
||||
const deleteButtonView = item.querySelector("[data-role='content-delete-view']");
|
||||
const deleteDialogView = item.querySelector("[data-role='content-delete-dialog-view']");
|
||||
const deleteConfirmView = item.querySelector("[data-role='content-delete-confirm-view']");
|
||||
const deleteCancelView = item.querySelector("[data-role='content-delete-cancel-view']");
|
||||
const view = item.querySelector("[data-role='content-view']");
|
||||
const collapseButton = item.querySelector("[data-role='content-collapse-toggle']");
|
||||
const collapseIcon = item.querySelector("[data-role='content-collapse-icon']");
|
||||
const collapseTooltip = item.querySelector("[data-role='content-collapse-tooltip']");
|
||||
const collapsedSummary = item.querySelector("[data-role='content-collapsed-summary']");
|
||||
const headerTitle = item.querySelector("[data-role='content-header-title']");
|
||||
const viewBody = item.querySelector("[data-role='content-view-body']");
|
||||
const header = item.querySelector("[data-content-header='true']");
|
||||
|
||||
@@ -457,6 +527,9 @@
|
||||
item.classList.toggle("data-collapsed", collapsed);
|
||||
viewBody.classList.toggle("hidden", collapsed);
|
||||
collapsedSummary.classList.toggle("hidden", !collapsed);
|
||||
if (headerTitle) {
|
||||
headerTitle.classList.toggle("hidden", collapsed);
|
||||
}
|
||||
if (header) {
|
||||
header.classList.toggle("bg-stone-100", collapsed);
|
||||
header.classList.toggle("bg-stone-200", !collapsed);
|
||||
@@ -465,6 +538,9 @@
|
||||
collapseButton.setAttribute("aria-expanded", (!collapsed).toString());
|
||||
collapseButton.setAttribute("aria-label", collapsed ? "Beitrag ausklappen" : "Beitrag einklappen");
|
||||
}
|
||||
if (collapseTooltip) {
|
||||
collapseTooltip.textContent = collapsed ? "Ausklappen" : "Einklappen";
|
||||
}
|
||||
if (collapseIcon) {
|
||||
collapseIcon.classList.toggle("ri-arrow-up-s-line", !collapsed);
|
||||
collapseIcon.classList.toggle("ri-arrow-down-s-line", collapsed);
|
||||
@@ -512,6 +588,32 @@
|
||||
});
|
||||
}
|
||||
|
||||
if (deleteButtonView && deleteDialogView) {
|
||||
deleteButtonView.addEventListener("click", () => {
|
||||
if (deleteDialogView.showModal) {
|
||||
deleteDialogView.showModal();
|
||||
} else {
|
||||
deleteDialogView.setAttribute("open", "true");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (deleteCancelView && deleteDialogView) {
|
||||
deleteCancelView.addEventListener("click", () => {
|
||||
deleteDialogView.close();
|
||||
});
|
||||
deleteDialogView.addEventListener("cancel", (event) => {
|
||||
event.preventDefault();
|
||||
deleteDialogView.close();
|
||||
});
|
||||
}
|
||||
|
||||
if (deleteConfirmView) {
|
||||
deleteConfirmView.addEventListener("click", () => {
|
||||
deleteContent(item, deleteDialogView);
|
||||
});
|
||||
}
|
||||
|
||||
const pendingEdit = item.dataset.pendingEdit === "true";
|
||||
if (pendingEdit && item.querySelector("[data-role='content-edit']")) {
|
||||
item.dataset.pendingEdit = "";
|
||||
@@ -580,29 +682,7 @@
|
||||
|
||||
if (deleteConfirm) {
|
||||
deleteConfirm.addEventListener("click", () => {
|
||||
if (item.dataset.contentTemp === "true") {
|
||||
deleteDialog?.close();
|
||||
removeItem(item);
|
||||
return;
|
||||
}
|
||||
const payload = new URLSearchParams();
|
||||
payload.set("csrf_token", csrfToken);
|
||||
payload.set("content_id", item.dataset.contentId || "");
|
||||
fetch(deleteEndpoint, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
},
|
||||
body: payload.toString(),
|
||||
})
|
||||
.then((response) => {
|
||||
if (response.redirected) {
|
||||
window.location.assign(response.url);
|
||||
} else {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
.catch(() => null);
|
||||
deleteContent(item, deleteDialog);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -646,8 +726,10 @@
|
||||
}
|
||||
const viewBody = item.querySelector("[data-role='content-view-body']");
|
||||
const collapsedSummary = item.querySelector("[data-role='content-collapsed-summary']");
|
||||
const headerTitle = item.querySelector("[data-role='content-header-title']");
|
||||
const collapseButton = item.querySelector("[data-role='content-collapse-toggle']");
|
||||
const collapseIcon = item.querySelector("[data-role='content-collapse-icon']");
|
||||
const collapseTooltip = item.querySelector("[data-role='content-collapse-tooltip']");
|
||||
const header = item.querySelector("[data-content-header='true']");
|
||||
if (!viewBody || !collapsedSummary) {
|
||||
return;
|
||||
@@ -656,6 +738,9 @@
|
||||
item.classList.toggle("data-collapsed", collapsed);
|
||||
viewBody.classList.toggle("hidden", collapsed);
|
||||
collapsedSummary.classList.toggle("hidden", !collapsed);
|
||||
if (headerTitle) {
|
||||
headerTitle.classList.toggle("hidden", collapsed);
|
||||
}
|
||||
if (header) {
|
||||
header.classList.toggle("bg-stone-100", collapsed);
|
||||
header.classList.toggle("bg-stone-200", !collapsed);
|
||||
@@ -664,6 +749,9 @@
|
||||
collapseButton.setAttribute("aria-expanded", (!collapsed).toString());
|
||||
collapseButton.setAttribute("aria-label", collapsed ? "Beitrag ausklappen" : "Beitrag einklappen");
|
||||
}
|
||||
if (collapseTooltip) {
|
||||
collapseTooltip.textContent = collapsed ? "Ausklappen" : "Einklappen";
|
||||
}
|
||||
if (collapseIcon) {
|
||||
collapseIcon.classList.toggle("ri-arrow-up-s-line", !collapsed);
|
||||
collapseIcon.classList.toggle("ri-arrow-down-s-line", collapsed);
|
||||
@@ -765,7 +853,7 @@
|
||||
draggedItem = item;
|
||||
item.dataset.dragging = "true";
|
||||
draggedItem.classList.add("opacity-60");
|
||||
list.style.rowGap = "0.75rem";
|
||||
list.style.rowGap = "0.5rem";
|
||||
list.style.paddingTop = "0.25rem";
|
||||
list.style.paddingBottom = "0.25rem";
|
||||
removeGaps();
|
||||
|
||||
@@ -19,67 +19,108 @@
|
||||
{{- $editContainerID := printf "content-%s-edit-container" $contentID -}}
|
||||
|
||||
<div data-role="content-item" class="relative {{ if $isNew }}data-new-content{{ end }} {{ if $openEdit }}data-editing{{ end }}" data-open-edit="{{ if $openEdit }}true{{ end }}" data-content-temp="{{ if $isNew }}true{{ end }}" data-content-id="{{ $contentID }}" data-collapsed="true">
|
||||
<div data-role="content-view" class="{{ if $openEdit }}hidden{{ end }} mt-2">
|
||||
<div class="border border-slate-200 bg-stone-100 rounded-xs overflow-hidden">
|
||||
<div class="flex items-center justify-between gap-4 border-b border-slate-200 bg-stone-100 px-3 py-2 cursor-pointer hover:bg-stone-200 transition-colors duration-75" data-role="content-drag-handle" data-content-header="true" draggable="true" aria-label="Beitrag verschieben">
|
||||
<div class="flex items-center gap-2 text-sm font-bold text-gray-800">
|
||||
<button type="button" class="text-slate-600 rounded-xs px-2 py-1 text-sm transition-colors hover:bg-stone-100 {{ if $isNew }}hidden{{ end }}" data-role="content-collapse-toggle" aria-label="Beitrag einklappen" aria-expanded="true">
|
||||
<i class="ri-arrow-up-s-line" data-role="content-collapse-icon"></i>
|
||||
</button>
|
||||
<div data-role="content-view" class="{{ if $openEdit }}hidden{{ end }} mt-1">
|
||||
<div class="border border-slate-200 bg-stone-100 rounded-xs overflow-visible">
|
||||
<div class="flex items-center justify-between gap-4 border-b border-slate-200 bg-stone-100 px-3 py-1 cursor-pointer hover:bg-stone-200 transition-colors duration-75 flex-nowrap whitespace-nowrap" data-role="content-drag-handle" data-content-header="true" draggable="true" aria-label="Beitrag verschieben">
|
||||
<div class="flex items-center gap-2 text-sm font-bold text-gray-800 flex-1 min-w-0 flex-nowrap whitespace-nowrap">
|
||||
<tool-tip position="top" class="!inline">
|
||||
<div class="data-tip" data-role="content-collapse-tooltip">Einklappen</div>
|
||||
<button type="button" class="text-slate-600 rounded-sm px-2 py-1 text-sm transition-colors hover:bg-stone-300 {{ if $isNew }}hidden{{ end }}" data-role="content-collapse-toggle" aria-label="Beitrag einklappen" aria-expanded="true">
|
||||
<i class="ri-arrow-up-s-line" data-role="content-collapse-icon"></i>
|
||||
</button>
|
||||
</tool-tip>
|
||||
<div class="flex items-center gap-1">
|
||||
<button type="button" class="text-slate-600 rounded-xs px-2 py-1 text-sm transition-colors hover:bg-stone-100" data-role="content-move-up" aria-label="Beitrag nach oben">
|
||||
<i class="ri-arrow-up-line"></i>
|
||||
</button>
|
||||
<button type="button" class="text-slate-600 rounded-xs px-2 py-1 text-sm transition-colors hover:bg-stone-100" data-role="content-move-down" aria-label="Beitrag nach unten">
|
||||
<i class="ri-arrow-down-line"></i>
|
||||
</button>
|
||||
<tool-tip position="top" class="!inline">
|
||||
<div class="data-tip">Nach oben verschieben</div>
|
||||
<button type="button" class="text-slate-600 rounded-sm px-2 py-1 text-sm transition-colors hover:bg-stone-300" data-role="content-move-up" aria-label="Beitrag nach oben">
|
||||
<i class="ri-arrow-up-line"></i>
|
||||
</button>
|
||||
</tool-tip>
|
||||
<tool-tip position="top" class="!inline">
|
||||
<div class="data-tip">Nach unten verschieben</div>
|
||||
<button type="button" class="text-slate-600 rounded-sm px-2 py-1 text-sm transition-colors hover:bg-stone-300" data-role="content-move-down" aria-label="Beitrag nach unten">
|
||||
<i class="ri-arrow-down-line"></i>
|
||||
</button>
|
||||
</tool-tip>
|
||||
</div>
|
||||
{{- if $content.MusenalmType -}}
|
||||
<span class="flex flex-wrap gap-1 text-gray-700 font-normal">
|
||||
<span class="flex flex-nowrap gap-1 text-gray-700 font-normal overflow-hidden">
|
||||
{{- range $i, $t := $content.MusenalmType -}}
|
||||
<span class="bg-slate-200 text-slate-900 px-1.5 py-0.5 rounded text-sm font-semibold shadow-sm" data-role="content-type-pill">{{- $t -}}</span>
|
||||
{{- end -}}
|
||||
</span>
|
||||
{{- end -}}
|
||||
<div class="hidden flex flex-wrap items-baseline gap-2 text-gray-800" data-role="content-collapsed-summary">
|
||||
<div class="flex items-baseline gap-2 text-gray-800 min-w-0 flex-1 overflow-hidden flex-nowrap whitespace-nowrap" data-role="content-header-title">
|
||||
{{- if $content.Extent -}}
|
||||
<span class="bg-slate-200 text-slate-900 px-1.5 py-0.5 rounded text-sm font-semibold shadow-sm">S. {{- $content.Extent -}}</span>
|
||||
<span class="bg-slate-200 text-slate-900 px-1.5 py-0.5 rounded text-xs font-semibold shadow-sm shrink-0">S. {{- $content.Extent -}}</span>
|
||||
{{- end -}}
|
||||
{{- if $content.PreferredTitle -}}
|
||||
<span class="text-sm font-semibold">{{- $content.PreferredTitle -}}</span>
|
||||
<span class="text-sm font-semibold truncate min-w-0 overflow-hidden">{{- $content.PreferredTitle -}}</span>
|
||||
{{- else if $content.TitleStmt -}}
|
||||
<span class="text-sm font-semibold italic">{{- $content.TitleStmt -}}</span>
|
||||
<span class="text-sm font-semibold italic truncate min-w-0 overflow-hidden">{{- $content.TitleStmt -}}</span>
|
||||
{{- end -}}
|
||||
</div>
|
||||
<div class="hidden flex items-baseline gap-2 text-gray-800 min-w-0 overflow-hidden flex-1 flex-nowrap whitespace-nowrap" data-role="content-collapsed-summary">
|
||||
{{- if $content.Extent -}}
|
||||
<span class="bg-slate-200 text-slate-900 px-1.5 py-0.5 rounded text-sm font-semibold shadow-sm shrink-0">S. {{- $content.Extent -}}</span>
|
||||
{{- end -}}
|
||||
{{- if $content.PreferredTitle -}}
|
||||
<span class="text-sm font-semibold truncate min-w-0 overflow-hidden">{{- $content.PreferredTitle -}}</span>
|
||||
{{- else if $content.TitleStmt -}}
|
||||
<span class="text-sm font-semibold italic truncate min-w-0 overflow-hidden">{{- $content.TitleStmt -}}</span>
|
||||
{{- end -}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="flex items-center gap-2 flex-nowrap whitespace-nowrap shrink-0">
|
||||
<span class="status-badge text-xs shadow-sm" data-status="{{ $content.EditState }}">
|
||||
<i class="status-icon {{- if eq $content.EditState "Edited" }} ri-checkbox-circle-line{{- else if eq $content.EditState "Seen" }} ri-information-line{{- else if eq $content.EditState "Review" }} ri-search-line{{- else if eq $content.EditState "ToDo" }} ri-list-check{{- else }} ri-forbid-2-line{{- end }}"></i>
|
||||
{{- if eq $content.EditState "Edited" -}}Erfasst{{- else if eq $content.EditState "Review" -}}Überprüfen{{- else if eq $content.EditState "ToDo" -}}Zu erledigen{{- else if eq $content.EditState "Seen" -}}Autopsiert{{- else -}}Unbekannt{{- end -}}
|
||||
</span>
|
||||
<button
|
||||
type="button"
|
||||
class="resetbutton w-32 flex items-center gap-2 justify-center"
|
||||
data-role="content-edit-button"
|
||||
data-loading-label="Eintrag wird geladen"
|
||||
hx-boost="false"
|
||||
hx-get="/almanach/{{ $entry.MusenalmID }}/contents/edit/form?content_id={{ $contentID }}"
|
||||
hx-target="#{{ $editContainerID }}"
|
||||
hx-swap="innerHTML">
|
||||
<i class="ri-edit-2-line"></i>
|
||||
<span>Bearbeiten</span>
|
||||
</button>
|
||||
<tool-tip position="top" class="!inline">
|
||||
<div class="data-tip">Bearbeiten</div>
|
||||
<button
|
||||
type="button"
|
||||
class="resetbutton w-9 h-9 flex items-center justify-center hover:bg-stone-300 rounded-sm"
|
||||
data-role="content-edit-button"
|
||||
data-loading-label="Eintrag wird geladen"
|
||||
hx-boost="false"
|
||||
hx-get="/almanach/{{ $entry.MusenalmID }}/contents/edit/form?content_id={{ $contentID }}"
|
||||
hx-target="#{{ $editContainerID }}"
|
||||
hx-swap="innerHTML">
|
||||
<i class="ri-edit-2-line"></i>
|
||||
<span class="sr-only">Bearbeiten</span>
|
||||
</button>
|
||||
</tool-tip>
|
||||
<tool-tip position="top" class="!inline">
|
||||
<div class="data-tip">Löschen</div>
|
||||
<button
|
||||
type="button"
|
||||
class="resetbutton w-9 h-9 flex items-center justify-center text-red-700 hover:text-red-900 hover:bg-red-100 rounded-sm"
|
||||
data-role="content-delete-view"
|
||||
aria-label="Beitrag löschen">
|
||||
<i class="ri-delete-bin-line"></i>
|
||||
</button>
|
||||
</tool-tip>
|
||||
</div>
|
||||
</div>
|
||||
<dialog data-role="content-delete-dialog-view" class="dbform fixed inset-0 m-auto rounded-md border border-slate-200 p-0 shadow-xl backdrop:bg-black/40">
|
||||
<div class="p-5 w-[22rem]">
|
||||
<div class="text-base font-bold text-gray-900">Eintrag löschen?</div>
|
||||
{{- if $content.TitleStmt -}}
|
||||
<div class="text-sm font-bold text-gray-900 mt-1">{{ $content.TitleStmt }}</div>
|
||||
{{- end -}}
|
||||
<p class="text-sm text-gray-700 mt-2">
|
||||
Der Eintrag wird dauerhaft gelöscht. Verknüpfungen, Exemplare und Inhalte werden entfernt.
|
||||
</p>
|
||||
<div class="flex items-center justify-end gap-3 mt-4">
|
||||
<button type="button" class="resetbutton w-auto px-3 py-1 text-sm" data-role="content-delete-cancel-view">Abbrechen</button>
|
||||
<button type="button" class="submitbutton w-auto bg-red-700 hover:bg-red-800 px-3 py-1 text-sm" data-role="content-delete-confirm-view">
|
||||
Löschen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
<div class="grid gap-2 grid-cols-[8rem_1fr] items-baseline px-3 py-2" data-role="content-view-body">
|
||||
{{- if $content.Extent -}}
|
||||
<div class="text-sm font-bold text-gray-700">Seite</div>
|
||||
<div class="text-base">{{- $content.Extent -}}</div>
|
||||
{{- end -}}
|
||||
{{- if $content.TitleStmt -}}
|
||||
<div class="text-sm font-bold text-gray-700">Titel</div>
|
||||
<div class="text-base italic">{{- $content.TitleStmt -}}</div>
|
||||
{{- end -}}
|
||||
{{- if $content.IncipitStmt -}}
|
||||
<div class="text-sm font-bold text-gray-700">Incipit</div>
|
||||
<div class="text-base italic">{{ $content.IncipitStmt }}…</div>
|
||||
|
||||
Reference in New Issue
Block a user