@allsorter/ui-components 0.0.406 → 0.0.410

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 (26) hide show
  1. package/fesm2022/allsorter-ui-components.mjs +187 -61
  2. package/fesm2022/allsorter-ui-components.mjs.map +1 -1
  3. package/lib/editable-form-wrapper/editable-form-wrapper.component.d.ts +6 -1
  4. package/lib/loader/loader.component.d.ts +7 -2
  5. package/lib/newresumeheader/newresumeheader.component.d.ts +3 -1
  6. package/lib/toggle-buttons/toggle-buttons.component.d.ts +2 -0
  7. package/lib/utils/animations.d.ts +22 -0
  8. package/package.json +1 -1
  9. package/src/lib/button/button.component.scss +1 -0
  10. package/src/lib/candidate-section/candidate-section.component.html +13 -17
  11. package/src/lib/candidate-section/candidate-section.component.scss +1 -0
  12. package/src/lib/custom-editor/custom-editor.component.scss +1 -1
  13. package/src/lib/editable-form-wrapper/editable-form-wrapper.component.html +0 -7
  14. package/src/lib/editable-form-wrapper/editable-form-wrapper.component.scss +43 -5
  15. package/src/lib/field-placeholder/field-placeholder.component.scss +4 -5
  16. package/src/lib/input/input.component.scss +2 -0
  17. package/src/lib/loader/loader.component.html +5 -5
  18. package/src/lib/loader/loader.component.scss +36 -13
  19. package/src/lib/newresumeheader/newresumeheader.component.html +5 -3
  20. package/src/lib/newresumeheader/newresumeheader.component.scss +6 -1
  21. package/src/lib/resume-entries/resume-entries.component.html +4 -1
  22. package/src/lib/resume-entries/resume-entries.component.scss +19 -11
  23. package/src/lib/tabs/tabs.component.html +1 -1
  24. package/src/lib/tabs/tabs.component.scss +7 -0
  25. package/src/lib/toggle-buttons/toggle-buttons.component.html +4 -2
  26. package/src/lib/toggle-buttons/toggle-buttons.component.scss +16 -0
@@ -40,6 +40,11 @@ export declare class EditableFormWrapperComponent implements AfterViewInit, OnDe
40
40
  * If not provided, defaults to window scrolling.
41
41
  */
42
42
  scrollContainer: string | HTMLElement | null;
43
+ /**
44
+ * Padding for button clamp boundaries.
45
+ * @default 36
46
+ */
47
+ clampPadding: number;
43
48
  /**
44
49
  * Emitted when the left (edit) button is clicked.
45
50
  */
@@ -75,5 +80,5 @@ export declare class EditableFormWrapperComponent implements AfterViewInit, OnDe
75
80
  ngOnDestroy(): void;
76
81
  private setupScrollBehavior;
77
82
  static ɵfac: i0.ɵɵFactoryDeclaration<EditableFormWrapperComponent, never>;
78
- static ɵcmp: i0.ɵɵComponentDeclaration<EditableFormWrapperComponent, "al-form", never, { "testId": { "alias": "testId"; "required": false; }; "showLeftButton": { "alias": "showLeftButton"; "required": false; }; "showSaveButton": { "alias": "showSaveButton"; "required": false; }; "showDeleteButton": { "alias": "showDeleteButton"; "required": false; }; "leftContainerClass": { "alias": "leftContainerClass"; "required": false; }; "leftContainerStyle": { "alias": "leftContainerStyle"; "required": false; }; "scrollContainer": { "alias": "scrollContainer"; "required": false; }; }, { "leftButtonClick": "leftButtonClick"; "saveButtonClick": "saveButtonClick"; "deleteButtonClick": "deleteButtonClick"; }, never, ["[leftButtonContent]", "*"], true, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<EditableFormWrapperComponent, "al-form", never, { "testId": { "alias": "testId"; "required": false; }; "showLeftButton": { "alias": "showLeftButton"; "required": false; }; "showSaveButton": { "alias": "showSaveButton"; "required": false; }; "showDeleteButton": { "alias": "showDeleteButton"; "required": false; }; "leftContainerClass": { "alias": "leftContainerClass"; "required": false; }; "leftContainerStyle": { "alias": "leftContainerStyle"; "required": false; }; "scrollContainer": { "alias": "scrollContainer"; "required": false; }; "clampPadding": { "alias": "clampPadding"; "required": false; }; }, { "leftButtonClick": "leftButtonClick"; "saveButtonClick": "saveButtonClick"; "deleteButtonClick": "deleteButtonClick"; }, never, ["[leftButtonContent]", "*"], true, never>;
79
84
  }
@@ -1,4 +1,4 @@
1
- import { OnInit, OnDestroy } from '@angular/core';
1
+ import { OnInit, OnDestroy, EventEmitter } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export type LoaderStatus = 'analyzing' | 'gathering' | 'processing' | 'applying' | 'done';
4
4
  export declare class LoaderComponent implements OnInit, OnDestroy {
@@ -43,6 +43,11 @@ export declare class LoaderComponent implements OnInit, OnDestroy {
43
43
  * @default false
44
44
  */
45
45
  completeOnDone: boolean;
46
+ /**
47
+ * Event emitted when the loader completes a full cycle (reaches 'done' status).
48
+ * Only emits when completeOnDone is true.
49
+ */
50
+ completed: EventEmitter<void>;
46
51
  private loopInterval?;
47
52
  private currentLoopIndex;
48
53
  private readonly statusOrder;
@@ -78,5 +83,5 @@ export declare class LoaderComponent implements OnInit, OnDestroy {
78
83
  */
79
84
  reset(): void;
80
85
  static ɵfac: i0.ɵɵFactoryDeclaration<LoaderComponent, never>;
81
- static ɵcmp: i0.ɵɵComponentDeclaration<LoaderComponent, "al-loader", never, { "dataTestId": { "alias": "dataTestId"; "required": false; }; "status": { "alias": "status"; "required": false; }; "customText": { "alias": "customText"; "required": false; }; "showText": { "alias": "showText"; "required": false; }; "size": { "alias": "size"; "required": false; }; "autoLoop": { "alias": "autoLoop"; "required": false; }; "loopDuration": { "alias": "loopDuration"; "required": false; }; "customTexts": { "alias": "customTexts"; "required": false; }; "completeOnDone": { "alias": "completeOnDone"; "required": false; }; }, {}, never, never, true, never>;
86
+ static ɵcmp: i0.ɵɵComponentDeclaration<LoaderComponent, "al-loader", never, { "dataTestId": { "alias": "dataTestId"; "required": false; }; "status": { "alias": "status"; "required": false; }; "customText": { "alias": "customText"; "required": false; }; "showText": { "alias": "showText"; "required": false; }; "size": { "alias": "size"; "required": false; }; "autoLoop": { "alias": "autoLoop"; "required": false; }; "loopDuration": { "alias": "loopDuration"; "required": false; }; "customTexts": { "alias": "customTexts"; "required": false; }; "completeOnDone": { "alias": "completeOnDone"; "required": false; }; }, { "completed": "completed"; }, never, never, true, never>;
82
87
  }
@@ -10,6 +10,8 @@ export declare class NewResumeHeaderComponent implements OnInit, OnDestroy, Afte
10
10
  title: string;
11
11
  showHeaderCheckbox: boolean;
12
12
  showEyeIcon: boolean;
13
+ showMenuTrigger: boolean;
14
+ showHeaderButtons: boolean;
13
15
  headerCheckboxChecked: boolean;
14
16
  configEyeToggle: EyeIconConfig[];
15
17
  hiddenSection: {
@@ -163,5 +165,5 @@ export declare class NewResumeHeaderComponent implements OnInit, OnDestroy, Afte
163
165
  ngAfterViewInit(): void;
164
166
  ngOnDestroy(): void;
165
167
  static ɵfac: i0.ɵɵFactoryDeclaration<NewResumeHeaderComponent, never>;
166
- static ɵcmp: i0.ɵɵComponentDeclaration<NewResumeHeaderComponent, "al-newresumeheader", never, { "title": { "alias": "title"; "required": false; }; "showHeaderCheckbox": { "alias": "showHeaderCheckbox"; "required": false; }; "showEyeIcon": { "alias": "showEyeIcon"; "required": false; }; "headerCheckboxChecked": { "alias": "headerCheckboxChecked"; "required": false; }; "configEyeToggle": { "alias": "configEyeToggle"; "required": false; }; "hiddenSection": { "alias": "hiddenSection"; "required": false; }; "buttonConfig": { "alias": "buttonConfig"; "required": false; }; "isLargeScreen": { "alias": "isLargeScreen"; "required": false; }; "popOutButtonLabel": { "alias": "popOutButtonLabel"; "required": false; }; "popOutButtonIcon": { "alias": "popOutButtonIcon"; "required": false; }; "popOutButtonTooltip": { "alias": "popOutButtonTooltip"; "required": false; }; "popOutButtonTooltipPosition": { "alias": "popOutButtonTooltipPosition"; "required": false; }; "showPopOutPanel": { "alias": "showPopOutPanel"; "required": false; }; "popOutMessage": { "alias": "popOutMessage"; "required": false; }; "dataTestId": { "alias": "dataTestId"; "required": false; }; "fieldVisibility": { "alias": "fieldVisibility"; "required": false; }; "index": { "alias": "index"; "required": false; }; "showBottomBorder": { "alias": "showBottomBorder"; "required": false; }; "borderColor": { "alias": "borderColor"; "required": false; }; }, { "titleChange": "titleChange"; "sectionToggled": "sectionToggled"; "headerCheckboxChange": "headerCheckboxChange"; "showHideToggleSection": "showHideToggleSection"; "buttonClicked": "buttonClicked"; "popOutButtonClick": "popOutButtonClick"; }, never, ["[header-left]", "[header-center-left]", "[header-center-center]", "[header-center-right]", "[header-right]", "[header-left]", "[header-center-right]", "[header-right]", "*"], true, never>;
168
+ static ɵcmp: i0.ɵɵComponentDeclaration<NewResumeHeaderComponent, "al-newresumeheader", never, { "title": { "alias": "title"; "required": false; }; "showHeaderCheckbox": { "alias": "showHeaderCheckbox"; "required": false; }; "showEyeIcon": { "alias": "showEyeIcon"; "required": false; }; "showMenuTrigger": { "alias": "showMenuTrigger"; "required": false; }; "showHeaderButtons": { "alias": "showHeaderButtons"; "required": false; }; "headerCheckboxChecked": { "alias": "headerCheckboxChecked"; "required": false; }; "configEyeToggle": { "alias": "configEyeToggle"; "required": false; }; "hiddenSection": { "alias": "hiddenSection"; "required": false; }; "buttonConfig": { "alias": "buttonConfig"; "required": false; }; "isLargeScreen": { "alias": "isLargeScreen"; "required": false; }; "popOutButtonLabel": { "alias": "popOutButtonLabel"; "required": false; }; "popOutButtonIcon": { "alias": "popOutButtonIcon"; "required": false; }; "popOutButtonTooltip": { "alias": "popOutButtonTooltip"; "required": false; }; "popOutButtonTooltipPosition": { "alias": "popOutButtonTooltipPosition"; "required": false; }; "showPopOutPanel": { "alias": "showPopOutPanel"; "required": false; }; "popOutMessage": { "alias": "popOutMessage"; "required": false; }; "dataTestId": { "alias": "dataTestId"; "required": false; }; "fieldVisibility": { "alias": "fieldVisibility"; "required": false; }; "index": { "alias": "index"; "required": false; }; "showBottomBorder": { "alias": "showBottomBorder"; "required": false; }; "borderColor": { "alias": "borderColor"; "required": false; }; }, { "titleChange": "titleChange"; "sectionToggled": "sectionToggled"; "headerCheckboxChange": "headerCheckboxChange"; "showHideToggleSection": "showHideToggleSection"; "buttonClicked": "buttonClicked"; "popOutButtonClick": "popOutButtonClick"; }, never, ["[header-left]", "[header-center-left]", "[header-center-center]", "[header-center-right]", "[header-right]", "[header-left]", "[header-center-right]", "[header-right]", "*"], true, never>;
167
169
  }
@@ -4,7 +4,9 @@ export interface ToggleButton {
4
4
  id: string;
5
5
  label?: string;
6
6
  icon?: string;
7
+ fontSet?: string;
7
8
  disabled?: boolean;
9
+ tooltip?: string;
8
10
  dataTestId?: string;
9
11
  }
10
12
  export declare class ToggleButtonsComponent {
@@ -0,0 +1,22 @@
1
+ import { AnimationTriggerMetadata } from '@angular/animations';
2
+ /**
3
+ * Expand and collapse animation for accordion content
4
+ * Animates height from 0 to auto with overflow handling
5
+ * Similar to jQuery animate({ height: auto }) behavior
6
+ */
7
+ export declare const expandCollapse: AnimationTriggerMetadata;
8
+ /**
9
+ * Fade animation for showing/hiding content with opacity changes
10
+ * Used when toggling visibility via eye icon
11
+ */
12
+ export declare const fadeInOut: AnimationTriggerMetadata;
13
+ /**
14
+ * Simple slide down animation (height only, no opacity)
15
+ * Alternative animation for simpler expand/collapse
16
+ */
17
+ export declare const slideDown: AnimationTriggerMetadata;
18
+ /**
19
+ * Fade only animation (opacity only, no height changes)
20
+ * Used for subtle show/hide effects
21
+ */
22
+ export declare const fadeOnly: AnimationTriggerMetadata;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allsorter/ui-components",
3
- "version": "0.0.406",
3
+ "version": "0.0.410",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.0.0",
6
6
  "@angular/core": "^18.0.0",
@@ -458,6 +458,7 @@ mat-icon.mat-icon {
458
458
  align-items: center !important;
459
459
  justify-content: center !important;
460
460
  flex-shrink: 0;
461
+ cursor: pointer;
461
462
  }
462
463
 
463
464
  /* Ensure SVG icons inherit button text color for proper visibility */
@@ -4,28 +4,28 @@
4
4
  <div class="container" data-test-id="candidate-section-name-container"
5
5
  [style.opacity]="candidate_name ? '1' : '0.3'"><lib-field-placeholder icon="candidate_name"
6
6
  [value]="candidateDetails?.firstName && candidateDetails?.lastName ? candidateDetails?.firstName + ' ' + candidateDetails?.lastName : candidateDetails?.firstName || candidateDetails?.lastName"
7
- [placeholder]="'Name'" [tooltip]="candidateDetails?.firstName + ' ' + candidateDetails?.lastName"
8
- tooltipPosition="right" [testId]="'candidate-section-name'" [valueClass]="'typo-description'"
7
+ [placeholder]="'Name'"
8
+ [testId]="'candidate-section-name'" [valueClass]="'typo-description'"
9
9
  [compact]="true"></lib-field-placeholder></div>
10
10
  <div class="container" data-test-id="candidate-section-gender-container"
11
11
  [style.opacity]="candidate_gender ? '1' : '0.3'"><lib-field-placeholder icon="candidate_gender"
12
12
  [value]="candidateDetails?.userAssignedGender" [placeholder]="'Gender'"
13
- [tooltip]="candidateDetails?.userAssignedGender" tooltipPosition="right" [testId]="'candidate-section-gender'"
13
+ [testId]="'candidate-section-gender'"
14
14
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
15
15
  <div class="container" data-test-id="candidate-section-phone-container"
16
16
  [style.opacity]="candidate_phonenumber ? '1' : '0.3'"><lib-field-placeholder
17
17
  icon="candidate_phonenumber" [value]="candidateDetails?.phoneNumber" [placeholder]="'Phone Number'"
18
- [tooltip]="candidateDetails?.phoneNumber" tooltipPosition="right" [testId]="'candidate-section-phone'"
18
+ [testId]="'candidate-section-phone'"
19
19
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
20
20
  <div class="container" data-test-id="candidate-section-email-container"
21
21
  [style.opacity]="candidate_email ? '1' : '0.3'"><lib-field-placeholder icon="candidate_email"
22
22
  [value]="candidateDetails?.emailAddress" [placeholder]="'Email Address'"
23
- [tooltip]="candidateDetails?.emailAddress" tooltipPosition="right" [testId]="'candidate-section-email'"
23
+ [testId]="'candidate-section-email'"
24
24
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
25
25
  <div class="container" data-test-id="candidate-section-linkedin-container"
26
26
  [style.opacity]="candidate_linkedin ? '1' : '0.3'"><lib-field-placeholder
27
27
  icon="candidate_linkedin" iconAlt="LinkedIn" [value]="candidateDetails?.linkedin" [placeholder]="'LinkedIn'"
28
- [tooltip]="candidateDetails?.linkedin" tooltipPosition="right" [testId]="'candidate-section-linkedin'"
28
+ [testId]="'candidate-section-linkedin'"
29
29
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
30
30
  </div>
31
31
  <div class="column second-column">
@@ -33,28 +33,26 @@
33
33
  [style.opacity]="candidate_address ? '1' : '0.3'">
34
34
  <div [style.opacity]="addressStreet ? '1' : '0.3'"><lib-field-placeholder
35
35
  icon="candidate_address" [value]="candidateDetails?.street" [placeholder]="'Street'"
36
- [tooltip]="candidateDetails?.street" tooltipPosition="right" [testId]="'candidate-section-address-street'"
36
+ [testId]="'candidate-section-address-street'"
37
37
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
38
38
  <div [style.opacity]="addressCity ? '1' : '0.3'"><lib-field-placeholder icon="no-icon"
39
- [value]="candidateDetails?.city" [placeholder]="'City'" [tooltip]="candidateDetails?.city"
40
- tooltipPosition="right" [testId]="'candidate-section-address-city'" [valueClass]="'typo-description'"
39
+ [value]="candidateDetails?.city" [placeholder]="'City'"
40
+ [testId]="'candidate-section-address-city'" [valueClass]="'typo-description'"
41
41
  [compact]="true"></lib-field-placeholder></div>
42
42
  <div [style.opacity]="addressRegion ? '1' : '0.3'"><lib-field-placeholder
43
43
  icon="no-icon" [value]="candidateDetails?.region" [placeholder]="'Region'"
44
- [tooltip]="candidateDetails?.region" tooltipPosition="right" [testId]="'candidate-section-address-region'"
44
+ [testId]="'candidate-section-address-region'"
45
45
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
46
46
  <div [style.opacity]="addressRegionCode ? '1' : '0.3'"><lib-field-placeholder
47
47
  [value]="candidateDetails?.regionCode" [placeholder]="'Region Code'" icon="no-icon"
48
- [tooltip]="candidateDetails?.regionCode" tooltipPosition="right"
49
48
  [testId]="'candidate-section-address-region-code'" [valueClass]="'typo-description'"
50
49
  [compact]="true"></lib-field-placeholder></div>
51
50
  <div [style.opacity]="addressCountry ? '1' : '0.3'"><lib-field-placeholder
52
51
  icon="no-icon" [value]="candidateDetails?.country" [placeholder]="'Country'"
53
- [tooltip]="candidateDetails?.country" tooltipPosition="right" [testId]="'candidate-section-address-country'"
52
+ [testId]="'candidate-section-address-country'"
54
53
  [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
55
54
  <div [style.opacity]="addressPostCode ? '1' : '0.3'"><lib-field-placeholder
56
55
  icon="no-icon" [value]="candidateDetails?.postCode" [placeholder]="'Post Code'"
57
- [tooltip]="candidateDetails?.postCode" tooltipPosition="right"
58
56
  [testId]="'candidate-section-address-post-code'" [valueClass]="'typo-description'"
59
57
  [compact]="true"></lib-field-placeholder></div>
60
58
  </div>
@@ -66,8 +64,7 @@
66
64
  <lib-field-placeholder icon="candidate_most_recent"
67
65
  [value]="(getCurrentJob() || getCurrentEmployer()) ? 'Most Recently : <span class=\'most-recent-inline\'>' + (getCurrentJob() ? '<span class=\'total-exp-value\'>' + getCurrentJob() + '</span>' : '') + (getCurrentEmployer() ? (getCurrentJob() ? ' at <span class=\'total-exp-value\'>' + getCurrentEmployer() + '</span>' : '<span class=\'total-exp-value\'>' + getCurrentEmployer() + '</span>') : '') + '</span>' : ''"
68
66
  [placeholder]="'Current Job'"
69
- [tooltip]="(getCurrentJob() || getCurrentEmployer()) ? 'Most Recently : ' + getCurrentJob() + (getCurrentEmployer() ? ' at ' + getCurrentEmployer() : '') : 'Current Job'"
70
- tooltipPosition="right" [testId]="'candidate-section-current-job'" [valueClass]="'typo-description'"
67
+ [testId]="'candidate-section-current-job'" [valueClass]="'typo-description'"
71
68
  [compact]="true"></lib-field-placeholder>
72
69
  <div class="most-recent-details">
73
70
  <div class="current-job-title" *ngIf="getCurrentJob()">{{getCurrentJob()}}</div>
@@ -80,8 +77,7 @@
80
77
  icon="candidate_experience"
81
78
  [value]="getTotalExpYears() ? 'Total Exp - <span class=\'total-exp-value\'>' + getTotalExpYears() + '</span> yrs' : ''"
82
79
  [placeholder]="'Total Exp'"
83
- [tooltip]="getTotalExpYears() ? 'Total Exp - ' + getTotalExpYears() + ' yrs' : 'Total Exp'"
84
- tooltipPosition="right" [testId]="'candidate-section-total-exp-value'" [valueClass]="'typo-description'"
80
+ [testId]="'candidate-section-total-exp-value'" [valueClass]="'typo-description'"
85
81
  [compact]="true"></lib-field-placeholder></div>
86
82
  </div>
87
83
  </div>
@@ -4,6 +4,7 @@
4
4
  display: flex;
5
5
  flex-direction: row;
6
6
  gap: 16px;
7
+ cursor: pointer;
7
8
  }
8
9
 
9
10
  .columns-wrapper {
@@ -382,7 +382,7 @@
382
382
  }
383
383
 
384
384
  p {
385
- margin: 0 0 12px 0;
385
+ margin: 0 0 0px 0;
386
386
 
387
387
  &:last-child {
388
388
  margin-bottom: 0;
@@ -1,12 +1,5 @@
1
1
  <div class="al-form-wrapper" #wrapper [attr.data-test-id]="testId">
2
2
  <div *ngIf="showLeftButton" #leftButton class="fab left">
3
- <!-- <al-button [buttonType]="'icon-circle'" [iconOnly]="true"
4
- [leftIcon]="isLeftButtonActive ? 'close' : 'auto_fix_high'"
5
- [arialabel]="isLeftButtonActive ? 'Close' : 'Edit'"
6
- [size]="'base'"
7
- [color]="isLeftButtonActive ? 'grey' : 'gradient'"
8
- (onClick)="handleLeftButtonClick($event)">
9
- </al-button> -->
10
3
  <div
11
4
  class="left-button-container"
12
5
  [ngClass]="leftContainerClass"
@@ -54,6 +54,8 @@
54
54
  /* Enable container queries for responsive layout based on container size */
55
55
  container-type: inline-size;
56
56
  container-name: form-wrapper;
57
+ /* Isolate layout calculations to prevent FABs from causing parent reflow */
58
+ contain: layout style;
57
59
  }
58
60
 
59
61
  /* Subtle outer rounded border (like a frame) */
@@ -195,19 +197,28 @@ select.al-form__control {
195
197
  position: absolute;
196
198
  left: -27px;
197
199
  /* intended design: slightly outside the inner frame */
198
- top: 0;
199
- /* Changed from top: 50% to top: 0, transform will be handled by JS */
200
+ top: 36px;
201
+ /* Start at clampPadding position to minimize jump */
200
202
  z-index: 10;
201
203
  background-color: #fff;
202
204
  border-radius: 50%;
203
205
  will-change: transform;
204
206
  /* Optimize for smooth scrolling */
205
207
  transition: transform 0.1s ease-out;
208
+ opacity: 0;
209
+ /* Start hidden, shown after positioning */
210
+ /* Match height with right button group (2 buttons + 8px gap = ~88px) */
211
+ height: 88px;
212
+ display: flex;
213
+ align-items: center;
214
+ /* Center the inner button container */
206
215
 
207
216
  .left-button-container {
208
217
  position: absolute;
209
218
  left: 56px;
210
- top: 0;
219
+ /* Vertically centered by flexbox on parent */
220
+ top: 50%;
221
+ transform: translateY(-50%);
211
222
  z-index: 1;
212
223
  pointer-events: auto;
213
224
  }
@@ -217,8 +228,8 @@ select.al-form__control {
217
228
  position: absolute;
218
229
  right: -16px;
219
230
  /* slightly outside the inner frame */
220
- top: 0;
221
- /* Changed from top: 50% to top: 0, transform will be handled by JS */
231
+ top: 36px;
232
+ /* Start at clampPadding position to minimize jump */
222
233
  display: flex;
223
234
  flex-direction: column;
224
235
  border-radius: 50%;
@@ -228,6 +239,16 @@ select.al-form__control {
228
239
  will-change: transform;
229
240
  /* Optimize for smooth scrolling */
230
241
  transition: transform 0.1s ease-out;
242
+ opacity: 0;
243
+ /* Start hidden, shown after positioning */
244
+ /* Fixed height to match left button (2 buttons + 8px gap) */
245
+ height: 82px;
246
+ }
247
+
248
+ /* When buttons are positioned, show them */
249
+ .fab.left.positioned,
250
+ .fab-group.right.positioned {
251
+ opacity: 1;
231
252
  }
232
253
 
233
254
  /* Add gap between form rows (app-flex-grid elements) */
@@ -294,4 +315,21 @@ select.al-form__control {
294
315
  :host ::ng-deep app-flex-grid.row.min-cols-2 > *:nth-child(3):last-child { order: 2; } /* End Date middle */
295
316
  }
296
317
 
318
+ /* Fade-in animation for FABs on initial render */
319
+ @keyframes fadeIn {
320
+ from {
321
+ opacity: 0;
322
+ }
323
+ to {
324
+ opacity: 1;
325
+ }
326
+ }
327
+
328
+ /* Apply fade-in animation to left and right FABs */
329
+ .fab.left,
330
+ .fab-group.right {
331
+ opacity: 0;
332
+ animation: fadeIn 1s ease-out forwards;
333
+ }
334
+
297
335
  /* Remove special outline/background styles so buttons render as-is */
@@ -80,10 +80,9 @@
80
80
  }
81
81
 
82
82
 
83
- .value-text {
84
- color: $color-grey-600 !important;
85
- }
86
-
83
+ // .value-text {
84
+ // color: $color-grey-600 !important;
85
+ // }
87
86
  // Apply collapsed styles when .collapsed is anywhere in parent hierarchy
88
87
  .collapsed .value-text {
89
88
  display: -webkit-box !important;
@@ -93,4 +92,4 @@
93
92
  overflow: hidden !important;
94
93
  text-overflow: ellipsis !important;
95
94
  white-space: normal !important;
96
- }
95
+ }
@@ -420,6 +420,7 @@
420
420
  display: flex !important;
421
421
  align-items: center !important;
422
422
  justify-content: center !important;
423
+ cursor: pointer;
423
424
  }
424
425
 
425
426
  /* Icon sizing by size category */
@@ -498,6 +499,7 @@ mat-icon[matSuffix] {
498
499
  display: flex;
499
500
  align-items: center;
500
501
  justify-content: center;
502
+ cursor: pointer;
501
503
  }
502
504
 
503
505
  /* ===== FLOATING LABEL POSITIONING ===== */
@@ -1,15 +1,15 @@
1
1
  <div class="loader-container" [attr.data-testid]="effectiveDataTestId">
2
2
  <!-- Brain Icon -->
3
- <mat-icon class="loader-icon font-icon icon-brain" fontSet="material-icons">psychology</mat-icon>
3
+ <mat-icon class="loader-icon font-icon icon-brain" fontSet="material-symbols-outlined">network_intelligence</mat-icon>
4
4
  <!-- Settings/Gear Icon -->
5
5
  <mat-icon class="loader-icon font-icon icon-cog" fontSet="material-icons-outlined">settings</mat-icon>
6
6
  <!-- Document Icon -->
7
- <mat-icon class="loader-icon font-icon icon-document" fontSet="material-icons">article</mat-icon>
7
+ <mat-icon class="loader-icon font-icon icon-document" fontSet="material-icons-outlined">article</mat-icon>
8
8
  <!-- Wand Icon -->
9
- <mat-icon class="loader-icon font-icon icon-wand" fontSet="material-icons">auto_awesome</mat-icon>
9
+ <mat-icon class="loader-icon font-icon icon-wand" fontSet="material-icons-outlined">auto_awesome</mat-icon>
10
10
  <!-- Settings Icon -->
11
- <mat-icon class="loader-icon font-icon icon-tick" fontSet="material-icons">build</mat-icon>
11
+ <mat-icon class="loader-icon font-icon icon-tick" fontSet="material-icons-outlined">done</mat-icon>
12
12
  </div>
13
13
  <div class="text-container" *ngIf="showText">
14
14
  <span class="loader-text">{{ displayText }}</span>
15
- </div>
15
+ </div>
@@ -1,4 +1,5 @@
1
1
  @import url("https://fonts.googleapis.com/icon?family=Material+Icons|Material+Icons+Outlined");
2
+ @import url("https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&icon_names=network_intelligence");
2
3
 
3
4
  :host {
4
5
  display: flex;
@@ -28,7 +29,7 @@
28
29
 
29
30
  .text-container {
30
31
  position: relative;
31
- margin-top: 8px;
32
+ margin-top: 4px;
32
33
  }
33
34
 
34
35
  .loader-text {
@@ -56,6 +57,28 @@ mat-icon.loader-icon {
56
57
  justify-content: center;
57
58
  }
58
59
 
60
+ /* Ensure icon-tick renders at correct size when using material-icons fontSet */
61
+ :host(.size-medium) .icon-tick[fontSet="material-icons"] {
62
+ font-size: 72px !important;
63
+ width: 72px !important;
64
+ height: 72px !important;
65
+ line-height: 72px !important;
66
+ }
67
+
68
+ :host(.size-small) .icon-tick[fontSet="material-icons"] {
69
+ font-size: 48px !important;
70
+ width: 48px !important;
71
+ height: 48px !important;
72
+ line-height: 48px !important;
73
+ }
74
+
75
+ :host(.size-large) .icon-tick[fontSet="material-icons"] {
76
+ font-size: 108px !important;
77
+ width: 108px !important;
78
+ height: 108px !important;
79
+ line-height: 108px !important;
80
+ }
81
+
59
82
  /* Size variations */
60
83
  :host(.size-small) {
61
84
  .loader-container {
@@ -86,11 +109,11 @@ mat-icon.loader-icon {
86
109
  }
87
110
 
88
111
  .font-icon {
89
- font-size: 72px;
112
+ font-size: 72px !important;
90
113
  }
91
114
 
92
115
  mat-icon.loader-icon {
93
- font-size: 72px;
116
+ font-size: 72px !important;
94
117
  width: 72px;
95
118
  height: 72px;
96
119
  }
@@ -453,41 +476,41 @@ mat-icon.loader-icon {
453
476
  /* --- Looping Mode: Enhanced animations with enter/exit transitions --- */
454
477
  /* These are triggered when autoLoop is enabled */
455
478
  :host(.auto-loop.status-analyzing) .icon-brain {
456
- animation: animate-brain 3s ease-in-out;
479
+ animation: animate-brain 2s ease-in-out;
457
480
  }
458
481
 
459
482
  :host(.auto-loop.status-analyzing) .loader-text {
460
- animation: animate-text 3s ease-in-out;
483
+ animation: animate-text 2s ease-in-out;
461
484
  }
462
485
 
463
486
  :host(.auto-loop.status-gathering) .icon-cog {
464
- animation: animate-cog 3s ease-in-out;
487
+ animation: animate-cog 2s ease-in-out;
465
488
  }
466
489
 
467
490
  :host(.auto-loop.status-gathering) .loader-text {
468
- animation: animate-text 3s ease-in-out;
491
+ animation: animate-text 2s ease-in-out;
469
492
  }
470
493
 
471
494
  :host(.auto-loop.status-processing) .icon-document {
472
- animation: animate-document 3s ease-in-out;
495
+ animation: animate-document 2s ease-in-out;
473
496
  }
474
497
 
475
498
  :host(.auto-loop.status-processing) .loader-text {
476
- animation: animate-text 3s ease-in-out;
499
+ animation: animate-text 2s ease-in-out;
477
500
  }
478
501
 
479
502
  :host(.auto-loop.status-applying) .icon-wand {
480
- animation: animate-wand 3s ease-in-out;
503
+ animation: animate-wand 2s ease-in-out;
481
504
  }
482
505
 
483
506
  :host(.auto-loop.status-applying) .loader-text {
484
- animation: animate-text 3s ease-in-out;
507
+ animation: animate-text 2s ease-in-out;
485
508
  }
486
509
 
487
510
  :host(.auto-loop.status-done) .icon-tick {
488
- animation: animate-tick 3s ease-in-out;
511
+ animation: animate-tick 2s ease-in-out;
489
512
  }
490
513
 
491
514
  :host(.auto-loop.status-done) .loader-text {
492
- animation: animate-text 3s ease-in-out;
515
+ animation: animate-text 2s ease-in-out;
493
516
  }
@@ -46,10 +46,10 @@
46
46
  </div>
47
47
  <div center><ng-content select="[header-center-center]"></ng-content>
48
48
  <!-- Header buttons for large screens (including Deep Extraction via buttonConfig) --><ng-container
49
- *ngIf="isLargeScreen"><ng-container
49
+ *ngIf="isLargeScreen && showHeaderButtons"><ng-container
50
50
  *ngTemplateOutlet="headerButtonsTemplate; context: { buttons: buttonConfig }"></ng-container></ng-container>
51
51
  <!-- Menu trigger and slide-out panel for small screens only -->
52
- <div class="hover-menu-container" *ngIf="!isLargeScreen">
52
+ <div class="hover-menu-container" *ngIf="!isLargeScreen && showMenuTrigger && showHeaderButtons">
53
53
  <div class="menu-trigger" (click)="toggleMenu()"><al-button buttonType="icon-label" iconOnly
54
54
  size="header" category="grey" leftIcon="more_vert" aria-label="More options"
55
55
  [dataTestId]="'resume-header-more-menu'"></al-button></div>
@@ -103,7 +103,9 @@
103
103
  </div>
104
104
  <!-- Accordion body with expand/collapse animation -->
105
105
  <div class="example-accordion-item-body-wrapper">
106
- <div class="example-accordion-item-body" *ngIf="accordionItem.expanded && !isSectionHidden">
106
+ <div class="example-accordion-item-body"
107
+ *ngIf="accordionItem.expanded && !isSectionHidden"
108
+ [@expandCollapse]>
107
109
  <!-- Pop-out Panel -->
108
110
  <div *ngIf="shouldShowPopOut" #popOutPanel class="pop-out-panel"
109
111
  [ngClass]="{'pop-out-narrow': isPopOutNarrow}">
@@ -162,6 +162,7 @@
162
162
  border-bottom: 2px solid #37c1ce;
163
163
  border-radius: 8px;
164
164
  box-sizing: border-box;
165
+ margin-top: 16px !important;
165
166
 
166
167
  /**
167
168
  * When the Deep Extraction pop-out panel is NOT shown (showPopOutPanel === false),
@@ -171,7 +172,11 @@
171
172
  */
172
173
  &.header-with-bottom-margin {
173
174
  margin-bottom: 16px;
175
+
176
+
174
177
  }
178
+
179
+
175
180
  }
176
181
 
177
182
 
@@ -666,4 +671,4 @@
666
671
  // position: relative;
667
672
  // z-index: 1;
668
673
  // }
669
- // }
674
+ // }
@@ -52,10 +52,13 @@
52
52
  <lib-field-placeholder [value]="entry.city" [placeholder]="'City'" valueClass="font-location-text"
53
53
  [testId]="'entry-' + i + '-city'" [compact]="true"
54
54
  [tooltip]="locationTooltip" [tooltipPosition]="tooltipPosition"></lib-field-placeholder>
55
+ <span class="location-comma">,</span>
55
56
  <lib-field-placeholder [value]="entry.region" [placeholder]="'Region'" valueClass="font-location-text"
56
57
  [testId]="'entry-' + i + '-region'" [compact]="true"
57
58
  [tooltip]="locationTooltip" [tooltipPosition]="tooltipPosition"></lib-field-placeholder>
58
- <lib-field-placeholder [value]="entry.country" [placeholder]="'Country'" valueClass="font-location-text"
59
+ <span class="location-comma">,</span>
60
+ <lib-field-placeholder [value]="entry.country" [placeholder]="'Country'"
61
+ valueClass="font-location-text"
59
62
  [testId]="'entry-' + i + '-country'" [compact]="true"
60
63
  [tooltip]="locationTooltip" [tooltipPosition]="tooltipPosition"></lib-field-placeholder>
61
64
  </div>
@@ -350,15 +350,23 @@
350
350
  flex-direction: column;
351
351
  gap: 4px;
352
352
 
353
+ ::ng-deep .value-text {
354
+ color: #717793;
355
+ }
356
+
357
+ // ::ng-deep .placeholder-text {
358
+ // color: #717793;
359
+ // }
360
+
353
361
  &.collapsed .value-text {
354
- display: -webkit-box !important;
355
- -webkit-line-clamp: 1 !important;
356
- line-clamp: 1 !important;
357
- -webkit-box-orient: vertical !important;
358
- overflow: hidden !important;
359
- text-overflow: ellipsis !important;
360
- white-space: normal !important;
361
- }
362
+ display: -webkit-box !important;
363
+ -webkit-line-clamp: 1 !important;
364
+ line-clamp: 1 !important;
365
+ -webkit-box-orient: vertical !important;
366
+ overflow: hidden !important;
367
+ text-overflow: ellipsis !important;
368
+ white-space: normal !important;
369
+ }
362
370
 
363
371
  }
364
372
 
@@ -397,8 +405,8 @@
397
405
  display: flex;
398
406
  justify-content: center;
399
407
  align-items: center;
400
- padding: 24px 0;
401
- min-height: 80px;
408
+ // padding: 24px 0;
409
+ // min-height: 80px;
402
410
  }
403
411
 
404
412
  .entry-loader-container {
@@ -435,7 +443,7 @@
435
443
  font-style: normal;
436
444
  letter-spacing: 0.15px;
437
445
  font-family: Roboto, sans-serif;
438
- color: #717793;
446
+ color: #717793 !important;
439
447
  }
440
448
 
441
449
  p,
@@ -1,4 +1,4 @@
1
- <mat-tab-group [selectedIndex]="selectedIndex" [class]="'tabs-' + size" mat-align-tabs="start" headerPosition="above">
1
+ <mat-tab-group [selectedIndex]="selectedIndex" [class]="'tabs-' + size" mat-align-tabs="start" headerPosition="above" animationDuration="0ms">
2
2
  <mat-tab *ngFor="let tab of tabComponents; let i = index">
3
3
  <ng-template mat-tab-label>
4
4
  <span [ngClass]="{ 'tab-label-content': true, 'icon-only-tab': tab.icon && tab.showIcon && !tab.labelText }"