[feature][footnotes] Мульти-бэклинки: определение возвращает ко ВСЕМ своим ссылкам (продолжение #166) #168

Closed
opened 2026-06-24 15:35:36 +03:00 by Ghost · 0 comments

Выделено из #166 как отдельный UI-слой (Feature 3b). Дата-целостностное ядро #166 (reuse + first-wins + warnings + paste-reuse) уже сделано в PR. Здесь — только редакторный UX мульти-бэклинков.

Контекст

После #166 повторные [^a] ссылки — это одна сноска (reuse): один номер, одно определение, N кликабельных ссылок вперёд. Но обратная стрелка ↩ в определении сейчас ведёт только к ПЕРВОЙ ссылке (scrollToReference(id) → первый sup[data-id=…]). Нужно, чтобы определение возвращало к каждой из своих ссылок (как в Pandoc/Wikipedia: ↩ a b c).

Объём

  • Карта occurrences по id: в footnote-numbering.ts/footnote-util.ts собрать id -> [reference occurrences] (порядок/счётчик), кэшировать рядом с numbers. Экспорт getter getFootnoteRefCount(state, id) (или список индексов).
  • Команда: расширить scrollToReference (footnote-reference.ts:~318) до scrollToReference(id, index?)querySelectorAll('sup[data-footnote-ref][data-id="…"]')[index].
  • View: apps/client/.../footnote/footnote-definition-view.tsx — при числе ссылок > 1 рендерить ↩ + подметки a, b, c…, каждая ведёт к своей occurrence; при одной — текущее поведение.
  • CSS: apps/client/.../footnote/footnote.module.css — раскладка нескольких бэклинков.
  • Тест: footnote-views.structure.test.tsx — мульти-бэклинки рендерятся по числу ссылок.

Почему отдельно

UI-слой требует визуальной проверки (вёрстка бэклинков), которую нельзя полноценно сделать headless. Ядро reuse работает без него; это полировка обратной навигации.

DoD

  • Определение с N ссылками показывает N бэклинков (↩ a, b, c…), каждый скроллит к своей occurrence.
  • Определение с одной ссылкой — без изменений (один ↩).
  • Тесты зелёные.
Выделено из #166 как отдельный UI-слой (Feature 3b). Дата-целостностное ядро #166 (reuse + first-wins + warnings + paste-reuse) уже сделано в PR. Здесь — только редакторный UX мульти-бэклинков. ## Контекст После #166 повторные `[^a]` ссылки — это одна сноска (reuse): один номер, одно определение, N кликабельных ссылок вперёд. Но обратная стрелка ↩ в определении сейчас ведёт только к ПЕРВОЙ ссылке (`scrollToReference(id)` → первый `sup[data-id=…]`). Нужно, чтобы определение возвращало к каждой из своих ссылок (как в Pandoc/Wikipedia: ↩ a b c). ## Объём - **Карта occurrences по id**: в `footnote-numbering.ts`/`footnote-util.ts` собрать `id -> [reference occurrences]` (порядок/счётчик), кэшировать рядом с `numbers`. Экспорт getter `getFootnoteRefCount(state, id)` (или список индексов). - **Команда**: расширить `scrollToReference` (`footnote-reference.ts:~318`) до `scrollToReference(id, index?)` → `querySelectorAll('sup[data-footnote-ref][data-id="…"]')[index]`. - **View**: `apps/client/.../footnote/footnote-definition-view.tsx` — при числе ссылок > 1 рендерить ↩ + подметки `a, b, c…`, каждая ведёт к своей occurrence; при одной — текущее поведение. - **CSS**: `apps/client/.../footnote/footnote.module.css` — раскладка нескольких бэклинков. - **Тест**: `footnote-views.structure.test.tsx` — мульти-бэклинки рендерятся по числу ссылок. ## Почему отдельно UI-слой требует визуальной проверки (вёрстка бэклинков), которую нельзя полноценно сделать headless. Ядро reuse работает без него; это полировка обратной навигации. ## DoD - Определение с N ссылками показывает N бэклинков (↩ a, b, c…), каждый скроллит к своей occurrence. - Определение с одной ссылкой — без изменений (один ↩). - Тесты зелёные.
vvzvlad added the feature label 2026-06-24 20:47:38 +03:00
Ghost closed this issue 2026-06-25 12:49:15 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#168