novo-elements 13.2.0 → 13.4.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.
Files changed (137) hide show
  1. package/addons/ckeditor/CKEditor.scss +8 -0
  2. package/elements/agenda/week/AgendaWeekView.scss +1 -1
  3. package/elements/breadcrumbs/Breadcrumb.scss +1 -1
  4. package/elements/button/styles/button-dialogue.scss +12 -0
  5. package/elements/button/styles/button-icon.scss +20 -0
  6. package/elements/button/styles/button-primary.scss +16 -1
  7. package/elements/button/styles/button-secondary.scss +14 -1
  8. package/elements/button/styles/button-standard.scss +14 -0
  9. package/elements/button/styles/button.scss +12 -1
  10. package/elements/card/Card.scss +80 -19
  11. package/elements/card/CardContent.scss +3 -0
  12. package/elements/card/CardHeader.scss +23 -0
  13. package/elements/card/index.d.ts +5 -3
  14. package/elements/category-dropdown/CategoryDropdown.scss +1 -1
  15. package/elements/checkbox/CheckList.scss +69 -0
  16. package/elements/checkbox/Checkbox.scss +104 -0
  17. package/elements/chips/Chip.scss +47 -1
  18. package/elements/chips/Chips.scss +9 -0
  19. package/elements/common/index.d.ts +14 -4
  20. package/elements/common/option/option.component.scss +11 -0
  21. package/elements/common/typography/text.mixins.scss +1 -1
  22. package/elements/data-table/data-table.component.scss +81 -3
  23. package/elements/data-table/pagination/data-table-pagination.component.scss +73 -0
  24. package/elements/date-picker/DatePicker.scss +1 -6
  25. package/elements/date-picker/DatePickerInput.scss +5 -0
  26. package/elements/date-time-picker/_DateTimePicker.scss +1 -1
  27. package/elements/dropdown/Dropdown.scss +17 -1
  28. package/elements/field/field.scss +10 -6
  29. package/elements/field/hint/hint.scss +6 -0
  30. package/elements/form/ControlGroup.scss +13 -0
  31. package/elements/form/Form.scss +260 -1
  32. package/elements/form/extras/address/Address.scss +77 -0
  33. package/elements/form/fieldset-header.scss +32 -0
  34. package/elements/form/index.d.ts +14 -4
  35. package/elements/header/Header.scss +45 -3
  36. package/elements/layout/index.d.ts +28 -4
  37. package/elements/list/list-item-content.scss +11 -10
  38. package/elements/menu/menu-content.component.scss +1 -0
  39. package/elements/modal/modal.component.scss +3 -13
  40. package/elements/modal/notification.component.scss +1 -6
  41. package/elements/picker/Picker.scss +26 -5
  42. package/elements/picker/extras/picker-results/PickerResults.scss +52 -0
  43. package/elements/progress/Progress.scss +8 -0
  44. package/elements/progress/ProgressBar.scss +4 -1
  45. package/elements/search/SearchBox.scss +53 -0
  46. package/elements/search/index.d.ts +19 -9
  47. package/elements/select/Select.scss +1 -1
  48. package/elements/simple-table/table.scss +1 -1
  49. package/elements/stepper/stepper.component.scss +4 -4
  50. package/elements/switch/Switch.scss +39 -3
  51. package/elements/tabbed-group-picker/TabbedGroupPicker.scss +47 -0
  52. package/elements/tabs/tab.scss +53 -14
  53. package/elements/tiles/Tiles.scss +24 -2
  54. package/elements/time-picker/TimePicker.scss +2 -2
  55. package/elements/time-picker/TimePickerInput.scss +7 -2
  56. package/elements/tip-well/TipWell.scss +34 -0
  57. package/elements/tip-well/index.d.ts +5 -1
  58. package/elements/toolbar/toolbar.component.scss +15 -0
  59. package/elements/tooltip/Tooltip.scss +19 -22
  60. package/elements/tooltip/index.d.ts +2 -1
  61. package/fesm2022/novo-elements-addons-ckeditor.mjs +2 -2
  62. package/fesm2022/novo-elements-addons-ckeditor.mjs.map +1 -1
  63. package/fesm2022/novo-elements-elements-agenda.mjs +2 -2
  64. package/fesm2022/novo-elements-elements-breadcrumbs.mjs +3 -3
  65. package/fesm2022/novo-elements-elements-breadcrumbs.mjs.map +1 -1
  66. package/fesm2022/novo-elements-elements-button.mjs +2 -2
  67. package/fesm2022/novo-elements-elements-button.mjs.map +1 -1
  68. package/fesm2022/novo-elements-elements-card.mjs +27 -21
  69. package/fesm2022/novo-elements-elements-card.mjs.map +1 -1
  70. package/fesm2022/novo-elements-elements-category-dropdown.mjs +2 -2
  71. package/fesm2022/novo-elements-elements-category-dropdown.mjs.map +1 -1
  72. package/fesm2022/novo-elements-elements-checkbox.mjs +4 -4
  73. package/fesm2022/novo-elements-elements-checkbox.mjs.map +1 -1
  74. package/fesm2022/novo-elements-elements-chips.mjs +6 -6
  75. package/fesm2022/novo-elements-elements-chips.mjs.map +1 -1
  76. package/fesm2022/novo-elements-elements-common.mjs +52 -21
  77. package/fesm2022/novo-elements-elements-common.mjs.map +1 -1
  78. package/fesm2022/novo-elements-elements-data-table.mjs +4 -4
  79. package/fesm2022/novo-elements-elements-data-table.mjs.map +1 -1
  80. package/fesm2022/novo-elements-elements-date-picker.mjs +4 -4
  81. package/fesm2022/novo-elements-elements-date-picker.mjs.map +1 -1
  82. package/fesm2022/novo-elements-elements-date-time-picker.mjs +2 -2
  83. package/fesm2022/novo-elements-elements-date-time-picker.mjs.map +1 -1
  84. package/fesm2022/novo-elements-elements-dropdown.mjs +2 -2
  85. package/fesm2022/novo-elements-elements-dropdown.mjs.map +1 -1
  86. package/fesm2022/novo-elements-elements-field.mjs +4 -4
  87. package/fesm2022/novo-elements-elements-field.mjs.map +1 -1
  88. package/fesm2022/novo-elements-elements-form.mjs +135 -78
  89. package/fesm2022/novo-elements-elements-form.mjs.map +1 -1
  90. package/fesm2022/novo-elements-elements-header.mjs +2 -2
  91. package/fesm2022/novo-elements-elements-header.mjs.map +1 -1
  92. package/fesm2022/novo-elements-elements-layout.mjs +73 -14
  93. package/fesm2022/novo-elements-elements-layout.mjs.map +1 -1
  94. package/fesm2022/novo-elements-elements-list.mjs +2 -2
  95. package/fesm2022/novo-elements-elements-list.mjs.map +1 -1
  96. package/fesm2022/novo-elements-elements-menu.mjs +2 -2
  97. package/fesm2022/novo-elements-elements-menu.mjs.map +1 -1
  98. package/fesm2022/novo-elements-elements-modal.mjs +4 -4
  99. package/fesm2022/novo-elements-elements-modal.mjs.map +1 -1
  100. package/fesm2022/novo-elements-elements-multi-picker.mjs +2 -2
  101. package/fesm2022/novo-elements-elements-multi-picker.mjs.map +1 -1
  102. package/fesm2022/novo-elements-elements-picker.mjs +6 -6
  103. package/fesm2022/novo-elements-elements-picker.mjs.map +1 -1
  104. package/fesm2022/novo-elements-elements-progress.mjs +4 -4
  105. package/fesm2022/novo-elements-elements-progress.mjs.map +1 -1
  106. package/fesm2022/novo-elements-elements-search.mjs +63 -17
  107. package/fesm2022/novo-elements-elements-search.mjs.map +1 -1
  108. package/fesm2022/novo-elements-elements-select.mjs +2 -2
  109. package/fesm2022/novo-elements-elements-select.mjs.map +1 -1
  110. package/fesm2022/novo-elements-elements-simple-table.mjs +4 -4
  111. package/fesm2022/novo-elements-elements-simple-table.mjs.map +1 -1
  112. package/fesm2022/novo-elements-elements-stepper.mjs +6 -6
  113. package/fesm2022/novo-elements-elements-stepper.mjs.map +1 -1
  114. package/fesm2022/novo-elements-elements-switch.mjs +2 -2
  115. package/fesm2022/novo-elements-elements-switch.mjs.map +1 -1
  116. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs +2 -2
  117. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
  118. package/fesm2022/novo-elements-elements-tabs.mjs +4 -4
  119. package/fesm2022/novo-elements-elements-tabs.mjs.map +1 -1
  120. package/fesm2022/novo-elements-elements-tiles.mjs +2 -2
  121. package/fesm2022/novo-elements-elements-tiles.mjs.map +1 -1
  122. package/fesm2022/novo-elements-elements-time-picker.mjs +4 -4
  123. package/fesm2022/novo-elements-elements-time-picker.mjs.map +1 -1
  124. package/fesm2022/novo-elements-elements-tip-well.mjs +26 -6
  125. package/fesm2022/novo-elements-elements-tip-well.mjs.map +1 -1
  126. package/fesm2022/novo-elements-elements-toolbar.mjs +2 -2
  127. package/fesm2022/novo-elements-elements-toolbar.mjs.map +1 -1
  128. package/fesm2022/novo-elements-elements-tooltip.mjs +8 -4
  129. package/fesm2022/novo-elements-elements-tooltip.mjs.map +1 -1
  130. package/fesm2022/novo-elements-utils.mjs +4822 -364
  131. package/fesm2022/novo-elements-utils.mjs.map +1 -1
  132. package/package.json +1 -1
  133. package/styles/content/links.scss +4 -0
  134. package/styles/themes/bh2026.scss +131 -53
  135. package/styles/typography.scss +6 -0
  136. package/styles/variables.scss +2 -0
  137. package/utils/index.d.ts +2 -2
@@ -148,3 +148,80 @@
148
148
  }
149
149
  }
150
150
  }
151
+
152
+ :host-context([data-theme='bh2026']) {
153
+ gap: var(--field-spacing-gap);
154
+
155
+ // Take out the space that the overlay template takes up between the fields
156
+ novo-overlay-template {
157
+ display: none;
158
+ }
159
+
160
+ // Each sub-field gets its own bordered input treatment
161
+ .street-address,
162
+ .apt,
163
+ .city,
164
+ .state,
165
+ .zip,
166
+ .country-name {
167
+ border: var(--field-border-width-default) solid var(--field-color-border-default);
168
+ border-radius: var(--field-border-radius-default);
169
+ background: var(--field-color-background-default);
170
+ padding: var(--field-spacing-padding-vertical) var(--field-spacing-padding-horizontal) !important;
171
+ min-height: 4rem;
172
+ box-sizing: border-box;
173
+ gap: var(--field-spacing-gap);
174
+
175
+ &:hover {
176
+ border-color: var(--field-color-border-hover);
177
+ }
178
+ &:focus-within {
179
+ border-width: var(--field-border-width-focus);
180
+ border-color: var(--field-color-border-focus);
181
+ }
182
+
183
+ input,
184
+ novo-picker > ::ng-deep input {
185
+ border: none !important;
186
+ border-bottom: none !important;
187
+ &:hover,
188
+ &:focus {
189
+ border: none !important;
190
+ border-bottom: none !important;
191
+ }
192
+ }
193
+ div[type="button"] {
194
+ border-bottom: none !important;
195
+ padding: 0 !important;
196
+ }
197
+
198
+ &.disabled {
199
+ border-color: var(--field-color-border-disabled);
200
+ border-style: dashed;
201
+ background: var(--field-color-background-disabled);
202
+ }
203
+
204
+ &.invalid {
205
+ border-color: var(--field-color-border-negative);
206
+ }
207
+
208
+ i {
209
+ border-bottom: none !important;
210
+
211
+ &.required-indicator.bhi-circle {
212
+ line-height: 1rem;
213
+ }
214
+ &.required-indicator.bhi-check {
215
+ line-height: 1.8rem;
216
+ }
217
+ }
218
+ }
219
+
220
+ // address1 full width on its own row; address2 full width on the row below
221
+ .street-address {
222
+ flex: 0 0 100%;
223
+ }
224
+ .apt {
225
+ flex: 0 0 100%;
226
+ }
227
+ }
@@ -15,3 +15,35 @@
15
15
  display: none;
16
16
  }
17
17
  }
18
+
19
+ :host-context([data-theme='bh2026'] .card-section) {
20
+ padding: var(--card-spacing-header-padding-vertical) var(--card-spacing-header-padding-horizontal);
21
+ margin: 0 0 var(--card-spacing-header-padding-vertical);
22
+ background: var(--background-bright);
23
+ border-bottom: 1px solid var(--color-border-default);
24
+ align-items: center;
25
+ gap: var(--spacing-gap-sm);
26
+ font-size: var(--typography-title-small-font-size, 1.8rem);
27
+ font-weight: 600;
28
+ line-height: var(--typography-title-small-line-height, 2.4rem);
29
+ letter-spacing: var(--typography-title-small-letter-spacing, 0);
30
+ text-transform: capitalize;
31
+ color: var(--color-text-body);
32
+ > span {
33
+ flex: 1 0 0;
34
+ min-width: 0;
35
+ }
36
+ ::ng-deep novo-icon {
37
+ font-size: 1.6rem;
38
+ width: 1.6rem;
39
+ height: 1.6rem;
40
+ flex-shrink: 0;
41
+ color: var(--color-content-icon);
42
+ margin: 0;
43
+ i {
44
+ font-size: 1.6rem;
45
+ width: 1.6rem;
46
+ height: 1.6rem;
47
+ }
48
+ }
49
+ }
@@ -945,8 +945,10 @@ declare class NovoControlTemplates implements AfterViewInit {
945
945
  declare class NovoFieldsetHeaderElement {
946
946
  title: string;
947
947
  icon: string;
948
+ cardSection: boolean;
949
+ get cardIcon(): string;
948
950
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoFieldsetHeaderElement, never>;
949
- static ɵcmp: i0.ɵɵComponentDeclaration<NovoFieldsetHeaderElement, "novo-fieldset-header", never, { "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, {}, never, ["*"], false, never>;
951
+ static ɵcmp: i0.ɵɵComponentDeclaration<NovoFieldsetHeaderElement, "novo-fieldset-header", never, { "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "cardSection": { "alias": "cardSection"; "required": false; }; }, {}, never, ["*"], false, never>;
950
952
  }
951
953
  declare class NovoFieldsetElement {
952
954
  controls: Array<any>;
@@ -958,8 +960,9 @@ declare class NovoFieldsetElement {
958
960
  isEmbedded: boolean;
959
961
  isInlineEmbedded: boolean;
960
962
  hidden: boolean;
963
+ cardSection: boolean;
961
964
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoFieldsetElement, never>;
962
- static ɵcmp: i0.ɵɵComponentDeclaration<NovoFieldsetElement, "novo-fieldset", never, { "controls": { "alias": "controls"; "required": false; }; "form": { "alias": "form"; "required": false; }; "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "index": { "alias": "index"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "isEmbedded": { "alias": "isEmbedded"; "required": false; }; "isInlineEmbedded": { "alias": "isInlineEmbedded"; "required": false; }; "hidden": { "alias": "hidden"; "required": false; }; }, {}, never, never, false, never>;
965
+ static ɵcmp: i0.ɵɵComponentDeclaration<NovoFieldsetElement, "novo-fieldset", never, { "controls": { "alias": "controls"; "required": false; }; "form": { "alias": "form"; "required": false; }; "title": { "alias": "title"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "index": { "alias": "index"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "isEmbedded": { "alias": "isEmbedded"; "required": false; }; "isInlineEmbedded": { "alias": "isInlineEmbedded"; "required": false; }; "hidden": { "alias": "hidden"; "required": false; }; "cardSection": { "alias": "cardSection"; "required": false; }; }, {}, never, never, false, never>;
963
966
  }
964
967
  declare class NovoDynamicFormElement implements OnChanges, OnInit, AfterContentInit {
965
968
  private element;
@@ -970,6 +973,7 @@ declare class NovoDynamicFormElement implements OnChanges, OnInit, AfterContentI
970
973
  layout: string;
971
974
  hideNonRequiredFields: boolean;
972
975
  autoFocusFirstField: boolean;
976
+ readonly hasCardSections: i0.InputSignal<boolean>;
973
977
  customTemplates: QueryList<NovoTemplate>;
974
978
  private fieldsAlreadyHidden;
975
979
  allFieldsRequired: boolean;
@@ -977,10 +981,14 @@ declare class NovoDynamicFormElement implements OnChanges, OnInit, AfterContentI
977
981
  showingAllFields: boolean;
978
982
  showingRequiredFields: boolean;
979
983
  numControls: number;
984
+ private readonly theme;
985
+ readonly effectiveCardSections: i0.Signal<boolean>;
986
+ get visibleFieldsets(): NovoFieldset[];
980
987
  constructor(element: ElementRef, templates: NovoTemplateService);
981
988
  ngOnInit(): void;
982
989
  ngOnChanges(changes?: SimpleChanges): void;
983
990
  ngAfterContentInit(): void;
991
+ hasVisibleControls(fieldset: NovoFieldset): boolean;
984
992
  showAllFields(): void;
985
993
  showOnlyRequired(hideRequiredWithValue: any): void;
986
994
  get values(): any;
@@ -988,7 +996,7 @@ declare class NovoDynamicFormElement implements OnChanges, OnInit, AfterContentI
988
996
  updatedValues(): any;
989
997
  forceValidation(): void;
990
998
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoDynamicFormElement, never>;
991
- static ɵcmp: i0.ɵɵComponentDeclaration<NovoDynamicFormElement, "novo-dynamic-form", never, { "controls": { "alias": "controls"; "required": false; }; "fieldsets": { "alias": "fieldsets"; "required": false; }; "form": { "alias": "form"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "hideNonRequiredFields": { "alias": "hideNonRequiredFields"; "required": false; }; "autoFocusFirstField": { "alias": "autoFocusFirstField"; "required": false; }; }, {}, ["customTemplates"], ["form-title", "form-subtitle"], false, never>;
999
+ static ɵcmp: i0.ɵɵComponentDeclaration<NovoDynamicFormElement, "novo-dynamic-form", never, { "controls": { "alias": "controls"; "required": false; }; "fieldsets": { "alias": "fieldsets"; "required": false; }; "form": { "alias": "form"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "hideNonRequiredFields": { "alias": "hideNonRequiredFields"; "required": false; }; "autoFocusFirstField": { "alias": "autoFocusFirstField"; "required": false; }; "hasCardSections": { "alias": "hasCardSections"; "required": false; "isSignal": true; }; }, {}, ["customTemplates"], ["form-title", "form-subtitle"], false, never>;
992
1000
  }
993
1001
 
994
1002
  interface AddressLookupResult {
@@ -1301,6 +1309,8 @@ declare class NovoFormElement implements AfterContentInit, OnInit {
1301
1309
  form: NovoFormGroup;
1302
1310
  layout: string;
1303
1311
  hideHeader: boolean;
1312
+ readonly hasCardSections: i0.InputSignal<boolean>;
1313
+ readonly effectiveCardSections: i0.Signal<boolean>;
1304
1314
  customTemplates: QueryList<NovoTemplate>;
1305
1315
  showingAllFields: boolean;
1306
1316
  showingRequiredFields: boolean;
@@ -1313,7 +1323,7 @@ declare class NovoFormElement implements AfterContentInit, OnInit {
1313
1323
  showOnlyRequired(hideRequiredWithValue: any): void;
1314
1324
  forceValidation(): void;
1315
1325
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoFormElement, never>;
1316
- static ɵcmp: i0.ɵɵComponentDeclaration<NovoFormElement, "novo-form", never, { "form": { "alias": "form"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "hideHeader": { "alias": "hideHeader"; "required": false; }; }, {}, ["customTemplates"], ["form-title", "form-subtitle", "*"], false, never>;
1326
+ static ɵcmp: i0.ɵɵComponentDeclaration<NovoFormElement, "novo-form", never, { "form": { "alias": "form"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "hideHeader": { "alias": "hideHeader"; "required": false; }; "hasCardSections": { "alias": "hasCardSections"; "required": false; "isSignal": true; }; }, {}, ["customTemplates"], ["form-title", "form-subtitle", "*"], false, never>;
1317
1327
  }
1318
1328
 
1319
1329
  declare class NovoFormModule {
@@ -152,9 +152,51 @@
152
152
  }
153
153
  }
154
154
 
155
- // bh2026: soften the entity-accent underline
155
+ // bh2026: frosted translucent header + entity squircle icon
156
156
  :host-context([data-theme='bh2026']) {
157
- &[class*='novo-accent-'] > section:first-of-type {
158
- border-bottom: 1px solid var(--color-border-default, #f0f5f9);
157
+ & > section {
158
+ gap: var(--spacing-gap-lg);
159
+ }
160
+
161
+ .header-actions {
162
+ gap: var(--spacing-gap-sm);
163
+ }
164
+
165
+ ::ng-deep utils,
166
+ ::ng-deep novo-utils {
167
+ gap: var(--spacing-gap-sm);
168
+ }
169
+
170
+ &[class*='novo-accent-'] {
171
+ background: var(--header-background, var(--color-transparency-white-90));
172
+ backdrop-filter: blur(12px);
173
+ box-shadow: 0 1px 2px var(--color-transparency-charcoal-08);
174
+ padding-top: var(--spacing-md);
175
+ padding-left: var(--spacing-lg);
176
+ padding-right: var(--spacing-lg);
177
+
178
+ & > section:first-of-type {
179
+ border-bottom: none;
180
+ }
181
+
182
+ utils {
183
+ color: var(--color-text-subtle);
184
+ }
185
+ }
186
+
187
+ @each $entity, $color in $entity-colors {
188
+ &.novo-accent-#{$entity} {
189
+ ::ng-deep .header-icon i {
190
+ color: var(--color-white);
191
+ background: $color;
192
+ border-radius: var(--border-radius-sm);
193
+ width: var(--typography-font-size-40);
194
+ height: var(--typography-font-size-40);
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: center;
198
+ }
199
+ }
159
200
  }
201
+ background-color: transparent;
160
202
  }
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { AfterContentInit, ChangeDetectorRef, ElementRef, NgZone, DestroyRef, InjectionToken, AfterContentChecked, OnDestroy, EventEmitter, DoCheck, QueryList } from '@angular/core';
2
+ import { ElementRef, AfterContentInit, ChangeDetectorRef, NgZone, DestroyRef, InjectionToken, AfterContentChecked, OnDestroy, EventEmitter, DoCheck, QueryList } from '@angular/core';
3
3
  import { Directionality } from '@angular/cdk/bidi';
4
4
  import { BooleanInput, NumberInput } from '@angular/cdk/coercion';
5
5
  import { CdkScrollable, ScrollDispatcher, ViewportRuler } from '@angular/cdk/overlay';
@@ -9,6 +9,14 @@ import { FocusTrapFactory, FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';
9
9
  import { Platform } from '@angular/cdk/platform';
10
10
  import * as i6 from '@angular/common';
11
11
 
12
+ type NavTransitionState = 'collapsed' | 'expanding' | 'expanded' | 'collapsing';
13
+ declare class CollapsibleNavExpansionEvent extends Event {
14
+ srcEvent: Event;
15
+ private _expandPrevented;
16
+ get expandPrevented(): boolean;
17
+ constructor(srcEvent: Event);
18
+ preventExpand(): void;
19
+ }
12
20
  /**
13
21
  * A slide-out navigation panel that expands to a full-width panel or collapses to a narrow icon rail.
14
22
  * Generic building block: consumers project their own header, body, and footer content.
@@ -20,10 +28,22 @@ declare class NovoCollapsibleNavComponent {
20
28
  expandedWidth: i0.InputSignal<string>;
21
29
  /** Width of the panel when collapsed to the icon rail. */
22
30
  collapsedWidth: i0.InputSignal<string>;
31
+ /** Time in ms to delay between the user entering the nav region, and expanding it */
32
+ expandDelay: i0.ModelSignal<number>;
23
33
  /** When true, hovering a collapsed panel temporarily expands it as an overlay without affecting layout. */
24
34
  overlayOnHover: i0.InputSignal<boolean>;
35
+ hoveredChange: i0.OutputEmitterRef<boolean>;
36
+ transitionChange: i0.OutputEmitterRef<NavTransitionState>;
37
+ manualExpand: i0.OutputEmitterRef<CollapsibleNavExpansionEvent>;
38
+ readonly element: ElementRef<any>;
39
+ private readonly destroyRef;
25
40
  private readonly isHovered;
41
+ private readonly isHoveredDebounced$;
42
+ private readonly isEffectiveHovered;
26
43
  private readonly effectiveCollapsed;
44
+ private readonly clicked$;
45
+ private readonly activationKeyPressed$;
46
+ private readonly manualExpandUnprevented$;
27
47
  constructor();
28
48
  onMouseEnter(): void;
29
49
  onMouseLeave(): void;
@@ -34,12 +54,16 @@ declare class NovoCollapsibleNavComponent {
34
54
  collapsedWidth: string;
35
55
  };
36
56
  };
57
+ transitionStart(event: any): void;
58
+ transitionEnd(event: any): void;
59
+ private debounceHover;
60
+ private setupExpandFromActivation;
37
61
  get isCollapsed(): boolean;
38
62
  toggle(): void;
39
63
  expand(): void;
40
64
  collapse(): void;
41
65
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoCollapsibleNavComponent, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<NovoCollapsibleNavComponent, "novo-collapsible-nav", ["novoCollapsibleNav"], { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "expandedWidth": { "alias": "expandedWidth"; "required": false; "isSignal": true; }; "collapsedWidth": { "alias": "collapsedWidth"; "required": false; "isSignal": true; }; "overlayOnHover": { "alias": "overlayOnHover"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; }, never, ["[novo-collapsible-nav-header]", "[novo-collapsible-nav-body]", "[novo-collapsible-nav-footer]"], false, never>;
66
+ static ɵcmp: i0.ɵɵComponentDeclaration<NovoCollapsibleNavComponent, "novo-collapsible-nav", ["novoCollapsibleNav"], { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "expandedWidth": { "alias": "expandedWidth"; "required": false; "isSignal": true; }; "collapsedWidth": { "alias": "collapsedWidth"; "required": false; "isSignal": true; }; "expandDelay": { "alias": "expandDelay"; "required": false; "isSignal": true; }; "overlayOnHover": { "alias": "overlayOnHover"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; "expandDelay": "expandDelayChange"; "hoveredChange": "hoveredChange"; "transitionChange": "transitionChange"; "manualExpand": "manualExpand"; }, never, ["[novo-collapsible-nav-header]", "[novo-collapsible-nav-body]", "[novo-collapsible-nav-footer]"], false, never>;
43
67
  }
44
68
 
45
69
  declare class NovoLayoutContent extends CdkScrollable implements AfterContentInit {
@@ -335,5 +359,5 @@ declare class NovoLayoutModule {
335
359
  static ɵinj: i0.ɵɵInjectorDeclaration<NovoLayoutModule>;
336
360
  }
337
361
 
338
- export { NOVO_LAYOUT_CONTAINER, NOVO_LAYOUT_DEFAULT_AUTOSIZE, NOVO_LAYOUT_DEFAULT_AUTOSIZE_FACTORY, NovoCollapsibleNavComponent, NovoLayoutContainer, NovoLayoutContent, NovoLayoutModule, NovoRailComponent, NovoSidenavComponent, throwNovoDuplicatedSidenavError };
339
- export type { NovoSidenavMode, NovoSidenavToggleResult };
362
+ export { CollapsibleNavExpansionEvent, NOVO_LAYOUT_CONTAINER, NOVO_LAYOUT_DEFAULT_AUTOSIZE, NOVO_LAYOUT_DEFAULT_AUTOSIZE_FACTORY, NovoCollapsibleNavComponent, NovoLayoutContainer, NovoLayoutContent, NovoLayoutModule, NovoRailComponent, NovoSidenavComponent, throwNovoDuplicatedSidenavError };
363
+ export type { NavTransitionState, NovoSidenavMode, NovoSidenavToggleResult };
@@ -1,10 +1,10 @@
1
1
  @import "../../styles/variables.scss";
2
2
 
3
3
  @include theme-colors() using ($name, $color, $contrast, $tint, $shade, $pale) {
4
- :host-context([theme="#{$name}"]) {
5
- &.novo-item-content > ::ng-deep * {
6
- color: rgba(#fff, 0.65);
7
- }
4
+ // Wonky deprecation: For 2026, stringently avoid using * selectors to apply font/color changes - prefer inherit functionality
5
+ // This setup made it very hard to provide overrides.
6
+ :host-context([theme="#{$name}"]).novo-item-content {
7
+ color: rgba(#fff, 0.65);
8
8
  }
9
9
  }
10
10
 
@@ -15,13 +15,14 @@
15
15
  :host {
16
16
  display: flex;
17
17
  margin-left: 0.2em;
18
- &.novo-item-content > ::ng-deep * {
18
+
19
+ &.novo-item-content {
19
20
  color: rgba(#434343, 0.85);
20
- }
21
- &.novo-item-content ::ng-deep i {
22
- @include theme-colors() using ($name, $color, $contrast, $tint, $shade, $pale) {
23
- &.#{$name} {
24
- color: getCssVarname($name);
21
+ ::ng-deep i {
22
+ @include theme-colors() using ($name, $color, $contrast, $tint, $shade, $pale) {
23
+ &.#{$name} {
24
+ color: getCssVarname($name);
25
+ }
25
26
  }
26
27
  }
27
28
  }
@@ -16,6 +16,7 @@
16
16
  cursor: default;
17
17
  list-style: none;
18
18
  background-color: var(--background-bright);
19
+ border-radius: var(--border-radius-sm);
19
20
  padding-inline-start: 0px !important;
20
21
  box-shadow: $shadow-multi;
21
22
  :hover {
@@ -3,7 +3,7 @@
3
3
  :host {
4
4
  display: block;
5
5
  background-color: var(--background-bright);
6
- border-radius: var(--border-radius-default, 4px);
6
+ border-radius: var(--border-radius-md, 4px);
7
7
  box-shadow: 0 1px 7px rgba(0, 0, 0, 0.09), 0 1px 3px rgba(0, 0, 0, 0.2);
8
8
  z-index: z(modal);
9
9
  position: relative;
@@ -17,8 +17,8 @@
17
17
  }
18
18
 
19
19
  > ::ng-deep header {
20
- border-top-left-radius: 4px;
21
- border-top-right-radius: 4px;
20
+ border-top-left-radius: var(--border-radius-md, 4px);
21
+ border-top-right-radius: var(--border-radius-md, 4px);
22
22
  overflow: hidden;
23
23
 
24
24
  h1,
@@ -44,13 +44,3 @@
44
44
  }
45
45
  }
46
46
  }
47
-
48
- // bh2026: rounded modal and header top corners.
49
- :host-context([data-theme='bh2026']) {
50
- border-radius: var(--border-radius-md, 1.6rem);
51
-
52
- > ::ng-deep header {
53
- border-top-left-radius: var(--border-radius-md, 1.6rem);
54
- border-top-right-radius: var(--border-radius-md, 1.6rem);
55
- }
56
- }
@@ -4,7 +4,7 @@
4
4
  text-align: center;
5
5
  display: block;
6
6
  background-color: var(--background-bright);
7
- border-radius: var(--border-radius-default, 4px);
7
+ border-radius: var(--border-radius-md, 4px);
8
8
  box-shadow: 0 1px 7px rgba(0, 0, 0, 0.09), 0 1px 3px rgba(0, 0, 0, 0.2);
9
9
  z-index: z(modal);
10
10
  position: relative;
@@ -106,8 +106,3 @@
106
106
  }
107
107
  }
108
108
  }
109
-
110
- // bh2026: rounded notifications
111
- :host-context([data-theme='bh2026']) {
112
- border-radius: var(--border-radius-md, 1.6rem);
113
- }
@@ -6,16 +6,17 @@ novo-picker {
6
6
  align-items: center;
7
7
  flex-wrap: wrap;
8
8
  justify-content: flex-start;
9
- padding-bottom: 5px;
9
+ padding-bottom: 0;
10
10
  transition: all 200ms ease-in-out;
11
11
  position: relative;
12
+
12
13
  &.selected,
13
14
  &.selected:hover {
14
15
  & + i {
15
16
  color: var(--color-positive);
16
17
  }
17
18
  }
18
- padding-bottom: 0;
19
+
19
20
  &.ng-touched.ng-invalid:not(.ng-pristine) {
20
21
  > input,
21
22
  > input:hover,
@@ -23,6 +24,7 @@ novo-picker {
23
24
  border-bottom-color: transparent !important;
24
25
  }
25
26
  }
27
+
26
28
  input {
27
29
  font-size: 1em;
28
30
  background: transparent !important;
@@ -38,26 +40,33 @@ novo-picker {
38
40
  box-sizing: content-box;
39
41
  transition: all 300ms;
40
42
  color: #26282b;
43
+
41
44
  &:hover {
42
45
  border-bottom: 1px solid brightenLive('--color-dark', 15);
43
46
  }
47
+
44
48
  &:focus {
45
49
  border-bottom: 1px solid var(--color-positive);
46
50
  }
51
+
47
52
  &:invalid {
48
53
  border-bottom: 1px solid #da4453;
49
54
  }
55
+
50
56
  &.entity-picker {
51
57
  padding-left: 2em;
52
58
  }
59
+
53
60
  &.entity-selected {
54
61
  padding-left: 2.5em;
55
62
  background: var(--background-main) !important;
56
63
  }
64
+
57
65
  &:disabled {
58
66
  border-bottom: 1px dashed brightenLive('--color-dark', 45) !important;
59
67
  }
60
68
  }
69
+
61
70
  i.bhi-more {
62
71
  position: absolute;
63
72
  left: 0;
@@ -67,6 +76,7 @@ novo-picker {
67
76
  border-radius: var(--border-radius-sm, 3px);
68
77
  padding: 3px;
69
78
  }
79
+
70
80
  i.entity-icon {
71
81
  position: absolute;
72
82
  left: 5px;
@@ -76,28 +86,39 @@ novo-picker {
76
86
  padding: 3px;
77
87
  color: $white;
78
88
 
79
- @include theme-colors() using ($name, $color, $contrast, $tint, $shade, $pale) {
89
+ @include theme-colors() using($name, $color, $contrast, $tint, $shade, $pale) {
80
90
  &.#{$name} {
81
91
  background: getCssVarname($name);
82
92
  }
83
93
  }
84
94
  }
95
+
85
96
  i.bhi-search,
86
97
  i.bhi-times {
87
98
  position: absolute;
88
99
  right: 0;
89
100
  color: var(--font-color-base);
101
+
90
102
  &.entity-selected {
91
103
  right: 5px;
92
104
  }
93
105
  }
106
+
94
107
  i.bhi-search {
95
- top: 0px;
108
+ top: 0;
96
109
  font-size: var(--font-size-sm);
97
110
  }
111
+
98
112
  i.bhi-times {
99
- top: 0px;
113
+ top: 0;
100
114
  cursor: pointer;
101
115
  font-size: var(--font-size-sm);
102
116
  }
117
+
118
+ [data-theme='bh2026'] & {
119
+ i {
120
+ font-size: var(--typography-body-lg-font-size);
121
+ line-height: normal;
122
+ }
123
+ }
103
124
  }
@@ -44,6 +44,10 @@ entity-picker-results {
44
44
  color: black;
45
45
  }
46
46
 
47
+ > p {
48
+ margin: 0;
49
+ }
50
+
47
51
  picker-error,
48
52
  picker-loader,
49
53
  picker-null-recent-results,
@@ -167,6 +171,7 @@ entity-picker-results {
167
171
  background: $white;
168
172
  width: 100%;
169
173
  min-width: 250px;
174
+ display: block;
170
175
  novo-list {
171
176
  background: $white;
172
177
  min-width: 30rem;
@@ -300,3 +305,50 @@ distribution-list-picker-results {
300
305
  }
301
306
  }
302
307
 
308
+ // bh2026: border belongs on the host (border is not clipped by overflow:hidden),
309
+ // not on children (where overflow:hidden + border-radius clips the corners)
310
+ :root[data-theme='bh2026'] {
311
+ picker-results,
312
+ entity-picker-results,
313
+ skill-specialty-picker-results {
314
+ border: 1px solid var(--color-border-default);
315
+ margin-block: var(--spacing-gap-sm);
316
+ background: var(--background-bright);
317
+
318
+ .novo-list,
319
+ novo-list,
320
+ ul {
321
+ border: none;
322
+ box-shadow: none;
323
+ }
324
+
325
+ picker-error,
326
+ picker-loader,
327
+ picker-null-recent-results,
328
+ picker-null-results,
329
+ .picker-error,
330
+ .picker-loader,
331
+ .picker-null-recent-results,
332
+ .picker-null-results {
333
+ border: none;
334
+ box-shadow: none;
335
+ }
336
+
337
+ > p {
338
+ margin: 0;
339
+ padding: var(--spacing-padding-md) var(--spacing-padding-lg);
340
+ }
341
+ }
342
+
343
+ workers-comp-codes-picker-results,
344
+ distribution-list-picker-results {
345
+ color: var(--text-secondary);
346
+ background: var(--background-body);
347
+ border-radius: var(--border-radius-sm);
348
+
349
+ .novo-list-item {
350
+ border-radius: var(--border-radius-sm);
351
+ }
352
+ }
353
+ }
354
+
@@ -36,3 +36,11 @@
36
36
  width: 100%;
37
37
  }
38
38
  }
39
+
40
+ :host-context([data-theme='bh2026']) {
41
+ &.linear {
42
+ border-radius: var(--border-radius-pill);
43
+ background-color: var(--color-background-subtle-hover);
44
+ border-color: var(--color-border-default);
45
+ }
46
+ }
@@ -106,8 +106,11 @@
106
106
  100% { transform: translateX(0%) }
107
107
  }
108
108
 
109
- // bh2026: pill progress bar ends (fill color rides on the deferred accent).
109
+ // bh2026: pill ends; default fill uses primary blue only when no explicit color is set
110
110
  :host-context([data-theme='bh2026']) {
111
+ &.linear:not([color]) {
112
+ background-color: var(--button-primary-background);
113
+ }
111
114
  &.linear:first-child {
112
115
  border-radius: 999px 0 0 999px;
113
116
  }