@ndwnu/design-system 13.1.1 → 14.0.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndwnu/design-system",
3
- "version": "13.1.1",
3
+ "version": "14.0.0",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^21.0.0",
6
6
  "@angular/common": "^21.0.0",
@@ -0,0 +1,46 @@
1
+ # Fonts
2
+
3
+ The design system self-hosts its fonts via [Fontsource](https://fontsource.org/) instead of loading them from the Google Fonts CDN. This avoids a runtime dependency on `fonts.googleapis.com` / `fonts.gstatic.com`.
4
+
5
+ ## Fonts in use
6
+
7
+ | Family | Used for | Fontsource package |
8
+ | --------------------------------- | -------------------------------------- | ----------------------------------------------- |
9
+ | DM Sans Variable | Headings (`--ndw-font-family-heading`) | `@fontsource-variable/dm-sans` |
10
+ | Nunito Sans Variable | Body text (`--ndw-font-family-body`) | `@fontsource-variable/nunito-sans` |
11
+ | Material Symbols Rounded Variable | Icons (`<ndw-icon>`) | `@fontsource-variable/material-symbols-rounded` |
12
+
13
+ These three packages are declared as **peer dependencies** of `@ndwnu/design-system`. Consuming apps install them alongside the design system:
14
+
15
+ ```bash
16
+ npm install @fontsource-variable/dm-sans @fontsource-variable/nunito-sans @fontsource-variable/material-symbols-rounded
17
+ ```
18
+
19
+ ## How they are loaded
20
+
21
+ The `@font-face` declarations live in [`base/_fonts.scss`](./base/_fonts.scss), which is `@forward`ed from [`base/index.scss`](./base/index.scss). `base/index.scss` is pulled in by the global stylesheet entry [`index.scss`](./index.scss), which apps include in their `angular.json`:
22
+
23
+ ```jsonc
24
+ // angular.json > projects > your-app > architect > build > options > styles
25
+ "styles": [
26
+ "./node_modules/@ndwnu/design-system/styles/index.scss"
27
+ ]
28
+ ```
29
+
30
+ Component-scoped SCSS files only `@use 'base/typography'` (mixins and classes). They never pull in `_fonts.scss`, which keeps `@font-face` declarations out of every component bundle and prevents ng-packagr from inlining megabytes of font CSS per component.
31
+
32
+ ## Subset selection
33
+
34
+ Each Fontsource package exposes several CSS entrypoints with different axis combinations. We pick the smallest subset that covers actual usage:
35
+
36
+ | Family | Entrypoint used | Axes | Notes |
37
+ | ------------------------ | ------------------------------ | -------------- | ------------------------------------------------------------------------------------- |
38
+ | DM Sans | `opsz.css` + `opsz-italic.css` | `opsz`, `wght` | Matches the Google URL the project used previously (`opsz 9..40`, `wght 400..650`). |
39
+ | Nunito Sans | `opsz.css` + `opsz-italic.css` | `opsz`, `wght` | Matches the previous Google URL (`opsz 6..12`, `wght 400..650`). |
40
+ | Material Symbols Rounded | `fill.css` | `wght`, `FILL` | We only toggle `FILL` (see below). Choosing `fill.css` over `full.css` saves ~3.7 MB. |
41
+
42
+ The icon component sets `font-variation-settings: 'FILL' 1;` in [`icon.component.scss`](../lib/components/icon/icon.component.scss) to switch between outlined and filled icons. We do not vary the `opsz` or `GRAD` axes for icons, so `fill.css` (≈1.4 MB) is sufficient. If a future feature needs those axes, switch the import to `full.css` (≈5.1 MB) — the tradeoff is bundle size.
43
+
44
+ ## Material Symbols Rounded class
45
+
46
+ Google's hosted CSS provides a `.material-symbols-rounded` class that pairs the font-family with `font-feature-settings: 'liga'` (so glyph name → ligature → icon works). Fontsource does not, so [`_fonts.scss`](./base/_fonts.scss) defines the equivalent rule locally. The `<ndw-icon>` component applies this class via its host binding.
@@ -0,0 +1,13 @@
1
+ @import '@fontsource-variable/dm-sans/opsz.css';
2
+ @import '@fontsource-variable/dm-sans/opsz-italic.css';
3
+ @import '@fontsource-variable/nunito-sans/opsz.css';
4
+ @import '@fontsource-variable/nunito-sans/opsz-italic.css';
5
+ @import '@fontsource-variable/material-symbols-rounded/fill.css';
6
+
7
+ .material-symbols-rounded {
8
+ font-family: 'Material Symbols Rounded Variable', sans-serif;
9
+ font-feature-settings: 'liga';
10
+ font-style: normal;
11
+ font-weight: normal;
12
+ line-height: 1;
13
+ }
@@ -1,9 +1,3 @@
1
- @import url('https://fonts.googleapis.com/css2\
2
- ?family=DM+Sans:ital,opsz,wght@0,9..40,400..650;1,9..40,400..650\
3
- &family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,400,0..1\
4
- &family=Nunito+Sans:ital,opsz,wght@0,6..12,400..650;1,6..12,400..650\
5
- &display=block');
6
-
7
1
  /* Mixins */
8
2
  @mixin ndw-heading-xl {
9
3
  font-family: var(--ndw-font-family-heading);
@@ -51,8 +51,8 @@
51
51
 
52
52
  /* Typography */
53
53
  // Font Family
54
- --ndw-font-family-body: 'Nunito Sans', sans-serif;
55
- --ndw-font-family-heading: 'DM Sans', sans-serif;
54
+ --ndw-font-family-body: 'Nunito Sans Variable', sans-serif;
55
+ --ndw-font-family-heading: 'DM Sans Variable', sans-serif;
56
56
 
57
57
  // Font Size
58
58
  --ndw-base-font-size: 16px;
@@ -1,4 +1,5 @@
1
1
  @forward 'colors';
2
+ @forward 'fonts';
2
3
  @forward 'material';
3
4
  @forward 'typography';
4
5
  @forward 'variables';
@@ -71,14 +71,29 @@
71
71
  background-color: var(--ndw-color-grey-100);
72
72
  border-color: var(--ndw-color-grey-300);
73
73
  color: var(--ndw-color-grey-500);
74
- pointer-events: none;
74
+ cursor: default;
75
+
76
+ &:hover,
77
+ &:has([ndwInput]:hover) {
78
+ border-color: var(--ndw-color-grey-300);
79
+ }
80
+
81
+ &:has([ndwInput]:active),
82
+ &:has([ndwInput]:focus),
83
+ &:has([ndwInput]:focus-visible) {
84
+ border-color: var(--ndw-color-grey-300);
85
+ box-shadow: none;
86
+ outline-color: transparent;
87
+ }
75
88
 
76
89
  [ndwInput] {
77
90
  background-color: var(--ndw-color-grey-100);
91
+ user-select: text;
78
92
  }
79
93
 
80
94
  ndw-icon {
81
95
  color: var(--ndw-color-grey-500);
96
+ pointer-events: none;
82
97
  }
83
98
  }
84
99
  }
@@ -990,6 +990,7 @@ declare class LanguageSwitcherComponent {
990
990
 
991
991
  interface SubMenuItem {
992
992
  label: string;
993
+ icon?: string;
993
994
  active?: boolean;
994
995
  callback?: () => void;
995
996
  notifications?: number;
@@ -997,7 +998,6 @@ interface SubMenuItem {
997
998
  queryParams?: Params;
998
999
  }
999
1000
  interface MenuItem extends SubMenuItem {
1000
- icon: string;
1001
1001
  children?: SubMenuItem[];
1002
1002
  }
1003
1003
  type Theme = 'ndw' | 'nwb';
@@ -1051,16 +1051,16 @@ declare class LoaderComponent {
1051
1051
 
1052
1052
  declare class MapButtonComponent {
1053
1053
  #private;
1054
- readonly icon: _angular_core.InputSignal<"search" | "polygon" | "direction" | "gps" | "high-res" | "layers" | "zoom-in" | "zoom-out" | "mail" | "add-traffic-sign" | "add-zone" | "download" | "hectometer" | "low-res" | "zoom-to-content">;
1054
+ readonly icon: _angular_core.InputSignal<"search" | "polygon" | "direction" | "gps" | "high-res" | "layers" | "zoom-in" | "zoom-out" | "mail" | "add-traffic-sign" | "add-zone" | "download" | "hectometer" | "low-res" | "zoom-to-content" | undefined>;
1055
1055
  readonly active: _angular_core.InputSignal<boolean>;
1056
1056
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1057
1057
  readonly disabled: _angular_core.InputSignal<boolean>;
1058
1058
  readonly clicked: _angular_core.OutputEmitterRef<void>;
1059
- protected readonly buttonIcon: _angular_core.Signal<string>;
1059
+ protected readonly buttonIcon: _angular_core.Signal<string | undefined>;
1060
1060
  protected readonly svgIcon: _angular_core.Signal<string | undefined>;
1061
1061
  protected readonly iconLabel: _angular_core.Signal<string>;
1062
1062
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MapButtonComponent, never>;
1063
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MapButtonComponent, "ndw-map-button", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
1063
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MapButtonComponent, "ndw-map-button", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
1064
1064
  }
1065
1065
 
1066
1066
  declare const fontMapButtonIcons: readonly ["direction", "gps", "high-res", "layers", "polygon", "search", "zoom-in", "zoom-out", "mail"];
@@ -1075,6 +1075,7 @@ interface MapDisplayOption {
1075
1075
  name: string;
1076
1076
  active?: boolean;
1077
1077
  imageLink?: string;
1078
+ icon?: string;
1078
1079
  description?: string;
1079
1080
  [key: string]: unknown;
1080
1081
  }
@@ -1587,12 +1588,17 @@ declare class TooltipDirective implements OnChanges, OnDestroy, OnInit {
1587
1588
  private readonly ariaDescriber;
1588
1589
  text: _angular_core.InputSignal<string>;
1589
1590
  private overlayRef;
1591
+ private tooltipRef;
1592
+ private isMouseOverTooltip;
1590
1593
  ngOnInit(): void;
1591
1594
  ngOnChanges(): void;
1592
1595
  ngOnDestroy(): void;
1593
1596
  protected show(): void;
1597
+ protected hideFromTrigger(): void;
1594
1598
  protected hide(): void;
1595
1599
  protected hideOnEscape(): void;
1600
+ private readonly onTooltipMouseEnter;
1601
+ private readonly onTooltipMouseLeave;
1596
1602
  private updateAriaDescription;
1597
1603
  private getFlexibleConnectedPositionStrategy;
1598
1604
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipDirective, never>;