@byuhbll/components 7.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -943,7 +943,8 @@ interface FieldInputs {
943
943
  }
944
944
  /**
945
945
  * A flexible, reusable field (input) component that supports multiple states
946
- * and optional icons on left and right.
946
+ * and optional icons on left and right. Also supports pre-tab and post-tab components
947
+ * via content projection for enhanced field functionality.
947
948
  *
948
949
  * @example
949
950
  * ```html
@@ -962,6 +963,22 @@ interface FieldInputs {
962
963
  * (iconAfterClick)="togglePasswordVisibility()">
963
964
  * </lib-field>
964
965
  *
966
+ * <!-- Field with pre-tab for website -->
967
+ * <lib-field placeholder="Enter website">
968
+ * <lib-pre-tab type="website"></lib-pre-tab>
969
+ * </lib-field>
970
+ *
971
+ * <!-- Field with post-tab for email -->
972
+ * <lib-field placeholder="Enter email address">
973
+ * <lib-post-tab type="email"></lib-post-tab>
974
+ * </lib-field>
975
+ *
976
+ * <!-- Field with both pre-tab and post-tab -->
977
+ * <lib-field placeholder="Enter phone number">
978
+ * <lib-pre-tab type="phone"></lib-pre-tab>
979
+ * <lib-post-tab type="phone" [showText]="false"></lib-post-tab>
980
+ * </lib-field>
981
+ *
965
982
  * <!-- Error state with icon -->
966
983
  * <lib-field
967
984
  * placeholder="Email"
@@ -1046,7 +1063,7 @@ declare class FieldComponent implements ControlValueAccessor {
1046
1063
  registerOnTouched(fn: () => void): void;
1047
1064
  setDisabledState(isDisabled: boolean): void;
1048
1065
  static ɵfac: i0.ɵɵFactoryDeclaration<FieldComponent, never>;
1049
- static ɵcmp: i0.ɵɵComponentDeclaration<FieldComponent, "lib-field", never, { "inputType": { "alias": "inputType"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "state": { "alias": "state"; "required": false; }; "status": { "alias": "status"; "required": false; }; "iconBefore": { "alias": "iconBefore"; "required": false; }; "iconAfter": { "alias": "iconAfter"; "required": false; }; "iconBeforeClickable": { "alias": "iconBeforeClickable"; "required": false; }; "iconAfterClickable": { "alias": "iconAfterClickable"; "required": false; }; "iconBeforeAction": { "alias": "iconBeforeAction"; "required": false; }; "iconAfterAction": { "alias": "iconAfterAction"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "value": { "alias": "value"; "required": false; }; "isFullText": { "alias": "isFullText"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "minWidth": { "alias": "minWidth"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; }, { "valueChange": "valueChange"; "iconBeforeClick": "iconBeforeClick"; "iconAfterClick": "iconAfterClick"; "fieldFocus": "fieldFocus"; "fieldBlur": "fieldBlur"; }, never, never, true, never>;
1066
+ static ɵcmp: i0.ɵɵComponentDeclaration<FieldComponent, "lib-field", never, { "inputType": { "alias": "inputType"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "state": { "alias": "state"; "required": false; }; "status": { "alias": "status"; "required": false; }; "iconBefore": { "alias": "iconBefore"; "required": false; }; "iconAfter": { "alias": "iconAfter"; "required": false; }; "iconBeforeClickable": { "alias": "iconBeforeClickable"; "required": false; }; "iconAfterClickable": { "alias": "iconAfterClickable"; "required": false; }; "iconBeforeAction": { "alias": "iconBeforeAction"; "required": false; }; "iconAfterAction": { "alias": "iconAfterAction"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "value": { "alias": "value"; "required": false; }; "isFullText": { "alias": "isFullText"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "minWidth": { "alias": "minWidth"; "required": false; }; "maxWidth": { "alias": "maxWidth"; "required": false; }; "minHeight": { "alias": "minHeight"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; }, { "valueChange": "valueChange"; "iconBeforeClick": "iconBeforeClick"; "iconAfterClick": "iconAfterClick"; "fieldFocus": "fieldFocus"; "fieldBlur": "fieldBlur"; }, never, ["lib-pre-tab", "lib-post-tab"], true, never>;
1050
1067
  }
1051
1068
 
1052
1069
  type LabelType = 'none' | 'required' | 'optional';
@@ -1238,6 +1255,157 @@ declare class RadioButtonComponent implements ControlValueAccessor {
1238
1255
  static ngAcceptInputType_disabled: unknown;
1239
1256
  }
1240
1257
 
1258
+ type PreTabType = 'website' | 'email' | 'phone' | 'fax' | 'address' | 'social' | 'custom';
1259
+ interface PreTabInputs {
1260
+ type?: PreTabType;
1261
+ icon?: string;
1262
+ text?: string;
1263
+ action?: () => void;
1264
+ disabled?: boolean;
1265
+ ariaLabel?: string;
1266
+ }
1267
+ /**
1268
+ * A prefix tab component that displays an icon and text before an input field.
1269
+ * Provides default presets for common types (website, email, phone) or custom configuration.
1270
+ *
1271
+ * @example
1272
+ * ```html
1273
+ * <!-- Website preset -->
1274
+ * <lib-pre-tab type="website"></lib-pre-tab>
1275
+ *
1276
+ * <!-- Email preset -->
1277
+ * <lib-pre-tab type="email"></lib-pre-tab>
1278
+ *
1279
+ * <!-- Phone preset -->
1280
+ * <lib-pre-tab type="phone"></lib-pre-tab>
1281
+ *
1282
+ * <!-- Fax preset -->
1283
+ * <lib-pre-tab type="fax"></lib-pre-tab>
1284
+ *
1285
+ * <!-- Address preset -->
1286
+ * <lib-pre-tab type="address"></lib-pre-tab>
1287
+ *
1288
+ * <!-- Social media preset -->
1289
+ * <lib-pre-tab type="social"></lib-pre-tab>
1290
+ *
1291
+ * <!-- Custom configuration -->
1292
+ * <lib-pre-tab
1293
+ * type="custom"
1294
+ * icon="location_on"
1295
+ * text="Address">
1296
+ * </lib-pre-tab>
1297
+ *
1298
+ * <!-- Actionable state -->
1299
+ * <lib-pre-tab type="email" [action]="onPreTabAction"></lib-pre-tab>
1300
+ *
1301
+ * <!-- Disabled state -->
1302
+ * <lib-pre-tab type="website" [disabled]="true"></lib-pre-tab>
1303
+ * ```
1304
+ */
1305
+ declare class PreTabComponent {
1306
+ type: PreTabType;
1307
+ icon?: string;
1308
+ text?: string;
1309
+ action?: () => void;
1310
+ disabled: boolean;
1311
+ ariaLabel?: string;
1312
+ /**
1313
+ * Default preset configurations
1314
+ */
1315
+ private readonly presets;
1316
+ /**
1317
+ * Gets the icon to display based on type or custom input
1318
+ */
1319
+ get displayIcon(): string;
1320
+ /**
1321
+ * Gets the text to display based on type or custom input
1322
+ */
1323
+ get displayText(): string;
1324
+ /**
1325
+ * Gets the computed aria-label for accessibility
1326
+ */
1327
+ get computedAriaLabel(): string;
1328
+ static ɵfac: i0.ɵɵFactoryDeclaration<PreTabComponent, never>;
1329
+ static ɵcmp: i0.ɵɵComponentDeclaration<PreTabComponent, "lib-pre-tab", never, { "type": { "alias": "type"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "text": { "alias": "text"; "required": false; }; "action": { "alias": "action"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, never, true, never>;
1330
+ }
1331
+
1332
+ type PostTabType = 'website' | 'email' | 'phone' | 'fax' | 'address' | 'social' | 'custom';
1333
+ interface PostTabInputs {
1334
+ type?: PostTabType;
1335
+ icon?: string;
1336
+ text?: string;
1337
+ showText?: boolean;
1338
+ action?: () => void;
1339
+ disabled?: boolean;
1340
+ ariaLabel?: string;
1341
+ }
1342
+ /**
1343
+ * A suffix tab component that displays an icon (and optionally text) after an input field.
1344
+ * Provides default presets for common types (website, email, phone) or custom configuration.
1345
+ *
1346
+ * @example
1347
+ * ```html
1348
+ * <!-- Website preset (icon only) -->
1349
+ * <lib-post-tab type="website"></lib-post-tab>
1350
+ *
1351
+ * <!-- Email preset (icon only) -->
1352
+ * <lib-post-tab type="email"></lib-post-tab>
1353
+ *
1354
+ * <!-- Phone preset with text -->
1355
+ * <lib-post-tab type="phone" [showText]="true"></lib-post-tab>
1356
+ *
1357
+ * <!-- Fax preset -->
1358
+ * <lib-post-tab type="fax"></lib-post-tab>
1359
+ *
1360
+ * <!-- Address preset -->
1361
+ * <lib-post-tab type="address"></lib-post-tab>
1362
+ *
1363
+ * <!-- Social media preset -->
1364
+ * <lib-post-tab type="social"></lib-post-tab>
1365
+ *
1366
+ * <!-- Custom configuration -->
1367
+ * <lib-post-tab
1368
+ * type="custom"
1369
+ * icon="location_on"
1370
+ * text="Address"
1371
+ * [showText]="true">
1372
+ * </lib-post-tab>
1373
+ *
1374
+ * <!-- Actionable state -->
1375
+ * <lib-post-tab type="phone" [action]="onPostTabAction"></lib-post-tab>
1376
+ *
1377
+ * <!-- Disabled state -->
1378
+ * <lib-post-tab type="website" [disabled]="true"></lib-post-tab>
1379
+ * ```
1380
+ */
1381
+ declare class PostTabComponent {
1382
+ type: PostTabType;
1383
+ icon?: string;
1384
+ text?: string;
1385
+ showText: boolean;
1386
+ action?: () => void;
1387
+ disabled: boolean;
1388
+ ariaLabel?: string;
1389
+ /**
1390
+ * Default preset configurations
1391
+ */
1392
+ private readonly presets;
1393
+ /**
1394
+ * Gets the icon to display based on type or custom input
1395
+ */
1396
+ get displayIcon(): string;
1397
+ /**
1398
+ * Gets the text to display based on type or custom input
1399
+ */
1400
+ get displayText(): string;
1401
+ /**
1402
+ * Gets the computed aria-label for accessibility
1403
+ */
1404
+ get computedAriaLabel(): string;
1405
+ static ɵfac: i0.ɵɵFactoryDeclaration<PostTabComponent, never>;
1406
+ static ɵcmp: i0.ɵɵComponentDeclaration<PostTabComponent, "lib-post-tab", never, { "type": { "alias": "type"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "text": { "alias": "text"; "required": false; }; "showText": { "alias": "showText"; "required": false; }; "action": { "alias": "action"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; }, {}, never, never, true, never>;
1407
+ }
1408
+
1241
1409
  type DropdownState = 'default' | 'hover' | 'focused' | 'error' | 'success' | 'disabled';
1242
1410
  interface DropdownOption {
1243
1411
  value: string;
@@ -1310,12 +1478,14 @@ declare class DropdownComponent implements ControlValueAccessor, OnInit {
1310
1478
  valueChange: EventEmitter<string>;
1311
1479
  helpIconClick: EventEmitter<void>;
1312
1480
  dropdownInput?: FieldComponent;
1481
+ dropdownMenuItems?: ElementRef;
1313
1482
  value: string;
1314
1483
  searchText: string;
1315
1484
  isOpen: boolean;
1316
1485
  selectedIndex: number;
1317
1486
  filteredOptions: DropdownOption[];
1318
1487
  private elementRef;
1488
+ private cdr;
1319
1489
  private onChange;
1320
1490
  private onTouched;
1321
1491
  ngOnInit(): void;
@@ -1335,6 +1505,10 @@ declare class DropdownComponent implements ControlValueAccessor, OnInit {
1335
1505
  * Filters options based on search text
1336
1506
  */
1337
1507
  filterOptions(): void;
1508
+ /**
1509
+ * Scrolls the highlighted item into view
1510
+ */
1511
+ private scrollHighlightedIntoView;
1338
1512
  /**
1339
1513
  * Selects an option from the dropdown
1340
1514
  */
@@ -1363,5 +1537,5 @@ declare class DropdownComponent implements ControlValueAccessor, OnInit {
1363
1537
  static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "lib-dropdown", never, { "label": { "alias": "label"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "labelType": { "alias": "labelType"; "required": false; }; "showHelpIcon": { "alias": "showHelpIcon"; "required": false; }; "subtext": { "alias": "subtext"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "options": { "alias": "options"; "required": false; }; "state": { "alias": "state"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; }, { "valueChange": "valueChange"; "helpIconClick": "helpIconClick"; }, never, never, true, never>;
1364
1538
  }
1365
1539
 
1366
- export { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_OPTIONS, ADVANCED_SEARCH_QUALIFIER_MAP, ButtonComponent, ButtonGroupComponent, ButtonGroupItemComponent, CheckboxComponent, DropdownComponent, FieldComponent, HbllFooterComponent, HbllHeaderComponent, HbllItemTypeIconPipe, HeaderWithImpersonationComponent, ImpersonateModalComponent, ImpersonateUserPipe, ImpersonationBannerComponent, LIBRARY_HOURS_API_URL, LabelComponent, LinkComponent, RadioButtonComponent, SnackbarComponent, SnackbarService, SsSearchBarComponent, StatusButtonComponent, TabBarComponent, TabItemComponent, defaultOidcBaseUri, defaultOidcDefaultIdp, getUserStatusFromRoles, isAdvancedSearchExternalFieldOption, isAdvancedSearchFieldOption, isAdvancedSearchLocalFieldOption, isSearchScope };
1367
- export type { AdvancedSearchBooleanOption, AdvancedSearchExternalFieldOption, AdvancedSearchFieldOption, AdvancedSearchLanguageOption, AdvancedSearchLocalFieldOption, AdvancedSearchQualifier, AdvancedSearchQualifierOption, AdvancedSearchQueryRow, AdvancedSearchResultsPerPageOption, ButtonInputs, ButtonType, CheckboxInputs, DropdownInputs, DropdownOption, DropdownState, FieldInputs, FieldState, FieldStatus, ImpersonateSearchResult, InputType, LabelInputs, LabelPosition, LabelType, LinkIconPosition, LinkInputs, LinkState, LinkType, RadioButtonChange, SearchConfig, SearchScope, SnackbarInputs, SnackbarPurpose, Status, StatusButtonInputs };
1540
+ export { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_OPTIONS, ADVANCED_SEARCH_QUALIFIER_MAP, ButtonComponent, ButtonGroupComponent, ButtonGroupItemComponent, CheckboxComponent, DropdownComponent, FieldComponent, HbllFooterComponent, HbllHeaderComponent, HbllItemTypeIconPipe, HeaderWithImpersonationComponent, ImpersonateModalComponent, ImpersonateUserPipe, ImpersonationBannerComponent, LIBRARY_HOURS_API_URL, LabelComponent, LinkComponent, PostTabComponent, PreTabComponent, RadioButtonComponent, SnackbarComponent, SnackbarService, SsSearchBarComponent, StatusButtonComponent, TabBarComponent, TabItemComponent, defaultOidcBaseUri, defaultOidcDefaultIdp, getUserStatusFromRoles, isAdvancedSearchExternalFieldOption, isAdvancedSearchFieldOption, isAdvancedSearchLocalFieldOption, isSearchScope };
1541
+ export type { AdvancedSearchBooleanOption, AdvancedSearchExternalFieldOption, AdvancedSearchFieldOption, AdvancedSearchLanguageOption, AdvancedSearchLocalFieldOption, AdvancedSearchQualifier, AdvancedSearchQualifierOption, AdvancedSearchQueryRow, AdvancedSearchResultsPerPageOption, ButtonInputs, ButtonType, CheckboxInputs, DropdownInputs, DropdownOption, DropdownState, FieldInputs, FieldState, FieldStatus, ImpersonateSearchResult, InputType, LabelInputs, LabelPosition, LabelType, LinkIconPosition, LinkInputs, LinkState, LinkType, PostTabInputs, PostTabType, PreTabInputs, PreTabType, RadioButtonChange, SearchConfig, SearchScope, SnackbarInputs, SnackbarPurpose, Status, StatusButtonInputs };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@byuhbll/components",
3
- "version": "7.0.0",
3
+ "version": "7.0.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.15",
6
6
  "@angular/core": "^20.3.15"
@@ -43,7 +43,7 @@ $color-blue-100: #e5edf8;
43
43
 
44
44
  // Grays / Neutral
45
45
  $color-gray-500: #141414;
46
- $color-gray-400: #737373;
46
+ $color-gray-400: #676767;
47
47
  $color-gray-300: #8f8f8f;
48
48
  $color-gray-200: #d0d0d0;
49
49
  $color-gray-100: #e7e7e7;