pdm-ui-kit 0.2.0 → 0.3.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.
Files changed (44) hide show
  1. package/README.md +168 -3
  2. package/esm2020/lib/components/button-group/button-group.component.mjs +211 -182
  3. package/esm2020/lib/components/combobox/combobox.component.mjs +136 -14
  4. package/esm2020/lib/components/context-menu/context-menu.component.mjs +121 -42
  5. package/esm2020/lib/components/data-table/data-table.component.mjs +3 -3
  6. package/esm2020/lib/components/date-picker/date-picker.component.mjs +66 -54
  7. package/esm2020/lib/components/dialog/dialog.component.mjs +111 -94
  8. package/esm2020/lib/components/hover-card/hover-card.component.mjs +185 -24
  9. package/esm2020/lib/components/input/input.component.mjs +15 -15
  10. package/esm2020/lib/components/input-group/input-group.component.mjs +14 -14
  11. package/esm2020/lib/components/menubar/menubar.component.mjs +105 -29
  12. package/esm2020/lib/components/popover/popover.component.mjs +107 -75
  13. package/esm2020/lib/components/select/select.component.mjs +23 -22
  14. package/esm2020/lib/components/table/table.component.mjs +77 -68
  15. package/esm2020/lib/components/tabs/tabs.component.mjs +6 -6
  16. package/esm2020/lib/components/toggle-group/toggle-group.component.mjs +6 -6
  17. package/esm2020/lib/components/tooltip/tooltip.component.mjs +162 -19
  18. package/esm2020/lib/overlay/z-index-helper.mjs +69 -0
  19. package/esm2020/lib/utils/z-index.mjs +25 -28
  20. package/esm2020/public-api.mjs +67 -66
  21. package/fesm2015/pdm-ui-kit.mjs +1379 -654
  22. package/fesm2015/pdm-ui-kit.mjs.map +1 -1
  23. package/fesm2020/pdm-ui-kit.mjs +1383 -654
  24. package/fesm2020/pdm-ui-kit.mjs.map +1 -1
  25. package/lib/components/button-group/button-group.component.d.ts +8 -2
  26. package/lib/components/combobox/combobox.component.d.ts +20 -3
  27. package/lib/components/context-menu/context-menu.component.d.ts +17 -8
  28. package/lib/components/date-picker/date-picker.component.d.ts +5 -6
  29. package/lib/components/dialog/dialog.component.d.ts +5 -5
  30. package/lib/components/hover-card/hover-card.component.d.ts +27 -4
  31. package/lib/components/input/input.component.d.ts +3 -3
  32. package/lib/components/input-group/input-group.component.d.ts +1 -1
  33. package/lib/components/menubar/menubar.component.d.ts +16 -8
  34. package/lib/components/popover/popover.component.d.ts +13 -12
  35. package/lib/components/select/select.component.d.ts +4 -5
  36. package/lib/components/table/table.component.d.ts +2 -2
  37. package/lib/components/tabs/tabs.component.d.ts +1 -1
  38. package/lib/components/toggle-group/toggle-group.component.d.ts +1 -1
  39. package/lib/components/tooltip/tooltip.component.d.ts +21 -3
  40. package/lib/overlay/z-index-helper.d.ts +36 -0
  41. package/lib/utils/z-index.d.ts +14 -18
  42. package/package.json +6 -6
  43. package/public-api.d.ts +66 -65
  44. package/src/lib/styles/tokens.css +182 -0
@@ -2,11 +2,11 @@ import * as i1 from '@angular/common';
2
2
  import { isPlatformBrowser, DOCUMENT, CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
4
  import { EventEmitter, Component, ChangeDetectionStrategy, Input, Output, HostListener, ViewChild, ViewChildren, ElementRef, PLATFORM_ID, Directive, Inject, ContentChildren, NgModule } from '@angular/core';
5
- import * as i1$2 from '@angular/cdk/overlay';
5
+ import * as i1$1 from '@angular/cdk/overlay';
6
6
  import { OverlayModule } from '@angular/cdk/overlay';
7
- import { icons } from 'lucide';
8
- import * as i1$1 from '@angular/platform-browser';
9
7
  import { TemplatePortal } from '@angular/cdk/portal';
8
+ import { icons } from 'lucide';
9
+ import * as i1$2 from '@angular/platform-browser';
10
10
  import { format } from 'date-fns';
11
11
 
12
12
  class PdmAccordionComponent {
@@ -314,198 +314,227 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
314
314
  type: Input
315
315
  }] } });
316
316
 
317
+ const ROOT_LAYOUT = {
318
+ horizontal: "w-full flex flex-row items-center overflow-x-auto",
319
+ vertical: "flex flex-col items-stretch",
320
+ };
321
+ const ATTACHMENT_EDGE_CLASSES = {
322
+ horizontal: [
323
+ "[&>*]:rounded-none",
324
+ "[&>*:first-child]:rounded-l-md",
325
+ "[&>*:last-child]:rounded-r-md",
326
+ "[&>*:not(:first-child)]:border-l-0",
327
+ "[&>*:not(:first-child)]:-ml-px",
328
+ ],
329
+ vertical: [
330
+ "[&>*]:rounded-none",
331
+ "[&>*:first-child]:rounded-t-md",
332
+ "[&>*:last-child]:rounded-b-md",
333
+ "[&>*:not(:first-child)]:border-t-0",
334
+ "[&>*:not(:first-child)]:-mt-px",
335
+ ],
336
+ };
337
+ const ATTACHMENT_CONTROL_CLASSES = {
338
+ horizontal: [
339
+ "[&>pdm-button]:flex",
340
+ "[&>pdm-button>button]:h-9",
341
+ "[&>pdm-button>button]:!rounded-none",
342
+ "[&>pdm-button>button]:shadow-none",
343
+ "[&>pdm-button:first-child>button]:!rounded-l-md",
344
+ "[&>pdm-button:last-child>button]:!rounded-r-md",
345
+ "[&>pdm-input]:flex-1",
346
+ "[&>pdm-input]:min-w-0",
347
+ "[&>pdm-input>div]:w-full",
348
+ "[&>pdm-input>div]:min-w-0",
349
+ "[&>pdm-input>div]:!rounded-none",
350
+ "[&>pdm-input>div]:shadow-none",
351
+ "[&>pdm-input>div>input]:!rounded-none",
352
+ "[&>pdm-input>div>input]:bg-background",
353
+ "[&>pdm-input>div>input]:shadow-none",
354
+ "[&>pdm-input:first-child>div]:!rounded-l-md",
355
+ "[&>pdm-input:last-child>div]:!rounded-r-md",
356
+ "[&>pdm-input:first-child>div>input]:!rounded-l-md",
357
+ "[&>pdm-input:last-child>div>input]:!rounded-r-md",
358
+ "[&>pdm-input-group]:min-w-0",
359
+ "[&>pdm-input-group>div]:!rounded-none",
360
+ "[&>pdm-input-group>div]:shadow-none",
361
+ "[&>pdm-input-group:first-child>div]:!rounded-l-md",
362
+ "[&>pdm-input-group:last-child>div]:!rounded-r-md",
363
+ "[&>pdm-select>select]:!rounded-none",
364
+ "[&>pdm-select>select]:shadow-none",
365
+ "[&>pdm-select>div>button]:!rounded-none",
366
+ "[&>pdm-select>div>button]:shadow-none",
367
+ "[&>pdm-select:first-child>select]:!rounded-l-md",
368
+ "[&>pdm-select:last-child>select]:!rounded-r-md",
369
+ "[&>pdm-select:first-child>div>button]:!rounded-l-md",
370
+ "[&>pdm-select:last-child>div>button]:!rounded-r-md",
371
+ "[&>pdm-select:not(:first-child)>div>button]:!rounded-l-none",
372
+ "[&>pdm-select:not(:last-child)>div>button]:!rounded-r-none",
373
+ "[&>pdm-tooltip>span>*]:rounded-none",
374
+ "[&>pdm-tooltip>span>*]:shadow-none",
375
+ "[&>pdm-tooltip:not(:first-child)>span>*]:border-l-0",
376
+ "[&>pdm-tooltip>span>button]:!rounded-none",
377
+ "[&>pdm-tooltip>span>button]:shadow-none",
378
+ "[&>pdm-tooltip:first-child>span>button]:!rounded-l-md",
379
+ "[&>pdm-tooltip:last-child>span>button]:!rounded-r-md",
380
+ "[&>pdm-tooltip>span>input]:!rounded-none",
381
+ "[&>pdm-tooltip>span>input]:bg-background",
382
+ "[&>pdm-tooltip>span>input]:shadow-none",
383
+ "[&>pdm-tooltip:first-child>span>input]:!rounded-l-md",
384
+ "[&>pdm-tooltip:last-child>span>input]:!rounded-r-md",
385
+ "[&>pdm-tooltip>span>select]:!rounded-none",
386
+ "[&>pdm-tooltip>span>select]:shadow-none",
387
+ "[&>pdm-tooltip:first-child>span>select]:!rounded-l-md",
388
+ "[&>pdm-tooltip:last-child>span>select]:!rounded-r-md",
389
+ "[&>pdm-tooltip>span>pdm-button>button]:!rounded-none",
390
+ "[&>pdm-tooltip>span>pdm-button>button]:shadow-none",
391
+ "[&>pdm-tooltip:first-child>span>pdm-button>button]:!rounded-l-md",
392
+ "[&>pdm-tooltip:last-child>span>pdm-button>button]:!rounded-r-md",
393
+ "[&>pdm-tooltip>span>pdm-input>div]:!rounded-none",
394
+ "[&>pdm-tooltip>span>pdm-input>div]:shadow-none",
395
+ "[&>pdm-tooltip>span>pdm-input>div>input]:!rounded-none",
396
+ "[&>pdm-tooltip>span>pdm-input>div>input]:bg-background",
397
+ "[&>pdm-tooltip>span>pdm-input>div>input]:shadow-none",
398
+ "[&>pdm-tooltip:first-child>span>pdm-input>div]:!rounded-l-md",
399
+ "[&>pdm-tooltip:last-child>span>pdm-input>div]:!rounded-r-md",
400
+ "[&>pdm-tooltip:first-child>span>pdm-input>div>input]:!rounded-l-md",
401
+ "[&>pdm-tooltip:last-child>span>pdm-input>div>input]:!rounded-r-md",
402
+ "[&>pdm-tooltip>span>pdm-input-group>div]:!rounded-none",
403
+ "[&>pdm-tooltip>span>pdm-input-group>div]:shadow-none",
404
+ "[&>pdm-tooltip:first-child>span>pdm-input-group>div]:!rounded-l-md",
405
+ "[&>pdm-tooltip:last-child>span>pdm-input-group>div]:!rounded-r-md",
406
+ "[&>pdm-tooltip>span>pdm-select>select]:!rounded-none",
407
+ "[&>pdm-tooltip>span>pdm-select>select]:shadow-none",
408
+ "[&>pdm-tooltip>span>pdm-select>div>button]:!rounded-none",
409
+ "[&>pdm-tooltip>span>pdm-select>div>button]:shadow-none",
410
+ "[&>pdm-tooltip:first-child>span>pdm-select>select]:!rounded-l-md",
411
+ "[&>pdm-tooltip:last-child>span>pdm-select>select]:!rounded-r-md",
412
+ "[&>pdm-tooltip:first-child>span>pdm-select>div>button]:!rounded-l-md",
413
+ "[&>pdm-tooltip:last-child>span>pdm-select>div>button]:!rounded-r-md",
414
+ "[&>pdm-tooltip:not(:first-child)>span>pdm-select>div>button]:!rounded-l-none",
415
+ "[&>pdm-tooltip:not(:last-child)>span>pdm-select>div>button]:!rounded-r-none",
416
+ ],
417
+ vertical: [
418
+ "[&>*]:rounded-none",
419
+ "[&>*:first-child]:rounded-t-md",
420
+ "[&>*:last-child]:rounded-b-md",
421
+ "[&>*:not(:first-child)]:border-t-0",
422
+ "[&>*:not(:first-child)]:-mt-px",
423
+ "[&>pdm-button]:flex",
424
+ "[&>pdm-button>button]:h-9",
425
+ "[&>pdm-button>button]:!rounded-none",
426
+ "[&>pdm-button>button]:shadow-none",
427
+ "[&>pdm-button:first-child>button]:!rounded-t-md",
428
+ "[&>pdm-button:last-child>button]:!rounded-b-md",
429
+ "[&>pdm-input>div]:!rounded-none",
430
+ "[&>pdm-input>div]:shadow-none",
431
+ "[&>pdm-input>div>input]:!rounded-none",
432
+ "[&>pdm-input>div>input]:bg-background",
433
+ "[&>pdm-input>div>input]:shadow-none",
434
+ "[&>pdm-input:first-child>div]:!rounded-t-md",
435
+ "[&>pdm-input:last-child>div]:!rounded-b-md",
436
+ "[&>pdm-input:first-child>div>input]:!rounded-t-md",
437
+ "[&>pdm-input:last-child>div>input]:!rounded-b-md",
438
+ "[&>pdm-input-group>div]:!rounded-none",
439
+ "[&>pdm-input-group>div]:shadow-none",
440
+ "[&>pdm-input-group:first-child>div]:!rounded-t-md",
441
+ "[&>pdm-input-group:last-child>div]:!rounded-b-md",
442
+ "[&>pdm-select>select]:!rounded-none",
443
+ "[&>pdm-select>select]:shadow-none",
444
+ "[&>pdm-select>div>button]:!rounded-none",
445
+ "[&>pdm-select>div>button]:shadow-none",
446
+ "[&>pdm-select:first-child>select]:!rounded-t-md",
447
+ "[&>pdm-select:last-child>select]:!rounded-b-md",
448
+ "[&>pdm-select:first-child>div>button]:!rounded-t-md",
449
+ "[&>pdm-select:last-child>div>button]:!rounded-b-md",
450
+ "[&>pdm-select:not(:first-child)>div>button]:!rounded-t-none",
451
+ "[&>pdm-select:not(:last-child)>div>button]:!rounded-b-none",
452
+ "[&>pdm-tooltip>span>*]:rounded-none",
453
+ "[&>pdm-tooltip>span>*]:shadow-none",
454
+ "[&>pdm-tooltip:not(:first-child)>span>*]:border-t-0",
455
+ "[&>pdm-tooltip>span>button]:!rounded-none",
456
+ "[&>pdm-tooltip>span>button]:shadow-none",
457
+ "[&>pdm-tooltip:first-child>span>button]:!rounded-t-md",
458
+ "[&>pdm-tooltip:last-child>span>button]:!rounded-b-md",
459
+ "[&>pdm-tooltip>span>input]:!rounded-none",
460
+ "[&>pdm-tooltip>span>input]:bg-background",
461
+ "[&>pdm-tooltip>span>input]:shadow-none",
462
+ "[&>pdm-tooltip:first-child>span>input]:!rounded-t-md",
463
+ "[&>pdm-tooltip:last-child>span>input]:!rounded-b-md",
464
+ "[&>pdm-tooltip>span>select]:!rounded-none",
465
+ "[&>pdm-tooltip>span>select]:shadow-none",
466
+ "[&>pdm-tooltip:first-child>span>select]:!rounded-t-md",
467
+ "[&>pdm-tooltip:last-child>span>select]:!rounded-b-md",
468
+ "[&>pdm-tooltip>span>pdm-button>button]:!rounded-none",
469
+ "[&>pdm-tooltip>span>pdm-button>button]:shadow-none",
470
+ "[&>pdm-tooltip:first-child>span>pdm-button>button]:!rounded-t-md",
471
+ "[&>pdm-tooltip:last-child>span>pdm-button>button]:!rounded-b-md",
472
+ "[&>pdm-tooltip>span>pdm-input>div]:!rounded-none",
473
+ "[&>pdm-tooltip>span>pdm-input>div]:shadow-none",
474
+ "[&>pdm-tooltip>span>pdm-input>div>input]:!rounded-none",
475
+ "[&>pdm-tooltip>span>pdm-input>div>input]:bg-background",
476
+ "[&>pdm-tooltip>span>pdm-input>div>input]:shadow-none",
477
+ "[&>pdm-tooltip:first-child>span>pdm-input>div]:!rounded-t-md",
478
+ "[&>pdm-tooltip:last-child>span>pdm-input>div]:!rounded-b-md",
479
+ "[&>pdm-tooltip:first-child>span>pdm-input>div>input]:!rounded-t-md",
480
+ "[&>pdm-tooltip:last-child>span>pdm-input>div>input]:!rounded-b-md",
481
+ "[&>pdm-tooltip>span>pdm-input-group>div]:!rounded-none",
482
+ "[&>pdm-tooltip>span>pdm-input-group>div]:shadow-none",
483
+ "[&>pdm-tooltip:first-child>span>pdm-input-group>div]:!rounded-t-md",
484
+ "[&>pdm-tooltip:last-child>span>pdm-input-group>div]:!rounded-b-md",
485
+ "[&>pdm-tooltip>span>pdm-select>select]:!rounded-none",
486
+ "[&>pdm-tooltip>span>pdm-select>select]:shadow-none",
487
+ "[&>pdm-tooltip>span>pdm-select>div>button]:!rounded-none",
488
+ "[&>pdm-tooltip>span>pdm-select>div>button]:shadow-none",
489
+ "[&>pdm-tooltip:first-child>span>pdm-select>select]:!rounded-t-md",
490
+ "[&>pdm-tooltip:last-child>span>pdm-select>select]:!rounded-b-md",
491
+ "[&>pdm-tooltip:first-child>span>pdm-select>div>button]:!rounded-t-md",
492
+ "[&>pdm-tooltip:last-child>span>pdm-select>div>button]:!rounded-b-md",
493
+ "[&>pdm-tooltip:not(:first-child)>span>pdm-select>div>button]:!rounded-t-none",
494
+ "[&>pdm-tooltip:not(:last-child)>span>pdm-select>div>button]:!rounded-b-none",
495
+ ],
496
+ };
497
+ const FOCUS_STACKING_CLASS = "*:focus-visible:relative *:focus-visible:z-10";
498
+ const SEPARATOR_CLASSES = "overflow-hidden rounded-md border border-border bg-secondary shadow-sm";
317
499
  class PdmButtonGroupComponent {
318
500
  constructor() {
319
- this.variant = 'default';
501
+ this.variant = "default";
320
502
  this.separated = true;
321
- this.className = '';
503
+ this.className = "";
504
+ }
505
+ get axis() {
506
+ return this.orientation ?? this.direction ?? "horizontal";
507
+ }
508
+ get isVertical() {
509
+ return this.variant === "orientation" || this.axis === "vertical";
510
+ }
511
+ get shouldAttach() {
512
+ return !this.separated && this.variant !== "default";
513
+ }
514
+ get ariaOrientation() {
515
+ return this.isVertical ? "vertical" : "horizontal";
322
516
  }
323
517
  get rootClasses() {
324
- const effectiveOrientation = this.orientation ?? this.direction ?? 'horizontal';
325
- const isVertical = this.variant === 'orientation' || effectiveOrientation === 'vertical';
326
- const isGroup = this.variant === 'group';
327
- const isAttached = !this.separated && this.variant !== 'default';
328
- const isSeparator = this.variant === 'separator';
329
- const attachedClasses = isAttached && !isGroup
330
- ? isVertical
331
- ? [
332
- '[&>*]:rounded-none',
333
- '[&>*:first-child]:rounded-t-md',
334
- '[&>*:last-child]:rounded-b-md',
335
- '[&>*:not(:first-child)]:border-t-0',
336
- '[&>*:not(:first-child)]:-mt-px'
337
- ].join(' ')
338
- : [
339
- '[&>*]:rounded-none',
340
- '[&>*:first-child]:rounded-l-md',
341
- '[&>*:last-child]:rounded-r-md',
342
- '[&>*:not(:first-child)]:border-l-0',
343
- '[&>*:not(:first-child)]:-ml-px'
344
- ].join(' ')
345
- : '';
346
- const groupHorizontalClasses = isGroup && !isVertical && !this.separated
347
- ? [
348
- '[&>*]:rounded-none',
349
- '[&>*:first-child]:rounded-l-md',
350
- '[&>*:last-child]:rounded-r-md',
351
- '[&>*:not(:first-child)]:-ml-px',
352
- '[&>*:not(:first-child)]:border-l-0',
353
- '[&>pdm-button]:flex',
354
- '[&>pdm-button>button]:h-9',
355
- '[&>pdm-input]:flex-1',
356
- '[&>pdm-input>div]:w-full',
357
- '[&>pdm-select>select]:!rounded-none',
358
- '[&>pdm-select:first-child>select]:!rounded-l-md',
359
- '[&>pdm-select:last-child>select]:!rounded-r-md',
360
- '[&>pdm-select>select]:shadow-none',
361
- '[&>pdm-select>div>button]:!rounded-none',
362
- '[&>pdm-select:first-child>div>button]:!rounded-l-md',
363
- '[&>pdm-select:last-child>div>button]:!rounded-r-md',
364
- '[&>pdm-select:not(:first-child)>div>button]:!rounded-l-none',
365
- '[&>pdm-select:not(:last-child)>div>button]:!rounded-r-none',
366
- '[&>pdm-select>div>button]:shadow-none',
367
- '[&>pdm-button>button]:!rounded-none',
368
- '[&>pdm-button:first-child>button]:!rounded-l-md',
369
- '[&>pdm-button:last-child>button]:!rounded-r-md',
370
- '[&>pdm-input>div>input]:!rounded-none',
371
- '[&>pdm-input:first-child>div>input]:!rounded-l-md',
372
- '[&>pdm-input:last-child>div>input]:!rounded-r-md',
373
- '[&>pdm-input-group>div]:!rounded-none',
374
- '[&>pdm-input-group:first-child>div]:!rounded-l-md',
375
- '[&>pdm-input-group:last-child>div]:!rounded-r-md',
376
- '[&>pdm-input>div>input]:bg-background',
377
- '[&>pdm-input>div>input]:shadow-none',
378
- '[&>pdm-button>button]:rounded-l-none',
379
- '[&>pdm-button>button]:shadow-none',
380
- '[&>pdm-tooltip>span>*]:rounded-none',
381
- '[&>pdm-tooltip:first-child>span>*]:rounded-l-md',
382
- '[&>pdm-tooltip:last-child>span>*]:rounded-r-md',
383
- '[&>pdm-tooltip:not(:first-child)>span>*]:border-l-0',
384
- '[&>pdm-tooltip>span>pdm-button>button]:!rounded-none',
385
- '[&>pdm-tooltip:first-child>span>pdm-button>button]:!rounded-l-md',
386
- '[&>pdm-tooltip:last-child>span>pdm-button>button]:!rounded-r-md',
387
- '[&>pdm-tooltip>span>pdm-button>button]:shadow-none',
388
- '[&>pdm-tooltip>span>button]:!rounded-none',
389
- '[&>pdm-tooltip:first-child>span>button]:!rounded-l-md',
390
- '[&>pdm-tooltip:last-child>span>button]:!rounded-r-md',
391
- '[&>pdm-tooltip>span>button]:shadow-none',
392
- '[&>pdm-tooltip>span>pdm-input>div>input]:!rounded-none',
393
- '[&>pdm-tooltip:first-child>span>pdm-input>div>input]:!rounded-l-md',
394
- '[&>pdm-tooltip:last-child>span>pdm-input>div>input]:!rounded-r-md',
395
- '[&>pdm-tooltip>span>pdm-input>div>input]:shadow-none',
396
- '[&>pdm-tooltip>span>input]:!rounded-none',
397
- '[&>pdm-tooltip:first-child>span>input]:!rounded-l-md',
398
- '[&>pdm-tooltip:last-child>span>input]:!rounded-r-md',
399
- '[&>pdm-tooltip>span>input]:shadow-none',
400
- '[&>pdm-tooltip>span>pdm-input-group>div]:!rounded-none',
401
- '[&>pdm-tooltip:first-child>span>pdm-input-group>div]:!rounded-l-md',
402
- '[&>pdm-tooltip:last-child>span>pdm-input-group>div]:!rounded-r-md',
403
- '[&>pdm-tooltip>span>pdm-select>select]:!rounded-none',
404
- '[&>pdm-tooltip:first-child>span>pdm-select>select]:!rounded-l-md',
405
- '[&>pdm-tooltip:last-child>span>pdm-select>select]:!rounded-r-md',
406
- '[&>pdm-tooltip>span>pdm-select>select]:shadow-none',
407
- '[&>pdm-tooltip>span>pdm-select>div>button]:!rounded-none',
408
- '[&>pdm-tooltip:first-child>span>pdm-select>div>button]:!rounded-l-md',
409
- '[&>pdm-tooltip:last-child>span>pdm-select>div>button]:!rounded-r-md',
410
- '[&>pdm-tooltip:not(:first-child)>span>pdm-select>div>button]:!rounded-l-none',
411
- '[&>pdm-tooltip:not(:last-child)>span>pdm-select>div>button]:!rounded-r-none',
412
- '[&>pdm-tooltip>span>pdm-select>div>button]:shadow-none',
413
- '[&>pdm-tooltip>span>select]:!rounded-none',
414
- '[&>pdm-tooltip:first-child>span>select]:!rounded-l-md',
415
- '[&>pdm-tooltip:last-child>span>select]:!rounded-r-md',
416
- '[&>pdm-tooltip>span>select]:shadow-none'
417
- ].join(' ')
418
- : '';
419
- const groupVerticalClasses = isGroup && isVertical && !this.separated
420
- ? [
421
- '[&>*]:rounded-none',
422
- '[&>*:first-child]:rounded-t-md',
423
- '[&>*:last-child]:rounded-b-md',
424
- '[&>*:not(:first-child)]:-mt-px',
425
- '[&>*:not(:first-child)]:border-t-0',
426
- '[&>pdm-button]:flex',
427
- '[&>pdm-button>button]:h-9',
428
- '[&>pdm-button>button]:!rounded-none',
429
- '[&>pdm-button:first-child>button]:!rounded-t-md',
430
- '[&>pdm-button:last-child>button]:!rounded-b-md',
431
- '[&>pdm-input>div>input]:!rounded-none',
432
- '[&>pdm-input:first-child>div>input]:!rounded-t-md',
433
- '[&>pdm-input:last-child>div>input]:!rounded-b-md',
434
- '[&>pdm-input-group>div]:!rounded-none',
435
- '[&>pdm-input-group:first-child>div]:!rounded-t-md',
436
- '[&>pdm-input-group:last-child>div]:!rounded-b-md',
437
- '[&>pdm-select>select]:!rounded-none',
438
- '[&>pdm-select:first-child>select]:!rounded-t-md',
439
- '[&>pdm-select:last-child>select]:!rounded-b-md',
440
- '[&>pdm-select>select]:shadow-none',
441
- '[&>pdm-select>div>button]:!rounded-none',
442
- '[&>pdm-select:first-child>div>button]:!rounded-t-md',
443
- '[&>pdm-select:last-child>div>button]:!rounded-b-md',
444
- '[&>pdm-select:not(:first-child)>div>button]:!rounded-t-none',
445
- '[&>pdm-select:not(:last-child)>div>button]:!rounded-b-none',
446
- '[&>pdm-select>div>button]:shadow-none',
447
- '[&>pdm-input>div>input]:bg-background',
448
- '[&>pdm-input>div>input]:shadow-none',
449
- '[&>pdm-button>button]:shadow-none',
450
- '[&>pdm-tooltip>span>*]:rounded-none',
451
- '[&>pdm-tooltip:first-child>span>*]:rounded-t-md',
452
- '[&>pdm-tooltip:last-child>span>*]:rounded-b-md',
453
- '[&>pdm-tooltip:not(:first-child)>span>*]:border-t-0',
454
- '[&>pdm-tooltip>span>pdm-button>button]:!rounded-none',
455
- '[&>pdm-tooltip:first-child>span>pdm-button>button]:!rounded-t-md',
456
- '[&>pdm-tooltip:last-child>span>pdm-button>button]:!rounded-b-md',
457
- '[&>pdm-tooltip>span>pdm-button>button]:shadow-none',
458
- '[&>pdm-tooltip>span>button]:!rounded-none',
459
- '[&>pdm-tooltip:first-child>span>button]:!rounded-t-md',
460
- '[&>pdm-tooltip:last-child>span>button]:!rounded-b-md',
461
- '[&>pdm-tooltip>span>button]:shadow-none',
462
- '[&>pdm-tooltip>span>pdm-input>div>input]:!rounded-none',
463
- '[&>pdm-tooltip:first-child>span>pdm-input>div>input]:!rounded-t-md',
464
- '[&>pdm-tooltip:last-child>span>pdm-input>div>input]:!rounded-b-md',
465
- '[&>pdm-tooltip>span>pdm-input>div>input]:shadow-none',
466
- '[&>pdm-tooltip>span>input]:!rounded-none',
467
- '[&>pdm-tooltip:first-child>span>input]:!rounded-t-md',
468
- '[&>pdm-tooltip:last-child>span>input]:!rounded-b-md',
469
- '[&>pdm-tooltip>span>input]:shadow-none',
470
- '[&>pdm-tooltip>span>pdm-input-group>div]:!rounded-none',
471
- '[&>pdm-tooltip:first-child>span>pdm-input-group>div]:!rounded-t-md',
472
- '[&>pdm-tooltip:last-child>span>pdm-input-group>div]:!rounded-b-md',
473
- '[&>pdm-tooltip>span>pdm-select>select]:!rounded-none',
474
- '[&>pdm-tooltip:first-child>span>pdm-select>select]:!rounded-t-md',
475
- '[&>pdm-tooltip:last-child>span>pdm-select>select]:!rounded-b-md',
476
- '[&>pdm-tooltip>span>pdm-select>select]:shadow-none',
477
- '[&>pdm-tooltip>span>pdm-select>div>button]:!rounded-none',
478
- '[&>pdm-tooltip:first-child>span>pdm-select>div>button]:!rounded-t-md',
479
- '[&>pdm-tooltip:last-child>span>pdm-select>div>button]:!rounded-b-md',
480
- '[&>pdm-tooltip:not(:first-child)>span>pdm-select>div>button]:!rounded-t-none',
481
- '[&>pdm-tooltip:not(:last-child)>span>pdm-select>div>button]:!rounded-b-none',
482
- '[&>pdm-tooltip>span>pdm-select>div>button]:shadow-none',
483
- '[&>pdm-tooltip>span>select]:!rounded-none',
484
- '[&>pdm-tooltip:first-child>span>select]:!rounded-t-md',
485
- '[&>pdm-tooltip:last-child>span>select]:!rounded-b-md',
486
- '[&>pdm-tooltip>span>select]:shadow-none'
487
- ].join(' ')
488
- : '';
489
518
  return [
490
- 'inline-flex w-fit',
491
- isVertical ? 'flex-col items-stretch' : 'items-center',
492
- this.variant === 'default' || this.separated ? 'gap-2' : 'gap-0',
493
- isGroup ? '*:focus-visible:relative *:focus-visible:z-10' : '',
494
- attachedClasses,
495
- groupHorizontalClasses,
496
- groupVerticalClasses,
497
- isSeparator
498
- ? 'overflow-hidden rounded-md border border-border bg-secondary shadow-sm'
499
- : '',
500
- this.className
519
+ ROOT_LAYOUT[this.isVertical ? "vertical" : "horizontal"],
520
+ this.variant === "default" || this.separated ? "gap-2" : "gap-0",
521
+ this.shouldAttach
522
+ ? ATTACHMENT_EDGE_CLASSES[this.isVertical ? "vertical" : "horizontal"].join(" ")
523
+ : "",
524
+ this.shouldAttach
525
+ ? ATTACHMENT_CONTROL_CLASSES[this.isVertical ? "vertical" : "horizontal"].join(" ")
526
+ : "",
527
+ this.shouldAttach ? FOCUS_STACKING_CLASS : "",
528
+ this.variant === "separator" ? SEPARATOR_CLASSES : "",
529
+ this.className,
501
530
  ];
502
531
  }
503
532
  }
504
533
  PdmButtonGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
505
- PdmButtonGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmButtonGroupComponent, selector: "pdm-button-group", inputs: { variant: "variant", orientation: "orientation", direction: "direction", separated: "separated", className: "className" }, ngImport: i0, template: "<div\n role=\"group\"\n [attr.aria-orientation]=\"variant === 'orientation' || orientation === 'vertical' || direction === 'vertical' ? 'vertical' : 'horizontal'\"\n [ngClass]=\"rootClasses\"\n>\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
534
+ PdmButtonGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmButtonGroupComponent, selector: "pdm-button-group", inputs: { variant: "variant", orientation: "orientation", direction: "direction", separated: "separated", className: "className" }, ngImport: i0, template: "<div\n role=\"group\"\n [attr.aria-orientation]=\"ariaOrientation\"\n [ngClass]=\"rootClasses\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
506
535
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmButtonGroupComponent, decorators: [{
507
536
  type: Component,
508
- args: [{ selector: 'pdm-button-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n [attr.aria-orientation]=\"variant === 'orientation' || orientation === 'vertical' || direction === 'vertical' ? 'vertical' : 'horizontal'\"\n [ngClass]=\"rootClasses\"\n>\n <ng-content></ng-content>\n</div>\n" }]
537
+ args: [{ selector: "pdm-button-group", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n [attr.aria-orientation]=\"ariaOrientation\"\n [ngClass]=\"rootClasses\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block}\n"] }]
509
538
  }], propDecorators: { variant: [{
510
539
  type: Input
511
540
  }], orientation: [{
@@ -1535,35 +1564,212 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
1535
1564
  type: Output
1536
1565
  }] } });
1537
1566
 
1567
+ /**
1568
+ * Z-Index helper for overlay components.
1569
+ *
1570
+ * CRITICAL: Consumer custom panelClass MUST NOT replace the base z-index.
1571
+ * This helper ensures z-index is preserved when merging custom classes.
1572
+ */
1573
+ /**
1574
+ * Base z-index class for overlays - MUST be included in any overlay panel.
1575
+ * This ensures overlays appear above modals (z-50) and drawers (z-40).
1576
+ */
1577
+ const OVERLAY_BASE_Z_INDEX = "z-[70]";
1578
+ /**
1579
+ * Merge consumer's panelClass with our base z-index.
1580
+ * Consumer classes are APPENDED, not replacing our z-index guarantee.
1581
+ *
1582
+ * @param baseZIndex - Base z-index class to enforce (default: OVERLAY_BASE_Z_INDEX)
1583
+ * @param consumerClasses - Optional additional classes from consumer
1584
+ * @returns Array of classes safe for CDK Overlay panelClass
1585
+ */
1586
+ function mergeOverlayPanelClass(baseZIndex = OVERLAY_BASE_Z_INDEX, consumerClasses) {
1587
+ const baseClasses = baseZIndex.split(" ");
1588
+ if (!consumerClasses) {
1589
+ return baseClasses;
1590
+ }
1591
+ const consumerClassArray = Array.isArray(consumerClasses)
1592
+ ? consumerClasses
1593
+ : consumerClasses.split(" ");
1594
+ // Consumer classes are appended AFTER base classes
1595
+ // This ensures z-index from baseClasses is preserved first
1596
+ return [...baseClasses, ...consumerClassArray];
1597
+ }
1598
+ /**
1599
+ * Create OverlayConfig with guaranteed z-index.
1600
+ * Use this instead of direct OverlayConfig to ensure z-index enforcement.
1601
+ *
1602
+ * @param baseConfig - Base overlay configuration
1603
+ * @param consumerPanelClass - Optional consumer panelClass to merge
1604
+ * @returns OverlayConfig with z-index guarantee
1605
+ */
1606
+ function createZIndexEnforcedOverlay(baseConfig, consumerPanelClass) {
1607
+ const mergedClasses = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, consumerPanelClass);
1608
+ const existingPanelClass = baseConfig.panelClass;
1609
+ if (existingPanelClass) {
1610
+ const existingArray = Array.isArray(existingPanelClass)
1611
+ ? existingPanelClass
1612
+ : existingPanelClass.split(" ");
1613
+ return {
1614
+ ...baseConfig,
1615
+ panelClass: [...mergedClasses, ...existingArray],
1616
+ };
1617
+ }
1618
+ return {
1619
+ ...baseConfig,
1620
+ panelClass: mergedClasses,
1621
+ };
1622
+ }
1623
+ /**
1624
+ * Helper to extract z-index from a class string for debugging.
1625
+ */
1626
+ function extractZIndex(classes) {
1627
+ const classArray = Array.isArray(classes) ? classes : classes.split(" ");
1628
+ for (const cls of classArray) {
1629
+ if (cls.startsWith("z-") || cls.startsWith("z-[")) {
1630
+ return cls;
1631
+ }
1632
+ }
1633
+ return null;
1634
+ }
1635
+
1538
1636
  class PdmComboboxComponent {
1539
- constructor() {
1637
+ constructor(overlay, viewContainerRef, elementRef, cdr) {
1638
+ this.overlay = overlay;
1639
+ this.viewContainerRef = viewContainerRef;
1640
+ this.elementRef = elementRef;
1641
+ this.cdr = cdr;
1540
1642
  this.open = false;
1541
- this.placeholder = 'Select framework...';
1542
- this.searchPlaceholder = 'Search framework';
1543
- this.className = '';
1544
- this.options = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'];
1545
- this.value = '';
1643
+ this.placeholder = "Select framework...";
1644
+ this.searchPlaceholder = "Search framework";
1645
+ this.className = "";
1646
+ this.options = [
1647
+ "Next.js",
1648
+ "SvelteKit",
1649
+ "Nuxt.js",
1650
+ "Remix",
1651
+ "Astro",
1652
+ ];
1653
+ this.value = "";
1546
1654
  this.width = 200;
1655
+ this.panelClassName = "";
1547
1656
  this.openChange = new EventEmitter();
1548
1657
  this.valueChange = new EventEmitter();
1658
+ this.overlayRef = null;
1659
+ this.outsideClickSub = null;
1660
+ }
1661
+ ngOnDestroy() {
1662
+ this.destroyOverlay();
1549
1663
  }
1550
1664
  get selectedLabel() {
1551
1665
  return this.value || this.placeholder;
1552
1666
  }
1553
1667
  toggle() {
1554
- this.openChange.emit(!this.open);
1668
+ if (this.open) {
1669
+ this.close();
1670
+ }
1671
+ else {
1672
+ this.openPanel();
1673
+ }
1555
1674
  }
1556
1675
  select(option) {
1557
1676
  this.valueChange.emit(option);
1677
+ this.value = option;
1678
+ this.close();
1679
+ }
1680
+ onEscape() {
1681
+ if (this.open) {
1682
+ this.close();
1683
+ }
1684
+ }
1685
+ openPanel() {
1686
+ if (this.overlayRef)
1687
+ return;
1688
+ const triggerEl = this.triggerRef?.nativeElement;
1689
+ if (!triggerEl)
1690
+ return;
1691
+ this.open = true;
1692
+ this.openChange.emit(true);
1693
+ this.cdr.markForCheck();
1694
+ const positionStrategy = this.overlay
1695
+ .position()
1696
+ .flexibleConnectedTo(triggerEl)
1697
+ .withPositions(this.getPositionConfigs())
1698
+ .withFlexibleDimensions(false)
1699
+ .withPush(true);
1700
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
1701
+ this.overlayRef = this.overlay.create({
1702
+ positionStrategy,
1703
+ panelClass,
1704
+ });
1705
+ const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
1706
+ this.overlayRef.attach(portal);
1707
+ // Close on click outside
1708
+ this.outsideClickSub = this.overlayRef
1709
+ .outsidePointerEvents()
1710
+ .subscribe(() => {
1711
+ this.close();
1712
+ });
1713
+ this.cdr.markForCheck();
1714
+ }
1715
+ close() {
1716
+ if (!this.overlayRef)
1717
+ return;
1718
+ this.open = false;
1558
1719
  this.openChange.emit(false);
1720
+ this.cdr.markForCheck();
1721
+ this.destroyOverlay();
1722
+ }
1723
+ destroyOverlay() {
1724
+ if (this.outsideClickSub) {
1725
+ this.outsideClickSub.unsubscribe();
1726
+ this.outsideClickSub = null;
1727
+ }
1728
+ if (this.overlayRef) {
1729
+ this.overlayRef.detach();
1730
+ this.overlayRef.dispose();
1731
+ this.overlayRef = null;
1732
+ }
1733
+ }
1734
+ getPositionConfigs() {
1735
+ return [
1736
+ {
1737
+ originX: "start",
1738
+ originY: "bottom",
1739
+ overlayX: "start",
1740
+ overlayY: "top",
1741
+ offsetY: 4,
1742
+ },
1743
+ {
1744
+ originX: "start",
1745
+ originY: "top",
1746
+ overlayX: "start",
1747
+ overlayY: "bottom",
1748
+ offsetY: -4,
1749
+ },
1750
+ {
1751
+ originX: "end",
1752
+ originY: "bottom",
1753
+ overlayX: "end",
1754
+ overlayY: "top",
1755
+ offsetY: 4,
1756
+ },
1757
+ {
1758
+ originX: "start",
1759
+ originY: "bottom",
1760
+ overlayX: "end",
1761
+ overlayY: "top",
1762
+ offsetY: 4,
1763
+ },
1764
+ ];
1559
1765
  }
1560
1766
  }
1561
- PdmComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1562
- PdmComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmComboboxComponent, selector: "pdm-combobox", inputs: { open: "open", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", className: "className", options: "options", value: "value", width: "width" }, outputs: { openChange: "openChange", valueChange: "valueChange" }, ngImport: i0, template: "<div [ngClass]=\"['flex flex-col gap-1', className]\" [style.width.px]=\"width\">\n <button\n type=\"button\"\n class=\"flex h-9 w-full appearance-none items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n >\n <span class=\"min-w-0 flex-1 truncate text-left text-sm font-medium text-foreground\">{{ selectedLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 15L12 20L17 15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17 9L12 4L7 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n\n <div\n *ngIf=\"open\"\n class=\"w-full rounded-md border border-border bg-popover p-0 text-popover-foreground shadow-md\"\n >\n <div class=\"flex items-center gap-2 border-b border-border px-3\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-muted-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\"></circle>\n <path d=\"M20 20L16.6 16.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n <div class=\"h-9 flex-1 py-2 text-sm text-muted-foreground\">{{ searchPlaceholder }}</div>\n </div>\n\n <div class=\"p-1\">\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n class=\"flex w-full appearance-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground\"\n [ngClass]=\"option === value ? 'bg-accent text-accent-foreground' : ''\"\n (click)=\"select(option)\"\n >\n <span class=\"min-w-0 flex-1 truncate\">{{ option }}</span>\n <svg *ngIf=\"option === value\" viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1767
+ PdmComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmComboboxComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1768
+ PdmComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmComboboxComponent, selector: "pdm-combobox", inputs: { open: "open", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", className: "className", options: "options", value: "value", width: "width", panelClassName: "panelClassName" }, outputs: { openChange: "openChange", valueChange: "valueChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['flex flex-col gap-1', className]\" [style.width.px]=\"width\">\n <button\n #triggerEl\n type=\"button\"\n class=\"flex h-9 w-full appearance-none items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggle()\"\n >\n <span\n class=\"min-w-0 flex-1 truncate text-left text-sm font-medium text-foreground\"\n >{{ selectedLabel }}</span\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 15L12 20L17 15\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n <path\n d=\"M17 9L12 4L7 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <div\n class=\"w-full rounded-md border border-border bg-popover p-0 text-popover-foreground shadow-md\"\n >\n <div class=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"11\"\n cy=\"11\"\n r=\"7\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n ></circle>\n <path\n d=\"M20 20L16.6 16.6\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n ></path>\n </svg>\n <div class=\"flex-1 py-2 text-sm text-muted-foreground\">\n {{ searchPlaceholder }}\n </div>\n </div>\n\n <div class=\"p-1\">\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n class=\"flex w-full appearance-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground\"\n [ngClass]=\"option === value ? 'bg-accent text-accent-foreground' : ''\"\n role=\"option\"\n [attr.aria-selected]=\"option === value\"\n (click)=\"select(option)\"\n >\n <span class=\"min-w-0 flex-1 truncate\">{{ option }}</span>\n <svg\n *ngIf=\"option === value\"\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1563
1769
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmComboboxComponent, decorators: [{
1564
1770
  type: Component,
1565
- args: [{ selector: 'pdm-combobox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['flex flex-col gap-1', className]\" [style.width.px]=\"width\">\n <button\n type=\"button\"\n class=\"flex h-9 w-full appearance-none items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n >\n <span class=\"min-w-0 flex-1 truncate text-left text-sm font-medium text-foreground\">{{ selectedLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 15L12 20L17 15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17 9L12 4L7 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n\n <div\n *ngIf=\"open\"\n class=\"w-full rounded-md border border-border bg-popover p-0 text-popover-foreground shadow-md\"\n >\n <div class=\"flex items-center gap-2 border-b border-border px-3\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-muted-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\"></circle>\n <path d=\"M20 20L16.6 16.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n <div class=\"h-9 flex-1 py-2 text-sm text-muted-foreground\">{{ searchPlaceholder }}</div>\n </div>\n\n <div class=\"p-1\">\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n class=\"flex w-full appearance-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground\"\n [ngClass]=\"option === value ? 'bg-accent text-accent-foreground' : ''\"\n (click)=\"select(option)\"\n >\n <span class=\"min-w-0 flex-1 truncate\">{{ option }}</span>\n <svg *ngIf=\"option === value\" viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n </div>\n</div>\n" }]
1566
- }], propDecorators: { open: [{
1771
+ args: [{ selector: "pdm-combobox", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['flex flex-col gap-1', className]\" [style.width.px]=\"width\">\n <button\n #triggerEl\n type=\"button\"\n class=\"flex h-9 w-full appearance-none items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-haspopup]=\"'listbox'\"\n (click)=\"toggle()\"\n >\n <span\n class=\"min-w-0 flex-1 truncate text-left text-sm font-medium text-foreground\"\n >{{ selectedLabel }}</span\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 15L12 20L17 15\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n <path\n d=\"M17 9L12 4L7 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <div\n class=\"w-full rounded-md border border-border bg-popover p-0 text-popover-foreground shadow-md\"\n >\n <div class=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"11\"\n cy=\"11\"\n r=\"7\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n ></circle>\n <path\n d=\"M20 20L16.6 16.6\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n ></path>\n </svg>\n <div class=\"flex-1 py-2 text-sm text-muted-foreground\">\n {{ searchPlaceholder }}\n </div>\n </div>\n\n <div class=\"p-1\">\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n class=\"flex w-full appearance-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground\"\n [ngClass]=\"option === value ? 'bg-accent text-accent-foreground' : ''\"\n role=\"option\"\n [attr.aria-selected]=\"option === value\"\n (click)=\"select(option)\"\n >\n <span class=\"min-w-0 flex-1 truncate\">{{ option }}</span>\n <svg\n *ngIf=\"option === value\"\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"] }]
1772
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { open: [{
1567
1773
  type: Input
1568
1774
  }], placeholder: [{
1569
1775
  type: Input
@@ -1577,10 +1783,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
1577
1783
  type: Input
1578
1784
  }], width: [{
1579
1785
  type: Input
1786
+ }], panelClassName: [{
1787
+ type: Input
1580
1788
  }], openChange: [{
1581
1789
  type: Output
1582
1790
  }], valueChange: [{
1583
1791
  type: Output
1792
+ }], triggerRef: [{
1793
+ type: ViewChild,
1794
+ args: ["triggerEl"]
1795
+ }], panelTemplateRef: [{
1796
+ type: ViewChild,
1797
+ args: ["panelTemplate"]
1798
+ }], onEscape: [{
1799
+ type: HostListener,
1800
+ args: ["document:keydown.escape"]
1584
1801
  }] } });
1585
1802
 
1586
1803
  const FALLBACK_NODE = [['circle', { cx: '12', cy: '12', r: '9' }]];
@@ -1699,12 +1916,12 @@ class PdmIconComponent {
1699
1916
  .replace(/>/g, '&gt;');
1700
1917
  }
1701
1918
  }
1702
- PdmIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmIconComponent, deps: [{ token: i1$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1919
+ PdmIconComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmIconComponent, deps: [{ token: i1$2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1703
1920
  PdmIconComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmIconComponent, selector: "pdm-icon", inputs: { name: "name", library: "library", assetUrl: "assetUrl", size: "size", strokeWidth: "strokeWidth", className: "className", ariaLabel: "ariaLabel", decorative: "decorative" }, ngImport: i0, template: "<ng-container *ngIf=\"assetUrl; else inlineIcon\">\n <img\n [src]=\"assetUrl\"\n [style.width.px]=\"resolvedSize\"\n [style.height.px]=\"resolvedSize\"\n [ngClass]=\"className\"\n [attr.role]=\"decorative ? null : 'img'\"\n [attr.aria-hidden]=\"decorative ? 'true' : null\"\n [attr.aria-label]=\"!decorative ? ariaLabel || name : null\"\n alt=\"\"\n />\n</ng-container>\n\n<ng-template #inlineIcon>\n <span\n [ngClass]=\"className\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.justify-content]=\"'center'\"\n [style.line-height]=\"0\"\n [style.width.px]=\"resolvedSize\"\n [style.height.px]=\"resolvedSize\"\n [attr.role]=\"decorative ? null : 'img'\"\n [attr.aria-hidden]=\"decorative ? 'true' : null\"\n [attr.aria-label]=\"!decorative ? ariaLabel || name : null\"\n [innerHTML]=\"svgMarkup\"\n ></span>\n</ng-template>\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:0;flex-shrink:0}:host svg{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1704
1921
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmIconComponent, decorators: [{
1705
1922
  type: Component,
1706
1923
  args: [{ selector: 'pdm-icon', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"assetUrl; else inlineIcon\">\n <img\n [src]=\"assetUrl\"\n [style.width.px]=\"resolvedSize\"\n [style.height.px]=\"resolvedSize\"\n [ngClass]=\"className\"\n [attr.role]=\"decorative ? null : 'img'\"\n [attr.aria-hidden]=\"decorative ? 'true' : null\"\n [attr.aria-label]=\"!decorative ? ariaLabel || name : null\"\n alt=\"\"\n />\n</ng-container>\n\n<ng-template #inlineIcon>\n <span\n [ngClass]=\"className\"\n [style.display]=\"'inline-flex'\"\n [style.align-items]=\"'center'\"\n [style.justify-content]=\"'center'\"\n [style.line-height]=\"0\"\n [style.width.px]=\"resolvedSize\"\n [style.height.px]=\"resolvedSize\"\n [attr.role]=\"decorative ? null : 'img'\"\n [attr.aria-hidden]=\"decorative ? 'true' : null\"\n [attr.aria-label]=\"!decorative ? ariaLabel || name : null\"\n [innerHTML]=\"svgMarkup\"\n ></span>\n</ng-template>\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:0;flex-shrink:0}:host svg{display:block}\n"] }]
1707
- }], ctorParameters: function () { return [{ type: i1$1.DomSanitizer }]; }, propDecorators: { name: [{
1924
+ }], ctorParameters: function () { return [{ type: i1$2.DomSanitizer }]; }, propDecorators: { name: [{
1708
1925
  type: Input
1709
1926
  }], library: [{
1710
1927
  type: Input
@@ -1794,72 +2011,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
1794
2011
  }] } });
1795
2012
 
1796
2013
  class PdmContextMenuComponent {
1797
- constructor(elementRef) {
1798
- this.elementRef = elementRef;
2014
+ constructor(overlay, viewContainerRef, _elementRef, cdr) {
2015
+ this.overlay = overlay;
2016
+ this.viewContainerRef = viewContainerRef;
2017
+ this._elementRef = _elementRef;
2018
+ this.cdr = cdr;
1799
2019
  this.items = [
1800
- { type: 'item', label: 'Back', value: 'back', inset: true, shortcut: '⌘[' },
1801
- { type: 'item', label: 'Forward', value: 'forward', inset: true, shortcut: '⌘]', disabled: true },
1802
- { type: 'item', label: 'Reload', value: 'reload', inset: true, shortcut: '⌘R' },
1803
- { type: 'item', label: 'More Tools', value: 'more-tools', inset: true, showChevron: true },
1804
- { type: 'separator' },
1805
- { type: 'item', label: 'Show Bookmarks Bar', value: 'show-bookmarks', checked: true },
1806
- { type: 'item', label: 'Show Full URLs', value: 'show-urls', inset: true },
1807
- { type: 'separator' },
1808
- { type: 'label', label: 'People' },
1809
- { type: 'separator' },
1810
- { type: 'item', label: 'Pedro Duarte', value: 'pedro', selectedDot: true },
1811
- { type: 'item', label: 'Colm Tuite', value: 'colm', inset: true }
2020
+ { type: "item", label: "Back", value: "back", inset: true, shortcut: "⌘[" },
2021
+ {
2022
+ type: "item",
2023
+ label: "Forward",
2024
+ value: "forward",
2025
+ inset: true,
2026
+ shortcut: "⌘]",
2027
+ disabled: true,
2028
+ },
2029
+ {
2030
+ type: "item",
2031
+ label: "Reload",
2032
+ value: "reload",
2033
+ inset: true,
2034
+ shortcut: "⌘R",
2035
+ },
2036
+ {
2037
+ type: "item",
2038
+ label: "More Tools",
2039
+ value: "more-tools",
2040
+ inset: true,
2041
+ showChevron: true,
2042
+ },
2043
+ { type: "separator" },
2044
+ {
2045
+ type: "item",
2046
+ label: "Show Bookmarks Bar",
2047
+ value: "show-bookmarks",
2048
+ checked: true,
2049
+ },
2050
+ { type: "item", label: "Show Full URLs", value: "show-urls", inset: true },
2051
+ { type: "separator" },
2052
+ { type: "label", label: "People" },
2053
+ { type: "separator" },
2054
+ { type: "item", label: "Pedro Duarte", value: "pedro", selectedDot: true },
2055
+ { type: "item", label: "Colm Tuite", value: "colm", inset: true },
1812
2056
  ];
1813
- this.className = '';
1814
- this.triggerLabel = 'Right click here';
2057
+ this.className = "";
2058
+ this.triggerLabel = "Right click here";
1815
2059
  this.width = 300;
1816
2060
  this.height = 150;
2061
+ this.panelClassName = "";
1817
2062
  this.itemSelect = new EventEmitter();
1818
2063
  this.open = false;
1819
2064
  this.x = 0;
1820
2065
  this.y = 0;
2066
+ this.overlayRef = null;
2067
+ this.outsideClickSub = null;
1821
2068
  }
1822
- ngOnInit() {
1823
- this.boundPointerDown = (event) => this.onDocumentPointerDown(event);
1824
- document.addEventListener('pointerdown', this.boundPointerDown, { capture: true });
1825
- }
2069
+ ngOnInit() { }
1826
2070
  ngOnDestroy() {
1827
- if (this.boundPointerDown) {
1828
- document.removeEventListener('pointerdown', this.boundPointerDown, { capture: true });
1829
- }
2071
+ this.destroyOverlay();
1830
2072
  }
1831
2073
  onContextMenu(event) {
1832
2074
  event.preventDefault();
2075
+ event.stopPropagation();
1833
2076
  this.x = event.clientX;
1834
2077
  this.y = event.clientY;
1835
2078
  this.open = true;
2079
+ this.cdr.markForCheck();
2080
+ this.createOverlay();
1836
2081
  }
1837
2082
  select(item) {
1838
- if (item.disabled || item.type === 'separator' || item.type === 'label' || !item.value)
2083
+ if (item.disabled ||
2084
+ item.type === "separator" ||
2085
+ item.type === "label" ||
2086
+ !item.value)
1839
2087
  return;
1840
2088
  this.itemSelect.emit(item.value);
1841
2089
  this.open = false;
2090
+ this.cdr.markForCheck();
2091
+ this.destroyOverlay();
1842
2092
  }
1843
- onEsc() {
1844
- if (this.open) {
1845
- this.open = false;
2093
+ onDocumentClick(event) {
2094
+ if (this.open && event.type === "click") {
2095
+ // Don't close on click inside the menu
2096
+ if (this.overlayRef &&
2097
+ this.overlayRef.overlayElement.contains(event.target)) {
2098
+ return;
2099
+ }
2100
+ this.close();
1846
2101
  }
1847
2102
  }
1848
- onDocumentPointerDown(event) {
1849
- if (!this.open)
1850
- return;
1851
- const target = event.target;
1852
- if (target && !this.elementRef.nativeElement.contains(target)) {
1853
- this.open = false;
2103
+ createOverlay() {
2104
+ this.destroyOverlay();
2105
+ // Create global position strategy at cursor position
2106
+ const positionStrategy = this.overlay
2107
+ .position()
2108
+ .global()
2109
+ .left(`${this.x}px`)
2110
+ .top(`${this.y}px`);
2111
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
2112
+ this.overlayRef = this.overlay.create({
2113
+ positionStrategy,
2114
+ panelClass,
2115
+ });
2116
+ const portal = new TemplatePortal(this.menuTemplateRef, this.viewContainerRef);
2117
+ this.overlayRef.attach(portal);
2118
+ // Close on click outside
2119
+ this.outsideClickSub = this.overlayRef
2120
+ .outsidePointerEvents()
2121
+ .subscribe(() => {
2122
+ this.close();
2123
+ });
2124
+ }
2125
+ close() {
2126
+ this.open = false;
2127
+ this.cdr.markForCheck();
2128
+ this.destroyOverlay();
2129
+ }
2130
+ destroyOverlay() {
2131
+ if (this.outsideClickSub) {
2132
+ this.outsideClickSub.unsubscribe();
2133
+ this.outsideClickSub = null;
2134
+ }
2135
+ if (this.overlayRef) {
2136
+ this.overlayRef.detach();
2137
+ this.overlayRef.dispose();
2138
+ this.overlayRef = null;
1854
2139
  }
1855
2140
  }
1856
2141
  }
1857
- PdmContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1858
- PdmContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmContextMenuComponent, selector: "pdm-context-menu", inputs: { items: "items", className: "className", triggerLabel: "triggerLabel", width: "width", height: "height" }, outputs: { itemSelect: "itemSelect" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<div class=\"relative\" [ngClass]=\"className\" (contextmenu)=\"onContextMenu($event)\">\n <div\n class=\"flex items-center justify-center rounded-md border border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <div\n *ngIf=\"open\"\n class=\"fixed z-[70] min-w-48 max-w-xs rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n [style.left.px]=\"x + 4\"\n [style.top.px]=\"y + 2\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div *ngIf=\"item.type === 'label'\" class=\"px-2 py-1.5 text-sm font-semibold text-foreground\">\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\">\n <svg *ngIf=\"item.checked\" viewBox=\"0 0 24 24\" class=\"h-3.5 w-3.5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.selectedDot\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <svg *ngIf=\"item.showChevron\" viewBox=\"0 0 24 24\" class=\"h-3.5 w-3.5 text-muted-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 6L15 12L9 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2142
+ PdmContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2143
+ PdmContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmContextMenuComponent, selector: "pdm-context-menu", inputs: { items: "items", className: "className", triggerLabel: "triggerLabel", width: "width", height: "height", panelClassName: "panelClassName" }, outputs: { itemSelect: "itemSelect" }, host: { listeners: { "document:keydown.escape": "onDocumentClick()", "document:click": "onDocumentClick()" } }, viewQueries: [{ propertyName: "menuTemplateRef", first: true, predicate: ["menuTemplate"], descendants: true }], ngImport: i0, template: "<div\n class=\"relative\"\n [ngClass]=\"className\"\n (contextmenu)=\"onContextMenu($event)\"\n>\n <div\n class=\"flex items-center justify-center rounded-md border border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-48 max-w-xs rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div\n *ngIf=\"item.type === 'separator'\"\n class=\"-mx-1 my-1 h-px bg-muted\"\n ></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n class=\"px-2 py-1.5 text-sm font-semibold text-foreground\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span\n class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\"\n >\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n <span\n *ngIf=\"item.selectedDot\"\n class=\"h-2 w-2 rounded-full bg-foreground\"\n ></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{\n item.label\n }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{\n item.shortcut\n }}</span>\n <svg\n *ngIf=\"item.showChevron\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1859
2144
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmContextMenuComponent, decorators: [{
1860
2145
  type: Component,
1861
- args: [{ selector: 'pdm-context-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative\" [ngClass]=\"className\" (contextmenu)=\"onContextMenu($event)\">\n <div\n class=\"flex items-center justify-center rounded-md border border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <div\n *ngIf=\"open\"\n class=\"fixed z-[70] min-w-48 max-w-xs rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n [style.left.px]=\"x + 4\"\n [style.top.px]=\"y + 2\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div *ngIf=\"item.type === 'label'\" class=\"px-2 py-1.5 text-sm font-semibold text-foreground\">\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\">\n <svg *ngIf=\"item.checked\" viewBox=\"0 0 24 24\" class=\"h-3.5 w-3.5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.selectedDot\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <svg *ngIf=\"item.showChevron\" viewBox=\"0 0 24 24\" class=\"h-3.5 w-3.5 text-muted-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 6L15 12L9 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n</div>\n" }]
1862
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { items: [{
2146
+ args: [{ selector: "pdm-context-menu", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"relative\"\n [ngClass]=\"className\"\n (contextmenu)=\"onContextMenu($event)\"\n>\n <div\n class=\"flex items-center justify-center rounded-md border border-dashed border-border\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n >\n <span class=\"text-sm font-medium text-foreground\">{{ triggerLabel }}</span>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-48 max-w-xs rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-52\"\n >\n <div>\n <ng-container *ngFor=\"let item of items\">\n <div\n *ngIf=\"item.type === 'separator'\"\n class=\"-mx-1 my-1 h-px bg-muted\"\n ></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n class=\"px-2 py-1.5 text-sm font-semibold text-foreground\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent py-1.5 pr-2 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n [ngClass]=\"item.inset ? 'pl-8' : 'px-2'\"\n (click)=\"select(item)\"\n >\n <span\n class=\"mr-2 inline-flex w-4 shrink-0 items-center justify-center text-foreground\"\n >\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 12.5L9.2 16.7L19 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n <span\n *ngIf=\"item.selectedDot\"\n class=\"h-2 w-2 rounded-full bg-foreground\"\n ></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate text-foreground\">{{\n item.label\n }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{\n item.shortcut\n }}</span>\n <svg\n *ngIf=\"item.showChevron\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-muted-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 6L15 12L9 18\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </ng-container>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:block}\n"] }]
2147
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { items: [{
1863
2148
  type: Input
1864
2149
  }], className: [{
1865
2150
  type: Input
@@ -1869,11 +2154,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
1869
2154
  type: Input
1870
2155
  }], height: [{
1871
2156
  type: Input
2157
+ }], panelClassName: [{
2158
+ type: Input
1872
2159
  }], itemSelect: [{
1873
2160
  type: Output
1874
- }], onEsc: [{
2161
+ }], menuTemplateRef: [{
2162
+ type: ViewChild,
2163
+ args: ["menuTemplate"]
2164
+ }], onDocumentClick: [{
1875
2165
  type: HostListener,
1876
- args: ['document:keydown.escape']
2166
+ args: ["document:keydown.escape"]
2167
+ }, {
2168
+ type: HostListener,
2169
+ args: ["document:click"]
1877
2170
  }] } });
1878
2171
 
1879
2172
  /**
@@ -2045,7 +2338,7 @@ class PdmTableComponent {
2045
2338
  * - data: tabla con bordes y espaciado para data
2046
2339
  * - interactive: tabla con hover, sticky header y estilos interactivos
2047
2340
  */
2048
- this.variant = 'default';
2341
+ this.variant = "default";
2049
2342
  /**
2050
2343
  * Estrategia responsive para la tabla
2051
2344
  * - scroll: scroll horizontal en mobile (default, más simple)
@@ -2053,11 +2346,11 @@ class PdmTableComponent {
2053
2346
  * - stack: convierte filas en cards en mobile (requiere data-label en celdas)
2054
2347
  * - collapse: oculta columnas menos importantes en mobile
2055
2348
  */
2056
- this.responsiveStrategy = 'scroll';
2349
+ this.responsiveStrategy = "scroll";
2057
2350
  /**
2058
2351
  * Clases CSS adicionales para el wrapper
2059
2352
  */
2060
- this.className = '';
2353
+ this.className = "";
2061
2354
  /**
2062
2355
  * Si es true, aplica padding negativo en mobile para scroll edge-to-edge
2063
2356
  * Útil cuando la tabla está dentro de un container con padding
@@ -2065,119 +2358,128 @@ class PdmTableComponent {
2065
2358
  this.fullBleed = false;
2066
2359
  }
2067
2360
  get wrapperClasses() {
2068
- const baseClasses = ['relative', 'w-full'];
2361
+ const baseClasses = ["relative", "w-full"];
2069
2362
  const strategyClasses = this.getResponsiveStrategyClasses();
2070
2363
  const variantClasses = this.getVariantWrapperClasses();
2071
2364
  // Full bleed: scroll edge-to-edge en mobile
2072
- if (this.fullBleed && this.responsiveStrategy === 'scroll') {
2073
- baseClasses.push('-mx-4', 'px-4', 'sm:mx-0', 'sm:px-0');
2365
+ if (this.fullBleed && this.responsiveStrategy === "scroll") {
2366
+ baseClasses.push("-mx-4", "px-4", "sm:mx-0", "sm:px-0");
2074
2367
  }
2075
2368
  return [
2076
2369
  ...baseClasses,
2077
2370
  ...strategyClasses,
2078
2371
  ...variantClasses,
2079
- this.className
2372
+ this.className,
2080
2373
  ].filter(Boolean);
2081
2374
  }
2082
2375
  get tableClasses() {
2083
- const baseClasses = ['w-full', 'caption-bottom', 'text-sm'];
2376
+ const baseClasses = ["w-full", "caption-bottom", "text-sm"];
2084
2377
  const variantClasses = this.getVariantTableClasses();
2085
2378
  const cellClasses = this.getCellClasses();
2086
2379
  return [...baseClasses, ...variantClasses, ...cellClasses].filter(Boolean);
2087
2380
  }
2088
2381
  getResponsiveStrategyClasses() {
2089
2382
  const strategy = TABLE_RESPONSIVE[this.responsiveStrategy];
2090
- if (this.responsiveStrategy === 'scroll') {
2091
- return ['overflow-x-auto'];
2383
+ if (this.responsiveStrategy === "scroll") {
2384
+ return ["overflow-x-auto"];
2092
2385
  }
2093
- if (this.responsiveStrategy === 'wrap') {
2094
- return ['overflow-x-auto'];
2386
+ if (this.responsiveStrategy === "wrap") {
2387
+ return ["overflow-x-auto"];
2095
2388
  }
2096
- if (this.responsiveStrategy === 'stack') {
2389
+ if (this.responsiveStrategy === "stack") {
2097
2390
  // Stack requiere lógica en el template, aquí solo el wrapper
2098
2391
  return [];
2099
2392
  }
2100
- if (this.responsiveStrategy === 'collapse') {
2101
- return ['overflow-x-auto'];
2393
+ if (this.responsiveStrategy === "collapse") {
2394
+ return ["overflow-x-auto"];
2102
2395
  }
2103
- return ['overflow-auto'];
2396
+ return ["overflow-auto"];
2104
2397
  }
2105
2398
  getVariantWrapperClasses() {
2106
- if (this.variant === 'interactive') {
2107
- return ['rounded-xl', 'border', 'border-border', 'bg-background'];
2399
+ if (this.variant === "interactive") {
2400
+ return ["rounded-xl", "border", "border-border", "bg-background"];
2108
2401
  }
2109
- if (this.variant === 'data') {
2110
- return ['rounded-md', 'border', 'border-border', 'bg-background'];
2402
+ if (this.variant === "data") {
2403
+ return ["rounded-md", "border", "border-border", "bg-background"];
2111
2404
  }
2112
2405
  return [];
2113
2406
  }
2114
2407
  getVariantTableClasses() {
2115
- if (this.variant === 'data') {
2408
+ if (this.variant === "data") {
2116
2409
  return [
2117
- 'border-collapse',
2118
- 'text-foreground',
2119
- '[&_thead_tr]:border-b',
2120
- '[&_thead_tr]:border-border',
2121
- '[&_tbody_tr]:border-b',
2122
- '[&_tbody_tr]:border-border',
2123
- '[&_tbody_tr:last-child]:border-b-0',
2124
- '[&_th]:h-10',
2125
- '[&_th]:px-2',
2126
- '[&_th]:text-left',
2127
- '[&_th]:align-middle',
2128
- '[&_th]:font-medium',
2129
- '[&_td]:p-2',
2130
- '[&_td]:align-middle'
2410
+ "border-collapse",
2411
+ "text-foreground",
2412
+ "[&_thead_tr]:border-b",
2413
+ "[&_thead_tr]:border-border",
2414
+ "[&_tbody_tr]:border-b",
2415
+ "[&_tbody_tr]:border-border",
2416
+ "[&_tbody_tr:last-child]:border-b-0",
2417
+ "[&_th]:h-10",
2418
+ "[&_th]:px-2",
2419
+ "[&_th]:text-left",
2420
+ "[&_th]:align-middle",
2421
+ "[&_th]:font-medium",
2422
+ "[&_td]:p-2",
2423
+ "[&_td]:align-middle",
2131
2424
  ];
2132
2425
  }
2133
- if (this.variant === 'interactive') {
2426
+ if (this.variant === "interactive") {
2134
2427
  return [
2135
- 'text-foreground',
2136
- '[&_thead]:sticky',
2137
- '[&_thead]:top-0',
2138
- '[&_thead]:z-10',
2139
- '[&_thead]:bg-muted/70',
2140
- '[&_thead_tr]:border-b',
2141
- '[&_thead_tr]:border-border',
2142
- '[&_th]:h-12',
2143
- '[&_th]:px-4',
2144
- '[&_th]:text-left',
2145
- '[&_th]:align-middle',
2146
- '[&_th]:text-sm',
2147
- '[&_th]:font-medium',
2148
- '[&_tbody_tr]:border-b',
2149
- '[&_tbody_tr]:border-border',
2150
- '[&_tbody_tr]:transition-colors',
2151
- '[&_tbody_tr:hover]:bg-muted/50',
2152
- '[&_tbody_tr:last-child]:border-b-0',
2153
- '[&_td]:h-14',
2154
- '[&_td]:px-4',
2155
- '[&_td]:align-middle',
2156
- '[&_td]:text-sm',
2157
- '[&_svg]:text-muted-foreground'
2428
+ "text-foreground",
2429
+ "[&_thead]:sticky",
2430
+ "[&_thead]:top-0",
2431
+ "[&_thead]:z-10",
2432
+ "[&_thead]:bg-muted/70",
2433
+ "[&_thead_tr]:border-b",
2434
+ "[&_thead_tr]:border-border",
2435
+ "[&_th]:h-12",
2436
+ "[&_th]:px-4",
2437
+ "[&_th]:text-left",
2438
+ "[&_th]:align-middle",
2439
+ "[&_th]:text-sm",
2440
+ "[&_th]:font-medium",
2441
+ "[&_tbody_tr]:border-b",
2442
+ "[&_tbody_tr]:border-border",
2443
+ "[&_tbody_tr]:transition-colors",
2444
+ "[&_tbody_tr:hover]:bg-muted/50",
2445
+ "[&_tbody_tr:last-child]:border-b-0",
2446
+ "[&_td]:h-14",
2447
+ "[&_td]:px-4",
2448
+ "[&_td]:align-middle",
2449
+ "[&_td]:text-sm",
2450
+ "[&_svg]:text-muted-foreground",
2158
2451
  ];
2159
2452
  }
2160
2453
  return [];
2161
2454
  }
2162
2455
  getCellClasses() {
2163
2456
  // Manejo responsive de whitespace
2164
- if (this.responsiveStrategy === 'scroll') {
2457
+ if (this.responsiveStrategy === "scroll") {
2165
2458
  // En scroll, permitir wrap en mobile, nowrap en desktop
2166
- return ['[&_td]:whitespace-normal', '[&_th]:whitespace-normal', 'sm:[&_td]:whitespace-nowrap', 'sm:[&_th]:whitespace-nowrap'];
2459
+ return [
2460
+ "[&_td]:whitespace-normal",
2461
+ "[&_th]:whitespace-normal",
2462
+ "sm:[&_td]:whitespace-nowrap",
2463
+ "sm:[&_th]:whitespace-nowrap",
2464
+ ];
2167
2465
  }
2168
- if (this.responsiveStrategy === 'wrap') {
2466
+ if (this.responsiveStrategy === "wrap") {
2169
2467
  // En wrap, siempre permitir wrap
2170
- return ['[&_td]:whitespace-normal', '[&_td]:break-words', '[&_th]:whitespace-normal'];
2468
+ return [
2469
+ "[&_td]:whitespace-normal",
2470
+ "[&_td]:break-words",
2471
+ "[&_th]:whitespace-normal",
2472
+ ];
2171
2473
  }
2172
2474
  // Default: nowrap (comportamiento anterior para backward compatibility)
2173
2475
  return [];
2174
2476
  }
2175
2477
  }
2176
2478
  PdmTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2177
- PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { variant: "variant", responsiveStrategy: "responsiveStrategy", className: "className", fullBleed: "fullBleed" }, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2479
+ PdmTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTableComponent, selector: "pdm-table", inputs: { variant: "variant", responsiveStrategy: "responsiveStrategy", className: "className", fullBleed: "fullBleed" }, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2178
2480
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTableComponent, decorators: [{
2179
2481
  type: Component,
2180
- args: [{ selector: 'pdm-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
2482
+ args: [{ selector: "pdm-table", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", styles: [":host{display:block}\n"] }]
2181
2483
  }], propDecorators: { variant: [{
2182
2484
  type: Input
2183
2485
  }], responsiveStrategy: [{
@@ -2423,10 +2725,10 @@ class PdmDataTableComponent {
2423
2725
  }
2424
2726
  }
2425
2727
  PdmDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2426
- PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", columns: "columns", responsiveStrategy: "responsiveStrategy", selectable: "selectable", showActions: "showActions", showFilter: "showFilter", showPagination: "showPagination", showColumnSelector: "showColumnSelector", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", previousLabel: "previousLabel", nextLabel: "nextLabel", emptyLabel: "emptyLabel", rowsSelectedLabel: "rowsSelectedLabel", statusLabel: "statusLabel", emailLabel: "emailLabel", amountLabel: "amountLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query", filterFn: "filterFn" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange", columnSort: "columnSort" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div *ngIf=\"showFilter || showColumnSelector\" class=\"flex w-full items-center justify-between gap-2 py-4\">\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button \n *ngIf=\"showColumnSelector\"\n type=\"button\" \n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table \n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\">\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input \n type=\"checkbox\" \n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\" \n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th \n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\">\n \n <!-- Header sortable -->\n <button \n *ngIf=\"column.sortable\"\n type=\"button\" \n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\">\n <span>{{ column.label }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input \n type=\"checkbox\" \n [checked]=\"isSelected(row)\" \n (change)=\"onToggleRow(row, $event)\" \n class=\"h-4 w-4 rounded-sm border border-input\" \n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td \n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\">\n \n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container \n *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: row, value: row[column.key] }\">\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button \n type=\"button\" \n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\" \n (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td \n [attr.colspan]=\"effectiveColumns.length + (selectable ? 1 : 0) + (showActions ? 1 : 0)\" \n class=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div *ngIf=\"showPagination || selectable\" class=\"flex w-full items-center gap-2 py-4 flex-wrap sm:flex-nowrap\">\n <p *ngIf=\"selectable\" class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\">\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button \n type=\"button\" \n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\" \n [disabled]=\"page <= 1\" \n (click)=\"previous()\">\n {{ previousLabel }}\n </button>\n <button \n type=\"button\" \n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\" \n [disabled]=\"page >= totalPages\" \n (click)=\"next()\">\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PdmTableComponent, selector: "pdm-table", inputs: ["variant", "responsiveStrategy", "className", "fullBleed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2728
+ PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", columns: "columns", responsiveStrategy: "responsiveStrategy", selectable: "selectable", showActions: "showActions", showFilter: "showFilter", showPagination: "showPagination", showColumnSelector: "showColumnSelector", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", previousLabel: "previousLabel", nextLabel: "nextLabel", emptyLabel: "emptyLabel", rowsSelectedLabel: "rowsSelectedLabel", statusLabel: "statusLabel", emailLabel: "emailLabel", amountLabel: "amountLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query", filterFn: "filterFn" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange", columnSort: "columnSort" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PdmTableComponent, selector: "pdm-table", inputs: ["variant", "responsiveStrategy", "className", "fullBleed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2427
2729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, decorators: [{
2428
2730
  type: Component,
2429
- args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div *ngIf=\"showFilter || showColumnSelector\" class=\"flex w-full items-center justify-between gap-2 py-4\">\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button \n *ngIf=\"showColumnSelector\"\n type=\"button\" \n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table \n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\">\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input \n type=\"checkbox\" \n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\" \n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th \n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\">\n \n <!-- Header sortable -->\n <button \n *ngIf=\"column.sortable\"\n type=\"button\" \n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\">\n <span>{{ column.label }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input \n type=\"checkbox\" \n [checked]=\"isSelected(row)\" \n (change)=\"onToggleRow(row, $event)\" \n class=\"h-4 w-4 rounded-sm border border-input\" \n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td \n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\">\n \n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container \n *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: row, value: row[column.key] }\">\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button \n type=\"button\" \n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\" \n (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td \n [attr.colspan]=\"effectiveColumns.length + (selectable ? 1 : 0) + (showActions ? 1 : 0)\" \n class=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div *ngIf=\"showPagination || selectable\" class=\"flex w-full items-center gap-2 py-4 flex-wrap sm:flex-nowrap\">\n <p *ngIf=\"selectable\" class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\">\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button \n type=\"button\" \n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\" \n [disabled]=\"page <= 1\" \n (click)=\"previous()\">\n {{ previousLabel }}\n </button>\n <button \n type=\"button\" \n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\" \n [disabled]=\"page >= totalPages\" \n (click)=\"next()\">\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n" }]
2731
+ args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full flex-col', className]\">\n <!-- Toolbar: Filtro + Selector de columnas -->\n <div\n *ngIf=\"showFilter || showColumnSelector\"\n class=\"flex w-full flex-col gap-2 py-4 sm:flex-row sm:items-center\"\n >\n <input\n *ngIf=\"showFilter\"\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button\n *ngIf=\"showColumnSelector\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm whitespace-nowrap\"\n >\n <span>{{ columnsLabel }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 10L12 15L17 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Tabla con responsive -->\n <pdm-table\n variant=\"data\"\n [responsiveStrategy]=\"responsiveStrategy\"\n [fullBleed]=\"false\"\n >\n <thead>\n <tr>\n <!-- Columna de selecci\u00F3n -->\n <th *ngIf=\"selectable\" class=\"w-10 px-2 py-2 text-left font-medium\">\n <input\n type=\"checkbox\"\n (change)=\"onToggleAll($event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </th>\n\n <!-- Columnas din\u00E1micas -->\n <th\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getHeaderClass(column)\"\n [ngStyle]=\"getColumnStyle(column)\"\n >\n <!-- Header sortable -->\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n (click)=\"onSort(column)\"\n class=\"inline-flex appearance-none items-center gap-1 rounded-sm border-0 bg-transparent px-3 py-2 text-sm hover:underline\"\n >\n <span>{{ column.label }}</span>\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 6L4 10L8 14M16 18L20 14L16 10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n ></path>\n </svg>\n </button>\n\n <!-- Header no sortable -->\n <span *ngIf=\"!column.sortable\">{{ column.label }}</span>\n </th>\n\n <!-- Columna de acciones -->\n <th *ngIf=\"showActions\" class=\"w-10 px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <!-- Filas con datos -->\n <tr *ngFor=\"let row of pagedRows\">\n <!-- Celda de selecci\u00F3n -->\n <td *ngIf=\"selectable\" class=\"px-2 py-2\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (change)=\"onToggleRow(row, $event)\"\n class=\"h-4 w-4 rounded-sm border border-input\"\n />\n </td>\n\n <!-- Celdas din\u00E1micas -->\n <td\n *ngFor=\"let column of effectiveColumns\"\n [ngClass]=\"getCellClass(column)\"\n >\n <!-- Template personalizado si existe -->\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\n <ng-container\n *ngTemplateOutlet=\"\n column.cellTemplate;\n context: { $implicit: row, value: row[column.key] }\n \"\n >\n </ng-container>\n </ng-container>\n\n <!-- Renderizado default -->\n <ng-template #defaultCell>\n {{ getCellValue(row, column) }}\n </ng-template>\n </td>\n\n <!-- Celda de acciones -->\n <td *ngIf=\"showActions\" class=\"px-2 py-2\">\n <button\n type=\"button\"\n class=\"inline-flex h-8 w-8 appearance-none items-center justify-center border-0 bg-transparent p-0 hover:text-foreground\"\n (click)=\"onAction(row)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n class=\"h-4 w-4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n\n <!-- Fila vac\u00EDa -->\n <tr *ngIf=\"pagedRows.length === 0\">\n <td\n [attr.colspan]=\"\n effectiveColumns.length +\n (selectable ? 1 : 0) +\n (showActions ? 1 : 0)\n \"\n class=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {{ emptyLabel }}\n </td>\n </tr>\n </tbody>\n </pdm-table>\n\n <!-- Footer: Info + Paginaci\u00F3n -->\n <div\n *ngIf=\"showPagination || selectable\"\n class=\"flex w-full flex-wrap items-center gap-2 py-4 sm:flex-nowrap\"\n >\n <p\n *ngIf=\"selectable\"\n class=\"m-0 flex-1 pr-2 text-sm text-muted-foreground whitespace-nowrap\"\n >\n {{ selectedCount }} of {{ rows.length }} {{ rowsSelectedLabel }}\n </p>\n\n <div *ngIf=\"showPagination\" class=\"flex items-center gap-2 ml-auto\">\n <span class=\"text-sm text-muted-foreground whitespace-nowrap\">\n Page {{ page }} of {{ totalPages }}\n </span>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page <= 1\"\n (click)=\"previous()\"\n >\n {{ previousLabel }}\n </button>\n <button\n type=\"button\"\n class=\"h-9 appearance-none rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n [disabled]=\"page >= totalPages\"\n (click)=\"next()\"\n >\n {{ nextLabel }}\n </button>\n </div>\n </div>\n</section>\n" }]
2430
2732
  }], propDecorators: { className: [{
2431
2733
  type: Input
2432
2734
  }], columns: [{
@@ -2559,8 +2861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2559
2861
 
2560
2862
  let nextDatePickerId = 0;
2561
2863
  class PdmDatePickerComponent {
2562
- constructor(elementRef, cdr, overlay, viewContainerRef) {
2563
- this.elementRef = elementRef;
2864
+ constructor(cdr, overlay, viewContainerRef) {
2564
2865
  this.cdr = cdr;
2565
2866
  this.overlay = overlay;
2566
2867
  this.viewContainerRef = viewContainerRef;
@@ -2571,21 +2872,21 @@ class PdmDatePickerComponent {
2571
2872
  this.triggerFocused = false;
2572
2873
  this.overlayRef = null;
2573
2874
  this.backdropSub = null;
2574
- this.id = '';
2575
- this.variant = 'single';
2576
- this.label = '';
2577
- this.labelClassName = '';
2578
- this.className = '';
2579
- this.triggerClassName = '';
2875
+ this.id = "";
2876
+ this.variant = "single";
2877
+ this.label = "";
2878
+ this.labelClassName = "";
2879
+ this.className = "";
2880
+ this.triggerClassName = "";
2580
2881
  /**
2581
2882
  * Additional CSS classes applied to the overlay panel.
2582
2883
  * Backward-compatible: mapped to `overlayOptions.panelClass` when `overlayOptions` is not set.
2583
2884
  * When both are supplied, `overlayOptions.panelClass` takes precedence.
2584
2885
  */
2585
- this.panelClassName = '';
2586
- this.placeholder = 'Pick a date';
2587
- this.rangePlaceholder = 'Pick a date range';
2588
- this.format = 'MMM d, yyyy';
2886
+ this.panelClassName = "";
2887
+ this.placeholder = "Pick a date";
2888
+ this.rangePlaceholder = "Pick a date range";
2889
+ this.format = "MMM d, yyyy";
2589
2890
  this.disabled = false;
2590
2891
  this.readonly = false;
2591
2892
  this.required = false;
@@ -2606,7 +2907,7 @@ class PdmDatePickerComponent {
2606
2907
  set open(value) {
2607
2908
  if (this._open === !!value)
2608
2909
  return;
2609
- if (!!value) {
2910
+ if (value) {
2610
2911
  this.openPanel();
2611
2912
  }
2612
2913
  else {
@@ -2627,7 +2928,7 @@ class PdmDatePickerComponent {
2627
2928
  this._rangeValue = value
2628
2929
  ? {
2629
2930
  start: this.normalizeDate(value.start),
2630
- end: this.normalizeDate(value.end)
2931
+ end: this.normalizeDate(value.end),
2631
2932
  }
2632
2933
  : null;
2633
2934
  this.cdr.markForCheck();
@@ -2639,7 +2940,7 @@ class PdmDatePickerComponent {
2639
2940
  this.destroyOverlay();
2640
2941
  }
2641
2942
  get resolvedVariant() {
2642
- return this.variant === 'range' ? 'range' : 'single';
2943
+ return this.variant === "range" ? "range" : "single";
2643
2944
  }
2644
2945
  get triggerId() {
2645
2946
  return this.id || `${this.instanceId}-trigger`;
@@ -2648,13 +2949,13 @@ class PdmDatePickerComponent {
2648
2949
  return `${this.id || this.instanceId}-panel`;
2649
2950
  }
2650
2951
  get hasSingleValue() {
2651
- return this.resolvedVariant === 'single' && !!this._value;
2952
+ return this.resolvedVariant === "single" && !!this._value;
2652
2953
  }
2653
2954
  get hasRangeValue() {
2654
- return this.resolvedVariant === 'range' && !!this._rangeValue?.start;
2955
+ return this.resolvedVariant === "range" && !!this._rangeValue?.start;
2655
2956
  }
2656
2957
  get displayText() {
2657
- if (this.resolvedVariant === 'single') {
2958
+ if (this.resolvedVariant === "single") {
2658
2959
  return this._value ? this.formatDate(this._value) : this.placeholder;
2659
2960
  }
2660
2961
  const start = this._rangeValue?.start ?? null;
@@ -2668,29 +2969,29 @@ class PdmDatePickerComponent {
2668
2969
  return `${this.formatDate(start)} - ${this.formatDate(end)}`;
2669
2970
  }
2670
2971
  get textClasses() {
2671
- const hasValue = this.resolvedVariant === 'single' ? this.hasSingleValue : this.hasRangeValue;
2972
+ const hasValue = this.resolvedVariant === "single"
2973
+ ? this.hasSingleValue
2974
+ : this.hasRangeValue;
2672
2975
  return [
2673
- 'min-w-0 flex-1 truncate text-left text-sm leading-5',
2674
- hasValue ? 'text-foreground' : 'text-muted-foreground'
2976
+ "min-w-0 flex-1 truncate text-left text-sm leading-5",
2977
+ hasValue ? "text-foreground" : "text-muted-foreground",
2675
2978
  ];
2676
2979
  }
2677
2980
  get rootClasses() {
2678
2981
  return [
2679
- 'grid gap-2',
2680
- this.resolvedVariant === 'range' ? 'w-[280px]' : 'w-[197px]',
2681
- this.className
2982
+ "grid gap-2",
2983
+ this.resolvedVariant === "range" ? "w-[280px]" : "w-[197px]",
2984
+ this.className,
2682
2985
  ];
2683
2986
  }
2684
2987
  get triggerClasses() {
2685
2988
  const focusStyle = this._open || this.triggerFocused;
2686
2989
  return [
2687
- 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive relative flex w-full appearance-none items-center gap-2 overflow-hidden rounded-lg border bg-background px-3 py-[7.5px] text-left text-sm shadow-sm outline-none transition-colors',
2688
- 'min-h-[36px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
2689
- focusStyle
2690
- ? 'border-ring ring-2 ring-ring/50'
2691
- : '',
2692
- this.invalid ? 'border-destructive ring-destructive/20' : '',
2693
- this.triggerClassName
2990
+ "border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive relative flex w-full appearance-none items-center gap-2 overflow-hidden rounded-lg border bg-background px-3 py-[7.5px] text-left text-sm shadow-sm outline-none transition-colors",
2991
+ "min-h-[36px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
2992
+ focusStyle ? "border-ring ring-2 ring-ring/50" : "",
2993
+ this.invalid ? "border-destructive ring-destructive/20" : "",
2994
+ this.triggerClassName,
2694
2995
  ];
2695
2996
  }
2696
2997
  toggleOpen() {
@@ -2721,16 +3022,22 @@ class PdmDatePickerComponent {
2721
3022
  this._rangeValue = value
2722
3023
  ? {
2723
3024
  start: this.normalizeDate(value.start),
2724
- end: this.normalizeDate(value.end)
3025
+ end: this.normalizeDate(value.end),
2725
3026
  }
2726
3027
  : null;
2727
3028
  this.rangeValueChange.emit(this._rangeValue
2728
3029
  ? {
2729
- start: this._rangeValue.start ? this.cloneDate(this._rangeValue.start) : null,
2730
- end: this._rangeValue.end ? this.cloneDate(this._rangeValue.end) : null
3030
+ start: this._rangeValue.start
3031
+ ? this.cloneDate(this._rangeValue.start)
3032
+ : null,
3033
+ end: this._rangeValue.end
3034
+ ? this.cloneDate(this._rangeValue.end)
3035
+ : null,
2731
3036
  }
2732
3037
  : null);
2733
- if (this.closeOnSelect && this._rangeValue?.start && this._rangeValue?.end) {
3038
+ if (this.closeOnSelect &&
3039
+ this._rangeValue?.start &&
3040
+ this._rangeValue?.end) {
2734
3041
  this.setOpen(false);
2735
3042
  return;
2736
3043
  }
@@ -2765,20 +3072,26 @@ class PdmDatePickerComponent {
2765
3072
  this.openChange.emit(true);
2766
3073
  this.cdr.markForCheck();
2767
3074
  const positionStrategy = createFlexiblePositionStrategy(this.overlay, triggerEl, 8);
2768
- // Resolve panelClass: overlayOptions.panelClass wins; otherwise map panelClassName.
3075
+ // CRITICAL: Use mergeOverlayPanelClass to ensure z-index is never lost.
3076
+ // Consumer classes are appended AFTER base z-index.
3077
+ const zIndexEnforced = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
3078
+ // Resolve panelClass: overlayOptions.panelClass wins; otherwise use z-index enforced.
2769
3079
  const resolvedPanelClass = this.overlayOptions?.panelClass
2770
- ?? (this.panelClassName ? ['block', this.panelClassName] : ['block']);
3080
+ ? mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.overlayOptions.panelClass)
3081
+ : zIndexEnforced;
2771
3082
  this.overlayRef = this.overlay.create({
2772
3083
  positionStrategy,
2773
3084
  scrollStrategy: this.overlay.scrollStrategies.reposition(),
2774
- // Consumer overrides are spread last — they win over every default above.
3085
+ // Consumer overrides are spread first.
2775
3086
  ...this.overlayOptions,
2776
- // panelClass always overrides last: it already merges panelClassName + overlayOptions.
2777
- panelClass: resolvedPanelClass
3087
+ // panelClass always enforced last to preserve z-index.
3088
+ panelClass: resolvedPanelClass,
2778
3089
  });
2779
3090
  const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
2780
3091
  this.overlayRef.attach(portal);
2781
- this.backdropSub = this.overlayRef.outsidePointerEvents().subscribe((event) => {
3092
+ this.backdropSub = this.overlayRef
3093
+ .outsidePointerEvents()
3094
+ .subscribe((event) => {
2782
3095
  const target = event.target;
2783
3096
  if (!triggerEl.contains(target)) {
2784
3097
  this.closePanel();
@@ -2806,10 +3119,10 @@ class PdmDatePickerComponent {
2806
3119
  }
2807
3120
  formatDate(date) {
2808
3121
  try {
2809
- return format(date, this.format || 'MMM d, yyyy');
3122
+ return format(date, this.format || "MMM d, yyyy");
2810
3123
  }
2811
3124
  catch {
2812
- return format(date, 'MMM d, yyyy');
3125
+ return format(date, "MMM d, yyyy");
2813
3126
  }
2814
3127
  }
2815
3128
  normalizeDate(value) {
@@ -2822,17 +3135,17 @@ class PdmDatePickerComponent {
2822
3135
  return new Date(date.getFullYear(), date.getMonth(), date.getDate());
2823
3136
  }
2824
3137
  }
2825
- PdmDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
3138
+ PdmDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
2826
3139
  PdmDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDatePickerComponent, selector: "pdm-date-picker", inputs: { id: "id", variant: "variant", label: "label", labelClassName: "labelClassName", className: "className", triggerClassName: "triggerClassName", panelClassName: "panelClassName", overlayOptions: "overlayOptions", placeholder: "placeholder", rangePlaceholder: "rangePlaceholder", format: "format", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", allowSameDayRange: "allowSameDayRange", closeOnSelect: "closeOnSelect", minDate: "minDate", maxDate: "maxDate", minYear: "minYear", maxYear: "maxYear", disabledDates: "disabledDates", isDateDisabled: "isDateDisabled", open: "open", value: "value", rangeValue: "rangeValue" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", openChange: "openChange", monthChange: "monthChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n</div>\n\n<ng-template #panelTemplate>\n <div [id]=\"panelId\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmCalendarComponent, selector: "pdm-calendar", inputs: ["variant", "className", "disabledDates", "minDate", "maxDate", "minYear", "maxYear", "isDateDisabled", "allowSameDayRange", "readonly", "value", "rangeValue", "month"], outputs: ["valueChange", "rangeValueChange", "monthChange", "dateClick", "disabledDateClick"] }, { kind: "component", type: PdmLabelComponent, selector: "pdm-label", inputs: ["forId", "required", "className"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2827
3140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, decorators: [{
2828
3141
  type: Component,
2829
- args: [{ selector: 'pdm-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n</div>\n\n<ng-template #panelTemplate>\n <div [id]=\"panelId\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n</ng-template>\n" }]
2830
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerRef: [{
3142
+ args: [{ selector: "pdm-date-picker", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n</div>\n\n<ng-template #panelTemplate>\n <div [id]=\"panelId\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n</ng-template>\n" }]
3143
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerRef: [{
2831
3144
  type: ViewChild,
2832
- args: ['triggerEl']
3145
+ args: ["triggerEl"]
2833
3146
  }], panelTemplateRef: [{
2834
3147
  type: ViewChild,
2835
- args: ['panelTemplate']
3148
+ args: ["panelTemplate"]
2836
3149
  }], id: [{
2837
3150
  type: Input
2838
3151
  }], variant: [{
@@ -2895,7 +3208,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2895
3208
  type: Input
2896
3209
  }], onEscape: [{
2897
3210
  type: HostListener,
2898
- args: ['document:keydown.escape']
3211
+ args: ["document:keydown.escape"]
2899
3212
  }] } });
2900
3213
 
2901
3214
  /**
@@ -2905,15 +3218,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2905
3218
  * 1. base (z-0) - Elementos normales del DOM
2906
3219
  * 2. dropdown (z-10) - Selects, combobox, date-pickers
2907
3220
  * 3. sticky (z-20) - Headers, navigation bars
2908
- * 4. overlay (z-30) - Popovers, hover cards, context menus
3221
+ * 4. drawerBackdrop (z-30) - Backdrop de drawers
2909
3222
  * 5. drawer (z-40) - Sidebar drawer, sheets laterales
2910
- * 6. modal (z-50) - Dialogs, alert-dialogs
2911
- * 7. modal-backdrop (z-40) - Backdrop de modals
2912
- * 8. popover (z-60) - Tooltips, dropdowns DENTRO de modals
3223
+ * 6. modalBackdrop (z-40) - Backdrop de modals ( mismo nivel que drawer)
3224
+ * 7. modal (z-50) - Dialogs, alert-dialogs
3225
+ * 8. popover (z-[70]) - Tooltips, dropdowns DENTRO de modals
2913
3226
  * 9. toast (z-[100]) - Notificaciones que deben estar sobre TODO
2914
3227
  *
2915
3228
  * REGLA CRÍTICA:
2916
- * - Componentes overlay (select options, dropdown menu, tooltip) SIEMPRE z-60 o mayor
3229
+ * - Componentes overlay (select options, dropdown menu, tooltip) SIEMPRE z-[70] o mayor
2917
3230
  * - Esto permite que funcionen DENTRO de modals (z-50)
2918
3231
  * - Backdrop de modal debe ser z-40 para estar DEBAJO del contenido del modal (z-50)
2919
3232
  */
@@ -2921,57 +3234,53 @@ const Z_INDEX = {
2921
3234
  /**
2922
3235
  * Base - contenido normal del DOM
2923
3236
  */
2924
- base: 'z-0',
3237
+ base: "z-0",
2925
3238
  /**
2926
3239
  * Dropdown - Selects, combobox, date-pickers
2927
- * Debe estar SOBRE contenido normal pero BAJO modals
3240
+ * Debe estar SOBRE contenido normal pero BAJO overlays
2928
3241
  */
2929
- dropdown: 'z-10',
3242
+ dropdown: "z-10",
2930
3243
  /**
2931
3244
  * Sticky - Headers, navigation fija
2932
3245
  */
2933
- sticky: 'z-20',
2934
- /**
2935
- * Overlay - Popovers, hover cards, context menus
2936
- * Debe estar SOBRE sticky pero BAJO modals
2937
- */
2938
- overlay: 'z-30',
3246
+ sticky: "z-20",
2939
3247
  /**
2940
3248
  * Drawer backdrop - Backdrop de sidebar drawer
2941
- * Debe estar DEBAJO del drawer panel
3249
+ * Debe estar DEBAJO del drawer panel y DEBAJO de modals
2942
3250
  */
2943
- drawerBackdrop: 'z-40',
3251
+ drawerBackdrop: "z-30",
2944
3252
  /**
2945
3253
  * Drawer - Sidebar drawer, sheets laterales
2946
3254
  * Debe estar SOBRE su backdrop pero BAJO modals
2947
3255
  */
2948
- drawer: 'z-50',
3256
+ drawer: "z-40",
2949
3257
  /**
2950
3258
  * Modal backdrop - Backdrop de dialogs
2951
- * Debe estar SOBRE drawers pero DEBAJO del contenido del modal
3259
+ * Mismo nivel que drawer backdrop (z-40)
2952
3260
  */
2953
- modalBackdrop: 'z-50',
3261
+ modalBackdrop: "z-40",
2954
3262
  /**
2955
- * Modal - Dialogs, alert-dialogs, sheets
3263
+ * Modal - Dialogs, alert-dialogs
2956
3264
  * Debe estar SOBRE su backdrop
2957
3265
  */
2958
- modal: 'z-[60]',
3266
+ modal: "z-50",
2959
3267
  /**
2960
3268
  * Popover - Tooltips, dropdowns, selects options DENTRO de modals
2961
3269
  * CRÍTICO: Debe ser MAYOR que modal (z-50) para aparecer sobre modals
3270
+ * USAR SIEMPRE mergeOverlayPanelClass() para asegurar este valor
2962
3271
  */
2963
- popover: 'z-[70]',
3272
+ popover: "z-[70]",
2964
3273
  /**
2965
3274
  * Toast - Notificaciones globales
2966
3275
  * Debe estar sobre TODO
2967
3276
  */
2968
- toast: 'z-[100]'
3277
+ toast: "z-[100]",
2969
3278
  };
2970
3279
  /**
2971
3280
  * Helper para debugging z-index issues
2972
3281
  */
2973
3282
  function logZIndexStack(element) {
2974
- if (typeof window === 'undefined')
3283
+ if (typeof window === "undefined")
2975
3284
  return;
2976
3285
  let current = element;
2977
3286
  const stack = [];
@@ -2979,11 +3288,12 @@ function logZIndexStack(element) {
2979
3288
  const computed = window.getComputedStyle(current);
2980
3289
  const zIndex = computed.zIndex;
2981
3290
  const position = computed.position;
2982
- if (zIndex !== 'auto') {
3291
+ if (zIndex !== "auto") {
2983
3292
  stack.push({
2984
- element: current.tagName + (current.className ? `.${current.className.split(' ')[0]}` : ''),
3293
+ element: current.tagName +
3294
+ (current.className ? `.${current.className.split(" ")[0]}` : ""),
2985
3295
  zIndex,
2986
- position
3296
+ position,
2987
3297
  });
2988
3298
  }
2989
3299
  current = current.parentElement;
@@ -3014,7 +3324,7 @@ function logZIndexStack(element) {
3014
3324
  class PdmDialogComponent {
3015
3325
  constructor() {
3016
3326
  this.open = false;
3017
- this.variant = 'default';
3327
+ this.variant = "default";
3018
3328
  /**
3019
3329
  * Tamaño del dialog
3020
3330
  * - responsive: fullscreen mobile, modal desktop (recomendado)
@@ -3024,21 +3334,21 @@ class PdmDialogComponent {
3024
3334
  * - xl: 800px max
3025
3335
  * - desktop/mobile/mobile-fullscreen: legacy, deprecado
3026
3336
  */
3027
- this.size = 'responsive';
3028
- this.title = 'Edit profile';
3029
- this.description = '';
3337
+ this.size = "responsive";
3338
+ this.title = "Edit profile";
3339
+ this.description = "";
3030
3340
  this.closeOnBackdrop = true;
3031
3341
  this.closeOnEsc = true;
3032
3342
  this.showCloseButton = true;
3033
3343
  this.showHeader = true;
3034
3344
  this.showFooter = true;
3035
- this.primaryActionText = 'Save changes';
3036
- this.secondaryActionText = 'Cancel';
3037
- this.alignFooter = 'right';
3038
- this.headerClassName = '';
3039
- this.bodyClassName = '';
3040
- this.footerClassName = '';
3041
- this.className = '';
3345
+ this.primaryActionText = "Save changes";
3346
+ this.secondaryActionText = "Cancel";
3347
+ this.alignFooter = "right";
3348
+ this.headerClassName = "";
3349
+ this.bodyClassName = "";
3350
+ this.footerClassName = "";
3351
+ this.className = "";
3042
3352
  this.openChange = new EventEmitter();
3043
3353
  this.primaryAction = new EventEmitter();
3044
3354
  this.secondaryAction = new EventEmitter();
@@ -3064,131 +3374,148 @@ class PdmDialogComponent {
3064
3374
  }
3065
3375
  get panelClassName() {
3066
3376
  // Legacy sizes (backward compatibility)
3067
- if (this.size === 'desktop') {
3068
- return this.buildClasses(['max-w-[640px]', 'max-h-[calc(100vh-2rem)]', 'rounded-[10px]']);
3377
+ if (this.size === "desktop") {
3378
+ return this.buildPanelClasses([
3379
+ "max-w-[640px]",
3380
+ "max-h-[calc(100vh-2rem)]",
3381
+ "rounded-[10px]",
3382
+ ]);
3069
3383
  }
3070
- if (this.size === 'mobile') {
3071
- return this.buildClasses(['max-w-[320px]', 'min-h-[240px]', 'rounded-[10px]']);
3384
+ if (this.size === "mobile") {
3385
+ return this.buildPanelClasses([
3386
+ "max-w-[320px]",
3387
+ "min-h-[240px]",
3388
+ "rounded-[10px]",
3389
+ ]);
3072
3390
  }
3073
- if (this.size === 'mobile-fullscreen') {
3074
- return this.buildClasses(['max-w-[320px]', 'h-[min(100dvh,640px)]', 'rounded-none', 'sm:rounded-[10px]']);
3391
+ if (this.size === "mobile-fullscreen") {
3392
+ return this.buildPanelClasses([
3393
+ "max-w-[320px]",
3394
+ "h-[min(100dvh,640px)]",
3395
+ "rounded-none",
3396
+ "sm:rounded-[10px]",
3397
+ ]);
3075
3398
  }
3076
3399
  // New responsive mode (recomendado)
3077
- if (this.size === 'responsive') {
3078
- return this.buildClasses([
3400
+ if (this.size === "responsive") {
3401
+ return this.buildPanelClasses([
3079
3402
  // Mobile: fullscreen con bordes redondeados solo arriba
3080
- 'w-full',
3081
- 'h-full',
3082
- 'max-h-[100dvh]',
3083
- 'rounded-t-[10px]',
3084
- 'sm:rounded-[10px]',
3403
+ "w-full",
3404
+ "h-full",
3405
+ "max-h-[100dvh]",
3406
+ "rounded-t-[10px]",
3407
+ "sm:rounded-[10px]",
3085
3408
  // Desktop: modal centrado
3086
- 'sm:w-auto',
3087
- 'sm:h-auto',
3088
- 'sm:max-w-[640px]',
3089
- 'sm:max-h-[calc(100vh-4rem)]'
3409
+ "sm:w-auto",
3410
+ "sm:h-auto",
3411
+ "sm:max-w-[640px]",
3412
+ "sm:max-h-[calc(100vh-4rem)]",
3090
3413
  ]);
3091
3414
  }
3092
3415
  // New size options
3093
3416
  const sizeMap = {
3094
- sm: 'sm:max-w-[400px]',
3095
- md: 'sm:max-w-[500px]',
3096
- lg: 'sm:max-w-[640px]',
3097
- xl: 'sm:max-w-[800px]'
3417
+ sm: "sm:max-w-[400px]",
3418
+ md: "sm:max-w-[500px]",
3419
+ lg: "sm:max-w-[640px]",
3420
+ xl: "sm:max-w-[800px]",
3098
3421
  };
3099
3422
  const maxWidth = sizeMap[this.size] || sizeMap.lg;
3100
- return this.buildClasses([
3423
+ return this.buildPanelClasses([
3101
3424
  // Mobile: fullscreen
3102
- 'w-full',
3103
- 'h-full',
3104
- 'max-h-[100dvh]',
3105
- 'rounded-t-[10px]',
3425
+ "w-full",
3426
+ "h-full",
3427
+ "max-h-[100dvh]",
3428
+ "rounded-t-[10px]",
3106
3429
  // Desktop: modal
3107
- 'sm:rounded-[10px]',
3108
- 'sm:w-auto',
3109
- 'sm:h-auto',
3430
+ "sm:rounded-[10px]",
3431
+ "sm:w-auto",
3432
+ "sm:h-auto",
3110
3433
  maxWidth,
3111
- 'sm:max-h-[calc(100vh-4rem)]'
3434
+ "sm:max-h-[calc(100vh-4rem)]",
3112
3435
  ]);
3113
3436
  }
3114
- buildClasses(sizeClasses) {
3437
+ buildPanelClasses(sizeClasses) {
3115
3438
  const base = [
3116
- 'relative',
3439
+ "relative",
3117
3440
  Z_INDEX.modal,
3118
- 'flex',
3119
- 'flex-col',
3120
- 'border',
3121
- 'border-border',
3122
- 'bg-background',
3123
- 'text-foreground',
3124
- 'shadow-lg',
3125
- 'overflow-hidden',
3441
+ "flex",
3442
+ "flex-col",
3443
+ "border",
3444
+ "border-border",
3445
+ "bg-background",
3446
+ "text-foreground",
3447
+ "shadow-lg",
3448
+ "overflow-hidden",
3126
3449
  ...sizeClasses,
3127
- this.className
3450
+ this.className,
3128
3451
  ];
3129
- return base.filter(Boolean).join(' ');
3452
+ return base.filter(Boolean).join(" ");
3130
3453
  }
3131
3454
  get bodyWrapperClassName() {
3455
+ // min-h-0 is CRITICAL for flex child to shrink and allow internal scroll
3132
3456
  const base = [
3133
- 'flex-1',
3134
- 'overflow-y-auto',
3135
- 'px-4',
3136
- 'py-6',
3137
- 'sm:px-6',
3138
- this.bodyClassName
3457
+ "flex-1",
3458
+ "min-h-0",
3459
+ "overflow-y-auto",
3460
+ "px-4",
3461
+ "py-6",
3462
+ "sm:px-6",
3463
+ this.bodyClassName,
3139
3464
  ];
3140
- return base.filter(Boolean).join(' ');
3465
+ return base.filter(Boolean).join(" ");
3141
3466
  }
3142
3467
  get headerWrapperClassName() {
3143
3468
  const base = [
3144
- 'flex',
3145
- 'items-start',
3146
- 'justify-between',
3147
- 'gap-3',
3148
- 'p-4',
3149
- 'sm:p-6',
3150
- 'border-b',
3151
- 'border-border',
3152
- this.headerClassName
3469
+ "flex",
3470
+ "items-start",
3471
+ "justify-between",
3472
+ "gap-3",
3473
+ "p-4",
3474
+ "sm:p-6",
3475
+ "border-b",
3476
+ "border-border",
3477
+ this.headerClassName,
3153
3478
  ];
3154
- return base.filter(Boolean).join(' ');
3479
+ return base.filter(Boolean).join(" ");
3155
3480
  }
3156
3481
  get footerWrapperClassName() {
3157
- const effectiveAlign = this.alignFooter === 'right' && this.variant === 'custom-close' ? 'left' : this.alignFooter;
3482
+ const effectiveAlign = this.alignFooter === "right" && this.variant === "custom-close"
3483
+ ? "left"
3484
+ : this.alignFooter;
3158
3485
  const base = [
3159
- 'p-4',
3160
- 'sm:p-6',
3161
- 'border-t',
3162
- 'border-border',
3486
+ "p-4",
3487
+ "sm:p-6",
3488
+ "border-t",
3489
+ "border-border",
3163
3490
  // Mobile: siempre full-width
3164
- 'flex',
3165
- 'flex-col',
3166
- 'gap-2',
3491
+ "flex",
3492
+ "flex-col",
3493
+ "gap-2",
3167
3494
  // Desktop: según alignFooter
3168
- effectiveAlign === 'full-width'
3169
- ? 'sm:flex-col'
3170
- : 'sm:flex-row sm:items-center',
3171
- effectiveAlign === 'left' ? 'sm:justify-start' : '',
3172
- effectiveAlign === 'right' ? 'sm:justify-end' : '',
3173
- this.footerClassName
3495
+ effectiveAlign === "full-width"
3496
+ ? "sm:flex-col"
3497
+ : "sm:flex-row sm:items-center",
3498
+ effectiveAlign === "left" ? "sm:justify-start" : "",
3499
+ effectiveAlign === "right" ? "sm:justify-end" : "",
3500
+ this.footerClassName,
3174
3501
  ];
3175
- return base.filter(Boolean).join(' ');
3502
+ return base.filter(Boolean).join(" ");
3176
3503
  }
3177
3504
  get containerClassName() {
3178
- // Container con backdrop z-50
3505
+ // Container con backdrop z-40
3179
3506
  // Mobile: fullscreen desde el bottom
3180
3507
  // Desktop: centrado
3181
3508
  return responsive({
3182
3509
  default: `fixed inset-x-0 bottom-0 ${Z_INDEX.modalBackdrop} flex items-end justify-center`,
3183
- sm: `fixed inset-0 ${Z_INDEX.modalBackdrop} flex items-center justify-center p-4`
3510
+ sm: `fixed inset-0 ${Z_INDEX.modalBackdrop} flex items-center justify-center p-4`,
3184
3511
  });
3185
3512
  }
3186
3513
  }
3187
3514
  PdmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3188
- PdmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDialogComponent, selector: "pdm-dialog", inputs: { open: "open", variant: "variant", size: "size", title: "title", description: "description", closeOnBackdrop: "closeOnBackdrop", closeOnEsc: "closeOnEsc", showCloseButton: "showCloseButton", showHeader: "showHeader", showFooter: "showFooter", primaryActionText: "primaryActionText", secondaryActionText: "secondaryActionText", alignFooter: "alignFooter", headerClassName: "headerClassName", bodyClassName: "bodyClassName", footerClassName: "footerClassName", className: "className" }, outputs: { openChange: "openChange", primaryAction: "primaryAction", secondaryAction: "secondaryAction" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3515
+ PdmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDialogComponent, selector: "pdm-dialog", inputs: { open: "open", variant: "variant", size: "size", title: "title", description: "description", closeOnBackdrop: "closeOnBackdrop", closeOnEsc: "closeOnEsc", showCloseButton: "showCloseButton", showHeader: "showHeader", showFooter: "showFooter", primaryActionText: "primaryActionText", secondaryActionText: "secondaryActionText", alignFooter: "alignFooter", headerClassName: "headerClassName", bodyClassName: "bodyClassName", footerClassName: "footerClassName", className: "className" }, outputs: { openChange: "openChange", primaryAction: "primaryAction", secondaryAction: "secondaryAction" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3189
3516
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDialogComponent, decorators: [{
3190
3517
  type: Component,
3191
- args: [{ selector: 'pdm-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n" }]
3518
+ args: [{ selector: "pdm-dialog", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"open\" [ngClass]=\"containerClassName\">\n <!-- Backdrop -->\n <div class=\"absolute inset-0 bg-foreground/30 backdrop-blur-sm\" (click)=\"onBackdropClick()\"></div>\n \n <!-- Dialog Panel -->\n <section role=\"dialog\" aria-modal=\"true\" [ngClass]=\"panelClassName\">\n <!-- Header -->\n <div *ngIf=\"showHeader\" [ngClass]=\"headerWrapperClassName\">\n <div class=\"min-w-0 flex-1\">\n <h2 class=\"m-0 text-lg font-semibold leading-none tracking-tight text-foreground\">{{ title }}</h2>\n <p *ngIf=\"description\" class=\"m-0 mt-2 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n <button\n *ngIf=\"showCloseButton\"\n type=\"button\"\n class=\"inline-flex h-6 w-6 flex-shrink-0 appearance-none items-center justify-center rounded-sm border-0 bg-transparent p-0 text-foreground opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\"\n (click)=\"close()\"\n aria-label=\"Close dialog\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div [ngClass]=\"bodyWrapperClassName\">\n <ng-content></ng-content>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"showFooter\" [ngClass]=\"footerWrapperClassName\">\n <ng-container *ngIf=\"variant === 'custom-close'; else defaultActions\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n </ng-container>\n\n <ng-template #defaultActions>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm sm:w-auto\"\n (click)=\"onSecondaryAction()\"\n >\n {{ secondaryActionText }}\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-9 w-full appearance-none items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm sm:w-auto\"\n (click)=\"onPrimaryAction()\"\n >\n {{ primaryActionText }}\n </button>\n </ng-template>\n </div>\n </section>\n</div>\n", styles: [":host{display:block}\n"] }]
3192
3519
  }], propDecorators: { open: [{
3193
3520
  type: Input
3194
3521
  }], variant: [{
@@ -3231,7 +3558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
3231
3558
  type: Output
3232
3559
  }], onEsc: [{
3233
3560
  type: HostListener,
3234
- args: ['document:keydown.escape']
3561
+ args: ["document:keydown.escape"]
3235
3562
  }] } });
3236
3563
 
3237
3564
  /**
@@ -3682,12 +4009,12 @@ class PdmDropdownMenuComponent {
3682
4009
  }
3683
4010
  }
3684
4011
  }
3685
- PdmDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
4012
+ PdmDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
3686
4013
  PdmDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDropdownMenuComponent, selector: "pdm-dropdown-menu", inputs: { triggerText: "triggerText", variant: "variant", items: "items", closeOnSelect: "closeOnSelect", className: "className", panelClassName: "panelClassName", overlayOptions: "overlayOptions" }, outputs: { itemSelect: "itemSelect", itemsChange: "itemsChange" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<button\n #triggerEl\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n ]\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n>\n {{ triggerText }}\n</button>\n\n<ng-template #panelTemplate>\n <div\n class=\"min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <ng-container *ngFor=\"let item of resolvedItems\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n [ngClass]=\"['px-2 py-1.5 text-sm font-semibold text-foreground', item.inset ? 'pl-8' : '']\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative flex w-full appearance-none cursor-default select-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',\n item.inset ? 'pl-8' : ''\n ]\"\n (click)=\"select(item)\"\n >\n <span class=\"inline-flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.radioSelected\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <span *ngIf=\"item.showChevron\" class=\"text-sm text-muted-foreground\">\u203A</span>\n </button>\n </ng-container>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3687
4014
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDropdownMenuComponent, decorators: [{
3688
4015
  type: Component,
3689
4016
  args: [{ selector: 'pdm-dropdown-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n #triggerEl\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n ]\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggle()\"\n>\n {{ triggerText }}\n</button>\n\n<ng-template #panelTemplate>\n <div\n class=\"min-w-32 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <ng-container *ngFor=\"let item of resolvedItems\">\n <div *ngIf=\"item.type === 'separator'\" class=\"-mx-1 my-1 h-px bg-muted\"></div>\n\n <div\n *ngIf=\"item.type === 'label'\"\n [ngClass]=\"['px-2 py-1.5 text-sm font-semibold text-foreground', item.inset ? 'pl-8' : '']\"\n >\n {{ item.label }}\n </div>\n\n <button\n *ngIf=\"!item.type || item.type === 'item'\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative flex w-full appearance-none cursor-default select-none items-center gap-2 rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50',\n item.inset ? 'pl-8' : ''\n ]\"\n (click)=\"select(item)\"\n >\n <span class=\"inline-flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg\n *ngIf=\"item.checked\"\n viewBox=\"0 0 24 24\"\n class=\"h-3.5 w-3.5 text-foreground\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5 12.5L9.2 16.7L19 7\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <span *ngIf=\"item.radioSelected\" class=\"h-2 w-2 rounded-full bg-foreground\"></span>\n </span>\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <span *ngIf=\"item.shortcut\" class=\"text-xs text-muted-foreground\">{{ item.shortcut }}</span>\n <span *ngIf=\"item.showChevron\" class=\"text-sm text-muted-foreground\">\u203A</span>\n </button>\n </ng-container>\n </div>\n</ng-template>\n" }]
3690
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerText: [{
4017
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { triggerText: [{
3691
4018
  type: Input
3692
4019
  }], variant: [{
3693
4020
  type: Input
@@ -4044,35 +4371,178 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4044
4371
  }] } });
4045
4372
 
4046
4373
  class PdmHoverCardComponent {
4047
- constructor() {
4048
- this.className = '';
4049
- this.panelClassName = '';
4050
- this.side = 'bottom';
4051
- this.align = 'start';
4374
+ constructor(overlay, viewContainerRef, elementRef, cdr) {
4375
+ this.overlay = overlay;
4376
+ this.viewContainerRef = viewContainerRef;
4377
+ this.elementRef = elementRef;
4378
+ this.cdr = cdr;
4379
+ this.className = "";
4380
+ this.panelClassName = "";
4381
+ this.side = "bottom";
4382
+ this.align = "start";
4052
4383
  this.panelWidth = 304;
4053
4384
  this.open = false;
4385
+ this.overlayRef = null;
4386
+ this.showTimeout = null;
4387
+ this.hideTimeout = null;
4054
4388
  }
4055
- get positionClass() {
4056
- const sideClassMap = {
4057
- top: 'bottom-full mb-2',
4058
- right: 'left-full ml-2',
4059
- bottom: 'top-full mt-2',
4060
- left: 'right-full mr-2'
4061
- };
4062
- const alignClassMap = {
4063
- start: this.side === 'top' || this.side === 'bottom' ? 'left-0' : 'top-0',
4064
- center: this.side === 'top' || this.side === 'bottom' ? 'left-1/2 -translate-x-1/2' : 'top-1/2 -translate-y-1/2',
4065
- end: this.side === 'top' || this.side === 'bottom' ? 'right-0' : 'bottom-0'
4389
+ ngOnDestroy() {
4390
+ this.clearTimeouts();
4391
+ this.destroyOverlay();
4392
+ }
4393
+ onMouseEnter() {
4394
+ this.clearTimeouts();
4395
+ this.showTimeout = setTimeout(() => this.show(), 150);
4396
+ }
4397
+ onMouseLeave() {
4398
+ this.clearTimeouts();
4399
+ this.hideTimeout = setTimeout(() => this.hide(), 150);
4400
+ }
4401
+ onFocusIn() {
4402
+ this.clearTimeouts();
4403
+ this.show();
4404
+ }
4405
+ onFocusOut() {
4406
+ this.clearTimeouts();
4407
+ this.hide();
4408
+ }
4409
+ clearTimeouts() {
4410
+ if (this.showTimeout) {
4411
+ clearTimeout(this.showTimeout);
4412
+ this.showTimeout = null;
4413
+ }
4414
+ if (this.hideTimeout) {
4415
+ clearTimeout(this.hideTimeout);
4416
+ this.hideTimeout = null;
4417
+ }
4418
+ }
4419
+ show() {
4420
+ if (this.open)
4421
+ return;
4422
+ this.open = true;
4423
+ this.cdr.markForCheck();
4424
+ this.createOverlay();
4425
+ }
4426
+ hide() {
4427
+ if (!this.open)
4428
+ return;
4429
+ this.open = false;
4430
+ this.cdr.markForCheck();
4431
+ this.destroyOverlay();
4432
+ }
4433
+ createOverlay() {
4434
+ if (this.overlayRef)
4435
+ return;
4436
+ const triggerEl = this.elementRef.nativeElement.querySelector("[pdmHoverTrigger]") ||
4437
+ this.elementRef.nativeElement;
4438
+ const positionStrategy = this.overlay
4439
+ .position()
4440
+ .flexibleConnectedTo(triggerEl)
4441
+ .withPositions(this.getPositionConfigs())
4442
+ .withFlexibleDimensions(false)
4443
+ .withPush(true);
4444
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
4445
+ this.overlayRef = this.overlay.create({
4446
+ positionStrategy,
4447
+ panelClass,
4448
+ });
4449
+ const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
4450
+ this.overlayRef.attach(portal);
4451
+ }
4452
+ destroyOverlay() {
4453
+ if (this.overlayRef) {
4454
+ this.overlayRef.detach();
4455
+ this.overlayRef.dispose();
4456
+ this.overlayRef = null;
4457
+ }
4458
+ }
4459
+ getPositionConfigs() {
4460
+ // Map our side/align to CDK positions
4461
+ const configs = [];
4462
+ // Primary position based on side
4463
+ switch (this.side) {
4464
+ case "top":
4465
+ configs.push({
4466
+ originX: this.getAlignX(),
4467
+ originY: "top",
4468
+ overlayX: this.getAlignX(),
4469
+ overlayY: "bottom",
4470
+ offsetY: -8,
4471
+ });
4472
+ break;
4473
+ case "right":
4474
+ configs.push({
4475
+ originX: "end",
4476
+ originY: this.getAlignY(),
4477
+ overlayX: "start",
4478
+ overlayY: this.getAlignY(),
4479
+ offsetX: 8,
4480
+ });
4481
+ break;
4482
+ case "bottom":
4483
+ default:
4484
+ configs.push({
4485
+ originX: this.getAlignX(),
4486
+ originY: "bottom",
4487
+ overlayX: this.getAlignX(),
4488
+ overlayY: "top",
4489
+ offsetY: 8,
4490
+ });
4491
+ break;
4492
+ case "left":
4493
+ configs.push({
4494
+ originX: "start",
4495
+ originY: this.getAlignY(),
4496
+ overlayX: "end",
4497
+ overlayY: this.getAlignY(),
4498
+ offsetX: -8,
4499
+ });
4500
+ break;
4501
+ }
4502
+ // Add fallback positions
4503
+ switch (this.side) {
4504
+ case "top":
4505
+ case "bottom":
4506
+ configs.push({
4507
+ originX: "center",
4508
+ originY: this.side === "top" ? "top" : "bottom",
4509
+ overlayX: "center",
4510
+ overlayY: this.side === "top" ? "bottom" : "top",
4511
+ offsetY: this.side === "top" ? -8 : 8,
4512
+ });
4513
+ break;
4514
+ case "left":
4515
+ case "right":
4516
+ configs.push({
4517
+ originX: this.side === "left" ? "start" : "end",
4518
+ originY: "center",
4519
+ overlayX: this.side === "left" ? "end" : "start",
4520
+ overlayY: "center",
4521
+ offsetX: this.side === "left" ? -8 : 8,
4522
+ });
4523
+ break;
4524
+ }
4525
+ return configs;
4526
+ }
4527
+ getAlignX() {
4528
+ return this.align;
4529
+ }
4530
+ getAlignY() {
4531
+ // Map 'start'/'end' to 'top'/'bottom' for Y axis
4532
+ const alignMap = {
4533
+ start: "top",
4534
+ center: "center",
4535
+ end: "bottom",
4066
4536
  };
4067
- return `${sideClassMap[this.side]} ${alignClassMap[this.align]}`;
4537
+ return alignMap[this.align];
4068
4538
  }
4069
4539
  }
4070
- PdmHoverCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmHoverCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4071
- PdmHoverCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmHoverCardComponent, selector: "pdm-hover-card", inputs: { className: "className", panelClassName: "panelClassName", side: "side", align: "align", panelWidth: "panelWidth" }, ngImport: i0, template: "<div\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"open = true\"\n (mouseleave)=\"open = false\"\n (focusin)=\"open = true\"\n (focusout)=\"open = false\"\n>\n <div>\n <ng-content select=\"[pdmHoverTrigger]\"></ng-content>\n </div>\n\n <section\n *ngIf=\"open\"\n [style.width.px]=\"panelWidth\"\n [ngClass]=\"[\n 'absolute z-[70] rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md',\n positionClass,\n panelClassName\n ]\"\n >\n <ng-content select=\"[pdmHoverContent]\"></ng-content>\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4540
+ PdmHoverCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmHoverCardComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
4541
+ PdmHoverCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmHoverCardComponent, selector: "pdm-hover-card", inputs: { className: "className", panelClassName: "panelClassName", side: "side", align: "align", panelWidth: "panelWidth" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focusin": "onFocusIn()", "focusout": "onFocusOut()" } }, viewQueries: [{ propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n>\n <div>\n <ng-content select=\"[pdmHoverTrigger]\"></ng-content>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <section\n [style.width.px]=\"panelWidth\"\n class=\"rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md\"\n >\n <ng-content select=\"[pdmHoverContent]\"></ng-content>\n </section>\n </ng-template>\n</div>\n", styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4072
4542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmHoverCardComponent, decorators: [{
4073
4543
  type: Component,
4074
- args: [{ selector: 'pdm-hover-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"open = true\"\n (mouseleave)=\"open = false\"\n (focusin)=\"open = true\"\n (focusout)=\"open = false\"\n>\n <div>\n <ng-content select=\"[pdmHoverTrigger]\"></ng-content>\n </div>\n\n <section\n *ngIf=\"open\"\n [style.width.px]=\"panelWidth\"\n [ngClass]=\"[\n 'absolute z-[70] rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md',\n positionClass,\n panelClassName\n ]\"\n >\n <ng-content select=\"[pdmHoverContent]\"></ng-content>\n </section>\n</div>\n" }]
4075
- }], propDecorators: { className: [{
4544
+ args: [{ selector: "pdm-hover-card", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n>\n <div>\n <ng-content select=\"[pdmHoverTrigger]\"></ng-content>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <section\n [style.width.px]=\"panelWidth\"\n class=\"rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md\"\n >\n <ng-content select=\"[pdmHoverContent]\"></ng-content>\n </section>\n </ng-template>\n</div>\n", styles: [":host{display:inline-flex}\n"] }]
4545
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { className: [{
4076
4546
  type: Input
4077
4547
  }], panelClassName: [{
4078
4548
  type: Input
@@ -4082,6 +4552,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4082
4552
  type: Input
4083
4553
  }], panelWidth: [{
4084
4554
  type: Input
4555
+ }], panelTemplateRef: [{
4556
+ type: ViewChild,
4557
+ args: ["panelTemplate"]
4558
+ }], onMouseEnter: [{
4559
+ type: HostListener,
4560
+ args: ["mouseenter"]
4561
+ }], onMouseLeave: [{
4562
+ type: HostListener,
4563
+ args: ["mouseleave"]
4564
+ }], onFocusIn: [{
4565
+ type: HostListener,
4566
+ args: ["focusin"]
4567
+ }], onFocusOut: [{
4568
+ type: HostListener,
4569
+ args: ["focusout"]
4085
4570
  }] } });
4086
4571
 
4087
4572
  class PdmItemComponent {
@@ -4106,21 +4591,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4106
4591
 
4107
4592
  class PdmInputComponent {
4108
4593
  constructor() {
4109
- this.id = '';
4110
- this.type = 'text';
4111
- this.value = '';
4112
- this.placeholder = '';
4594
+ this.id = "";
4595
+ this.type = "text";
4596
+ this.value = "";
4597
+ this.placeholder = "";
4113
4598
  this.disabled = false;
4114
4599
  this.readonly = false;
4115
4600
  this.required = false;
4116
4601
  this.invalid = false;
4117
- this.size = 'regular';
4118
- this.roundness = 'default';
4119
- this.className = '';
4120
- this.inputClassName = '';
4121
- this.label = '';
4122
- this.helperText = '';
4123
- this.errorText = '';
4602
+ this.size = "regular";
4603
+ this.roundness = "default";
4604
+ this.className = "";
4605
+ this.inputClassName = "";
4606
+ this.label = "";
4607
+ this.helperText = "";
4608
+ this.errorText = "";
4124
4609
  this.valueChange = new EventEmitter();
4125
4610
  this.blurred = new EventEmitter();
4126
4611
  }
@@ -4132,10 +4617,10 @@ class PdmInputComponent {
4132
4617
  }
4133
4618
  }
4134
4619
  PdmInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4135
- PdmInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmInputComponent, selector: "pdm-input", inputs: { id: "id", type: "type", value: "value", placeholder: "placeholder", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", size: "size", roundness: "roundness", className: "className", inputClassName: "inputClassName", label: "label", helperText: "helperText", errorText: "errorText" }, outputs: { valueChange: "valueChange", blurred: "blurred" }, ngImport: i0, template: "<div [ngClass]=\"['grid w-full gap-3', className]\">\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [ngClass]=\"[\n 'text-sm font-medium leading-none',\n invalid ? 'text-destructive' : 'text-foreground'\n ]\"\n >{{ label }}</label\n >\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive aria-invalid:placeholder:text-destructive/70 placeholder:text-muted-foreground w-full min-w-0 rounded-lg border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n size === 'large' ? 'h-10 px-4 text-sm' : '',\n size === 'regular' ? 'h-9 px-3 text-sm' : '',\n size === 'small' ? 'h-8 px-2 text-sm' : '',\n size === 'mini' ? 'h-6 px-1.5 text-xs' : '',\n roundness === 'round' ? 'rounded-full' : 'rounded-lg',\n type === 'file' ? 'text-sm' : 'text-foreground',\n inputClassName,\n ]\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <p *ngIf=\"!invalid && helperText\" class=\"m-0 text-sm text-muted-foreground\">\n {{ helperText }}\n </p>\n <p *ngIf=\"invalid && errorText\" class=\"m-0 text-sm text-destructive\">\n {{ errorText }}\n </p>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4620
+ PdmInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmInputComponent, selector: "pdm-input", inputs: { id: "id", type: "type", value: "value", placeholder: "placeholder", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", size: "size", roundness: "roundness", className: "className", inputClassName: "inputClassName", label: "label", helperText: "helperText", errorText: "errorText" }, outputs: { valueChange: "valueChange", blurred: "blurred" }, ngImport: i0, template: "<div [ngClass]=\"['grid w-full gap-3', className]\">\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [ngClass]=\"[\n 'text-sm font-medium leading-none',\n invalid ? 'text-destructive' : 'text-foreground'\n ]\"\n >{{ label }}</label\n >\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive aria-invalid:placeholder:text-destructive/70 placeholder:text-muted-foreground w-full min-w-0 rounded-lg border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n size === 'large' ? 'h-10 px-4 text-sm' : '',\n size === 'regular' ? 'h-9 px-3 text-sm' : '',\n size === 'small' ? 'h-8 px-2 text-sm' : '',\n size === 'mini' ? 'h-6 px-1.5 text-xs' : '',\n roundness === 'round' ? 'rounded-full' : 'rounded-lg',\n type === 'file' ? 'text-sm' : 'text-foreground',\n inputClassName,\n ]\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <p *ngIf=\"!invalid && helperText\" class=\"m-0 text-sm text-muted-foreground\">\n {{ helperText }}\n </p>\n <p *ngIf=\"invalid && errorText\" class=\"m-0 text-sm text-destructive\">\n {{ errorText }}\n </p>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4136
4621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmInputComponent, decorators: [{
4137
4622
  type: Component,
4138
- args: [{ selector: 'pdm-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['grid w-full gap-3', className]\">\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [ngClass]=\"[\n 'text-sm font-medium leading-none',\n invalid ? 'text-destructive' : 'text-foreground'\n ]\"\n >{{ label }}</label\n >\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive aria-invalid:placeholder:text-destructive/70 placeholder:text-muted-foreground w-full min-w-0 rounded-lg border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n size === 'large' ? 'h-10 px-4 text-sm' : '',\n size === 'regular' ? 'h-9 px-3 text-sm' : '',\n size === 'small' ? 'h-8 px-2 text-sm' : '',\n size === 'mini' ? 'h-6 px-1.5 text-xs' : '',\n roundness === 'round' ? 'rounded-full' : 'rounded-lg',\n type === 'file' ? 'text-sm' : 'text-foreground',\n inputClassName,\n ]\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <p *ngIf=\"!invalid && helperText\" class=\"m-0 text-sm text-muted-foreground\">\n {{ helperText }}\n </p>\n <p *ngIf=\"invalid && errorText\" class=\"m-0 text-sm text-destructive\">\n {{ errorText }}\n </p>\n</div>\n" }]
4623
+ args: [{ selector: "pdm-input", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['grid w-full gap-3', className]\">\n <label\n *ngIf=\"label\"\n [attr.for]=\"id\"\n [ngClass]=\"[\n 'text-sm font-medium leading-none',\n invalid ? 'text-destructive' : 'text-foreground'\n ]\"\n >{{ label }}</label\n >\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive aria-invalid:placeholder:text-destructive/70 placeholder:text-muted-foreground w-full min-w-0 rounded-lg border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n size === 'large' ? 'h-10 px-4 text-sm' : '',\n size === 'regular' ? 'h-9 px-3 text-sm' : '',\n size === 'small' ? 'h-8 px-2 text-sm' : '',\n size === 'mini' ? 'h-6 px-1.5 text-xs' : '',\n roundness === 'round' ? 'rounded-full' : 'rounded-lg',\n type === 'file' ? 'text-sm' : 'text-foreground',\n inputClassName,\n ]\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur($event)\"\n />\n <p *ngIf=\"!invalid && helperText\" class=\"m-0 text-sm text-muted-foreground\">\n {{ helperText }}\n </p>\n <p *ngIf=\"invalid && errorText\" class=\"m-0 text-sm text-destructive\">\n {{ errorText }}\n </p>\n</div>\n", styles: [":host{display:block}\n"] }]
4139
4624
  }], propDecorators: { id: [{
4140
4625
  type: Input
4141
4626
  }], type: [{
@@ -4249,18 +4734,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4249
4734
 
4250
4735
  class PdmInputGroupComponent {
4251
4736
  constructor() {
4252
- this.id = '';
4253
- this.type = 'text';
4254
- this.value = '';
4255
- this.placeholder = '';
4737
+ this.id = "";
4738
+ this.type = "text";
4739
+ this.value = "";
4740
+ this.placeholder = "";
4256
4741
  this.disabled = false;
4257
4742
  this.invalid = false;
4258
- this.prefixText = '';
4259
- this.suffixText = '';
4260
- this.prefixIcon = '';
4261
- this.suffixIcon = '';
4262
- this.buttonText = '';
4263
- this.className = '';
4743
+ this.prefixText = "";
4744
+ this.suffixText = "";
4745
+ this.prefixIcon = "";
4746
+ this.suffixIcon = "";
4747
+ this.buttonText = "";
4748
+ this.className = "";
4264
4749
  this.valueChange = new EventEmitter();
4265
4750
  this.buttonClick = new EventEmitter();
4266
4751
  }
@@ -4272,10 +4757,10 @@ class PdmInputGroupComponent {
4272
4757
  }
4273
4758
  }
4274
4759
  PdmInputGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmInputGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4275
- PdmInputGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmInputGroupComponent, selector: "pdm-input-group", inputs: { id: "id", type: "type", value: "value", placeholder: "placeholder", disabled: "disabled", invalid: "invalid", prefixText: "prefixText", suffixText: "suffixText", prefixIcon: "prefixIcon", suffixIcon: "suffixIcon", buttonText: "buttonText", className: "className" }, outputs: { valueChange: "valueChange", buttonClick: "buttonClick" }, ngImport: i0, template: "<div\n [ngClass]=\"[\n 'flex w-full items-center gap-2',\n disabled ? 'opacity-50' : '',\n className\n ]\"\n>\n <div\n [ngClass]=\"[\n 'flex h-9 min-w-0 flex-1 items-center overflow-hidden rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/50',\n invalid ? 'border-destructive focus-within:ring-destructive' : '',\n disabled ? 'cursor-not-allowed' : ''\n ]\"\n >\n <div\n *ngIf=\"prefixText || prefixIcon\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pr-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"prefixIcon\" [name]=\"prefixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"prefixText\">{{ prefixText }}</span>\n <ng-content select=\"[pdmInputGroupPrefix]\"></ng-content>\n </div>\n\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'h-full min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-foreground outline-none placeholder:text-muted-foreground aria-invalid:placeholder:text-destructive/70',\n type === 'file' ? 'text-sm file:mr-2 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground' : ''\n ]\"\n (input)=\"onInput($event)\"\n />\n\n <div\n *ngIf=\"!buttonText && (suffixText || suffixIcon)\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pl-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"suffixIcon\" [name]=\"suffixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"suffixText\" class=\"font-medium\">{{ suffixText }}</span>\n <ng-content select=\"[pdmInputGroupSuffix]\"></ng-content>\n </div>\n </div>\n\n <button\n *ngIf=\"buttonText\"\n type=\"button\"\n [disabled]=\"disabled\"\n class=\"inline-flex h-9 shrink-0 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/50 disabled:cursor-not-allowed\"\n (click)=\"onButtonClick($event)\"\n >\n {{ buttonText }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4760
+ PdmInputGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmInputGroupComponent, selector: "pdm-input-group", inputs: { id: "id", type: "type", value: "value", placeholder: "placeholder", disabled: "disabled", invalid: "invalid", prefixText: "prefixText", suffixText: "suffixText", prefixIcon: "prefixIcon", suffixIcon: "suffixIcon", buttonText: "buttonText", className: "className" }, outputs: { valueChange: "valueChange", buttonClick: "buttonClick" }, ngImport: i0, template: "<div\n [ngClass]=\"[\n 'flex w-full flex-col items-stretch gap-2 sm:flex-row sm:items-center',\n disabled ? 'opacity-50' : '',\n className,\n ]\"\n>\n <div\n [ngClass]=\"[\n 'flex h-9 min-w-0 flex-1 items-center overflow-hidden rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/50',\n invalid ? 'border-destructive focus-within:ring-destructive' : '',\n disabled ? 'cursor-not-allowed' : '',\n ]\"\n >\n <div\n *ngIf=\"prefixText || prefixIcon\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pr-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"prefixIcon\" [name]=\"prefixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"prefixText\">{{ prefixText }}</span>\n <ng-content select=\"[pdmInputGroupPrefix]\"></ng-content>\n </div>\n\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'h-full min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-foreground outline-none placeholder:text-muted-foreground aria-invalid:placeholder:text-destructive/70',\n type === 'file'\n ? 'text-sm file:mr-2 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground'\n : '',\n ]\"\n (input)=\"onInput($event)\"\n />\n\n <div\n *ngIf=\"!buttonText && (suffixText || suffixIcon)\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pl-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"suffixIcon\" [name]=\"suffixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"suffixText\" class=\"font-medium\">{{ suffixText }}</span>\n <ng-content select=\"[pdmInputGroupSuffix]\"></ng-content>\n </div>\n </div>\n\n <button\n *ngIf=\"buttonText\"\n type=\"button\"\n [disabled]=\"disabled\"\n class=\"inline-flex h-9 w-full shrink-0 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/50 disabled:cursor-not-allowed sm:w-auto\"\n (click)=\"onButtonClick($event)\"\n >\n {{ buttonText }}\n </button>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4276
4761
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmInputGroupComponent, decorators: [{
4277
4762
  type: Component,
4278
- args: [{ selector: 'pdm-input-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngClass]=\"[\n 'flex w-full items-center gap-2',\n disabled ? 'opacity-50' : '',\n className\n ]\"\n>\n <div\n [ngClass]=\"[\n 'flex h-9 min-w-0 flex-1 items-center overflow-hidden rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/50',\n invalid ? 'border-destructive focus-within:ring-destructive' : '',\n disabled ? 'cursor-not-allowed' : ''\n ]\"\n >\n <div\n *ngIf=\"prefixText || prefixIcon\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pr-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"prefixIcon\" [name]=\"prefixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"prefixText\">{{ prefixText }}</span>\n <ng-content select=\"[pdmInputGroupPrefix]\"></ng-content>\n </div>\n\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'h-full min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-foreground outline-none placeholder:text-muted-foreground aria-invalid:placeholder:text-destructive/70',\n type === 'file' ? 'text-sm file:mr-2 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground' : ''\n ]\"\n (input)=\"onInput($event)\"\n />\n\n <div\n *ngIf=\"!buttonText && (suffixText || suffixIcon)\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pl-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"suffixIcon\" [name]=\"suffixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"suffixText\" class=\"font-medium\">{{ suffixText }}</span>\n <ng-content select=\"[pdmInputGroupSuffix]\"></ng-content>\n </div>\n </div>\n\n <button\n *ngIf=\"buttonText\"\n type=\"button\"\n [disabled]=\"disabled\"\n class=\"inline-flex h-9 shrink-0 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/50 disabled:cursor-not-allowed\"\n (click)=\"onButtonClick($event)\"\n >\n {{ buttonText }}\n </button>\n</div>\n" }]
4763
+ args: [{ selector: "pdm-input-group", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngClass]=\"[\n 'flex w-full flex-col items-stretch gap-2 sm:flex-row sm:items-center',\n disabled ? 'opacity-50' : '',\n className,\n ]\"\n>\n <div\n [ngClass]=\"[\n 'flex h-9 min-w-0 flex-1 items-center overflow-hidden rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm transition-colors focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/50',\n invalid ? 'border-destructive focus-within:ring-destructive' : '',\n disabled ? 'cursor-not-allowed' : '',\n ]\"\n >\n <div\n *ngIf=\"prefixText || prefixIcon\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pr-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"prefixIcon\" [name]=\"prefixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"prefixText\">{{ prefixText }}</span>\n <ng-content select=\"[pdmInputGroupPrefix]\"></ng-content>\n </div>\n\n <input\n [id]=\"id\"\n [type]=\"type\"\n [value]=\"value\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"[\n 'h-full min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-foreground outline-none placeholder:text-muted-foreground aria-invalid:placeholder:text-destructive/70',\n type === 'file'\n ? 'text-sm file:mr-2 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground'\n : '',\n ]\"\n (input)=\"onInput($event)\"\n />\n\n <div\n *ngIf=\"!buttonText && (suffixText || suffixIcon)\"\n class=\"inline-flex h-full shrink-0 items-center gap-2 pl-2 text-sm text-muted-foreground\"\n >\n <pdm-icon *ngIf=\"suffixIcon\" [name]=\"suffixIcon\" [size]=\"16\"></pdm-icon>\n <span *ngIf=\"suffixText\" class=\"font-medium\">{{ suffixText }}</span>\n <ng-content select=\"[pdmInputGroupSuffix]\"></ng-content>\n </div>\n </div>\n\n <button\n *ngIf=\"buttonText\"\n type=\"button\"\n [disabled]=\"disabled\"\n class=\"inline-flex h-9 w-full shrink-0 appearance-none items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring/50 disabled:cursor-not-allowed sm:w-auto\"\n (click)=\"onButtonClick($event)\"\n >\n {{ buttonText }}\n </button>\n</div>\n", styles: [":host{display:block}\n"] }]
4279
4764
  }], propDecorators: { id: [{
4280
4765
  type: Input
4281
4766
  }], type: [{
@@ -4458,35 +4943,57 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4458
4943
  }] } });
4459
4944
 
4460
4945
  class PdmMenubarComponent {
4461
- constructor(elementRef, cdr) {
4946
+ constructor(overlay, viewContainerRef, elementRef, cdr) {
4947
+ this.overlay = overlay;
4948
+ this.viewContainerRef = viewContainerRef;
4462
4949
  this.elementRef = elementRef;
4463
4950
  this.cdr = cdr;
4464
4951
  this.menus = [];
4465
- this.className = '';
4952
+ this.className = "";
4953
+ this.panelClassName = "";
4466
4954
  this.itemSelect = new EventEmitter();
4467
4955
  this.openIndex = -1;
4956
+ this.overlayRef = null;
4957
+ this.outsideClickSub = null;
4468
4958
  }
4469
- ngOnInit() {
4470
- this.boundPointerDown = (event) => this.onDocumentPointerDown(event);
4471
- document.addEventListener('pointerdown', this.boundPointerDown, { capture: true });
4472
- }
4959
+ ngOnInit() { }
4473
4960
  ngOnDestroy() {
4474
- if (this.boundPointerDown) {
4475
- document.removeEventListener('pointerdown', this.boundPointerDown, { capture: true });
4476
- }
4961
+ this.destroyOverlay();
4477
4962
  }
4478
- onEsc() {
4963
+ onDocumentClickOrEsc(event) {
4964
+ // Close on escape
4965
+ if (event.type === "keydown") {
4966
+ if (this.openIndex >= 0) {
4967
+ this.openIndex = -1;
4968
+ this.cdr.markForCheck();
4969
+ }
4970
+ return;
4971
+ }
4972
+ // Close on click outside
4479
4973
  if (this.openIndex >= 0) {
4480
- this.openIndex = -1;
4481
- this.cdr.markForCheck();
4974
+ const target = event.target;
4975
+ if (!this.elementRef.nativeElement.contains(target)) {
4976
+ this.openIndex = -1;
4977
+ this.cdr.markForCheck();
4978
+ }
4482
4979
  }
4483
4980
  }
4484
- toggle(index) {
4981
+ toggle(index, event) {
4982
+ event.stopPropagation();
4485
4983
  this.openIndex = this.openIndex === index ? -1 : index;
4984
+ this.cdr.markForCheck();
4985
+ if (this.openIndex >= 0) {
4986
+ this.createOverlay(event);
4987
+ }
4988
+ else {
4989
+ this.destroyOverlay();
4990
+ }
4486
4991
  }
4487
4992
  select(value) {
4488
4993
  this.itemSelect.emit(value);
4489
4994
  this.openIndex = -1;
4995
+ this.cdr.markForCheck();
4996
+ this.destroyOverlay();
4490
4997
  }
4491
4998
  selectItem(item) {
4492
4999
  if (item.disabled || !item.value) {
@@ -4494,32 +5001,83 @@ class PdmMenubarComponent {
4494
5001
  }
4495
5002
  this.select(item.value);
4496
5003
  }
4497
- onDocumentPointerDown(event) {
4498
- if (this.openIndex < 0)
4499
- return;
4500
- const target = event.target;
4501
- if (!target)
4502
- return;
4503
- if (!this.elementRef.nativeElement.contains(target)) {
5004
+ createOverlay(event) {
5005
+ this.destroyOverlay();
5006
+ const triggerEl = event.currentTarget;
5007
+ const positionStrategy = this.overlay
5008
+ .position()
5009
+ .flexibleConnectedTo(triggerEl)
5010
+ .withPositions(this.getPositionConfigs())
5011
+ .withFlexibleDimensions(false)
5012
+ .withPush(true);
5013
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
5014
+ this.overlayRef = this.overlay.create({
5015
+ positionStrategy,
5016
+ panelClass,
5017
+ });
5018
+ const portal = new TemplatePortal(this.menuTemplateRef, this.viewContainerRef);
5019
+ this.overlayRef.attach(portal);
5020
+ // Close on click outside
5021
+ this.outsideClickSub = this.overlayRef
5022
+ .outsidePointerEvents()
5023
+ .subscribe(() => {
4504
5024
  this.openIndex = -1;
4505
5025
  this.cdr.markForCheck();
5026
+ this.destroyOverlay();
5027
+ });
5028
+ }
5029
+ destroyOverlay() {
5030
+ if (this.outsideClickSub) {
5031
+ this.outsideClickSub.unsubscribe();
5032
+ this.outsideClickSub = null;
4506
5033
  }
5034
+ if (this.overlayRef) {
5035
+ this.overlayRef.detach();
5036
+ this.overlayRef.dispose();
5037
+ this.overlayRef = null;
5038
+ }
5039
+ }
5040
+ getPositionConfigs() {
5041
+ return [
5042
+ {
5043
+ originX: "start",
5044
+ originY: "bottom",
5045
+ overlayX: "start",
5046
+ overlayY: "top",
5047
+ offsetY: 4,
5048
+ },
5049
+ {
5050
+ originX: "start",
5051
+ originY: "top",
5052
+ overlayX: "start",
5053
+ overlayY: "bottom",
5054
+ offsetY: -4,
5055
+ },
5056
+ ];
4507
5057
  }
4508
5058
  }
4509
- PdmMenubarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmMenubarComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
4510
- PdmMenubarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmMenubarComponent, selector: "pdm-menubar", inputs: { menus: "menus", className: "className" }, outputs: { itemSelect: "itemSelect" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, ngImport: i0, template: "<nav role=\"menubar\" [ngClass]=\"['inline-flex h-9 items-center gap-0.5 rounded-md border border-border bg-background p-1 shadow-sm', className]\">\n <div *ngFor=\"let menu of menus; let i = index\" class=\"relative\">\n <button type=\"button\" class=\"inline-flex h-7 appearance-none items-center rounded-sm border-0 bg-transparent px-3 text-sm text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\" (click)=\"toggle(i)\">{{ menu.label }}</button>\n <div *ngIf=\"openIndex === i\" class=\"absolute left-0 top-full z-[70] mt-1 min-w-40 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-48\">\n <button\n *ngFor=\"let item of menu.items\"\n type=\"button\"\n [disabled]=\"item.disabled || !item.value\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"selectItem(item)\"\n >\n {{ item.label }}\n </button>\n </div>\n </div>\n</nav>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5059
+ PdmMenubarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmMenubarComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5060
+ PdmMenubarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmMenubarComponent, selector: "pdm-menubar", inputs: { menus: "menus", className: "className", panelClassName: "panelClassName" }, outputs: { itemSelect: "itemSelect" }, host: { listeners: { "document:click": "onDocumentClickOrEsc()", "document:keydown.escape": "onDocumentClickOrEsc()" } }, viewQueries: [{ propertyName: "menuTemplateRef", first: true, predicate: ["menuTemplate"], descendants: true }], ngImport: i0, template: "<nav\n role=\"menubar\"\n [ngClass]=\"[\n 'inline-flex h-9 items-center gap-0.5 rounded-md border border-border bg-background p-1 shadow-sm',\n className,\n ]\"\n>\n <div *ngFor=\"let menu of menus; let i = index\" class=\"relative\">\n <button\n type=\"button\"\n class=\"inline-flex h-7 appearance-none items-center rounded-sm border-0 bg-transparent px-3 text-sm text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n [attr.aria-expanded]=\"openIndex === i\"\n (click)=\"toggle(i, $event)\"\n >\n {{ menu.label }}\n </button>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-40 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-48\"\n >\n <button\n *ngFor=\"let item of menus[openIndex]?.items || []\"\n type=\"button\"\n [disabled]=\"item.disabled || !item.value\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"selectItem(item)\"\n >\n {{ item.label }}\n </button>\n </div>\n </ng-template>\n</nav>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4511
5061
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmMenubarComponent, decorators: [{
4512
5062
  type: Component,
4513
- args: [{ selector: 'pdm-menubar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav role=\"menubar\" [ngClass]=\"['inline-flex h-9 items-center gap-0.5 rounded-md border border-border bg-background p-1 shadow-sm', className]\">\n <div *ngFor=\"let menu of menus; let i = index\" class=\"relative\">\n <button type=\"button\" class=\"inline-flex h-7 appearance-none items-center rounded-sm border-0 bg-transparent px-3 text-sm text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\" (click)=\"toggle(i)\">{{ menu.label }}</button>\n <div *ngIf=\"openIndex === i\" class=\"absolute left-0 top-full z-[70] mt-1 min-w-40 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-48\">\n <button\n *ngFor=\"let item of menu.items\"\n type=\"button\"\n [disabled]=\"item.disabled || !item.value\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"selectItem(item)\"\n >\n {{ item.label }}\n </button>\n </div>\n </div>\n</nav>\n" }]
4514
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { menus: [{
5063
+ args: [{ selector: "pdm-menubar", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\n role=\"menubar\"\n [ngClass]=\"[\n 'inline-flex h-9 items-center gap-0.5 rounded-md border border-border bg-background p-1 shadow-sm',\n className,\n ]\"\n>\n <div *ngFor=\"let menu of menus; let i = index\" class=\"relative\">\n <button\n type=\"button\"\n class=\"inline-flex h-7 appearance-none items-center rounded-sm border-0 bg-transparent px-3 text-sm text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n [attr.aria-expanded]=\"openIndex === i\"\n (click)=\"toggle(i, $event)\"\n >\n {{ menu.label }}\n </button>\n </div>\n\n <!-- Template for CDK Overlay -->\n <ng-template #menuTemplate>\n <div\n class=\"min-w-40 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md sm:min-w-48\"\n >\n <button\n *ngFor=\"let item of menus[openIndex]?.items || []\"\n type=\"button\"\n [disabled]=\"item.disabled || !item.value\"\n class=\"relative flex w-full appearance-none cursor-default select-none items-center rounded-sm border-0 bg-transparent px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n (click)=\"selectItem(item)\"\n >\n {{ item.label }}\n </button>\n </div>\n </ng-template>\n</nav>\n", styles: [":host{display:block}\n"] }]
5064
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { menus: [{
4515
5065
  type: Input
4516
5066
  }], className: [{
4517
5067
  type: Input
5068
+ }], panelClassName: [{
5069
+ type: Input
4518
5070
  }], itemSelect: [{
4519
5071
  type: Output
4520
- }], onEsc: [{
5072
+ }], menuTemplateRef: [{
5073
+ type: ViewChild,
5074
+ args: ["menuTemplate"]
5075
+ }], onDocumentClickOrEsc: [{
4521
5076
  type: HostListener,
4522
- args: ['document:keydown.escape']
5077
+ args: ["document:click"]
5078
+ }, {
5079
+ type: HostListener,
5080
+ args: ["document:keydown.escape"]
4523
5081
  }] } });
4524
5082
 
4525
5083
  class PdmNativeSelectComponent {
@@ -4735,18 +5293,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4735
5293
  }] } });
4736
5294
 
4737
5295
  class PdmSelectComponent {
4738
- constructor(elementRef, cdr, overlay, viewContainerRef) {
4739
- this.elementRef = elementRef;
5296
+ constructor(cdr, overlay, viewContainerRef) {
4740
5297
  this.cdr = cdr;
4741
5298
  this.overlay = overlay;
4742
5299
  this.viewContainerRef = viewContainerRef;
4743
- this.id = '';
4744
- this.value = '';
5300
+ this.id = "";
5301
+ this.value = "";
4745
5302
  this.options = [];
4746
5303
  this.disabled = false;
4747
5304
  this.invalid = false;
4748
- this.className = '';
4749
- this.placeholder = 'Select an option';
5305
+ this.className = "";
5306
+ this.placeholder = "Select an option";
4750
5307
  this.open = false;
4751
5308
  this.valueChange = new EventEmitter();
4752
5309
  this.overlayRef = null;
@@ -4769,7 +5326,7 @@ class PdmSelectComponent {
4769
5326
  return this.projectedOptions.map((d) => ({
4770
5327
  label: d.resolvedLabel,
4771
5328
  value: d.value,
4772
- disabled: d.disabled
5329
+ disabled: d.disabled,
4773
5330
  }));
4774
5331
  }
4775
5332
  return this.options;
@@ -4821,11 +5378,13 @@ class PdmSelectComponent {
4821
5378
  scrollStrategy: this.overlay.scrollStrategies.reposition(),
4822
5379
  width: triggerEl.offsetWidth,
4823
5380
  // Consumer overrides are spread last — they win over every default above.
4824
- ...this.overlayOptions
5381
+ ...this.overlayOptions,
4825
5382
  });
4826
5383
  const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
4827
5384
  this.overlayRef.attach(portal);
4828
- this.backdropSub = this.overlayRef.outsidePointerEvents().subscribe((event) => {
5385
+ this.backdropSub = this.overlayRef
5386
+ .outsidePointerEvents()
5387
+ .subscribe((event) => {
4829
5388
  const target = event.target;
4830
5389
  if (!triggerEl.contains(target)) {
4831
5390
  this.closePanel();
@@ -4851,12 +5410,12 @@ class PdmSelectComponent {
4851
5410
  }
4852
5411
  }
4853
5412
  }
4854
- PdmSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
4855
- PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder", overlayOptions: "overlayOptions" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, queries: [{ propertyName: "projectedOptions", predicate: PdmSelectOptionDirective }], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5413
+ PdmSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
5414
+ PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder", overlayOptions: "overlayOptions" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" } }, queries: [{ propertyName: "projectedOptions", predicate: PdmSelectOptionDirective }], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"w-full overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4856
5415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, decorators: [{
4857
5416
  type: Component,
4858
- args: [{ selector: 'pdm-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n" }]
4859
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { id: [{
5417
+ args: [{ selector: "pdm-select", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <!-- Hidden native select kept for screen-reader / form fallback -->\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of resolvedOptions\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n\n <!-- Slot for content-projected pdm-select-option elements (hidden from layout) -->\n <span class=\"hidden\">\n <ng-content select=\"pdm-select-option\"></ng-content>\n </span>\n</div>\n\n<ng-template #panelTemplate>\n <div\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"w-full overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md max-h-96\"\n >\n <button\n *ngFor=\"let option of resolvedOptions\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
5418
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }]; }, propDecorators: { id: [{
4860
5419
  type: Input
4861
5420
  }], value: [{
4862
5421
  type: Input
@@ -4876,16 +5435,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4876
5435
  type: Output
4877
5436
  }], triggerRef: [{
4878
5437
  type: ViewChild,
4879
- args: ['triggerEl']
5438
+ args: ["triggerEl"]
4880
5439
  }], panelTemplateRef: [{
4881
5440
  type: ViewChild,
4882
- args: ['panelTemplate']
5441
+ args: ["panelTemplate"]
4883
5442
  }], projectedOptions: [{
4884
5443
  type: ContentChildren,
4885
5444
  args: [PdmSelectOptionDirective]
4886
5445
  }], onEscape: [{
4887
5446
  type: HostListener,
4888
- args: ['document:keydown.escape']
5447
+ args: ["document:keydown.escape"]
4889
5448
  }] } });
4890
5449
 
4891
5450
  class PdmPaginationComponent {
@@ -4956,51 +5515,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
4956
5515
  }] } });
4957
5516
 
4958
5517
  class PdmPopoverComponent {
4959
- constructor(elementRef, cdr) {
5518
+ constructor(overlay, viewContainerRef, elementRef, cdr) {
5519
+ this.overlay = overlay;
5520
+ this.viewContainerRef = viewContainerRef;
4960
5521
  this.elementRef = elementRef;
4961
5522
  this.cdr = cdr;
4962
5523
  this._open = false;
4963
- this.triggerText = 'Open';
4964
- this.className = '';
4965
- this.panelClassName = '';
5524
+ this.triggerText = "Open";
5525
+ this.className = "";
5526
+ this.panelClassName = "";
4966
5527
  this.showTrigger = true;
4967
5528
  this.openChange = new EventEmitter();
4968
- this.panelPlacement = 'bottom';
4969
- }
4970
- ngOnInit() {
4971
- this.boundPointerDown = (event) => this.onDocumentPointerDown(event);
4972
- document.addEventListener('pointerdown', this.boundPointerDown, { capture: true });
5529
+ this.overlayRef = null;
5530
+ this.outsideClickSub = null;
4973
5531
  }
5532
+ ngOnInit() { }
4974
5533
  ngOnDestroy() {
4975
- if (this.boundPointerDown) {
4976
- document.removeEventListener('pointerdown', this.boundPointerDown, { capture: true });
4977
- }
5534
+ this.destroyOverlay();
4978
5535
  }
4979
5536
  set open(value) {
4980
- this._open = !!value;
4981
- if (this._open) {
4982
- this.schedulePanelPlacementUpdate();
5537
+ if (this._open === !!value)
5538
+ return;
5539
+ if (value) {
5540
+ this.openPanel();
4983
5541
  }
4984
5542
  else {
4985
- this.panelPlacement = 'bottom';
5543
+ this.closePanel();
4986
5544
  }
4987
- this.cdr.markForCheck();
4988
5545
  }
4989
5546
  get open() {
4990
5547
  return this._open;
4991
5548
  }
4992
- get panelClasses() {
4993
- const baseClasses = 'min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md';
4994
- return [
4995
- this.panelPlacement === 'top'
4996
- ? `absolute bottom-full left-0 ${Z_INDEX.popover} mb-2 ${baseClasses}`
4997
- : `absolute left-0 top-full ${Z_INDEX.popover} mt-2 ${baseClasses}`,
4998
- this.panelClassName
4999
- ];
5000
- }
5001
5549
  toggle() {
5002
5550
  this.open = !this.open;
5003
- this.openChange.emit(this.open);
5004
5551
  }
5005
5552
  onEsc() {
5006
5553
  if (this.open) {
@@ -5008,48 +5555,99 @@ class PdmPopoverComponent {
5008
5555
  this.openChange.emit(false);
5009
5556
  }
5010
5557
  }
5011
- onViewportChange() {
5012
- this.updatePanelPlacement();
5013
- }
5014
- onDocumentPointerDown(event) {
5015
- if (!this.open)
5558
+ openPanel() {
5559
+ if (this.overlayRef)
5016
5560
  return;
5017
- const target = event.target;
5018
- if (target && !this.elementRef.nativeElement.contains(target)) {
5561
+ const triggerEl = this.triggerRef?.nativeElement;
5562
+ if (!triggerEl)
5563
+ return;
5564
+ this._open = true;
5565
+ this.openChange.emit(true);
5566
+ this.cdr.markForCheck();
5567
+ const positionStrategy = this.overlay
5568
+ .position()
5569
+ .flexibleConnectedTo(triggerEl)
5570
+ .withPositions(this.getPositionConfigs())
5571
+ .withFlexibleDimensions(false)
5572
+ .withPush(true);
5573
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX, this.panelClassName);
5574
+ this.overlayRef = this.overlay.create({
5575
+ positionStrategy,
5576
+ panelClass,
5577
+ });
5578
+ const portal = new TemplatePortal(this.panelTemplateRef, this.viewContainerRef);
5579
+ this.overlayRef.attach(portal);
5580
+ // Close on click outside
5581
+ this.outsideClickSub = this.overlayRef
5582
+ .outsidePointerEvents()
5583
+ .subscribe(() => {
5019
5584
  this.open = false;
5020
5585
  this.openChange.emit(false);
5021
- }
5022
- }
5023
- schedulePanelPlacementUpdate() {
5024
- setTimeout(() => this.updatePanelPlacement());
5586
+ });
5587
+ this.cdr.markForCheck();
5025
5588
  }
5026
- updatePanelPlacement() {
5027
- if (!this.open)
5028
- return;
5029
- const anchorEl = this.triggerRef?.nativeElement || this.anchorRef?.nativeElement;
5030
- const panelEl = this.panelRef?.nativeElement;
5031
- if (!anchorEl || !panelEl || typeof window === 'undefined') {
5589
+ closePanel() {
5590
+ if (!this.overlayRef)
5032
5591
  return;
5592
+ this._open = false;
5593
+ this.openChange.emit(false);
5594
+ this.cdr.markForCheck();
5595
+ this.destroyOverlay();
5596
+ }
5597
+ destroyOverlay() {
5598
+ if (this.outsideClickSub) {
5599
+ this.outsideClickSub.unsubscribe();
5600
+ this.outsideClickSub = null;
5033
5601
  }
5034
- const viewportHeight = window.innerHeight;
5035
- const gap = 8;
5036
- const anchorRect = anchorEl.getBoundingClientRect();
5037
- const panelHeight = panelEl.offsetHeight;
5038
- const spaceBelow = Math.max(0, viewportHeight - anchorRect.bottom - gap);
5039
- const spaceAbove = Math.max(0, anchorRect.top - gap);
5040
- const nextPlacement = spaceBelow < panelHeight && spaceAbove > spaceBelow ? 'top' : 'bottom';
5041
- if (this.panelPlacement !== nextPlacement) {
5042
- this.panelPlacement = nextPlacement;
5043
- this.cdr.markForCheck();
5602
+ if (this.overlayRef) {
5603
+ this.overlayRef.detach();
5604
+ this.overlayRef.dispose();
5605
+ this.overlayRef = null;
5044
5606
  }
5045
5607
  }
5608
+ getPositionConfigs() {
5609
+ return [
5610
+ // Bottom (default)
5611
+ {
5612
+ originX: "start",
5613
+ originY: "bottom",
5614
+ overlayX: "start",
5615
+ overlayY: "top",
5616
+ offsetY: 8,
5617
+ },
5618
+ // Top (fallback)
5619
+ {
5620
+ originX: "start",
5621
+ originY: "top",
5622
+ overlayX: "start",
5623
+ overlayY: "bottom",
5624
+ offsetY: -8,
5625
+ },
5626
+ // Right
5627
+ {
5628
+ originX: "end",
5629
+ originY: "bottom",
5630
+ overlayX: "start",
5631
+ overlayY: "top",
5632
+ offsetY: 8,
5633
+ },
5634
+ // Left
5635
+ {
5636
+ originX: "start",
5637
+ originY: "bottom",
5638
+ overlayX: "end",
5639
+ overlayY: "top",
5640
+ offsetY: 8,
5641
+ },
5642
+ ];
5643
+ }
5046
5644
  }
5047
- PdmPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5048
- PdmPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPopoverComponent, selector: "pdm-popover", inputs: { triggerText: "triggerText", className: "className", panelClassName: "panelClassName", showTrigger: "showTrigger", open: "open" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown.escape": "onEsc()", "window:resize": "onViewportChange()", "window:scroll": "onViewportChange()" } }, viewQueries: [{ propertyName: "anchorRef", first: true, predicate: ["anchorEl"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelRef", first: true, predicate: ["panelEl"], descendants: true }], ngImport: i0, template: "<div #anchorEl class=\"relative inline-block\" [ngClass]=\"className\">\n <button #triggerEl *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div #panelEl *ngIf=\"open || !showTrigger\" [ngClass]=\"panelClasses\">\n <ng-content></ng-content>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5645
+ PdmPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5646
+ PdmPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPopoverComponent, selector: "pdm-popover", inputs: { triggerText: "triggerText", className: "className", panelClassName: "panelClassName", showTrigger: "showTrigger", open: "open" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown.escape": "onEsc()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true }], ngImport: i0, template: "<div class=\"relative inline-block\" [ngClass]=\"className\">\n <button\n #triggerEl\n *ngIf=\"showTrigger\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-haspopup]=\"'dialog'\"\n (click)=\"toggle()\"\n >\n {{ triggerText }}\n </button>\n\n <!-- Trigger slot for custom trigger -->\n <ng-content select=\"[pdmPopoverTrigger]\"></ng-content>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <div\n class=\"min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md\"\n >\n <ng-content></ng-content>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5049
5647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, decorators: [{
5050
5648
  type: Component,
5051
- args: [{ selector: 'pdm-popover', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #anchorEl class=\"relative inline-block\" [ngClass]=\"className\">\n <button #triggerEl *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div #panelEl *ngIf=\"open || !showTrigger\" [ngClass]=\"panelClasses\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
5052
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { triggerText: [{
5649
+ args: [{ selector: "pdm-popover", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative inline-block\" [ngClass]=\"className\">\n <button\n #triggerEl\n *ngIf=\"showTrigger\"\n type=\"button\"\n class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-haspopup]=\"'dialog'\"\n (click)=\"toggle()\"\n >\n {{ triggerText }}\n </button>\n\n <!-- Trigger slot for custom trigger -->\n <ng-content select=\"[pdmPopoverTrigger]\"></ng-content>\n\n <!-- Template for CDK Overlay -->\n <ng-template #panelTemplate>\n <div\n class=\"min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md\"\n >\n <ng-content></ng-content>\n </div>\n </ng-template>\n</div>\n", styles: [":host{display:inline-block}\n"] }]
5650
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { triggerText: [{
5053
5651
  type: Input
5054
5652
  }], className: [{
5055
5653
  type: Input
@@ -5059,26 +5657,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
5059
5657
  type: Input
5060
5658
  }], openChange: [{
5061
5659
  type: Output
5062
- }], anchorRef: [{
5063
- type: ViewChild,
5064
- args: ['anchorEl']
5065
5660
  }], triggerRef: [{
5066
5661
  type: ViewChild,
5067
- args: ['triggerEl']
5068
- }], panelRef: [{
5662
+ args: ["triggerEl"]
5663
+ }], panelTemplateRef: [{
5069
5664
  type: ViewChild,
5070
- args: ['panelEl']
5665
+ args: ["panelTemplate"]
5071
5666
  }], open: [{
5072
5667
  type: Input
5073
5668
  }], onEsc: [{
5074
5669
  type: HostListener,
5075
- args: ['document:keydown.escape']
5076
- }], onViewportChange: [{
5077
- type: HostListener,
5078
- args: ['window:resize']
5079
- }, {
5080
- type: HostListener,
5081
- args: ['window:scroll']
5670
+ args: ["document:keydown.escape"]
5082
5671
  }] } });
5083
5672
 
5084
5673
  class PdmProgressComponent {
@@ -5530,8 +6119,8 @@ class PdmTabsComponent {
5530
6119
  constructor(cdr) {
5531
6120
  this.cdr = cdr;
5532
6121
  this.items = [];
5533
- this.value = '';
5534
- this.className = '';
6122
+ this.value = "";
6123
+ this.className = "";
5535
6124
  this.valueChange = new EventEmitter();
5536
6125
  }
5537
6126
  select(item) {
@@ -5543,10 +6132,10 @@ class PdmTabsComponent {
5543
6132
  }
5544
6133
  }
5545
6134
  PdmTabsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTabsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5546
- PdmTabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTabsComponent, selector: "pdm-tabs", inputs: { items: "items", value: "value", className: "className" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [ngClass]=\"['w-full', className]\">\n <div\n role=\"tablist\"\n class=\"inline-flex h-8 w-full items-center overflow-x-auto scrollbar-thin rounded-lg bg-muted p-[3px] text-muted-foreground md:w-fit\"\n >\n <button\n *ngFor=\"let item of items\"\n role=\"tab\"\n [attr.aria-selected]=\"value === item.value\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative inline-flex h-[calc(100%-1px)] appearance-none flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-0.5 text-sm font-medium transition-all focus-visible:border-ring focus-visible:outline-none focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 md:flex-initial md:px-4',\n value === item.value ? 'bg-background text-foreground shadow-sm' : 'bg-transparent text-muted-foreground'\n ]\"\n (click)=\"select(item)\"\n type=\"button\"\n >\n {{ item.label }}\n </button>\n </div>\n <div class=\"mt-4\">\n <ng-content></ng-content>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6135
+ PdmTabsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTabsComponent, selector: "pdm-tabs", inputs: { items: "items", value: "value", className: "className" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [ngClass]=\"['w-full', className]\">\n <div\n role=\"tablist\"\n class=\"inline-flex h-8 w-full items-center overflow-x-auto scrollbar-thin rounded-lg bg-muted p-[3px] text-muted-foreground md:w-fit\"\n >\n <button\n *ngFor=\"let item of items\"\n role=\"tab\"\n [attr.aria-selected]=\"value === item.value\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative inline-flex h-[calc(100%-1px)] appearance-none flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-0.5 text-sm font-medium transition-all focus-visible:border-ring focus-visible:outline-none focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 md:flex-initial md:px-4',\n value === item.value ? 'bg-background text-foreground shadow-sm' : 'bg-transparent text-muted-foreground'\n ]\"\n (click)=\"select(item)\"\n type=\"button\"\n >\n {{ item.label }}\n </button>\n </div>\n <div class=\"mt-4\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5547
6136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTabsComponent, decorators: [{
5548
6137
  type: Component,
5549
- args: [{ selector: 'pdm-tabs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['w-full', className]\">\n <div\n role=\"tablist\"\n class=\"inline-flex h-8 w-full items-center overflow-x-auto scrollbar-thin rounded-lg bg-muted p-[3px] text-muted-foreground md:w-fit\"\n >\n <button\n *ngFor=\"let item of items\"\n role=\"tab\"\n [attr.aria-selected]=\"value === item.value\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative inline-flex h-[calc(100%-1px)] appearance-none flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-0.5 text-sm font-medium transition-all focus-visible:border-ring focus-visible:outline-none focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 md:flex-initial md:px-4',\n value === item.value ? 'bg-background text-foreground shadow-sm' : 'bg-transparent text-muted-foreground'\n ]\"\n (click)=\"select(item)\"\n type=\"button\"\n >\n {{ item.label }}\n </button>\n </div>\n <div class=\"mt-4\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
6138
+ args: [{ selector: "pdm-tabs", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['w-full', className]\">\n <div\n role=\"tablist\"\n class=\"inline-flex h-8 w-full items-center overflow-x-auto scrollbar-thin rounded-lg bg-muted p-[3px] text-muted-foreground md:w-fit\"\n >\n <button\n *ngFor=\"let item of items\"\n role=\"tab\"\n [attr.aria-selected]=\"value === item.value\"\n [disabled]=\"item.disabled\"\n [ngClass]=\"[\n 'relative inline-flex h-[calc(100%-1px)] appearance-none flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-3 py-0.5 text-sm font-medium transition-all focus-visible:border-ring focus-visible:outline-none focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 md:flex-initial md:px-4',\n value === item.value ? 'bg-background text-foreground shadow-sm' : 'bg-transparent text-muted-foreground'\n ]\"\n (click)=\"select(item)\"\n type=\"button\"\n >\n {{ item.label }}\n </button>\n </div>\n <div class=\"mt-4\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host{display:block}\n"] }]
5550
6139
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { items: [{
5551
6140
  type: Input
5552
6141
  }], value: [{
@@ -5654,8 +6243,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
5654
6243
  class PdmToggleGroupComponent {
5655
6244
  constructor() {
5656
6245
  this.items = [];
5657
- this.value = '';
5658
- this.className = '';
6246
+ this.value = "";
6247
+ this.className = "";
5659
6248
  this.valueChange = new EventEmitter();
5660
6249
  }
5661
6250
  onSelect(next, disabled) {
@@ -5665,10 +6254,10 @@ class PdmToggleGroupComponent {
5665
6254
  }
5666
6255
  }
5667
6256
  PdmToggleGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmToggleGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5668
- PdmToggleGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmToggleGroupComponent, selector: "pdm-toggle-group", inputs: { items: "items", value: "value", className: "className" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [ngClass]=\"['inline-flex items-center rounded-md border border-border p-1', className]\" role=\"group\">\n <button\n *ngFor=\"let item of items\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.value === value\"\n [ngClass]=\"[\n 'inline-flex h-8 appearance-none items-center justify-center rounded-sm border-0 bg-transparent px-2.5 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n item.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent hover:text-accent-foreground'\n ]\"\n (click)=\"onSelect(item.value, item.disabled)\"\n >\n {{ item.label }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6257
+ PdmToggleGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmToggleGroupComponent, selector: "pdm-toggle-group", inputs: { items: "items", value: "value", className: "className" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div\n [ngClass]=\"[\n 'flex flex-wrap items-center rounded-md border border-border p-1 gap-1',\n className,\n ]\"\n role=\"group\"\n>\n <button\n *ngFor=\"let item of items\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.value === value\"\n [ngClass]=\"[\n 'inline-flex h-8 appearance-none items-center justify-center rounded-sm border-0 bg-transparent px-2.5 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n item.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent hover:text-accent-foreground',\n ]\"\n (click)=\"onSelect(item.value, item.disabled)\"\n >\n {{ item.label }}\n </button>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5669
6258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmToggleGroupComponent, decorators: [{
5670
6259
  type: Component,
5671
- args: [{ selector: 'pdm-toggle-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['inline-flex items-center rounded-md border border-border p-1', className]\" role=\"group\">\n <button\n *ngFor=\"let item of items\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.value === value\"\n [ngClass]=\"[\n 'inline-flex h-8 appearance-none items-center justify-center rounded-sm border-0 bg-transparent px-2.5 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n item.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent hover:text-accent-foreground'\n ]\"\n (click)=\"onSelect(item.value, item.disabled)\"\n >\n {{ item.label }}\n </button>\n</div>\n" }]
6260
+ args: [{ selector: "pdm-toggle-group", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngClass]=\"[\n 'flex flex-wrap items-center rounded-md border border-border p-1 gap-1',\n className,\n ]\"\n role=\"group\"\n>\n <button\n *ngFor=\"let item of items\"\n type=\"button\"\n [disabled]=\"item.disabled\"\n [attr.aria-pressed]=\"item.value === value\"\n [ngClass]=\"[\n 'inline-flex h-8 appearance-none items-center justify-center rounded-sm border-0 bg-transparent px-2.5 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n item.value === value\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-accent hover:text-accent-foreground',\n ]\"\n (click)=\"onSelect(item.value, item.disabled)\"\n >\n {{ item.label }}\n </button>\n</div>\n", styles: [":host{display:block}\n"] }]
5672
6261
  }], propDecorators: { items: [{
5673
6262
  type: Input
5674
6263
  }], value: [{
@@ -5680,33 +6269,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
5680
6269
  }] } });
5681
6270
 
5682
6271
  class PdmTooltipComponent {
5683
- constructor() {
5684
- this.text = '';
5685
- this.side = 'top';
5686
- this.className = '';
6272
+ constructor(overlay, viewContainerRef, elementRef, cdr) {
6273
+ this.overlay = overlay;
6274
+ this.viewContainerRef = viewContainerRef;
6275
+ this.elementRef = elementRef;
6276
+ this.cdr = cdr;
6277
+ this.text = "";
6278
+ this.side = "top";
6279
+ this.className = "";
5687
6280
  this.open = false;
6281
+ this.overlayRef = null;
6282
+ }
6283
+ ngOnDestroy() {
6284
+ this.destroyOverlay();
6285
+ }
6286
+ onMouseEnter() {
6287
+ this.show();
6288
+ }
6289
+ onMouseLeave() {
6290
+ this.hide();
6291
+ }
6292
+ onFocusIn() {
6293
+ this.show();
5688
6294
  }
5689
- get positionClass() {
5690
- if (this.side === 'bottom')
5691
- return 'top-full left-1/2 -translate-x-1/2 mt-2';
5692
- if (this.side === 'left')
5693
- return 'right-full top-1/2 -translate-y-1/2 mr-2';
5694
- if (this.side === 'right')
5695
- return 'left-full top-1/2 -translate-y-1/2 ml-2';
5696
- return 'bottom-full left-1/2 -translate-x-1/2 mb-2';
6295
+ onFocusOut() {
6296
+ this.hide();
6297
+ }
6298
+ show() {
6299
+ if (this.open || !this.text)
6300
+ return;
6301
+ this.open = true;
6302
+ this.cdr.markForCheck();
6303
+ this.createOverlay();
6304
+ }
6305
+ hide() {
6306
+ if (!this.open)
6307
+ return;
6308
+ this.open = false;
6309
+ this.cdr.markForCheck();
6310
+ this.destroyOverlay();
6311
+ }
6312
+ createOverlay() {
6313
+ if (this.overlayRef)
6314
+ return;
6315
+ const triggerEl = this.elementRef.nativeElement.querySelector(":scope > *") ||
6316
+ this.elementRef.nativeElement;
6317
+ const positionStrategy = this.overlay
6318
+ .position()
6319
+ .flexibleConnectedTo(triggerEl)
6320
+ .withPositions(this.getPositionConfigs())
6321
+ .withFlexibleDimensions(false)
6322
+ .withPush(true);
6323
+ const panelClass = mergeOverlayPanelClass(OVERLAY_BASE_Z_INDEX);
6324
+ this.overlayRef = this.overlay.create({
6325
+ positionStrategy,
6326
+ panelClass,
6327
+ });
6328
+ const portal = new TemplatePortal(this.tooltipTemplate, this.viewContainerRef);
6329
+ this.overlayRef.attach(portal);
6330
+ }
6331
+ destroyOverlay() {
6332
+ if (this.overlayRef) {
6333
+ this.overlayRef.detach();
6334
+ this.overlayRef.dispose();
6335
+ this.overlayRef = null;
6336
+ }
6337
+ }
6338
+ getPositionConfigs() {
6339
+ const offset = 4;
6340
+ switch (this.side) {
6341
+ case "bottom":
6342
+ return [
6343
+ {
6344
+ originX: "center",
6345
+ originY: "bottom",
6346
+ overlayX: "center",
6347
+ overlayY: "top",
6348
+ offsetY: offset,
6349
+ },
6350
+ {
6351
+ originX: "center",
6352
+ originY: "top",
6353
+ overlayX: "center",
6354
+ overlayY: "bottom",
6355
+ offsetY: -offset,
6356
+ },
6357
+ ];
6358
+ case "left":
6359
+ return [
6360
+ {
6361
+ originX: "start",
6362
+ originY: "center",
6363
+ overlayX: "end",
6364
+ overlayY: "center",
6365
+ offsetX: -offset,
6366
+ },
6367
+ {
6368
+ originX: "end",
6369
+ originY: "center",
6370
+ overlayX: "start",
6371
+ overlayY: "center",
6372
+ offsetX: offset,
6373
+ },
6374
+ ];
6375
+ case "right":
6376
+ return [
6377
+ {
6378
+ originX: "end",
6379
+ originY: "center",
6380
+ overlayX: "start",
6381
+ overlayY: "center",
6382
+ offsetX: offset,
6383
+ },
6384
+ {
6385
+ originX: "start",
6386
+ originY: "center",
6387
+ overlayX: "end",
6388
+ overlayY: "center",
6389
+ offsetX: -offset,
6390
+ },
6391
+ ];
6392
+ case "top":
6393
+ default:
6394
+ return [
6395
+ {
6396
+ originX: "center",
6397
+ originY: "top",
6398
+ overlayX: "center",
6399
+ overlayY: "bottom",
6400
+ offsetY: -offset,
6401
+ },
6402
+ {
6403
+ originX: "center",
6404
+ originY: "bottom",
6405
+ overlayX: "center",
6406
+ overlayY: "top",
6407
+ offsetY: offset,
6408
+ },
6409
+ ];
6410
+ }
5697
6411
  }
5698
6412
  }
5699
- PdmTooltipComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5700
- PdmTooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTooltipComponent, selector: "pdm-tooltip", inputs: { text: "text", side: "side", className: "className" }, ngImport: i0, template: "<span class=\"relative inline-flex\" [ngClass]=\"className\" (mouseenter)=\"open = true\" (mouseleave)=\"open = false\" (focusin)=\"open = true\" (focusout)=\"open = false\">\n <ng-content></ng-content>\n <span *ngIf=\"open\" [ngClass]=\"['pointer-events-none absolute z-[70] overflow-hidden rounded-md bg-foreground px-3 py-1.5 text-xs text-background animate-in fade-in-0 zoom-in-95', positionClass]\">\n {{ text }}\n </span>\n</span>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6413
+ PdmTooltipComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTooltipComponent, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
6414
+ PdmTooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmTooltipComponent, selector: "pdm-tooltip", inputs: { text: "text", side: "side", className: "className" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focusin": "onFocusIn()", "focusout": "onFocusOut()" } }, viewQueries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltipTemplate"], descendants: true }], ngImport: i0, template: "<span\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n>\n <ng-content></ng-content>\n\n <!-- Template for CDK Overlay -->\n <ng-template #tooltipTemplate>\n <span\n class=\"pointer-events-none overflow-hidden rounded-md bg-foreground px-3 py-1.5 text-xs text-background animate-in fade-in-0 zoom-in-95\"\n >\n {{ text }}\n </span>\n </ng-template>\n</span>\n", styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5701
6415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmTooltipComponent, decorators: [{
5702
6416
  type: Component,
5703
- args: [{ selector: 'pdm-tooltip', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"relative inline-flex\" [ngClass]=\"className\" (mouseenter)=\"open = true\" (mouseleave)=\"open = false\" (focusin)=\"open = true\" (focusout)=\"open = false\">\n <ng-content></ng-content>\n <span *ngIf=\"open\" [ngClass]=\"['pointer-events-none absolute z-[70] overflow-hidden rounded-md bg-foreground px-3 py-1.5 text-xs text-background animate-in fade-in-0 zoom-in-95', positionClass]\">\n {{ text }}\n </span>\n</span>\n" }]
5704
- }], propDecorators: { text: [{
6417
+ args: [{ selector: "pdm-tooltip", changeDetection: ChangeDetectionStrategy.OnPush, template: "<span\n class=\"relative inline-flex\"\n [ngClass]=\"className\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut()\"\n>\n <ng-content></ng-content>\n\n <!-- Template for CDK Overlay -->\n <ng-template #tooltipTemplate>\n <span\n class=\"pointer-events-none overflow-hidden rounded-md bg-foreground px-3 py-1.5 text-xs text-background animate-in fade-in-0 zoom-in-95\"\n >\n {{ text }}\n </span>\n </ng-template>\n</span>\n", styles: [":host{display:inline-flex}\n"] }]
6418
+ }], ctorParameters: function () { return [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { text: [{
5705
6419
  type: Input
5706
6420
  }], side: [{
5707
6421
  type: Input
5708
6422
  }], className: [{
5709
6423
  type: Input
6424
+ }], tooltipTemplate: [{
6425
+ type: ViewChild,
6426
+ args: ["tooltipTemplate"]
6427
+ }], onMouseEnter: [{
6428
+ type: HostListener,
6429
+ args: ["mouseenter"]
6430
+ }], onMouseLeave: [{
6431
+ type: HostListener,
6432
+ args: ["mouseleave"]
6433
+ }], onFocusIn: [{
6434
+ type: HostListener,
6435
+ args: ["focusin"]
6436
+ }], onFocusOut: [{
6437
+ type: HostListener,
6438
+ args: ["focusout"]
5710
6439
  }] } });
5711
6440
 
5712
6441
  const COMPONENTS = [
@@ -5907,5 +6636,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
5907
6636
  * Generated bundle index. Do not edit.
5908
6637
  */
5909
6638
 
5910
- export { BREAKPOINTS, PdmAccordionComponent, PdmAlertComponent, PdmAlertDialogComponent, PdmAspectRatioComponent, PdmAvatarComponent, PdmBadgeComponent, PdmBreadcrumbComponent, PdmButtonComponent, PdmButtonGroupComponent, PdmCalendarComponent, PdmCardComponent, PdmCarouselComponent, PdmChartComponent, PdmCheckboxComponent, PdmCollapsibleComponent, PdmComboboxComponent, PdmCommandComponent, PdmContextMenuComponent, PdmDataTableComponent, PdmDatePickerComponent, PdmDialogComponent, PdmDraggableTableComponent, PdmDrawerComponent, PdmDropdownMenuComponent, PdmEmptyComponent, PdmFieldComponent, PdmHoverCardComponent, PdmIconComponent, PdmInputComponent, PdmInputGroupComponent, PdmInputOtpComponent, PdmInputPasswordComponent, PdmItemComponent, PdmKbdComponent, PdmLabelComponent, PdmMenubarComponent, PdmNativeSelectComponent, PdmNavigationMenuComponent, PdmOutsideClickDirective, PdmPaginationComponent, PdmPopoverComponent, PdmProgressComponent, PdmRadioGroupComponent, PdmScrollAreaComponent, PdmSelectComponent, PdmSelectOptionDirective, PdmSeparatorComponent, PdmSheetComponent, PdmSidebarComponent, PdmSkeletonComponent, PdmSliderComponent, PdmSonnerComponent, PdmSpinnerComponent, PdmSwitchComponent, PdmTableComponent, PdmTabsComponent, PdmTextareaComponent, PdmToggleComponent, PdmToggleGroupComponent, PdmTooltipComponent, PdmUiKitModule, RESPONSIVE_CONTAINER, RESPONSIVE_DISPLAY, TABLE_RESPONSIVE, Z_INDEX, createFlexiblePositionStrategy, logZIndexStack, overflowResponsive, responsive, spacingResponsive, widthResponsive };
6639
+ export { BREAKPOINTS, OVERLAY_BASE_Z_INDEX, PdmAccordionComponent, PdmAlertComponent, PdmAlertDialogComponent, PdmAspectRatioComponent, PdmAvatarComponent, PdmBadgeComponent, PdmBreadcrumbComponent, PdmButtonComponent, PdmButtonGroupComponent, PdmCalendarComponent, PdmCardComponent, PdmCarouselComponent, PdmChartComponent, PdmCheckboxComponent, PdmCollapsibleComponent, PdmComboboxComponent, PdmCommandComponent, PdmContextMenuComponent, PdmDataTableComponent, PdmDatePickerComponent, PdmDialogComponent, PdmDraggableTableComponent, PdmDrawerComponent, PdmDropdownMenuComponent, PdmEmptyComponent, PdmFieldComponent, PdmHoverCardComponent, PdmIconComponent, PdmInputComponent, PdmInputGroupComponent, PdmInputOtpComponent, PdmInputPasswordComponent, PdmItemComponent, PdmKbdComponent, PdmLabelComponent, PdmMenubarComponent, PdmNativeSelectComponent, PdmNavigationMenuComponent, PdmOutsideClickDirective, PdmPaginationComponent, PdmPopoverComponent, PdmProgressComponent, PdmRadioGroupComponent, PdmScrollAreaComponent, PdmSelectComponent, PdmSelectOptionDirective, PdmSeparatorComponent, PdmSheetComponent, PdmSidebarComponent, PdmSkeletonComponent, PdmSliderComponent, PdmSonnerComponent, PdmSpinnerComponent, PdmSwitchComponent, PdmTableComponent, PdmTabsComponent, PdmTextareaComponent, PdmToggleComponent, PdmToggleGroupComponent, PdmTooltipComponent, PdmUiKitModule, RESPONSIVE_CONTAINER, RESPONSIVE_DISPLAY, TABLE_RESPONSIVE, Z_INDEX, createFlexiblePositionStrategy, createZIndexEnforcedOverlay, extractZIndex, logZIndexStack, mergeOverlayPanelClass, overflowResponsive, responsive, spacingResponsive, widthResponsive };
5911
6640
  //# sourceMappingURL=pdm-ui-kit.mjs.map