[Mappe·Shared] MetaLine — " · "-separated meta with optional icon (§7) #859
Open
opened 2026-06-16 10:53:52 +02:00 by marcel
·
0 comments
No Branch/Tag Specified
main
feat/issue-856-page-header
feat/issue-859-meta-line
feat/issue-858-card
feat/issue-860-empty-state
feat/issue-861-status-dot
feat/issue-855-avatar
feat/issue-857-segmented-control
feat/issue-850-inline-event-clustering
devops/issue-848-fork-exit-timeout
feat/issue-827-zeitstrahl-grouping
feat/issue-837-relationship-edit-dates
feat/issue-818-renovate-nightly-audit
feat/issue-803-geschichten-document-filter-chip
worktree-feat+issue-738-nl-search-backend
feat/issue-286-notification-bell-form-actions
feat/issue-580-sentry-backend
fix/issue-593-management-port-zero
worktree-feat+issue-557-upload-artifact-v3-pin
worktree-chore+issue-556-drop-client-branches-coverage-gate
fix/issue-514-prerender-crawl-bakes-redirects
fix/issue-472-prerender-entries
feat/issue-395-readme
feat/issue-345-bulk-mark-reviewed
feat/issue-344-bell-tooltip
feat/issue-341-annotieren-contrast
feat/issue-225-bulk-metadata-edit
feat/issue-317-bulk-upload
feat/issue-271-dashboard-redesign
docs/issue-240-mission-control-spec
refactor/issues-193-200
feat/issue-162-korrespondenz-redesign
feature/68-new-document-file-first
feat/81-discussion-discoverability
feat/62-document-bottom-panel
feature/56-backfill-file-hashes
feat/38-document-edit-history
fix/svelte5-test-delegation-and-login-auth
No results found.
Labels
Clear labels
P0-critical
P1-high
P2-medium
P3-later
audit
bug
cleanup
collaboration
conversation
descoped
devops
documentation
epic
feature
file-upload
legibility
needs-discussion
needs-review
notification
person
phase-1: security
phase-2: container-images
phase-3: prod-compose
phase-4: spring-prod-profile
phase-5: backups
phase-6: deployment-docs
phase-7: monitoring
redesign-mappe
refactor
security
spec-required
test
ui
user
Blocks a core user journey, causes data loss, or is a security/accessibility barrier. Work on this before P1+.
Significant friction on a main user journey; workaround exists but is non-obvious. Next up after P0.
Noticeable improvement; doesn't block anything; schedule opportunistically.
Cosmetic or parking-lot work; fine to stay open indefinitely.
Read-only audit / assessment work; produces a report rather than changing code
Something isn't working
Removal of dead code, vague comments, naming violations, and scratch artifacts
We want to extend the family archive to have more collaboration tools
We will do that later
README, ARCHITECTURE, GLOSSARY, CONTRIBUTING, per-domain docs
Marker for epic-level issues that group multiple child issues
Codebase Legibility Refactor — preparing the codebase for human evaluation and bus-factor reduction
Has an open decision or design question that must be resolved before implementation can start.
Spec is drafted and awaiting the multi-persona /review-issue gate.
Security hygiene — must be done first
Production-ready multi-stage Docker images
Production compose overlay + Caddy reverse proxy
Spring Boot production configuration profile
Database and object storage backup strategy
.env.example, DEPLOYMENT.md, runbook
Prometheus, Loki, Grafana, Alertmanager
Mappe visual redesign — consistency alignment across the app (shared components + pages). See the design_handoff bundle.
Code restructuring without behaviour change
Feature whose contract is its issue body (EARS REQ-NNN); the spec must pass review before implementation.
UI/UX and accessibility issues
Milestone
No items
No Milestone
Mappe Visual Redesign
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: marcel/familienarchiv#859
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Shared component · Story 4. Part of #853.
Context
Meta strings are built ad-hoc (
formatXsMetainpersonFormat.ts:57joins with·but there's no rendering component). The prototypes render an icon +·-separated spans.Prop contract — decided
MetaLine takes
items: string[](an array of already-formatted, already-localized strings) plus an optionaliconSrc: string(static asset path). It does not take a pre-joined string and does not absorbformatXsMeta's join logic. Callers remain responsible for building the item array (including running Paraglide lookups for unit labels like "Dokumente" / "Personen").formatXsMetacontinues to own composition; MetaLine owns only rendering.Icon path convention — decided: icons must be served from
/degruyter-icons/…paths so that thelayout.cssruleimg[src*='degruyter-icons']:not(.invert)triggers dark-mode inversion. The.dgiconclass does not have a corresponding CSS rule in the repo; do not use it and do not add it.Scope
$lib/shared/primitives/MetaLine.svelte— renders·-separated items in Montserrat 12pxvar(--c-ink-2), with an optional leading<img>icon 14px × 14px atopacity:.5(never emoji, never{@html}).Out of Scope
formatXsMetaor any other caller beyond PersonDetail.Acceptance
itemsas·-separated spans with Montserrat 12px, colorvar(--c-ink-2), gap 8px, items vertically centered (align-items:center). MatchesDESIGN_RULES §7/_AUTHORING_KIT.md §8.<img>icon is shown wheniconSrcis supplied, absent (no empty box) when omitted. Icon is 14px × 14px,opacity:.5,alt=""(decorative — screen readers skip it).iconSrcmust be a static asset path; it is never interpolated from user/import data.{…}escaping;{@html}is never used anywhere in the component (XSS guard — CWE-79).·line).flex-wrap: wrap; the·separators stay attached to the preceding item so no separator is stranded at line-start.srcmust begin with/degruyter-icons/;layout.css:402img[src*='degruyter-icons']:not(.invert)then appliesfilter:invert(1)automatically. Verify in both light and dark on PersonDetail.frontend/src/lib/shared/primitives/MetaLine.svelte.spec.ts(vitest-browser-svelte,--project=client) passes: renders N spans separated by·; leading<img>present wheniconSrcis set and absent otherwise;width:14px; height:14px; opacity:.5on the img;font-size:12px; zero-items renders empty;alt=""on the img.Depends on: none (consumes only existing tokens
--c-ink-2and the existing/degruyter-icons/dark rule — can be parallelized with other #853 sub-issues). Refs:DESIGN_RULES §7,_AUTHORING_KIT.md §8,layout.css:402.marcel referenced this issue2026-06-16 13:49:13 +02:00
marcel referenced this issue2026-06-16 14:00:18 +02:00
marcel referenced this issue2026-06-16 14:04:56 +02:00