@allsorter/ui-components 0.0.367 → 0.0.370

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 (124) hide show
  1. package/fesm2022/allsorter-ui-components.mjs +2996 -1391
  2. package/fesm2022/allsorter-ui-components.mjs.map +1 -1
  3. package/images/Column left.svg +5 -0
  4. package/images/Move.svg +8 -0
  5. package/images/Success.svg +5 -0
  6. package/images/Table.svg +3 -0
  7. package/images/Vector-1.svg +3 -0
  8. package/images/Vector.svg +3 -0
  9. package/images/add-teble.svg +6 -0
  10. package/images/arrow_downward.svg +3 -0
  11. package/images/calendar_year.svg +4 -0
  12. package/images/column right.svg +5 -0
  13. package/images/delete -table.svg +6 -0
  14. package/images/delete row.svg +10 -0
  15. package/images/delete-column.svg +10 -0
  16. package/images/delete.svg +3 -0
  17. package/images/drag-drop-icon.svg +8 -0
  18. package/images/edit.svg +3 -0
  19. package/images/error.svg +5 -0
  20. package/images/row bottom.svg +5 -0
  21. package/images/row top.svg +5 -0
  22. package/images/search.svg +3 -0
  23. package/images/subrole.svg +3 -0
  24. package/images/visibility_off.svg +3 -0
  25. package/images/warning.svg +5 -0
  26. package/lib/app-toolbar/app-toolbar.component.d.ts +5 -8
  27. package/lib/app-toolbar/app-toolbar.module.d.ts +4 -4
  28. package/lib/app-toolbar-right/app-toolbar-right.component.d.ts +3 -5
  29. package/lib/button/button.component.d.ts +30 -1
  30. package/lib/candidate-section/candidate-section.component.d.ts +8 -0
  31. package/lib/custom-editor/custom-editor.component.d.ts +110 -14
  32. package/lib/custom-editor/table/table.component.d.ts +5 -0
  33. package/lib/editable-form-wrapper/editable-form-wrapper.component.d.ts +48 -0
  34. package/lib/experience-section/experience-section.component.d.ts +4 -2
  35. package/lib/general-container/general-container.component.d.ts +5 -1
  36. package/lib/icon-button/icon-button.component.d.ts +16 -7
  37. package/lib/input/input.component.d.ts +41 -10
  38. package/lib/newresumeheader/newresumeheader.component.d.ts +43 -4
  39. package/lib/resume-entries/resume-entries.component.d.ts +7 -1
  40. package/lib/resume-header/resume-header.model.d.ts +11 -20
  41. package/lib/shared-popup-modal/shared-popup-modal.component.d.ts +17 -0
  42. package/lib/side-action-bar-wrapper/side-action-bar-wrapper.component.d.ts +34 -0
  43. package/lib/side-action-bar-wrapper/side-action-bar-wrapper.module.d.ts +12 -0
  44. package/lib/styles/border-radius.scss +11 -0
  45. package/lib/styles/button-mixins.scss +41 -0
  46. package/lib/styles/button.scss +117 -0
  47. package/lib/styles/colors.scss +221 -0
  48. package/lib/styles/elevation.scss +46 -0
  49. package/lib/styles/new-typography.scss +202 -0
  50. package/lib/styles/spacing.scss +39 -0
  51. package/lib/styles/typography-classes.scss +203 -0
  52. package/lib/utils/icon-utils.d.ts +51 -0
  53. package/lib/utils/image-utils.d.ts +54 -0
  54. package/package.json +15 -3
  55. package/public-api.d.ts +3 -3
  56. package/src/lib/ai-apply-bar/ai-apply-bar.component.html +43 -0
  57. package/src/lib/ai-apply-bar/ai-apply-bar.component.scss +182 -0
  58. package/src/lib/app-toolbar/app-toolbar.component.html +13 -0
  59. package/src/lib/app-toolbar/app-toolbar.component.scss +141 -0
  60. package/src/lib/app-toolbar-right/app-toolbar-right.component.html +15 -0
  61. package/src/lib/app-toolbar-right/app-toolbar-right.component.scss +294 -0
  62. package/src/lib/button/button.component.html +127 -0
  63. package/src/lib/button/button.component.scss +1238 -0
  64. package/src/lib/candidate-section/candidate-section.component.html +91 -0
  65. package/src/lib/candidate-section/candidate-section.component.scss +154 -0
  66. package/src/lib/checkbox/checkbox.component.html +24 -0
  67. package/src/lib/checkbox/checkbox.component.scss +280 -0
  68. package/src/lib/custom-editor/custom-editor.component.html +129 -0
  69. package/src/lib/custom-editor/custom-editor.component.scss +441 -0
  70. package/src/lib/custom-editor/table/table.component.html +21 -0
  71. package/src/lib/date-range/date-range.component.html +33 -0
  72. package/src/lib/date-range/date-range.component.scss +284 -0
  73. package/src/lib/editable-form-wrapper/editable-form-wrapper.component.html +12 -0
  74. package/src/lib/editable-form-wrapper/editable-form-wrapper.component.scss +227 -0
  75. package/src/lib/experience-section/experience-section.component.html +20 -0
  76. package/src/lib/experience-section/experience-section.component.scss +0 -0
  77. package/src/lib/field-placeholder/field-placeholder.component.html +17 -0
  78. package/src/lib/field-placeholder/field-placeholder.component.scss +119 -0
  79. package/src/lib/general-container/general-container.component.html +3 -0
  80. package/src/lib/general-container/general-container.component.scss +10 -0
  81. package/src/lib/icon-button/icon-button.component.html +12 -0
  82. package/src/lib/icon-button/icon-button.component.scss +77 -0
  83. package/src/lib/input/input.component.html +86 -0
  84. package/src/lib/input/input.component.scss +1337 -0
  85. package/src/lib/loader/loader.component.html +15 -0
  86. package/src/lib/loader/loader.component.scss +493 -0
  87. package/src/lib/new-typography/new-typography.component.html +10 -0
  88. package/src/lib/new-typography/new-typography.component.scss +200 -0
  89. package/src/lib/newresumeheader/newresumeheader.component.html +178 -0
  90. package/src/lib/newresumeheader/newresumeheader.component.scss +530 -0
  91. package/src/lib/radio/radio.component.html +23 -0
  92. package/src/lib/radio/radio.component.scss +253 -0
  93. package/src/lib/responsive-columns/responsive-columns.component.html +6 -0
  94. package/src/lib/responsive-columns/responsive-columns.component.scss +68 -0
  95. package/src/lib/responsive-layout/responsive-layout.component.html +1 -0
  96. package/src/lib/responsive-layout/responsive-layout.component.scss +47 -0
  97. package/src/lib/resume-entries/resume-entries.component.html +97 -0
  98. package/src/lib/resume-entries/resume-entries.component.scss +341 -0
  99. package/src/lib/resume-header/resume-header.component.html +167 -0
  100. package/src/lib/shared-popup-modal/shared-popup-modal.component.html +99 -0
  101. package/src/lib/shared-popup-modal/shared-popup-modal.component.scss +223 -0
  102. package/src/lib/side-action-bar-wrapper/side-action-bar-wrapper.component.html +17 -0
  103. package/src/lib/side-action-bar-wrapper/side-action-bar-wrapper.component.scss +58 -0
  104. package/src/lib/slide-toggle/slide-toggle.component.html +17 -0
  105. package/src/lib/slide-toggle/slide-toggle.component.scss +439 -0
  106. package/src/lib/storybook/testing-strip/testing-strip.component.html +12 -0
  107. package/src/lib/storybook/testing-strip/testing-strip.component.scss +1 -0
  108. package/src/lib/styles/border-radius.scss +11 -0
  109. package/src/lib/styles/button-mixins.scss +41 -0
  110. package/src/lib/styles/button.scss +117 -0
  111. package/src/lib/styles/colors.scss +221 -0
  112. package/src/lib/styles/elevation.scss +46 -0
  113. package/src/lib/styles/new-typography.scss +202 -0
  114. package/src/lib/styles/spacing.scss +39 -0
  115. package/src/lib/styles/typography-classes.scss +203 -0
  116. package/src/lib/tabs/tabs.component.html +9 -0
  117. package/src/lib/tabs/tabs.component.scss +151 -0
  118. package/src/lib/toggle-buttons/toggle-buttons.component.html +17 -0
  119. package/src/lib/toggle-buttons/toggle-buttons.component.scss +284 -0
  120. package/src/lib/tooltip/tooltip.component.html +6 -0
  121. package/src/lib/tooltip/tooltip.component.scss +8 -0
  122. package/lib/action-bar-wrapper/action-bar-wrapper.component.d.ts +0 -36
  123. package/lib/resume-header/resume-header.component.d.ts +0 -69
  124. package/lib/resume-header/resume-header.module.d.ts +0 -8
@@ -0,0 +1,341 @@
1
+ @import "../styles/typography-classes.scss";
2
+ @import "../styles/colors.scss";
3
+ @import "../styles/border-radius.scss";
4
+
5
+ .resume-entries-container {
6
+ display: flex;
7
+ flex-direction: column;
8
+
9
+ width: 100%;
10
+ background-color: white;
11
+ }
12
+
13
+ .resume-entry {
14
+ display: flex;
15
+ flex-direction: column;
16
+ // gap: 16px;
17
+ width: 100%;
18
+ position: relative;
19
+ cursor: pointer;
20
+
21
+ &.is-hidden {
22
+ opacity: 0.3;
23
+
24
+ .description-item {
25
+ ::ng-deep .value-text {
26
+ white-space: nowrap;
27
+ overflow: hidden;
28
+ text-overflow: ellipsis;
29
+ }
30
+ }
31
+ }
32
+
33
+ &.with-timeline {
34
+ display: flex;
35
+ flex-direction: row;
36
+ flex-wrap: nowrap;
37
+ gap: 12px;
38
+ position: relative;
39
+
40
+ .entry-separator {
41
+ flex-basis: 100%;
42
+ order: 10;
43
+ }
44
+
45
+ // Ensure timeline doesn't overlap with checkbox in right column
46
+ .timeline-indicator {
47
+ z-index: 0;
48
+ }
49
+
50
+ .resume-entry-content {
51
+ flex: 1;
52
+ min-width: 0; // Prevent content from overflowing
53
+ }
54
+ }
55
+ }
56
+
57
+ .resume-entry-content {
58
+ display: flex;
59
+ flex-direction: column;
60
+ flex: 1;
61
+ width: 100%;
62
+ gap: 12px;
63
+ padding-top: 4px;
64
+ }
65
+
66
+ .timeline-indicator {
67
+ display: flex;
68
+ padding: 12px 0 0 8px;
69
+ flex-direction: column;
70
+ align-items: center;
71
+ align-self: stretch;
72
+ position: relative;
73
+ flex-shrink: 0;
74
+ width: 20px;
75
+ min-width: 20px;
76
+ max-width: 20px;
77
+ }
78
+
79
+ .timeline-dot {
80
+ width: 10px;
81
+ height: 10px;
82
+ border-radius: 50%;
83
+ background-color: #BBC7F6;
84
+ z-index: 1;
85
+ flex-shrink: 0;
86
+ }
87
+
88
+ .timeline-line {
89
+ width: 2px;
90
+ flex: 1;
91
+ background-color: #BBC7F6;
92
+ min-height: calc(100% - 14px);
93
+ }
94
+
95
+ .resume-entry:last-child .timeline-line {
96
+ display: none;
97
+ }
98
+
99
+ .entry-header {
100
+ display: flex;
101
+ justify-content: space-between;
102
+ align-items: flex-start;
103
+ gap: 24px;
104
+
105
+ }
106
+
107
+ .header-left {
108
+ display: flex;
109
+ flex-direction: column;
110
+ gap: 4px;
111
+ flex: 1;
112
+ }
113
+
114
+ .header-right {
115
+ display: flex;
116
+ flex-direction: column;
117
+ align-items: flex-end;
118
+ gap: 4px;
119
+ max-width: 30%;
120
+ }
121
+
122
+ @media (max-width: 767px) {
123
+ .entry-header {
124
+ flex-direction: column;
125
+ gap: 12px;
126
+ display: flex;
127
+ }
128
+
129
+ // Use display: contents to make children of header-left and header-right
130
+ // participate directly in entry-header flex container for reordering
131
+ .header-left,
132
+ .header-right {
133
+ display: contents;
134
+ }
135
+
136
+ // Reorder elements for mobile: Date (1) -> Company (2) -> Job Title (3) -> Location (4)
137
+ .entry-header {
138
+
139
+ // Date comes first
140
+ .mobile-order-1 {
141
+ order: 1;
142
+ }
143
+
144
+ // Company comes second
145
+ .mobile-order-2 {
146
+ order: 2;
147
+ }
148
+
149
+ // Job title comes third
150
+ .mobile-order-3 {
151
+ order: 3;
152
+ }
153
+
154
+ // Location comes fourth
155
+ .mobile-order-4 {
156
+ order: 4;
157
+ }
158
+ }
159
+
160
+ // Ensure the ordered elements maintain their styling and layout
161
+ .mobile-order-1,
162
+ .mobile-order-2,
163
+ .mobile-order-3,
164
+ .mobile-order-4 {
165
+ width: 100%;
166
+ }
167
+
168
+ .date-range {
169
+ align-items: flex-start;
170
+ }
171
+
172
+ .location-row {
173
+ align-items: flex-start;
174
+ }
175
+ }
176
+
177
+ .date-range {
178
+ display: flex;
179
+ flex-direction: row;
180
+ align-items: center;
181
+ gap: 8px;
182
+ }
183
+
184
+ .location-row {
185
+ display: flex;
186
+ flex-direction: row;
187
+ align-items: center;
188
+ gap: 4px;
189
+ }
190
+
191
+ .date-separator {
192
+ color: #666;
193
+ font-weight: 500;
194
+ font-size: 16px;
195
+ }
196
+
197
+ .date-icon {
198
+ color: #94A3B8;
199
+ font-size: 14px;
200
+ margin-left: 4px;
201
+ }
202
+
203
+ .descriptions-container {
204
+ display: flex;
205
+ flex-direction: column;
206
+ gap: 8px;
207
+ }
208
+
209
+ .description-item {
210
+ display: flex;
211
+ flex-direction: column;
212
+ gap: 4px;
213
+
214
+ ::ng-deep .value-text {
215
+ color: $color-grey-600;
216
+ }
217
+ }
218
+
219
+ .description-label {
220
+ color: #A2A6B8;
221
+ font-family: 'Roboto', sans-serif;
222
+ font-size: 12px;
223
+ font-style: normal;
224
+ font-weight: 400;
225
+ letter-spacing: 0.06px;
226
+ padding-top: 4px;
227
+ line-height: 10px;
228
+
229
+ }
230
+
231
+ .content-right {
232
+ display: flex;
233
+ flex-direction: row;
234
+ gap: 8px;
235
+ align-items: flex-start;
236
+ flex-wrap: wrap;
237
+ }
238
+
239
+ .resume-entry-projection {
240
+ display: block;
241
+ width: 100%;
242
+ }
243
+
244
+ .reapply-button-container {
245
+ display: flex;
246
+ justify-content: flex-end;
247
+ align-items: center;
248
+ }
249
+
250
+ .loader-container {
251
+ display: flex;
252
+ justify-content: center;
253
+ align-items: center;
254
+ padding: 24px 0;
255
+ min-height: 80px;
256
+ }
257
+
258
+ .entry-loader-container {
259
+ display: flex;
260
+ justify-content: center;
261
+ align-items: center;
262
+
263
+ width: 100%;
264
+ }
265
+
266
+ .entry-separator {
267
+ border: none;
268
+ border-top: 1px solid #E5E9FC;
269
+ margin-top: 0;
270
+ margin-bottom: 0;
271
+ width: 100%;
272
+ height: 0;
273
+ display: block;
274
+ clear: both;
275
+ flex-shrink: 0;
276
+ }
277
+
278
+ // Skill Section Styles
279
+ .skill-section-common {
280
+ padding: 8px 0 20px;
281
+
282
+ .ai_skill_summary {
283
+ margin-top: 8px;
284
+ }
285
+
286
+ .list-items {
287
+ font-weight: 400;
288
+ font-size: 15px;
289
+ font-style: normal;
290
+ letter-spacing: 0.15px;
291
+ font-family: Roboto, sans-serif;
292
+ color: #717793;
293
+ }
294
+
295
+ p,
296
+ .suggestion-container {
297
+ margin: 12px 0;
298
+ }
299
+
300
+ p.skill-list-items {
301
+ width: 100%;
302
+ }
303
+
304
+ .skill-list-items ul {
305
+ padding: 0;
306
+ display: flex;
307
+ flex-wrap: wrap;
308
+ }
309
+
310
+ .skill-list-items ul li {
311
+ margin-left: 24px;
312
+ margin-right: 24px;
313
+ height: 24px;
314
+ text-align: left;
315
+ max-width: 200px;
316
+ min-width: 200px;
317
+ overflow-y: clip;
318
+ text-overflow: ellipsis;
319
+ white-space: nowrap;
320
+ }
321
+
322
+ .skill-list-items table {
323
+ p {
324
+ margin: 0 !important;
325
+ }
326
+
327
+ ul {
328
+ padding: 0;
329
+ display: flex;
330
+ flex-direction: column;
331
+
332
+ li {
333
+ margin-left: 24px;
334
+ text-align: left;
335
+ max-width: 100%;
336
+ white-space: break-spaces !important;
337
+ word-break: break-word;
338
+ }
339
+ }
340
+ }
341
+ }
@@ -0,0 +1,167 @@
1
+ <cdk-accordion class="example-accordion">
2
+ <cdk-accordion-item #accordionItem="cdkAccordionItem" [expanded]="true" class="example-accordion-item">
3
+
4
+ <div class="example-accordion-item-header" [ngStyle]="{ 'border-color': borderColor }">
5
+ <div class="left_side_header" *ngIf="!hiddenSection?.headerSectionHidden; else hiddenHeaderLayout">
6
+ <div [matTooltip]="accordionItem.expanded ? 'Collapse' : 'Expand'" matTooltipPosition="above">
7
+ <button (click)="toggleAccordion(accordionItem)" tabindex="0" class="toggle-button align-center "
8
+ [attr.aria-expanded]="accordionItem.expanded">
9
+ <span class="material-icons-outlined" *ngIf="!accordionItem.expanded">
10
+ expand_less
11
+ </span>
12
+ <span class="material-icons-outlined" *ngIf="accordionItem.expanded">
13
+ expand_more
14
+ </span>
15
+ </button>
16
+ </div>
17
+
18
+ <div class="edit-input-group" [style.max-width.px]="maxContainerWidth">
19
+ <div class="content_width" data-test-id="edu-section-title-input">
20
+ <div class="content_width" data-test-id="edu-section-title-input" *ngIf="!inputHandlers.headersLoading">
21
+ <input #textInputSection type="text" [ngClass]="{
22
+ 'focusout-input-text': !inputHandlers?.isFocused,
23
+ 'onfocus-input-text': inputHandlers?.isFocused
24
+ }" [(ngModel)]="inputHandlers.shownTitle" [attr.aria-label]="inputHandlers.shownTitle"
25
+ (focus)="focusField.emit('educationHeader')" (focusout)="blurField.emit()"
26
+ (keypress)="enterKeyPressed.emit($event)" (input)="adjustInputWidth($event)"
27
+ [style.width.px]="inputWidth" [style.max-width.%]="100"
28
+ [disabled]="inputHandlers?.isDisabled?.() ?? false" />
29
+ </div>
30
+ </div>
31
+ <span *ngIf="!inputHandlers.headersLoading" class="align-center">
32
+ <span class="material-symbols-outlined" [attr.alt]="inputHandlers.iconAltText || 'edit-icon'"
33
+ (click)="toggleEditIcon?.('educationHeader')"
34
+ [matTooltip]="inputHandlers.tooltipText || 'This header can be edited'"
35
+ [matTooltipPosition]="inputHandlers.tooltipPosition || 'above'"
36
+ *ngIf="inputHandlers.getFieldNotHidden('')">
37
+ edit
38
+ </span>
39
+ </span>
40
+ </div>
41
+ </div>
42
+
43
+ <!-- ✅ FIXED: Right side header (shows when section is NOT hidden) -->
44
+ <div class="right_side_header" *ngIf="!hiddenSection?.headerSectionHidden">
45
+ <ng-container *ngIf="isLargeScreen">
46
+ <al-button [labelText]="popOutButtonLabel || 'Run Deep Extraction'" [leftIcon]="popOutButtonIcon"
47
+ [rightIcon]="'arrow_forward'" [buttonType]="'icon-label'" [category]="'gradient'" [size]="'header'"
48
+ [iconOnly]="false" (onClick)="popOutButtonClick.emit()" [dataTestId]="'header-run-deep-extraction'"
49
+ [title]="popOutButtonLabel || 'Run Deep Extraction'" [matTooltip]="popOutButtonTooltip"
50
+ [matTooltipPosition]="popOutButtonTooltipPosition">
51
+ </al-button>
52
+ <ng-container class="button-margin"
53
+ *ngTemplateOutlet="headerButtonsTemplate; context: { buttons: buttonConfig }">
54
+ </ng-container>
55
+ </ng-container>
56
+
57
+ <div class="hover-menu-container" *ngIf="!isLargeScreen">
58
+ <div class="menu-trigger" (click)="toggleMenu()">
59
+ <al-button buttonType="icon-label" iconOnly size="header" category="grey" leftIcon="more_vert"
60
+ aria-label="More options" [dataTestId]="'resume-header-more-menu'">
61
+ </al-button>
62
+ </div>
63
+ <div class="slide-out-panel" [class.visible]="isMenuVisible">
64
+ <div class="fit-panel">
65
+ <al-button [labelText]="popOutButtonLabel || 'Run Deep Extraction'" [leftIcon]="popOutButtonIcon"
66
+ [rightIcon]="'arrow_forward'" [buttonType]="'icon-label'" [category]="'gradient'" [size]="'header'"
67
+ [iconOnly]="false" (onClick)="popOutButtonClick.emit()" [dataTestId]="'header-run-deep-extraction'"
68
+ [title]="popOutButtonLabel || ' Deep Extraction'" [matTooltip]="popOutButtonTooltip"
69
+ [matTooltipPosition]="popOutButtonTooltipPosition">
70
+ </al-button>
71
+ <ng-container *ngTemplateOutlet="headerButtonsTemplate; context: { buttons: buttonConfig }">
72
+ </ng-container>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <!-- ✅ FIXED: Eye icon for hiding section -->
78
+ <ng-container *ngIf="!hiddenSection?.headerSectionHidden">
79
+ <ng-container *ngFor="let eyeConfig of configEyeToggle">
80
+ <ng-container
81
+ *ngTemplateOutlet="eyeIconTemplate; context: { isHidden: false, accordionItem: accordionItem, configEyeToggle: eyeConfig }"></ng-container>
82
+ </ng-container>
83
+ </ng-container>
84
+
85
+ <div *ngIf="checkboxConfig?.sectionItems?.length" class="mat-checkbox-margin">
86
+ <al-checkbox [checked]="checked" [disabled]="disabled || checkboxConfig?.disabled ?? false"
87
+ [tooltip]="checkboxConfig?.tooltipText || 'Select All'"
88
+ [tooltipPosition]="checkboxConfig.tooltipPosition || 'above'"
89
+ [dataTestId]="'edu-section-select-all-checkbox'" [showLabels]="false"
90
+ (change)="checkedCheckBoxChange.emit($event)">
91
+ </al-checkbox>
92
+ </div>
93
+ </div>
94
+
95
+ <!-- ✅ FIXED: Hidden header layout (shows when section IS hidden) -->
96
+ <ng-template #hiddenHeaderLayout>
97
+ <div class="hide-header">
98
+ <span class="header-text-turncate">{{ inputHandlers?.shownTitle }}</span>
99
+ <div class="hidden-write">Section hidden</div>
100
+
101
+ <!-- ✅ FIXED: Eye icon for showing section -->
102
+ <ng-container *ngIf="hiddenSection?.headerSectionHidden">
103
+ <ng-container *ngFor="let eyeConfig of configEyeToggle">
104
+ <ng-container *ngIf="!eyeConfig['onClick']">
105
+ <ng-container
106
+ *ngTemplateOutlet="eyeIconTemplate; context: { isHidden: true, accordionItem: accordionItem, configEyeToggle: eyeConfig }"></ng-container>
107
+ </ng-container>
108
+ </ng-container>
109
+ </ng-container>
110
+ </div>
111
+ </ng-template>
112
+ </div>
113
+
114
+ <!-- Pop-out Panel -->
115
+ <div *ngIf="showPopOut" class="pop-out-panel">
116
+ <div class="pop-out-content">
117
+ <al-button [labelText]="popOutButtonLabel || 'Run Deep Extraction'" [leftIcon]="popOutButtonIcon"
118
+ [rightIcon]="'arrow_forward'" [buttonType]="'icon-label'" [category]="'gradient'" [size]="'xs'"
119
+ [iconOnly]="false" (onClick)="popOutButtonClick.emit()" [dataTestId]="'pop-out-run-deep-extraction'"
120
+ [title]="popOutButtonLabel || 'Run Deep Extraction'">
121
+ </al-button>
122
+ <p class="pop-out-message" [innerHTML]="sanitizedMessage"></p>
123
+ <button type="button" class="pop-out-close" (click)="dismissPopOut()" aria-label="Close pop-out panel">
124
+ <span class="material-icons-outlined">close</span>
125
+ </button>
126
+ </div>
127
+ </div>
128
+
129
+ <!-- ✅ FIXED: Accordion body (only shows when expanded AND not hidden) -->
130
+ <div *ngIf="accordionItem.expanded && !hiddenSection?.headerSectionHidden" class="example-accordion-item-body"
131
+ role="region">
132
+ Lorem ipsum dolor, sit amet, consectetur adipisicing elit. Perferendis excepturi incidunt ipsum
133
+ deleniti labore, tempore non nam doloribus blanditiis veritatis illo autem iure aliquid ullam
134
+ rem tenetur deserunt velit culpa?
135
+ </div>
136
+
137
+ </cdk-accordion-item>
138
+ </cdk-accordion>
139
+
140
+ <!-- Header Buttons Template -->
141
+ <ng-template #headerButtonsTemplate let-buttons="buttons" let-handleClick="handleClick">
142
+ <ng-container *ngFor="let btn of buttonConfig">
143
+ <al-button *ngIf="!btn.hidden && (!btn.displayCondition || btn.displayCondition())" [category]="btn.category"
144
+ [buttonType]="btn.buttonType" [labelText]="btn.label" [leftIcon]="btn.leftIcon" [rightIcon]="btn.rightIcon"
145
+ [state]="btn.state" [size]="btn.size" [outlined]="btn.outlined" [iconOnly]="btn.iconOnly"
146
+ [dropdownOptions]="btn.buttonType === 'dropdown' ? btn.dropdownOptions : null"
147
+ (optionSelect)="onDropdownSelect(btn, $event)" (onClick)="onButtonClick(btn)" [attr.alt]="btn.alt"
148
+ [dataTestId]="btn.testId" [matTooltip]="btn.tooltipText" [matTooltipPosition]="btn.tooltipPosition || 'above'">
149
+ </al-button>
150
+ </ng-container>
151
+ </ng-template>
152
+
153
+ <!-- ✅ FIXED: Eye Icon Template with proper click handler -->
154
+ <ng-template #eyeIconTemplate let-isHidden="isHidden" let-accordionItem="accordionItem"
155
+ let-configEyeToggle="configEyeToggle">
156
+ <div *ngIf="configEyeToggle" class="mat-checkbox-margin align-center"
157
+ [attr.data-test-id]="isHidden ? 'edu-section-show-eye-div' : 'edu-section-hide-eye-div'">
158
+ <span class="material-symbols-outlined delete-multiple mat-fab.mat-accent"
159
+ [matTooltip]="configEyeToggle.tooltips[isHidden ? 'collapse' : 'expand']"
160
+ [matTooltipPosition]="configEyeToggle.tooltips.position"
161
+ [attr.aria-label]="configEyeToggle.ariaLabels[isHidden ? 'collapsed' : 'expanded']"
162
+ (click)="showHideToggleSection.emit({ isHidden: isHidden, accordionItem: accordionItem, config: configEyeToggle })"
163
+ [attr.data-test-id]="isHidden ? 'edu-section-show-eye-icon' : 'edu-section-show-hide-eye-icon'">
164
+ {{ isHidden ? 'visibility' : 'visibility_off' }}
165
+ </span>
166
+ </div>
167
+ </ng-template>
@@ -0,0 +1,99 @@
1
+ <div class="modal-container">
2
+ <!-- Feedback Modal Type - Success, Warning, or Error -->
3
+ <div *ngIf="modalType === 'feedback'" class="modal-body">
4
+ <div mat-dialog-content>
5
+ <div style="display:flex;flex-direction:column;align-items:center;gap:24px;padding-top:8px;">
6
+ <!-- Feedback Icon (hardcoded by variant, optional single override via feedbackIcon) -->
7
+ <mat-icon *ngIf="feedbackIcon" class="feedback-icon" [ngClass]="{
8
+ 'success': feedbackVariant === 'success',
9
+ 'warning': feedbackVariant === 'warning',
10
+ 'error': feedbackVariant === 'error'
11
+ }">{{ feedbackIcon }}</mat-icon>
12
+ <img *ngIf="!feedbackIcon && feedbackVariant === 'success'" [src]="getSuccessIconPath()" alt="Success"
13
+ class="feedback-icon success feedback-icon-image" />
14
+ <img *ngIf="!feedbackIcon && feedbackVariant === 'warning'" [src]="getWarningIconPath()" alt="Warning"
15
+ class="feedback-icon warning feedback-icon-image" />
16
+ <img *ngIf="!feedbackIcon && feedbackVariant === 'error'" [src]="getErrorIconPath()" alt="Error"
17
+ class="feedback-icon error feedback-icon-image" />
18
+
19
+ <div style="color:#4b4f62;font-weight:500;">{{ userMessage || getDefaultMessage() }}</div>
20
+ </div>
21
+ </div>
22
+
23
+ <div *ngIf="showFooter" mat-dialog-actions class="modal-actions"
24
+ [style.justify-content]="buttonAlignment === 'left' ? 'flex-start' : buttonAlignment === 'right' ? 'flex-end' : 'center'">
25
+ <al-button *ngIf="showSubmitAction" [category]="submitCategory" [size]="buttonSize" [iconOutlined]="false"
26
+ [labelText]="submitLabel || 'Ok'" [leftIcon]="submitIcon" [rightIcon]="''" [dataTestId]="'submit-btn'"
27
+ [hasDropDown]="false" [dropdownItems]="[]" (onClick)="onSubmit()"></al-button>
28
+ </div>
29
+ </div>
30
+
31
+ <!-- Regular Modal for Generic Type -->
32
+ <div *ngIf="modalType !== 'feedback'">
33
+ <!-- Default Header -->
34
+ <h2 *ngIf="!useCustomHeader && showHeader" mat-dialog-title class="modal-title">
35
+ <span class="title-content">
36
+ <mat-icon *ngIf="leftIcon" class="title-icon">{{ leftIcon }}</mat-icon>
37
+ {{ titleText }}
38
+ <mat-icon *ngIf="rightIcon" class="title-icon">{{ rightIcon }}</mat-icon>
39
+ </span>
40
+ <al-icon-button *ngIf="closeIcon" [icon]="'close'" [iconOutlined]="false" [customColour]="'#ffffff'"
41
+ [colour]="'blue'" [size]="'base'" [disabled]="false" (onClick)="onClose()"
42
+ [dataTestId]="'close-btn'"></al-icon-button>
43
+ </h2>
44
+
45
+ <!-- Custom Header -->
46
+ <div *ngIf="useCustomHeader && showHeader" class="custom-header">
47
+ <!-- Left side content -->
48
+ <div class="custom-header-left">
49
+ <!-- Icon and Title -->
50
+ <div class="custom-header-title-section">
51
+ <div *ngIf="customHeaderIcon" class="custom-header-icon">
52
+ <mat-icon>{{ customHeaderIcon }}</mat-icon>
53
+ </div>
54
+ <h2 class="custom-header-title">{{ customHeaderTitle }}</h2>
55
+ </div>
56
+
57
+ <!-- Description paragraph -->
58
+ <p class="custom-header-description">{{ customHeaderDescription }}</p>
59
+
60
+ <!-- Templating guide link/text -->
61
+ <span class="templating-guide-prefix">{{ templatingGuidePrefix }}</span>
62
+ <a class="templating-guide-link" [href]="templatingGuideHref">{{ templatingGuideLabel }}</a>
63
+ <span class="templating-guide-suffix">.</span>
64
+ </div>
65
+
66
+ <!-- Right side content -->
67
+ <div class="custom-header-right">
68
+ <!-- Close button -->
69
+ <al-icon-button *ngIf="closeIcon" class="custom-close" [icon]="'close'" [iconOutlined]="false"
70
+ [customColour]="'#ffffff'" [colour]="'blue'" [size]="'base'" [disabled]="false" (onClick)="onClose()"
71
+ [dataTestId]="'close-btn'"></al-icon-button>
72
+
73
+ <!-- Action button -->
74
+ <al-button [category]="submitCategory" [size]="'xs'" [iconOutlined]="false" [labelText]="customActionLabel"
75
+ [leftIcon]="customActionIcon" [rightIcon]="customActionRightIcon" [dataTestId]="'custom-action-btn'"
76
+ [hasDropDown]="false" [dropdownItems]="[]" (onClick)="onRequestTemplate()"></al-button>
77
+ </div>
78
+ </div>
79
+
80
+ <div class="modal-body">
81
+ <div mat-dialog-content>
82
+ <p *ngIf="userMessage && !hasProjectedContent" class="modal-message" [style.text-align]="messageAlignment">{{
83
+ userMessage }}</p>
84
+ <ng-content></ng-content>
85
+ </div>
86
+
87
+ <div *ngIf="showFooter" mat-dialog-actions class="modal-actions"
88
+ [style.justify-content]="buttonAlignment === 'left' ? 'flex-start' : buttonAlignment === 'right' ? 'flex-end' : 'center'">
89
+ <al-button *ngIf="showCancelAction" [category]="cancelCategory" [size]="buttonSize" [iconOutlined]="false"
90
+ [labelText]="cancelLabel" [leftIcon]="cancelIcon" [rightIcon]="''" [dataTestId]="'cancel-btn'"
91
+ [hasDropDown]="false" [dropdownItems]="[]" (onClick)="onCancel()"></al-button>
92
+
93
+ <al-button *ngIf="showSubmitAction" [category]="submitCategory" [size]="buttonSize" [iconOutlined]="false"
94
+ [labelText]="submitLabel" [leftIcon]="submitIcon" [rightIcon]="''" [dataTestId]="'submit-btn'"
95
+ [hasDropDown]="false" [dropdownItems]="[]" (onClick)="onSubmit()"></al-button>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>