@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.
@@ -529,17 +529,25 @@ const Fallback = ({
529
529
  }) => {
530
530
  return u$1("div", {
531
531
  style: {
532
- padding: "0 1rem",
532
+ display: "flex",
533
+ flexDirection: "column",
534
+ gap: ".5rem",
535
+ padding: "1rem",
533
536
  fontSize: "1rem",
534
- color: "#333333",
535
- fontFamily: "'system-ui' 'Helvetica'"
537
+ color: "hsl(10, 82%, 45%)",
538
+ fontFamily: "'system-ui' 'Helvetica'",
539
+ background: "hsl(7, 100%, 98%)"
536
540
  },
537
- children: ["Something went wrong.", u$1("br", {}), ' Error Message: "', error.message, '"', u$1("button", {
541
+ children: [u$1("p", {
542
+ children: error.message
543
+ }), u$1("button", {
538
544
  onClick: resetError,
539
545
  style: {
540
- background: "#efefef",
546
+ background: "white",
541
547
  border: "none",
542
548
  cursor: "pointer",
549
+ textAlign: "center",
550
+ borderRadius: "4px",
543
551
  padding: "0.5rem 1rem"
544
552
  },
545
553
  children: "Retry"
@@ -696,6 +704,9 @@ const icons = {
696
704
  x: u$1("path", {
697
705
  d: "M8 8l8 8M8 16l8 -8"
698
706
  }),
707
+ plus: u$1("path", {
708
+ d: "M12 8V16M8 12H16"
709
+ }),
699
710
  "chevron-right": u$1("path", {
700
711
  d: "M11 8L15 12L11 16"
701
712
  })
@@ -909,6 +920,7 @@ function B$1(n2, t2) {
909
920
  }
910
921
  const JOB_SEARCH_ELEMENT_ID = "inploi-job-search";
911
922
  const JOB_SEARCH_SCOPE_ELEMENT_ID = "ijs";
923
+ const PAGE_SIZE = 10;
912
924
  function g(n2, t2) {
913
925
  for (var e2 in t2)
914
926
  n2[e2] = t2[e2];
@@ -1474,11 +1486,11 @@ if (process.env.NODE_ENV === "production") {
1474
1486
  shim.exports = requireUseSyncExternalStoreShim_development();
1475
1487
  }
1476
1488
  var shimExports = shim.exports;
1477
- const noop = () => {
1489
+ const noop$1 = () => {
1478
1490
  };
1479
1491
  const UNDEFINED = (
1480
1492
  /*#__NOINLINE__*/
1481
- noop()
1493
+ noop$1()
1482
1494
  );
1483
1495
  const OBJECT = Object;
1484
1496
  const isUndefined = (v2) => v2 === UNDEFINED;
@@ -1564,8 +1576,8 @@ const [onWindowEvent, offWindowEvent] = isWindowDefined && window.addEventListen
1564
1576
  window.addEventListener.bind(window),
1565
1577
  window.removeEventListener.bind(window)
1566
1578
  ] : [
1567
- noop,
1568
- noop
1579
+ noop$1,
1580
+ noop$1
1569
1581
  ];
1570
1582
  const isVisible = () => {
1571
1583
  const visibilityState = isDocumentDefined && document.visibilityState;
@@ -1779,7 +1791,7 @@ const initCache = (provider, options) => {
1779
1791
  const opts = mergeObjects(defaultConfigOptions, options);
1780
1792
  const EVENT_REVALIDATORS = {};
1781
1793
  const mutate2 = internalMutate.bind(UNDEFINED, provider);
1782
- let unmount = noop;
1794
+ let unmount = noop$1;
1783
1795
  const subscriptions = {};
1784
1796
  const subscribe = (key, callback) => {
1785
1797
  const subs = subscriptions[key] || [];
@@ -1845,11 +1857,11 @@ const [cache, mutate] = initCache(/* @__PURE__ */ new Map());
1845
1857
  const defaultConfig = mergeObjects(
1846
1858
  {
1847
1859
  // events
1848
- onLoadingSlow: noop,
1849
- onSuccess: noop,
1850
- onError: noop,
1860
+ onLoadingSlow: noop$1,
1861
+ onSuccess: noop$1,
1862
+ onError: noop$1,
1851
1863
  onErrorRetry,
1852
- onDiscarded: noop,
1864
+ onDiscarded: noop$1,
1853
1865
  // switches
1854
1866
  revalidateOnFocus: true,
1855
1867
  revalidateOnReconnect: true,
@@ -2917,7 +2929,7 @@ const JobSchema = transform(JobPayloadSchema, (schema) => {
2917
2929
  if (schema.pay_mask)
2918
2930
  return "Competitive";
2919
2931
  if (schema.pay_max && schema.pay_min)
2920
- return numberFormatter.formatRange(+schema.pay_min, +schema.pay_max);
2932
+ return [numberFormatter.formatRange(+schema.pay_min, +schema.pay_max), payPeriods[schema.pay_type]].join(" ");
2921
2933
  if (schema.pay)
2922
2934
  return [numberFormatter.format(+schema.pay), payPeriods[schema.pay_type]].join(" ");
2923
2935
  if (!schema.pay && !schema.pay_min && !schema.pay_max)
@@ -2946,19 +2958,39 @@ const JobSchema = transform(JobPayloadSchema, (schema) => {
2946
2958
  };
2947
2959
  });
2948
2960
  const JobSearchResponseSchema = transform(object({
2949
- data: object({
2950
- results: array(JobSchema),
2951
- available_properties: AvailablePropertiesSchema
2952
- }),
2961
+ data: array(JobSchema),
2953
2962
  pagination: PaginationSchema
2954
2963
  }), (schema) => ({
2955
2964
  pagination: schema.pagination,
2956
- results: schema.data.results,
2957
- availableProperties: schema.data.available_properties
2965
+ results: schema.data
2958
2966
  }));
2959
2967
  const filtersToPayload = (filters) => {
2960
2968
  return Object.fromEntries(Object.entries(filters).map(([key, filter]) => [key, (filter == null ? void 0 : filter.value) ?? null]));
2961
2969
  };
2970
+ const getAvailableFilters = async ({
2971
+ apiClient,
2972
+ filters,
2973
+ logger,
2974
+ signal
2975
+ }) => {
2976
+ try {
2977
+ const response = await apiClient.fetch(`/search/filters`, {
2978
+ method: "POST",
2979
+ body: JSON.stringify({
2980
+ filters: filtersToPayload(filters)
2981
+ }),
2982
+ signal
2983
+ });
2984
+ return parse(AvailablePropertiesSchema, response);
2985
+ } catch (e2) {
2986
+ if (e2 instanceof ValiError) {
2987
+ logger.error(e2.message, e2.issues);
2988
+ } else {
2989
+ logger.error(e2);
2990
+ }
2991
+ throw e2;
2992
+ }
2993
+ };
2962
2994
  const getJobSearchResults = async ({
2963
2995
  apiClient,
2964
2996
  logger,
@@ -2967,16 +2999,14 @@ const getJobSearchResults = async ({
2967
2999
  page = 1
2968
3000
  }) => {
2969
3001
  try {
2970
- const response = await apiClient.fetch(`/search?page=${page}`, {
3002
+ const response = await apiClient.fetch(`/search/results?page=${page}&per_page=${PAGE_SIZE}`, {
2971
3003
  method: "POST",
2972
3004
  body: JSON.stringify({
2973
- query: "Customer Service",
2974
3005
  filters: filtersToPayload(filters)
2975
3006
  }),
2976
3007
  signal
2977
3008
  });
2978
- const parsedResponse = parse(JobSearchResponseSchema, response);
2979
- return parsedResponse;
3009
+ return parse(JobSearchResponseSchema, response);
2980
3010
  } catch (e2) {
2981
3011
  if (e2 instanceof ValiError) {
2982
3012
  logger.error(e2.message, e2.issues);
@@ -2986,17 +3016,15 @@ const getJobSearchResults = async ({
2986
3016
  throw e2;
2987
3017
  }
2988
3018
  };
2989
- const getDataState = (swr) => {
3019
+ const getQueryState = (swr) => {
2990
3020
  if (swr.error)
2991
3021
  return {
2992
3022
  state: "error",
2993
- error: swr.error,
2994
- data: swr.data
3023
+ error: swr.error
2995
3024
  };
2996
3025
  if (swr.isLoading && swr.data === void 0)
2997
3026
  return {
2998
- state: "loading",
2999
- data: swr.data
3027
+ state: "loading"
3000
3028
  };
3001
3029
  if ((swr.isLoading || swr.isValidating) && swr.data)
3002
3030
  return {
@@ -3008,7 +3036,7 @@ const getDataState = (swr) => {
3008
3036
  state: "loaded",
3009
3037
  data: swr.data
3010
3038
  };
3011
- throw new Error("Unhandled state");
3039
+ throw new Error("Unhandled data state");
3012
3040
  };
3013
3041
  const SWR_SETTINGS = {
3014
3042
  keepPreviousData: true,
@@ -3017,6 +3045,7 @@ const SWR_SETTINGS = {
3017
3045
  revalidateIfStale: false,
3018
3046
  revalidateFirstPage: false
3019
3047
  };
3048
+ const cacheKey = (value) => JSON.stringify(value);
3020
3049
  function r(e2) {
3021
3050
  var t2, f2, n2 = "";
3022
3051
  if ("string" == typeof e2 || "number" == typeof e2)
@@ -3090,26 +3119,141 @@ const defineConfig = (options) => {
3090
3119
  return { compose: compose1, cva: cva1, cx: cx1 };
3091
3120
  };
3092
3121
  const { compose, cva, cx } = defineConfig();
3122
+ const tagClass = cva({
3123
+ base: "truncate max-w-full block fr font-style-tag font-family-tag font-weight-tag text-style-tag",
3124
+ variants: {
3125
+ variant: {
3126
+ neutralWeak: "bg-tag-neutral-weak-bg border-solid border-px text-tag-neutral-weak-copy border-tag-neutral-weak-stroke",
3127
+ neutralStrong: "text-tag-neutral-strong-copy border-solid border-px bg-tag-neutral-strong-bg border-tag-neutral-strong-stroke",
3128
+ accentStrong: "text-tag-accent-strong-copy border-solid border-px bg-tag-accent-strong-bg border-tag-accent-strong-stroke",
3129
+ monetaryWeak: "bg-tag-monetary-weak-bg border-none text-tag-monetary-weak-copy"
3130
+ },
3131
+ interactive: {
3132
+ true: "ease-expo-out rounded-interactive transition-all duration-snappy ",
3133
+ false: "rounded-tag"
3134
+ },
3135
+ size: {
3136
+ xs: "px-2",
3137
+ sm: "px-3 py-1",
3138
+ lg: "px-5 py-2"
3139
+ },
3140
+ disabled: {
3141
+ true: "opacity-25 pointer-events-none",
3142
+ false: ""
3143
+ }
3144
+ },
3145
+ compoundVariants: [{
3146
+ disabled: false,
3147
+ interactive: true,
3148
+ class: "cursor-pointer active:scale-[0.975]"
3149
+ }],
3150
+ defaultVariants: {
3151
+ variant: "neutralWeak",
3152
+ size: "sm",
3153
+ disabled: false,
3154
+ interactive: false
3155
+ }
3156
+ });
3157
+ const CurrentValueTag = ({
3158
+ query,
3159
+ property,
3160
+ selectedValues
3161
+ }) => {
3162
+ switch (query.state) {
3163
+ case "error":
3164
+ case "loading":
3165
+ return null;
3166
+ case "loaded":
3167
+ case "revalidating": {
3168
+ const suggestions = query.data[property.key];
3169
+ invariant(suggestions, `API error: no available properties for key “${property.key}”`);
3170
+ const selectedSuggestions = suggestions.filter((s2) => selectedValues.includes(s2.value));
3171
+ switch (selectedSuggestions.length) {
3172
+ case 0:
3173
+ return null;
3174
+ case 1: {
3175
+ const firstSuggestion = selectedSuggestions[0];
3176
+ invariant(firstSuggestion);
3177
+ return u$1("span", {
3178
+ class: tagClass({
3179
+ size: "sm",
3180
+ variant: "accentStrong",
3181
+ interactive: true,
3182
+ class: "truncate"
3183
+ }),
3184
+ children: firstSuggestion.label
3185
+ });
3186
+ }
3187
+ default:
3188
+ return u$1("span", {
3189
+ class: tagClass({
3190
+ size: "sm",
3191
+ variant: "accentStrong",
3192
+ interactive: true,
3193
+ class: "truncate tabular-nums"
3194
+ }),
3195
+ children: selectedSuggestions.length
3196
+ });
3197
+ }
3198
+ }
3199
+ default:
3200
+ exhaustive(query);
3201
+ }
3202
+ };
3093
3203
  const btnClass = cva({
3094
3204
  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",
3095
3205
  variants: {
3096
3206
  variant: {
3097
- neutral: "bg-interactive-neutral-bg hover:bg-interactive-neutral-bg-hover text-interactive-neutral-text",
3098
- accent: "bg-interactive-accent-bg hover:bg-interactive-accent-bg-hover text-interactive-accent-text"
3207
+ neutral: "bg-interactive-neutral-bg pointer-fine:hover:bg-interactive-neutral-bg-hover text-interactive-neutral-text",
3208
+ accent: "bg-interactive-accent-bg pointer-fine:hover:bg-interactive-accent-bg-hover text-interactive-accent-text"
3099
3209
  },
3100
3210
  icon: {
3101
- none: "px-3",
3102
- right: "pl-3 pr-1",
3103
- left: "pl-1 pr-3"
3211
+ none: "",
3212
+ right: "",
3213
+ left: ""
3214
+ },
3215
+ size: {
3216
+ sm: "py-1",
3217
+ lg: "py-2"
3104
3218
  }
3105
3219
  },
3220
+ compoundVariants: [
3221
+ {
3222
+ size: "sm",
3223
+ icon: "right",
3224
+ class: "pl-3 pr-1"
3225
+ },
3226
+ {
3227
+ size: "sm",
3228
+ icon: "left",
3229
+ class: "pl-1 pr-3"
3230
+ },
3231
+ {
3232
+ size: "sm",
3233
+ icon: "none",
3234
+ class: "px-3"
3235
+ },
3236
+ {
3237
+ size: "lg",
3238
+ icon: "right",
3239
+ class: "pl-5 pr-3"
3240
+ }
3241
+ // { size: 'lg', icon: 'left', class: 'pl-3 pr-5' },
3242
+ // { size: 'lg', icon: 'none', class: 'px-5' },
3243
+ ],
3106
3244
  defaultVariants: {
3107
3245
  variant: "neutral",
3108
- icon: "none"
3246
+ icon: "none",
3247
+ size: "sm"
3109
3248
  }
3110
3249
  });
3250
+ const SUGGESTION_COUNT = 8;
3251
+ const TAG_HEIGHT = 42;
3252
+ const GAP = 8;
3253
+ const LINE_COUNT = 6;
3254
+ const PADDING_Y = 4;
3111
3255
  const inputClass = cva({
3112
- 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",
3256
+ 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",
3113
3257
  variants: {
3114
3258
  hasValue: {
3115
3259
  false: "text-copy-neutral",
@@ -3125,26 +3269,33 @@ const toggleInArray = (array2, value) => {
3125
3269
  };
3126
3270
  const FilterContentActive = ({
3127
3271
  value,
3128
- suggestions,
3129
3272
  property,
3130
3273
  onSkip,
3131
- state,
3274
+ useQuery,
3132
3275
  onValueChange,
3276
+ unfilteredQuery,
3133
3277
  onRender
3134
3278
  }) => {
3135
- const [internalValue, setInternalValue] = h(value);
3136
- p(() => {
3137
- setInternalValue(value);
3138
- }, [value]);
3279
+ const filterQuery = getQueryState(useQuery());
3280
+ if (filterQuery.state === "error")
3281
+ throw filterQuery.error;
3282
+ const availablePropertyKeys = F$1(() => {
3283
+ switch (filterQuery.state) {
3284
+ case "loading":
3285
+ return null;
3286
+ case "loaded":
3287
+ case "revalidating": {
3288
+ const properties = filterQuery.data[property.key] ?? [];
3289
+ return Object.fromEntries(properties.map((p2) => [p2.value, true]));
3290
+ }
3291
+ default:
3292
+ exhaustive(filterQuery);
3293
+ }
3294
+ }, [filterQuery, property.key]);
3139
3295
  const selectedValues = getSelectedValues(value);
3140
- const selectedInternalValues = getSelectedValues(internalValue);
3141
- const hasValue = selectedValues.length > 0 || selectedInternalValues.length > 0;
3296
+ const hasValue = selectedValues.length > 0;
3297
+ const [displayCount, setDisplayCount] = h(SUGGESTION_COUNT);
3142
3298
  const [search, setSearch] = h();
3143
- const availableSuggestions = F$1(() => {
3144
- if (!search)
3145
- return suggestions;
3146
- return suggestions.filter((s2) => s2.label.toLowerCase().includes(search.toLowerCase()));
3147
- }, [search, suggestions]);
3148
3299
  p(() => {
3149
3300
  onRender();
3150
3301
  });
@@ -3161,65 +3312,111 @@ const FilterContentActive = ({
3161
3312
  onInput: (e2) => setSearch(e2.currentTarget.value),
3162
3313
  placeholder: "Type to search"
3163
3314
  })
3164
- }), state === "loading" ? u$1("div", {
3165
- class: "flex px-4",
3166
- children: u$1("div", {
3167
- "aria-hidden": true,
3168
- class: tagClass$1({
3169
- size: "lg",
3170
- active: false,
3171
- class: "animate-skeleton cursor-default opacity-20 active:-scale-100"
3172
- }),
3173
- children: u$1("span", {
3174
- class: "inline-block w-[10ch]"
3175
- })
3176
- })
3177
- }) : u$1("ul", {
3178
- "aria-label": "Filter options",
3179
- 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",
3180
- children: availableSuggestions.length === 0 ? u$1("p", {
3181
- class: "font-style-tag text-style-tag font-weight-tag border-px w-full border-transparent py-2 text-center md:text-left",
3182
- children: "No filter options available."
3183
- }) : availableSuggestions.slice(0, 10).map((suggestion) => {
3184
- const active = selectedInternalValues.includes(suggestion.value);
3185
- return u$1("li", {
3186
- class: "animate-appear-tag max-w-full origin-top",
3187
- children: u$1("button", {
3188
- "data-filter": true,
3189
- "data-current-value": active ? "true" : void 0,
3190
- onClick: () => {
3191
- switch (value.select) {
3192
- case "many": {
3193
- const newValue = toggleInArray(selectedInternalValues, suggestion.value);
3194
- setInternalValue({
3195
- select: "many",
3196
- value: newValue
3197
- });
3198
- break;
3199
- }
3200
- case "one":
3201
- setInternalValue({
3202
- select: "one",
3203
- value: suggestion.value
3204
- });
3205
- onValueChange({
3206
- select: "one",
3207
- value: suggestion.value
3208
- });
3209
- break;
3210
- default:
3211
- exhaustive(value);
3212
- }
3213
- },
3214
- class: tagClass$1({
3215
- size: "lg",
3216
- active
3217
- }),
3218
- children: suggestion.label
3219
- })
3220
- }, suggestion.value);
3221
- })
3222
- }), u$1("div", {
3315
+ }), (() => {
3316
+ switch (unfilteredQuery.state) {
3317
+ case "error":
3318
+ throw unfilteredQuery.error;
3319
+ case "loading":
3320
+ return u$1("div", {
3321
+ class: "flex px-4",
3322
+ children: u$1("div", {
3323
+ "aria-hidden": true,
3324
+ class: tagClass({
3325
+ size: "lg",
3326
+ variant: "neutralStrong",
3327
+ interactive: true,
3328
+ class: "animate-skeleton cursor-default opacity-20 active:-scale-100"
3329
+ }),
3330
+ children: u$1("span", {
3331
+ class: "inline-block w-[10ch]"
3332
+ })
3333
+ })
3334
+ });
3335
+ case "revalidating":
3336
+ case "loaded": {
3337
+ const allSuggestions = unfilteredQuery.data[property.key];
3338
+ invariant(allSuggestions, `API error: no available properties for key “${property.key}”`);
3339
+ const filteredSuggestions = search && search.length > 1 ? allSuggestions.filter((s2) => s2.label.toLowerCase().includes(search.toLowerCase())) : allSuggestions;
3340
+ const suggestions = filteredSuggestions.map((s2) => ({
3341
+ ...s2,
3342
+ disabled: availablePropertyKeys === null ? false : availablePropertyKeys[s2.value] !== true
3343
+ }));
3344
+ const noEnabledOptions = !suggestions.find((suggestion) => !suggestion.disabled);
3345
+ if (noEnabledOptions)
3346
+ return u$1("p", {
3347
+ class: "font-style-tag text-style-tag font-weight-tag border-px w-full border-transparent px-4 py-2 text-center",
3348
+ children: "No filter options available."
3349
+ });
3350
+ return u$1("div", {
3351
+ class: "pointer-fine:px-4",
3352
+ children: u$1("ul", {
3353
+ style: {
3354
+ maxHeight: (TAG_HEIGHT + GAP) * (LINE_COUNT - 1) + TAG_HEIGHT / 2 + 2 * PADDING_Y
3355
+ },
3356
+ 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",
3357
+ children: [suggestions.slice(0, displayCount).map((suggestion) => {
3358
+ const active = selectedValues.includes(suggestion.value);
3359
+ return u$1("li", {
3360
+ class: "animate-appear-tag max-w-full origin-top",
3361
+ children: u$1("button", {
3362
+ "data-filter": true,
3363
+ "data-current-value": active ? "true" : void 0,
3364
+ onClick: () => {
3365
+ switch (value.select) {
3366
+ case "many": {
3367
+ const newValue = toggleInArray(selectedValues, suggestion.value);
3368
+ onValueChange({
3369
+ select: "many",
3370
+ value: newValue
3371
+ });
3372
+ break;
3373
+ }
3374
+ case "one":
3375
+ onValueChange({
3376
+ select: "one",
3377
+ value: suggestion.value
3378
+ });
3379
+ break;
3380
+ default:
3381
+ exhaustive(value);
3382
+ }
3383
+ },
3384
+ class: tagClass({
3385
+ size: "lg",
3386
+ variant: active ? "accentStrong" : "neutralStrong",
3387
+ interactive: true,
3388
+ disabled: suggestion.disabled
3389
+ }),
3390
+ children: suggestion.label
3391
+ })
3392
+ }, suggestion.value);
3393
+ }), suggestions.length > displayCount && u$1("li", {
3394
+ class: "animate-appear-tag pointer-fine:w-full max-w-full flex-none origin-top",
3395
+ children: u$1("button", {
3396
+ class: btnClass({
3397
+ variant: "neutral",
3398
+ icon: "right",
3399
+ size: "lg",
3400
+ class: "border-px flex w-full max-w-full flex-none flex-nowrap justify-center truncate border-transparent"
3401
+ }),
3402
+ onClick: () => {
3403
+ setDisplayCount(displayCount + SUGGESTION_COUNT);
3404
+ },
3405
+ children: [u$1("span", {
3406
+ class: "font-style-tag font-family-tag font-weight-tag text-style-tag",
3407
+ children: "Show More"
3408
+ }), u$1(Icon, {
3409
+ name: "plus"
3410
+ })]
3411
+ })
3412
+ })]
3413
+ })
3414
+ });
3415
+ }
3416
+ default:
3417
+ exhaustive(unfilteredQuery);
3418
+ }
3419
+ })(), u$1("footer", {
3223
3420
  class: "flex justify-end p-2",
3224
3421
  children: [u$1("div", {
3225
3422
  class: "flex-1",
@@ -3239,7 +3436,7 @@ const FilterContentActive = ({
3239
3436
  class: "flex items-center overflow-hidden",
3240
3437
  children: u$1("p", {
3241
3438
  class: "font-style-default text-style-tag font-weight-default flex-grow select-none truncate text-center",
3242
- children: [selectedInternalValues.length, " selected"]
3439
+ children: [selectedValues.length, " selected"]
3243
3440
  })
3244
3441
  }), u$1("div", {
3245
3442
  class: "flex-1",
@@ -3249,12 +3446,7 @@ const FilterContentActive = ({
3249
3446
  icon: "right",
3250
3447
  class: "ml-auto"
3251
3448
  }),
3252
- onClick: () => {
3253
- if (hasValue) {
3254
- onValueChange(internalValue);
3255
- }
3256
- onSkip();
3257
- },
3449
+ onClick: onSkip,
3258
3450
  children: [hasValue ? "Done" : "Skip", " ", u$1(Icon, {
3259
3451
  name: "chevron-right"
3260
3452
  })]
@@ -3274,21 +3466,8 @@ const filterIcons = {
3274
3466
  company_name: "briefcase",
3275
3467
  category: "briefcase"
3276
3468
  };
3277
- const tagClass$1 = cva({
3278
- 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]",
3279
- variants: {
3280
- active: {
3281
- false: "text-tag-neutral-strong-copy bg-tag-neutral-strong-bg border-tag-neutral-strong-stroke",
3282
- true: "text-tag-accent-strong-copy bg-tag-accent-strong-bg border-tag-accent-strong-stroke"
3283
- },
3284
- size: {
3285
- sm: "px-3 py-1",
3286
- lg: "px-5 py-2"
3287
- }
3288
- }
3289
- });
3290
3469
  const wrapperClass$1 = cva({
3291
- 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]",
3470
+ 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]",
3292
3471
  variants: {
3293
3472
  hasValue: {
3294
3473
  false: "bg-section-weak-bg ring-section-weak-stroke",
@@ -3333,22 +3512,19 @@ const Filter = ({
3333
3512
  value,
3334
3513
  onActiveChange,
3335
3514
  property,
3336
- suggestions,
3337
3515
  onSkip,
3338
3516
  onValueChange,
3339
- state
3517
+ unfilteredQuery,
3518
+ useQuery
3340
3519
  }) => {
3341
- var _a;
3342
3520
  const icon = property.icon ?? filterIcons[property.key] ?? "filter";
3343
3521
  const selectedValues = getSelectedValues(value);
3344
- const hasValue = selectedValues.length > 0;
3345
3522
  const {
3346
3523
  height,
3347
3524
  ref: contentRef,
3348
3525
  updateHeight
3349
3526
  } = useMeasureHeight([active]);
3350
- const selectedSuggestions = suggestions.filter((s2) => selectedValues.includes(s2.value));
3351
- const selectedLabel = selectedSuggestions.length > 1 ? selectedSuggestions.length.toString() : (_a = selectedSuggestions[0]) == null ? void 0 : _a.label;
3527
+ const hasValue = selectedValues.length > 0;
3352
3528
  return u$1("section", {
3353
3529
  "data-filter-key": property.key,
3354
3530
  role: "tab",
@@ -3357,7 +3533,7 @@ const Filter = ({
3357
3533
  class: wrapperClass$1({
3358
3534
  hasValue
3359
3535
  }),
3360
- onTouchStart: () => void 0,
3536
+ onTouchStart: noop,
3361
3537
  children: [u$1("div", {
3362
3538
  class: "min-w-0 max-w-full shrink-0 flex-grow",
3363
3539
  children: [u$1("button", {
@@ -3382,12 +3558,12 @@ const Filter = ({
3382
3558
  class: "w-full",
3383
3559
  ref: contentRef,
3384
3560
  children: active && u$1(FilterContentActive, {
3561
+ useQuery,
3385
3562
  onRender: updateHeight,
3386
3563
  onSkip,
3387
3564
  onValueChange,
3565
+ unfilteredQuery,
3388
3566
  property,
3389
- state,
3390
- suggestions,
3391
3567
  value
3392
3568
  })
3393
3569
  })
@@ -3396,16 +3572,13 @@ const Filter = ({
3396
3572
  tabIndex: -1,
3397
3573
  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",
3398
3574
  onClick: () => onActiveChange(true),
3399
- children: [selectedLabel && u$1("div", {
3575
+ children: [u$1("div", {
3400
3576
  "aria-label": "Current value",
3401
3577
  class: "flex max-w-full gap-1 overflow-hidden",
3402
- children: u$1("span", {
3403
- class: tagClass$1({
3404
- size: "sm",
3405
- active: true,
3406
- class: "truncate tabular-nums"
3407
- }),
3408
- children: selectedLabel
3578
+ children: u$1(CurrentValueTag, {
3579
+ property,
3580
+ query: unfilteredQuery,
3581
+ selectedValues
3409
3582
  })
3410
3583
  }), u$1(Icon, {
3411
3584
  class: chevronClass(),
@@ -3441,6 +3614,8 @@ const useFilterKeyboardFocus = (activeKey, ref) => {
3441
3614
  focusFirstAvailableOption(keyToFocus, ref);
3442
3615
  }, [activeKey, previousActiveKey, ref]);
3443
3616
  };
3617
+ function noop() {
3618
+ }
3444
3619
  const nextStateFromValue = ({
3445
3620
  property,
3446
3621
  value,
@@ -3487,72 +3662,72 @@ const FilterSection = ({
3487
3662
  var _a;
3488
3663
  const [activeKey, setActiveKey] = h((_a = properties[0]) == null ? void 0 : _a.key);
3489
3664
  useFilterKeyboardFocus(activeKey, parentRef);
3490
- const {
3491
- ...swr
3492
- } = useSWR(JSON.stringify(appliedFilters), () => getJobSearchResults({
3665
+ const defaultFilters = F$1(() => getFilterDefaults(properties), [properties]);
3666
+ const unfilteredQuery = getQueryState(useSWR(cacheKey(defaultFilters), () => getAvailableFilters({
3493
3667
  apiClient,
3494
3668
  logger,
3495
- filters: appliedFilters
3496
- }), SWR_SETTINGS);
3497
- const {
3498
- data,
3499
- error,
3500
- state
3501
- } = getDataState(swr);
3502
- switch (state) {
3503
- case "error":
3504
- throw error;
3505
- case "loading":
3506
- case "revalidating":
3507
- case "loaded":
3508
- return u$1("aside", {
3509
- children: u$1("div", {
3510
- role: "tablist",
3511
- class: "top-filters sticky flex flex-col gap-2 px-4 md:px-0",
3512
- children: properties.map((property) => {
3513
- const active = activeKey === property.key;
3514
- const value = appliedFilters[property.key] ?? {
3515
- select: property.select,
3516
- value: void 0
3517
- };
3518
- const onValueChange = (value2) => {
3519
- const {
3520
- newActiveKey,
3521
- newValue
3522
- } = nextStateFromValue({
3523
- property,
3524
- activeKey,
3525
- value: value2,
3526
- properties,
3527
- appliedFilters
3528
- });
3529
- setActiveKey(newActiveKey);
3530
- return onFilterValueChange(property.key, newValue);
3531
- };
3532
- const onActiveChange = (active2) => setActiveKey(active2 ? property.key : void 0);
3533
- const suggestions = (data == null ? void 0 : data.availableProperties[property.key]) ?? [];
3534
- return u$1(ErrorBoundary, {
3535
- Fallback,
3536
- children: u$1(Filter, {
3537
- active,
3538
- property,
3539
- onActiveChange,
3540
- value,
3541
- suggestions,
3542
- onSkip: () => {
3543
- var _a2;
3544
- const currentIndex = properties.findIndex((p2) => p2.key === activeKey);
3545
- const nextPropertyKey = currentIndex !== -1 ? (_a2 = properties[currentIndex + 1]) == null ? void 0 : _a2.key : void 0;
3546
- setActiveKey(nextPropertyKey);
3547
- },
3548
- onValueChange,
3549
- state
3550
- })
3551
- }, property.key);
3669
+ filters: defaultFilters
3670
+ }), SWR_SETTINGS));
3671
+ if (unfilteredQuery.state === "error")
3672
+ throw unfilteredQuery.error;
3673
+ const makeQueryWithoutFilter = T$1((keyToExclude) => () => {
3674
+ const filters = {
3675
+ ...appliedFilters,
3676
+ [keyToExclude]: defaultFilters[keyToExclude]
3677
+ };
3678
+ return useSWR(cacheKey(filters), () => getAvailableFilters({
3679
+ apiClient,
3680
+ logger,
3681
+ filters
3682
+ }), SWR_SETTINGS);
3683
+ }, [apiClient, appliedFilters, defaultFilters, logger]);
3684
+ return u$1("aside", {
3685
+ children: u$1("div", {
3686
+ role: "tablist",
3687
+ class: "top-filters sticky flex flex-col gap-2 px-4 md:px-0",
3688
+ children: properties.map((property) => {
3689
+ const active = activeKey === property.key;
3690
+ const value = appliedFilters[property.key] ?? {
3691
+ select: property.select,
3692
+ value: void 0
3693
+ };
3694
+ const onValueChange = (value2) => {
3695
+ const {
3696
+ newActiveKey,
3697
+ newValue
3698
+ } = nextStateFromValue({
3699
+ property,
3700
+ activeKey,
3701
+ value: value2,
3702
+ properties,
3703
+ appliedFilters
3704
+ });
3705
+ setActiveKey(newActiveKey);
3706
+ return onFilterValueChange(property.key, newValue);
3707
+ };
3708
+ const onActiveChange = (active2) => setActiveKey(active2 ? property.key : void 0);
3709
+ const useQuery = makeQueryWithoutFilter(property.key);
3710
+ return u$1(ErrorBoundary, {
3711
+ Fallback,
3712
+ children: u$1(Filter, {
3713
+ unfilteredQuery,
3714
+ active,
3715
+ property,
3716
+ onActiveChange,
3717
+ value,
3718
+ onSkip: () => {
3719
+ var _a2;
3720
+ const currentIndex = properties.findIndex((p2) => p2.key === activeKey);
3721
+ const nextPropertyKey = currentIndex !== -1 ? (_a2 = properties[currentIndex + 1]) == null ? void 0 : _a2.key : void 0;
3722
+ setActiveKey(nextPropertyKey);
3723
+ },
3724
+ useQuery,
3725
+ onValueChange
3552
3726
  })
3553
- })
3554
- });
3555
- }
3727
+ }, property.key);
3728
+ })
3729
+ })
3730
+ });
3556
3731
  };
3557
3732
  const getFirstPageKey = (getKey) => {
3558
3733
  return serialize(getKey ? getKey(0, null) : null)[0];
@@ -3776,18 +3951,6 @@ const wrapperClass = cva({
3776
3951
  const badgeClass = cva({
3777
3952
  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"
3778
3953
  });
3779
- const tagClass = cva({
3780
- base: "rounded-tag text-style-tag font-weight-tag block px-2",
3781
- variants: {
3782
- colorScheme: {
3783
- default: "bg-tag-neutral-weak-bg text-tag-neutral-weak-copy ring-px ring-tag-neutral-weak-stroke",
3784
- monetary: "bg-tag-monetary-weak-bg text-tag-monetary-weak-copy"
3785
- }
3786
- },
3787
- defaultVariants: {
3788
- colorScheme: "default"
3789
- }
3790
- });
3791
3954
  const JobCard = ({
3792
3955
  job
3793
3956
  }) => {
@@ -3818,13 +3981,16 @@ const JobCard = ({
3818
3981
  class: "flex flex-col items-start gap-2",
3819
3982
  children: [job.pay && u$1("span", {
3820
3983
  class: tagClass({
3821
- colorScheme: "monetary"
3984
+ variant: "monetaryWeak",
3985
+ size: "xs"
3822
3986
  }),
3823
3987
  children: job.pay
3824
3988
  }), job.contractType && u$1("div", {
3825
3989
  class: "flex items-center gap-2",
3826
3990
  children: u$1("span", {
3827
- class: tagClass(),
3991
+ class: tagClass({
3992
+ size: "xs"
3993
+ }),
3828
3994
  children: job.contractType
3829
3995
  })
3830
3996
  })]
@@ -3877,19 +4043,22 @@ const JobCardSkeleton = ({
3877
4043
  class: "flex flex-col items-start gap-2",
3878
4044
  children: [seed % 2 === 0 && u$1("span", {
3879
4045
  class: tagClass({
3880
- colorScheme: "default",
4046
+ variant: "neutralWeak",
4047
+ size: "xs",
3881
4048
  class: "h-[1lh] w-[10ch]"
3882
4049
  })
3883
4050
  }), u$1("div", {
3884
4051
  class: "flex items-center gap-2",
3885
4052
  children: [u$1("span", {
3886
4053
  class: tagClass({
3887
- colorScheme: "default",
4054
+ variant: "neutralWeak",
4055
+ size: "xs",
3888
4056
  class: "h-[1lh] w-[6ch]"
3889
4057
  })
3890
4058
  }), u$1("span", {
3891
4059
  class: tagClass({
3892
- colorScheme: "default",
4060
+ variant: "neutralWeak",
4061
+ size: "xs",
3893
4062
  class: "h-[1lh] w-[8ch]"
3894
4063
  })
3895
4064
  })]
@@ -3913,7 +4082,7 @@ const LoadMore = ({
3913
4082
  class: "flex flex-col gap-3",
3914
4083
  "aria-hidden": true,
3915
4084
  children: Array.from({
3916
- length: 4
4085
+ length: PAGE_SIZE
3917
4086
  }).map((_2, i2) => u$1("li", {
3918
4087
  children: u$1(JobCardSkeleton, {
3919
4088
  seed: i2,
@@ -3969,7 +4138,7 @@ const ResultsSection = ({
3969
4138
  ...swr
3970
4139
  } = useSWRInfinite((index, prevPageData) => {
3971
4140
  if (prevPageData === null)
3972
- return index + 1 + "/" + JSON.stringify(appliedFilters);
4141
+ return index + 1 + "/" + cacheKey(appliedFilters);
3973
4142
  if (prevPageData.pagination.last_page === prevPageData.pagination.current_page)
3974
4143
  return null;
3975
4144
  return index + 1 + "/" + JSON.stringify(appliedFilters);
@@ -3987,7 +4156,7 @@ const ResultsSection = ({
3987
4156
  data,
3988
4157
  error,
3989
4158
  state
3990
- } = getDataState(swr);
4159
+ } = getQueryState(swr);
3991
4160
  const fetchNextPage = () => {
3992
4161
  setSize((size2) => size2 + 1);
3993
4162
  };
@@ -4004,7 +4173,7 @@ const ResultsSection = ({
4004
4173
  class: "flex flex-col gap-3",
4005
4174
  "aria-hidden": true,
4006
4175
  children: Array.from({
4007
- length: 30
4176
+ length: PAGE_SIZE
4008
4177
  }).map((_2, i2) => u$1("li", {
4009
4178
  children: u$1(JobCardSkeleton, {
4010
4179
  seed: i2,
@@ -4137,7 +4306,7 @@ const JobSearch = ({
4137
4306
  })
4138
4307
  });
4139
4308
  };
4140
- 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";
4309
+ 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";
4141
4310
  const match = (m2) => {
4142
4311
  const patterns = [];
4143
4312
  const i2 = (m22) => ({
@@ -4365,7 +4534,7 @@ const generateTokenVars = (theme, color) => {
4365
4534
  "copy-inverted-lowcontrast": oklch(color["n-4"]),
4366
4535
  "copy-inverted-icon": oklch(color["n-3"]),
4367
4536
  "tag-neutral-weak-bg": highlights === "fill" ? oklch(color["n-2"]) : transparent,
4368
- "tag-neutral-weak-copy": color["n-12"],
4537
+ "tag-neutral-weak-copy": oklch(color["n-12"]),
4369
4538
  "tag-neutral-weak-stroke-color": highlights === "stroke" ? oklch(color["n-8"]) : transparent,
4370
4539
  "tag-neutral-strong-bg": highlights === "fill" ? oklch(color["n-12"]) : transparent,
4371
4540
  "tag-neutral-strong-copy": oklch(highlights === "fill" ? color.white : color["n-12"]),