@abcagency/hc-ui-components 1.3.23 → 1.3.24

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 (102) hide show
  1. package/package.json +4 -5
  2. package/src/.editorconfig +12 -0
  3. package/src/apis/hcApi.ts +109 -0
  4. package/src/bundleIndex.js +14 -0
  5. package/src/clientToken.js +9 -0
  6. package/src/components/HireControlMap.js +135 -0
  7. package/src/components/containers/accordions/filter-container.js +48 -0
  8. package/src/components/containers/accordions/filter-item-container.js +66 -0
  9. package/src/components/containers/accordions/map-accordion-item-container.js +70 -0
  10. package/src/components/containers/filter/commute-container.js +89 -0
  11. package/src/components/containers/filter/filter-container.js +76 -0
  12. package/src/components/containers/filter/filter-item-container.js +71 -0
  13. package/src/components/containers/filter/location-container.js +45 -0
  14. package/src/components/containers/filter/points-of-interest-container.js +33 -0
  15. package/src/components/containers/filter/points-of-interest-radio-item-container.js +35 -0
  16. package/src/components/containers/filter/search-container.js +50 -0
  17. package/src/components/containers/jobListing/listing-details-container.js +40 -0
  18. package/src/components/containers/list/item-list-container.tsx +81 -0
  19. package/src/components/containers/list/list-item/list-item-container.js +43 -0
  20. package/src/components/containers/maps/info-window-content-container.js +51 -0
  21. package/src/components/containers/maps/map-container.js +204 -0
  22. package/src/components/containers/maps/map-list-container.js +48 -0
  23. package/src/components/containers/maps/map-marker-container.js +78 -0
  24. package/src/components/modules/accordions/MapAccordionItem.js +30 -0
  25. package/src/components/modules/accordions/default.js +171 -0
  26. package/src/components/modules/accordions/filterItem.js +27 -0
  27. package/src/components/modules/accordions/filters.js +32 -0
  28. package/src/components/modules/buttons/button-group-apply.js +123 -0
  29. package/src/components/modules/buttons/commute-pill.js +22 -0
  30. package/src/components/modules/buttons/default.js +194 -0
  31. package/src/components/modules/buttons/items-pill.js +35 -0
  32. package/src/components/modules/buttons/pill-wrapper.js +27 -0
  33. package/src/components/modules/buttons/show-all-button.js +20 -0
  34. package/src/components/modules/cards/default.js +167 -0
  35. package/src/components/modules/cards/filter.js +56 -0
  36. package/src/components/modules/dialogs/apply-dialog.js +48 -0
  37. package/src/components/modules/filter/commute.js +108 -0
  38. package/src/components/modules/filter/index.js +55 -0
  39. package/src/components/modules/filter/item.js +48 -0
  40. package/src/components/modules/filter/location.js +48 -0
  41. package/src/components/modules/filter/radio-item.js +42 -0
  42. package/src/components/modules/filter/search.js +65 -0
  43. package/src/components/modules/filter/sort.js +83 -0
  44. package/src/components/modules/grid.js +54 -0
  45. package/src/components/modules/icon.js +33 -0
  46. package/src/components/modules/jobListing/listing-details.js +109 -0
  47. package/src/components/modules/list/field-mapper.js +114 -0
  48. package/src/components/modules/list/header-item.js +91 -0
  49. package/src/components/modules/list/header.js +49 -0
  50. package/src/components/modules/list/item-expand-card/index.js +22 -0
  51. package/src/components/modules/list/item-expand-card/recruiter-contact-nav.js +50 -0
  52. package/src/components/modules/list/item-expand-card/recruiter-details.js +68 -0
  53. package/src/components/modules/list/item-expand-card/recruiter-headshot.js +22 -0
  54. package/src/components/modules/list/item-list.tsx +84 -0
  55. package/src/components/modules/list/list-item/list-item.js +130 -0
  56. package/src/components/modules/maps/info-window-card.js +17 -0
  57. package/src/components/modules/maps/info-window-content.js +35 -0
  58. package/src/components/modules/maps/map-list.js +28 -0
  59. package/src/components/modules/maps/map-marker.js +29 -0
  60. package/src/components/modules/maps/map.js +76 -0
  61. package/src/components/modules/maps/place-marker.js +41 -0
  62. package/src/components/modules/maps/tabs.js +81 -0
  63. package/src/constants/eventTypes.js +13 -0
  64. package/src/constants/placeTypes.js +8 -0
  65. package/src/contexts/mapContext.tsx +129 -0
  66. package/src/contexts/mapListContext.tsx +311 -0
  67. package/src/contexts/placesContext.js +102 -0
  68. package/src/contexts/trackEventContext.js +14 -0
  69. package/src/enums/SectionType.ts +9 -0
  70. package/src/hooks/useList.js +89 -0
  71. package/src/index.js +3 -0
  72. package/src/services/configService.ts +16 -0
  73. package/src/services/googlePlacesNearbyService.ts +42 -0
  74. package/src/services/listingAggregatorService.ts +76 -0
  75. package/src/services/listingEntityService.ts +16 -0
  76. package/src/services/listingService.ts +40 -0
  77. package/src/services/recruiterService.ts +18 -0
  78. package/src/styles/bundle.css +268 -0
  79. package/src/styles/index.css +24 -0
  80. package/src/types/Address.ts +7 -0
  81. package/src/types/ContentSection.ts +9 -0
  82. package/src/types/GetListingParams.ts +8 -0
  83. package/src/types/LatLng.ts +4 -0
  84. package/src/types/ListingEntity.ts +11 -0
  85. package/src/types/ListingFields.ts +25 -0
  86. package/src/types/Listings.ts +32 -0
  87. package/src/types/Recruiter.ts +9 -0
  88. package/src/types/SimilarListing.ts +24 -0
  89. package/src/types/config/Colors.ts +8 -0
  90. package/src/types/config/MapConfig.ts +31 -0
  91. package/src/types/config/PointsOfInterestConfig.ts +13 -0
  92. package/src/types/config/SearchConfig.ts +4 -0
  93. package/src/util/arrayUtil.js +3 -0
  94. package/src/util/fieldMapper.js +22 -0
  95. package/src/util/filterUtil.js +239 -0
  96. package/src/util/loading.js +17 -0
  97. package/src/util/localStorageUtil.ts +34 -0
  98. package/src/util/mapIconUtil.js +180 -0
  99. package/src/util/mapUtil.js +91 -0
  100. package/src/util/sortUtil.js +33 -0
  101. package/src/util/stringUtils.js +6 -0
  102. package/src/util/urlFilterUtil.js +85 -0
@@ -0,0 +1,89 @@
1
+ import { useEffect, useState, useRef } from 'react';
2
+
3
+ import { getStorageObject } from '~/util/localStorageUtil';
4
+
5
+ const getDefaultItemId = () => {
6
+ let item = getStorageObject("selectedListItem");
7
+ if (item?.expanded == true) {
8
+ return item.id;
9
+ } else {
10
+ return null;
11
+ }
12
+ };
13
+
14
+ const useListLogic = filteredListings => {
15
+ const [itemLimit, setItemLimit] = useState(100);
16
+ const [expandedId] = useState(getDefaultItemId());
17
+ const [sortSetting, setSortSetting] = useState(getStorageObject('sortSetting', null));
18
+ const [scrollPosition, setScrollPosition] = useState(getStorageObject('scrollPosition', 0));
19
+ const loader = useRef(null);
20
+ const scrollContainerRef = useRef(null);
21
+ const itemRefs = useRef({});
22
+ const observer = useRef(null);
23
+
24
+ useEffect(() => {
25
+ observer.current = new IntersectionObserver(handleObserver, {
26
+ root: scrollContainerRef.current,
27
+ rootMargin: "100px 0px",
28
+ threshold: 0.5
29
+ });
30
+ const { current } = loader;
31
+ if (current) {
32
+ observer.current.observe(current);
33
+ }
34
+ return () => {
35
+ if (observer.current && current) {
36
+ observer.current.unobserve(current);
37
+ }
38
+ };
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, [filteredListings.length, itemLimit]);
41
+
42
+ useEffect(() => {
43
+ localStorage.setItem('scrollPosition', scrollPosition.toString());
44
+ }, [scrollPosition]);
45
+
46
+ useEffect(() => {
47
+ const savedScrollPosition = scrollPosition;
48
+ if (parseInt(savedScrollPosition) > 3000) {
49
+ setItemLimit(savedScrollPosition / 10);
50
+ }
51
+ if (savedScrollPosition && scrollContainerRef.current) {
52
+ setTimeout(() => {
53
+ scrollContainerRef.current.scrollTop = parseInt(savedScrollPosition, 10);
54
+ }, 300);
55
+ }
56
+ }, []);
57
+
58
+ useEffect(() => {
59
+ const { current } = scrollContainerRef;
60
+ if (current) {
61
+ current.addEventListener('scroll', handleScroll);
62
+ }
63
+ return () => {
64
+ if (current) {
65
+ current.removeEventListener('scroll', handleScroll);
66
+ }
67
+ };
68
+ }, []);
69
+
70
+ const handleObserver = entities => {
71
+ const target = entities[0];
72
+ if (!target.isIntersecting) return;
73
+ if (filteredListings.length > itemLimit) {
74
+ setItemLimit(prevLimit => prevLimit + 100);
75
+ } else if (observer.current) {
76
+ observer.current.disconnect();
77
+ }
78
+ };
79
+
80
+ const handleScroll = () => {
81
+ if (scrollContainerRef.current) {
82
+ setScrollPosition(scrollContainerRef.current.scrollTop);
83
+ }
84
+ };
85
+
86
+ return { itemLimit, expandedId, sortSetting, scrollPosition, loader, scrollContainerRef, itemRefs, setSortSetting, setScrollPosition, filteredListings };
87
+ };
88
+
89
+ export default useListLogic;
package/src/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import HireControlMap from '~/components/HireControlMap';
2
+
3
+ export { HireControlMap };
@@ -0,0 +1,16 @@
1
+ import api from '~/apis/hcApi';
2
+ import { MapConfig } from '~/types/config/MapConfig';
3
+
4
+ export const getMapConfig = async (): Promise<MapConfig> => {
5
+ try {
6
+ const response = await api.get<MapConfig>(`/MapConfig`);
7
+ return response;
8
+ } catch (error) {
9
+ console.error("Error retrieving map configuration:", error);
10
+ throw error;
11
+ }
12
+ };
13
+
14
+ export default {
15
+ getMapConfig
16
+ };
@@ -0,0 +1,42 @@
1
+ export interface Location {
2
+ latitude: number;
3
+ longitude: number;
4
+ }
5
+
6
+ export const searchNearbyPlaces = async (
7
+ typesArray: string[],
8
+ location: Location,
9
+ radius: number
10
+ ): Promise<any> => {
11
+ const url = 'https://places.googleapis.com/v1/places:searchNearby';
12
+ const headers = {
13
+ 'Content-Type': 'application/json',
14
+ 'X-Goog-Api-Key': process.env.GOOGLE_MAPS_API_KEY as string,
15
+ 'X-Goog-FieldMask': 'places.location,places.displayName,places.types'
16
+ };
17
+ const data = {
18
+ includedTypes: typesArray,
19
+ maxResultCount: 20,
20
+ locationRestriction: {
21
+ circle: {
22
+ center: location,
23
+ radius: radius
24
+ }
25
+ }
26
+ };
27
+
28
+ try {
29
+ const response = await fetch(url, {
30
+ method: 'POST',
31
+ headers: headers,
32
+ body: JSON.stringify(data)
33
+ });
34
+ if (!response.ok) {
35
+ throw new Error(`HTTP error! status: ${response.status}`);
36
+ }
37
+ return await response.json();
38
+ } catch (error) {
39
+ console.error('Error making the Nearby Search request:', error);
40
+ throw error;
41
+ }
42
+ };
@@ -0,0 +1,76 @@
1
+ import { getListings } from '~/services/listingService';
2
+ import { getRecruiters } from '~/services/recruiterService';
3
+ import { getListingEntities } from '~/services/listingEntityService';
4
+
5
+ import { getDistinctItemsByProximity } from '~/util/mapUtil';
6
+ import { Listing } from '~/types/Listings';
7
+ import { Recruiter } from '~/types/Recruiter';
8
+ import { ListingEntity } from '~/types/ListingEntity';
9
+ import { MapConfig } from '~/types/config/MapConfig';
10
+ //import { ICommuteLocation } from '~/interfaces/ICommute';
11
+
12
+ interface SiteConfig {
13
+ companyId: number;
14
+ }
15
+
16
+ interface FetchListingsResult {
17
+ listingsResult: Listing[];
18
+ fetchedRecruiters: Recruiter[];
19
+ fetchedEntities: Record<number, ListingEntity>;
20
+ distinctItems: any; // Update this type based on the return type of getDistinctItemsByProximity
21
+ }
22
+
23
+ const fetchListings = async (
24
+ query: string,
25
+ siteConfig: MapConfig,
26
+ commuteLocation: any | null = null
27
+ ): Promise<FetchListingsResult> => {
28
+ try {
29
+ const listingsResult = await getListings(
30
+
31
+ );
32
+
33
+ const recruiterIds: number[] = [
34
+ ...new Set(listingsResult.map(listing => listing.recruiterId))
35
+ ] as number[];
36
+
37
+ const fetchedRecruiters = await getRecruiters(recruiterIds);
38
+
39
+ const distinctEntityIds: number[] = [
40
+ ...new Set(listingsResult.map(listing => listing.entityId))
41
+ ] as number[];
42
+
43
+ const fetchedEntities = !commuteLocation
44
+ ? await getListingEntities(distinctEntityIds)
45
+ : await getListingEntities(
46
+ distinctEntityIds,
47
+ `${commuteLocation.lat}, ${commuteLocation.lng}`
48
+ );
49
+ for (let i = 0; i < listingsResult.length; i++) {
50
+ const listing = listingsResult[i];
51
+ if (listing.entityId && listing.entityId !== -1 && listing.fields) {
52
+ const entity = fetchedEntities[listing.entityId];
53
+ if (entity) {
54
+ listing.fields.travelTime = entity.travelTime;
55
+ }
56
+ }
57
+ }
58
+
59
+ const distinctItems = getDistinctItemsByProximity(
60
+ listingsResult,
61
+ fetchedEntities
62
+ );
63
+
64
+ return {
65
+ listingsResult,
66
+ fetchedRecruiters,
67
+ fetchedEntities,
68
+ distinctItems
69
+ };
70
+ } catch (error) {
71
+ console.error("Error fetching listings:", error);
72
+ throw error;
73
+ }
74
+ };
75
+
76
+ export default fetchListings;
@@ -0,0 +1,16 @@
1
+ import api from '~/apis/hcApi';
2
+ import { ListingEntity } from '~/types/ListingEntity';
3
+
4
+ export const getListingEntities = async (entityIds: number[], origin = ''): Promise<ListingEntity[]> => {
5
+ try {
6
+ const response = await api.post<ListingEntity[]>(`/ListingEntities?origin=${origin}`, entityIds);
7
+ return response;
8
+ } catch (error) {
9
+ console.error("Error fetching listing entities:", error);
10
+ throw error;
11
+ }
12
+ };
13
+
14
+ export default {
15
+ getListingEntities
16
+ };
@@ -0,0 +1,40 @@
1
+ // listingService.ts
2
+ import { GetListingsParams } from '~/types/GetListingParams';
3
+ import api from '../apis/hcApi';
4
+ import { Listing } from '../types/Listings';
5
+
6
+ export const getListings = async (params?: GetListingsParams): Promise<Listing[]> => {
7
+ try {
8
+ const query = new URLSearchParams();
9
+
10
+ if (params) {
11
+ if (params.location) params.location.forEach(loc => query.append('location', loc));
12
+ if (params.category) params.category.forEach(cat => query.append('category', cat));
13
+ if (params.categoryClass) params.categoryClass.forEach(catClass => query.append('categoryClass', catClass));
14
+ if (params.education) params.education.forEach(edu => query.append('education', edu));
15
+ if (params.city) params.city.forEach(cty => query.append('city', cty));
16
+ if (params.state) params.state.forEach(st => query.append('state', st));
17
+ }
18
+
19
+ const response = await api.get(`/Listings?${query.toString()}`);
20
+ return response as Listing[];
21
+ } catch (error) {
22
+ console.error(error);
23
+ throw error;
24
+ }
25
+ };
26
+
27
+ export const getListingDetails = async (listingId: string) => {
28
+ try {
29
+ const response = await api.get(`/ListingDetails/${listingId}`);
30
+ return response;
31
+ } catch (error) {
32
+ console.error(error);
33
+ throw error;
34
+ }
35
+ };
36
+
37
+ export default {
38
+ getListings,
39
+ getListingDetails
40
+ };
@@ -0,0 +1,18 @@
1
+ import api from '~/apis/hcApi';
2
+ import { Recruiter } from '~/types/Recruiter';
3
+
4
+ export const getRecruiters = async (recruiterIds: number[]): Promise<Recruiter[]> => {
5
+ try {
6
+ const params = recruiterIds.map(id => `recruiterIds=${id}`).join("&");
7
+
8
+ const response = await api.get<Recruiter[]>(`/Recruiters?${params}`);
9
+ return response;
10
+ } catch (error) {
11
+ console.error("Error fetching recruiters:", error);
12
+ throw error;
13
+ }
14
+ };
15
+
16
+ export default {
17
+ getRecruiters
18
+ };
@@ -0,0 +1,268 @@
1
+ /* Custom prefixed styles */
2
+ @tailwind base;
3
+ @tailwind components;
4
+ @tailwind utilities;
5
+ .hc-bundle html {
6
+ font-size: 14px;
7
+ }
8
+
9
+ @media (min-width: 768px) {
10
+ .hc-bundle html {
11
+ font-size: 16px;
12
+ }
13
+ }
14
+
15
+ .hc-bundle .btn:focus, .hc-bundle .btn:active:focus, .hc-bundle .btn-link.nav-link:focus, .hc-bundle .form-control:focus, .hc-bundle .form-check-input:focus {
16
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
17
+ }
18
+
19
+ .hc-bundle html {
20
+ position: relative;
21
+ min-height: 100%;
22
+ }
23
+
24
+ .hc-bundle body {
25
+ margin-bottom: 60px;
26
+ }
27
+
28
+ .hc-bundle *, .hc-bundle :after, .hc-bundle :before {
29
+ border: 0 solid #e5e7eb;
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ .hc-bundle :after, .hc-bundle :before {
34
+ --tw-content: "";
35
+ }
36
+
37
+ .hc-bundle :host, .hc-bundle html {
38
+ -webkit-text-size-adjust: 100%;
39
+ font-feature-settings: normal;
40
+ -webkit-tap-highlight-color: transparent;
41
+ font-family: var(--font-roboto-flex), ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
42
+ font-variation-settings: normal;
43
+ line-height: 1.5;
44
+ -moz-tab-size: 4;
45
+ -o-tab-size: 4;
46
+ tab-size: 4;
47
+ }
48
+
49
+
50
+ .hc-bundle hr {
51
+ border-top-width: 1px;
52
+ color: inherit;
53
+ height: 0;
54
+ }
55
+
56
+ .hc-bundle abbr:where([title]) {
57
+ -webkit-text-decoration: underline dotted;
58
+ text-decoration: underline dotted;
59
+ }
60
+
61
+
62
+ .hc-bundle a {
63
+ color: inherit;
64
+ text-decoration: inherit;
65
+ }
66
+
67
+ .hc-bundle b, .hc-bundle strong {
68
+ font-weight: bolder;
69
+ }
70
+
71
+ .hc-bundle code, .hc-bundle kbd, .hc-bundle pre, .hc-bundle samp {
72
+ font-feature-settings: normal;
73
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;
74
+ font-size: 1em;
75
+ font-variation-settings: normal;
76
+ }
77
+
78
+ .hc-bundle small {
79
+ font-size: 80%;
80
+ }
81
+
82
+ .hc-bundle sub, .hc-bundle sup {
83
+ font-size: 75%;
84
+ line-height: 0;
85
+ position: relative;
86
+ vertical-align: baseline;
87
+ }
88
+
89
+ .hc-bundle sub {
90
+ bottom: -.25em;
91
+ }
92
+
93
+ .hc-bundle sup {
94
+ top: -.5em;
95
+ }
96
+
97
+ .hc-bundle table {
98
+ border-collapse: collapse;
99
+ border-color: inherit;
100
+ text-indent: 0;
101
+ }
102
+
103
+ .hc-bundle button, .hc-bundle input, .hc-bundle optgroup, .hc-bundle select, .hc-bundle textarea {
104
+ font-feature-settings: inherit;
105
+ color: inherit;
106
+ font-family: inherit;
107
+ font-size: 100%;
108
+ font-variation-settings: inherit;
109
+ font-weight: inherit;
110
+ letter-spacing: inherit;
111
+ line-height: inherit;
112
+ margin: 0;
113
+ padding: 0;
114
+ }
115
+
116
+ .hc-bundle button, .hc-bundle select {
117
+ text-transform: none;
118
+ }
119
+
120
+ .hc-bundle button, .hc-bundle input:where([type=button]), .hc-bundle input:where([type=reset]), .hc-bundle input:where([type=submit]) {
121
+ -webkit-appearance: button;
122
+ background-color: transparent;
123
+ background-image: none;
124
+ }
125
+
126
+ .hc-bundle :-moz-focusring {
127
+ outline: auto;
128
+ }
129
+
130
+ .hc-bundle :-moz-ui-invalid {
131
+ box-shadow: none;
132
+ }
133
+
134
+ .hc-bundle progress {
135
+ vertical-align: baseline;
136
+ }
137
+
138
+ .hc-bundle ::-webkit-inner-spin-button, .hc-bundle ::-webkit-outer-spin-button {
139
+ height: auto;
140
+ }
141
+
142
+ .hc-bundle [type=search] {
143
+ -webkit-appearance: textfield;
144
+ outline-offset: -2px;
145
+ }
146
+
147
+ .hc-bundle ::-webkit-search-decoration {
148
+ -webkit-appearance: none;
149
+ }
150
+
151
+ .hc-bundle ::-webkit-file-upload-button {
152
+ -webkit-appearance: button;
153
+ font: inherit;
154
+ }
155
+
156
+ .hc-bundle summary {
157
+ display: list-item;
158
+ }
159
+
160
+ .hc-bundle textarea {
161
+ resize: vertical;
162
+ }
163
+
164
+ .hc-bundle input::-moz-placeholder, .hc-bundle textarea::-moz-placeholder {
165
+ color: #9ca3af;
166
+ }
167
+
168
+ .hc-bundle input::placeholder, .hc-bundle textarea::placeholder {
169
+ color: #9ca3af;
170
+ }
171
+
172
+ .hc-bundle [role=button], .hc-bundle button {
173
+ cursor: pointer;
174
+ }
175
+
176
+ .hc-bundle :disabled {
177
+ cursor: default;
178
+ }
179
+
180
+ .hc-bundle audio, .hc-bundle canvas, .hc-bundle embed, .hc-bundle iframe, .hc-bundle img, .hc-bundle object, .hc-bundle svg, .hc-bundle video {
181
+ display: block;
182
+ vertical-align: middle;
183
+ }
184
+
185
+ .hc-bundle img, .hc-bundle video {
186
+ height: auto;
187
+ max-width: 100%;
188
+ }
189
+
190
+ .hc-bundle [hidden] {
191
+ display: none;
192
+ }
193
+
194
+ .hc-bundle [multiple], .hc-bundle [type=date], .hc-bundle [type=datetime-local], .hc-bundle [type=email], .hc-bundle [type=month], .hc-bundle [type=number], .hc-bundle [type=password], .hc-bundle [type=search], .hc-bundle [type=tel], .hc-bundle [type=text], .hc-bundle [type=time], .hc-bundle [type=url], .hc-bundle [type=week], .hc-bundle input:where(:not([type])), .hc-bundle select, .hc-bundle textarea {
195
+ --tw-shadow: 0 0 #0000;
196
+ -webkit-appearance: none;
197
+ -moz-appearance: none;
198
+ appearance: none;
199
+ background-color: #fff;
200
+ border-color: #6b7280;
201
+ border-radius: 0;
202
+ border-width: 1px;
203
+ font-size: 1rem;
204
+ line-height: 1.5rem;
205
+ padding: .5rem .75rem;
206
+ }
207
+
208
+ .hc-bundle [multiple]:focus, .hc-bundle [type=date]:focus, .hc-bundle [type=datetime-local]:focus, .hc-bundle [type=email]:focus, .hc-bundle [type=month]:focus, .hc-bundle [type=number]:focus, .hc-bundle [type=password]:focus, .hc-bundle [type=search]:focus, .hc-bundle [type=tel]:focus, .hc-bundle [type=text]:focus, .hc-bundle [type=time]:focus, .hc-bundle [type=url]:focus, .hc-bundle [type=week]:focus, .hc-bundle input:where(:not([type])):focus, .hc-bundle select:focus, .hc-bundle textarea:focus {
209
+ --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/);
210
+ --tw-ring-offset-width: 0px;
211
+ --tw-ring-offset-color: #fff;
212
+ --tw-ring-color: #2563eb;
213
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
214
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
215
+ border-color: #2563eb;
216
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
217
+ outline: 2px solid transparent;
218
+ outline-offset: 2px;
219
+ }
220
+
221
+ .hc-bundle input::-moz-placeholder, .hc-bundle textarea::-moz-placeholder {
222
+ color: #6b7280;
223
+ opacity: 1;
224
+ }
225
+
226
+ .hc-bundle input::placeholder, .hc-bundle textarea::placeholder {
227
+ color: #6b7280;
228
+ opacity: 1;
229
+ }
230
+
231
+ .hc-bundle ::-webkit-datetime-edit-fields-wrapper {
232
+ padding: 0;
233
+ }
234
+
235
+ .hc-bundle ::-webkit-date-and-time-value {
236
+ min-height: 1.5em;
237
+ text-align: inherit;
238
+ }
239
+
240
+ .hc-bundle ::-webkit-datetime-edit {
241
+ display: inline-flex;
242
+ }
243
+
244
+ .hc-bundle ::-webkit-datetime-edit, .hc-bundle ::-webkit-datetime-edit-day-field, .hc-bundle ::-webkit-datetime-edit-hour-field, .hc-bundle ::-webkit-datetime-edit-meridiem-field, .hc-bundle ::-webkit-datetime-edit-millisecond-field, .hc-bundle ::-webkit-datetime-edit-minute-field, .hc-bundle ::-webkit-datetime-edit-month-field, .hc-bundle ::-webkit-datetime-edit-second-field, .hc-bundle ::-webkit-datetime-edit-year-field {
245
+ padding-bottom: 0;
246
+ padding-top: 0;
247
+ }
248
+
249
+ .hc-bundle select {
250
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");
251
+ background-position: right .5rem center;
252
+ background-repeat: no-repeat;
253
+ background-size: 1.5em 1.5em;
254
+ padding-right: 2.5rem;
255
+ -webkit-print-color-adjust: exact;
256
+ print-color-adjust: exact;
257
+ }
258
+
259
+ .hc-bundle [multiple], .hc-bundle [size]:where(select:not([size="1"])) {
260
+ background-image: none;
261
+ background-position: 0 0;
262
+ background-repeat: unset;
263
+ background-size: auto auto;
264
+ background-size: initial;
265
+ padding-right: .75rem;
266
+ -webkit-print-color-adjust: unset;
267
+ print-color-adjust: unset;
268
+ }
@@ -0,0 +1,24 @@
1
+ @config "../../tailwind.config.js";
2
+ @tailwind base;
3
+ @tailwind components;
4
+ @tailwind utilities;
5
+
6
+ @layer base {
7
+ html {
8
+ @apply hc-text-400 hc-text-uiText [scroll-behavior:smooth];
9
+ }
10
+ }
11
+
12
+ @layer components {
13
+ .track * {
14
+ @apply hc-pointer-events-none;
15
+ }
16
+
17
+ .stretched-link::after {
18
+ @apply hc-content-[''] hc-absolute hc-inset-0 hc-z-[1] hc-pointer-events-auto hc-bg-transparent;
19
+ }
20
+ }
21
+
22
+ .fit-content{
23
+ height:fit-content;
24
+ }
@@ -0,0 +1,7 @@
1
+ export type Address = {
2
+ location?: string;
3
+ street?: string;
4
+ city?: string;
5
+ state?: string;
6
+ zip?: string;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { SectionType } from '../enums/SectionType';
2
+
3
+ export type ContentSection = {
4
+ title?: string;
5
+ contentFormatted?: string;
6
+ contentRaw?: string;
7
+ sectionType: SectionType;
8
+ sortIndex: number;
9
+ }
@@ -0,0 +1,8 @@
1
+ export type GetListingsParams = {
2
+ location?: string[];
3
+ category?: string[];
4
+ categoryClass?: string[];
5
+ education?: string[];
6
+ city?: string[];
7
+ state?: string[];
8
+ };
@@ -0,0 +1,4 @@
1
+ export type LatLng = {
2
+ lat: number;
3
+ lng: number;
4
+ }
@@ -0,0 +1,11 @@
1
+ import { Address } from './Address';
2
+
3
+ export type ListingEntity = {
4
+ id: number;
5
+ listingId: number;
6
+ latitude: number;
7
+ longitude: number;
8
+ entityDisplayName?: string;
9
+ address?: Address;
10
+ travelTime?: string;
11
+ }
@@ -0,0 +1,25 @@
1
+ export type ListingFields = {
2
+ posted?: string;
3
+ subTitle?: string;
4
+ education?: string;
5
+ position?: string;
6
+ category?: string;
7
+ categoryClass?: string;
8
+ shift?: string;
9
+ custom1?: string;
10
+ custom2?: string;
11
+ custom3?: string;
12
+ custom4?: string;
13
+ custom5?: string;
14
+ cityState?: string;
15
+ city?: string;
16
+ state?: string;
17
+ schedule?: string;
18
+ customFlag1?: number;
19
+ bonus?: number;
20
+ remote?: number;
21
+ useClientJobUrl?: boolean;
22
+ dateCreated: Date;
23
+ dateLastEdited?: Date;
24
+ travelTime?: string;
25
+ }