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
@@ -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
+ }
@@ -156,7 +156,7 @@
156
156
  @mixin novo-label-text() {
157
157
  font-weight: 500;
158
158
  // text-transform: uppercase;
159
- word-break: word-break;
159
+ word-break: break-word;
160
160
  overflow-wrap: break-word;
161
161
  line-height: 1.375;
162
162
  color: var(--text-muted);
@@ -618,11 +618,89 @@ 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
+ // To enable every-other "banded" styling change to --color-background-muted
665
+ background-color: var(--background-body);
666
+ }
667
+ + .novo-data-table-detail-row {
668
+ // To enable every-other "banded" styling change to --color-background-muted
669
+ background-color: var(--background-body);
670
+ }
671
+ }
672
+ > .novo-data-table-row:nth-of-type(even) {
673
+ .novo-data-table-cell,
674
+ .novo-data-table-button-cell,
675
+ .novo-data-table-dropdown-cell,
676
+ .novo-data-table-expand-cell,
677
+ .novo-data-table-checkbox-cell {
678
+ background-color: var(--background-body);
679
+ }
680
+ + .novo-data-table-detail-row {
681
+ background-color: var(--background-body);
682
+ }
683
+ }
684
+ > .novo-data-table-row:hover {
685
+ .novo-data-table-cell,
686
+ .novo-data-table-button-cell,
687
+ .novo-data-table-dropdown-cell,
688
+ .novo-data-table-expand-cell,
689
+ .novo-data-table-checkbox-cell {
690
+ background-color: var(--color-background-subtle);
691
+ }
692
+ }
693
+ > .novo-data-table-row.active {
694
+ .novo-data-table-cell,
695
+ .novo-data-table-button-cell,
696
+ .novo-data-table-dropdown-cell,
697
+ .novo-data-table-expand-cell,
698
+ .novo-data-table-checkbox-cell {
699
+ background-color: var(--color-utility-blue-100);
700
+ }
701
+ + .novo-data-table-detail-row {
702
+ background-color: var(--color-utility-blue-100);
703
+ }
704
+ }
627
705
  }
628
706
  }
@@ -107,6 +107,7 @@ $breakpoint: 1000px;
107
107
  font-size: var(--font-size-text);
108
108
  border-radius: var(--border-radius-xsm, 2px);
109
109
  list-style-type: none;
110
+ margin-top: 3px;
110
111
  cursor: pointer;
111
112
  color: var(--color-company);
112
113
  &.disabled {
@@ -126,3 +127,75 @@ $breakpoint: 1000px;
126
127
  }
127
128
  }
128
129
  }
130
+
131
+ :host-context([data-theme='bh2026']) {
132
+ &.standard {
133
+ align-items: center;
134
+ border-top: 1px solid var(--pagination-color-border-default, var(--border));
135
+ padding: var(--spacing-padding-sm) var(--spacing-padding-sm) 0 var(--spacing-padding-md);
136
+
137
+ > * {
138
+ margin: 0;
139
+ }
140
+
141
+ h5.rows {
142
+ color: var(--pagination-color-content-label, var(--text-muted));
143
+ font-size: var(--typography-font-size-12);
144
+ font-weight: var(--typography-meta-sm-font-weight);
145
+ letter-spacing: var(--typography-meta-sm-letter-spacing);
146
+ line-height: var(--typography-meta-sm-line-height);
147
+ margin-right: var(--spacing-gap-sm);
148
+ opacity: 1;
149
+ padding: 0;
150
+ text-transform: uppercase;
151
+ white-space: nowrap;
152
+ }
153
+
154
+ novo-select {
155
+ color: var(--text-muted);
156
+ max-width: 60px;
157
+ min-width: 60px;
158
+ margin-right: var(--spacing-gap-sm);
159
+
160
+ ::ng-deep .novo-select-trigger {
161
+ height: var(--spacing-padding-xlg);
162
+ width: 5rem;
163
+
164
+ i.bhi-collapse::before {
165
+ content: "\f226"; // bhi-sort-desc - all code points are fixed in bullhorn-icons
166
+ }
167
+
168
+ span.text-ellipsis {
169
+ color: var(--button-color-select-color-content-value, var(--text-secondary));
170
+ font-size: var(--typography-button-default-font-size, var(--font-size-body));
171
+ font-weight: var(--typography-button-default-font-weight, var(--typography-body-default-font-weight));
172
+ letter-spacing: var(--typography-button-default-letter-spacing, var(--typography-body-default-letter-spacing));
173
+ line-height: var(--typography-button-default-line-height, var(--typography-line-height-20));
174
+ }
175
+ }
176
+ }
177
+
178
+ .novo-data-table-of-total-amount {
179
+ color: var(--pagination-color-content-label, var(--text-muted));
180
+ font-size: var(--typography-font-size-12);
181
+ font-weight: var(--typography-meta-sm-font-weight);
182
+ }
183
+
184
+ .pager {
185
+ gap: var(--data-table-spacing-gap, 0);
186
+
187
+ .page {
188
+ border-radius: var(--border-radius-xsm);
189
+ color: var(--pagination-color-content-label, var(--text-muted));
190
+ font-size: var(--typography-font-size-12);
191
+ font-weight: var(--typography-meta-sm-font-weight);
192
+
193
+ &.active {
194
+ background: var(--color-background-subtle, var(--background-muted));
195
+ border: 1px solid var(--pagination-color-border-default, var(--border));
196
+ opacity: 1;
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
@@ -3,7 +3,7 @@
3
3
  :host {
4
4
  display: block;
5
5
  .date-picker-container {
6
- border-radius: var(--border-radius-default, 4px);
6
+ border-radius: var(--border-radius-sm, 4px);
7
7
  width: min-content;
8
8
  text-align: center;
9
9
  background: var(--background-main);
@@ -219,8 +219,3 @@
219
219
  display: block;
220
220
  }
221
221
  }
222
-
223
- // bh2026: rounder calendar
224
- :host-context([data-theme='bh2026']) .date-picker-container {
225
- border-radius: var(--calendar-radius, 0.8rem);
226
- }
@@ -42,5 +42,10 @@
42
42
  top: 0px;
43
43
  font-size: var(--font-size-sm);
44
44
  cursor: pointer;
45
+
46
+ [data-theme='bh2026'] & {
47
+ font-size: var(--typography-body-lg-font-size);
48
+ line-height: normal;
49
+ }
45
50
  }
46
51
  }
@@ -6,7 +6,7 @@ $time-select-height: 45px;
6
6
  display: block;
7
7
  width: min-content;
8
8
  overflow: hidden;
9
- border-radius: var(--border-radius-default, 4px);
9
+ border-radius: var(--border-radius-sm, 4px);
10
10
  background-color: var(--background-bright);
11
11
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15), 0 2px 7px rgba(0, 0, 0, 0.1);
12
12
  z-index: z(max);
@@ -16,13 +16,29 @@
16
16
  font-size: 0.8em !important;
17
17
  width: 1em !important;
18
18
  height: 1em !important;
19
- margin: 0 0.5em;
19
+ margin: 0 var(--button-icon-margin, 0.5em);
20
20
  }
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);
41
+ border-radius: var(--border-radius-sm);
26
42
  list-style: none;
27
43
  margin: 0;
28
44
  padding: 0;
@@ -109,15 +109,19 @@
109
109
  }
110
110
  }
111
111
 
112
- // bh2026: lighter label
112
+ // bh2026: uppercase label + tighter value typography
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;
@@ -801,7 +801,7 @@ control-prompt-modal {
801
801
 
802
802
  .novo-form-control-label {
803
803
  font-weight: 500;
804
- word-break: word-break;
804
+ word-break: break-word;
805
805
  overflow-wrap: break-word;
806
806
  line-height: 1.375;
807
807
  color: var(--text-muted);
@@ -819,3 +819,262 @@ control-prompt-modal {
819
819
  min-width: 110px;
820
820
  }
821
821
  }
822
+
823
+ // Control types that should not receive the bh2026 bordered-input treatment
824
+ $bh2026-borderless-types: ('quick-note', 'checkbox', 'checklist', 'editor', 'tiles', 'switch', 'file', 'address');
825
+ $bh2026-not-borderless: '';
826
+ @each $type in $bh2026-borderless-types {
827
+ $bh2026-not-borderless: $bh2026-not-borderless + ':not(.#{$type})';
828
+ }
829
+
830
+ // bh2026: uppercase label + tighter value typography
831
+ // ViewEncapsulation.None: use plain selectors (not :host-context which is Shadow DOM only)
832
+ :root[data-theme='bh2026'] {
833
+ label.novo-control-label {
834
+ &.novo-control-filled,
835
+ &.novo-control-focused,
836
+ &.novo-control-always-active {
837
+ font-weight: var(--typography-input-label-md-font-weight) !important;
838
+ font-size: var(--typography-input-label-md-font-size) !important;
839
+ letter-spacing: var(--typography-input-label-md-letter-spacing);
840
+ text-transform: var(--typography-input-label-sm-text-transform);
841
+ color: var(--color-text-body) !important;
842
+ }
843
+ }
844
+ .novo-form-control-label {
845
+ font-weight: var(--typography-input-label-md-font-weight) !important;
846
+ font-size: var(--typography-input-label-md-font-size) !important;
847
+ letter-spacing: var(--typography-input-label-md-letter-spacing);
848
+ text-transform: var(--typography-input-label-sm-text-transform);
849
+ color: var(--color-text-body) !important;
850
+ margin-right: var(--spacing-gap-lg);
851
+ max-width: 128px;
852
+ min-width: 128px;
853
+ }
854
+ .novo-control-outer-container input:not([type='checkbox']):not([type='radio']) {
855
+ font-size: var(--typography-input-value-default-font-size) !important;
856
+ font-weight: var(--typography-input-value-default-font-weight) !important;
857
+ }
858
+ .field-message,
859
+ novo-tip-well.active {
860
+ font-size: var(--typography-input-value-sm-font-size);
861
+ font-weight: var(--typography-input-value-sm-font-weight);
862
+ color: var(--color-text-subtle);
863
+
864
+ // $grey is a compile-time SCSS variable — explicit selectors required to override
865
+ .character-count,
866
+ .record-count {
867
+ font-size: var(--typography-input-value-sm-font-size);
868
+ color: var(--color-text-subtle);
869
+ }
870
+ }
871
+ .error-message {
872
+ .character-count {
873
+ font-size: var(--typography-input-value-sm-font-size);
874
+ color: var(--color-text-subtle);
875
+ }
876
+ }
877
+
878
+ // Bordered input container (excludes $bh2026-borderless-types)
879
+ .novo-control-input#{$bh2026-not-borderless} {
880
+ border: var(--field-border-width-default) solid var(--field-color-border-default);
881
+ border-radius: var(--field-border-radius-default);
882
+ background: var(--field-color-background-default);
883
+ padding: var(--field-spacing-padding-vertical) var(--field-spacing-padding-horizontal);
884
+ min-height: 4rem;
885
+ box-sizing: border-box;
886
+
887
+ &:hover {
888
+ border-color: var(--field-color-border-hover);
889
+ }
890
+ &:focus-within {
891
+ border-width: var(--field-border-width-focus);
892
+ border-color: var(--field-color-border-focus);
893
+ }
894
+
895
+ // Container owns the border; suppress inner element bottom-borders
896
+ input,
897
+ textarea,
898
+ novo-chips,
899
+ novo-select > .novo-select-trigger {
900
+ border: none !important;
901
+ &:hover,
902
+ &:focus {
903
+ border: none !important;
904
+ }
905
+ }
906
+ div[type="button"] {
907
+ border-bottom: none !important;
908
+ }
909
+
910
+ // Correction for search icon in chips pickers
911
+ novo-chips.with-value > i {
912
+ bottom: 8px;
913
+ }
914
+ }
915
+
916
+ .novo-select-list.active {
917
+ margin-block: 1.4rem !important; // results in 2px difference between border and overlay
918
+ }
919
+
920
+ // Suppress input-level error border-bottom (container handles it)
921
+ input.ng-touched.ng-invalid:not(.ng-pristine):not(.novo-control-container),
922
+ novo-picker.ng-touched.ng-invalid:not(.ng-pristine) input,
923
+ textarea.ng-touched.ng-invalid:not(.ng-pristine):not(.ng-valid) {
924
+ border-bottom: none !important;
925
+ }
926
+
927
+ // Error: move negative border to container
928
+ div.novo-control-input#{$bh2026-not-borderless}:has(input.ng-touched.ng-invalid:not(.ng-pristine)),
929
+ div.novo-control-input#{$bh2026-not-borderless}:has(textarea.ng-touched.ng-invalid:not(.ng-pristine):not(.ng-valid)) {
930
+ border-width: var(--field-border-width-negative);
931
+ border-color: var(--field-color-border-negative);
932
+ &:hover {
933
+ border-color: var(--field-color-border-negative);
934
+ }
935
+ }
936
+
937
+ // Disabled container
938
+ novo-control.disabled .novo-control-input#{$bh2026-not-borderless},
939
+ novo-custom-control-container.disabled .novo-control-input#{$bh2026-not-borderless} {
940
+ border-color: var(--field-color-border-disabled);
941
+ border-style: dashed;
942
+ background: var(--field-color-background-disabled);
943
+
944
+ input,
945
+ textarea {
946
+ border: none !important;
947
+ }
948
+ div[type="button"] {
949
+ border-bottom: none !important;
950
+ }
951
+ }
952
+
953
+ // Suppress all address input borders when in bh2026
954
+ novo-form,
955
+ novo-dynamic-form {
956
+ .novo-form-container form {
957
+ div.novo-form-row,
958
+ div.novo-control-group-control,
959
+ td.novo-form-row {
960
+ novo-control,
961
+ novo-custom-control-container {
962
+ > div.novo-control-container > div.novo-control-outer-container .novo-control-inner-container .novo-control-inner-input-container > div.novo-control-input.address {
963
+ input {
964
+ border: none !important;
965
+ border-bottom: none !important;
966
+ }
967
+ }
968
+ }
969
+ }
970
+ }
971
+ }
972
+
973
+ // Pickers show up with a 2px space between them and the active control
974
+ checklist-picker-results,
975
+ distribution-list-picker-results,
976
+ entity-picker-results,
977
+ grouped-multi-picker-results,
978
+ mixed-multi-picker-results,
979
+ novo-date-picker,
980
+ novo-date-time-picker,
981
+ novo-time-picker,
982
+ picker-results,
983
+ skill-specialty-picker-results {
984
+ margin-block: var(--spacing-12) !important;
985
+ }
986
+
987
+ // Picker overlay styling within forms
988
+ picker-results,
989
+ entity-picker-results {
990
+ border: 1px solid var(--color-border-default);
991
+ background: var(--background-bright);
992
+
993
+ .novo-list,
994
+ novo-list,
995
+ ul {
996
+ border: none;
997
+ box-shadow: none;
998
+ }
999
+
1000
+ picker-error,
1001
+ picker-loader,
1002
+ picker-null-recent-results,
1003
+ picker-null-results,
1004
+ .picker-error,
1005
+ .picker-loader,
1006
+ .picker-null-recent-results,
1007
+ .picker-null-results {
1008
+ border: none;
1009
+ box-shadow: none;
1010
+ padding: var(--spacing-padding-md) var(--spacing-padding-lg);
1011
+ }
1012
+
1013
+ > p {
1014
+ margin: 0;
1015
+ padding: var(--spacing-padding-md) var(--spacing-padding-lg);
1016
+ }
1017
+ }
1018
+
1019
+ // Card styling of fieldsets
1020
+ .novo-fieldset-container.card-section,
1021
+ novo-form .novo-form-container.card-section {
1022
+ border-radius: var(--border-radius-md);
1023
+ border: 1px solid var(--color-border-default);
1024
+ box-shadow: var(--shadow-2);
1025
+ background: var(--color-background-default);
1026
+ padding-bottom: var(--spacing-padding-md);
1027
+ overflow: hidden;
1028
+ display: flex;
1029
+ flex-direction: column;
1030
+ gap: 0;
1031
+
1032
+ .novo-form-row {
1033
+ padding-left: var(--spacing-padding-lg);
1034
+ padding-right: var(--spacing-padding-lg);
1035
+ }
1036
+
1037
+ novo-control,
1038
+ novo-custom-control-container {
1039
+ margin-top: 0 !important;
1040
+ }
1041
+ }
1042
+
1043
+ .novo-fieldset-container.card-section {
1044
+ padding-top: 0;
1045
+ padding-left: 0;
1046
+ padding-right: 0;
1047
+ margin-top: var(--spacing-margin);
1048
+ margin-bottom: 0;
1049
+
1050
+ &:not(:has(> novo-fieldset-header)) {
1051
+ padding-top: var(--spacing-padding-lg);
1052
+ }
1053
+ }
1054
+
1055
+ novo-form .novo-form-container.card-section {
1056
+ padding-top: var(--spacing-padding-md);
1057
+ }
1058
+
1059
+ novo-form,
1060
+ novo-dynamic-form {
1061
+ max-width: 720px;
1062
+ width: 100%;
1063
+ margin-left: auto;
1064
+ margin-right: auto;
1065
+ }
1066
+
1067
+ .novo-form-container form {
1068
+ display: flex;
1069
+ flex-direction: column;
1070
+ gap: 0;
1071
+
1072
+ novo-fieldset {
1073
+ margin-top: 0;
1074
+ }
1075
+ }
1076
+
1077
+ .novo-form-row.hidden {
1078
+ display: none;
1079
+ }
1080
+ }