@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,91 @@
1
+ <div class="candidate-container">
2
+ <div class="columns-wrapper">
3
+ <div class="column first-column">
4
+ <div class="container" data-test-id="candidate-section-name-container"
5
+ [ngClass]="shouldShowFor('name', []) ? '' : 'not-in-template'"><lib-field-placeholder [icon]="getIconName()"
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'"
9
+ [compact]="true"></lib-field-placeholder></div>
10
+ <div class="container" data-test-id="candidate-section-gender-container"
11
+ [ngClass]="shouldShowFor('gender', []) ? '' : 'not-in-template'"><lib-field-placeholder [icon]="getIconGender()"
12
+ [value]="candidateDetails?.userAssignedGender" [placeholder]="'Gender'"
13
+ [tooltip]="candidateDetails?.userAssignedGender" tooltipPosition="right" [testId]="'candidate-section-gender'"
14
+ [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
15
+ <div class="container" data-test-id="candidate-section-phone-container"
16
+ [ngClass]="shouldShowFor('phone', []) ? '' : 'not-in-template'"><lib-field-placeholder [icon]="getIconPhone()"
17
+ [value]="candidateDetails?.phoneNumber" [placeholder]="'Phone Number'"
18
+ [tooltip]="candidateDetails?.phoneNumber" tooltipPosition="right" [testId]="'candidate-section-phone'"
19
+ [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
20
+ <div class="container" data-test-id="candidate-section-email-container"
21
+ [ngClass]="shouldShowFor('email', []) ? '' : 'not-in-template'"><lib-field-placeholder [icon]="getIconEmail()"
22
+ [value]="candidateDetails?.emailAddress" [placeholder]="'Email Address'"
23
+ [tooltip]="candidateDetails?.emailAddress" tooltipPosition="right" [testId]="'candidate-section-email'"
24
+ [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
25
+ <div class="container" data-test-id="candidate-section-linkedin-container"
26
+ [ngClass]="shouldShowFor('linkedin', []) ? '' : 'not-in-template'"><lib-field-placeholder
27
+ [icon]="getIconLinkedIn()" iconAlt="LinkedIn" [value]="candidateDetails?.linkedin" [placeholder]="'LinkedIn'"
28
+ [tooltip]="candidateDetails?.linkedin" tooltipPosition="right" [testId]="'candidate-section-linkedin'"
29
+ [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
30
+ </div>
31
+ <div class="column second-column">
32
+ <div data-test-id="candidate-section-address-container"
33
+ [ngClass]="shouldShowFor('address', []) ? '' : 'not-in-template'">
34
+ <div [ngClass]="shouldShowFor('addressStreet', []) ? '' : 'not-in-template'"><lib-field-placeholder
35
+ [icon]="getIconAddress()" [value]="candidateDetails?.street" [placeholder]="'Street'"
36
+ [tooltip]="candidateDetails?.street" tooltipPosition="right" [testId]="'candidate-section-address-street'"
37
+ [valueClass]="'typo-description'" [compact]="true"></lib-field-placeholder></div>
38
+ <div [ngClass]="shouldShowFor('addressCity', []) ? '' : 'not-in-template'"><lib-field-placeholder
39
+ [value]="candidateDetails?.city" [placeholder]="'City'" [tooltip]="candidateDetails?.city"
40
+ tooltipPosition="right" [testId]="'candidate-section-address-city'" [valueClass]="'typo-description'"
41
+ [icon]="'data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%3E%3C%2Fsvg%3E'"
42
+ [compact]="true"></lib-field-placeholder></div>
43
+ <div [ngClass]="shouldShowFor('addressRegion', []) ? '' : 'not-in-template'"><lib-field-placeholder
44
+ [value]="candidateDetails?.region" [placeholder]="'Region'" [tooltip]="candidateDetails?.region"
45
+ tooltipPosition="right" [testId]="'candidate-section-address-region'" [valueClass]="'typo-description'"
46
+ [icon]="'data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%3E%3C%2Fsvg%3E'"
47
+ [compact]="true"></lib-field-placeholder></div>
48
+ <div [ngClass]="shouldShowFor('addressRegionCode', []) ? '' : 'not-in-template'"><lib-field-placeholder
49
+ [value]="candidateDetails?.regionCode" [placeholder]="'Region Code'"
50
+ [tooltip]="candidateDetails?.regionCode" tooltipPosition="right"
51
+ [testId]="'candidate-section-address-region-code'" [valueClass]="'typo-description'"
52
+ [icon]="'data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%3E%3C%2Fsvg%3E'"
53
+ [compact]="true"></lib-field-placeholder></div>
54
+ <div [ngClass]="shouldShowFor('addressCountry', []) ? '' : 'not-in-template'"><lib-field-placeholder
55
+ [value]="candidateDetails?.country" [placeholder]="'Country'" [tooltip]="candidateDetails?.country"
56
+ tooltipPosition="right" [testId]="'candidate-section-address-country'" [valueClass]="'typo-description'"
57
+ [icon]="'data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%3E%3C%2Fsvg%3E'"
58
+ [compact]="true"></lib-field-placeholder></div>
59
+ <div [ngClass]="shouldShowFor('addressPostCode', []) ? '' : 'not-in-template'"><lib-field-placeholder
60
+ [value]="candidateDetails?.postCode" [placeholder]="'Post Code'" [tooltip]="candidateDetails?.postCode"
61
+ tooltipPosition="right" [testId]="'candidate-section-address-post-code'" [valueClass]="'typo-description'"
62
+ [icon]="'data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2220%22%20height%3D%2220%22%3E%3C%2Fsvg%3E'"
63
+ [compact]="true"></lib-field-placeholder></div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ <div class="column third-column">
68
+ <div class="container most-recent-container" data-test-id="candidate-section-current-employer-container">
69
+ <div [ngClass]="shouldShowFor('currentJob', []) || shouldShowFor('currentEmployer', []) ? '' : 'not-in-template'">
70
+ <lib-field-placeholder [icon]="getIconMostRecent()"
71
+ [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>' : ''"
72
+ [placeholder]="'Current Job'"
73
+ [tooltip]="(getCurrentJob() || getCurrentEmployer()) ? 'Most Recently : ' + getCurrentJob() + (getCurrentEmployer() ? ' at ' + getCurrentEmployer() : '') : 'Current Job'"
74
+ tooltipPosition="right" [testId]="'candidate-section-current-job'" [valueClass]="'typo-description'"
75
+ [compact]="true"></lib-field-placeholder>
76
+ <div class="most-recent-details">
77
+ <div class="current-job-title" *ngIf="getCurrentJob()">{{getCurrentJob()}}</div>
78
+ <div class="current-employer" *ngIf="getCurrentEmployer()">{{getCurrentEmployer()}}</div>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ <div class="total-exp-parent container" data-test-id="candidate-section-total-exp-parent"
83
+ [ngClass]="shouldShowFor('experience', []) ? '' : 'not-in-template'"><lib-field-placeholder
84
+ [icon]="getIconExperience()"
85
+ [value]="getTotalExpYears() ? 'Total Exp - <span class=\'total-exp-value\'>' + getTotalExpYears() + '</span> yrs' : ''"
86
+ [placeholder]="'Total Exp'"
87
+ [tooltip]="getTotalExpYears() ? 'Total Exp - ' + getTotalExpYears() + ' yrs' : 'Total Exp'"
88
+ tooltipPosition="right" [testId]="'candidate-section-total-exp-value'" [valueClass]="'typo-description'"
89
+ [compact]="true"></lib-field-placeholder></div>
90
+ </div>
91
+ </div>
@@ -0,0 +1,154 @@
1
+ @import '../styles/typography-classes.scss';
2
+
3
+ .candidate-container {
4
+ display: flex;
5
+ flex-direction: row;
6
+ gap: 16px;
7
+ padding-top: 8px;
8
+ }
9
+
10
+ .columns-wrapper {
11
+ display: flex;
12
+ flex-direction: row;
13
+ gap: 24px;
14
+ flex: 1 1 0;
15
+ }
16
+
17
+ .columns-wrapper .first-column {
18
+ display: flex;
19
+ flex-direction: column;
20
+ justify-content: space-between;
21
+ align-items: flex-start;
22
+ flex: 1 0 0;
23
+ }
24
+
25
+ .columns-wrapper .second-column {
26
+ display: flex;
27
+ flex-direction: column;
28
+ align-items: flex-start;
29
+ gap: 4px;
30
+ }
31
+
32
+ .third-column {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 12px;
36
+ }
37
+
38
+ .column {
39
+ display: flex;
40
+ flex-direction: column;
41
+ // justify-content: space-between; align-items: flex-start;
42
+ flex: 1 0 0;
43
+ /* space between .container blocks */
44
+ }
45
+
46
+ .column.has-value {
47
+ gap: 24px;
48
+ }
49
+
50
+ .column.no-value {
51
+ gap: 8px;
52
+ }
53
+
54
+ .container {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: 16px;
58
+ /* space between field placeholders inside container */
59
+ }
60
+
61
+ ::ng-deep .total-exp-value {
62
+ color: var(--Greys-700, #4B4F62);
63
+ font-family: Roboto, sans-serif;
64
+ font-size: 14px;
65
+ font-style: normal;
66
+ font-weight: 700;
67
+ line-height: 140%;
68
+ /* 19.6px */
69
+ letter-spacing: 0.035px;
70
+ }
71
+
72
+ .most-recent-details {
73
+ display: none;
74
+ /* Hidden by default for small screens */
75
+ }
76
+
77
+ .current-job-title {
78
+ display: flex;
79
+ align-items: center;
80
+ height: 28px;
81
+ font-weight: 700;
82
+ color: var(--Greys-700, #4B4F62);
83
+ font-family: Roboto, sans-serif;
84
+ font-size: 14px;
85
+ line-height: 140%;
86
+ letter-spacing: 0.035px;
87
+ }
88
+
89
+ .current-employer {
90
+ display: flex;
91
+ align-items: center;
92
+ height: 28px;
93
+ font-style: italic;
94
+ color: var(--Greys-700, #4B4F62);
95
+ font-family: Roboto, sans-serif;
96
+ font-size: 14px;
97
+ line-height: 140%;
98
+ letter-spacing: 0.035px;
99
+ }
100
+
101
+ /* On large screens, show job title and employer on separate lines */
102
+ @media (min-width: 1500px) {
103
+ .most-recent-container {
104
+ ::ng-deep .field-row .value-text {
105
+ span.most-recent-inline {
106
+ display: none;
107
+ /* Hide inline job/employer on large screens */
108
+ }
109
+ }
110
+ }
111
+
112
+ .most-recent-details {
113
+ display: flex;
114
+ flex-direction: column;
115
+ gap: 0;
116
+
117
+ padding-left: 28px;
118
+ /* Align with field placeholder content (icon width + gap) */
119
+ }
120
+ }
121
+
122
+ @media (max-width: 1499px) {
123
+ .candidate-container {
124
+ display: flex;
125
+ flex-direction: column;
126
+ gap: 16px;
127
+ padding-top: 8px;
128
+ }
129
+
130
+ .columns-wrapper {
131
+ display: flex;
132
+ flex-direction: row;
133
+ gap: 24px;
134
+ }
135
+
136
+ /* Experience column becomes full-width column on mobile */
137
+ .third-column {
138
+ display: flex;
139
+ flex-direction: column;
140
+ gap: 8px;
141
+ width: 100%;
142
+ order: 2;
143
+ /* Ensure it appears after columns-wrapper */
144
+ }
145
+
146
+ /* On mobile, show most recent experience first, then total exp at the very bottom */
147
+ .third-column .most-recent-container {
148
+ order: 1;
149
+ }
150
+
151
+ .third-column .total-exp-parent {
152
+ order: 2;
153
+ }
154
+ }
@@ -0,0 +1,24 @@
1
+ <mat-checkbox [checked]="checked" [disabled]="disabled" [labelPosition]="labelPosition" [name]="name"
2
+ touchTargetSize="none" [attr.data-testid]="dataTestId" [required]="required" [value]="value" [color]="color"
3
+ [matTooltip]="tooltip" [matTooltipPosition]="tooltipPosition" [matTooltipDisabled]="!tooltip"
4
+ (change)="handleChange($event)" (focus)="handleFocus($event)" (blur)="handleBlur($event)"
5
+ (indeterminateChange)="handleIndeterminateChange($event)">
6
+ <div class="checkbox-label-wrapper" *ngIf="showLabels">
7
+ <div class="checkbox-label-main-row" *ngIf="labelText">
8
+ <div class="checkbox-label-main">
9
+ {{ labelText }}
10
+ </div>
11
+ <button *ngIf="showHelperIcon" type="button" class="checkbox-helper-icon"
12
+ [matTooltip]="helperIconTooltip || helperText" [matTooltipPosition]="tooltipPosition" [disabled]="disabled"
13
+ (click)="onHelperIconClick($event)">
14
+ ?
15
+ </button>
16
+ </div>
17
+
18
+ <div *ngIf="helperText" class="checkbox-label-helper">
19
+ {{ helperText }}
20
+ </div>
21
+ </div>
22
+
23
+ <ng-content></ng-content>
24
+ </mat-checkbox>
@@ -0,0 +1,280 @@
1
+ /* ============================================
2
+ CHECKBOX COMPONENT STYLES
3
+ ============================================ */
4
+
5
+ @import '../styles/colors.scss';
6
+ @import '../styles/border-radius.scss';
7
+ @import '../styles/typography-classes.scss';
8
+
9
+ /* ============================================
10
+ CUSTOM COLOR THEMES
11
+ ============================================ */
12
+
13
+ /* Default/Primary Color (Blue) */
14
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__background {
15
+ background-color: $color-blue-500 !important;
16
+ border-color: $color-blue-500 !important;
17
+ }
18
+
19
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-checked .mdc-checkbox__checkmark {
20
+ color: white !important;
21
+ }
22
+
23
+ /* Primary Theme (Blue) */
24
+ ::ng-deep .mat-mdc-checkbox.mat-primary.mat-mdc-checkbox-checked .mdc-checkbox__background {
25
+ background-color: $color-blue-500 !important;
26
+ border-color: $color-blue-500 !important;
27
+ }
28
+
29
+ /* Green Theme */
30
+ ::ng-deep .mat-mdc-checkbox.mat-green.mat-mdc-checkbox-checked .mdc-checkbox__background {
31
+ background-color: $color-green-500 !important;
32
+ border-color: $color-green-500 !important;
33
+ }
34
+
35
+ /* Error Theme (Red) */
36
+ ::ng-deep .mat-mdc-checkbox.mat-error.mat-mdc-checkbox-checked .mdc-checkbox__background {
37
+ background-color: $color-error-500 !important;
38
+ border-color: $color-error-500 !important;
39
+ }
40
+
41
+ /* ============================================
42
+ DISABLED STATE STYLING
43
+ ============================================ */
44
+
45
+ /* Disabled - Unchecked State */
46
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-disabled:not(.mat-mdc-checkbox-checked) .mdc-checkbox__background {
47
+ border: 2px solid $color-grey-400 !important;
48
+ }
49
+
50
+ /* Disabled - Checked State */
51
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-checked .mdc-checkbox__background {
52
+ background-color: #DEE0E6 !important;
53
+ border-color: $color-grey-400 !important;
54
+ }
55
+
56
+ /* Disabled Checkmark */
57
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-disabled .mdc-checkbox__checkmark {
58
+ color: #fff !important;
59
+ }
60
+
61
+ /* ============================================
62
+ UNCHECKED STATE STYLING
63
+ ============================================ */
64
+
65
+ /* Unchecked State Border */
66
+ ::ng-deep .mat-mdc-checkbox .mdc-checkbox__background {
67
+ border-color: $color-grey-600 !important;
68
+ }
69
+
70
+ /* Unchecked State Styling */
71
+ ::ng-deep .mat-mdc-checkbox:not(.mat-mdc-checkbox-checked) .mdc-checkbox__background {
72
+ border: 2px solid $color-grey-600 !important;
73
+ background-color: transparent !important;
74
+ }
75
+
76
+ /* ============================================
77
+ INTERACTIVE STATES (FOCUS & HOVER)
78
+ ============================================ */
79
+
80
+ /* Default Ripple State - Transparent */
81
+ ::ng-deep .mat-mdc-checkbox .mdc-checkbox__ripple {
82
+ background-color: transparent !important;
83
+ opacity: 1 !important;
84
+ transition: background-color 0.2s ease !important;
85
+ }
86
+
87
+ /* Hover State - Circular hover effect */
88
+ ::ng-deep .mat-mdc-checkbox:hover:not(.mat-mdc-checkbox-disabled) .mdc-checkbox__ripple {
89
+ background-color: rgba($color-blue-500, 0.12) !important;
90
+ }
91
+
92
+ /* Focus State - Circular focus effect */
93
+ ::ng-deep .mat-mdc-checkbox.mat-focused .mdc-checkbox__ripple {
94
+ background-color: rgba($color-blue-500, 0.12) !important;
95
+ }
96
+
97
+ /* ============================================
98
+ CHECKBOX SHAPE & BORDER RADIUS
99
+ ============================================ */
100
+
101
+ /* Checkbox Border Radius */
102
+ ::ng-deep .mat-mdc-checkbox .mdc-checkbox__background {
103
+ border-radius: 2px !important;
104
+ }
105
+
106
+ /* ============================================
107
+ TYPOGRAPHY STYLING
108
+ ============================================ */
109
+
110
+ /* Material Design Label Styling */
111
+ ::ng-deep .mat-mdc-checkbox .mdc-form-field>label {
112
+ @extend .font-label-large;
113
+ color: $color-grey-700 !important;
114
+ }
115
+
116
+ /* ============================================
117
+ CUSTOM LABEL COMPONENTS
118
+ ============================================ */
119
+
120
+ /* Wrapper for label + helper text */
121
+ .checkbox-label-wrapper {
122
+ display: flex;
123
+ flex-direction: column;
124
+ margin-top: 12px;
125
+ }
126
+
127
+ /* Row to keep label and helper icon on the same line */
128
+ .checkbox-label-main-row {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 4px;
132
+ }
133
+
134
+ /* Main Label Styling */
135
+ .checkbox-label-main {
136
+ @extend .font-label-large;
137
+ color: $color-grey-700 !important;
138
+ }
139
+
140
+ /* Helper Text Styling */
141
+ .checkbox-label-helper {
142
+ @extend .font-label-medium;
143
+ color: $color-grey-500 !important;
144
+ margin-top: 0px !important;
145
+ }
146
+
147
+ /* Disabled Labels & Helper Text */
148
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-disabled .checkbox-label-main,
149
+ ::ng-deep .mat-mdc-checkbox.mat-mdc-checkbox-disabled .checkbox-label-helper {
150
+ color: $color-grey-400 !important;
151
+ cursor: not-allowed;
152
+ }
153
+
154
+ /* Helper icon next to label */
155
+ .checkbox-helper-icon {
156
+ width: 20px;
157
+ height: 20px;
158
+ border-radius: 50%;
159
+ border: 1px solid #C3C5D1;
160
+ background-color: #FFFFFF;
161
+ color: #717793;
162
+ font-size: 12px;
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ padding: 0;
167
+ margin-left: 4px;
168
+ cursor: pointer;
169
+ }
170
+
171
+ .checkbox-helper-icon:disabled {
172
+ border-color: #DEE0E6;
173
+ color: #DEE0E6;
174
+ cursor: not-allowed;
175
+ }
176
+
177
+ /* Primary Theme Ripple */
178
+ ::ng-deep .mat-mdc-checkbox.mat-primary .mat-ripple-element {
179
+ background-color: rgba($color-blue-500, 0.8) !important;
180
+ /* Blue with transparency */
181
+ }
182
+
183
+ /* Green Theme Ripple */
184
+ ::ng-deep .mat-mdc-checkbox.mat-green .mat-ripple-element {
185
+ background-color: rgba($color-green-500, 0.8) !important;
186
+ /* Green with transparency */
187
+ }
188
+
189
+ /* Error Theme Ripple */
190
+ ::ng-deep .mat-mdc-checkbox.mat-error .mat-ripple-element {
191
+ background-color: rgba($color-error-500, 0.8) !important;
192
+ /* Red with transparency */
193
+ }
194
+
195
+
196
+
197
+
198
+ // ::ng-deep .mat-mdc-checkbox .mat-mdc-checkbox .mat-mdc-checkbox-background {
199
+ // top: calc((var(--mdc-checkbox-state-layer-size, 44px) - 28px) / 2) !important;
200
+ // left: calc((var(--mdc-checkbox-state-layer-size, 44px) - 28px) / 2) !important;
201
+
202
+ // }
203
+
204
+ // ::ng-deep .mdc-checkbox {
205
+ // padding: 0px !important;
206
+ // }
207
+
208
+ // ::ng-deep .mdc-checkbox .mdc-checkbox__native-control {
209
+ // position: absolute;
210
+ // margin: 0;
211
+ // padding: 0;
212
+ // opacity: 0;
213
+ // cursor: inherit;
214
+ // width: var(--mdc-checkbox-state-layer-size, 18px);
215
+ // height: var(--mdc-checkbox-state-layer-size, 18px);
216
+ // top: calc((var(--mdc-checkbox-state-layer-size, 18px) - var(--mdc-checkbox-state-layer-size, 18)) / 2);
217
+ // right: calc((var(--mdc-checkbox-state-layer-size, 18) - var(--mdc-checkbox-state-layer-size, 18)) / 2);
218
+ // left: calc((var(--mdc-checkbox-state-layer-size, 18) - var(--mdc-checkbox-state-layer-size, 18)) / 2);
219
+ // }
220
+ // ::ng-deep .mdc-checkbox .mdc-checkbox__native-control {
221
+ // width: 18px !important;
222
+ // height: 18px !important;
223
+ // top: 0px !important;
224
+ // left: 0px !important;
225
+ // right: 0px !important;
226
+ // bottom: 0px !important;
227
+ // }
228
+
229
+ // ::ng-deep .mdc-checkbox {
230
+ // --mdc-checkbox-state-layer-size: 18px !important;
231
+ // padding: 0 !important;
232
+ // /* 2px each side */
233
+ // }
234
+
235
+ // ::ng-deep .mat-mdc-checkbox-touch-target {
236
+ // width: 24px !important;
237
+ // height: 24px !important;
238
+ // top: 9px !important;
239
+ // left: 10px !important;
240
+ // }
241
+ /* Checkbox box */
242
+ ::ng-deep .mdc-checkbox .mdc-checkbox__native-control {
243
+ width: 18px !important;
244
+ height: 18px !important;
245
+ top: 0 !important;
246
+ left: 0 !important;
247
+ }
248
+
249
+ /* State layer size */
250
+ ::ng-deep .mdc-checkbox {
251
+ --mdc-checkbox-state-layer-size: 18px !important;
252
+ padding: 0 !important;
253
+ }
254
+
255
+ /* Touch target */
256
+ ::ng-deep .mat-mdc-checkbox-touch-target {
257
+ width: 24px !important;
258
+ height: 24px !important;
259
+ }
260
+
261
+ /* Ripple circle */
262
+ ::ng-deep .mdc-checkbox .mdc-checkbox__ripple {
263
+ width: 36px !important;
264
+ height: 36px !important;
265
+ border-radius: 50% !important;
266
+ top: 50% !important;
267
+ left: 50% !important;
268
+ transform: translate(-50%, -50%) !important;
269
+ opacity: 1 !important;
270
+ pointer-events: none !important;
271
+ }
272
+
273
+ // Label spacing: default 0; enable when host has labels
274
+ ::ng-deep mat-checkbox .mat-internal-form-field {
275
+ gap: 0 !important;
276
+ }
277
+
278
+ :host(.has-labels) ::ng-deep mat-checkbox .mat-internal-form-field {
279
+ gap: 8px !important;
280
+ }
@@ -0,0 +1,129 @@
1
+ <!-- Editor Labels Section -->
2
+ <div class="editor-labels" *ngIf="showLabels">
3
+ <div class="left-label">{{ leftLabelText }}</div>
4
+ <div class="right-label">{{ rightLabelText }}</div>
5
+ </div>
6
+ <div class="editor-container">
7
+ <!-- Toolbar Section -->
8
+ <div class="toolbar">
9
+ <!-- Styling Dropdown (Small Screens Only) -->
10
+ <div class="styling-dropdown" *ngIf="isSmallScreen">
11
+ <span class="styling-text" (mouseenter)="showStylingDropdownOnHover()" (mouseleave)="hideStylingDropdown()">
12
+ Styling
13
+ </span>
14
+
15
+ <div class="styling-dropdown-content" *ngIf="showStylingDropdown" (mouseenter)="clearStylingDropdownTimeout()"
16
+ (mouseleave)="hideStylingDropdown()">
17
+ <button *ngFor="let item of toolbarConfig" class="format-button" [class.active]="getActiveState(item.type)"
18
+ (click)="execCmd($event, item.command)" [title]="item.title" type="button">
19
+ <mat-icon *ngIf="isSvgIcon(item.icon)" [svgIcon]="item.icon"
20
+ [class.active-icon]="getActiveState(item.type)"></mat-icon>
21
+ <span *ngIf="!isSvgIcon(item.icon)" class="material-icons" [class.active-icon]="getActiveState(item.type)">
22
+ {{ item.icon }}
23
+ </span>
24
+ </button>
25
+ </div>
26
+ </div>
27
+
28
+ <!-- Individual Styling Buttons (Large Screens Only) -->
29
+ <button *ngFor="let item of toolbarConfig" class="format-button" [class.active]="getActiveState(item.type)"
30
+ [class.hide-on-small]="true" (click)="execCmd($event, item.command)" [title]="item.title" type="button"
31
+ [matTooltip]="item.title" matTooltipPosition="above">
32
+ <mat-icon *ngIf="isSvgIcon(item.icon)" [svgIcon]="item.icon"
33
+ [class.active-icon]="getActiveState(item.type)"></mat-icon>
34
+ <span *ngIf="!isSvgIcon(item.icon)" class="material-icons" [class.active-icon]="getActiveState(item.type)">
35
+ {{ item.icon }}
36
+ </span>
37
+ </button>
38
+
39
+ <!-- Text Formatting Dropdown (Small Screens Only) -->
40
+ <div class="text-formatting-dropdown" *ngIf="isSmallScreen">
41
+ <span class="text-formatting-text" (mouseenter)="showTextFormattingDropdownOnHover()"
42
+ (mouseleave)="hideTextFormattingDropdown()">
43
+ Text Formatting
44
+ </span>
45
+
46
+ <div class="text-formatting-dropdown-content" *ngIf="showTextFormattingDropdown"
47
+ (mouseenter)="clearTextFormattingDropdownTimeout()" (mouseleave)="hideTextFormattingDropdown()">
48
+
49
+ <!-- Text Formatting Buttons -->
50
+ <button *ngFor="let item of textFormattingConfig" class="format-button"
51
+ [class.active]="getActiveState(item.type)" (click)="handleTextFormattingClick($event, item)"
52
+ [title]="item.title" type="button">
53
+ <mat-icon *ngIf="isSvgIcon(item.icon)" [svgIcon]="item.icon"
54
+ [class.active-icon]="getActiveState(item.type)"></mat-icon>
55
+ <span *ngIf="!isSvgIcon(item.icon)" class="material-icons" [class.active-icon]="getActiveState(item.type)">
56
+ {{ item.icon }}
57
+ </span>
58
+ </button>
59
+
60
+ <!-- Auto Bullet Button -->
61
+ <button *ngIf="autobullet" class="ms-3 auto-bullet" mat-flat-button (click)="transformToBullets($event)"
62
+ [disabled]="autoBulletDisable || isLoadingAI || !checkHtmlContent('')">
63
+ {{ AutoBulletButton }}
64
+ </button>
65
+
66
+ <!-- Bullet Skill Button -->
67
+ <button *ngIf="skillsBullet" class="ms-3 bullet-skill" mat-flat-button
68
+ (click)="transformToSkillsBullets($event)" [disabled]="isDisabled || isLoadingAI">
69
+ {{ skillsButton }}
70
+ </button>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Individual Text Formatting Buttons (Large Screens Only) -->
75
+ <button *ngFor="let item of textFormattingConfig" class="format-button" [class.active]="getActiveState(item.type)"
76
+ [class.hide-on-small]="true" (click)="handleTextFormattingClick($event, item)" [title]="item.title" type="button"
77
+ [matTooltip]="item.title" matTooltipPosition="above">
78
+ <mat-icon *ngIf="isSvgIcon(item.icon)" [svgIcon]="item.icon"
79
+ [class.active-icon]="getActiveState(item.type)"></mat-icon>
80
+ <span *ngIf="!isSvgIcon(item.icon)" class="material-icons" [class.active-icon]="getActiveState(item.type)">
81
+ {{ item.icon }}
82
+ </span>
83
+ </button>
84
+
85
+ <!-- Table Component -->
86
+ <app-table *ngIf="showTable" [getEditorElement]="getBoundGetEditorElement()"
87
+ [saveHistoryMethod]="getBoundSaveHistory()" [textChangeMethod]="getBoundTextChange()" matTooltip="Table"
88
+ matTooltipPosition="above">
89
+ </app-table>
90
+
91
+ <!-- Auto Bullet Button (Large Screens Only) -->
92
+ <button *ngIf="autobullet && !isSmallScreen" class="ms-3 auto-bullet" mat-flat-button
93
+ (click)="transformToBullets($event)" [disabled]="autoBulletDisable || isLoadingAI || !checkHtmlContent('')">
94
+ {{ AutoBulletButton }}
95
+ </button>
96
+
97
+ <!-- Bullet Skill Button (Large Screens Only) -->
98
+ <button *ngIf="skillsBullet && !isSmallScreen" class="ms-3 bullet-skill" mat-flat-button
99
+ (click)="transformToSkillsBullets($event)" [disabled]="isDisabled || isLoadingAI">
100
+ {{ skillsButton }}
101
+ </button>
102
+
103
+ <!-- History Controls (Undo/Redo) -->
104
+ <div *ngIf="historyControls" class="history-controls">
105
+ <!-- Undo Button -->
106
+ <button class="ms-3 format-button" (click)="execCmd($event, 'undo')" title="Undo" type="button" matTooltip="Undo"
107
+ matTooltipPosition="above">
108
+ <span class="material-icons" [class.active-icon]="getActiveState('undo')">
109
+ undo
110
+ </span>
111
+ </button>
112
+
113
+ <!-- Redo Button -->
114
+ <button class="ms-3 format-button" (click)="execCmd($event, 'redo')" title="Redo" type="button" matTooltip="Redo"
115
+ matTooltipPosition="above">
116
+ <span class="material-icons" [class.active-icon]="getActiveState('redo')">
117
+ redo
118
+ </span>
119
+ </button>
120
+ </div>
121
+ </div>
122
+
123
+ <!-- Editor Content Area -->
124
+ <div class="editor-content" #editorReference contenteditable="true" [id]="editorId" (click)="updateTagHierarchy()"
125
+ (input)="onEditorInput()" (paste)="handlePaste($event)" (keydown)="handleKeydown($event)"
126
+ (click)="toggleDiv($event, true)" spellcheck="false" role="textbox" aria-label="Rich text editor"
127
+ aria-multiline="true" [attr.data-testid]="dataTestId">
128
+ </div>
129
+ </div>