@asd20/ui-next 2.35.0 → 2.35.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.35.2](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.35.1...ui-next-v2.35.2) (2026-11-04)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * restore previous sidebar scroll behavior for handbook template ([ff72930](https://github.com/academydistrict20/asd20-ui-next/commit/ff729302a2596d87928aee3a419e345d841fa910))
9
+
10
+ ## [2.35.1](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.35.0...ui-next-v2.35.1) (2026-11-04)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * correct handbook story layout and add AEES attendance sample ([b1d06e8](https://github.com/academydistrict20/asd20-ui-next/commit/b1d06e894345071d3535d88a95f99eaf36dccc9a))
16
+ * stabilize handbook navigation and remove footer ([5db1c4c](https://github.com/academydistrict20/asd20-ui-next/commit/5db1c4c11f3476081f5ea1f18cb7e02ca3a732b2))
17
+
3
18
  # [2.35.0](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.34.6...ui-next-v2.35.0) (2026-11-03)
4
19
 
5
20
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asd20/ui-next",
3
- "version": "2.35.0",
3
+ "version": "2.35.2",
4
4
  "private": false,
5
5
  "description": "ASD20 UI component library for Vue 3.",
6
6
  "license": "MIT",
@@ -133,6 +133,14 @@
133
133
  class="asd20-template-handbook__layout"
134
134
  tabindex="-1"
135
135
  >
136
+ <p
137
+ v-if="publicationDiagnostics.length"
138
+ class="asd20-template-handbook__publication-review"
139
+ role="status"
140
+ >
141
+ This handbook has content that needs publication review before PDF export.
142
+ </p>
143
+
136
144
  <nav
137
145
  class="asd20-template-handbook__index"
138
146
  aria-label="Handbook topics"
@@ -206,14 +214,6 @@
206
214
  </ol>
207
215
  </nav>
208
216
 
209
- <p
210
- v-if="publicationDiagnostics.length"
211
- class="asd20-template-handbook__publication-review"
212
- role="status"
213
- >
214
- This handbook has content that needs publication review before PDF export.
215
- </p>
216
-
217
217
  <asd20-print-contents
218
218
  v-if="documentPrint"
219
219
  :headings="printHeadings"
@@ -267,15 +267,6 @@
267
267
  No handbook topics are available yet.
268
268
  </p>
269
269
  </main>
270
-
271
- <asd20-quicklinks-menu :quick-links="quickLinks" />
272
- <asd20-page-footer
273
- :organization="organization"
274
- :social-links="socialLinks"
275
- :disclosure-links="disclosureLinks"
276
- :website-logo-props="websiteLogoProps"
277
- :website-logo-props2="websiteLogoProps2"
278
- />
279
270
  </div>
280
271
  </template>
281
272
 
@@ -289,8 +280,6 @@ import Asd20Viewport from '../../atoms/Asd20Viewport'
289
280
  import Asd20PageHeader from '../../../components/organisms/Asd20PageHeader'
290
281
  import Asd20SiteNavigation from '../../../components/organisms/Asd20SiteNavigation'
291
282
  import Asd20NotificationGroup from '../../../components/organisms/Asd20NotificationGroup'
292
- import Asd20QuicklinksMenu from '../../../components/organisms/Asd20QuicklinksMenu'
293
- import Asd20PageFooter from '../../../components/organisms/Asd20PageFooter'
294
283
  import Asd20PrintHeader from '../../molecules/Asd20PrintHeader'
295
284
  import Asd20PrintContents from '../../molecules/Asd20PrintContents'
296
285
  import { buildHandbookDocument } from '../../../helpers/handbookDocument'
@@ -311,8 +300,6 @@ export default {
311
300
  Asd20PageHeader,
312
301
  Asd20SiteNavigation,
313
302
  Asd20NotificationGroup,
314
- Asd20QuicklinksMenu,
315
- Asd20PageFooter,
316
303
  Asd20PrintHeader,
317
304
  Asd20PrintContents,
318
305
  },
@@ -382,6 +369,27 @@ export default {
382
369
  this.stopPrintLifecycle?.()
383
370
  },
384
371
  methods: {
372
+ closeTopics() {
373
+ const index = this.$el.querySelector('.asd20-template-handbook__index')
374
+ const focusContent = this.topicsOpen && index.contains(index.ownerDocument.activeElement)
375
+ this.topicsOpen = false
376
+ return focusContent
377
+ },
378
+ scrollToReadingTarget(target, { focus = false } = {}) {
379
+ if (!target) return
380
+ const view = target.ownerDocument.defaultView
381
+ const inset = parseFloat(view.getComputedStyle(target).scrollMarginTop) || 0
382
+ // Only move this document's page, keeping any surrounding preview or
383
+ // application scroll containers in place.
384
+ view.scrollTo({
385
+ top: Math.max(0, view.scrollY + target.getBoundingClientRect().top - inset),
386
+ behavior: 'instant',
387
+ })
388
+ if (focus) {
389
+ if (!target.hasAttribute('tabindex')) target.setAttribute('tabindex', '-1')
390
+ target.focus({ preventScroll: true })
391
+ }
392
+ },
385
393
  updatePrintLifecycle() {
386
394
  this.stopPrintLifecycle?.()
387
395
  this.stopPrintLifecycle = this.documentPrint ? installDocumentPrintLifecycle(this.$el) : null
@@ -429,10 +437,8 @@ export default {
429
437
  await this.$nextTick()
430
438
  if (epoch !== this.fragmentEpoch) return false
431
439
  }
432
- target.scrollIntoView({ block: 'start' })
433
440
  // A followed content link moves keyboard focus to its destination.
434
- if (!target.hasAttribute('tabindex')) target.setAttribute('tabindex', '-1')
435
- target.focus({ preventScroll: true })
441
+ this.scrollToReadingTarget(target, { focus: true })
436
442
  return true
437
443
  },
438
444
  onHandbookLinkClick(event) {
@@ -471,19 +477,21 @@ export default {
471
477
  this.expandedTopicId = this.expandedTopicId === messageId ? null : messageId
472
478
  },
473
479
  async selectTopic(messageId) {
474
- this.fragmentEpoch++
480
+ const epoch = ++this.fragmentEpoch
475
481
  this.selectedMessageId = messageId
476
482
  this.expandedTopicId = this.subtopicsFor(messageId).length ? messageId : null
477
- this.topicsOpen = false
483
+ const focusContent = this.closeTopics()
478
484
  await this.$nextTick()
479
- this.topicArticle(messageId)?.scrollIntoView({ block: 'start' })
485
+ if (epoch !== this.fragmentEpoch) return
486
+ this.scrollToReadingTarget(this.topicArticle(messageId), { focus: focusContent })
480
487
  },
481
488
  async selectSubtopic(messageId, headingId) {
482
- this.fragmentEpoch++
489
+ const epoch = ++this.fragmentEpoch
483
490
  this.selectedMessageId = messageId
484
491
  this.expandedTopicId = messageId
485
- this.topicsOpen = false
492
+ const focusContent = this.closeTopics()
486
493
  await this.$nextTick()
494
+ if (epoch !== this.fragmentEpoch) return
487
495
  const article = this.topicArticle(messageId)
488
496
  const heading = Array.from(article?.querySelectorAll('[id]') || [])
489
497
  .find(element => element.id === headingId)
@@ -492,8 +500,9 @@ export default {
492
500
  if (toggle) {
493
501
  toggle.click()
494
502
  await this.$nextTick()
503
+ if (epoch !== this.fragmentEpoch) return
495
504
  }
496
- heading?.scrollIntoView({ block: 'start' })
505
+ this.scrollToReadingTarget(heading, { focus: focusContent })
497
506
  },
498
507
  },
499
508
  }
@@ -540,6 +549,10 @@ export default {
540
549
  box-shadow: none !important;
541
550
  }
542
551
 
552
+ &__publication-review {
553
+ grid-column: 1 / -1;
554
+ }
555
+
543
556
  &__summary {
544
557
  @include asd20-font(0.75, var(--website-typography__font-family-body), 1.5);
545
558
  margin-bottom: space(0.5);
@@ -656,10 +669,13 @@ export default {
656
669
 
657
670
  &__topic {
658
671
  min-width: 0;
672
+ // Keep a full reading view available, even for a short topic.
673
+ min-height: calc(100vh - #{space(2)});
674
+ min-height: calc(100svh - #{space(2)});
659
675
  scroll-margin-top: space(2);
660
676
  }
661
677
 
662
- &__topic .asd20-rich-body-content h3 {
678
+ &__topic [id] {
663
679
  scroll-margin-top: space(2);
664
680
  }
665
681
 
@@ -731,6 +747,7 @@ export default {
731
747
  }
732
748
 
733
749
  &__topic {
750
+ min-height: 0;
734
751
  break-inside: avoid-page;
735
752
  }
736
753
  }