@asd20/ui-next 2.10.4 → 2.10.6

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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.10.6](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.10.5...ui-next-v2.10.6) (2026-05-15)
4
+
5
+ ## [2.10.5](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.10.4...ui-next-v2.10.5) (2026-05-15)
6
+
3
7
  ## [2.10.4](https://github.com/academydistrict20/asd20-ui-next/compare/ui-next-v2.10.3...ui-next-v2.10.4) (2026-05-14)
4
8
 
5
9
 
package/README.md CHANGED
@@ -1,53 +1,145 @@
1
1
  # @asd20/ui-next
2
2
 
3
- Vue 3 component library for ASD20 shared UI surfaces.
3
+ Shared Vue 3 UI package for Academy District 20 websites and web apps.
4
4
 
5
- The current published baseline is `@asd20/ui-next@2.0.0`. This release is Vue 3-only and ships the model-only shared input contract.
5
+ Current local version: `2.10.4`
6
+
7
+ This package is the active shared presentation layer for the ASD20 web platform.
8
+ It provides reusable components, public website templates, app-shell templates,
9
+ icons, design tokens, Sass helpers, assets, directives, and helper functions
10
+ used by the Nuxt website, standalone apps, and selected CommCenter preview
11
+ surfaces.
12
+
13
+ ## Platform Role
14
+
15
+ This repo owns the packaged UI contract for:
16
+
17
+ - public website templates consumed by `asd20-website`
18
+ - app templates and components consumed by calendar, directory, school
19
+ directory, and file directory apps
20
+ - selected CommCenter preview components and icon/template imports
21
+ - global design tokens and Sass helpers shared across consumers
22
+ - icon metadata and SVG component exports
23
+ - helper functions for event/message/page/file/people mapping, search calls,
24
+ organization labels, link handling, cookies, email, and analytics feedback
25
+
26
+ The package is published to npm as `@asd20/ui-next`. It should be treated as a
27
+ multi-repo contract, not as an app-local component folder.
28
+
29
+ ## Runtime Contract
30
+
31
+ - Node `>=20`
32
+ - npm `>=10`
33
+ - Vue peer dependency `^3.0.0`
34
+ - Package build system: Vue CLI / webpack
35
+ - Unit test runner: Vitest
36
+ - Component development: Storybook
6
37
 
7
38
  ## Public Entry Points
8
39
 
40
+ Supported import paths are defined in `package.json` and guarded by
41
+ `scripts/public-api-contract.js`:
42
+
9
43
  - `@asd20/ui-next`
10
44
  - `@asd20/ui-next/components`
11
45
  - `@asd20/ui-next/templates`
46
+ - `@asd20/ui-next/templates/*`
12
47
  - `@asd20/ui-next/icons`
13
48
  - `@asd20/ui-next/helpers`
14
49
  - `@asd20/ui-next/directives`
50
+ - `@asd20/ui-next/install`
15
51
  - `@asd20/ui-next/styles.css`
16
52
  - `@asd20/ui-next/design/*`
17
53
  - `@asd20/ui-next/assets/*`
18
-
19
- ## Development
20
-
21
- ```bash
54
+ - `@asd20/ui-next/package.json`
55
+
56
+ Downstream repos should import through those paths. Private source imports are
57
+ not part of the supported contract unless they are explicitly covered by the
58
+ package `exports` map.
59
+
60
+ ## Source Layout
61
+
62
+ | Path | Purpose |
63
+ | --- | --- |
64
+ | `components.js` | Public component exports. |
65
+ | `templates.js` | Public template exports. |
66
+ | `icons.js` | Generated icon component exports. |
67
+ | `helpers.js` | Public helper exports. |
68
+ | `directives.js` | Public directive exports. |
69
+ | `install.js` | Vue plugin install helpers. |
70
+ | `src/components/atoms/` | Base UI components. |
71
+ | `src/components/molecules/` | Combined controls and display units. |
72
+ | `src/components/organisms/` | Larger site/app sections. |
73
+ | `src/components/templates/` | Website and app templates. |
74
+ | `src/design/` | CSS tokens, Sass helpers, typography, template stack, images. |
75
+ | `src/assets/icons/` | Raw SVG icon assets. |
76
+ | `src/helpers/` | Shared helper implementation. |
77
+ | `src/directives/` | Directive implementation. |
78
+ | `scripts/` | Build, package, release, and verification scripts. |
79
+ | `docs/migration/` | Historical migration and release notes. |
80
+
81
+ ## Local Development
82
+
83
+ ```sh
22
84
  npm install
23
85
  npm run storybook
86
+ npm test
24
87
  npm run build
25
88
  ```
26
89
 
27
- ## Release Validation
90
+ Regenerate icon metadata after adding, removing, or renaming SVG icon assets:
28
91
 
29
- Build the staged publish artifact with:
92
+ ```sh
93
+ npm run generate:icons
94
+ npm run verify:icon-metadata
95
+ ```
96
+
97
+ ## Package Verification
98
+
99
+ Build the staged publish artifact:
30
100
 
31
- ```bash
101
+ ```sh
32
102
  npm run build:package
33
103
  ```
34
104
 
35
- Validate the publish shape end to end with:
105
+ Verify the source and staged package contract:
36
106
 
37
- ```bash
107
+ ```sh
38
108
  npm run verify:publish
39
109
  ```
40
110
 
41
- That flow rebuilds `dist/package`, verifies the root and staged export contract, checks the public API surface, and runs `npm pack --dry-run` against the staged package.
111
+ That command rebuilds `dist/package`, verifies public exports, verifies Vue 3
112
+ input/lifecycle/instance-id contracts, verifies the staged package, and runs
113
+ `npm pack --dry-run`.
42
114
 
43
- Validate the packed consumer install path with:
115
+ Verify the packed consumer install path:
44
116
 
45
- ```bash
117
+ ```sh
46
118
  npm run verify:release
47
119
  ```
48
120
 
49
- That flow packs the staged package into a tarball, installs it into a temporary Vue 3 smoke app, and confirms the consumer build succeeds against the installed package shape.
121
+ That command packs the staged package, installs it into a temporary Vue 3 smoke
122
+ app, imports the public components/templates/icons/helpers/directives/styles,
123
+ and confirms the consumer build succeeds.
124
+
125
+ ## Release
126
+
127
+ ```sh
128
+ npm run release
129
+ ```
130
+
131
+ The release flow publishes from `dist/package`, tags as `ui-next-v${version}`,
132
+ and runs `npm run verify:release` before publishing.
133
+
134
+ ## Change Guidance
135
+
136
+ Before changing this package, identify which public entry point is affected and
137
+ which downstream repos consume it. Template, style/token, icon, input model, and
138
+ helper changes are especially likely to require downstream website or app
139
+ verification.
50
140
 
51
- ## Migration Record
141
+ For broader architecture context, see
142
+ `../asd20-website/docs/platform/shared-ui-contract.md`.
52
143
 
53
- The package is now release-ready and published, but the migration record is still kept under `docs/migration/` for downstream audit history, release decisions, and future cleanup planning.
144
+ The migration record under `docs/migration/` is retained for audit history,
145
+ release decisions, and future cleanup planning.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asd20/ui-next",
3
- "version": "2.10.4",
3
+ "version": "2.10.6",
4
4
  "private": false,
5
5
  "description": "ASD20 UI component library for Vue 3.",
6
6
  "license": "MIT",
@@ -137,17 +137,6 @@
137
137
  v-if="callsToAction.length > 0"
138
138
  class="asd20-page-header__call-to-action"
139
139
  >
140
- <!-- <asd20-button
141
- v-for="(cta, index) in callsToAction"
142
- :key="index"
143
- :size="['sm', 'md'].indexOf(mq) > -1 ? 'sm' : 'lg'"
144
- :label="cta.label"
145
- :icon="cta.icon"
146
- :link="cta.url"
147
- reversed
148
- horizontal
149
- centered
150
- /> -->
151
140
  <asd20-button
152
141
  v-if="callsToAction.length >= 1"
153
142
  :size="mq === 'sm' ? 'sm' : 'lg'"
@@ -183,7 +172,6 @@
183
172
  import scrollTrack from '../../../directives/scroll-track'
184
173
  import responsiveBreakpointMixin from '../../../mixins/responsiveBreakpointMixin'
185
174
  import Asd20Button from '../../atoms/Asd20Button'
186
- // import Asd20DistrictLogo from '../../../components/atoms/Asd20DistrictLogo'
187
175
  import Asd20OrganizationPicker from '../../../components/organisms/Asd20OrganizationPicker'
188
176
  import Asd20Breadcrumb from '../../../components/atoms/Asd20Breadcrumb'
189
177
  import Asd20LanguageTranslation from '../../molecules/Asd20LanguageTranslation'
@@ -196,7 +184,6 @@ export default {
196
184
  name: 'Asd20PageHeader',
197
185
  components: {
198
186
  Asd20Button,
199
- // Asd20DistrictLogo,
200
187
  Asd20OrganizationPicker,
201
188
  Asd20Breadcrumb,
202
189
  Asd20LanguageTranslation,
@@ -455,26 +442,6 @@ export default {
455
442
  background: var(--website-header__background-color) var(--imageBackground)
456
443
  left center / cover no-repeat;
457
444
  }
458
- /* .add-fade {*/
459
- /* &::before {*/
460
- /* content: '';*/
461
- /* // height: auto;*/
462
- /* display: block;*/
463
- /* position: absolute;*/
464
- /* z-index: -1;*/
465
- /* top: 0;*/
466
- /* bottom: auto;*/
467
- /* left: 0;*/
468
- /* width: 100%;*/
469
- /* height: 100%;*/
470
- /* background: linear-gradient(*/
471
- /* 30deg,*/
472
- /* rgba(6, 11, 31, 0.7) 10%,*/
473
- /* rgba(6, 11, 31, 0.5) 55%,*/
474
- /* transparent 70%*/
475
- /* );*/
476
- /* }*/
477
- /* }*/
478
445
 
479
446
  h1 {
480
447
  position: relative;
@@ -680,7 +647,6 @@ export default {
680
647
  flex-grow: 1;
681
648
  padding: 1rem 1rem 1rem 2rem;
682
649
  min-height: clamp(240px, 40vh, 300px);
683
- /* margin-right: space(3);*/
684
650
  background: transparent;
685
651
  }
686
652
 
@@ -701,7 +667,6 @@ export default {
701
667
  max-height: inherit;
702
668
  object-fit: cover;
703
669
  border-top: none;
704
- /* opacity: 0;*/
705
670
  }
706
671
  }
707
672
 
@@ -712,9 +677,6 @@ export default {
712
677
  &__title-content {
713
678
  position: relative;
714
679
  max-width: space(35);
715
- /* .asd20-page-header__lead {*/
716
- /* margin-right: 25%;*/
717
- /* }*/
718
680
  }
719
681
 
720
682
  & :deep(.asd20-organization-picker) {
@@ -759,7 +721,6 @@ export default {
759
721
  flex-grow: 1;
760
722
  padding: space(0) space(2) space(1) space(3);
761
723
  min-height: clamp(240px, 40vh, 300px);
762
- /* margin-right: space(3);*/
763
724
  background: transparent;
764
725
  }
765
726
  &__image {
@@ -780,7 +741,6 @@ export default {
780
741
  max-height: inherit;
781
742
  object-fit: cover;
782
743
  border-top: none;
783
- /* opacity: 0;*/
784
744
  }
785
745
  }
786
746
  h1 {
@@ -794,9 +754,6 @@ export default {
794
754
  &__title-content {
795
755
  position: relative;
796
756
  max-width: space(35);
797
- /* .asd20-page-header__lead {*/
798
- /* margin-right: 25%;*/
799
- /* }*/
800
757
  }
801
758
 
802
759
  & :deep(.asd20-organization-picker) {
@@ -293,20 +293,6 @@ export default {
293
293
  return this.loginsByTab.find(t => this.tab === t.hash)
294
294
  },
295
295
  },
296
- // created() {
297
- // if (typeof window !== 'undefined' && this.tabsList.length) {
298
- // window.location.hash = this.tabsList[0].hash
299
- // console.log(this.tabsList[0].hash)
300
- // if (
301
- // typeof window !== 'undefined' &&
302
- // window.location.hash.indexOf('#tab-') > -1
303
- // ) {
304
- // this.tab = window.location.hash
305
- // console.log(window.location.hash)
306
- // }
307
- // window.focus(this.tab)
308
- // }
309
- // },
310
296
 
311
297
  created() {
312
298
  if (typeof window === 'undefined' || !this.tabsList.length) return
@@ -359,13 +345,9 @@ export default {
359
345
  overflow: hidden;
360
346
  margin-top: space(2.25);
361
347
  .asd20-page-header::after {
362
- left: 0 !important;
363
- }
364
- .asd20-page-header {
365
- margin-bottom: space(0) !important;
366
- .asd20-page-header__tools {
367
- }
348
+ display: none;
368
349
  }
350
+
369
351
  .notification-group--floating {
370
352
  position: absolute;
371
353
  right: space(0.5);
@@ -381,9 +363,9 @@ export default {
381
363
  background-position-y: top;
382
364
  padding: space(1) 0;
383
365
  }
384
- // .logins-tab-bar {
385
- // padding: space(2) 0 0 0;
386
- // }
366
+ .logins-tab-bar {
367
+ border-bottom: none;
368
+ }
387
369
  .logins-list {
388
370
  display: flex;
389
371
  flex-direction: column;
@@ -421,9 +403,6 @@ export default {
421
403
  .notification-group--inline {
422
404
  margin: space(2) space(3) space(1) space(3);
423
405
  }
424
- .asd20-page-header::after {
425
- border-bottom-left-radius: 0;
426
- }
427
406
  .asd20-page-content {
428
407
  margin-top: space(1);
429
408
  }