@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.
- package/package.json +4 -5
- package/src/.editorconfig +12 -0
- package/src/apis/hcApi.ts +109 -0
- package/src/bundleIndex.js +14 -0
- package/src/clientToken.js +9 -0
- package/src/components/HireControlMap.js +135 -0
- package/src/components/containers/accordions/filter-container.js +48 -0
- package/src/components/containers/accordions/filter-item-container.js +66 -0
- package/src/components/containers/accordions/map-accordion-item-container.js +70 -0
- package/src/components/containers/filter/commute-container.js +89 -0
- package/src/components/containers/filter/filter-container.js +76 -0
- package/src/components/containers/filter/filter-item-container.js +71 -0
- package/src/components/containers/filter/location-container.js +45 -0
- package/src/components/containers/filter/points-of-interest-container.js +33 -0
- package/src/components/containers/filter/points-of-interest-radio-item-container.js +35 -0
- package/src/components/containers/filter/search-container.js +50 -0
- package/src/components/containers/jobListing/listing-details-container.js +40 -0
- package/src/components/containers/list/item-list-container.tsx +81 -0
- package/src/components/containers/list/list-item/list-item-container.js +43 -0
- package/src/components/containers/maps/info-window-content-container.js +51 -0
- package/src/components/containers/maps/map-container.js +204 -0
- package/src/components/containers/maps/map-list-container.js +48 -0
- package/src/components/containers/maps/map-marker-container.js +78 -0
- package/src/components/modules/accordions/MapAccordionItem.js +30 -0
- package/src/components/modules/accordions/default.js +171 -0
- package/src/components/modules/accordions/filterItem.js +27 -0
- package/src/components/modules/accordions/filters.js +32 -0
- package/src/components/modules/buttons/button-group-apply.js +123 -0
- package/src/components/modules/buttons/commute-pill.js +22 -0
- package/src/components/modules/buttons/default.js +194 -0
- package/src/components/modules/buttons/items-pill.js +35 -0
- package/src/components/modules/buttons/pill-wrapper.js +27 -0
- package/src/components/modules/buttons/show-all-button.js +20 -0
- package/src/components/modules/cards/default.js +167 -0
- package/src/components/modules/cards/filter.js +56 -0
- package/src/components/modules/dialogs/apply-dialog.js +48 -0
- package/src/components/modules/filter/commute.js +108 -0
- package/src/components/modules/filter/index.js +55 -0
- package/src/components/modules/filter/item.js +48 -0
- package/src/components/modules/filter/location.js +48 -0
- package/src/components/modules/filter/radio-item.js +42 -0
- package/src/components/modules/filter/search.js +65 -0
- package/src/components/modules/filter/sort.js +83 -0
- package/src/components/modules/grid.js +54 -0
- package/src/components/modules/icon.js +33 -0
- package/src/components/modules/jobListing/listing-details.js +109 -0
- package/src/components/modules/list/field-mapper.js +114 -0
- package/src/components/modules/list/header-item.js +91 -0
- package/src/components/modules/list/header.js +49 -0
- package/src/components/modules/list/item-expand-card/index.js +22 -0
- package/src/components/modules/list/item-expand-card/recruiter-contact-nav.js +50 -0
- package/src/components/modules/list/item-expand-card/recruiter-details.js +68 -0
- package/src/components/modules/list/item-expand-card/recruiter-headshot.js +22 -0
- package/src/components/modules/list/item-list.tsx +84 -0
- package/src/components/modules/list/list-item/list-item.js +130 -0
- package/src/components/modules/maps/info-window-card.js +17 -0
- package/src/components/modules/maps/info-window-content.js +35 -0
- package/src/components/modules/maps/map-list.js +28 -0
- package/src/components/modules/maps/map-marker.js +29 -0
- package/src/components/modules/maps/map.js +76 -0
- package/src/components/modules/maps/place-marker.js +41 -0
- package/src/components/modules/maps/tabs.js +81 -0
- package/src/constants/eventTypes.js +13 -0
- package/src/constants/placeTypes.js +8 -0
- package/src/contexts/mapContext.tsx +129 -0
- package/src/contexts/mapListContext.tsx +311 -0
- package/src/contexts/placesContext.js +102 -0
- package/src/contexts/trackEventContext.js +14 -0
- package/src/enums/SectionType.ts +9 -0
- package/src/hooks/useList.js +89 -0
- package/src/index.js +3 -0
- package/src/services/configService.ts +16 -0
- package/src/services/googlePlacesNearbyService.ts +42 -0
- package/src/services/listingAggregatorService.ts +76 -0
- package/src/services/listingEntityService.ts +16 -0
- package/src/services/listingService.ts +40 -0
- package/src/services/recruiterService.ts +18 -0
- package/src/styles/bundle.css +268 -0
- package/src/styles/index.css +24 -0
- package/src/types/Address.ts +7 -0
- package/src/types/ContentSection.ts +9 -0
- package/src/types/GetListingParams.ts +8 -0
- package/src/types/LatLng.ts +4 -0
- package/src/types/ListingEntity.ts +11 -0
- package/src/types/ListingFields.ts +25 -0
- package/src/types/Listings.ts +32 -0
- package/src/types/Recruiter.ts +9 -0
- package/src/types/SimilarListing.ts +24 -0
- package/src/types/config/Colors.ts +8 -0
- package/src/types/config/MapConfig.ts +31 -0
- package/src/types/config/PointsOfInterestConfig.ts +13 -0
- package/src/types/config/SearchConfig.ts +4 -0
- package/src/util/arrayUtil.js +3 -0
- package/src/util/fieldMapper.js +22 -0
- package/src/util/filterUtil.js +239 -0
- package/src/util/loading.js +17 -0
- package/src/util/localStorageUtil.ts +34 -0
- package/src/util/mapIconUtil.js +180 -0
- package/src/util/mapUtil.js +91 -0
- package/src/util/sortUtil.js +33 -0
- package/src/util/stringUtils.js +6 -0
- 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,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,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
|
+
}
|