novo-elements 13.2.0-next.1 → 13.2.0-next.3

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 (72) hide show
  1. package/elements/breadcrumbs/Breadcrumb.scss +1 -1
  2. package/elements/button/styles/button-dialogue.scss +12 -0
  3. package/elements/button/styles/button-icon.scss +20 -0
  4. package/elements/button/styles/button-primary.scss +16 -1
  5. package/elements/button/styles/button-secondary.scss +14 -0
  6. package/elements/button/styles/button-standard.scss +14 -0
  7. package/elements/button/styles/button.scss +11 -0
  8. package/elements/card/Card.scss +69 -16
  9. package/elements/card/CardContent.scss +3 -0
  10. package/elements/card/CardHeader.scss +23 -0
  11. package/elements/card/index.d.ts +5 -3
  12. package/elements/common/index.d.ts +14 -4
  13. package/elements/common/option/option.component.scss +11 -0
  14. package/elements/data-table/data-table.component.scss +79 -3
  15. package/elements/dropdown/Dropdown.scss +15 -0
  16. package/elements/field/field.scss +10 -6
  17. package/elements/field/hint/hint.scss +6 -0
  18. package/elements/form/ControlGroup.scss +13 -0
  19. package/elements/form/Form.scss +46 -0
  20. package/elements/header/Header.scss +16 -3
  21. package/elements/list/list-item-content.scss +13 -4
  22. package/elements/picker/extras/picker-results/PickerResults.scss +28 -0
  23. package/elements/progress/Progress.scss +8 -0
  24. package/elements/progress/ProgressBar.scss +4 -1
  25. package/elements/search/SearchBox.scss +34 -0
  26. package/elements/search/index.d.ts +11 -6
  27. package/elements/simple-table/table.scss +1 -1
  28. package/elements/stepper/stepper.component.scss +4 -4
  29. package/elements/tabbed-group-picker/TabbedGroupPicker.scss +41 -0
  30. package/elements/tabs/tab.scss +9 -8
  31. package/elements/tiles/Tiles.scss +18 -10
  32. package/elements/toolbar/toolbar.component.scss +2 -2
  33. package/fesm2022/novo-elements-elements-breadcrumbs.mjs +3 -3
  34. package/fesm2022/novo-elements-elements-breadcrumbs.mjs.map +1 -1
  35. package/fesm2022/novo-elements-elements-button.mjs +2 -2
  36. package/fesm2022/novo-elements-elements-button.mjs.map +1 -1
  37. package/fesm2022/novo-elements-elements-card.mjs +27 -21
  38. package/fesm2022/novo-elements-elements-card.mjs.map +1 -1
  39. package/fesm2022/novo-elements-elements-common.mjs +47 -16
  40. package/fesm2022/novo-elements-elements-common.mjs.map +1 -1
  41. package/fesm2022/novo-elements-elements-data-table.mjs +2 -2
  42. package/fesm2022/novo-elements-elements-data-table.mjs.map +1 -1
  43. package/fesm2022/novo-elements-elements-dropdown.mjs +2 -2
  44. package/fesm2022/novo-elements-elements-dropdown.mjs.map +1 -1
  45. package/fesm2022/novo-elements-elements-field.mjs +4 -4
  46. package/fesm2022/novo-elements-elements-field.mjs.map +1 -1
  47. package/fesm2022/novo-elements-elements-form.mjs +6 -6
  48. package/fesm2022/novo-elements-elements-form.mjs.map +1 -1
  49. package/fesm2022/novo-elements-elements-header.mjs +2 -2
  50. package/fesm2022/novo-elements-elements-header.mjs.map +1 -1
  51. package/fesm2022/novo-elements-elements-list.mjs +2 -2
  52. package/fesm2022/novo-elements-elements-list.mjs.map +1 -1
  53. package/fesm2022/novo-elements-elements-picker.mjs +4 -4
  54. package/fesm2022/novo-elements-elements-picker.mjs.map +1 -1
  55. package/fesm2022/novo-elements-elements-progress.mjs +4 -4
  56. package/fesm2022/novo-elements-elements-progress.mjs.map +1 -1
  57. package/fesm2022/novo-elements-elements-search.mjs +36 -9
  58. package/fesm2022/novo-elements-elements-search.mjs.map +1 -1
  59. package/fesm2022/novo-elements-elements-simple-table.mjs +4 -4
  60. package/fesm2022/novo-elements-elements-simple-table.mjs.map +1 -1
  61. package/fesm2022/novo-elements-elements-stepper.mjs +6 -6
  62. package/fesm2022/novo-elements-elements-stepper.mjs.map +1 -1
  63. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs +2 -2
  64. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
  65. package/fesm2022/novo-elements-elements-tabs.mjs +4 -4
  66. package/fesm2022/novo-elements-elements-tabs.mjs.map +1 -1
  67. package/fesm2022/novo-elements-elements-tiles.mjs +2 -2
  68. package/fesm2022/novo-elements-elements-tiles.mjs.map +1 -1
  69. package/fesm2022/novo-elements-elements-toolbar.mjs +2 -2
  70. package/package.json +1 -1
  71. package/styles/content/links.scss +4 -0
  72. package/styles/themes/bh2026.scss +110 -60
@@ -11,5 +11,5 @@
11
11
 
12
12
  // bh2026: subtle breadcrumb text.
13
13
  :host-context([data-theme='bh2026']) {
14
- color: var(--color-content-subtle, #8ca1b9);
14
+ color: var(--color-text-subtle);
15
15
  }
@@ -28,3 +28,15 @@
28
28
  }
29
29
  }
30
30
  }
31
+
32
+ :host-context([data-theme='bh2026']) {
33
+ &[theme="dialogue"] {
34
+ box-shadow: none;
35
+ &:hover,
36
+ &:focus,
37
+ &:active {
38
+ background: var(--button-dialogue-hover-background);
39
+ box-shadow: none;
40
+ }
41
+ }
42
+ }
@@ -39,3 +39,23 @@
39
39
  }
40
40
  }
41
41
  }
42
+
43
+ :host-context([data-theme='bh2026']) {
44
+ &[theme="icon"] {
45
+ height: var(--button-height);
46
+ width: var(--button-height);
47
+ border-radius: var(--border-radius-sm);
48
+ color: var(--color-text-subtle);
49
+ box-shadow: none;
50
+
51
+ &:focus,
52
+ &:hover {
53
+ background: var(--color-background-subtle);
54
+ box-shadow: none;
55
+ }
56
+ &:active {
57
+ background: var(--color-background-subtle-hover);
58
+ box-shadow: none;
59
+ }
60
+ }
61
+ }
@@ -11,7 +11,6 @@
11
11
 
12
12
  &:hover,
13
13
  &:focus {
14
-
15
14
  filter: brightness(1.15);
16
15
  box-shadow: var(--shadow-2), var(--shadow-1);
17
16
  }
@@ -41,3 +40,19 @@
41
40
  }
42
41
  }
43
42
  }
43
+
44
+ :host-context([data-theme='bh2026']) {
45
+ &[theme="primary"] {
46
+ &:hover,
47
+ &:focus {
48
+ filter: none;
49
+ background: var(--button-primary-background-hover);
50
+ box-shadow: var(--button-shadow-hover);
51
+ }
52
+ &:active {
53
+ filter: none;
54
+ background: var(--button-primary-background-hover);
55
+ box-shadow: var(--button-shadow-active);
56
+ }
57
+ }
58
+ }
@@ -49,3 +49,17 @@
49
49
  }
50
50
  }
51
51
  }
52
+
53
+ :host-context([data-theme='bh2026']) {
54
+ &[theme="secondary"] {
55
+ &:hover,
56
+ &:focus {
57
+ border: var(--button-secondary-border-hover);
58
+ box-shadow: var(--button-shadow-hover);
59
+ }
60
+ &:active {
61
+ border: var(--button-secondary-border-hover);
62
+ box-shadow: var(--button-shadow-active);
63
+ }
64
+ }
65
+ }
@@ -15,3 +15,17 @@
15
15
  }
16
16
  }
17
17
  }
18
+
19
+ :host-context([data-theme='bh2026']) {
20
+ &[theme="standard"] {
21
+ background: var(--button-background);
22
+ &:hover {
23
+ background: var(--button-hover-background);
24
+ box-shadow: var(--button-shadow-hover);
25
+ }
26
+ &:active {
27
+ background: var(--button-hover-background);
28
+ box-shadow: var(--button-shadow-active);
29
+ }
30
+ }
31
+ }
@@ -115,3 +115,14 @@
115
115
  transform: rotate(360deg);
116
116
  }
117
117
  }
118
+
119
+ :host-context([data-theme='bh2026']) {
120
+ box-shadow: var(--button-shadow);
121
+
122
+ &:hover {
123
+ box-shadow: var(--button-shadow-hover);
124
+ }
125
+ &:active {
126
+ box-shadow: var(--button-shadow-active);
127
+ }
128
+ }
@@ -8,6 +8,9 @@
8
8
  border-radius: var(--border-radius-round);
9
9
  position: relative;
10
10
  overflow-x: hidden;
11
+ :root[data-theme=bh2026] & {
12
+ --spacing-md: var(--spacing-padding-md);
13
+ }
11
14
 
12
15
  &.loading {
13
16
  min-height: 200px;
@@ -57,11 +60,11 @@
57
60
  text-overflow: ellipsis;
58
61
  i {
59
62
  font-size: 1.2em;
60
- &.bhi-info {
61
- color: $light;
62
- }
63
63
  }
64
64
  }
65
+ :root:not([data-theme='bh2026']) & i.bhi-info {
66
+ color: $light;
67
+ }
65
68
  }
66
69
  .actions {
67
70
  color: brightenLive('--color-dark', 15);
@@ -119,43 +122,93 @@
119
122
 
120
123
  // bh2026: rounder card, grippy on hover
121
124
  :host-context([data-theme='bh2026']) {
122
- border-radius: var(--border-radius-md, 1.6rem);
123
- border: 1px solid var(--color-border-default, #f0f5f9);
124
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
125
+ border-radius: var(--border-radius-md);
126
+ border: 1px solid var(--color-border-default);
127
+ box-shadow: 0 1px 2px var(--color-transparency-black-10);
125
128
 
126
129
  div.card-loading-container {
127
- border-radius: var(--border-radius-md, 1.6rem);
130
+ border-radius: var(--border-radius-md);
128
131
  }
129
132
 
130
133
  header {
131
- padding: var(--spacing-16, 1.6rem) var(--spacing-24, 2.4rem) var(--spacing-16, 1.6rem) 0;
132
- border-bottom: 1px solid var(--color-border-default, #f0f5f9);
134
+ padding: var(--spacing-padding-md) var(--spacing-padding-lg) var(--spacing-padding-md) 0;
135
+ border-bottom: 1px solid var(--color-border-default);
133
136
 
134
137
  .title {
138
+ padding-inline: var(--spacing-gutter);
135
139
  h1,
136
140
  h2,
137
141
  h3 {
138
- font-size: var(--typography-card-header-font-size, 1.8rem);
139
- font-weight: var(--typography-card-header-font-weight, 500);
142
+ font-size: var(--typography-card-header-font-size, var(--typography-font-size-18));
143
+ font-weight: var(--typography-card-header-font-weight, var(--typography-font-weight-500));
144
+ ::ng-deep .card-flag-icon {
145
+ font-size: var(--font-size-lg);
146
+ vertical-align: 10%;
147
+ }
140
148
  }
141
149
 
142
- ::ng-deep i.bhi-move {
143
- color: transparent;
150
+ ::ng-deep i {
151
+ margin: 0;
144
152
  }
145
153
  }
146
154
 
147
- &:hover .title ::ng-deep i.bhi-move {
148
- color: var(--color-content-subtle, #5d7798);
155
+ .card-move-handle {
156
+ position: absolute;
157
+ left: var(--spacing-padding-xxsm);
158
+ color: var(--color-content-icon, #89909A);
149
159
  }
150
160
 
151
161
  .actions {
152
162
  display: flex;
153
163
  align-items: center;
154
- gap: var(--spacing-8, 0.8rem);
164
+ gap: var(--spacing-gap-sm);
155
165
  }
156
166
 
157
167
  novo-button {
168
+ color: var(--color-text-subtle);
169
+ }
170
+ ::ng-deep .novo-card-header-text {
171
+ padding-inline-start: var(--spacing-padding-sm);
172
+ }
173
+ }
174
+ :host {
175
+ ::ng-deep .card-flag-icon {
158
176
  color: var(--color-content-subtle, #5d7798);
159
177
  }
178
+ &.icon-color-auto header .title ::ng-deep .card-flag-icon {
179
+ color: var(--page-entity-color, var(--color-content-subtle, #5d7798));
180
+ @each $entity, $color in $entity-colors {
181
+ &.bhi-#{$entity} {
182
+ @if ($entity == 'person') {
183
+ color: var(--color-entity-contact);
184
+ } @else if ($entity == 'notes') {
185
+ color: var(--color-entity-note);
186
+ } @else {
187
+ color: var(--color-entity-#{$entity});
188
+ }
189
+ }
190
+ }
191
+ }
192
+ &.icon-color-parent ::ng-deep .card-flag-icon {
193
+ color: var(--page-entity-color);
194
+ }
195
+ .novo-card-header {
196
+ padding-inline-start: var(--spacing-gutter);
197
+ }
198
+ // ng-deep in case this is declared within title bar implementation.
199
+ ::ng-deep .card-move-handle {
200
+ position: absolute;
201
+ left: var(--spacing-padding-xxsm);
202
+ color: var(--color-content-icon, #89909A);
203
+ transition: color 0.3s ease-in-out;
204
+ }
205
+ header ::ng-deep, ::ng-deep .novo-card-header {
206
+ &:not(:hover) .card-move-handle {
207
+ color: transparent;
208
+ }
209
+ .novo-icon.card-move-handle i {
210
+ color: inherit;
211
+ }
212
+ }
160
213
  }
161
214
  }
@@ -4,5 +4,8 @@
4
4
  display: block;
5
5
  &:not(.condensed) {
6
6
  padding: var(--spacing-md);
7
+ :root[data-theme=bh2026] & {
8
+ padding-inline: var(--spacing-gutter);
9
+ }
7
10
  }
8
11
  }
@@ -7,8 +7,31 @@
7
7
  flex-direction: row;
8
8
  align-items: center;
9
9
  gap: var(--spacing-md);
10
+ :root[data-theme=bh2026] & {
11
+ padding: var(--spacing-padding-md) var(--spacing-padding-md) 0 var(--spacing-gutter);
12
+ gap: 0;
13
+ .card-move-handle {
14
+ transition: color 0.3s ease-in-out;
15
+ }
16
+ &:not(:hover) {
17
+ .card-move-handle {
18
+ color: transparent;
19
+ }
20
+ }
21
+ .novo-card-header-text {
22
+ font-size: var(--typography-card-header-font-size, 1.8rem);
23
+ font-weight: var(--typography-card-header-font-weight, 500);
24
+ ::ng-deep novo-title {
25
+ font: inherit;
26
+ }
27
+ }
28
+ }
29
+
10
30
 
11
31
  .novo-card-header-text {
12
32
  flex: 1 1 0px;
33
+ :root[data-theme=bh2026] & {
34
+ padding-inline-start: var(--spacing-padding-sm);
35
+ }
13
36
  }
14
37
  }
@@ -6,6 +6,7 @@ import * as i3 from 'novo-elements/elements/icon';
6
6
  import * as i4 from 'novo-elements/elements/button';
7
7
  import * as i5 from 'novo-elements/elements/loading';
8
8
  import * as i6 from 'novo-elements/elements/tooltip';
9
+ import * as i7 from 'novo-elements/elements/common';
9
10
 
10
11
  declare class CardActionsElement {
11
12
  static ɵfac: i0.ɵɵFactoryDeclaration<CardActionsElement, never>;
@@ -37,6 +38,7 @@ declare class CardElement implements OnChanges, OnInit {
37
38
  message: string;
38
39
  messageIcon: string;
39
40
  icon: string;
41
+ iconColorClass: 'icon-color-auto' | 'icon-color-parent' | undefined;
40
42
  iconTooltip: string;
41
43
  refresh: boolean;
42
44
  close: boolean;
@@ -44,7 +46,7 @@ declare class CardElement implements OnChanges, OnInit {
44
46
  loading: boolean;
45
47
  inline: boolean;
46
48
  inset: string;
47
- get hbInset(): string;
49
+ get cardClass(): string;
48
50
  onClose: EventEmitter<void>;
49
51
  onRefresh: EventEmitter<void>;
50
52
  cardAutomationId: string;
@@ -57,12 +59,12 @@ declare class CardElement implements OnChanges, OnInit {
57
59
  toggleClose(): void;
58
60
  toggleRefresh(): void;
59
61
  static ɵfac: i0.ɵɵFactoryDeclaration<CardElement, never>;
60
- static ɵcmp: i0.ɵɵComponentDeclaration<CardElement, "novo-card", never, { "padding": { "alias": "padding"; "required": false; }; "config": { "alias": "config"; "required": false; }; "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messageIcon": { "alias": "messageIcon"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconTooltip": { "alias": "iconTooltip"; "required": false; }; "refresh": { "alias": "refresh"; "required": false; }; "close": { "alias": "close"; "required": false; }; "move": { "alias": "move"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "inset": { "alias": "inset"; "required": false; }; }, { "onClose": "onClose"; "onRefresh": "onRefresh"; }, never, ["novo-card-actions", "*", "footer,novo-card-footer,[novo-card-footer],[novoCardFooter]"], false, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardElement, "novo-card", never, { "padding": { "alias": "padding"; "required": false; }; "config": { "alias": "config"; "required": false; }; "title": { "alias": "title"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messageIcon": { "alias": "messageIcon"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconColorClass": { "alias": "iconColorClass"; "required": false; }; "iconTooltip": { "alias": "iconTooltip"; "required": false; }; "refresh": { "alias": "refresh"; "required": false; }; "close": { "alias": "close"; "required": false; }; "move": { "alias": "move"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "inset": { "alias": "inset"; "required": false; }; }, { "onClose": "onClose"; "onRefresh": "onRefresh"; }, never, ["novo-card-actions", "*", "footer,novo-card-footer,[novo-card-footer],[novoCardFooter]"], false, never>;
61
63
  }
62
64
 
63
65
  declare class NovoCardModule {
64
66
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoCardModule, never>;
65
- static ɵmod: i0.ɵɵNgModuleDeclaration<NovoCardModule, [typeof CardElement, typeof CardActionsElement, typeof CardContentElement, typeof CardHeaderElement, typeof CardFooterElement], [typeof i2.CommonModule, typeof i3.NovoIconModule, typeof i4.NovoButtonModule, typeof i5.NovoLoadingModule, typeof i6.NovoTooltipModule], [typeof CardElement, typeof CardActionsElement, typeof CardContentElement, typeof CardHeaderElement, typeof CardFooterElement]>;
67
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NovoCardModule, [typeof CardElement, typeof CardActionsElement, typeof CardContentElement, typeof CardHeaderElement, typeof CardFooterElement], [typeof i2.CommonModule, typeof i3.NovoIconModule, typeof i4.NovoButtonModule, typeof i5.NovoLoadingModule, typeof i6.NovoTooltipModule, typeof i7.NovoCommonModule], [typeof CardElement, typeof CardActionsElement, typeof CardContentElement, typeof CardHeaderElement, typeof CardFooterElement]>;
66
68
  static ɵinj: i0.ɵɵInjectorDeclaration<NovoCardModule>;
67
69
  }
68
70
 
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, ElementRef, OnInit, EventEmitter, OnDestroy, ChangeDetectorRef, Renderer2, DoCheck, ViewContainerRef, InjectionToken, AfterViewChecked, QueryList, NgZone } from '@angular/core';
2
+ import { TemplateRef, ElementRef, OnInit, OnDestroy, ChangeDetectorRef, Renderer2, DoCheck, ViewContainerRef, PipeTransform, InjectionToken, AfterViewChecked, EventEmitter, QueryList, NgZone } from '@angular/core';
3
3
  import { Observable, Subject, Subscription } from 'rxjs';
4
4
  import * as i3 from '@angular/common';
5
5
  import { NgSwitch } from '@angular/common';
@@ -247,11 +247,14 @@ interface ThemeChangeEvent {
247
247
  declare class NovoTheme {
248
248
  private _defaultTheme;
249
249
  private _currentTheme;
250
- onThemeChange: EventEmitter<ThemeChangeEvent>;
250
+ currentTheme: i0.Signal<NovoThemeOptions>;
251
+ onThemeChange: Observable<ThemeChangeEvent>;
252
+ document: Document;
251
253
  /** Name of the theme being used. defaults to `bh2022-light`. */
252
254
  get themeName(): string;
253
255
  set themeName(value: string);
254
256
  use(options: NovoThemeOptions): Observable<any>;
257
+ isBh2026: i0.Signal<boolean>;
255
258
  /**
256
259
  * Changes the current theme
257
260
  */
@@ -325,6 +328,13 @@ declare class VisibleDirective {
325
328
  static ɵdir: i0.ɵɵDirectiveDeclaration<VisibleDirective, "[visible]", never, { "visible": { "alias": "visible"; "required": false; }; }, {}, never, never, false, never>;
326
329
  }
327
330
 
331
+ declare class If2026ThemePipe implements PipeTransform {
332
+ theme: NovoTheme;
333
+ transform(value: any, elseVal?: any): any;
334
+ static ɵfac: i0.ɵɵFactoryDeclaration<If2026ThemePipe, never>;
335
+ static ɵpipe: i0.ɵɵPipeDeclaration<If2026ThemePipe, "ifBh2026Theme", false>;
336
+ }
337
+
328
338
  /** @docs-private */
329
339
  type Constructor<T> = new (...args: any[]) => T;
330
340
  /**
@@ -568,7 +578,7 @@ declare class NovoOptionModule {
568
578
 
569
579
  declare class NovoCommonModule {
570
580
  static ɵfac: i0.ɵɵFactoryDeclaration<NovoCommonModule, never>;
571
- static ɵmod: i0.ɵɵNgModuleDeclaration<NovoCommonModule, [typeof NovoTemplate, typeof NovoText, typeof NovoTitle, typeof NovoCaption, typeof NovoLabel, typeof NovoLink, typeof MarginDirective, typeof PaddingDirective, typeof BackgroundColorDirective, typeof TextColorDirective, typeof BorderDirective, typeof GapDirective, typeof AccentColorDirective, typeof FillColorDirective, typeof FlexDirective, typeof ThemeColorDirective, typeof SwitchCasesDirective, typeof VisibleDirective], [typeof i3.CommonModule, typeof NovoOptionModule], [typeof NovoTemplate, typeof NovoText, typeof NovoTitle, typeof NovoCaption, typeof NovoLabel, typeof NovoLink, typeof MarginDirective, typeof PaddingDirective, typeof BackgroundColorDirective, typeof TextColorDirective, typeof BorderDirective, typeof GapDirective, typeof AccentColorDirective, typeof FillColorDirective, typeof FlexDirective, typeof ThemeColorDirective, typeof SwitchCasesDirective, typeof VisibleDirective]>;
581
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NovoCommonModule, [typeof NovoTemplate, typeof NovoText, typeof NovoTitle, typeof NovoCaption, typeof NovoLabel, typeof NovoLink, typeof MarginDirective, typeof PaddingDirective, typeof BackgroundColorDirective, typeof TextColorDirective, typeof BorderDirective, typeof GapDirective, typeof AccentColorDirective, typeof FillColorDirective, typeof FlexDirective, typeof ThemeColorDirective, typeof SwitchCasesDirective, typeof VisibleDirective, typeof If2026ThemePipe], [typeof i3.CommonModule, typeof NovoOptionModule], [typeof NovoTemplate, typeof NovoText, typeof NovoTitle, typeof NovoCaption, typeof NovoLabel, typeof NovoLink, typeof MarginDirective, typeof PaddingDirective, typeof BackgroundColorDirective, typeof TextColorDirective, typeof BorderDirective, typeof GapDirective, typeof AccentColorDirective, typeof FillColorDirective, typeof FlexDirective, typeof ThemeColorDirective, typeof SwitchCasesDirective, typeof VisibleDirective, typeof If2026ThemePipe]>;
572
582
  static ɵinj: i0.ɵɵInjectorDeclaration<NovoCommonModule>;
573
583
  }
574
584
 
@@ -749,5 +759,5 @@ type HasTabIndexCtor = Constructor<HasTabIndex>;
749
759
  /** Mixin to augment a directive with a `tabIndex` property. */
750
760
  declare function mixinTabIndex<T extends AbstractConstructor<CanDisable>>(base: T, defaultTabIndex?: number): HasTabIndexCtor & T;
751
761
 
752
- export { AccentColorDirective, BackgroundColorDirective, BorderDirective, DEFAULT_THEME, ErrorStateMatcher, FillColorDirective, FlexDirective, GapDirective, MarginDirective, NOVO_OPTGROUP, NOVO_OPTION_PARENT_COMPONENT, NOVO_OVERLAY_CONTAINER, NovoBaseTextElement, NovoCaption, NovoCommonModule, NovoLabel, NovoLink, NovoOptgroup, NovoOptgroupBase, NovoOptgroupMixinBase, NovoOption, NovoOptionBase, NovoOptionModule, NovoOptionSelectionChange, NovoOverlayModule, NovoOverlayTemplateComponent, NovoPseudoCheckbox, NovoPseudoCheckboxModule, NovoTemplate, NovoText, NovoTheme, NovoThemeOptions, NovoTitle, PaddingDirective, ShowOnDirtyErrorStateMatcher, SwitchCasesDirective, TextColorDirective, ThemeColorDirective, VisibleDirective, _countGroupLabelsBeforeOption, _getOptionScrollPosition, getSpacingToken, mixinColor, mixinDisabled, mixinErrorState, mixinOverlay, mixinRequired, mixinSize, mixinTabIndex, normalizeThemeName };
762
+ export { AccentColorDirective, BackgroundColorDirective, BorderDirective, DEFAULT_THEME, ErrorStateMatcher, FillColorDirective, FlexDirective, GapDirective, If2026ThemePipe, MarginDirective, NOVO_OPTGROUP, NOVO_OPTION_PARENT_COMPONENT, NOVO_OVERLAY_CONTAINER, NovoBaseTextElement, NovoCaption, NovoCommonModule, NovoLabel, NovoLink, NovoOptgroup, NovoOptgroupBase, NovoOptgroupMixinBase, NovoOption, NovoOptionBase, NovoOptionModule, NovoOptionSelectionChange, NovoOverlayModule, NovoOverlayTemplateComponent, NovoPseudoCheckbox, NovoPseudoCheckboxModule, NovoTemplate, NovoText, NovoTheme, NovoThemeOptions, NovoTitle, PaddingDirective, ShowOnDirtyErrorStateMatcher, SwitchCasesDirective, TextColorDirective, ThemeColorDirective, VisibleDirective, _countGroupLabelsBeforeOption, _getOptionScrollPosition, getSpacingToken, mixinColor, mixinDisabled, mixinErrorState, mixinOverlay, mixinRequired, mixinSize, mixinTabIndex, normalizeThemeName };
753
763
  export type { AbstractConstructor, CanColor, CanColorCtor, CanDisable, CanDisableCtor, CanRequire, CanRequireCtor, CanSize, CanSizeCtor, CanUpdateErrorState, CanUpdateErrorStateCtor, Constructor, ElementSize, HasElementRef, HasErrorState, HasOverlay, HasOverlayCtor, HasTabIndex, HasTabIndexCtor, NovoOptionParentComponent, NovoPseudoCheckboxShape, NovoPseudoCheckboxState, ThemeChangeEvent, ThemeName, ThemePalette, TypographyLength, TypographySize, TypographyWeight };
@@ -83,3 +83,14 @@
83
83
  .novo-option-pseudo-checkbox {
84
84
  margin-inline-end: calc(var(--menu-side-padding) / 2);
85
85
  }
86
+
87
+ // bh2026: white dropdown bg needs explicit hover — --background-main resolves to white
88
+ [data-theme='bh2026'] .novo-option {
89
+ &:hover:not(.novo-option-inert) {
90
+ background: var(--color-background-subtle);
91
+ }
92
+ &:active:not(.novo-option-inert),
93
+ &.novo-active:not(.novo-option-inert) {
94
+ background: var(--color-background-subtle-hover);
95
+ }
96
+ }
@@ -618,11 +618,87 @@ novo-data-table {
618
618
  }
619
619
  }
620
620
 
621
- // bh2026: stronger, subtler column headers
621
+ // bh2026: banded rows, horizontal borders, modern spacing
622
622
  [data-theme='bh2026'] {
623
623
  .novo-data-table-header-cell,
624
624
  .novo-data-table-header-cell > label {
625
- font-weight: 600;
626
- color: var(--color-content-subtle, #8ca1b9);
625
+ font-weight: var(--typography-font-weight-600);
626
+ font-size: var(--font-size-caption);
627
+ color: var(--color-text-subtle);
628
+ }
629
+
630
+ .novo-data-table-row,
631
+ .novo-data-table-header-row {
632
+ border-bottom: var(--border-width-border-default) solid var(--color-border-subtle);
633
+ }
634
+
635
+ .novo-data-table-cell,
636
+ .novo-data-table-header-cell {
637
+ padding: var(--spacing-padding-sm) var(--spacing-padding-md);
638
+ color: var(--color-text-body);
639
+ }
640
+
641
+ // Restore zero vertical padding on action/control cells — the general rule above overrides
642
+ // the base .button-cell / .dropdown-cell padding: 0 5px, putting 8px above/below the button.
643
+ .novo-data-table-cell {
644
+ &.button-cell,
645
+ &.dropdown-cell,
646
+ &.expand-cell,
647
+ &.checkbox-cell {
648
+ padding-top: 0;
649
+ padding-bottom: 0;
650
+ }
651
+ }
652
+
653
+ .novo-data-table-cell.clickable {
654
+ color: var(--color-text-link);
655
+ }
656
+
657
+ cdk-table {
658
+ > .novo-data-table-row:nth-of-type(odd) {
659
+ .novo-data-table-cell,
660
+ .novo-data-table-button-cell,
661
+ .novo-data-table-dropdown-cell,
662
+ .novo-data-table-expand-cell,
663
+ .novo-data-table-checkbox-cell {
664
+ background-color: var(--color-background-muted);
665
+ }
666
+ + .novo-data-table-detail-row {
667
+ background-color: var(--color-background-muted);
668
+ }
669
+ }
670
+ > .novo-data-table-row:nth-of-type(even) {
671
+ .novo-data-table-cell,
672
+ .novo-data-table-button-cell,
673
+ .novo-data-table-dropdown-cell,
674
+ .novo-data-table-expand-cell,
675
+ .novo-data-table-checkbox-cell {
676
+ background-color: var(--background-body);
677
+ }
678
+ + .novo-data-table-detail-row {
679
+ background-color: var(--background-body);
680
+ }
681
+ }
682
+ > .novo-data-table-row:hover {
683
+ .novo-data-table-cell,
684
+ .novo-data-table-button-cell,
685
+ .novo-data-table-dropdown-cell,
686
+ .novo-data-table-expand-cell,
687
+ .novo-data-table-checkbox-cell {
688
+ background-color: var(--color-background-subtle);
689
+ }
690
+ }
691
+ > .novo-data-table-row.active {
692
+ .novo-data-table-cell,
693
+ .novo-data-table-button-cell,
694
+ .novo-data-table-dropdown-cell,
695
+ .novo-data-table-expand-cell,
696
+ .novo-data-table-checkbox-cell {
697
+ background-color: var(--color-utility-blue-100);
698
+ }
699
+ + .novo-data-table-detail-row {
700
+ background-color: var(--color-utility-blue-100);
701
+ }
702
+ }
627
703
  }
628
704
  }
@@ -21,6 +21,21 @@
21
21
  }
22
22
  }
23
23
 
24
+ // bh2026: swap out the collapse icon for the sort-desc icon and style to ensure proper placement
25
+ :host-context([data-theme='bh2026']) {
26
+ ::ng-deep .novo-button-icon {
27
+ font-size: 1em !important;
28
+ }
29
+ ::ng-deep i.bhi-collapse {
30
+ display: inline-flex !important;
31
+ align-items: center;
32
+ justify-content: center;
33
+ }
34
+ ::ng-deep i.bhi-collapse::before {
35
+ content: "\f226"; // bhi-sort-desc - all code points are fixed in bullhorn-icons
36
+ }
37
+ }
38
+
24
39
  .dropdown-container {
25
40
  background-color: var(--background-bright, $color-bright);
26
41
  border-radius: var(--border-radius-sm);
@@ -109,15 +109,19 @@
109
109
  }
110
110
  }
111
111
 
112
- // bh2026: lighter label
112
+ // bh2026: uppercase label + tighter value typography per Figma "Value - Finalized" spec
113
113
  :host-context([data-theme='bh2026']) {
114
114
  .novo-field-label {
115
- font-weight: 600;
116
- font-size: 1rem;
117
- color: var(--color-content-subtle, #8ca1b9);
115
+ text-transform: var(--typography-input-label-sm-text-transform);
116
+ ::ng-deep novo-label {
117
+ font-weight: var(--typography-input-label-sm-font-weight);
118
+ font-size: var(--typography-input-label-sm-font-size);
119
+ letter-spacing: var(--typography-input-label-sm-letter-spacing);
120
+ color: var(--color-text-body);
121
+ }
118
122
  }
119
123
  .novo-field-input ::ng-deep .novo-input-element {
120
- font-size: 1.4rem;
121
- font-weight: 500;
124
+ font-size: var(--typography-input-value-default-font-size);
125
+ font-weight: var(--typography-input-value-default-font-weight);
122
126
  }
123
127
  }
@@ -16,3 +16,9 @@
16
16
  justify-content: flex-end;
17
17
  }
18
18
  }
19
+
20
+ :host-context([data-theme='bh2026']) {
21
+ font-size: var(--typography-input-value-sm-font-size);
22
+ font-weight: var(--typography-input-value-sm-font-weight);
23
+ color: var(--color-text-subtle);
24
+ }
@@ -50,6 +50,19 @@ novo-control-group {
50
50
  }
51
51
  }
52
52
 
53
+ // bh2026: description text and column-header labels match decoration weight/size of hint and field-message
54
+ [data-theme='bh2026'] & {
55
+ .novo-section-header label.novo-control-group-description {
56
+ font-size: var(--typography-input-value-sm-font-size);
57
+ font-weight: var(--typography-input-value-sm-font-weight);
58
+ color: var(--color-text-subtle);
59
+ }
60
+ .novo-control-group-labels .novo-control-group-control-label > span {
61
+ font-size: var(--typography-input-value-sm-font-size);
62
+ font-weight: var(--typography-input-value-sm-font-weight);
63
+ }
64
+ }
65
+
53
66
  .novo-control-group-controls {
54
67
  display: flex;
55
68
  flex-wrap: nowrap;
@@ -819,3 +819,49 @@ control-prompt-modal {
819
819
  min-width: 110px;
820
820
  }
821
821
  }
822
+
823
+ // bh2026: uppercase label + tighter value typography per Figma "Value - Finalized" spec
824
+ // ViewEncapsulation.None: use plain selectors (not :host-context which is Shadow DOM only)
825
+ :root[data-theme='bh2026'] {
826
+ label.novo-control-label {
827
+ &.novo-control-filled,
828
+ &.novo-control-focused,
829
+ &.novo-control-always-active {
830
+ font-weight: var(--typography-input-label-sm-font-weight) !important;
831
+ font-size: var(--typography-input-label-sm-font-size) !important;
832
+ letter-spacing: var(--typography-input-label-sm-letter-spacing);
833
+ text-transform: var(--typography-input-label-sm-text-transform);
834
+ color: var(--color-text-body) !important;
835
+ }
836
+ }
837
+ .novo-form-control-label {
838
+ font-weight: var(--typography-input-label-sm-font-weight) !important;
839
+ font-size: var(--typography-input-label-sm-font-size) !important;
840
+ letter-spacing: var(--typography-input-label-sm-letter-spacing);
841
+ text-transform: var(--typography-input-label-sm-text-transform);
842
+ color: var(--color-text-body) !important;
843
+ }
844
+ .novo-control-outer-container input:not([type='checkbox']):not([type='radio']) {
845
+ font-size: var(--typography-input-value-default-font-size) !important;
846
+ font-weight: var(--typography-input-value-default-font-weight) !important;
847
+ }
848
+ .field-message,
849
+ novo-tip-well.active {
850
+ font-size: var(--typography-input-value-sm-font-size);
851
+ font-weight: var(--typography-input-value-sm-font-weight);
852
+ color: var(--color-text-subtle);
853
+
854
+ // $grey is a compile-time SCSS variable — explicit selectors required to override
855
+ .character-count,
856
+ .record-count {
857
+ font-size: var(--typography-input-value-sm-font-size);
858
+ color: var(--color-text-subtle);
859
+ }
860
+ }
861
+ .error-message {
862
+ .character-count {
863
+ font-size: var(--typography-input-value-sm-font-size);
864
+ color: var(--color-text-subtle);
865
+ }
866
+ }
867
+ }