novo-elements 13.2.0 → 13.3.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 (119) 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 -1
  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 +80 -19
  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/category-dropdown/CategoryDropdown.scss +1 -1
  13. package/elements/checkbox/CheckList.scss +69 -0
  14. package/elements/checkbox/Checkbox.scss +104 -0
  15. package/elements/chips/Chip.scss +3 -1
  16. package/elements/common/index.d.ts +14 -4
  17. package/elements/common/option/option.component.scss +11 -0
  18. package/elements/data-table/data-table.component.scss +81 -3
  19. package/elements/data-table/pagination/data-table-pagination.component.scss +73 -0
  20. package/elements/date-picker/DatePicker.scss +1 -6
  21. package/elements/date-time-picker/_DateTimePicker.scss +1 -1
  22. package/elements/dropdown/Dropdown.scss +17 -1
  23. package/elements/field/field.scss +10 -6
  24. package/elements/field/hint/hint.scss +6 -0
  25. package/elements/form/ControlGroup.scss +13 -0
  26. package/elements/form/Form.scss +46 -0
  27. package/elements/header/Header.scss +45 -3
  28. package/elements/layout/index.d.ts +10 -2
  29. package/elements/list/list-item-content.scss +11 -10
  30. package/elements/menu/menu-content.component.scss +1 -0
  31. package/elements/modal/modal.component.scss +3 -13
  32. package/elements/modal/notification.component.scss +1 -6
  33. package/elements/picker/extras/picker-results/PickerResults.scss +51 -0
  34. package/elements/progress/Progress.scss +8 -0
  35. package/elements/progress/ProgressBar.scss +4 -1
  36. package/elements/search/SearchBox.scss +53 -0
  37. package/elements/search/index.d.ts +19 -9
  38. package/elements/select/Select.scss +1 -0
  39. package/elements/simple-table/table.scss +1 -1
  40. package/elements/stepper/stepper.component.scss +4 -4
  41. package/elements/switch/Switch.scss +39 -3
  42. package/elements/tabbed-group-picker/TabbedGroupPicker.scss +47 -0
  43. package/elements/tabs/tab.scss +17 -14
  44. package/elements/tiles/Tiles.scss +24 -2
  45. package/elements/time-picker/TimePicker.scss +2 -2
  46. package/elements/tip-well/TipWell.scss +34 -0
  47. package/elements/tip-well/index.d.ts +5 -1
  48. package/elements/toolbar/toolbar.component.scss +15 -0
  49. package/elements/tooltip/Tooltip.scss +1 -6
  50. package/fesm2022/novo-elements-elements-breadcrumbs.mjs +3 -3
  51. package/fesm2022/novo-elements-elements-breadcrumbs.mjs.map +1 -1
  52. package/fesm2022/novo-elements-elements-button.mjs +2 -2
  53. package/fesm2022/novo-elements-elements-button.mjs.map +1 -1
  54. package/fesm2022/novo-elements-elements-card.mjs +27 -21
  55. package/fesm2022/novo-elements-elements-card.mjs.map +1 -1
  56. package/fesm2022/novo-elements-elements-category-dropdown.mjs +2 -2
  57. package/fesm2022/novo-elements-elements-category-dropdown.mjs.map +1 -1
  58. package/fesm2022/novo-elements-elements-checkbox.mjs +4 -4
  59. package/fesm2022/novo-elements-elements-checkbox.mjs.map +1 -1
  60. package/fesm2022/novo-elements-elements-chips.mjs +2 -2
  61. package/fesm2022/novo-elements-elements-chips.mjs.map +1 -1
  62. package/fesm2022/novo-elements-elements-common.mjs +48 -17
  63. package/fesm2022/novo-elements-elements-common.mjs.map +1 -1
  64. package/fesm2022/novo-elements-elements-data-table.mjs +4 -4
  65. package/fesm2022/novo-elements-elements-data-table.mjs.map +1 -1
  66. package/fesm2022/novo-elements-elements-date-picker.mjs +2 -2
  67. package/fesm2022/novo-elements-elements-date-picker.mjs.map +1 -1
  68. package/fesm2022/novo-elements-elements-date-time-picker.mjs +2 -2
  69. package/fesm2022/novo-elements-elements-date-time-picker.mjs.map +1 -1
  70. package/fesm2022/novo-elements-elements-dropdown.mjs +2 -2
  71. package/fesm2022/novo-elements-elements-dropdown.mjs.map +1 -1
  72. package/fesm2022/novo-elements-elements-field.mjs +4 -4
  73. package/fesm2022/novo-elements-elements-field.mjs.map +1 -1
  74. package/fesm2022/novo-elements-elements-form.mjs +7 -7
  75. package/fesm2022/novo-elements-elements-form.mjs.map +1 -1
  76. package/fesm2022/novo-elements-elements-header.mjs +2 -2
  77. package/fesm2022/novo-elements-elements-header.mjs.map +1 -1
  78. package/fesm2022/novo-elements-elements-layout.mjs +29 -13
  79. package/fesm2022/novo-elements-elements-layout.mjs.map +1 -1
  80. package/fesm2022/novo-elements-elements-list.mjs +2 -2
  81. package/fesm2022/novo-elements-elements-list.mjs.map +1 -1
  82. package/fesm2022/novo-elements-elements-menu.mjs +2 -2
  83. package/fesm2022/novo-elements-elements-menu.mjs.map +1 -1
  84. package/fesm2022/novo-elements-elements-modal.mjs +4 -4
  85. package/fesm2022/novo-elements-elements-modal.mjs.map +1 -1
  86. package/fesm2022/novo-elements-elements-picker.mjs +4 -4
  87. package/fesm2022/novo-elements-elements-picker.mjs.map +1 -1
  88. package/fesm2022/novo-elements-elements-progress.mjs +4 -4
  89. package/fesm2022/novo-elements-elements-progress.mjs.map +1 -1
  90. package/fesm2022/novo-elements-elements-search.mjs +63 -17
  91. package/fesm2022/novo-elements-elements-search.mjs.map +1 -1
  92. package/fesm2022/novo-elements-elements-select.mjs +2 -2
  93. package/fesm2022/novo-elements-elements-select.mjs.map +1 -1
  94. package/fesm2022/novo-elements-elements-simple-table.mjs +4 -4
  95. package/fesm2022/novo-elements-elements-simple-table.mjs.map +1 -1
  96. package/fesm2022/novo-elements-elements-stepper.mjs +6 -6
  97. package/fesm2022/novo-elements-elements-stepper.mjs.map +1 -1
  98. package/fesm2022/novo-elements-elements-switch.mjs +2 -2
  99. package/fesm2022/novo-elements-elements-switch.mjs.map +1 -1
  100. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs +2 -2
  101. package/fesm2022/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
  102. package/fesm2022/novo-elements-elements-tabs.mjs +4 -4
  103. package/fesm2022/novo-elements-elements-tabs.mjs.map +1 -1
  104. package/fesm2022/novo-elements-elements-tiles.mjs +2 -2
  105. package/fesm2022/novo-elements-elements-tiles.mjs.map +1 -1
  106. package/fesm2022/novo-elements-elements-time-picker.mjs +2 -2
  107. package/fesm2022/novo-elements-elements-time-picker.mjs.map +1 -1
  108. package/fesm2022/novo-elements-elements-tip-well.mjs +26 -6
  109. package/fesm2022/novo-elements-elements-tip-well.mjs.map +1 -1
  110. package/fesm2022/novo-elements-elements-toolbar.mjs +2 -2
  111. package/fesm2022/novo-elements-elements-toolbar.mjs.map +1 -1
  112. package/fesm2022/novo-elements-elements-tooltip.mjs +2 -2
  113. package/fesm2022/novo-elements-elements-tooltip.mjs.map +1 -1
  114. package/fesm2022/novo-elements-utils.mjs +4822 -364
  115. package/fesm2022/novo-elements-utils.mjs.map +1 -1
  116. package/package.json +1 -1
  117. package/styles/content/links.scss +4 -0
  118. package/styles/themes/bh2026.scss +131 -53
  119. package/utils/index.d.ts +2 -2
@@ -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
+ min-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
+ }
@@ -11,7 +11,6 @@
11
11
  background: var(--color-white);
12
12
  color: var(--button-secondary-text, var(--color-positive));
13
13
  border: var(--button-secondary-border, 1px solid $positive);
14
- padding: 0 calc(#{var(--spacing-md)} - 1px);
15
14
 
16
15
  i.loading {
17
16
  margin-left: 0.8rem;
@@ -50,3 +49,17 @@
50
49
  }
51
50
  }
52
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);
@@ -117,37 +120,95 @@
117
120
  }
118
121
  }
119
122
 
120
- // bh2026: roomier, rounder card, larger title
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-md, 1.6rem);
132
- margin-left: var(--spacing-md);
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 {
135
- ::ng-deep i.bhi-move {
136
- display: none;
137
- }
138
-
138
+ padding-inline: var(--spacing-gutter);
139
139
  h1,
140
140
  h2,
141
141
  h3 {
142
- font-size: 1.8rem;
143
- 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
+ }
144
148
  }
149
+
150
+ ::ng-deep i {
151
+ margin: 0;
152
+ }
153
+ }
154
+
155
+ .card-move-handle {
156
+ position: absolute;
157
+ left: var(--spacing-padding-xxsm);
158
+ color: var(--color-content-icon, #89909A);
159
+ }
160
+
161
+ .actions {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: var(--spacing-gap-sm);
145
165
  }
146
166
 
147
167
  novo-button {
148
- color: rgba(var(--text-secondary), 0.7);
149
- margin-left: var(--spacing-sm);
150
- margin-right: var(--spacing-sm);
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 {
176
+ color: var(--color-content-subtle, #5d7798);
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
+ }
151
212
  }
152
213
  }
153
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
 
@@ -15,7 +15,7 @@
15
15
  min-width: 400px;
16
16
  display: block;
17
17
  z-index: z("max");
18
- border-radius: var(--border-radius-xsm, 2px);
18
+ border-radius: var(--border-radius-sm, 2px);
19
19
  top: 100%;
20
20
  margin-top: 5px;
21
21
  }
@@ -88,3 +88,72 @@
88
88
  }
89
89
  }
90
90
  }
91
+
92
+ // bh2026: CSS-based checkbox rendering — replaces icon font glyphs
93
+ :host-context([data-theme='bh2026']) {
94
+ .novo-checkbox-group {
95
+ label i.bhi-checkbox-empty,
96
+ label i.bhi-checkbox-filled {
97
+ font-size: 0;
98
+ display: inline-flex;
99
+ align-self: center;
100
+ width: 16px;
101
+ height: 16px;
102
+ position: relative;
103
+ flex-shrink: 0;
104
+ }
105
+
106
+ label i.bhi-checkbox-empty {
107
+ &::before {
108
+ content: '';
109
+ position: absolute;
110
+ inset: 0;
111
+ border: 1px solid var(--color-border-control);
112
+ border-radius: 2px;
113
+ background: white;
114
+ }
115
+ }
116
+
117
+ label i.bhi-checkbox-filled {
118
+ &::before {
119
+ content: '';
120
+ position: absolute;
121
+ inset: 0;
122
+ background: var(--color-background-utility-positive);
123
+ border: 1px solid var(--color-utility-blue-600);
124
+ border-radius: 2px;
125
+ }
126
+ &::after {
127
+ content: '';
128
+ position: absolute;
129
+ left: 3px;
130
+ top: 4px;
131
+ width: 9px;
132
+ height: 5px;
133
+ border-left: 2px solid var(--color-utility-blue-600);
134
+ border-bottom: 2px solid var(--color-utility-blue-600);
135
+ transform: rotate(-45deg);
136
+ }
137
+ }
138
+
139
+ &.disabled {
140
+ label {
141
+ opacity: 1;
142
+ }
143
+ label i.bhi-checkbox-empty {
144
+ &::before {
145
+ background: var(--color-background-utility-positive);
146
+ border-color: var(--color-border-input-disabled);
147
+ }
148
+ }
149
+ label i.bhi-checkbox-filled {
150
+ &::before {
151
+ border-color: var(--color-border-input-disabled);
152
+ }
153
+ &::after {
154
+ border-color: var(--color-border-input-disabled);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
@@ -91,3 +91,107 @@
91
91
  }
92
92
  }
93
93
  }
94
+
95
+ // bh2026: CSS-based checkbox rendering — replaces icon font glyphs
96
+ :host-context([data-theme='bh2026']) {
97
+ .novo-checkbox-group {
98
+ // Suppress glyph and establish box dimensions for all box-style states
99
+ label i.bhi-checkbox-empty,
100
+ label i.bhi-checkbox-filled,
101
+ label i.bhi-checkbox-indeterminate {
102
+ font-size: 0;
103
+ display: inline-flex;
104
+ align-self: center;
105
+ width: 16px;
106
+ height: 16px;
107
+ position: relative;
108
+ flex-shrink: 0;
109
+ }
110
+
111
+ // Unchecked: white box with gray border
112
+ label i.bhi-checkbox-empty {
113
+ &::before {
114
+ content: '';
115
+ position: absolute;
116
+ inset: 0;
117
+ border: 1px solid var(--color-border-control);
118
+ border-radius: 2px;
119
+ background: white;
120
+ }
121
+ }
122
+
123
+ // Checked: light-blue box with brand-blue border and checkmark
124
+ label i.bhi-checkbox-filled {
125
+ &::before {
126
+ content: '';
127
+ position: absolute;
128
+ inset: 0;
129
+ background: var(--color-background-utility-positive);
130
+ border: 1px solid var(--color-utility-blue-600);
131
+ border-radius: 2px;
132
+ }
133
+ &::after {
134
+ content: '';
135
+ position: absolute;
136
+ left: 3px;
137
+ top: 4px;
138
+ width: 9px;
139
+ height: 5px;
140
+ border-left: 2px solid var(--color-utility-blue-600);
141
+ border-bottom: 2px solid var(--color-utility-blue-600);
142
+ transform: rotate(-45deg);
143
+ }
144
+ }
145
+
146
+ // Indeterminate: light-blue box with brand-blue border and dash
147
+ label i.bhi-checkbox-indeterminate {
148
+ &::before {
149
+ content: '';
150
+ position: absolute;
151
+ inset: 0;
152
+ background: var(--color-background-utility-positive);
153
+ border: 1px solid var(--color-utility-blue-600);
154
+ border-radius: 2px;
155
+ }
156
+ &::after {
157
+ content: '';
158
+ position: absolute;
159
+ left: 4px;
160
+ top: 50%;
161
+ transform: translateY(-50%);
162
+ width: 8px;
163
+ height: 2px;
164
+ background: var(--color-utility-blue-600);
165
+ }
166
+ }
167
+
168
+ // Disabled: override the base opacity:0.4 and use explicit muted colors
169
+ &.disabled {
170
+ label {
171
+ opacity: 1;
172
+ }
173
+ label i.bhi-checkbox-empty {
174
+ &::before {
175
+ background: var(--color-background-utility-positive);
176
+ border-color: var(--color-border-input-disabled);
177
+ }
178
+ }
179
+ label i.bhi-checkbox-filled {
180
+ &::before {
181
+ border-color: var(--color-border-input-disabled);
182
+ }
183
+ &::after {
184
+ border-color: var(--color-border-input-disabled);
185
+ }
186
+ }
187
+ label i.bhi-checkbox-indeterminate {
188
+ &::before {
189
+ border-color: var(--color-border-input-disabled);
190
+ }
191
+ &::after {
192
+ background: var(--color-border-input-disabled);
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
@@ -46,7 +46,9 @@ $chip-spacing: (
46
46
  @include novo-body-text();
47
47
  background: var(--background-main);
48
48
  border: 1px solid transparent;
49
- transition: all 200ms ease-in-out;
49
+ transition-duration: 0.2s;
50
+ transition-timing-function: ease-in-out;
51
+ transition-property: color, opacity, border-color, border-width, background-color;
50
52
  display: inline-flex;
51
53
  align-items: center;
52
54
  cursor: default;
@@ -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
+ }