@phatvu/web-component-poc 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/cjs/fast-button.cjs.entry.js +46 -0
  2. package/dist/cjs/{fast-button_4.cjs.entry.js → fast-carousel.cjs.entry.js} +1 -231
  3. package/dist/cjs/fast-input_4.cjs.entry.js +499 -0
  4. package/dist/cjs/{index-B2BTpdbN.js → index-BEvZs91D.js} +2 -2
  5. package/dist/cjs/job-card.cjs.entry.js +138 -0
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/web-component-poc.cjs.js +2 -2
  8. package/dist/collection/collection-manifest.json +4 -1
  9. package/dist/collection/components/button/button.js +2 -2
  10. package/dist/collection/components/fast-input/fast-input.css +55 -0
  11. package/dist/collection/components/fast-input/fast-input.js +335 -0
  12. package/dist/collection/components/job-card/job-card.css +247 -0
  13. package/dist/collection/components/job-card/job-card.js +435 -0
  14. package/dist/collection/components/jobs-item/jobs-item.js +5 -5
  15. package/dist/collection/components/jobs-list-only/jobs-list-only.js +185 -8
  16. package/dist/collection/components/jobs-list-reactive/jobs-list-reactive.css +8 -0
  17. package/dist/collection/components/jobs-list-reactive/jobs-list-reactive.js +203 -0
  18. package/dist/components/fast-button.js +1 -1
  19. package/dist/components/fast-carousel.js +1 -1
  20. package/dist/components/fast-input.d.ts +11 -0
  21. package/dist/components/fast-input.js +1 -0
  22. package/dist/components/index.js +1 -1
  23. package/dist/components/job-card.d.ts +11 -0
  24. package/dist/components/job-card.js +1 -0
  25. package/dist/components/jobs-item.js +1 -1
  26. package/dist/components/jobs-list-only.js +1 -1
  27. package/dist/components/jobs-list-reactive.d.ts +11 -0
  28. package/dist/components/jobs-list-reactive.js +1 -0
  29. package/dist/components/{p-ClQDwJJB.js → p-DQiaLjLf.js} +1 -1
  30. package/dist/esm/fast-button.entry.js +44 -0
  31. package/dist/esm/{fast-button_4.entry.js → fast-carousel.entry.js} +2 -229
  32. package/dist/esm/fast-input_4.entry.js +494 -0
  33. package/dist/esm/{index-Dk5CvWmb.js → index-C_ZLQIpp.js} +2 -2
  34. package/dist/esm/job-card.entry.js +136 -0
  35. package/dist/esm/loader.js +3 -3
  36. package/dist/esm/web-component-poc.js +3 -3
  37. package/dist/types/components/fast-input/fast-input.d.ts +37 -0
  38. package/dist/types/components/job-card/job-card.d.ts +93 -0
  39. package/dist/types/components/jobs-item/jobs-item.d.ts +2 -2
  40. package/dist/types/components/jobs-list-only/jobs-list-only.d.ts +24 -2
  41. package/dist/types/components/jobs-list-reactive/jobs-list-reactive.d.ts +26 -0
  42. package/dist/types/components.d.ts +469 -7
  43. package/dist/types/mock/jobs-list-only.mock.d.ts +2 -2
  44. package/dist/types/types/jobs-list.d.ts +6 -2
  45. package/dist/web-component-poc/p-618fba28.entry.js +1 -0
  46. package/dist/web-component-poc/p-7d45772f.entry.js +1 -0
  47. package/dist/web-component-poc/p-bef7c8e2.entry.js +1 -0
  48. package/dist/web-component-poc/p-cfb9aed9.entry.js +1 -0
  49. package/dist/web-component-poc/web-component-poc.esm.js +1 -1
  50. package/hydrate/index.js +534 -6
  51. package/hydrate/index.mjs +534 -6
  52. package/package.json +9 -1
  53. package/dist/web-component-poc/p-df843533.entry.js +0 -1
  54. /package/dist/components/{p-UM9TUfe3.js → p-BiaJAQXY.js} +0 -0
  55. /package/dist/web-component-poc/{p-Dk5CvWmb.js → p-C_ZLQIpp.js} +0 -0
@@ -6,9 +6,9 @@
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
8
  import { ButtonType, ButtonVariant } from "./components/button/button";
9
- import { JobSummary } from "./types/jobs-list";
9
+ import { Job } from "./types/jobs-list";
10
10
  export { ButtonType, ButtonVariant } from "./components/button/button";
11
- export { JobSummary } from "./types/jobs-list";
11
+ export { Job } from "./types/jobs-list";
12
12
  export namespace Components {
13
13
  interface FastButton {
14
14
  /**
@@ -70,6 +70,124 @@ export namespace Components {
70
70
  */
71
71
  "slideClass": string;
72
72
  }
73
+ interface FastInput {
74
+ /**
75
+ * @default '/api/jobs/autocomplete'
76
+ */
77
+ "autocompleteUrl": string;
78
+ /**
79
+ * @default 300
80
+ */
81
+ "debounceMs": number;
82
+ /**
83
+ * @default false
84
+ */
85
+ "enableAutocomplete": boolean;
86
+ /**
87
+ * @default 3
88
+ */
89
+ "minChars": number;
90
+ /**
91
+ * @default 'keyword'
92
+ */
93
+ "paramName": string;
94
+ /**
95
+ * @default 'Search...'
96
+ */
97
+ "placeholder": string;
98
+ "targetPath": string | undefined;
99
+ /**
100
+ * @default ''
101
+ */
102
+ "value": string;
103
+ }
104
+ /**
105
+ * JobCard Component
106
+ * A reusable card component for displaying job information based on the React JobItem component.
107
+ * Features include:
108
+ * - Job title with apply link
109
+ * - Location with distance
110
+ * - Brand/company name
111
+ * - Employment type
112
+ * - Reference number (optional)
113
+ * - Remote indicator (optional)
114
+ * - Multi-location support
115
+ * - Custom extra fields
116
+ * @example ```html
117
+ * <job-card
118
+ * .job={jobData}
119
+ * applyButtonText="Apply"
120
+ * showBrand="true"
121
+ * showEmploymentType="true"
122
+ * ></job-card>
123
+ * ```
124
+ */
125
+ interface JobCard {
126
+ /**
127
+ * Text for the apply button
128
+ * @default 'Apply Now'
129
+ */
130
+ "applyButtonText": string;
131
+ /**
132
+ * Whether to show distances in kilometers instead of miles
133
+ * @default false
134
+ */
135
+ "enableKilometers": boolean;
136
+ /**
137
+ * Custom extra fields configuration
138
+ * @default []
139
+ */
140
+ "extraFieldsConfig": Array<{ name: string; value: string }>;
141
+ /**
142
+ * Index of the job in a list (used for accessibility)
143
+ * @default 0
144
+ */
145
+ "index": number;
146
+ /**
147
+ * The job data object to display. Accepts either a Job object or a JSON string.
148
+ */
149
+ "job": Job | string;
150
+ /**
151
+ * Text shown for multiple locations
152
+ * @default 'More locations'
153
+ */
154
+ "multiLocationText": string;
155
+ /**
156
+ * Text shown for remote jobs
157
+ * @default 'Remote'
158
+ */
159
+ "remoteLocationText": string;
160
+ /**
161
+ * Extra CSS class on the root inner element (avoid prop name "className", reserved on HTMLElement).
162
+ * @default ''
163
+ */
164
+ "rootClass": string;
165
+ /**
166
+ * Whether to show the brand/company name
167
+ * @default true
168
+ */
169
+ "showBrand": boolean;
170
+ /**
171
+ * Whether to show commute time
172
+ * @default false
173
+ */
174
+ "showCommuteTime": boolean;
175
+ /**
176
+ * Whether to show employment type
177
+ * @default true
178
+ */
179
+ "showEmploymentType": boolean;
180
+ /**
181
+ * Whether to show the reference number
182
+ * @default false
183
+ */
184
+ "showReference": boolean;
185
+ /**
186
+ * Format string for street address (not used in base web component)
187
+ * @default '{street}, {city_state_abbr}'
188
+ */
189
+ "streetFormat": string;
190
+ }
73
191
  interface JobsItem {
74
192
  /**
75
193
  * @default 'Apply Now'
@@ -83,7 +201,7 @@ export namespace Components {
83
201
  * @default 0
84
202
  */
85
203
  "index": number;
86
- "job": JobSummary;
204
+ "job": Job;
87
205
  /**
88
206
  * @default 'More locations'
89
207
  */
@@ -106,10 +224,20 @@ export namespace Components {
106
224
  "showReference": boolean;
107
225
  }
108
226
  interface JobsListOnly {
227
+ /**
228
+ * Jobs search endpoint
229
+ * @default '/api/get-jobs'
230
+ */
231
+ "apiUrl": string;
109
232
  /**
110
233
  * @default 'Apply Now'
111
234
  */
112
235
  "applyButtonText": string;
236
+ /**
237
+ * When true, component manages its own data fetching
238
+ * @default false
239
+ */
240
+ "autoFetch": boolean;
113
241
  /**
114
242
  * @default 'Try different keywords'
115
243
  */
@@ -138,7 +266,7 @@ export namespace Components {
138
266
  * List of jobs to display. Pass as JSON string from attribute or as array via property (e.g. from React). Ignored when mock-data="true".
139
267
  * @default []
140
268
  */
141
- "jobs": JobSummary[] | string;
269
+ "jobs": Job[] | string;
142
270
  /**
143
271
  * Show loading spinner. Ignored when mock-data="true" (mock shows data immediately).
144
272
  * @default false
@@ -174,6 +302,11 @@ export namespace Components {
174
302
  * @default true
175
303
  */
176
304
  "showBrand": boolean;
305
+ /**
306
+ * Template string for count display. Tokens: {count} = jobs on page, {total} = total from API.
307
+ * @default ''
308
+ */
309
+ "showCountText": string;
177
310
  /**
178
311
  * @default true
179
312
  */
@@ -195,12 +328,46 @@ export namespace Components {
195
328
  * @default 0
196
329
  */
197
330
  "totalJob": number;
331
+ /**
332
+ * Comma-separated URL param names to watch and forward to the API
333
+ * @default 'keyword'
334
+ */
335
+ "watchParams": string;
336
+ }
337
+ interface JobsListReactive {
338
+ /**
339
+ * Jobs search endpoint
340
+ * @default '/api/get-jobs'
341
+ */
342
+ "apiUrl": string;
343
+ /**
344
+ * CSS class added to container while fetching
345
+ * @default 'loading'
346
+ */
347
+ "loadingClass": string;
348
+ /**
349
+ * Comma-separated URL param names to watch and forward to the API
350
+ * @default 'keyword,location_name'
351
+ */
352
+ "watchParams": string;
198
353
  }
199
354
  }
200
355
  export interface FastButtonCustomEvent<T> extends CustomEvent<T> {
201
356
  detail: T;
202
357
  target: HTMLFastButtonElement;
203
358
  }
359
+ export interface FastInputCustomEvent<T> extends CustomEvent<T> {
360
+ detail: T;
361
+ target: HTMLFastInputElement;
362
+ }
363
+ export interface JobsListOnlyCustomEvent<T> extends CustomEvent<T> {
364
+ detail: T;
365
+ target: HTMLJobsListOnlyElement;
366
+ }
367
+ export interface JobsListReactiveCustomEvent<T> extends CustomEvent<T> {
368
+ detail: T;
369
+ target: HTMLJobsListReactiveElement;
370
+ }
204
371
  declare global {
205
372
  interface HTMLFastButtonElementEventMap {
206
373
  "buttonClick": MouseEvent;
@@ -225,23 +392,99 @@ declare global {
225
392
  prototype: HTMLFastCarouselElement;
226
393
  new (): HTMLFastCarouselElement;
227
394
  };
395
+ interface HTMLFastInputElementEventMap {
396
+ "searchExecuted": { keyword: string };
397
+ "inputChanged": { value: string };
398
+ }
399
+ interface HTMLFastInputElement extends Components.FastInput, HTMLStencilElement {
400
+ addEventListener<K extends keyof HTMLFastInputElementEventMap>(type: K, listener: (this: HTMLFastInputElement, ev: FastInputCustomEvent<HTMLFastInputElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
401
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
402
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
403
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
404
+ removeEventListener<K extends keyof HTMLFastInputElementEventMap>(type: K, listener: (this: HTMLFastInputElement, ev: FastInputCustomEvent<HTMLFastInputElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
405
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
406
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
407
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
408
+ }
409
+ var HTMLFastInputElement: {
410
+ prototype: HTMLFastInputElement;
411
+ new (): HTMLFastInputElement;
412
+ };
413
+ /**
414
+ * JobCard Component
415
+ * A reusable card component for displaying job information based on the React JobItem component.
416
+ * Features include:
417
+ * - Job title with apply link
418
+ * - Location with distance
419
+ * - Brand/company name
420
+ * - Employment type
421
+ * - Reference number (optional)
422
+ * - Remote indicator (optional)
423
+ * - Multi-location support
424
+ * - Custom extra fields
425
+ * @example ```html
426
+ * <job-card
427
+ * .job={jobData}
428
+ * applyButtonText="Apply"
429
+ * showBrand="true"
430
+ * showEmploymentType="true"
431
+ * ></job-card>
432
+ * ```
433
+ */
434
+ interface HTMLJobCardElement extends Components.JobCard, HTMLStencilElement {
435
+ }
436
+ var HTMLJobCardElement: {
437
+ prototype: HTMLJobCardElement;
438
+ new (): HTMLJobCardElement;
439
+ };
228
440
  interface HTMLJobsItemElement extends Components.JobsItem, HTMLStencilElement {
229
441
  }
230
442
  var HTMLJobsItemElement: {
231
443
  prototype: HTMLJobsItemElement;
232
444
  new (): HTMLJobsItemElement;
233
445
  };
446
+ interface HTMLJobsListOnlyElementEventMap {
447
+ "fetchComplete": { jobs: any[]; totalJob: number };
448
+ }
234
449
  interface HTMLJobsListOnlyElement extends Components.JobsListOnly, HTMLStencilElement {
450
+ addEventListener<K extends keyof HTMLJobsListOnlyElementEventMap>(type: K, listener: (this: HTMLJobsListOnlyElement, ev: JobsListOnlyCustomEvent<HTMLJobsListOnlyElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
451
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
452
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
453
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
454
+ removeEventListener<K extends keyof HTMLJobsListOnlyElementEventMap>(type: K, listener: (this: HTMLJobsListOnlyElement, ev: JobsListOnlyCustomEvent<HTMLJobsListOnlyElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
455
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
456
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
457
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
235
458
  }
236
459
  var HTMLJobsListOnlyElement: {
237
460
  prototype: HTMLJobsListOnlyElement;
238
461
  new (): HTMLJobsListOnlyElement;
239
462
  };
463
+ interface HTMLJobsListReactiveElementEventMap {
464
+ "fetchComplete": { jobs: Job[]; totalJob: number };
465
+ }
466
+ interface HTMLJobsListReactiveElement extends Components.JobsListReactive, HTMLStencilElement {
467
+ addEventListener<K extends keyof HTMLJobsListReactiveElementEventMap>(type: K, listener: (this: HTMLJobsListReactiveElement, ev: JobsListReactiveCustomEvent<HTMLJobsListReactiveElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
468
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
469
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
470
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
471
+ removeEventListener<K extends keyof HTMLJobsListReactiveElementEventMap>(type: K, listener: (this: HTMLJobsListReactiveElement, ev: JobsListReactiveCustomEvent<HTMLJobsListReactiveElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
472
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
473
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
474
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
475
+ }
476
+ var HTMLJobsListReactiveElement: {
477
+ prototype: HTMLJobsListReactiveElement;
478
+ new (): HTMLJobsListReactiveElement;
479
+ };
240
480
  interface HTMLElementTagNameMap {
241
481
  "fast-button": HTMLFastButtonElement;
242
482
  "fast-carousel": HTMLFastCarouselElement;
483
+ "fast-input": HTMLFastInputElement;
484
+ "job-card": HTMLJobCardElement;
243
485
  "jobs-item": HTMLJobsItemElement;
244
486
  "jobs-list-only": HTMLJobsListOnlyElement;
487
+ "jobs-list-reactive": HTMLJobsListReactiveElement;
245
488
  }
246
489
  }
247
490
  declare namespace LocalJSX {
@@ -293,6 +536,126 @@ declare namespace LocalJSX {
293
536
  */
294
537
  "slideClass"?: string;
295
538
  }
539
+ interface FastInput {
540
+ /**
541
+ * @default '/api/jobs/autocomplete'
542
+ */
543
+ "autocompleteUrl"?: string;
544
+ /**
545
+ * @default 300
546
+ */
547
+ "debounceMs"?: number;
548
+ /**
549
+ * @default false
550
+ */
551
+ "enableAutocomplete"?: boolean;
552
+ /**
553
+ * @default 3
554
+ */
555
+ "minChars"?: number;
556
+ "onInputChanged"?: (event: FastInputCustomEvent<{ value: string }>) => void;
557
+ "onSearchExecuted"?: (event: FastInputCustomEvent<{ keyword: string }>) => void;
558
+ /**
559
+ * @default 'keyword'
560
+ */
561
+ "paramName"?: string;
562
+ /**
563
+ * @default 'Search...'
564
+ */
565
+ "placeholder"?: string;
566
+ "targetPath"?: string | undefined;
567
+ /**
568
+ * @default ''
569
+ */
570
+ "value"?: string;
571
+ }
572
+ /**
573
+ * JobCard Component
574
+ * A reusable card component for displaying job information based on the React JobItem component.
575
+ * Features include:
576
+ * - Job title with apply link
577
+ * - Location with distance
578
+ * - Brand/company name
579
+ * - Employment type
580
+ * - Reference number (optional)
581
+ * - Remote indicator (optional)
582
+ * - Multi-location support
583
+ * - Custom extra fields
584
+ * @example ```html
585
+ * <job-card
586
+ * .job={jobData}
587
+ * applyButtonText="Apply"
588
+ * showBrand="true"
589
+ * showEmploymentType="true"
590
+ * ></job-card>
591
+ * ```
592
+ */
593
+ interface JobCard {
594
+ /**
595
+ * Text for the apply button
596
+ * @default 'Apply Now'
597
+ */
598
+ "applyButtonText"?: string;
599
+ /**
600
+ * Whether to show distances in kilometers instead of miles
601
+ * @default false
602
+ */
603
+ "enableKilometers"?: boolean;
604
+ /**
605
+ * Custom extra fields configuration
606
+ * @default []
607
+ */
608
+ "extraFieldsConfig"?: Array<{ name: string; value: string }>;
609
+ /**
610
+ * Index of the job in a list (used for accessibility)
611
+ * @default 0
612
+ */
613
+ "index"?: number;
614
+ /**
615
+ * The job data object to display. Accepts either a Job object or a JSON string.
616
+ */
617
+ "job"?: Job | string;
618
+ /**
619
+ * Text shown for multiple locations
620
+ * @default 'More locations'
621
+ */
622
+ "multiLocationText"?: string;
623
+ /**
624
+ * Text shown for remote jobs
625
+ * @default 'Remote'
626
+ */
627
+ "remoteLocationText"?: string;
628
+ /**
629
+ * Extra CSS class on the root inner element (avoid prop name "className", reserved on HTMLElement).
630
+ * @default ''
631
+ */
632
+ "rootClass"?: string;
633
+ /**
634
+ * Whether to show the brand/company name
635
+ * @default true
636
+ */
637
+ "showBrand"?: boolean;
638
+ /**
639
+ * Whether to show commute time
640
+ * @default false
641
+ */
642
+ "showCommuteTime"?: boolean;
643
+ /**
644
+ * Whether to show employment type
645
+ * @default true
646
+ */
647
+ "showEmploymentType"?: boolean;
648
+ /**
649
+ * Whether to show the reference number
650
+ * @default false
651
+ */
652
+ "showReference"?: boolean;
653
+ /**
654
+ * Format string for street address (not used in base web component)
655
+ * @default '{street}, {city_state_abbr}'
656
+ */
657
+ "streetFormat"?: string;
658
+ }
296
659
  interface JobsItem {
297
660
  /**
298
661
  * @default 'Apply Now'
@@ -306,7 +669,7 @@ declare namespace LocalJSX {
306
669
  * @default 0
307
670
  */
308
671
  "index"?: number;
309
- "job"?: JobSummary;
672
+ "job"?: Job;
310
673
  /**
311
674
  * @default 'More locations'
312
675
  */
@@ -329,10 +692,20 @@ declare namespace LocalJSX {
329
692
  "showReference"?: boolean;
330
693
  }
331
694
  interface JobsListOnly {
695
+ /**
696
+ * Jobs search endpoint
697
+ * @default '/api/get-jobs'
698
+ */
699
+ "apiUrl"?: string;
332
700
  /**
333
701
  * @default 'Apply Now'
334
702
  */
335
703
  "applyButtonText"?: string;
704
+ /**
705
+ * When true, component manages its own data fetching
706
+ * @default false
707
+ */
708
+ "autoFetch"?: boolean;
336
709
  /**
337
710
  * @default 'Try different keywords'
338
711
  */
@@ -361,7 +734,7 @@ declare namespace LocalJSX {
361
734
  * List of jobs to display. Pass as JSON string from attribute or as array via property (e.g. from React). Ignored when mock-data="true".
362
735
  * @default []
363
736
  */
364
- "jobs"?: JobSummary[] | string;
737
+ "jobs"?: Job[] | string;
365
738
  /**
366
739
  * Show loading spinner. Ignored when mock-data="true" (mock shows data immediately).
367
740
  * @default false
@@ -384,6 +757,7 @@ declare namespace LocalJSX {
384
757
  * @default defaultNoResultsLine2
385
758
  */
386
759
  "noResultsLine2"?: string;
760
+ "onFetchComplete"?: (event: JobsListOnlyCustomEvent<{ jobs: any[]; totalJob: number }>) => void;
387
761
  /**
388
762
  * @default 'Remote'
389
763
  */
@@ -397,6 +771,11 @@ declare namespace LocalJSX {
397
771
  * @default true
398
772
  */
399
773
  "showBrand"?: boolean;
774
+ /**
775
+ * Template string for count display. Tokens: {count} = jobs on page, {total} = total from API.
776
+ * @default ''
777
+ */
778
+ "showCountText"?: string;
400
779
  /**
401
780
  * @default true
402
781
  */
@@ -418,6 +797,29 @@ declare namespace LocalJSX {
418
797
  * @default 0
419
798
  */
420
799
  "totalJob"?: number;
800
+ /**
801
+ * Comma-separated URL param names to watch and forward to the API
802
+ * @default 'keyword'
803
+ */
804
+ "watchParams"?: string;
805
+ }
806
+ interface JobsListReactive {
807
+ /**
808
+ * Jobs search endpoint
809
+ * @default '/api/get-jobs'
810
+ */
811
+ "apiUrl"?: string;
812
+ /**
813
+ * CSS class added to container while fetching
814
+ * @default 'loading'
815
+ */
816
+ "loadingClass"?: string;
817
+ "onFetchComplete"?: (event: JobsListReactiveCustomEvent<{ jobs: Job[]; totalJob: number }>) => void;
818
+ /**
819
+ * Comma-separated URL param names to watch and forward to the API
820
+ * @default 'keyword,location_name'
821
+ */
822
+ "watchParams"?: string;
421
823
  }
422
824
 
423
825
  interface FastButtonAttributes {
@@ -433,6 +835,30 @@ declare namespace LocalJSX {
433
835
  "slideClass": string;
434
836
  "itemClass": string;
435
837
  }
838
+ interface FastInputAttributes {
839
+ "placeholder": string;
840
+ "value": string;
841
+ "paramName": string;
842
+ "enableAutocomplete": boolean;
843
+ "autocompleteUrl": string;
844
+ "targetPath": string | undefined;
845
+ "debounceMs": number;
846
+ "minChars": number;
847
+ }
848
+ interface JobCardAttributes {
849
+ "job": Job | string;
850
+ "index": number;
851
+ "applyButtonText": string;
852
+ "showBrand": boolean;
853
+ "showReference": boolean;
854
+ "showEmploymentType": boolean;
855
+ "multiLocationText": string;
856
+ "remoteLocationText": string;
857
+ "enableKilometers": boolean;
858
+ "showCommuteTime": boolean;
859
+ "streetFormat": string;
860
+ "rootClass": string;
861
+ }
436
862
  interface JobsItemAttributes {
437
863
  "index": number;
438
864
  "applyButtonText": string;
@@ -445,7 +871,7 @@ declare namespace LocalJSX {
445
871
  }
446
872
  interface JobsListOnlyAttributes {
447
873
  "mockData": boolean;
448
- "jobs": JobSummary[] | string;
874
+ "jobs": Job[] | string;
449
875
  "loading": boolean;
450
876
  "totalJob": number;
451
877
  "noResultsLine1": string;
@@ -459,19 +885,31 @@ declare namespace LocalJSX {
459
885
  "remoteLocationText": string;
460
886
  "enableKilometers": boolean;
461
887
  "rootClass": string;
888
+ "showCountText": string;
462
889
  "showSuggestions": boolean;
463
890
  "clearResultSuggestionsTitleText": string;
464
891
  "clearResultSuggestionsLine1": string;
465
892
  "clearResultSuggestionsLine2": string;
466
893
  "clearResultSuggestionsLine3": string;
467
894
  "clearResultSuggestionsLine4": string;
895
+ "autoFetch": boolean;
896
+ "apiUrl": string;
897
+ "watchParams": string;
898
+ }
899
+ interface JobsListReactiveAttributes {
900
+ "apiUrl": string;
901
+ "watchParams": string;
902
+ "loadingClass": string;
468
903
  }
469
904
 
470
905
  interface IntrinsicElements {
471
906
  "fast-button": Omit<FastButton, keyof FastButtonAttributes> & { [K in keyof FastButton & keyof FastButtonAttributes]?: FastButton[K] } & { [K in keyof FastButton & keyof FastButtonAttributes as `attr:${K}`]?: FastButtonAttributes[K] } & { [K in keyof FastButton & keyof FastButtonAttributes as `prop:${K}`]?: FastButton[K] };
472
907
  "fast-carousel": Omit<FastCarousel, keyof FastCarouselAttributes> & { [K in keyof FastCarousel & keyof FastCarouselAttributes]?: FastCarousel[K] } & { [K in keyof FastCarousel & keyof FastCarouselAttributes as `attr:${K}`]?: FastCarouselAttributes[K] } & { [K in keyof FastCarousel & keyof FastCarouselAttributes as `prop:${K}`]?: FastCarousel[K] };
908
+ "fast-input": Omit<FastInput, keyof FastInputAttributes> & { [K in keyof FastInput & keyof FastInputAttributes]?: FastInput[K] } & { [K in keyof FastInput & keyof FastInputAttributes as `attr:${K}`]?: FastInputAttributes[K] } & { [K in keyof FastInput & keyof FastInputAttributes as `prop:${K}`]?: FastInput[K] };
909
+ "job-card": Omit<JobCard, keyof JobCardAttributes> & { [K in keyof JobCard & keyof JobCardAttributes]?: JobCard[K] } & { [K in keyof JobCard & keyof JobCardAttributes as `attr:${K}`]?: JobCardAttributes[K] } & { [K in keyof JobCard & keyof JobCardAttributes as `prop:${K}`]?: JobCard[K] };
473
910
  "jobs-item": Omit<JobsItem, keyof JobsItemAttributes> & { [K in keyof JobsItem & keyof JobsItemAttributes]?: JobsItem[K] } & { [K in keyof JobsItem & keyof JobsItemAttributes as `attr:${K}`]?: JobsItemAttributes[K] } & { [K in keyof JobsItem & keyof JobsItemAttributes as `prop:${K}`]?: JobsItem[K] };
474
911
  "jobs-list-only": Omit<JobsListOnly, keyof JobsListOnlyAttributes> & { [K in keyof JobsListOnly & keyof JobsListOnlyAttributes]?: JobsListOnly[K] } & { [K in keyof JobsListOnly & keyof JobsListOnlyAttributes as `attr:${K}`]?: JobsListOnlyAttributes[K] } & { [K in keyof JobsListOnly & keyof JobsListOnlyAttributes as `prop:${K}`]?: JobsListOnly[K] };
912
+ "jobs-list-reactive": Omit<JobsListReactive, keyof JobsListReactiveAttributes> & { [K in keyof JobsListReactive & keyof JobsListReactiveAttributes]?: JobsListReactive[K] } & { [K in keyof JobsListReactive & keyof JobsListReactiveAttributes as `attr:${K}`]?: JobsListReactiveAttributes[K] } & { [K in keyof JobsListReactive & keyof JobsListReactiveAttributes as `prop:${K}`]?: JobsListReactive[K] };
475
913
  }
476
914
  }
477
915
  export { LocalJSX as JSX };
@@ -480,8 +918,32 @@ declare module "@stencil/core" {
480
918
  interface IntrinsicElements {
481
919
  "fast-button": LocalJSX.IntrinsicElements["fast-button"] & JSXBase.HTMLAttributes<HTMLFastButtonElement>;
482
920
  "fast-carousel": LocalJSX.IntrinsicElements["fast-carousel"] & JSXBase.HTMLAttributes<HTMLFastCarouselElement>;
921
+ "fast-input": LocalJSX.IntrinsicElements["fast-input"] & JSXBase.HTMLAttributes<HTMLFastInputElement>;
922
+ /**
923
+ * JobCard Component
924
+ * A reusable card component for displaying job information based on the React JobItem component.
925
+ * Features include:
926
+ * - Job title with apply link
927
+ * - Location with distance
928
+ * - Brand/company name
929
+ * - Employment type
930
+ * - Reference number (optional)
931
+ * - Remote indicator (optional)
932
+ * - Multi-location support
933
+ * - Custom extra fields
934
+ * @example ```html
935
+ * <job-card
936
+ * .job={jobData}
937
+ * applyButtonText="Apply"
938
+ * showBrand="true"
939
+ * showEmploymentType="true"
940
+ * ></job-card>
941
+ * ```
942
+ */
943
+ "job-card": LocalJSX.IntrinsicElements["job-card"] & JSXBase.HTMLAttributes<HTMLJobCardElement>;
483
944
  "jobs-item": LocalJSX.IntrinsicElements["jobs-item"] & JSXBase.HTMLAttributes<HTMLJobsItemElement>;
484
945
  "jobs-list-only": LocalJSX.IntrinsicElements["jobs-list-only"] & JSXBase.HTMLAttributes<HTMLJobsListOnlyElement>;
946
+ "jobs-list-reactive": LocalJSX.IntrinsicElements["jobs-list-reactive"] & JSXBase.HTMLAttributes<HTMLJobsListReactiveElement>;
485
947
  }
486
948
  }
487
949
  }
@@ -1,7 +1,7 @@
1
- import type { JobSummary } from '../types/jobs-list';
1
+ import type { Job } from '../types/jobs-list';
2
2
  /**
3
3
  * Mock jobs for local development and docs.
4
4
  * Use in www or static HTML: jobs='...' (JSON.stringify(mockJobs)).
5
5
  */
6
- export declare const mockJobsListOnly: JobSummary[];
6
+ export declare const mockJobsListOnly: Job[];
7
7
  export declare function getMockJobsJson(): string;
@@ -21,7 +21,11 @@ export interface JobCardExtraFieldSummary {
21
21
  value: string | string[];
22
22
  classname: string;
23
23
  }
24
- export interface JobSummary {
24
+ /**
25
+ * Job data shape for job-card and jobs-list-only components.
26
+ * Compatible with ReactJob from career-sites-renderer.
27
+ */
28
+ export interface Job {
25
29
  title?: string;
26
30
  reference?: string;
27
31
  originalURL?: string;
@@ -34,7 +38,7 @@ export interface JobSummary {
34
38
  [key: string]: unknown;
35
39
  }
36
40
  export interface JobsListOnlyProps {
37
- jobs?: JobSummary[];
41
+ jobs?: Job[];
38
42
  loading?: boolean;
39
43
  totalJob?: number;
40
44
  noResultsLine1?: string;
@@ -0,0 +1 @@
1
+ import{r as t,c as o,h as r}from"./p-C_ZLQIpp.js";const c=class{constructor(r){t(this,r),this.buttonClick=o(this,"buttonClick")}variant="primary";type="button";disabled=!1;buttonClick;handleClick=t=>{if(this.disabled)return t.preventDefault(),void t.stopPropagation();this.buttonClick.emit(t)};render(){return r("button",{key:"3b74909afe4e305dfd38f0b07657202e3d5bfccd",type:this.type,class:{"custom-button":!0,[`custom-button--${this.variant}`]:!0,"custom-button--disabled":this.disabled},disabled:this.disabled,onClick:this.handleClick},r("slot",{key:"49845d350e4665c5c66e30bd9262f788eaaa1e20"}))}};c.style=":host{display:inline-block}.custom-button{display:inline-flex;align-items:center;justify-content:center;padding:0.5rem 1rem;font-family:inherit;font-size:0.875rem;font-weight:500;line-height:1.25;border:none;border-radius:0.375rem;cursor:pointer;transition:background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease}.custom-button:focus{outline:2px solid var(--custom-button-focus-ring, #2563eb);outline-offset:2px}.custom-button:focus:not(:focus-visible){outline:none}.custom-button--primary{background-color:var(--custom-button-primary-bg, #2563eb);color:var(--custom-button-primary-color, #fff)}.custom-button--primary:hover:not(.custom-button--disabled){background-color:var(--custom-button-primary-hover-bg, #1d4ed8)}.custom-button--primary:active:not(.custom-button--disabled){background-color:var(--custom-button-primary-active-bg, #1e40af)}.custom-button--secondary{background-color:var(--custom-button-secondary-bg, #e5e7eb);color:var(--custom-button-secondary-color, #1f2937)}.custom-button--secondary:hover:not(.custom-button--disabled){background-color:var(--custom-button-secondary-hover-bg, #d1d5db)}.custom-button--secondary:active:not(.custom-button--disabled){background-color:var(--custom-button-secondary-active-bg, #9ca3af)}.custom-button--text{background-color:transparent;color:var(--custom-button-text-color, #2563eb)}.custom-button--text:hover:not(.custom-button--disabled){background-color:var(--custom-button-text-hover-bg, rgba(37, 99, 235, 0.08))}.custom-button--text:active:not(.custom-button--disabled){background-color:var(--custom-button-text-active-bg, rgba(37, 99, 235, 0.12))}.custom-button--disabled,.custom-button:disabled{opacity:0.6;cursor:not-allowed}";export{c as fast_button}