@byuhbll/components 7.0.1 → 7.0.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.
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.1",
3
+ "version": "7.0.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.15",
6
6
  "@angular/core": "^20.3.15"
@@ -1,10 +1,10 @@
1
- // ---------------------------------------------------
2
- // BYU Library Shared Styles
3
- // ---------------------------------------------------
1
+ /* ---------------------------------------------------
2
+ BYU Library Shared Styles
3
+ --------------------------------------------------- */
4
4
 
5
- // ---------------------------------------------------
6
- // Reset / Base
7
- // ---------------------------------------------------
5
+ /* ---------------------------------------------------
6
+ Reset / Base
7
+ --------------------------------------------------- */
8
8
 
9
9
  html {
10
10
  border: 0;
@@ -24,16 +24,16 @@ body {
24
24
  box-sizing: border-box;
25
25
  }
26
26
 
27
- // ---------------------------------------------------
28
- // Colors (Design Tokens)
29
- // ---------------------------------------------------
27
+ /* ---------------------------------------------------
28
+ Colors (Design Tokens)
29
+ --------------------------------------------------- */
30
30
 
31
- // Brand Colors
31
+ /* Brand Colors */
32
32
  $color-navy: #00245d;
33
33
  $color-royal: #0047ba;
34
34
  $color-white: #ffffff;
35
35
 
36
- // Blues / Royal (Primary)
36
+ /* Blues / Royal (Primary) */
37
37
  $color-blue-500: #00245d;
38
38
  $color-blue-400: #003995;
39
39
  $color-blue-300: #0047ba;
@@ -41,7 +41,7 @@ $color-blue-200: #336cc8;
41
41
  $color-blue-150: #ccdaf1;
42
42
  $color-blue-100: #e5edf8;
43
43
 
44
- // Grays / Neutral
44
+ /* Grays / Neutral */
45
45
  $color-gray-500: #141414;
46
46
  $color-gray-400: #676767;
47
47
  $color-gray-300: #8f8f8f;
@@ -49,40 +49,40 @@ $color-gray-200: #d0d0d0;
49
49
  $color-gray-100: #e7e7e7;
50
50
  $color-gray-50: #f9f9f9;
51
51
 
52
- // Greens / Success
52
+ /* Greens / Success */
53
53
  $color-green-500: #1d562e;
54
54
  $color-green-400: #2e8545;
55
55
  $color-green-300: #3ba35a;
56
56
  $color-green-200: #9dd1ac;
57
57
  $color-green-100: #ebf6ee;
58
58
 
59
- // Teals / Info
59
+ /* Teals / Info */
60
60
  $color-teal-500: #26485f;
61
61
  $color-teal-400: #3e7295;
62
62
  $color-teal-300: #457fa6;
63
63
  $color-teal-200: #a2bfd3;
64
64
  $color-teal-100: #ecf2f6;
65
65
 
66
- // Reds / Error
66
+ /* Reds / Error */
67
67
  $color-red-500: #702121;
68
68
  $color-red-400: #b33837;
69
69
  $color-red-300: #c73e3d;
70
70
  $color-red-200: #e39e9e;
71
71
  $color-red-100: #f9ecec;
72
72
 
73
- // Yellows / Warning (Mustard)
73
+ /* Yellows / Warning (Mustard) */
74
74
  $color-yellow-500: #635f04;
75
75
  $color-yellow-400: #928c30;
76
76
  $color-yellow-300: #d1c844;
77
77
  $color-yellow-200: #e8e3a1;
78
78
  $color-yellow-100: #f2f0e9;
79
79
 
80
- // Purple / Focus
80
+ /* Purple / Focus */
81
81
  $color-purple-focus: #b967c7;
82
82
 
83
- // ---------------------------------------------------
84
- // Semantic Tokens (preferred usage across apps)
85
- // ---------------------------------------------------
83
+ /* ---------------------------------------------------
84
+ Semantic Tokens (preferred usage across apps)
85
+ --------------------------------------------------- */
86
86
 
87
87
  $text-heading: #002e5d;
88
88
  $text-secondary-heading: #737373;
@@ -93,7 +93,7 @@ $text-on-action: $color-white;
93
93
 
94
94
  $focus-ring-color: $color-purple-focus;
95
95
 
96
- // State semantics (useful for alerts, badges, etc.)
96
+ /* State semantics (useful for alerts, badges, etc.) */
97
97
  $text-success: $color-green-500;
98
98
  $text-info: $color-teal-500;
99
99
  $text-error: $color-red-500;
@@ -104,9 +104,9 @@ $surface-info: $color-teal-100;
104
104
  $surface-error: $color-red-100;
105
105
  $surface-warning: $color-yellow-100;
106
106
 
107
- // ---------------------------------------------------
108
- // Expose CSS Custom Properties (so non-Sass apps can consume)
109
- // ---------------------------------------------------
107
+ /* ---------------------------------------------------
108
+ Expose CSS Custom Properties (so non-Sass apps can consume)
109
+ --------------------------------------------------- */
110
110
 
111
111
  :root {
112
112
  /* Brand */
@@ -184,9 +184,9 @@ $surface-warning: $color-yellow-100;
184
184
  --focus-ring-color: #{$focus-ring-color};
185
185
  }
186
186
 
187
- // ---------------------------------------------------
188
- // Fonts
189
- // ---------------------------------------------------
187
+ /* ---------------------------------------------------
188
+ Fonts
189
+ --------------------------------------------------- */
190
190
 
191
191
  $sourceSansProVersion: '1.0.0';
192
192
 
@@ -262,11 +262,11 @@ $sourceSansProVersion: '1.0.0';
262
262
  font-display: swap;
263
263
  }
264
264
 
265
- // ---------------------------------------------------
266
- // Default Styles for Elements
267
- // ---------------------------------------------------
265
+ /* ---------------------------------------------------
266
+ Default Styles for Elements
267
+ --------------------------------------------------- */
268
268
 
269
- // Default font-family
269
+ /* Default font-family */
270
270
  h1,
271
271
  h2,
272
272
  h3,
@@ -279,7 +279,7 @@ p {
279
279
  font-family: 'Source Sans Pro';
280
280
  }
281
281
 
282
- // Headers
282
+ /* Headers */
283
283
  h1 {
284
284
  font-weight: 300;
285
285
  font-style: normal;
@@ -316,7 +316,7 @@ h6 {
316
316
  color: var(--text-secondary-heading);
317
317
  }
318
318
 
319
- // Paragraph classes
319
+ /* Paragraph classes */
320
320
  .hbll-default-body {
321
321
  font-weight: 400;
322
322
  font-style: normal;
@@ -347,22 +347,22 @@ h6 {
347
347
  color: var(--text-body);
348
348
  }
349
349
 
350
- // Default link style
350
+ /* Default link style */
351
351
  a {
352
352
  color: var(--text-link);
353
353
  text-decoration: underline;
354
354
  }
355
355
 
356
- // Span emphasis class
356
+ /* Span emphasis class */
357
357
  .hbll-emphasis {
358
358
  font-weight: 600;
359
359
  }
360
360
 
361
- // ---------------------------------------------------
362
- // Breakpoint size changes (mobile-first)
363
- // ---------------------------------------------------
361
+ /* ---------------------------------------------------
362
+ Breakpoint size changes (mobile-first)
363
+ --------------------------------------------------- */
364
364
 
365
- // Mobile default sizes (applies to all widths unless overridden)
365
+ /* Mobile default sizes (applies to all widths unless overridden) */
366
366
  h1 {
367
367
  font-size: 2rem;
368
368
  line-height: 2.5rem;
@@ -400,7 +400,7 @@ h6 {
400
400
  line-height: 1.5rem;
401
401
  }
402
402
 
403
- // Tablet size styles (>834px)
403
+ /* Tablet size styles (>834px) */
404
404
  @media screen and (min-width: 52.125em) {
405
405
  h1 {
406
406
  font-size: 3rem;
@@ -448,7 +448,7 @@ h6 {
448
448
  }
449
449
  }
450
450
 
451
- // Desktop size styles (>1440px)
451
+ /* Desktop size styles (>1440px) */
452
452
  @media screen and (min-width: 90em) {
453
453
  h1 {
454
454
  font-size: 3.75rem;
@@ -496,9 +496,15 @@ h6 {
496
496
  }
497
497
  }
498
498
 
499
- // ---------------------------------------------------
500
- // Accessibility
501
- // ---------------------------------------------------
499
+ /* ---------------------------------------------------
500
+ Accessibility
501
+ --------------------------------------------------- */
502
+
503
+ /* Default focus style */
504
+ :focus-visible {
505
+ outline: 0.125rem solid var(--focus-ring-color);
506
+ outline-offset: 0.125rem;
507
+ }
502
508
 
503
509
  .sr-only {
504
510
  position: absolute;