@asd20/ui-next 2.28.0 → 2.28.1

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.28.1](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.28.0...ui-next-v2.28.1) (2026-10-02)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * allow an intro message on the handbook page; fix unnecessary focus outlines ([e8c8e09](https://github.com/academydistrict20/asd20-ui-next/commit/e8c8e0965f1f4cef4eb2b8ffa9aacb9b82c0ccc0))
9
+
3
10
  # [2.28.0](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.27.2...ui-next-v2.28.0) (2026-10-02)
4
11
 
5
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asd20/ui-next",
3
- "version": "2.28.0",
3
+ "version": "2.28.1",
4
4
  "private": false,
5
5
  "description": "ASD20 UI component library for Vue 3.",
6
6
  "license": "MIT",
@@ -23,7 +23,7 @@
23
23
 
24
24
  <asd20-page-header
25
25
  :heading="title"
26
- :lead="metaDescription"
26
+ :lead="handbookLead"
27
27
  :organization="organization"
28
28
  :organization-options="organizationOptions"
29
29
  :breadcrumb-links="breadcrumbLinks"
@@ -75,7 +75,7 @@
75
75
  :class="{ 'is-open': topicsOpen }"
76
76
  >
77
77
  <li
78
- v-for="message in messages"
78
+ v-for="message in topicMessages"
79
79
  :key="message.id"
80
80
  >
81
81
  <button
@@ -90,23 +90,31 @@
90
90
  </nav>
91
91
 
92
92
  <article
93
- v-for="message in messages"
93
+ v-for="message in topicMessages"
94
94
  :key="message.id"
95
95
  class="asd20-template-handbook__topic"
96
96
  :class="{ 'is-active': activeMessage && activeMessage.id === message.id }"
97
97
  >
98
- <h2
99
- tabindex="-1"
100
- >
98
+ <h2>
101
99
  {{ message.heading || message.title }}
102
100
  </h2>
101
+ <div
102
+ v-if="topicSummary(message)"
103
+ class="asd20-template-handbook__summary"
104
+ v-html="topicSummary(message)"
105
+ />
106
+ <hr
107
+ v-if="topicSummary(message)"
108
+ class="asd20-template-handbook__summary-divider"
109
+ />
103
110
  <asd20-messaging
104
111
  v-bind="message"
105
112
  heading=""
113
+ short-description=""
106
114
  detail-link=""
107
115
  />
108
116
  </article>
109
- <p v-if="!messages.length">
117
+ <p v-if="!topicMessages.length">
110
118
  No handbook topics are available yet.
111
119
  </p>
112
120
  </main>
@@ -123,7 +131,6 @@
123
131
  </template>
124
132
 
125
133
  <script>
126
- import { nextTick } from 'vue'
127
134
  import Asd20SkipTo from '../../../components/atoms/Asd20SkipTo'
128
135
  import Asd20Messaging from '../../../components/atoms/Asd20Messaging'
129
136
  import Asd20PageHeader from '../../../components/organisms/Asd20PageHeader'
@@ -150,18 +157,25 @@ export default {
150
157
  topicsOpen: false,
151
158
  }),
152
159
  computed: {
160
+ handbookLead() {
161
+ return this.firstMessage?.shortDescription || this.firstMessage?.summary || this.metaDescription
162
+ },
163
+ topicMessages() {
164
+ return this.messages.slice(1)
165
+ },
153
166
  activeMessage() {
154
- return this.messages.find(message => message.id === this.selectedMessageId)
155
- || this.messages[0]
167
+ return this.topicMessages.find(message => message.id === this.selectedMessageId)
168
+ || this.topicMessages[0]
156
169
  || null
157
170
  },
158
171
  },
159
172
  methods: {
160
- async selectTopic(messageId) {
173
+ topicSummary(message) {
174
+ return message.shortDescription || message.summary || ''
175
+ },
176
+ selectTopic(messageId) {
161
177
  this.selectedMessageId = messageId
162
178
  this.topicsOpen = false
163
- await nextTick()
164
- this.$el.querySelector('.asd20-template-handbook__topic.is-active h2')?.focus()
165
179
  },
166
180
  },
167
181
  }
@@ -189,6 +203,23 @@ export default {
189
203
  padding: space(2) space(1);
190
204
  }
191
205
 
206
+ &__layout:focus:not(.asd20-tab):not([role='tab']):not(.asd20-focus-trap) {
207
+ outline: none;
208
+ box-shadow: none !important;
209
+ }
210
+
211
+ &__summary {
212
+ @include asd20-font(0.75, var(--website-typography__font-family-body), 1.5);
213
+ margin-bottom: space(0.5);
214
+ }
215
+
216
+ &__summary-divider {
217
+ margin: 0 0 space(1);
218
+ border: 0;
219
+ border-top: 1px solid currentColor;
220
+ opacity: 0.25;
221
+ }
222
+
192
223
  &__index ol {
193
224
  display: none;
194
225
  list-style: none;