@inploi/plugin-job-search 0.1.0 → 0.1.1

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.
@@ -531,17 +531,25 @@ const Fallback = ({
531
531
  }) => {
532
532
  return u$1("div", {
533
533
  style: {
534
- padding: "0 1rem",
534
+ display: "flex",
535
+ flexDirection: "column",
536
+ gap: ".5rem",
537
+ padding: "1rem",
535
538
  fontSize: "1rem",
536
- color: "#333333",
537
- fontFamily: "'system-ui' 'Helvetica'"
539
+ color: "hsl(10, 82%, 45%)",
540
+ fontFamily: "'system-ui' 'Helvetica'",
541
+ background: "hsl(7, 100%, 98%)"
538
542
  },
539
- children: ["Something went wrong.", u$1("br", {}), ' Error Message: "', error.message, '"', u$1("button", {
543
+ children: [u$1("p", {
544
+ children: error.message
545
+ }), u$1("button", {
540
546
  onClick: resetError,
541
547
  style: {
542
- background: "#efefef",
548
+ background: "white",
543
549
  border: "none",
544
550
  cursor: "pointer",
551
+ textAlign: "center",
552
+ borderRadius: "4px",
545
553
  padding: "0.5rem 1rem"
546
554
  },
547
555
  children: "Retry"
@@ -698,6 +706,9 @@ const icons = {
698
706
  x: u$1("path", {
699
707
  d: "M8 8l8 8M8 16l8 -8"
700
708
  }),
709
+ plus: u$1("path", {
710
+ d: "M12 8V16M8 12H16"
711
+ }),
701
712
  "chevron-right": u$1("path", {
702
713
  d: "M11 8L15 12L11 16"
703
714
  })
@@ -911,6 +922,7 @@ function B$1(n2, t2) {
911
922
  }
912
923
  const JOB_SEARCH_ELEMENT_ID = "inploi-job-search";
913
924
  const JOB_SEARCH_SCOPE_ELEMENT_ID = "ijs";
925
+ const PAGE_SIZE = 10;
914
926
  function g(n2, t2) {
915
927
  for (var e2 in t2)
916
928
  n2[e2] = t2[e2];
@@ -1476,11 +1488,11 @@ if (process.env.NODE_ENV === "production") {
1476
1488
  shim.exports = requireUseSyncExternalStoreShim_development();
1477
1489
  }
1478
1490
  var shimExports = shim.exports;
1479
- const noop = () => {
1491
+ const noop$1 = () => {
1480
1492
  };
1481
1493
  const UNDEFINED = (
1482
1494
  /*#__NOINLINE__*/
1483
- noop()
1495
+ noop$1()
1484
1496
  );
1485
1497
  const OBJECT = Object;
1486
1498
  const isUndefined = (v2) => v2 === UNDEFINED;
@@ -1566,8 +1578,8 @@ const [onWindowEvent, offWindowEvent] = isWindowDefined && window.addEventListen
1566
1578
  window.addEventListener.bind(window),
1567
1579
  window.removeEventListener.bind(window)
1568
1580
  ] : [
1569
- noop,
1570
- noop
1581
+ noop$1,
1582
+ noop$1
1571
1583
  ];
1572
1584
  const isVisible = () => {
1573
1585
  const visibilityState = isDocumentDefined && document.visibilityState;
@@ -1781,7 +1793,7 @@ const initCache = (provider, options) => {
1781
1793
  const opts = mergeObjects(defaultConfigOptions, options);
1782
1794
  const EVENT_REVALIDATORS = {};
1783
1795
  const mutate2 = internalMutate.bind(UNDEFINED, provider);
1784
- let unmount = noop;
1796
+ let unmount = noop$1;
1785
1797
  const subscriptions = {};
1786
1798
  const subscribe = (key, callback) => {
1787
1799
  const subs = subscriptions[key] || [];
@@ -1847,11 +1859,11 @@ const [cache, mutate] = initCache(/* @__PURE__ */ new Map());
1847
1859
  const defaultConfig = mergeObjects(
1848
1860
  {
1849
1861
  // events
1850
- onLoadingSlow: noop,
1851
- onSuccess: noop,
1852
- onError: noop,
1862
+ onLoadingSlow: noop$1,
1863
+ onSuccess: noop$1,
1864
+ onError: noop$1,
1853
1865
  onErrorRetry,
1854
- onDiscarded: noop,
1866
+ onDiscarded: noop$1,
1855
1867
  // switches
1856
1868
  revalidateOnFocus: true,
1857
1869
  revalidateOnReconnect: true,
@@ -2919,7 +2931,7 @@ const JobSchema = transform(JobPayloadSchema, (schema) => {
2919
2931
  if (schema.pay_mask)
2920
2932
  return "Competitive";
2921
2933
  if (schema.pay_max && schema.pay_min)
2922
- return numberFormatter.formatRange(+schema.pay_min, +schema.pay_max);
2934
+ return [numberFormatter.formatRange(+schema.pay_min, +schema.pay_max), payPeriods[schema.pay_type]].join(" ");
2923
2935
  if (schema.pay)
2924
2936
  return [numberFormatter.format(+schema.pay), payPeriods[schema.pay_type]].join(" ");
2925
2937
  if (!schema.pay && !schema.pay_min && !schema.pay_max)
@@ -2948,19 +2960,39 @@ const JobSchema = transform(JobPayloadSchema, (schema) => {
2948
2960
  };
2949
2961
  });
2950
2962
  const JobSearchResponseSchema = transform(object({
2951
- data: object({
2952
- results: array(JobSchema),
2953
- available_properties: AvailablePropertiesSchema
2954
- }),
2963
+ data: array(JobSchema),
2955
2964
  pagination: PaginationSchema
2956
2965
  }), (schema) => ({
2957
2966
  pagination: schema.pagination,
2958
- results: schema.data.results,
2959
- availableProperties: schema.data.available_properties
2967
+ results: schema.data
2960
2968
  }));
2961
2969
  const filtersToPayload = (filters) => {
2962
2970
  return Object.fromEntries(Object.entries(filters).map(([key, filter]) => [key, (filter == null ? void 0 : filter.value) ?? null]));
2963
2971
  };
2972
+ const getAvailableFilters = async ({
2973
+ apiClient,
2974
+ filters,
2975
+ logger,
2976
+ signal
2977
+ }) => {
2978
+ try {
2979
+ const response = await apiClient.fetch(`/search/filters`, {
2980
+ method: "POST",
2981
+ body: JSON.stringify({
2982
+ filters: filtersToPayload(filters)
2983
+ }),
2984
+ signal
2985
+ });
2986
+ return parse(AvailablePropertiesSchema, response);
2987
+ } catch (e2) {
2988
+ if (e2 instanceof ValiError) {
2989
+ logger.error(e2.message, e2.issues);
2990
+ } else {
2991
+ logger.error(e2);
2992
+ }
2993
+ throw e2;
2994
+ }
2995
+ };
2964
2996
  const getJobSearchResults = async ({
2965
2997
  apiClient,
2966
2998
  logger,
@@ -2969,16 +3001,14 @@ const getJobSearchResults = async ({
2969
3001
  page = 1
2970
3002
  }) => {
2971
3003
  try {
2972
- const response = await apiClient.fetch(`/search?page=${page}`, {
3004
+ const response = await apiClient.fetch(`/search/results?page=${page}&per_page=${PAGE_SIZE}`, {
2973
3005
  method: "POST",
2974
3006
  body: JSON.stringify({
2975
- query: "Customer Service",
2976
3007
  filters: filtersToPayload(filters)
2977
3008
  }),
2978
3009
  signal
2979
3010
  });
2980
- const parsedResponse = parse(JobSearchResponseSchema, response);
2981
- return parsedResponse;
3011
+ return parse(JobSearchResponseSchema, response);
2982
3012
  } catch (e2) {
2983
3013
  if (e2 instanceof ValiError) {
2984
3014
  logger.error(e2.message, e2.issues);
@@ -2988,17 +3018,15 @@ const getJobSearchResults = async ({
2988
3018
  throw e2;
2989
3019
  }
2990
3020
  };
2991
- const getDataState = (swr) => {
3021
+ const getQueryState = (swr) => {
2992
3022
  if (swr.error)
2993
3023
  return {
2994
3024
  state: "error",
2995
- error: swr.error,
2996
- data: swr.data
3025
+ error: swr.error
2997
3026
  };
2998
3027
  if (swr.isLoading && swr.data === void 0)
2999
3028
  return {
3000
- state: "loading",
3001
- data: swr.data
3029
+ state: "loading"
3002
3030
  };
3003
3031
  if ((swr.isLoading || swr.isValidating) && swr.data)
3004
3032
  return {
@@ -3010,7 +3038,7 @@ const getDataState = (swr) => {
3010
3038
  state: "loaded",
3011
3039
  data: swr.data
3012
3040
  };
3013
- throw new Error("Unhandled state");
3041
+ throw new Error("Unhandled data state");
3014
3042
  };
3015
3043
  const SWR_SETTINGS = {
3016
3044
  keepPreviousData: true,
@@ -3019,6 +3047,7 @@ const SWR_SETTINGS = {
3019
3047
  revalidateIfStale: false,
3020
3048
  revalidateFirstPage: false
3021
3049
  };
3050
+ const cacheKey = (value) => JSON.stringify(value);
3022
3051
  function r(e2) {
3023
3052
  var t2, f2, n2 = "";
3024
3053
  if ("string" == typeof e2 || "number" == typeof e2)
@@ -3092,26 +3121,141 @@ const defineConfig = (options) => {
3092
3121
  return { compose: compose1, cva: cva1, cx: cx1 };
3093
3122
  };
3094
3123
  const { compose, cva, cx } = defineConfig();
3124
+ const tagClass = cva({
3125
+ base: "truncate max-w-full block fr font-style-tag font-family-tag font-weight-tag text-style-tag",
3126
+ variants: {
3127
+ variant: {
3128
+ neutralWeak: "bg-tag-neutral-weak-bg border-solid border-px text-tag-neutral-weak-copy border-tag-neutral-weak-stroke",
3129
+ neutralStrong: "text-tag-neutral-strong-copy border-solid border-px bg-tag-neutral-strong-bg border-tag-neutral-strong-stroke",
3130
+ accentStrong: "text-tag-accent-strong-copy border-solid border-px bg-tag-accent-strong-bg border-tag-accent-strong-stroke",
3131
+ monetaryWeak: "bg-tag-monetary-weak-bg border-none text-tag-monetary-weak-copy"
3132
+ },
3133
+ interactive: {
3134
+ true: "ease-expo-out rounded-interactive transition-all duration-snappy ",
3135
+ false: "rounded-tag"
3136
+ },
3137
+ size: {
3138
+ xs: "px-2",
3139
+ sm: "px-3 py-1",
3140
+ lg: "px-5 py-2"
3141
+ },
3142
+ disabled: {
3143
+ true: "opacity-25 pointer-events-none",
3144
+ false: ""
3145
+ }
3146
+ },
3147
+ compoundVariants: [{
3148
+ disabled: false,
3149
+ interactive: true,
3150
+ class: "cursor-pointer active:scale-[0.975]"
3151
+ }],
3152
+ defaultVariants: {
3153
+ variant: "neutralWeak",
3154
+ size: "sm",
3155
+ disabled: false,
3156
+ interactive: false
3157
+ }
3158
+ });
3159
+ const CurrentValueTag = ({
3160
+ query,
3161
+ property,
3162
+ selectedValues
3163
+ }) => {
3164
+ switch (query.state) {
3165
+ case "error":
3166
+ case "loading":
3167
+ return null;
3168
+ case "loaded":
3169
+ case "revalidating": {
3170
+ const suggestions = query.data[property.key];
3171
+ invariant(suggestions, `API error: no available properties for key “${property.key}”`);
3172
+ const selectedSuggestions = suggestions.filter((s2) => selectedValues.includes(s2.value));
3173
+ switch (selectedSuggestions.length) {
3174
+ case 0:
3175
+ return null;
3176
+ case 1: {
3177
+ const firstSuggestion = selectedSuggestions[0];
3178
+ invariant(firstSuggestion);
3179
+ return u$1("span", {
3180
+ class: tagClass({
3181
+ size: "sm",
3182
+ variant: "accentStrong",
3183
+ interactive: true,
3184
+ class: "truncate"
3185
+ }),
3186
+ children: firstSuggestion.label
3187
+ });
3188
+ }
3189
+ default:
3190
+ return u$1("span", {
3191
+ class: tagClass({
3192
+ size: "sm",
3193
+ variant: "accentStrong",
3194
+ interactive: true,
3195
+ class: "truncate tabular-nums"
3196
+ }),
3197
+ children: selectedSuggestions.length
3198
+ });
3199
+ }
3200
+ }
3201
+ default:
3202
+ exhaustive(query);
3203
+ }
3204
+ };
3095
3205
  const btnClass = cva({
3096
3206
  base: "fr animate-selected-tag justify-center touch-hitbox text-style-filter ease-expo-out rounded-interactive relative flex cursor-pointer items-center py-1 transition-all duration-snappy active:scale-95",
3097
3207
  variants: {
3098
3208
  variant: {
3099
- neutral: "bg-interactive-neutral-bg hover:bg-interactive-neutral-bg-hover text-interactive-neutral-text",
3100
- accent: "bg-interactive-accent-bg hover:bg-interactive-accent-bg-hover text-interactive-accent-text"
3209
+ neutral: "bg-interactive-neutral-bg pointer-fine:hover:bg-interactive-neutral-bg-hover text-interactive-neutral-text",
3210
+ accent: "bg-interactive-accent-bg pointer-fine:hover:bg-interactive-accent-bg-hover text-interactive-accent-text"
3101
3211
  },
3102
3212
  icon: {
3103
- none: "px-3",
3104
- right: "pl-3 pr-1",
3105
- left: "pl-1 pr-3"
3213
+ none: "",
3214
+ right: "",
3215
+ left: ""
3216
+ },
3217
+ size: {
3218
+ sm: "py-1",
3219
+ lg: "py-2"
3106
3220
  }
3107
3221
  },
3222
+ compoundVariants: [
3223
+ {
3224
+ size: "sm",
3225
+ icon: "right",
3226
+ class: "pl-3 pr-1"
3227
+ },
3228
+ {
3229
+ size: "sm",
3230
+ icon: "left",
3231
+ class: "pl-1 pr-3"
3232
+ },
3233
+ {
3234
+ size: "sm",
3235
+ icon: "none",
3236
+ class: "px-3"
3237
+ },
3238
+ {
3239
+ size: "lg",
3240
+ icon: "right",
3241
+ class: "pl-5 pr-3"
3242
+ }
3243
+ // { size: 'lg', icon: 'left', class: 'pl-3 pr-5' },
3244
+ // { size: 'lg', icon: 'none', class: 'px-5' },
3245
+ ],
3108
3246
  defaultVariants: {
3109
3247
  variant: "neutral",
3110
- icon: "none"
3248
+ icon: "none",
3249
+ size: "sm"
3111
3250
  }
3112
3251
  });
3252
+ const SUGGESTION_COUNT = 8;
3253
+ const TAG_HEIGHT = 42;
3254
+ const GAP = 8;
3255
+ const LINE_COUNT = 6;
3256
+ const PADDING_Y = 4;
3113
3257
  const inputClass = cva({
3114
- base: "py-2 fr bg-lowest caret-accent-11 placeholder:text-neutral-10 ring-job-card-stroke ring-width-section px-4 ease-expo-out duration-snappy transition-all rounded-input font-style-input text-style-input font-weight-input",
3258
+ base: "py-2 fr bg-lowest caret-accent-11 placeholder:text-neutral-10 ring-job-card-stroke ring-width-section px-4 ease-expo-out duration-snappy transition-all rounded-input font-style-input text-style-input font-weight-input",
3115
3259
  variants: {
3116
3260
  hasValue: {
3117
3261
  false: "text-copy-neutral",
@@ -3127,26 +3271,33 @@ const toggleInArray = (array2, value) => {
3127
3271
  };
3128
3272
  const FilterContentActive = ({
3129
3273
  value,
3130
- suggestions,
3131
3274
  property,
3132
3275
  onSkip,
3133
- state,
3276
+ useQuery,
3134
3277
  onValueChange,
3278
+ unfilteredQuery,
3135
3279
  onRender
3136
3280
  }) => {
3137
- const [internalValue, setInternalValue] = h(value);
3138
- p(() => {
3139
- setInternalValue(value);
3140
- }, [value]);
3281
+ const filterQuery = getQueryState(useQuery());
3282
+ if (filterQuery.state === "error")
3283
+ throw filterQuery.error;
3284
+ const availablePropertyKeys = F$1(() => {
3285
+ switch (filterQuery.state) {
3286
+ case "loading":
3287
+ return null;
3288
+ case "loaded":
3289
+ case "revalidating": {
3290
+ const properties = filterQuery.data[property.key] ?? [];
3291
+ return Object.fromEntries(properties.map((p2) => [p2.value, true]));
3292
+ }
3293
+ default:
3294
+ exhaustive(filterQuery);
3295
+ }
3296
+ }, [filterQuery, property.key]);
3141
3297
  const selectedValues = getSelectedValues(value);
3142
- const selectedInternalValues = getSelectedValues(internalValue);
3143
- const hasValue = selectedValues.length > 0 || selectedInternalValues.length > 0;
3298
+ const hasValue = selectedValues.length > 0;
3299
+ const [displayCount, setDisplayCount] = h(SUGGESTION_COUNT);
3144
3300
  const [search, setSearch] = h();
3145
- const availableSuggestions = F$1(() => {
3146
- if (!search)
3147
- return suggestions;
3148
- return suggestions.filter((s2) => s2.label.toLowerCase().includes(search.toLowerCase()));
3149
- }, [search, suggestions]);
3150
3301
  p(() => {
3151
3302
  onRender();
3152
3303
  });
@@ -3163,65 +3314,111 @@ const FilterContentActive = ({
3163
3314
  onInput: (e2) => setSearch(e2.currentTarget.value),
3164
3315
  placeholder: "Type to search"
3165
3316
  })
3166
- }), state === "loading" ? u$1("div", {
3167
- class: "flex px-4",
3168
- children: u$1("div", {
3169
- "aria-hidden": true,
3170
- class: tagClass$1({
3171
- size: "lg",
3172
- active: false,
3173
- class: "animate-skeleton cursor-default opacity-20 active:-scale-100"
3174
- }),
3175
- children: u$1("span", {
3176
- class: "inline-block w-[10ch]"
3177
- })
3178
- })
3179
- }) : u$1("ul", {
3180
- "aria-label": "Filter options",
3181
- class: "hide-scrollbars -my-2 flex w-full select-none gap-1.5 overflow-auto px-4 py-2 md:flex-wrap md:overflow-hidden",
3182
- children: availableSuggestions.length === 0 ? u$1("p", {
3183
- class: "font-style-tag text-style-tag font-weight-tag border-px w-full border-transparent py-2 text-center md:text-left",
3184
- children: "No filter options available."
3185
- }) : availableSuggestions.slice(0, 10).map((suggestion) => {
3186
- const active = selectedInternalValues.includes(suggestion.value);
3187
- return u$1("li", {
3188
- class: "animate-appear-tag max-w-full origin-top",
3189
- children: u$1("button", {
3190
- "data-filter": true,
3191
- "data-current-value": active ? "true" : void 0,
3192
- onClick: () => {
3193
- switch (value.select) {
3194
- case "many": {
3195
- const newValue = toggleInArray(selectedInternalValues, suggestion.value);
3196
- setInternalValue({
3197
- select: "many",
3198
- value: newValue
3199
- });
3200
- break;
3201
- }
3202
- case "one":
3203
- setInternalValue({
3204
- select: "one",
3205
- value: suggestion.value
3206
- });
3207
- onValueChange({
3208
- select: "one",
3209
- value: suggestion.value
3210
- });
3211
- break;
3212
- default:
3213
- exhaustive(value);
3214
- }
3215
- },
3216
- class: tagClass$1({
3217
- size: "lg",
3218
- active
3219
- }),
3220
- children: suggestion.label
3221
- })
3222
- }, suggestion.value);
3223
- })
3224
- }), u$1("div", {
3317
+ }), (() => {
3318
+ switch (unfilteredQuery.state) {
3319
+ case "error":
3320
+ throw unfilteredQuery.error;
3321
+ case "loading":
3322
+ return u$1("div", {
3323
+ class: "flex px-4",
3324
+ children: u$1("div", {
3325
+ "aria-hidden": true,
3326
+ class: tagClass({
3327
+ size: "lg",
3328
+ variant: "neutralStrong",
3329
+ interactive: true,
3330
+ class: "animate-skeleton cursor-default opacity-20 active:-scale-100"
3331
+ }),
3332
+ children: u$1("span", {
3333
+ class: "inline-block w-[10ch]"
3334
+ })
3335
+ })
3336
+ });
3337
+ case "revalidating":
3338
+ case "loaded": {
3339
+ const allSuggestions = unfilteredQuery.data[property.key];
3340
+ invariant(allSuggestions, `API error: no available properties for key “${property.key}”`);
3341
+ const filteredSuggestions = search && search.length > 1 ? allSuggestions.filter((s2) => s2.label.toLowerCase().includes(search.toLowerCase())) : allSuggestions;
3342
+ const suggestions = filteredSuggestions.map((s2) => ({
3343
+ ...s2,
3344
+ disabled: availablePropertyKeys === null ? false : availablePropertyKeys[s2.value] !== true
3345
+ }));
3346
+ const noEnabledOptions = !suggestions.find((suggestion) => !suggestion.disabled);
3347
+ if (noEnabledOptions)
3348
+ return u$1("p", {
3349
+ class: "font-style-tag text-style-tag font-weight-tag border-px w-full border-transparent px-4 py-2 text-center",
3350
+ children: "No filter options available."
3351
+ });
3352
+ return u$1("div", {
3353
+ class: "pointer-fine:px-4",
3354
+ children: u$1("ul", {
3355
+ style: {
3356
+ maxHeight: (TAG_HEIGHT + GAP) * (LINE_COUNT - 1) + TAG_HEIGHT / 2 + 2 * PADDING_Y
3357
+ },
3358
+ class: "hide-scrollbars pointer-fine:flex-wrap pointer-fine:p-2 pointer-fine:ring-width-section ring-section-weak-stroke pointer-fine:bg-app pointer-fine:rounded-section pointer-coarse:overflow-x-auto flex max-w-full gap-2 overflow-y-auto px-4",
3359
+ children: [suggestions.slice(0, displayCount).map((suggestion) => {
3360
+ const active = selectedValues.includes(suggestion.value);
3361
+ return u$1("li", {
3362
+ class: "animate-appear-tag max-w-full origin-top",
3363
+ children: u$1("button", {
3364
+ "data-filter": true,
3365
+ "data-current-value": active ? "true" : void 0,
3366
+ onClick: () => {
3367
+ switch (value.select) {
3368
+ case "many": {
3369
+ const newValue = toggleInArray(selectedValues, suggestion.value);
3370
+ onValueChange({
3371
+ select: "many",
3372
+ value: newValue
3373
+ });
3374
+ break;
3375
+ }
3376
+ case "one":
3377
+ onValueChange({
3378
+ select: "one",
3379
+ value: suggestion.value
3380
+ });
3381
+ break;
3382
+ default:
3383
+ exhaustive(value);
3384
+ }
3385
+ },
3386
+ class: tagClass({
3387
+ size: "lg",
3388
+ variant: active ? "accentStrong" : "neutralStrong",
3389
+ interactive: true,
3390
+ disabled: suggestion.disabled
3391
+ }),
3392
+ children: suggestion.label
3393
+ })
3394
+ }, suggestion.value);
3395
+ }), suggestions.length > displayCount && u$1("li", {
3396
+ class: "animate-appear-tag pointer-fine:w-full max-w-full flex-none origin-top",
3397
+ children: u$1("button", {
3398
+ class: btnClass({
3399
+ variant: "neutral",
3400
+ icon: "right",
3401
+ size: "lg",
3402
+ class: "border-px flex w-full max-w-full flex-none flex-nowrap justify-center truncate border-transparent"
3403
+ }),
3404
+ onClick: () => {
3405
+ setDisplayCount(displayCount + SUGGESTION_COUNT);
3406
+ },
3407
+ children: [u$1("span", {
3408
+ class: "font-style-tag font-family-tag font-weight-tag text-style-tag",
3409
+ children: "Show More"
3410
+ }), u$1(Icon, {
3411
+ name: "plus"
3412
+ })]
3413
+ })
3414
+ })]
3415
+ })
3416
+ });
3417
+ }
3418
+ default:
3419
+ exhaustive(unfilteredQuery);
3420
+ }
3421
+ })(), u$1("footer", {
3225
3422
  class: "flex justify-end p-2",
3226
3423
  children: [u$1("div", {
3227
3424
  class: "flex-1",
@@ -3241,7 +3438,7 @@ const FilterContentActive = ({
3241
3438
  class: "flex items-center overflow-hidden",
3242
3439
  children: u$1("p", {
3243
3440
  class: "font-style-default text-style-tag font-weight-default flex-grow select-none truncate text-center",
3244
- children: [selectedInternalValues.length, " selected"]
3441
+ children: [selectedValues.length, " selected"]
3245
3442
  })
3246
3443
  }), u$1("div", {
3247
3444
  class: "flex-1",
@@ -3251,12 +3448,7 @@ const FilterContentActive = ({
3251
3448
  icon: "right",
3252
3449
  class: "ml-auto"
3253
3450
  }),
3254
- onClick: () => {
3255
- if (hasValue) {
3256
- onValueChange(internalValue);
3257
- }
3258
- onSkip();
3259
- },
3451
+ onClick: onSkip,
3260
3452
  children: [hasValue ? "Done" : "Skip", " ", u$1(Icon, {
3261
3453
  name: "chevron-right"
3262
3454
  })]
@@ -3276,21 +3468,8 @@ const filterIcons = {
3276
3468
  company_name: "briefcase",
3277
3469
  category: "briefcase"
3278
3470
  };
3279
- const tagClass$1 = cva({
3280
- base: "ease-expo-out truncate max-w-full block cursor-pointer fr border-solid border-px font-style-tag font-family-tag font-weight-tag text-style-tag rounded-interactive transition-all duration-snappy active:scale-[0.975]",
3281
- variants: {
3282
- active: {
3283
- false: "text-tag-neutral-strong-copy bg-tag-neutral-strong-bg border-tag-neutral-strong-stroke",
3284
- true: "text-tag-accent-strong-copy bg-tag-accent-strong-bg border-tag-accent-strong-stroke"
3285
- },
3286
- size: {
3287
- sm: "px-3 py-1",
3288
- lg: "px-5 py-2"
3289
- }
3290
- }
3291
- });
3292
3471
  const wrapperClass$1 = cva({
3293
- base: "group flex min-w-0 fr overflow-hidden rounded-section text-copy-neutral-lowcontrast ring-width-section transition-all duration-medium ease-expo-out fr-parent [&:has(.fr-child:active)]:scale-[0.975]",
3472
+ base: "group flex min-w-0 fr overflow-hidden rounded-section text-copy-neutral-lowcontrast ring-width-section transition-all duration-medium ease-expo-out fr-parent [&:has(.fr-child:active)]:scale-[0.975] origin-[50%_1.75rem]",
3294
3473
  variants: {
3295
3474
  hasValue: {
3296
3475
  false: "bg-section-weak-bg ring-section-weak-stroke",
@@ -3335,22 +3514,19 @@ const Filter = ({
3335
3514
  value,
3336
3515
  onActiveChange,
3337
3516
  property,
3338
- suggestions,
3339
3517
  onSkip,
3340
3518
  onValueChange,
3341
- state
3519
+ unfilteredQuery,
3520
+ useQuery
3342
3521
  }) => {
3343
- var _a;
3344
3522
  const icon = property.icon ?? filterIcons[property.key] ?? "filter";
3345
3523
  const selectedValues = getSelectedValues(value);
3346
- const hasValue = selectedValues.length > 0;
3347
3524
  const {
3348
3525
  height,
3349
3526
  ref: contentRef,
3350
3527
  updateHeight
3351
3528
  } = useMeasureHeight([active]);
3352
- const selectedSuggestions = suggestions.filter((s2) => selectedValues.includes(s2.value));
3353
- const selectedLabel = selectedSuggestions.length > 1 ? selectedSuggestions.length.toString() : (_a = selectedSuggestions[0]) == null ? void 0 : _a.label;
3529
+ const hasValue = selectedValues.length > 0;
3354
3530
  return u$1("section", {
3355
3531
  "data-filter-key": property.key,
3356
3532
  role: "tab",
@@ -3359,7 +3535,7 @@ const Filter = ({
3359
3535
  class: wrapperClass$1({
3360
3536
  hasValue
3361
3537
  }),
3362
- onTouchStart: () => void 0,
3538
+ onTouchStart: noop,
3363
3539
  children: [u$1("div", {
3364
3540
  class: "min-w-0 max-w-full shrink-0 flex-grow",
3365
3541
  children: [u$1("button", {
@@ -3384,12 +3560,12 @@ const Filter = ({
3384
3560
  class: "w-full",
3385
3561
  ref: contentRef,
3386
3562
  children: active && u$1(FilterContentActive, {
3563
+ useQuery,
3387
3564
  onRender: updateHeight,
3388
3565
  onSkip,
3389
3566
  onValueChange,
3567
+ unfilteredQuery,
3390
3568
  property,
3391
- state,
3392
- suggestions,
3393
3569
  value
3394
3570
  })
3395
3571
  })
@@ -3398,16 +3574,13 @@ const Filter = ({
3398
3574
  tabIndex: -1,
3399
3575
  class: "fr-child flex flex-shrink flex-grow cursor-pointer select-none items-center justify-end gap-2 overflow-hidden pl-2 pr-3 focus:outline-none",
3400
3576
  onClick: () => onActiveChange(true),
3401
- children: [selectedLabel && u$1("div", {
3577
+ children: [u$1("div", {
3402
3578
  "aria-label": "Current value",
3403
3579
  class: "flex max-w-full gap-1 overflow-hidden",
3404
- children: u$1("span", {
3405
- class: tagClass$1({
3406
- size: "sm",
3407
- active: true,
3408
- class: "truncate tabular-nums"
3409
- }),
3410
- children: selectedLabel
3580
+ children: u$1(CurrentValueTag, {
3581
+ property,
3582
+ query: unfilteredQuery,
3583
+ selectedValues
3411
3584
  })
3412
3585
  }), u$1(Icon, {
3413
3586
  class: chevronClass(),
@@ -3443,6 +3616,8 @@ const useFilterKeyboardFocus = (activeKey, ref) => {
3443
3616
  focusFirstAvailableOption(keyToFocus, ref);
3444
3617
  }, [activeKey, previousActiveKey, ref]);
3445
3618
  };
3619
+ function noop() {
3620
+ }
3446
3621
  const nextStateFromValue = ({
3447
3622
  property,
3448
3623
  value,
@@ -3489,72 +3664,72 @@ const FilterSection = ({
3489
3664
  var _a;
3490
3665
  const [activeKey, setActiveKey] = h((_a = properties[0]) == null ? void 0 : _a.key);
3491
3666
  useFilterKeyboardFocus(activeKey, parentRef);
3492
- const {
3493
- ...swr
3494
- } = useSWR(JSON.stringify(appliedFilters), () => getJobSearchResults({
3667
+ const defaultFilters = F$1(() => getFilterDefaults(properties), [properties]);
3668
+ const unfilteredQuery = getQueryState(useSWR(cacheKey(defaultFilters), () => getAvailableFilters({
3495
3669
  apiClient,
3496
3670
  logger,
3497
- filters: appliedFilters
3498
- }), SWR_SETTINGS);
3499
- const {
3500
- data,
3501
- error,
3502
- state
3503
- } = getDataState(swr);
3504
- switch (state) {
3505
- case "error":
3506
- throw error;
3507
- case "loading":
3508
- case "revalidating":
3509
- case "loaded":
3510
- return u$1("aside", {
3511
- children: u$1("div", {
3512
- role: "tablist",
3513
- class: "top-filters sticky flex flex-col gap-2 px-4 md:px-0",
3514
- children: properties.map((property) => {
3515
- const active = activeKey === property.key;
3516
- const value = appliedFilters[property.key] ?? {
3517
- select: property.select,
3518
- value: void 0
3519
- };
3520
- const onValueChange = (value2) => {
3521
- const {
3522
- newActiveKey,
3523
- newValue
3524
- } = nextStateFromValue({
3525
- property,
3526
- activeKey,
3527
- value: value2,
3528
- properties,
3529
- appliedFilters
3530
- });
3531
- setActiveKey(newActiveKey);
3532
- return onFilterValueChange(property.key, newValue);
3533
- };
3534
- const onActiveChange = (active2) => setActiveKey(active2 ? property.key : void 0);
3535
- const suggestions = (data == null ? void 0 : data.availableProperties[property.key]) ?? [];
3536
- return u$1(ErrorBoundary, {
3537
- Fallback,
3538
- children: u$1(Filter, {
3539
- active,
3540
- property,
3541
- onActiveChange,
3542
- value,
3543
- suggestions,
3544
- onSkip: () => {
3545
- var _a2;
3546
- const currentIndex = properties.findIndex((p2) => p2.key === activeKey);
3547
- const nextPropertyKey = currentIndex !== -1 ? (_a2 = properties[currentIndex + 1]) == null ? void 0 : _a2.key : void 0;
3548
- setActiveKey(nextPropertyKey);
3549
- },
3550
- onValueChange,
3551
- state
3552
- })
3553
- }, property.key);
3671
+ filters: defaultFilters
3672
+ }), SWR_SETTINGS));
3673
+ if (unfilteredQuery.state === "error")
3674
+ throw unfilteredQuery.error;
3675
+ const makeQueryWithoutFilter = T$1((keyToExclude) => () => {
3676
+ const filters = {
3677
+ ...appliedFilters,
3678
+ [keyToExclude]: defaultFilters[keyToExclude]
3679
+ };
3680
+ return useSWR(cacheKey(filters), () => getAvailableFilters({
3681
+ apiClient,
3682
+ logger,
3683
+ filters
3684
+ }), SWR_SETTINGS);
3685
+ }, [apiClient, appliedFilters, defaultFilters, logger]);
3686
+ return u$1("aside", {
3687
+ children: u$1("div", {
3688
+ role: "tablist",
3689
+ class: "top-filters sticky flex flex-col gap-2 px-4 md:px-0",
3690
+ children: properties.map((property) => {
3691
+ const active = activeKey === property.key;
3692
+ const value = appliedFilters[property.key] ?? {
3693
+ select: property.select,
3694
+ value: void 0
3695
+ };
3696
+ const onValueChange = (value2) => {
3697
+ const {
3698
+ newActiveKey,
3699
+ newValue
3700
+ } = nextStateFromValue({
3701
+ property,
3702
+ activeKey,
3703
+ value: value2,
3704
+ properties,
3705
+ appliedFilters
3706
+ });
3707
+ setActiveKey(newActiveKey);
3708
+ return onFilterValueChange(property.key, newValue);
3709
+ };
3710
+ const onActiveChange = (active2) => setActiveKey(active2 ? property.key : void 0);
3711
+ const useQuery = makeQueryWithoutFilter(property.key);
3712
+ return u$1(ErrorBoundary, {
3713
+ Fallback,
3714
+ children: u$1(Filter, {
3715
+ unfilteredQuery,
3716
+ active,
3717
+ property,
3718
+ onActiveChange,
3719
+ value,
3720
+ onSkip: () => {
3721
+ var _a2;
3722
+ const currentIndex = properties.findIndex((p2) => p2.key === activeKey);
3723
+ const nextPropertyKey = currentIndex !== -1 ? (_a2 = properties[currentIndex + 1]) == null ? void 0 : _a2.key : void 0;
3724
+ setActiveKey(nextPropertyKey);
3725
+ },
3726
+ useQuery,
3727
+ onValueChange
3554
3728
  })
3555
- })
3556
- });
3557
- }
3729
+ }, property.key);
3730
+ })
3731
+ })
3732
+ });
3558
3733
  };
3559
3734
  const getFirstPageKey = (getKey) => {
3560
3735
  return serialize(getKey ? getKey(0, null) : null)[0];
@@ -3778,18 +3953,6 @@ const wrapperClass = cva({
3778
3953
  const badgeClass = cva({
3779
3954
  base: "bg-tag-accent-strong-bg rounded-job-tag text-style-tag text-tag-accent-strong-copy font-weight-tag flex items-center justify-center px-2"
3780
3955
  });
3781
- const tagClass = cva({
3782
- base: "rounded-tag text-style-tag font-weight-tag block px-2",
3783
- variants: {
3784
- colorScheme: {
3785
- default: "bg-tag-neutral-weak-bg text-tag-neutral-weak-copy ring-px ring-tag-neutral-weak-stroke",
3786
- monetary: "bg-tag-monetary-weak-bg text-tag-monetary-weak-copy"
3787
- }
3788
- },
3789
- defaultVariants: {
3790
- colorScheme: "default"
3791
- }
3792
- });
3793
3956
  const JobCard = ({
3794
3957
  job
3795
3958
  }) => {
@@ -3820,13 +3983,16 @@ const JobCard = ({
3820
3983
  class: "flex flex-col items-start gap-2",
3821
3984
  children: [job.pay && u$1("span", {
3822
3985
  class: tagClass({
3823
- colorScheme: "monetary"
3986
+ variant: "monetaryWeak",
3987
+ size: "xs"
3824
3988
  }),
3825
3989
  children: job.pay
3826
3990
  }), job.contractType && u$1("div", {
3827
3991
  class: "flex items-center gap-2",
3828
3992
  children: u$1("span", {
3829
- class: tagClass(),
3993
+ class: tagClass({
3994
+ size: "xs"
3995
+ }),
3830
3996
  children: job.contractType
3831
3997
  })
3832
3998
  })]
@@ -3879,19 +4045,22 @@ const JobCardSkeleton = ({
3879
4045
  class: "flex flex-col items-start gap-2",
3880
4046
  children: [seed % 2 === 0 && u$1("span", {
3881
4047
  class: tagClass({
3882
- colorScheme: "default",
4048
+ variant: "neutralWeak",
4049
+ size: "xs",
3883
4050
  class: "h-[1lh] w-[10ch]"
3884
4051
  })
3885
4052
  }), u$1("div", {
3886
4053
  class: "flex items-center gap-2",
3887
4054
  children: [u$1("span", {
3888
4055
  class: tagClass({
3889
- colorScheme: "default",
4056
+ variant: "neutralWeak",
4057
+ size: "xs",
3890
4058
  class: "h-[1lh] w-[6ch]"
3891
4059
  })
3892
4060
  }), u$1("span", {
3893
4061
  class: tagClass({
3894
- colorScheme: "default",
4062
+ variant: "neutralWeak",
4063
+ size: "xs",
3895
4064
  class: "h-[1lh] w-[8ch]"
3896
4065
  })
3897
4066
  })]
@@ -3915,7 +4084,7 @@ const LoadMore = ({
3915
4084
  class: "flex flex-col gap-3",
3916
4085
  "aria-hidden": true,
3917
4086
  children: Array.from({
3918
- length: 4
4087
+ length: PAGE_SIZE
3919
4088
  }).map((_2, i2) => u$1("li", {
3920
4089
  children: u$1(JobCardSkeleton, {
3921
4090
  seed: i2,
@@ -3971,7 +4140,7 @@ const ResultsSection = ({
3971
4140
  ...swr
3972
4141
  } = useSWRInfinite((index, prevPageData) => {
3973
4142
  if (prevPageData === null)
3974
- return index + 1 + "/" + JSON.stringify(appliedFilters);
4143
+ return index + 1 + "/" + cacheKey(appliedFilters);
3975
4144
  if (prevPageData.pagination.last_page === prevPageData.pagination.current_page)
3976
4145
  return null;
3977
4146
  return index + 1 + "/" + JSON.stringify(appliedFilters);
@@ -3989,7 +4158,7 @@ const ResultsSection = ({
3989
4158
  data,
3990
4159
  error,
3991
4160
  state
3992
- } = getDataState(swr);
4161
+ } = getQueryState(swr);
3993
4162
  const fetchNextPage = () => {
3994
4163
  setSize((size2) => size2 + 1);
3995
4164
  };
@@ -4006,7 +4175,7 @@ const ResultsSection = ({
4006
4175
  class: "flex flex-col gap-3",
4007
4176
  "aria-hidden": true,
4008
4177
  children: Array.from({
4009
- length: 30
4178
+ length: PAGE_SIZE
4010
4179
  }).map((_2, i2) => u$1("li", {
4011
4180
  children: u$1(JobCardSkeleton, {
4012
4181
  seed: i2,
@@ -4139,7 +4308,7 @@ const JobSearch = ({
4139
4308
  })
4140
4309
  });
4141
4310
  };
4142
- const tailwind = "#ijs {\n font-size: 16px;\n --tw-content: '';\n}\n\n #ijs * {\n box-sizing: border-box;\n border-style: solid;\n border-width: 0;\n -webkit-tap-highlight-color: transparent;\n font-family: inherit;\n font-style: inherit;\n font-weight: inherit;\n }\n\n #ijs ::before,\n #ijs ::after {\n box-sizing: border-box;\n }\n\n #ijs :is(a) {\n text-decoration: none;\n }\n\n #ijs :is(ul, ol) {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n #ijs :is(p) {\n margin: 0;\n padding: 0;\n }\n\n #ijs :is(li) {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n #ijs :is(button),\n #ijs :is(a) {\n display: block;\n margin: 0;\n padding: 0;\n border: unset;\n background: unset;\n text-align: unset;\n }\n\n #ijs :is(input),\n #ijs :is(textarea) {\n display: block;\n margin: 0;\n padding: 0;\n min-width: 0;\n max-width: unset;\n width: 100%;\n }\n\n #ijs :is(svg) {\n display: block;\n }\n\n #ijs.reduced-motion * {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n animation-delay: 0s !important;\n }\n\n @media (prefers-reduced-motion) {\n #ijs * {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n animation-delay: 0s !important;\n }\n }\n\n #ijs *, #ijs ::before, #ijs ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n #ijs ::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n #ijs .container {\n width: 100%;\n}\n\n @media (min-width: 640px) {\n\n #ijs .container {\n max-width: 640px;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .container {\n max-width: 768px;\n }\n}\n\n @media (min-width: 1024px) {\n\n #ijs .container {\n max-width: 1024px;\n }\n}\n\n @media (min-width: 1280px) {\n\n #ijs .container {\n max-width: 1280px;\n }\n}\n\n @media (min-width: 1536px) {\n\n #ijs .container {\n max-width: 1536px;\n }\n}\n\n #ijs .visible {\n visibility: visible;\n}\n\n #ijs .invisible {\n visibility: hidden;\n}\n\n #ijs .collapse {\n visibility: collapse;\n}\n\n #ijs .static {\n position: static;\n}\n\n #ijs .fixed {\n position: fixed;\n}\n\n #ijs .absolute {\n position: absolute;\n}\n\n #ijs .relative {\n position: relative;\n}\n\n #ijs .sticky {\n position: sticky;\n}\n\n #ijs .top-0 {\n top: 0px;\n}\n\n #ijs .isolate {\n isolation: isolate;\n}\n\n #ijs .m-0 {\n margin: 0px;\n}\n\n #ijs .m-11 {\n margin: 2.75rem;\n}\n\n #ijs .m-3 {\n margin: 0.75rem;\n}\n\n #ijs .-my-2 {\n margin-top: -0.5rem;\n margin-bottom: -0.5rem;\n}\n\n #ijs .mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n #ijs .ml-auto {\n margin-left: auto;\n}\n\n #ijs .block {\n display: block;\n}\n\n #ijs .inline-block {\n display: inline-block;\n}\n\n #ijs .inline {\n display: inline;\n}\n\n #ijs .flex {\n display: flex;\n}\n\n #ijs .inline-flex {\n display: inline-flex;\n}\n\n #ijs .table {\n display: table;\n}\n\n #ijs .table-row {\n display: table-row;\n}\n\n #ijs .flow-root {\n display: flow-root;\n}\n\n #ijs .grid {\n display: grid;\n}\n\n #ijs .inline-grid {\n display: inline-grid;\n}\n\n #ijs .contents {\n display: contents;\n}\n\n #ijs .list-item {\n display: list-item;\n}\n\n #ijs .\\!hidden {\n display: none !important;\n}\n\n #ijs .hidden {\n display: none;\n}\n\n #ijs .h-8 {\n height: 2rem;\n}\n\n #ijs .h-\\[1lh\\] {\n height: 1lh;\n}\n\n #ijs .min-h-screen {\n min-height: 100vh;\n}\n\n #ijs .w-\\[10ch\\] {\n width: 10ch;\n}\n\n #ijs .w-\\[6ch\\] {\n width: 6ch;\n}\n\n #ijs .w-\\[8ch\\] {\n width: 8ch;\n}\n\n #ijs .w-full {\n width: 100%;\n}\n\n #ijs .min-w-0 {\n min-width: 0px;\n}\n\n #ijs .max-w-full {\n max-width: 100%;\n}\n\n #ijs .max-w-screen-lg {\n max-width: 1024px;\n}\n\n #ijs .flex-1 {\n flex: 1 1 0%;\n}\n\n #ijs .flex-none {\n flex: none;\n}\n\n #ijs .flex-shrink {\n flex-shrink: 1;\n}\n\n #ijs .shrink {\n flex-shrink: 1;\n}\n\n #ijs .shrink-0 {\n flex-shrink: 0;\n}\n\n #ijs .flex-grow {\n flex-grow: 1;\n}\n\n #ijs .grow {\n flex-grow: 1;\n}\n\n #ijs .border-collapse {\n border-collapse: collapse;\n}\n\n #ijs .origin-top {\n transform-origin: top;\n}\n\n #ijs .transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n @keyframes appear-tag {\n\n 0% {\n transform: scale(0.9);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n #ijs .animate-appear-tag {\n animation: appear-tag .6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n\n @keyframes selected-tag {\n\n 0% {\n transform: scale(1.11);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n #ijs .animate-selected-tag {\n animation: selected-tag .9s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n @keyframes skeleton {\n\n 0% {\n opacity: 0.2;\n }\n\n 50% {\n opacity: 0.5;\n }\n\n 100% {\n opacity: 0.3;\n }\n}\n\n #ijs .animate-skeleton {\n animation: skeleton 1s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n @keyframes slide-in-bottom {\n\n 0% {\n transform: translateY(-50%);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n\n #ijs .animate-slide-in-bottom {\n animation: slide-in-bottom .4s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n\n #ijs .cursor-default {\n cursor: default;\n}\n\n #ijs .cursor-pointer {\n cursor: pointer;\n}\n\n #ijs .select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n #ijs .resize {\n resize: both;\n}\n\n #ijs .flex-col {\n flex-direction: column;\n}\n\n #ijs .flex-wrap {\n flex-wrap: wrap;\n}\n\n #ijs .items-start {\n align-items: flex-start;\n}\n\n #ijs .items-center {\n align-items: center;\n}\n\n #ijs .justify-end {\n justify-content: flex-end;\n}\n\n #ijs .justify-center {\n justify-content: center;\n}\n\n #ijs .gap-1 {\n gap: 0.25rem;\n}\n\n #ijs .gap-1\\.5 {\n gap: 0.375rem;\n}\n\n #ijs .gap-2 {\n gap: 0.5rem;\n}\n\n #ijs .gap-3 {\n gap: 0.75rem;\n}\n\n #ijs .gap-4 {\n gap: 1rem;\n}\n\n #ijs .self-center {\n align-self: center;\n}\n\n #ijs .overflow-auto {\n overflow: auto;\n}\n\n #ijs .overflow-hidden {\n overflow: hidden;\n}\n\n #ijs .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n #ijs .rounded-input {\n border-radius: var(--i-radius-input);\n}\n\n #ijs .rounded-interactive {\n border-radius: var(--i-radius-interactive);\n}\n\n #ijs .rounded-job-card {\n border-radius: var(--i-radius-job-card);\n}\n\n #ijs .rounded-job-tag {\n border-radius: var(--i-radius-job-tag);\n}\n\n #ijs .rounded-section {\n border-radius: var(--i-radius-section);\n}\n\n #ijs .rounded-tag {\n border-radius: var(--i-radius-job-tag);\n}\n\n #ijs .border-px {\n border-width: 1px;\n}\n\n #ijs .border-solid {\n border-style: solid;\n}\n\n #ijs .border-tag-accent-strong-stroke {\n border-color: var(--i-tag-accent-strong-stroke-color);\n}\n\n #ijs .border-tag-neutral-strong-stroke {\n border-color: var(--i-tag-neutral-strong-stroke-color);\n}\n\n #ijs .border-transparent {\n border-color: transparent;\n}\n\n #ijs .bg-\\[currentColor\\] {\n background-color: currentColor;\n}\n\n #ijs .bg-app {\n background-color: var(--i-app-bg);\n}\n\n #ijs .bg-interactive-accent-bg {\n background-color: var(--i-interactive-accent-bg);\n}\n\n #ijs .bg-interactive-neutral-bg {\n background-color: var(--i-interactive-neutral-bg);\n}\n\n #ijs .bg-job-card-bg {\n background-color: var(--i-job-card-bg);\n}\n\n #ijs .bg-lowest {\n --tw-bg-opacity: 1;\n background-color: oklch(var(--i-lowest) / var(--tw-bg-opacity));\n}\n\n #ijs .bg-section-strong-bg {\n background-color: var(--i-section-strong-bg);\n}\n\n #ijs .bg-section-weak-bg {\n background-color: var(--i-section-weak-bg);\n}\n\n #ijs .bg-tag-accent-strong-bg {\n background-color: var(--i-tag-accent-strong-bg);\n}\n\n #ijs .bg-tag-monetary-weak-bg {\n background-color: var(--i-tag-monetary-weak-bg);\n}\n\n #ijs .bg-tag-neutral-strong-bg {\n background-color: var(--i-tag-neutral-strong-bg);\n}\n\n #ijs .bg-tag-neutral-weak-bg {\n background-color: var(--i-tag-neutral-weak-bg);\n}\n\n #ijs .p-0 {\n padding: 0px;\n}\n\n #ijs .p-2 {\n padding: 0.5rem;\n}\n\n #ijs .p-4 {\n padding: 1rem;\n}\n\n #ijs .px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n #ijs .px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n\n #ijs .px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n #ijs .px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n\n #ijs .py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n #ijs .py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n #ijs .py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n\n #ijs .py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n\n #ijs .pl-1 {\n padding-left: 0.25rem;\n}\n\n #ijs .pl-2 {\n padding-left: 0.5rem;\n}\n\n #ijs .pl-3 {\n padding-left: 0.75rem;\n}\n\n #ijs .pl-4 {\n padding-left: 1rem;\n}\n\n #ijs .pr-1 {\n padding-right: 0.25rem;\n}\n\n #ijs .pr-3 {\n padding-right: 0.75rem;\n}\n\n #ijs .pt-1 {\n padding-top: 0.25rem;\n}\n\n #ijs .text-center {\n text-align: center;\n}\n\n #ijs .text-justify {\n text-align: justify;\n}\n\n #ijs .font-family-default {\n font-family: var(--i-font);\n}\n\n #ijs .font-family-filter {\n font-family: var(--i-font-filter);\n}\n\n #ijs .font-family-job-heading {\n font-family: var(--i-font-job-heading);\n}\n\n #ijs .font-family-tag {\n font-family: var(--i-font-tag);\n}\n\n #ijs .text-style-filter {\n font-size: 1rem;\n line-height: 1.5rem;\n letter-spacing: -0.01em;\n}\n\n #ijs .text-style-input {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n #ijs .text-style-job-card {\n font-size: 0.875rem;\n line-height: 1.125rem;\n}\n\n #ijs .text-style-job-card-info {\n font-size: 0.75rem;\n line-height: 1.125rem;\n}\n\n #ijs .text-style-job-heading {\n font-size: 1.125rem;\n line-height: 1.5rem;\n}\n\n #ijs .text-style-tag {\n font-size: 0.875rem;\n line-height: 1.5rem;\n}\n\n #ijs .font-weight-default {\n font-weight: var(--i-weight-default);\n}\n\n #ijs .font-weight-filter {\n font-weight: var(--i-weight-filter);\n}\n\n #ijs .font-weight-input {\n font-weight: var(--i-weight-input);\n}\n\n #ijs .font-weight-job-heading {\n font-weight: var(--i-weight-job-heading);\n}\n\n #ijs .font-weight-tag {\n font-weight: var(--i-weight-tag);\n}\n\n #ijs .uppercase {\n text-transform: uppercase;\n}\n\n #ijs .lowercase {\n text-transform: lowercase;\n}\n\n #ijs .capitalize {\n text-transform: capitalize;\n}\n\n #ijs .italic {\n font-style: italic;\n}\n\n #ijs .ordinal {\n --tw-ordinal: ordinal;\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\n}\n\n #ijs .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\n}\n\n #ijs .text-copy-accent {\n color: var(--i-copy-accent);\n}\n\n #ijs .text-copy-job-info {\n color: var(--i-copy-info);\n}\n\n #ijs .text-copy-neutral {\n color: var(--i-copy);\n}\n\n #ijs .text-copy-neutral-icon {\n color: var(--i-copy-icon);\n}\n\n #ijs .text-copy-neutral-lowcontrast {\n color: var(--i-copy-lowcontrast);\n}\n\n #ijs .text-interactive-accent-text {\n color: var(--i-interactive-accent-text);\n}\n\n #ijs .text-interactive-neutral-text {\n color: var(--i-interactive-neutral-text);\n}\n\n #ijs .text-tag-accent-strong-copy {\n color: var(--i-tag-accent-strong-copy);\n}\n\n #ijs .text-tag-monetary-weak-copy {\n color: var(--i-tag-monetary-weak-copy);\n}\n\n #ijs .text-tag-neutral-strong-copy {\n color: var(--i-tag-neutral-strong-copy);\n}\n\n #ijs .text-tag-neutral-weak-copy {\n color: var(--i-tag-neutral-weak-copy);\n}\n\n #ijs .caret-accent-11 {\n caret-color: oklch(var(--i-a-11) / 1);\n}\n\n #ijs .opacity-20 {\n opacity: 0.2;\n}\n\n #ijs .opacity-25 {\n opacity: 0.25;\n}\n\n #ijs .shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n #ijs .outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n #ijs .outline {\n outline-style: solid;\n}\n\n #ijs .ring-px {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-width-job-card {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-job-card-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-width-section {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-section-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-job-card-stroke {\n --tw-ring-color: var(--i-job-card-stroke-color);\n}\n\n #ijs .ring-section-strong-stroke {\n --tw-ring-color: var(--i-section-strong-stroke-color);\n}\n\n #ijs .ring-section-weak-stroke {\n --tw-ring-color: var(--i-section-weak-stroke-color);\n}\n\n #ijs .ring-tag-neutral-weak-stroke {\n --tw-ring-color: var(--i-tag-neutral-weak-stroke-color);\n}\n\n #ijs .blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .grayscale {\n --tw-grayscale: grayscale(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .invert {\n --tw-invert: invert(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .sepia {\n --tw-sepia: sepia(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .backdrop-filter {\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n #ijs .transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .duration-medium {\n transition-duration: .6s;\n}\n\n #ijs .duration-slow {\n transition-duration: .9s;\n}\n\n #ijs .duration-snappy {\n transition-duration: .4s;\n}\n\n #ijs .ease-expo-out {\n transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n #ijs .font-style-default {\n font-style: var(--i-font-style);\n}\n\n #ijs .font-style-filter {\n font-style: var(--i-style-filter);\n}\n\n #ijs .font-style-input {\n font-style: var(--i-style-input);\n}\n\n #ijs .font-style-job-heading {\n font-style: var(--i-style-job-heading);\n}\n\n #ijs .font-style-tag {\n font-style: var(--i-style-tag);\n}\n\n #ijs .top-filters {\n top: var(--i-filters-offset-top);\n}\n\n #ijs .fr {\n outline: none;\n}\n\n #ijs .fr:focus {\n outline: none;\n}\n\n #ijs .fr:focus-visible {\n outline: none;\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-color: oklch(var(--i-lowest) / 1);\n --tw-ring-opacity: 1;\n --tw-ring-color: oklch(var(--i-a-9) / 1);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .fr-parent:has(.fr-child:focus-visible) {\n outline: none;\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-color: oklch(var(--i-lowest) / 1);\n --tw-ring-opacity: 1;\n --tw-ring-color: oklch(var(--i-a-9) / 1);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .fr-child {}\n\n #ijs .hide-scrollbars::-webkit-scrollbar {\n display: none;\n}\n\n #ijs .hide-scrollbars {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n #ijs .touch-hitbox::before {\n content: '';\n position: absolute;\n display: block;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n height: 100%;\n min-height: 44px;\n min-width: 44px;\n z-index: 9999;\n}\n\n #ijs .\\[a-zA-Z0-9-_\\:\\.\\$\\@\\?\\] {\n a-z-a--z0-9-_: .$@?;\n}\n\n #ijs .\\[text-wrap\\:pretty\\] {\n text-wrap: pretty;\n}\n\n #ijs .placeholder\\:text-neutral-10::-moz-placeholder {\n --tw-text-opacity: 1;\n color: oklch(var(--i-n-10) / var(--tw-text-opacity));\n}\n\n #ijs .placeholder\\:text-neutral-10::placeholder {\n --tw-text-opacity: 1;\n color: oklch(var(--i-n-10) / var(--tw-text-opacity));\n}\n\n #ijs .hover\\:bg-interactive-accent-bg-hover:hover {\n background-color: var(--i-interactive-accent-bg-hover);\n}\n\n #ijs .hover\\:bg-interactive-neutral-bg-hover:hover {\n background-color: var(--i-interactive-neutral-bg-hover);\n}\n\n #ijs .focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n #ijs .active\\:-scale-100:active {\n --tw-scale-x: -1;\n --tw-scale-y: -1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:scale-95:active {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:scale-\\[0\\.975\\]:active {\n --tw-scale-x: 0.975;\n --tw-scale-y: 0.975;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:bg-job-card-bg-active:active {\n background-color: var(--i-job-card-bg-active);\n}\n\n #ijs .active\\:ring-job-card-stroke-active:active {\n --tw-ring-color: var(--i-job-card-stroke-color-active);\n}\n\n @media (pointer: fine) {\n\n #ijs .group:hover .pointer-fine\\:group-hover\\:text-copy-neutral {\n color: var(--i-copy);\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:col-span-2 {\n grid-column: span 2 / span 2;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:grid {\n display: grid;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:flex-wrap {\n flex-wrap: wrap;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:overflow-hidden {\n overflow: hidden;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:px-0 {\n padding-left: 0px;\n padding-right: 0px;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:text-left {\n text-align: left;\n }\n}\n\n @media (min-width: 1024px) {\n\n #ijs .lg\\:ring-width-section {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-section-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n }\n}\n\n #ijs .\\[\\&\\:has\\(\\.fr-child\\:active\\)\\]\\:scale-\\[0\\.975\\]:has(.fr-child:active) {\n --tw-scale-x: 0.975;\n --tw-scale-y: 0.975;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n";
4311
+ const tailwind = "#ijs {\n font-size: 16px;\n --tw-content: '';\n}\n\n #ijs * {\n box-sizing: border-box;\n border-style: solid;\n border-width: 0;\n -webkit-tap-highlight-color: transparent;\n font-family: inherit;\n font-style: inherit;\n font-weight: inherit;\n }\n\n #ijs ::before,\n #ijs ::after {\n box-sizing: border-box;\n }\n\n #ijs :is(a) {\n text-decoration: none;\n }\n\n #ijs :is(ul, ol) {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n #ijs :is(p) {\n margin: 0;\n padding: 0;\n }\n\n #ijs :is(li) {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n #ijs :is(button),\n #ijs :is(a) {\n display: block;\n margin: 0;\n padding: 0;\n border: unset;\n background: unset;\n text-align: unset;\n }\n\n #ijs :is(input),\n #ijs :is(textarea) {\n display: block;\n margin: 0;\n padding: 0;\n min-width: 0;\n max-width: unset;\n width: 100%;\n }\n\n #ijs :is(svg) {\n display: block;\n }\n\n #ijs.reduced-motion * {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n animation-delay: 0s !important;\n }\n\n @media (prefers-reduced-motion) {\n #ijs * {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n animation-delay: 0s !important;\n }\n }\n\n #ijs *, #ijs ::before, #ijs ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n #ijs ::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n}\n\n #ijs .container {\n width: 100%;\n}\n\n @media (min-width: 640px) {\n\n #ijs .container {\n max-width: 640px;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .container {\n max-width: 768px;\n }\n}\n\n @media (min-width: 1024px) {\n\n #ijs .container {\n max-width: 1024px;\n }\n}\n\n @media (min-width: 1280px) {\n\n #ijs .container {\n max-width: 1280px;\n }\n}\n\n @media (min-width: 1536px) {\n\n #ijs .container {\n max-width: 1536px;\n }\n}\n\n #ijs .pointer-events-none {\n pointer-events: none;\n}\n\n #ijs .visible {\n visibility: visible;\n}\n\n #ijs .invisible {\n visibility: hidden;\n}\n\n #ijs .collapse {\n visibility: collapse;\n}\n\n #ijs .static {\n position: static;\n}\n\n #ijs .fixed {\n position: fixed;\n}\n\n #ijs .absolute {\n position: absolute;\n}\n\n #ijs .relative {\n position: relative;\n}\n\n #ijs .sticky {\n position: sticky;\n}\n\n #ijs .top-0 {\n top: 0px;\n}\n\n #ijs .isolate {\n isolation: isolate;\n}\n\n #ijs .m-0 {\n margin: 0px;\n}\n\n #ijs .m-11 {\n margin: 2.75rem;\n}\n\n #ijs .m-3 {\n margin: 0.75rem;\n}\n\n #ijs .mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n #ijs .ml-auto {\n margin-left: auto;\n}\n\n #ijs .block {\n display: block;\n}\n\n #ijs .inline-block {\n display: inline-block;\n}\n\n #ijs .inline {\n display: inline;\n}\n\n #ijs .flex {\n display: flex;\n}\n\n #ijs .inline-flex {\n display: inline-flex;\n}\n\n #ijs .table {\n display: table;\n}\n\n #ijs .table-row {\n display: table-row;\n}\n\n #ijs .flow-root {\n display: flow-root;\n}\n\n #ijs .grid {\n display: grid;\n}\n\n #ijs .inline-grid {\n display: inline-grid;\n}\n\n #ijs .contents {\n display: contents;\n}\n\n #ijs .list-item {\n display: list-item;\n}\n\n #ijs .\\!hidden {\n display: none !important;\n}\n\n #ijs .hidden {\n display: none;\n}\n\n #ijs .h-8 {\n height: 2rem;\n}\n\n #ijs .h-\\[1lh\\] {\n height: 1lh;\n}\n\n #ijs .min-h-screen {\n min-height: 100vh;\n}\n\n #ijs .w-\\[10ch\\] {\n width: 10ch;\n}\n\n #ijs .w-\\[6ch\\] {\n width: 6ch;\n}\n\n #ijs .w-\\[8ch\\] {\n width: 8ch;\n}\n\n #ijs .w-full {\n width: 100%;\n}\n\n #ijs .min-w-0 {\n min-width: 0px;\n}\n\n #ijs .max-w-full {\n max-width: 100%;\n}\n\n #ijs .max-w-screen-lg {\n max-width: 1024px;\n}\n\n #ijs .flex-1 {\n flex: 1 1 0%;\n}\n\n #ijs .flex-none {\n flex: none;\n}\n\n #ijs .flex-shrink {\n flex-shrink: 1;\n}\n\n #ijs .shrink {\n flex-shrink: 1;\n}\n\n #ijs .shrink-0 {\n flex-shrink: 0;\n}\n\n #ijs .flex-grow {\n flex-grow: 1;\n}\n\n #ijs .grow {\n flex-grow: 1;\n}\n\n #ijs .border-collapse {\n border-collapse: collapse;\n}\n\n #ijs .origin-\\[50\\%_1\\.75rem\\] {\n transform-origin: 50% 1.75rem;\n}\n\n #ijs .origin-top {\n transform-origin: top;\n}\n\n #ijs .transform {\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n @keyframes appear-tag {\n\n 0% {\n transform: scale(0.9);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n #ijs .animate-appear-tag {\n animation: appear-tag .6s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n\n @keyframes selected-tag {\n\n 0% {\n transform: scale(1.11);\n }\n\n 100% {\n transform: scale(1);\n }\n}\n\n #ijs .animate-selected-tag {\n animation: selected-tag .9s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n @keyframes skeleton {\n\n 0% {\n opacity: 0.2;\n }\n\n 50% {\n opacity: 0.5;\n }\n\n 100% {\n opacity: 0.3;\n }\n}\n\n #ijs .animate-skeleton {\n animation: skeleton 1s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n @keyframes slide-in-bottom {\n\n 0% {\n transform: translateY(-50%);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n\n #ijs .animate-slide-in-bottom {\n animation: slide-in-bottom .4s cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n\n #ijs .cursor-default {\n cursor: default;\n}\n\n #ijs .cursor-pointer {\n cursor: pointer;\n}\n\n #ijs .select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n #ijs .resize {\n resize: both;\n}\n\n #ijs .flex-col {\n flex-direction: column;\n}\n\n #ijs .flex-wrap {\n flex-wrap: wrap;\n}\n\n #ijs .flex-nowrap {\n flex-wrap: nowrap;\n}\n\n #ijs .items-start {\n align-items: flex-start;\n}\n\n #ijs .items-center {\n align-items: center;\n}\n\n #ijs .justify-end {\n justify-content: flex-end;\n}\n\n #ijs .justify-center {\n justify-content: center;\n}\n\n #ijs .gap-1 {\n gap: 0.25rem;\n}\n\n #ijs .gap-2 {\n gap: 0.5rem;\n}\n\n #ijs .gap-3 {\n gap: 0.75rem;\n}\n\n #ijs .gap-4 {\n gap: 1rem;\n}\n\n #ijs .self-center {\n align-self: center;\n}\n\n #ijs .overflow-hidden {\n overflow: hidden;\n}\n\n #ijs .overflow-y-auto {\n overflow-y: auto;\n}\n\n #ijs .truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n #ijs .rounded-input {\n border-radius: var(--i-radius-input);\n}\n\n #ijs .rounded-interactive {\n border-radius: var(--i-radius-interactive);\n}\n\n #ijs .rounded-job-card {\n border-radius: var(--i-radius-job-card);\n}\n\n #ijs .rounded-job-tag {\n border-radius: var(--i-radius-job-tag);\n}\n\n #ijs .rounded-section {\n border-radius: var(--i-radius-section);\n}\n\n #ijs .rounded-tag {\n border-radius: var(--i-radius-job-tag);\n}\n\n #ijs .border-px {\n border-width: 1px;\n}\n\n #ijs .border-solid {\n border-style: solid;\n}\n\n #ijs .border-none {\n border-style: none;\n}\n\n #ijs .border-tag-accent-strong-stroke {\n border-color: var(--i-tag-accent-strong-stroke-color);\n}\n\n #ijs .border-tag-neutral-strong-stroke {\n border-color: var(--i-tag-neutral-strong-stroke-color);\n}\n\n #ijs .border-tag-neutral-weak-stroke {\n border-color: var(--i-tag-neutral-weak-stroke-color);\n}\n\n #ijs .border-transparent {\n border-color: transparent;\n}\n\n #ijs .bg-\\[currentColor\\] {\n background-color: currentColor;\n}\n\n #ijs .bg-app {\n background-color: var(--i-app-bg);\n}\n\n #ijs .bg-interactive-accent-bg {\n background-color: var(--i-interactive-accent-bg);\n}\n\n #ijs .bg-interactive-neutral-bg {\n background-color: var(--i-interactive-neutral-bg);\n}\n\n #ijs .bg-job-card-bg {\n background-color: var(--i-job-card-bg);\n}\n\n #ijs .bg-lowest {\n --tw-bg-opacity: 1;\n background-color: oklch(var(--i-lowest) / var(--tw-bg-opacity));\n}\n\n #ijs .bg-section-strong-bg {\n background-color: var(--i-section-strong-bg);\n}\n\n #ijs .bg-section-weak-bg {\n background-color: var(--i-section-weak-bg);\n}\n\n #ijs .bg-tag-accent-strong-bg {\n background-color: var(--i-tag-accent-strong-bg);\n}\n\n #ijs .bg-tag-monetary-weak-bg {\n background-color: var(--i-tag-monetary-weak-bg);\n}\n\n #ijs .bg-tag-neutral-strong-bg {\n background-color: var(--i-tag-neutral-strong-bg);\n}\n\n #ijs .bg-tag-neutral-weak-bg {\n background-color: var(--i-tag-neutral-weak-bg);\n}\n\n #ijs .p-0 {\n padding: 0px;\n}\n\n #ijs .p-2 {\n padding: 0.5rem;\n}\n\n #ijs .p-4 {\n padding: 1rem;\n}\n\n #ijs .px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n #ijs .px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n\n #ijs .px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n #ijs .px-5 {\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n}\n\n #ijs .py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n #ijs .py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n #ijs .py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n\n #ijs .py-6 {\n padding-top: 1.5rem;\n padding-bottom: 1.5rem;\n}\n\n #ijs .pl-1 {\n padding-left: 0.25rem;\n}\n\n #ijs .pl-2 {\n padding-left: 0.5rem;\n}\n\n #ijs .pl-3 {\n padding-left: 0.75rem;\n}\n\n #ijs .pl-4 {\n padding-left: 1rem;\n}\n\n #ijs .pl-5 {\n padding-left: 1.25rem;\n}\n\n #ijs .pr-1 {\n padding-right: 0.25rem;\n}\n\n #ijs .pr-3 {\n padding-right: 0.75rem;\n}\n\n #ijs .pr-5 {\n padding-right: 1.25rem;\n}\n\n #ijs .pt-1 {\n padding-top: 0.25rem;\n}\n\n #ijs .text-center {\n text-align: center;\n}\n\n #ijs .text-justify {\n text-align: justify;\n}\n\n #ijs .font-family-default {\n font-family: var(--i-font);\n}\n\n #ijs .font-family-filter {\n font-family: var(--i-font-filter);\n}\n\n #ijs .font-family-job-heading {\n font-family: var(--i-font-job-heading);\n}\n\n #ijs .font-family-tag {\n font-family: var(--i-font-tag);\n}\n\n #ijs .text-style-filter {\n font-size: 1rem;\n line-height: 1.5rem;\n letter-spacing: -0.01em;\n}\n\n #ijs .text-style-input {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n #ijs .text-style-job-card {\n font-size: 0.875rem;\n line-height: 1.125rem;\n}\n\n #ijs .text-style-job-card-info {\n font-size: 0.75rem;\n line-height: 1.125rem;\n}\n\n #ijs .text-style-job-heading {\n font-size: 1.125rem;\n line-height: 1.5rem;\n}\n\n #ijs .text-style-tag {\n font-size: 0.875rem;\n line-height: 1.5rem;\n}\n\n #ijs .font-weight-default {\n font-weight: var(--i-weight-default);\n}\n\n #ijs .font-weight-filter {\n font-weight: var(--i-weight-filter);\n}\n\n #ijs .font-weight-input {\n font-weight: var(--i-weight-input);\n}\n\n #ijs .font-weight-job-heading {\n font-weight: var(--i-weight-job-heading);\n}\n\n #ijs .font-weight-tag {\n font-weight: var(--i-weight-tag);\n}\n\n #ijs .uppercase {\n text-transform: uppercase;\n}\n\n #ijs .lowercase {\n text-transform: lowercase;\n}\n\n #ijs .capitalize {\n text-transform: capitalize;\n}\n\n #ijs .italic {\n font-style: italic;\n}\n\n #ijs .ordinal {\n --tw-ordinal: ordinal;\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\n}\n\n #ijs .tabular-nums {\n --tw-numeric-spacing: tabular-nums;\n font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);\n}\n\n #ijs .text-copy-accent {\n color: var(--i-copy-accent);\n}\n\n #ijs .text-copy-job-info {\n color: var(--i-copy-info);\n}\n\n #ijs .text-copy-neutral {\n color: var(--i-copy);\n}\n\n #ijs .text-copy-neutral-icon {\n color: var(--i-copy-icon);\n}\n\n #ijs .text-copy-neutral-lowcontrast {\n color: var(--i-copy-lowcontrast);\n}\n\n #ijs .text-interactive-accent-text {\n color: var(--i-interactive-accent-text);\n}\n\n #ijs .text-interactive-neutral-text {\n color: var(--i-interactive-neutral-text);\n}\n\n #ijs .text-tag-accent-strong-copy {\n color: var(--i-tag-accent-strong-copy);\n}\n\n #ijs .text-tag-monetary-weak-copy {\n color: var(--i-tag-monetary-weak-copy);\n}\n\n #ijs .text-tag-neutral-strong-copy {\n color: var(--i-tag-neutral-strong-copy);\n}\n\n #ijs .text-tag-neutral-weak-copy {\n color: var(--i-tag-neutral-weak-copy);\n}\n\n #ijs .caret-accent-11 {\n caret-color: oklch(var(--i-a-11) / 1);\n}\n\n #ijs .opacity-20 {\n opacity: 0.2;\n}\n\n #ijs .opacity-25 {\n opacity: 0.25;\n}\n\n #ijs .shadow {\n --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n #ijs .outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n #ijs .outline {\n outline-style: solid;\n}\n\n #ijs .ring-px {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-width-job-card {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-job-card-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-width-section {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-section-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .ring-job-card-stroke {\n --tw-ring-color: var(--i-job-card-stroke-color);\n}\n\n #ijs .ring-section-strong-stroke {\n --tw-ring-color: var(--i-section-strong-stroke-color);\n}\n\n #ijs .ring-section-weak-stroke {\n --tw-ring-color: var(--i-section-weak-stroke-color);\n}\n\n #ijs .blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .grayscale {\n --tw-grayscale: grayscale(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .invert {\n --tw-invert: invert(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .sepia {\n --tw-sepia: sepia(100%);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .filter {\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n #ijs .backdrop-filter {\n -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n\n #ijs .transition {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n\n #ijs .duration-medium {\n transition-duration: .6s;\n}\n\n #ijs .duration-slow {\n transition-duration: .9s;\n}\n\n #ijs .duration-snappy {\n transition-duration: .4s;\n}\n\n #ijs .ease-expo-out {\n transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n #ijs .font-style-default {\n font-style: var(--i-font-style);\n}\n\n #ijs .font-style-filter {\n font-style: var(--i-style-filter);\n}\n\n #ijs .font-style-input {\n font-style: var(--i-style-input);\n}\n\n #ijs .font-style-job-heading {\n font-style: var(--i-style-job-heading);\n}\n\n #ijs .font-style-tag {\n font-style: var(--i-style-tag);\n}\n\n #ijs .top-filters {\n top: var(--i-filters-offset-top);\n}\n\n #ijs .fr {\n outline: none;\n}\n\n #ijs .fr:focus {\n outline: none;\n}\n\n #ijs .fr:focus-visible {\n outline: none;\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-color: oklch(var(--i-lowest) / 1);\n --tw-ring-opacity: 1;\n --tw-ring-color: oklch(var(--i-a-9) / 1);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .fr-parent:has(.fr-child:focus-visible) {\n outline: none;\n --tw-ring-offset-width: 1px;\n --tw-ring-offset-color: oklch(var(--i-lowest) / 1);\n --tw-ring-opacity: 1;\n --tw-ring-color: oklch(var(--i-a-9) / 1);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n #ijs .fr-child {}\n\n #ijs .hide-scrollbars::-webkit-scrollbar {\n display: none;\n}\n\n #ijs .hide-scrollbars {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n #ijs .touch-hitbox::before {\n content: '';\n position: absolute;\n display: block;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n height: 100%;\n min-height: 44px;\n min-width: 44px;\n z-index: 9999;\n}\n\n #ijs .\\[a-zA-Z0-9-_\\:\\.\\$\\@\\?\\] {\n a-z-a--z0-9-_: .$@?;\n}\n\n #ijs .\\[text-wrap\\:pretty\\] {\n text-wrap: pretty;\n}\n\n #ijs .placeholder\\:text-neutral-10::-moz-placeholder {\n --tw-text-opacity: 1;\n color: oklch(var(--i-n-10) / var(--tw-text-opacity));\n}\n\n #ijs .placeholder\\:text-neutral-10::placeholder {\n --tw-text-opacity: 1;\n color: oklch(var(--i-n-10) / var(--tw-text-opacity));\n}\n\n #ijs .focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n #ijs .active\\:-scale-100:active {\n --tw-scale-x: -1;\n --tw-scale-y: -1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:scale-95:active {\n --tw-scale-x: .95;\n --tw-scale-y: .95;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:scale-\\[0\\.975\\]:active {\n --tw-scale-x: 0.975;\n --tw-scale-y: 0.975;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n #ijs .active\\:bg-job-card-bg-active:active {\n background-color: var(--i-job-card-bg-active);\n}\n\n #ijs .active\\:ring-job-card-stroke-active:active {\n --tw-ring-color: var(--i-job-card-stroke-color-active);\n}\n\n @media (pointer: coarse) {\n\n #ijs .pointer-coarse\\:overflow-x-auto {\n overflow-x: auto;\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:w-full {\n width: 100%;\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:flex-wrap {\n flex-wrap: wrap;\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:rounded-section {\n border-radius: var(--i-radius-section);\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:bg-app {\n background-color: var(--i-app-bg);\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:p-2 {\n padding: 0.5rem;\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:ring-width-section {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-section-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:hover\\:bg-interactive-accent-bg-hover:hover {\n background-color: var(--i-interactive-accent-bg-hover);\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .pointer-fine\\:hover\\:bg-interactive-neutral-bg-hover:hover {\n background-color: var(--i-interactive-neutral-bg-hover);\n }\n}\n\n @media (pointer: fine) {\n\n #ijs .group:hover .pointer-fine\\:group-hover\\:text-copy-neutral {\n color: var(--i-copy);\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:col-span-2 {\n grid-column: span 2 / span 2;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:grid {\n display: grid;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:px-0 {\n padding-left: 0px;\n padding-right: 0px;\n }\n}\n\n @media (min-width: 768px) {\n\n #ijs .md\\:px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n}\n\n @media (min-width: 1024px) {\n\n #ijs .lg\\:ring-width-section {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(var(--i-section-stroke-width) + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n }\n}\n\n #ijs .\\[\\&\\:has\\(\\.fr-child\\:active\\)\\]\\:scale-\\[0\\.975\\]:has(.fr-child:active) {\n --tw-scale-x: 0.975;\n --tw-scale-y: 0.975;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n";
4143
4312
  const match = (m2) => {
4144
4313
  const patterns = [];
4145
4314
  const i2 = (m22) => ({
@@ -4367,7 +4536,7 @@ const generateTokenVars = (theme, color) => {
4367
4536
  "copy-inverted-lowcontrast": oklch(color["n-4"]),
4368
4537
  "copy-inverted-icon": oklch(color["n-3"]),
4369
4538
  "tag-neutral-weak-bg": highlights === "fill" ? oklch(color["n-2"]) : transparent,
4370
- "tag-neutral-weak-copy": color["n-12"],
4539
+ "tag-neutral-weak-copy": oklch(color["n-12"]),
4371
4540
  "tag-neutral-weak-stroke-color": highlights === "stroke" ? oklch(color["n-8"]) : transparent,
4372
4541
  "tag-neutral-strong-bg": highlights === "fill" ? oklch(color["n-12"]) : transparent,
4373
4542
  "tag-neutral-strong-copy": oklch(highlights === "fill" ? color.white : color["n-12"]),