@fastnd/components 1.0.27 → 1.0.28

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 (34) hide show
  1. package/dist/components/ColumnConfigPopover/ColumnConfigPopover.d.ts +20 -0
  2. package/dist/components/DoubleTextCell/DoubleTextCell.d.ts +9 -0
  3. package/dist/components/ProgressCircle/ProgressCircle.d.ts +9 -0
  4. package/dist/components/index.d.ts +3 -0
  5. package/dist/components/ui/badge.d.ts +1 -1
  6. package/dist/components/ui/button.d.ts +1 -1
  7. package/dist/components/ui/input-group.d.ts +1 -1
  8. package/dist/components/ui/item.d.ts +1 -1
  9. package/dist/components/ui/tabs.d.ts +1 -1
  10. package/dist/examples/data-visualization/DataGrid/DataGrid.tsx +136 -0
  11. package/dist/examples/data-visualization/DataGridCardView/DataGridCardView.tsx +179 -0
  12. package/dist/examples/data-visualization/DataGridListView/DataGridListView.tsx +190 -0
  13. package/dist/examples/data-visualization/DataGridPage/DataGridPage.tsx +43 -0
  14. package/dist/examples/data-visualization/DataGridPagination/DataGridPagination.tsx +111 -0
  15. package/dist/examples/data-visualization/DataGridTableView/DataGridTableView.tsx +282 -0
  16. package/dist/examples/data-visualization/DataGridToolbar/DataGridToolbar.tsx +283 -0
  17. package/dist/examples/data-visualization/DomainSwitcher/DomainSwitcher.tsx +41 -0
  18. package/dist/examples/data-visualization/ExpansionDrawer/ExpansionDrawer.tsx +139 -0
  19. package/dist/examples/data-visualization/MoreFiltersPopover/MoreFiltersPopover.tsx +230 -0
  20. package/dist/examples/data-visualization/ResultCount/ResultCount.tsx +33 -0
  21. package/dist/examples/data-visualization/cell-renderers.tsx +119 -0
  22. package/dist/examples/data-visualization/constants.ts +1251 -0
  23. package/dist/examples/data-visualization/hooks/use-data-grid-columns.ts +65 -0
  24. package/dist/examples/data-visualization/hooks/use-data-grid-expansion.ts +40 -0
  25. package/dist/examples/data-visualization/hooks/use-data-grid-favorites.ts +41 -0
  26. package/dist/examples/data-visualization/hooks/use-data-grid-filters.ts +61 -0
  27. package/dist/examples/data-visualization/hooks/use-data-grid-pagination.ts +32 -0
  28. package/dist/examples/data-visualization/hooks/use-data-grid-sort.ts +32 -0
  29. package/dist/examples/data-visualization/hooks/use-data-grid-state.ts +133 -0
  30. package/dist/examples/data-visualization/hooks/use-filtered-data.ts +84 -0
  31. package/dist/examples/data-visualization/index.ts +10 -0
  32. package/dist/examples/data-visualization/types.ts +103 -0
  33. package/dist/fastnd-components.js +18759 -15519
  34. package/package.json +1 -1
@@ -0,0 +1,1251 @@
1
+ import type { DomainConfig, ColumnConfig, DataRow } from './types'
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // PRODUCTS
5
+ // ---------------------------------------------------------------------------
6
+
7
+ export const PRODUCT_COLUMNS = {
8
+ product_category: {
9
+ label: 'Produktkategorie',
10
+ type: 'text',
11
+ sortable: true,
12
+ filterable: true,
13
+ primaryFilter: true,
14
+ visible: true,
15
+ searchable: true,
16
+ },
17
+ product_group: {
18
+ label: 'Produktgruppe',
19
+ type: 'text',
20
+ sortable: true,
21
+ filterable: true,
22
+ primaryFilter: true,
23
+ visible: true,
24
+ searchable: true,
25
+ },
26
+ part_number: {
27
+ label: 'Produkt',
28
+ type: 'double-text',
29
+ sortable: true,
30
+ filterable: false,
31
+ visible: true,
32
+ secondary: 'product_family_name',
33
+ searchable: true,
34
+ },
35
+ manufacturer_name: {
36
+ label: 'Hersteller',
37
+ type: 'link',
38
+ sortable: true,
39
+ filterable: true,
40
+ primaryFilter: false,
41
+ visible: true,
42
+ searchable: true,
43
+ },
44
+ description: {
45
+ label: 'Beschreibung',
46
+ type: 'text',
47
+ sortable: false,
48
+ filterable: false,
49
+ visible: true,
50
+ searchable: true,
51
+ rowLines: 3,
52
+ },
53
+ lifecycle: {
54
+ label: 'Status',
55
+ type: 'status-badge',
56
+ sortable: true,
57
+ filterable: true,
58
+ primaryFilter: true,
59
+ visible: true,
60
+ hideTablet: true,
61
+ statusMap: {
62
+ Active: 'active',
63
+ NRND: 'nrnd',
64
+ EOL: 'eol',
65
+ Production: 'production',
66
+ },
67
+ },
68
+ alternatives: {
69
+ label: 'Alternativen',
70
+ type: 'expand',
71
+ sortable: false,
72
+ filterable: false,
73
+ visible: true,
74
+ hideMobile: true,
75
+ expandLabel: 'Alternativen',
76
+ expandColumns: [
77
+ { key: 'alt_part_number', label: 'Teilenummer', bold: true },
78
+ { key: 'alt_manufacturer', label: 'Hersteller', muted: true },
79
+ { key: 'match_score', label: 'Übereinstimmung', type: 'score-bar' as const },
80
+ ],
81
+ expandTitleFn: (row: DataRow) => `Alternativen für ${row.part_number}`,
82
+ },
83
+ cross_sells: {
84
+ label: 'Cross-Sells',
85
+ type: 'expand',
86
+ sortable: false,
87
+ filterable: false,
88
+ visible: true,
89
+ hideMobile: true,
90
+ expandLabel: 'Empfehlungen',
91
+ expandColumns: [
92
+ { key: 'cross_sell_part_number', label: 'Teilenummer', bold: true },
93
+ { key: 'recommendation_score', label: 'Score', type: 'score-bar' as const },
94
+ { key: 'recommendation_source', label: 'Quelle', muted: true },
95
+ ],
96
+ expandTitleFn: (row: DataRow) => `Cross-Sell Empfehlungen für ${row.part_number}`,
97
+ },
98
+ price: {
99
+ label: 'Preis',
100
+ type: 'currency',
101
+ sortable: true,
102
+ filterable: false,
103
+ visible: false,
104
+ currencyField: 'currency',
105
+ },
106
+ lead_time: {
107
+ label: 'Lieferzeit',
108
+ type: 'text',
109
+ sortable: true,
110
+ filterable: false,
111
+ visible: false,
112
+ hideMobile: true,
113
+ },
114
+ inventory: {
115
+ label: 'Lagerbestand',
116
+ type: 'inventory',
117
+ sortable: true,
118
+ filterable: true,
119
+ primaryFilter: false,
120
+ visible: false,
121
+ hideMobile: true,
122
+ levelFn: (v: number) => (v > 10000 ? 'high' : v >= 1000 ? 'medium' : 'low'),
123
+ formatFn: (v: number) =>
124
+ v >= 1000 ? (v / 1000).toFixed(v >= 10000 ? 0 : 1) + 'k' : String(v),
125
+ labelMap: { high: 'Verfügbar', medium: 'Begrenzt', low: 'Knapp' },
126
+ filterOptions: ['Hoch (> 10.000)', 'Mittel (1.000–10.000)', 'Niedrig (< 1.000)'],
127
+ filterFn: (row: DataRow, selectedValue: string) => {
128
+ if (selectedValue.startsWith('Hoch')) return (row.inventory as number) > 10000
129
+ if (selectedValue.startsWith('Mittel'))
130
+ return (row.inventory as number) >= 1000 && (row.inventory as number) <= 10000
131
+ return (row.inventory as number) < 1000
132
+ },
133
+ },
134
+ } satisfies Record<string, ColumnConfig>
135
+
136
+ export const PRODUCT_LAYOUT = {
137
+ list: {
138
+ titleField: 'part_number',
139
+ metaFields: ['product_category', 'product_group', 'manufacturer_name'],
140
+ badgeFields: ['lifecycle'],
141
+ valueField: null,
142
+ expandField: 'alternatives',
143
+ },
144
+ card: {
145
+ titleField: 'part_number',
146
+ subtitleField: 'description',
147
+ badgeFields: ['lifecycle'],
148
+ rows: [
149
+ { label: 'Kategorie', field: 'product_category' },
150
+ { label: 'Gruppe', field: 'product_group' },
151
+ { label: 'Hersteller', field: 'manufacturer_name' },
152
+ ],
153
+ footerField: 'manufacturer_name',
154
+ expandField: 'alternatives',
155
+ },
156
+ }
157
+
158
+ export const MOCK_PRODUCTS = [
159
+ {
160
+ id: 'p1',
161
+ part_number: 'TPS54360B',
162
+ tenant_part_number: 'FN-DC-0012',
163
+ product_category: 'Halbleiter',
164
+ product_group: 'Spannungsregler',
165
+ product_family_name: 'DC-DC Converter',
166
+ manufacturer_name: 'Texas Instruments',
167
+ description: 'Abwärtswandler 4,5–60V, 3,5A, einstellbar',
168
+ price: 3.45,
169
+ currency: 'EUR',
170
+ inventory: 12500,
171
+ lead_time: '8 Wochen',
172
+ lifecycle: 'Active',
173
+ favorite: true,
174
+ alternatives: [
175
+ { alt_part_number: 'LM2596S-ADJ', alt_manufacturer: 'ON Semiconductor', match_score: 0.89 },
176
+ { alt_part_number: 'MP2315GJ', alt_manufacturer: 'MPS', match_score: 0.82 },
177
+ ],
178
+ cross_sells: [
179
+ { cross_sell_part_number: 'LM2596S', recommendation_score: 0.92, recommendation_source: 'AI Model' },
180
+ { cross_sell_part_number: 'ADP5054', recommendation_score: 0.85, recommendation_source: 'Manual' },
181
+ { cross_sell_part_number: 'MP2315', recommendation_score: 0.78, recommendation_source: 'AI Model' },
182
+ ],
183
+ },
184
+ {
185
+ id: 'p2',
186
+ part_number: 'LM2596S-5.0',
187
+ tenant_part_number: 'FN-DC-0034',
188
+ product_category: 'Halbleiter',
189
+ product_group: 'Spannungsregler',
190
+ product_family_name: 'Voltage Regulator',
191
+ manufacturer_name: 'ON Semiconductor',
192
+ description: 'Festspannungsregler 5V, 3A, TO-263',
193
+ price: 1.82,
194
+ currency: 'EUR',
195
+ inventory: 45200,
196
+ lead_time: '12 Wochen',
197
+ lifecycle: 'Active',
198
+ favorite: false,
199
+ alternatives: [
200
+ { alt_part_number: 'TPS54360B', alt_manufacturer: 'Texas Instruments', match_score: 0.91 },
201
+ ],
202
+ cross_sells: [
203
+ { cross_sell_part_number: 'TPS54360B', recommendation_score: 0.91, recommendation_source: 'AI Model' },
204
+ { cross_sell_part_number: 'LM317T', recommendation_score: 0.72, recommendation_source: 'Manual' },
205
+ ],
206
+ },
207
+ {
208
+ id: 'p3',
209
+ part_number: 'ADP5054ACPZ',
210
+ tenant_part_number: 'FN-PM-0087',
211
+ product_category: 'Halbleiter',
212
+ product_group: 'Power Management',
213
+ product_family_name: 'PMIC',
214
+ manufacturer_name: 'Analog Devices',
215
+ description: 'Quad-Kanal PMIC mit Sequencing, 48-LFCSP',
216
+ price: 8.9,
217
+ currency: 'EUR',
218
+ inventory: 3200,
219
+ lead_time: '16 Wochen',
220
+ lifecycle: 'Active',
221
+ favorite: false,
222
+ alternatives: [
223
+ { alt_part_number: 'TPS65263', alt_manufacturer: 'Texas Instruments', match_score: 0.85 },
224
+ { alt_part_number: 'MAX77714', alt_manufacturer: 'Maxim / ADI', match_score: 0.78 },
225
+ ],
226
+ cross_sells: [
227
+ { cross_sell_part_number: 'TPS65263', recommendation_score: 0.88, recommendation_source: 'AI Model' },
228
+ ],
229
+ },
230
+ {
231
+ id: 'p4',
232
+ part_number: 'STM32F407VGT6',
233
+ tenant_part_number: 'FN-MC-0201',
234
+ product_category: 'Halbleiter',
235
+ product_group: 'Mikrocontroller',
236
+ product_family_name: 'STM32F4',
237
+ manufacturer_name: 'STMicroelectronics',
238
+ description: 'ARM Cortex-M4, 168 MHz, 1 MB Flash, 192 KB RAM, LQFP-100',
239
+ price: 12.35,
240
+ currency: 'EUR',
241
+ inventory: 8700,
242
+ lead_time: '10 Wochen',
243
+ lifecycle: 'Active',
244
+ favorite: true,
245
+ alternatives: [
246
+ { alt_part_number: 'STM32F405RGT6', alt_manufacturer: 'STMicroelectronics', match_score: 0.95 },
247
+ { alt_part_number: 'MIMXRT1062DVJ6B', alt_manufacturer: 'NXP', match_score: 0.74 },
248
+ { alt_part_number: 'GD32F407VGT6', alt_manufacturer: 'GigaDevice', match_score: 0.88 },
249
+ ],
250
+ cross_sells: [
251
+ { cross_sell_part_number: 'STM32F407IGT6', recommendation_score: 0.94, recommendation_source: 'AI Model' },
252
+ { cross_sell_part_number: 'STLINK-V3SET', recommendation_score: 0.87, recommendation_source: 'Manual' },
253
+ { cross_sell_part_number: 'STM32F746NGH6', recommendation_score: 0.79, recommendation_source: 'AI Model' },
254
+ { cross_sell_part_number: 'NUCLEO-F407ZG', recommendation_score: 0.72, recommendation_source: 'Manual' },
255
+ ],
256
+ },
257
+ {
258
+ id: 'p5',
259
+ part_number: 'IRF540NPBF',
260
+ tenant_part_number: 'FN-TR-0045',
261
+ product_category: 'Halbleiter',
262
+ product_group: 'Transistoren',
263
+ product_family_name: 'N-Channel MOSFET',
264
+ manufacturer_name: 'Infineon',
265
+ description: 'N-Kanal MOSFET 100V, 33A, TO-220AB',
266
+ price: 0.95,
267
+ currency: 'EUR',
268
+ inventory: 67000,
269
+ lead_time: '4 Wochen',
270
+ lifecycle: 'Active',
271
+ favorite: false,
272
+ alternatives: [
273
+ { alt_part_number: 'STP36NF06L', alt_manufacturer: 'STMicroelectronics', match_score: 0.87 },
274
+ { alt_part_number: 'FDP8N60NZ', alt_manufacturer: 'Fairchild / ON Semi', match_score: 0.81 },
275
+ ],
276
+ cross_sells: [
277
+ { cross_sell_part_number: 'IR2110', recommendation_score: 0.83, recommendation_source: 'AI Model' },
278
+ { cross_sell_part_number: 'UCC27524', recommendation_score: 0.76, recommendation_source: 'Manual' },
279
+ ],
280
+ },
281
+ {
282
+ id: 'p6',
283
+ part_number: 'AD7124-8BCPZ',
284
+ tenant_part_number: 'FN-ADC-0033',
285
+ product_category: 'Halbleiter',
286
+ product_group: 'Datenerfassung',
287
+ product_family_name: 'Sigma-Delta ADC',
288
+ manufacturer_name: 'Analog Devices',
289
+ description: '8-Kanal 24-Bit Sigma-Delta ADC mit PGA, 32-LFCSP',
290
+ price: 15.6,
291
+ currency: 'EUR',
292
+ inventory: 1200,
293
+ lead_time: '20 Wochen',
294
+ lifecycle: 'NRND',
295
+ favorite: false,
296
+ alternatives: [
297
+ { alt_part_number: 'ADS1256IDBR', alt_manufacturer: 'Texas Instruments', match_score: 0.86 },
298
+ { alt_part_number: 'MCP3912A1T-E/SS', alt_manufacturer: 'Microchip', match_score: 0.79 },
299
+ ],
300
+ cross_sells: [
301
+ { cross_sell_part_number: 'AD8237ARMZ', recommendation_score: 0.81, recommendation_source: 'AI Model' },
302
+ ],
303
+ },
304
+ {
305
+ id: 'p7',
306
+ part_number: 'MAX232CPE+',
307
+ tenant_part_number: 'FN-IF-0011',
308
+ product_category: 'Halbleiter',
309
+ product_group: 'Interface',
310
+ product_family_name: 'RS-232 Transceiver',
311
+ manufacturer_name: 'Maxim / ADI',
312
+ description: 'Dual RS-232 Transceiver, 5V, DIP-16',
313
+ price: 2.1,
314
+ currency: 'EUR',
315
+ inventory: 320,
316
+ lead_time: '14 Wochen',
317
+ lifecycle: 'EOL',
318
+ favorite: false,
319
+ alternatives: [
320
+ { alt_part_number: 'SP3232EEN-L', alt_manufacturer: 'Exar / MaxLinear', match_score: 0.93 },
321
+ { alt_part_number: 'ST232ABDR', alt_manufacturer: 'STMicroelectronics', match_score: 0.89 },
322
+ ],
323
+ cross_sells: [
324
+ { cross_sell_part_number: 'SP3232EEN-L', recommendation_score: 0.93, recommendation_source: 'AI Model' },
325
+ { cross_sell_part_number: 'ICL3232CPZ', recommendation_score: 0.85, recommendation_source: 'Manual' },
326
+ ],
327
+ },
328
+ {
329
+ id: 'p8',
330
+ part_number: 'BQ25895RTWR',
331
+ tenant_part_number: 'FN-PM-0156',
332
+ product_category: 'Halbleiter',
333
+ product_group: 'Power Management',
334
+ product_family_name: 'Battery Charger',
335
+ manufacturer_name: 'Texas Instruments',
336
+ description: 'I²C gesteuertes Li-Ion Schnelllade-IC, 14V/5A, WQFN-24',
337
+ price: 4.75,
338
+ currency: 'EUR',
339
+ inventory: 5800,
340
+ lead_time: '6 Wochen',
341
+ lifecycle: 'Active',
342
+ favorite: false,
343
+ alternatives: [
344
+ { alt_part_number: 'MP2639A', alt_manufacturer: 'MPS', match_score: 0.84 },
345
+ { alt_part_number: 'ISL9238HRTZ', alt_manufacturer: 'Renesas', match_score: 0.77 },
346
+ ],
347
+ cross_sells: [
348
+ { cross_sell_part_number: 'BQ27441DRZR-G1B', recommendation_score: 0.88, recommendation_source: 'AI Model' },
349
+ ],
350
+ },
351
+ {
352
+ id: 'p9',
353
+ part_number: 'ATMEGA328P-AU',
354
+ tenant_part_number: 'FN-MC-0098',
355
+ product_category: 'Halbleiter',
356
+ product_group: 'Mikrocontroller',
357
+ product_family_name: 'megaAVR',
358
+ manufacturer_name: 'Microchip',
359
+ description: '8-Bit AVR MCU, 32 KB Flash, 2 KB SRAM, TQFP-32',
360
+ price: 2.45,
361
+ currency: 'EUR',
362
+ inventory: 18900,
363
+ lead_time: '8 Wochen',
364
+ lifecycle: 'Production',
365
+ favorite: false,
366
+ alternatives: [
367
+ { alt_part_number: 'ATTINY88-MU', alt_manufacturer: 'Microchip', match_score: 0.72 },
368
+ { alt_part_number: 'STM8S003F3P6', alt_manufacturer: 'STMicroelectronics', match_score: 0.68 },
369
+ ],
370
+ cross_sells: [
371
+ { cross_sell_part_number: 'ATMEGA2560-16AU', recommendation_score: 0.82, recommendation_source: 'AI Model' },
372
+ { cross_sell_part_number: 'MCP2200T-I/SS', recommendation_score: 0.71, recommendation_source: 'Manual' },
373
+ ],
374
+ },
375
+ {
376
+ id: 'p10',
377
+ part_number: 'SN74LVC1G14',
378
+ tenant_part_number: 'FN-LG-0007',
379
+ product_category: 'Halbleiter',
380
+ product_group: 'Logik-ICs',
381
+ product_family_name: 'Single Gate Logic',
382
+ manufacturer_name: 'Texas Instruments',
383
+ description: 'Einfach-Schmitt-Trigger-Inverter, 1,65–5,5V, SOT-23-5',
384
+ price: 0.28,
385
+ currency: 'EUR',
386
+ inventory: 142000,
387
+ lead_time: '2 Wochen',
388
+ lifecycle: 'Active',
389
+ favorite: false,
390
+ alternatives: [],
391
+ cross_sells: [],
392
+ },
393
+ {
394
+ id: 'p11',
395
+ part_number: 'NCV7356D1R2G',
396
+ tenant_part_number: 'FN-IF-0088',
397
+ product_category: 'Halbleiter',
398
+ product_group: 'Interface',
399
+ product_family_name: 'Single Wire CAN',
400
+ manufacturer_name: 'ON Semiconductor',
401
+ description: 'Single-Wire CAN Transceiver, 3,3V/5V, SO-8',
402
+ price: 1.55,
403
+ currency: 'EUR',
404
+ inventory: 7400,
405
+ lead_time: '6 Wochen',
406
+ lifecycle: 'Active',
407
+ favorite: false,
408
+ alternatives: [
409
+ { alt_part_number: 'TJA1021T', alt_manufacturer: 'NXP', match_score: 0.91 },
410
+ ],
411
+ cross_sells: [
412
+ { cross_sell_part_number: 'TJA1021T', recommendation_score: 0.9, recommendation_source: 'AI Model' },
413
+ ],
414
+ },
415
+ {
416
+ id: 'p12',
417
+ part_number: 'OPA2340UA',
418
+ tenant_part_number: 'FN-AMP-0023',
419
+ product_category: 'Halbleiter',
420
+ product_group: 'Verstärker',
421
+ product_family_name: 'Rail-to-Rail Op-Amp',
422
+ manufacturer_name: 'Texas Instruments',
423
+ description: 'Dual Rail-to-Rail Op-Amp, 5,5 MHz, 2,5–5,5V, SO-8',
424
+ price: 1.9,
425
+ currency: 'EUR',
426
+ inventory: 95,
427
+ lead_time: '18 Wochen',
428
+ lifecycle: 'NRND',
429
+ favorite: false,
430
+ alternatives: [
431
+ { alt_part_number: 'MCP6002T-I/SN', alt_manufacturer: 'Microchip', match_score: 0.88 },
432
+ { alt_part_number: 'LMV358IDGKR', alt_manufacturer: 'Texas Instruments', match_score: 0.83 },
433
+ ],
434
+ cross_sells: [
435
+ { cross_sell_part_number: 'OPA2344UA', recommendation_score: 0.9, recommendation_source: 'AI Model' },
436
+ { cross_sell_part_number: 'MCP6002T-I/SN', recommendation_score: 0.85, recommendation_source: 'AI Model' },
437
+ ],
438
+ },
439
+ {
440
+ id: 'p13',
441
+ part_number: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB',
442
+ tenant_part_number: 'FN-MC-0312',
443
+ product_category: 'Halbleiter',
444
+ product_group: 'Mikrocontroller',
445
+ product_family_name: 'XMC4000',
446
+ manufacturer_name: 'Infineon',
447
+ description: 'ARM Cortex-M4, 144 MHz, 2 MB Flash, EtherCAT, LQFP-144',
448
+ price: 24875.99,
449
+ currency: 'EUR',
450
+ inventory: 4,
451
+ lead_time: '52 Wochen',
452
+ lifecycle: 'NRND',
453
+ favorite: false,
454
+ alternatives: [
455
+ { alt_part_number: 'XMC4700-F144K2048-AA', alt_manufacturer: 'Infineon', match_score: 0.97 },
456
+ { alt_part_number: 'STM32H743ZIT6', alt_manufacturer: 'STMicroelectronics', match_score: 0.81 },
457
+ { alt_part_number: 'MIMXRT1064DVL6B', alt_manufacturer: 'NXP', match_score: 0.76 },
458
+ { alt_part_number: 'TMS570LS3137ZWT', alt_manufacturer: 'Texas Instruments', match_score: 0.71 },
459
+ { alt_part_number: 'R7FA6M5BH3CFP', alt_manufacturer: 'Renesas', match_score: 0.68 },
460
+ ],
461
+ cross_sells: [
462
+ { cross_sell_part_number: 'XMC4700-F144K2048-AA', recommendation_score: 0.97, recommendation_source: 'AI Model' },
463
+ { cross_sell_part_number: 'XMC4500-F144K1024-AA', recommendation_score: 0.88, recommendation_source: 'Manual' },
464
+ { cross_sell_part_number: 'DAS-KIT-XMC48', recommendation_score: 0.79, recommendation_source: 'Manual' },
465
+ ],
466
+ },
467
+ ] satisfies DataRow[]
468
+
469
+ // ---------------------------------------------------------------------------
470
+ // PROJECTS
471
+ // ---------------------------------------------------------------------------
472
+
473
+ export const PROJECT_COLUMNS = {
474
+ favorite: {
475
+ label: 'Favorit',
476
+ type: 'favorite',
477
+ sortable: false,
478
+ filterable: false,
479
+ visible: true,
480
+ },
481
+ name: {
482
+ label: 'Projektname',
483
+ type: 'double-text',
484
+ sortable: true,
485
+ filterable: false,
486
+ visible: true,
487
+ secondary: 'customer_name',
488
+ searchable: true,
489
+ },
490
+ customer_name: {
491
+ label: 'Kunde',
492
+ type: 'link',
493
+ sortable: true,
494
+ filterable: true,
495
+ primaryFilter: true,
496
+ visible: true,
497
+ searchable: true,
498
+ },
499
+ status: {
500
+ label: 'Status',
501
+ type: 'status-badge',
502
+ sortable: true,
503
+ filterable: true,
504
+ primaryFilter: true,
505
+ visible: true,
506
+ hideTablet: true,
507
+ statusMap: {
508
+ Open: 'active',
509
+ Won: 'production',
510
+ Lost: 'eol',
511
+ Negotiation: 'nrnd',
512
+ Qualified: 'active',
513
+ },
514
+ },
515
+ expected_closing: {
516
+ label: 'Closing',
517
+ type: 'text',
518
+ sortable: true,
519
+ filterable: false,
520
+ visible: true,
521
+ hideMobile: true,
522
+ },
523
+ project_lifetime_quantity: {
524
+ label: 'Lifetime Qty',
525
+ type: 'inventory',
526
+ sortable: true,
527
+ filterable: true,
528
+ primaryFilter: true,
529
+ visible: true,
530
+ hideMobile: true,
531
+ levelFn: (v: number) => (v >= 100000 ? 'high' : v >= 10000 ? 'medium' : 'low'),
532
+ formatFn: (v: number) =>
533
+ v >= 1000 ? (v / 1000).toFixed(v >= 100000 ? 0 : 1) + 'k' : String(v),
534
+ labelMap: { high: 'Hoch', medium: 'Mittel', low: 'Gering' },
535
+ filterOptions: ['Hoch (≥ 100k)', 'Mittel (10k–100k)', 'Gering (< 10k)'],
536
+ filterFn: (row: DataRow, selectedValue: string) => {
537
+ if (selectedValue.startsWith('Hoch'))
538
+ return (row.project_lifetime_quantity as number) >= 100000
539
+ if (selectedValue.startsWith('Mittel'))
540
+ return (
541
+ (row.project_lifetime_quantity as number) >= 10000 &&
542
+ (row.project_lifetime_quantity as number) < 100000
543
+ )
544
+ return (row.project_lifetime_quantity as number) < 10000
545
+ },
546
+ },
547
+ opportunities: {
548
+ label: 'Opportunities',
549
+ type: 'expand',
550
+ sortable: false,
551
+ filterable: false,
552
+ visible: true,
553
+ hideMobile: true,
554
+ expandLabel: 'Opportunities',
555
+ expandColumns: [
556
+ { key: 'product_name', label: 'Produkt', bold: true },
557
+ { key: 'status', label: 'Status', muted: true },
558
+ { key: 'creation_date', label: 'Erstellt' },
559
+ ],
560
+ expandTitleFn: (row: DataRow) => `Opportunities für ${row.name}`,
561
+ },
562
+ } satisfies Record<string, ColumnConfig>
563
+
564
+ export const PROJECT_LAYOUT = {
565
+ list: {
566
+ titleField: 'name',
567
+ metaFields: ['customer_name', 'expected_closing'],
568
+ badgeFields: ['status', 'project_lifetime_quantity'],
569
+ valueField: null,
570
+ expandField: 'opportunities',
571
+ },
572
+ card: {
573
+ titleField: 'name',
574
+ subtitleField: 'customer_name',
575
+ badgeFields: ['status'],
576
+ rows: [
577
+ { label: 'Closing', field: 'expected_closing' },
578
+ { label: 'Lifetime Qty', field: 'project_lifetime_quantity', rendererOverride: 'inventory-label' as const },
579
+ ],
580
+ footerField: 'customer_name',
581
+ expandField: 'opportunities',
582
+ },
583
+ }
584
+
585
+ export const MOCK_PROJECTS = [
586
+ {
587
+ id: 'pj1',
588
+ name: 'ADAS Kameramodul Gen3',
589
+ customer_name: 'Continental AG',
590
+ status: 'Open',
591
+ expected_closing: '2025-09-30',
592
+ project_lifetime_quantity: 250000,
593
+ favorite: true,
594
+ opportunities: [
595
+ { product_name: 'TPS54360B', status: 'Open', creation_date: '2024-11-15' },
596
+ { product_name: 'STM32F407VGT6', status: 'Qualified', creation_date: '2024-12-01' },
597
+ ],
598
+ },
599
+ {
600
+ id: 'pj2',
601
+ name: 'EV Ladesteuerung 22kW',
602
+ customer_name: 'Webasto SE',
603
+ status: 'Won',
604
+ expected_closing: '2025-03-15',
605
+ project_lifetime_quantity: 80000,
606
+ favorite: false,
607
+ opportunities: [
608
+ { product_name: 'BQ25895RTWR', status: 'Won', creation_date: '2024-08-20' },
609
+ { product_name: 'IRF540NPBF', status: 'Won', creation_date: '2024-09-05' },
610
+ { product_name: 'ADP5054ACPZ', status: 'Won', creation_date: '2024-09-05' },
611
+ ],
612
+ },
613
+ {
614
+ id: 'pj3',
615
+ name: 'Industrie-Gateway IoT',
616
+ customer_name: 'Siemens AG',
617
+ status: 'Negotiation',
618
+ expected_closing: '2025-12-01',
619
+ project_lifetime_quantity: 15000,
620
+ favorite: false,
621
+ opportunities: [
622
+ { product_name: 'STM32F407VGT6', status: 'Negotiation', creation_date: '2025-01-10' },
623
+ { product_name: 'NCV7356D1R2G', status: 'Open', creation_date: '2025-01-18' },
624
+ ],
625
+ },
626
+ {
627
+ id: 'pj4',
628
+ name: 'Patientenmonitor V5',
629
+ customer_name: 'Dräger AG',
630
+ status: 'Qualified',
631
+ expected_closing: '2026-02-28',
632
+ project_lifetime_quantity: 5000,
633
+ favorite: true,
634
+ opportunities: [
635
+ { product_name: 'AD7124-8BCPZ', status: 'Qualified', creation_date: '2025-02-03' },
636
+ { product_name: 'OPA2340UA', status: 'Open', creation_date: '2025-02-10' },
637
+ ],
638
+ },
639
+ {
640
+ id: 'pj5',
641
+ name: 'Smart Meter Modul',
642
+ customer_name: 'Landis+Gyr AG',
643
+ status: 'Open',
644
+ expected_closing: '2025-11-15',
645
+ project_lifetime_quantity: 500000,
646
+ favorite: false,
647
+ opportunities: [
648
+ { product_name: 'ATMEGA328P-AU', status: 'Open', creation_date: '2025-03-01' },
649
+ ],
650
+ },
651
+ {
652
+ id: 'pj6',
653
+ name: 'Robotersteuerung R200',
654
+ customer_name: 'KUKA AG',
655
+ status: 'Won',
656
+ expected_closing: '2025-01-20',
657
+ project_lifetime_quantity: 12000,
658
+ favorite: false,
659
+ opportunities: [
660
+ { product_name: 'STM32F407VGT6', status: 'Won', creation_date: '2024-07-14' },
661
+ { product_name: 'IRF540NPBF', status: 'Won', creation_date: '2024-07-14' },
662
+ ],
663
+ },
664
+ {
665
+ id: 'pj7',
666
+ name: 'BMS 48V Mild-Hybrid',
667
+ customer_name: 'ZF Friedrichshafen AG',
668
+ status: 'Lost',
669
+ expected_closing: '2025-06-30',
670
+ project_lifetime_quantity: 180000,
671
+ favorite: false,
672
+ opportunities: [
673
+ { product_name: 'BQ25895RTWR', status: 'Lost', creation_date: '2024-10-22' },
674
+ ],
675
+ },
676
+ {
677
+ id: 'pj8',
678
+ name: 'Sensorknoten Agrar',
679
+ customer_name: 'CLAAS KGaA',
680
+ status: 'Open',
681
+ expected_closing: '2026-03-31',
682
+ project_lifetime_quantity: 8000,
683
+ favorite: false,
684
+ opportunities: [
685
+ { product_name: 'ATMEGA328P-AU', status: 'Open', creation_date: '2025-01-28' },
686
+ { product_name: 'SN74LVC1G14', status: 'Open', creation_date: '2025-02-05' },
687
+ ],
688
+ },
689
+ {
690
+ id: 'pj9',
691
+ name: 'Radar-Frontend 77GHz',
692
+ customer_name: 'Continental AG',
693
+ status: 'Negotiation',
694
+ expected_closing: '2025-10-15',
695
+ project_lifetime_quantity: 320000,
696
+ favorite: true,
697
+ opportunities: [
698
+ { product_name: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB', status: 'Negotiation', creation_date: '2024-12-10' },
699
+ { product_name: 'ADP5054ACPZ', status: 'Open', creation_date: '2024-12-10' },
700
+ { product_name: 'AD7124-8BCPZ', status: 'Qualified', creation_date: '2025-01-07' },
701
+ ],
702
+ },
703
+ {
704
+ id: 'pj10',
705
+ name: 'Wallbox Premium 11kW',
706
+ customer_name: 'Webasto SE',
707
+ status: 'Qualified',
708
+ expected_closing: '2025-08-30',
709
+ project_lifetime_quantity: 45000,
710
+ favorite: false,
711
+ opportunities: [
712
+ { product_name: 'IRF540NPBF', status: 'Qualified', creation_date: '2025-02-20' },
713
+ ],
714
+ },
715
+ {
716
+ id: 'pj11',
717
+ name: 'Autonomes Fahrzeug-Plattform Generation 4',
718
+ customer_name: 'BMW Group',
719
+ status: 'Negotiation',
720
+ expected_closing: '2027-06-30',
721
+ project_lifetime_quantity: 1750000,
722
+ favorite: false,
723
+ opportunities: [
724
+ { product_name: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB', status: 'Negotiation', creation_date: '2025-03-01' },
725
+ { product_name: 'STM32F407VGT6', status: 'Open', creation_date: '2025-03-01' },
726
+ { product_name: 'TPS54360B', status: 'Open', creation_date: '2025-03-05' },
727
+ { product_name: 'ADP5054ACPZ', status: 'Open', creation_date: '2025-03-05' },
728
+ ],
729
+ },
730
+ ] satisfies DataRow[]
731
+
732
+ // ---------------------------------------------------------------------------
733
+ // CUSTOMERS
734
+ // ---------------------------------------------------------------------------
735
+
736
+ export const CUSTOMER_COLUMNS = {
737
+ favorite: {
738
+ label: 'Favorit',
739
+ type: 'favorite',
740
+ sortable: false,
741
+ filterable: false,
742
+ visible: true,
743
+ },
744
+ name: {
745
+ label: 'Kunde',
746
+ type: 'double-text',
747
+ sortable: true,
748
+ filterable: false,
749
+ visible: true,
750
+ secondary: 'main_customer',
751
+ searchable: true,
752
+ },
753
+ category: {
754
+ label: 'Kategorie',
755
+ type: 'text',
756
+ sortable: true,
757
+ filterable: true,
758
+ primaryFilter: true,
759
+ visible: true,
760
+ searchable: true,
761
+ },
762
+ region: {
763
+ label: 'Region',
764
+ type: 'text',
765
+ sortable: true,
766
+ filterable: true,
767
+ primaryFilter: true,
768
+ visible: true,
769
+ hideTablet: true,
770
+ },
771
+ country_code: {
772
+ label: 'Land',
773
+ type: 'text',
774
+ sortable: true,
775
+ filterable: true,
776
+ primaryFilter: false,
777
+ visible: true,
778
+ hideMobile: true,
779
+ },
780
+ city: {
781
+ label: 'Stadt',
782
+ type: 'text',
783
+ sortable: true,
784
+ filterable: false,
785
+ visible: true,
786
+ hideMobile: true,
787
+ searchable: true,
788
+ },
789
+ url: {
790
+ label: 'Website',
791
+ type: 'link',
792
+ sortable: false,
793
+ filterable: false,
794
+ visible: true,
795
+ hideMobile: true,
796
+ },
797
+ active_projects: {
798
+ label: 'Projekte',
799
+ type: 'expand',
800
+ sortable: false,
801
+ filterable: false,
802
+ visible: true,
803
+ hideMobile: true,
804
+ expandLabel: 'Projekte',
805
+ expandColumns: [
806
+ { key: 'project_name', label: 'Projekt', bold: true },
807
+ { key: 'status', label: 'Status', muted: true },
808
+ { key: 'expected_closing', label: 'Closing' },
809
+ ],
810
+ expandTitleFn: (row: DataRow) => `Aktive Projekte von ${row.name}`,
811
+ },
812
+ } satisfies Record<string, ColumnConfig>
813
+
814
+ export const CUSTOMER_LAYOUT = {
815
+ list: {
816
+ titleField: 'name',
817
+ metaFields: ['main_customer', 'category', 'city'],
818
+ badgeFields: [],
819
+ valueField: null,
820
+ expandField: 'active_projects',
821
+ },
822
+ card: {
823
+ titleField: 'name',
824
+ subtitleField: 'main_customer',
825
+ badgeFields: [],
826
+ rows: [
827
+ { label: 'Kategorie', field: 'category' },
828
+ { label: 'Region', field: 'region' },
829
+ { label: 'Stadt', field: 'city' },
830
+ ],
831
+ footerField: 'url',
832
+ expandField: 'active_projects',
833
+ },
834
+ }
835
+
836
+ export const MOCK_CUSTOMERS = [
837
+ {
838
+ id: 'c1',
839
+ name: 'Continental AG',
840
+ main_customer: 'Continental Gruppe',
841
+ category: 'Automotive',
842
+ region: 'EMEA',
843
+ country_code: 'DE',
844
+ city: 'Hannover',
845
+ url: 'continental.com',
846
+ favorite: true,
847
+ active_projects: [
848
+ { project_name: 'ADAS Kameramodul Gen3', status: 'Open', expected_closing: '2025-09-30' },
849
+ { project_name: 'Radar-Frontend 77GHz', status: 'Negotiation', expected_closing: '2025-10-15' },
850
+ ],
851
+ },
852
+ {
853
+ id: 'c2',
854
+ name: 'Webasto SE',
855
+ main_customer: 'Webasto Gruppe',
856
+ category: 'Automotive',
857
+ region: 'EMEA',
858
+ country_code: 'DE',
859
+ city: 'Stockdorf',
860
+ url: 'webasto.com',
861
+ favorite: false,
862
+ active_projects: [
863
+ { project_name: 'EV Ladesteuerung 22kW', status: 'Won', expected_closing: '2025-03-15' },
864
+ { project_name: 'Wallbox Premium 11kW', status: 'Qualified', expected_closing: '2025-08-30' },
865
+ ],
866
+ },
867
+ {
868
+ id: 'c3',
869
+ name: 'Siemens AG',
870
+ main_customer: 'Siemens Konzern',
871
+ category: 'Industrial',
872
+ region: 'EMEA',
873
+ country_code: 'DE',
874
+ city: 'München',
875
+ url: 'siemens.com',
876
+ favorite: true,
877
+ active_projects: [
878
+ { project_name: 'Industrie-Gateway IoT', status: 'Negotiation', expected_closing: '2025-12-01' },
879
+ ],
880
+ },
881
+ {
882
+ id: 'c4',
883
+ name: 'Dräger AG',
884
+ main_customer: 'Drägerwerk',
885
+ category: 'Medical',
886
+ region: 'EMEA',
887
+ country_code: 'DE',
888
+ city: 'Lübeck',
889
+ url: 'draeger.com',
890
+ favorite: false,
891
+ active_projects: [
892
+ { project_name: 'Patientenmonitor V5', status: 'Qualified', expected_closing: '2026-02-28' },
893
+ ],
894
+ },
895
+ {
896
+ id: 'c5',
897
+ name: 'Landis+Gyr AG',
898
+ main_customer: 'Landis+Gyr Group',
899
+ category: 'Energy',
900
+ region: 'EMEA',
901
+ country_code: 'CH',
902
+ city: 'Zug',
903
+ url: 'landisgyr.com',
904
+ favorite: false,
905
+ active_projects: [
906
+ { project_name: 'Smart Meter Modul', status: 'Open', expected_closing: '2025-11-15' },
907
+ ],
908
+ },
909
+ {
910
+ id: 'c6',
911
+ name: 'KUKA AG',
912
+ main_customer: 'KUKA Gruppe',
913
+ category: 'Industrial',
914
+ region: 'EMEA',
915
+ country_code: 'DE',
916
+ city: 'Augsburg',
917
+ url: 'kuka.com',
918
+ favorite: false,
919
+ active_projects: [
920
+ { project_name: 'Robotersteuerung R200', status: 'Won', expected_closing: '2025-01-20' },
921
+ ],
922
+ },
923
+ {
924
+ id: 'c7',
925
+ name: 'ZF Friedrichshafen AG',
926
+ main_customer: 'ZF Group',
927
+ category: 'Automotive',
928
+ region: 'EMEA',
929
+ country_code: 'DE',
930
+ city: 'Friedrichshafen',
931
+ url: 'zf.com',
932
+ favorite: false,
933
+ active_projects: [
934
+ { project_name: 'BMS 48V Mild-Hybrid', status: 'Lost', expected_closing: '2025-06-30' },
935
+ ],
936
+ },
937
+ {
938
+ id: 'c8',
939
+ name: 'CLAAS KGaA',
940
+ main_customer: 'CLAAS Gruppe',
941
+ category: 'Agriculture',
942
+ region: 'EMEA',
943
+ country_code: 'DE',
944
+ city: 'Harsewinkel',
945
+ url: 'claas.com',
946
+ favorite: false,
947
+ active_projects: [
948
+ { project_name: 'Sensorknoten Agrar', status: 'Open', expected_closing: '2026-03-31' },
949
+ ],
950
+ },
951
+ {
952
+ id: 'c9',
953
+ name: 'Bosch Sensortec',
954
+ main_customer: 'Robert Bosch GmbH',
955
+ category: 'Automotive',
956
+ region: 'EMEA',
957
+ country_code: 'DE',
958
+ city: 'Reutlingen',
959
+ url: 'bosch-sensortec.com',
960
+ favorite: true,
961
+ active_projects: [],
962
+ },
963
+ {
964
+ id: 'c10',
965
+ name: 'Schneider Electric',
966
+ main_customer: 'Schneider Electric SE',
967
+ category: 'Energy',
968
+ region: 'EMEA',
969
+ country_code: 'FR',
970
+ city: 'Rueil-Malmaison',
971
+ url: 'se.com',
972
+ favorite: false,
973
+ active_projects: [],
974
+ },
975
+ {
976
+ id: 'c11',
977
+ name: 'BMW Group',
978
+ main_customer: 'Automotive OEM',
979
+ category: 'Automotive',
980
+ region: 'EMEA/APAC/NAFTA',
981
+ country_code: 'DE',
982
+ city: 'München',
983
+ url: 'bmwgroup.com',
984
+ favorite: false,
985
+ active_projects: [
986
+ { project_name: 'Autonomes Fahrzeug-Plattform Generation 4', status: 'Negotiation', expected_closing: '2027-06-30' },
987
+ { project_name: 'ADAS Kameramodul Gen3', status: 'Open', expected_closing: '2025-09-30' },
988
+ ],
989
+ },
990
+ ] satisfies DataRow[]
991
+
992
+ // ---------------------------------------------------------------------------
993
+ // APPLICATIONS
994
+ // ---------------------------------------------------------------------------
995
+
996
+ export const APPLICATION_COLUMNS = {
997
+ favorite: {
998
+ label: 'Favorit',
999
+ type: 'favorite',
1000
+ sortable: false,
1001
+ filterable: false,
1002
+ visible: true,
1003
+ },
1004
+ name: {
1005
+ label: 'Applikation',
1006
+ type: 'double-text',
1007
+ sortable: true,
1008
+ filterable: false,
1009
+ visible: true,
1010
+ secondary: 'description',
1011
+ searchable: true,
1012
+ },
1013
+ url: {
1014
+ label: 'Referenz',
1015
+ type: 'link',
1016
+ sortable: false,
1017
+ filterable: false,
1018
+ visible: true,
1019
+ hideMobile: true,
1020
+ },
1021
+ trends: {
1022
+ label: 'Trend',
1023
+ type: 'text',
1024
+ sortable: true,
1025
+ filterable: true,
1026
+ primaryFilter: true,
1027
+ visible: true,
1028
+ hideTablet: true,
1029
+ searchable: true,
1030
+ },
1031
+ recommended_products: {
1032
+ label: 'Produkte',
1033
+ type: 'expand',
1034
+ sortable: false,
1035
+ filterable: false,
1036
+ visible: true,
1037
+ hideMobile: true,
1038
+ expandLabel: 'Produkte',
1039
+ expandColumns: [
1040
+ { key: 'product_name', label: 'Produkt', bold: true },
1041
+ { key: 'top_seller', label: 'Top Seller' },
1042
+ { key: 'top_pick', label: 'Top Pick' },
1043
+ { key: 'recommendation_score', label: 'Score', type: 'score-bar' as const },
1044
+ ],
1045
+ expandTitleFn: (row: DataRow) => `Empfohlene Produkte für ${row.name}`,
1046
+ },
1047
+ } satisfies Record<string, ColumnConfig>
1048
+
1049
+ export const APPLICATION_LAYOUT = {
1050
+ list: {
1051
+ titleField: 'name',
1052
+ metaFields: ['description', 'trends'],
1053
+ badgeFields: [],
1054
+ valueField: null,
1055
+ expandField: 'recommended_products',
1056
+ },
1057
+ card: {
1058
+ titleField: 'name',
1059
+ subtitleField: 'description',
1060
+ badgeFields: [],
1061
+ rows: [
1062
+ { label: 'Trend', field: 'trends' },
1063
+ { label: 'Referenz', field: 'url' },
1064
+ ],
1065
+ footerField: 'trends',
1066
+ expandField: 'recommended_products',
1067
+ },
1068
+ }
1069
+
1070
+ export const MOCK_APPLICATIONS = [
1071
+ {
1072
+ id: 'a1',
1073
+ name: 'ADAS Kameramodul',
1074
+ description: 'Kamerabasiertes Fahrerassistenzsystem für Level 2/3 Autonomie',
1075
+ url: 'https://www.continentalautomotive.com/adas',
1076
+ trends: 'Autonomous Driving',
1077
+ favorite: true,
1078
+ recommended_products: [
1079
+ { product_name: 'STM32F407VGT6', top_seller: true, top_pick: false, recommendation_score: 0.94 },
1080
+ { product_name: 'TPS54360B', top_seller: false, top_pick: true, recommendation_score: 0.87 },
1081
+ { product_name: 'AD7124-8BCPZ', top_seller: false, top_pick: false, recommendation_score: 0.76 },
1082
+ ],
1083
+ },
1084
+ {
1085
+ id: 'a2',
1086
+ name: 'EV Battery Management',
1087
+ description: 'Batteriemanagement für Hochvolt-Elektrofahrzeuge (BEV/PHEV)',
1088
+ url: 'https://www.webasto.com/ev-solutions',
1089
+ trends: 'Electromobility',
1090
+ favorite: true,
1091
+ recommended_products: [
1092
+ { product_name: 'BQ25895RTWR', top_seller: true, top_pick: true, recommendation_score: 0.96 },
1093
+ { product_name: 'ADP5054ACPZ', top_seller: false, top_pick: true, recommendation_score: 0.88 },
1094
+ { product_name: 'IRF540NPBF', top_seller: true, top_pick: false, recommendation_score: 0.81 },
1095
+ ],
1096
+ },
1097
+ {
1098
+ id: 'a3',
1099
+ name: 'Smart Meter Gateway',
1100
+ description: 'Kommunikations-Gateway für intelligente Energiezähler (MUC)',
1101
+ url: 'https://www.landisgyr.com/smart-grid',
1102
+ trends: 'Smart Grid',
1103
+ favorite: false,
1104
+ recommended_products: [
1105
+ { product_name: 'ATMEGA328P-AU', top_seller: false, top_pick: true, recommendation_score: 0.83 },
1106
+ { product_name: 'NCV7356D1R2G', top_seller: false, top_pick: false, recommendation_score: 0.71 },
1107
+ ],
1108
+ },
1109
+ {
1110
+ id: 'a4',
1111
+ name: 'Industrie-PLC Compact',
1112
+ description: 'Kompakte speicherprogrammierbare Steuerung für Maschinen und Anlagen',
1113
+ url: 'https://www.siemens.com/plc',
1114
+ trends: 'Industry 4.0',
1115
+ favorite: false,
1116
+ recommended_products: [
1117
+ { product_name: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB', top_seller: false, top_pick: true, recommendation_score: 0.91 },
1118
+ { product_name: 'STM32F407VGT6', top_seller: true, top_pick: false, recommendation_score: 0.85 },
1119
+ { product_name: 'SN74LVC1G14', top_seller: false, top_pick: false, recommendation_score: 0.68 },
1120
+ ],
1121
+ },
1122
+ {
1123
+ id: 'a5',
1124
+ name: 'Wearable Vitalsensor',
1125
+ description: 'Tragbarer Biosensor für kontinuierliche Patientenüberwachung',
1126
+ url: 'https://www.draeger.com/digital-health',
1127
+ trends: 'Digital Health',
1128
+ favorite: false,
1129
+ recommended_products: [
1130
+ { product_name: 'AD7124-8BCPZ', top_seller: false, top_pick: true, recommendation_score: 0.89 },
1131
+ { product_name: 'OPA2340UA', top_seller: false, top_pick: false, recommendation_score: 0.77 },
1132
+ ],
1133
+ },
1134
+ {
1135
+ id: 'a6',
1136
+ name: 'Wallbox AC/DC',
1137
+ description: 'Bidirektionale Ladestation für Elektrofahrzeuge mit V2G-Unterstützung',
1138
+ url: 'https://www.webasto.com/wallbox',
1139
+ trends: 'Electromobility',
1140
+ favorite: false,
1141
+ recommended_products: [
1142
+ { product_name: 'IRF540NPBF', top_seller: true, top_pick: false, recommendation_score: 0.93 },
1143
+ { product_name: 'BQ25895RTWR', top_seller: false, top_pick: true, recommendation_score: 0.86 },
1144
+ { product_name: 'TPS54360B', top_seller: false, top_pick: false, recommendation_score: 0.79 },
1145
+ ],
1146
+ },
1147
+ {
1148
+ id: 'a7',
1149
+ name: 'CAN-FD Sternkoppler',
1150
+ description: 'Aktiver CAN-FD Sternkoppler für Fahrzeugbusnetzwerke',
1151
+ url: 'https://www.nxp.com/can',
1152
+ trends: 'Autonomous Driving',
1153
+ favorite: false,
1154
+ recommended_products: [
1155
+ { product_name: 'NCV7356D1R2G', top_seller: true, top_pick: true, recommendation_score: 0.95 },
1156
+ { product_name: 'SN74LVC1G14', top_seller: false, top_pick: false, recommendation_score: 0.72 },
1157
+ ],
1158
+ },
1159
+ {
1160
+ id: 'a8',
1161
+ name: 'Precision Agriculture Node',
1162
+ description: 'IoT-Feldknoten für Bodenfeuchte-, GPS- und Wetterdatenerfassung',
1163
+ url: 'https://www.claas.com/precision-farming',
1164
+ trends: 'Smart Agriculture',
1165
+ favorite: false,
1166
+ recommended_products: [
1167
+ { product_name: 'ATMEGA328P-AU', top_seller: true, top_pick: false, recommendation_score: 0.88 },
1168
+ { product_name: 'AD7124-8BCPZ', top_seller: false, top_pick: true, recommendation_score: 0.82 },
1169
+ { product_name: 'SN74LVC1G14', top_seller: false, top_pick: false, recommendation_score: 0.65 },
1170
+ ],
1171
+ },
1172
+ {
1173
+ id: 'a9',
1174
+ name: 'Roboter-Motorcontroller',
1175
+ description: 'Mehrachsiger Servo- und Schrittmotorregler für kollaborative Roboter',
1176
+ url: 'https://www.kuka.com/cobots',
1177
+ trends: 'Industry 4.0',
1178
+ favorite: true,
1179
+ recommended_products: [
1180
+ { product_name: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB', top_seller: false, top_pick: true, recommendation_score: 0.92 },
1181
+ { product_name: 'IRF540NPBF', top_seller: true, top_pick: false, recommendation_score: 0.84 },
1182
+ ],
1183
+ },
1184
+ {
1185
+ id: 'a10',
1186
+ name: 'RS232-Legacy-Bridge',
1187
+ description: 'Protokollbrücke von RS-232 auf moderne Feldbusse (Modbus RTU/TCP)',
1188
+ url: 'https://www.siemens.com/legacy-automation',
1189
+ trends: 'Industry 4.0',
1190
+ favorite: false,
1191
+ recommended_products: [
1192
+ { product_name: 'MAX232CPE+', top_seller: false, top_pick: true, recommendation_score: 0.91 },
1193
+ ],
1194
+ },
1195
+ {
1196
+ id: 'a11',
1197
+ name: 'Hochvolt-Batteriemanagement',
1198
+ description: 'Funktionssicheres BMS nach ISO 26262 ASIL-D für Hochvolt-Traktionsbatterien in BEV und FCEV-Plattformen',
1199
+ url: 'https://www.zf.com/hv-bms',
1200
+ trends: 'Electromobility/Safety',
1201
+ favorite: false,
1202
+ recommended_products: [
1203
+ { product_name: 'BQ25895RTWR', top_seller: true, top_pick: true, recommendation_score: 0.97 },
1204
+ { product_name: 'ADP5054ACPZ', top_seller: false, top_pick: true, recommendation_score: 0.91 },
1205
+ { product_name: 'IRF540NPBF', top_seller: true, top_pick: false, recommendation_score: 0.86 },
1206
+ { product_name: 'STM32F407VGT6', top_seller: false, top_pick: false, recommendation_score: 0.79 },
1207
+ { product_name: 'XMC4800-F144K2048-AA-LONGVARIANT-REVB', top_seller: false, top_pick: true, recommendation_score: 0.74 },
1208
+ ],
1209
+ },
1210
+ ] satisfies DataRow[]
1211
+
1212
+ // ---------------------------------------------------------------------------
1213
+ // DATA SOURCE REGISTRY
1214
+ // ---------------------------------------------------------------------------
1215
+
1216
+ export const DATA_SOURCES: Record<string, DomainConfig> = {
1217
+ products: {
1218
+ key: 'products',
1219
+ label: 'Produkte',
1220
+ resultLabel: 'Produkten',
1221
+ columns: PRODUCT_COLUMNS,
1222
+ layout: PRODUCT_LAYOUT,
1223
+ data: MOCK_PRODUCTS,
1224
+ },
1225
+ projects: {
1226
+ key: 'projects',
1227
+ label: 'Projekte',
1228
+ resultLabel: 'Projekten',
1229
+ columns: PROJECT_COLUMNS,
1230
+ layout: PROJECT_LAYOUT,
1231
+ data: MOCK_PROJECTS,
1232
+ },
1233
+ customers: {
1234
+ key: 'customers',
1235
+ label: 'Kunden',
1236
+ resultLabel: 'Kunden',
1237
+ columns: CUSTOMER_COLUMNS,
1238
+ layout: CUSTOMER_LAYOUT,
1239
+ data: MOCK_CUSTOMERS,
1240
+ },
1241
+ applications: {
1242
+ key: 'applications',
1243
+ label: 'Applikationen',
1244
+ resultLabel: 'Applikationen',
1245
+ columns: APPLICATION_COLUMNS,
1246
+ layout: APPLICATION_LAYOUT,
1247
+ data: MOCK_APPLICATIONS,
1248
+ },
1249
+ }
1250
+
1251
+ export const DOMAIN_KEYS = ['products', 'projects', 'customers', 'applications'] as const satisfies string[]