@helixui/library 0.3.2 → 0.3.3

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.
@@ -394,126 +394,182 @@
394
394
  },
395
395
  {
396
396
  "kind": "javascript-module",
397
- "path": "src/components/hx-action-bar/hx-action-bar.ts",
397
+ "path": "src/components/hx-alert/hx-alert.ts",
398
398
  "declarations": [
399
399
  {
400
400
  "kind": "class",
401
- "description": "A horizontal toolbar container for grouping related action buttons and controls.\nImplements the ARIA toolbar pattern with roving tabindex keyboard navigation.",
402
- "name": "HelixActionBar",
401
+ "description": "A feedback component for communicating status messages, warnings, and errors.\nCritical for healthcare patient safety alerts.",
402
+ "name": "HelixAlert",
403
403
  "cssProperties": [
404
404
  {
405
- "description": "Bar background color (default variant).",
406
- "name": "--hx-action-bar-bg",
407
- "default": "transparent"
405
+ "description": "Alert background color.",
406
+ "name": "--hx-alert-bg",
407
+ "default": "var(--hx-color-info-50)"
408
408
  },
409
409
  {
410
- "description": "Bar border (default variant).",
411
- "name": "--hx-action-bar-border",
412
- "default": "none"
410
+ "description": "Alert text color.",
411
+ "name": "--hx-alert-color",
412
+ "default": "var(--hx-color-info-800)"
413
413
  },
414
414
  {
415
- "description": "Inner padding.",
416
- "name": "--hx-action-bar-padding",
417
- "default": "var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)"
415
+ "description": "Alert border color.",
416
+ "name": "--hx-alert-border-color",
417
+ "default": "var(--hx-color-info-200)"
418
418
  },
419
419
  {
420
- "description": "Gap between slotted items.",
421
- "name": "--hx-action-bar-gap",
422
- "default": "var(--hx-space-2,0.5rem)"
420
+ "description": "Alert border radius.",
421
+ "name": "--hx-alert-border-radius",
422
+ "default": "var(--hx-border-radius-md)"
423
423
  },
424
424
  {
425
- "description": "Z-index when sticky or bottom position.",
426
- "name": "--hx-action-bar-z-index",
427
- "default": "10"
425
+ "description": "Alert border width.",
426
+ "name": "--hx-alert-border-width",
427
+ "default": "var(--hx-border-width-thin)"
428
+ },
429
+ {
430
+ "description": "Alert padding.",
431
+ "name": "--hx-alert-padding",
432
+ "default": "var(--hx-space-4)"
433
+ },
434
+ {
435
+ "description": "Gap between alert elements.",
436
+ "name": "--hx-alert-gap",
437
+ "default": "var(--hx-space-3)"
438
+ },
439
+ {
440
+ "description": "Alert icon color.",
441
+ "name": "--hx-alert-icon-color",
442
+ "default": "var(--hx-color-info-500)"
443
+ },
444
+ {
445
+ "description": "Alert font family.",
446
+ "name": "--hx-alert-font-family",
447
+ "default": "var(--hx-font-family-sans)"
448
+ },
449
+ {
450
+ "description": "Minimum touch target size for the close button.",
451
+ "name": "--hx-touch-target-size",
452
+ "default": "44px"
453
+ },
454
+ {
455
+ "description": "Width of the left border accent stripe.",
456
+ "name": "--hx-alert-accent-width",
457
+ "default": "4px"
428
458
  }
429
459
  ],
430
460
  "cssParts": [
431
461
  {
432
- "description": "The root toolbar container element.",
433
- "name": "base"
462
+ "description": "The outer alert container.",
463
+ "name": "alert"
434
464
  },
435
465
  {
436
- "description": "The start (left) slot wrapper.",
437
- "name": "start"
466
+ "description": "The title/headline container.",
467
+ "name": "title"
438
468
  },
439
469
  {
440
- "description": "The center (default) slot wrapper.",
441
- "name": "center"
470
+ "description": "The icon container.",
471
+ "name": "icon"
442
472
  },
443
473
  {
444
- "description": "The end (right) slot wrapper.",
445
- "name": "end"
474
+ "description": "The message content area.",
475
+ "name": "message"
446
476
  },
447
477
  {
448
- "description": "The overflow slot wrapper (hidden when no overflow content).",
449
- "name": "overflow"
478
+ "description": "The dismiss button (only rendered when dismissible).",
479
+ "name": "close-button"
480
+ },
481
+ {
482
+ "description": "The actions container.",
483
+ "name": "actions"
450
484
  }
451
485
  ],
452
486
  "slots": [
453
487
  {
454
- "description": "Left-aligned actions.",
455
- "name": "start"
488
+ "description": "Default slot for alert message content.",
489
+ "name": ""
456
490
  },
457
491
  {
458
- "description": "Center content (default slot).",
459
- "name": ""
492
+ "description": "Optional title/headline for the alert.",
493
+ "name": "title"
460
494
  },
461
495
  {
462
- "description": "Right-aligned actions.",
463
- "name": "end"
496
+ "description": "Custom icon to override the default variant icon.",
497
+ "name": "icon"
464
498
  },
465
499
  {
466
- "description": "Actions revealed when the bar is constrained for space.",
467
- "name": "overflow"
500
+ "description": "Action buttons rendered within the alert.",
501
+ "name": "actions"
468
502
  }
469
503
  ],
470
504
  "members": [
471
505
  {
472
506
  "kind": "field",
473
- "name": "size",
507
+ "name": "variant",
474
508
  "type": {
475
- "text": "'sm' | 'md' | 'lg'"
509
+ "text": "AlertVariant"
476
510
  },
477
- "default": "'md'",
478
- "description": "Size of the action bar propagated as a data attribute to slotted children.",
479
- "attribute": "size",
511
+ "default": "'info'",
512
+ "description": "Visual variant of the alert that determines colors and ARIA semantics.",
513
+ "attribute": "variant",
480
514
  "reflects": true
481
515
  },
482
516
  {
483
517
  "kind": "field",
484
- "name": "variant",
518
+ "name": "dismissible",
485
519
  "type": {
486
- "text": "'default' | 'outlined' | 'filled'"
520
+ "text": "boolean"
487
521
  },
488
- "default": "'default'",
489
- "description": "Visual variant controlling the bar background.",
490
- "attribute": "variant",
522
+ "default": "false",
523
+ "description": "Whether the alert can be dismissed by the user.",
524
+ "attribute": "dismissible",
491
525
  "reflects": true
492
526
  },
493
527
  {
494
528
  "kind": "field",
495
- "name": "position",
529
+ "name": "open",
496
530
  "type": {
497
- "text": "'top' | 'bottom' | 'sticky'"
531
+ "text": "boolean"
498
532
  },
499
- "default": "'top'",
500
- "description": "Position and sticky behavior of the action bar.\n- `top` normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
501
- "attribute": "position",
533
+ "default": "true",
534
+ "description": "Whether the alert is visible. Set to false to hide the alert.",
535
+ "attribute": "open",
502
536
  "reflects": true
503
537
  },
504
538
  {
505
539
  "kind": "field",
506
- "name": "sticky",
540
+ "name": "showIcon",
507
541
  "type": {
508
542
  "text": "boolean"
509
543
  },
510
- "deprecated": "Use `position=\"sticky\"` instead.\nWhen true, the bar sticks to the top of its scroll container.",
511
- "attribute": "sticky",
544
+ "default": "true",
545
+ "description": "Whether to show the default variant icon. Set to false to hide the icon container entirely.\nNote: Boolean attribute semantics apply — the attribute must be absent (not set to \"false\")\nto hide the icon. `<hx-alert show-icon=\"false\">` still shows the icon because the attribute\nis present; use `<hx-alert>` (attribute absent) or `el.showIcon = false` to hide it.",
546
+ "attribute": "show-icon",
512
547
  "reflects": true
513
548
  },
514
549
  {
515
550
  "kind": "field",
516
- "name": "_sticky",
551
+ "name": "accent",
552
+ "type": {
553
+ "text": "boolean"
554
+ },
555
+ "default": "false",
556
+ "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
557
+ "attribute": "accent",
558
+ "reflects": true
559
+ },
560
+ {
561
+ "kind": "field",
562
+ "name": "returnFocusTo",
563
+ "type": {
564
+ "text": "string | null"
565
+ },
566
+ "default": "null",
567
+ "description": "CSS selector for the element to return focus to after the alert is dismissed.\nWhen set, the component will find and focus the matching element after dismissal.\nIf not set, focus management is the caller's responsibility via the hx-after-close event.",
568
+ "attribute": "return-focus-to"
569
+ },
570
+ {
571
+ "kind": "field",
572
+ "name": "_hasActions",
517
573
  "type": {
518
574
  "text": "boolean"
519
575
  },
@@ -522,396 +578,351 @@
522
578
  },
523
579
  {
524
580
  "kind": "field",
525
- "name": "ariaLabel",
581
+ "name": "_hasTitle",
526
582
  "type": {
527
- "text": "string"
583
+ "text": "boolean"
528
584
  },
529
- "default": "'Actions'",
530
- "description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.",
531
- "attribute": "aria-label"
585
+ "privacy": "private",
586
+ "default": "false"
532
587
  },
533
588
  {
534
589
  "kind": "field",
535
- "name": "_focusableCache",
590
+ "name": "_actionsSlotChangeHandler",
536
591
  "type": {
537
- "text": "HTMLElement[] | null"
592
+ "text": "(() => void) | null"
538
593
  },
539
594
  "privacy": "private",
540
- "default": "null",
541
- "description": "Cached list of focusable items — invalidated on slot change."
595
+ "default": "null"
542
596
  },
543
597
  {
544
598
  "kind": "field",
545
- "name": "_hasOverflow",
599
+ "name": "_titleSlotChangeHandler",
600
+ "type": {
601
+ "text": "(() => void) | null"
602
+ },
603
+ "privacy": "private",
604
+ "default": "null"
605
+ },
606
+ {
607
+ "kind": "field",
608
+ "name": "_isAssertive",
546
609
  "type": {
547
610
  "text": "boolean"
548
611
  },
549
612
  "privacy": "private",
550
- "default": "false",
551
- "description": "Whether the overflow slot has assigned content."
613
+ "description": "Returns true when the variant requires assertive announcement.",
614
+ "readonly": true
552
615
  },
553
616
  {
554
617
  "kind": "field",
555
- "name": "_handleKeydown",
618
+ "name": "_role",
619
+ "type": {
620
+ "text": "string"
621
+ },
556
622
  "privacy": "private",
557
- "description": "Arrow function field stable reference for add/removeEventListener."
623
+ "description": "Returns the appropriate ARIA role based on variant.\nrole=\"alert\" implies aria-live=\"assertive\"; role=\"status\" implies aria-live=\"polite\".\nWe do NOT set aria-live explicitly to avoid double-announcements in JAWS.",
624
+ "readonly": true
558
625
  },
559
626
  {
560
627
  "kind": "method",
561
- "name": "_isFocusable",
562
- "privacy": "private",
563
- "return": {
564
- "type": {
565
- "text": "boolean"
566
- }
567
- },
568
- "parameters": [
569
- {
570
- "name": "el",
571
- "type": {
572
- "text": "HTMLElement"
573
- }
574
- }
575
- ]
628
+ "name": "_renderInfoIcon",
629
+ "privacy": "private"
576
630
  },
577
631
  {
578
632
  "kind": "method",
579
- "name": "_getFocusableItems",
580
- "privacy": "private",
581
- "return": {
582
- "type": {
583
- "text": "HTMLElement[]"
584
- }
585
- }
633
+ "name": "_renderSuccessIcon",
634
+ "privacy": "private"
586
635
  },
587
636
  {
588
637
  "kind": "method",
589
- "name": "_initRovingTabindex",
638
+ "name": "_renderWarningIcon",
639
+ "privacy": "private"
640
+ },
641
+ {
642
+ "kind": "method",
643
+ "name": "_renderErrorIcon",
644
+ "privacy": "private"
645
+ },
646
+ {
647
+ "kind": "method",
648
+ "name": "_renderDefaultIcon",
649
+ "privacy": "private"
650
+ },
651
+ {
652
+ "kind": "method",
653
+ "name": "_renderCloseIcon",
654
+ "privacy": "private"
655
+ },
656
+ {
657
+ "kind": "method",
658
+ "name": "_handleDismiss",
590
659
  "privacy": "private",
591
660
  "return": {
592
661
  "type": {
593
662
  "text": "void"
594
663
  }
595
664
  }
596
- },
597
- {
598
- "kind": "method",
599
- "name": "_moveFocus",
600
- "privacy": "private",
601
- "return": {
602
- "type": {
603
- "text": "void"
604
- }
665
+ }
666
+ ],
667
+ "events": [
668
+ {
669
+ "name": "hx-close",
670
+ "type": {
671
+ "text": "CustomEvent<{reason: string}>"
605
672
  },
606
- "parameters": [
607
- {
608
- "name": "direction",
609
- "type": {
610
- "text": "'next' | 'prev'"
611
- }
612
- }
613
- ]
673
+ "description": "Dispatched when the user dismisses the alert."
614
674
  },
615
675
  {
616
- "kind": "method",
617
- "name": "_handleSlotChange",
618
- "privacy": "private",
619
- "return": {
620
- "type": {
621
- "text": "void"
622
- }
676
+ "name": "hx-after-close",
677
+ "type": {
678
+ "text": "CustomEvent"
623
679
  },
624
- "parameters": [
625
- {
626
- "name": "e",
627
- "type": {
628
- "text": "Event"
629
- }
630
- }
631
- ]
680
+ "description": "Dispatched after the alert is dismissed."
632
681
  }
633
682
  ],
634
683
  "attributes": [
635
684
  {
636
- "name": "size",
685
+ "name": "variant",
637
686
  "type": {
638
- "text": "'sm' | 'md' | 'lg'"
687
+ "text": "AlertVariant"
639
688
  },
640
- "default": "'md'",
641
- "description": "Size of the action bar propagated as a data attribute to slotted children.",
642
- "fieldName": "size",
643
- "attribute": "size"
689
+ "default": "'info'",
690
+ "description": "Visual variant of the alert that determines colors and ARIA semantics.",
691
+ "fieldName": "variant",
692
+ "attribute": "variant"
644
693
  },
645
694
  {
646
- "name": "variant",
695
+ "name": "dismissible",
647
696
  "type": {
648
- "text": "'default' | 'outlined' | 'filled'"
697
+ "text": "boolean"
649
698
  },
650
- "default": "'default'",
651
- "description": "Visual variant controlling the bar background.",
652
- "fieldName": "variant",
653
- "attribute": "variant"
699
+ "default": "false",
700
+ "description": "Whether the alert can be dismissed by the user.",
701
+ "fieldName": "dismissible",
702
+ "attribute": "dismissible"
654
703
  },
655
704
  {
656
- "name": "position",
705
+ "name": "open",
657
706
  "type": {
658
- "text": "'top' | 'bottom' | 'sticky'"
707
+ "text": "boolean"
659
708
  },
660
- "default": "'top'",
661
- "description": "Position and sticky behavior of the action bar.\n- `top` normal flow (default)\n- `sticky` — sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` — sticks to the bottom of the scroll container with iOS safe-area-inset support",
662
- "fieldName": "position",
663
- "attribute": "position"
709
+ "default": "true",
710
+ "description": "Whether the alert is visible. Set to false to hide the alert.",
711
+ "fieldName": "open",
712
+ "attribute": "open"
664
713
  },
665
714
  {
666
- "name": "sticky",
715
+ "name": "show-icon",
667
716
  "type": {
668
717
  "text": "boolean"
669
718
  },
670
- "deprecated": "Use `position=\"sticky\"` instead.\nWhen true, the bar sticks to the top of its scroll container.",
671
- "fieldName": "sticky",
672
- "attribute": "sticky"
719
+ "default": "true",
720
+ "description": "Whether to show the default variant icon. Set to false to hide the icon container entirely.\nNote: Boolean attribute semantics apply — the attribute must be absent (not set to \"false\")\nto hide the icon. `<hx-alert show-icon=\"false\">` still shows the icon because the attribute\nis present; use `<hx-alert>` (attribute absent) or `el.showIcon = false` to hide it.",
721
+ "fieldName": "showIcon",
722
+ "attribute": "show-icon"
673
723
  },
674
724
  {
675
- "name": "aria-label",
725
+ "name": "accent",
676
726
  "type": {
677
- "text": "string"
727
+ "text": "boolean"
678
728
  },
679
- "default": "'Actions'",
680
- "description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.",
681
- "fieldName": "ariaLabel",
682
- "attribute": "aria-label"
729
+ "default": "false",
730
+ "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
731
+ "fieldName": "accent",
732
+ "attribute": "accent"
733
+ },
734
+ {
735
+ "name": "return-focus-to",
736
+ "type": {
737
+ "text": "string | null"
738
+ },
739
+ "default": "null",
740
+ "description": "CSS selector for the element to return focus to after the alert is dismissed.\nWhen set, the component will find and focus the matching element after dismissal.\nIf not set, focus management is the caller's responsibility via the hx-after-close event.",
741
+ "fieldName": "returnFocusTo",
742
+ "attribute": "return-focus-to"
683
743
  }
684
744
  ],
685
745
  "superclass": {
686
746
  "name": "LitElement",
687
747
  "package": "lit"
688
748
  },
689
- "tagName": "hx-action-bar",
749
+ "tagName": "hx-alert",
690
750
  "customElement": true,
691
- "summary": "Horizontal action bar for grouping related controls."
751
+ "summary": "Feedback alert for status messages with variant-based styling and ARIA live regions."
692
752
  }
693
753
  ],
694
754
  "exports": [
695
755
  {
696
756
  "kind": "js",
697
- "name": "HelixActionBar",
757
+ "name": "HelixAlert",
698
758
  "declaration": {
699
- "name": "HelixActionBar",
700
- "module": "src/components/hx-action-bar/hx-action-bar.ts"
759
+ "name": "HelixAlert",
760
+ "module": "src/components/hx-alert/hx-alert.ts"
701
761
  }
702
762
  },
703
763
  {
704
764
  "kind": "custom-element-definition",
705
- "name": "hx-action-bar",
765
+ "name": "hx-alert",
706
766
  "declaration": {
707
- "name": "HelixActionBar",
708
- "module": "src/components/hx-action-bar/hx-action-bar.ts"
767
+ "name": "HelixAlert",
768
+ "module": "src/components/hx-alert/hx-alert.ts"
769
+ }
770
+ },
771
+ {
772
+ "kind": "js",
773
+ "name": "HxAlert",
774
+ "declaration": {
775
+ "name": "HelixAlert",
776
+ "module": "src/components/hx-alert/hx-alert.ts"
709
777
  }
710
778
  }
711
779
  ]
712
780
  },
713
781
  {
714
782
  "kind": "javascript-module",
715
- "path": "src/components/hx-action-bar/index.ts",
783
+ "path": "src/components/hx-alert/index.ts",
716
784
  "declarations": [],
717
785
  "exports": [
718
786
  {
719
787
  "kind": "js",
720
- "name": "HelixActionBar",
788
+ "name": "HelixAlert",
721
789
  "declaration": {
722
- "name": "HelixActionBar",
723
- "module": "./hx-action-bar.js"
790
+ "name": "HelixAlert",
791
+ "module": "./hx-alert.js"
792
+ }
793
+ },
794
+ {
795
+ "kind": "js",
796
+ "name": "AlertVariant",
797
+ "declaration": {
798
+ "name": "AlertVariant",
799
+ "module": "./hx-alert.js"
724
800
  }
725
801
  }
726
802
  ]
727
803
  },
728
804
  {
729
805
  "kind": "javascript-module",
730
- "path": "src/components/hx-alert/hx-alert.ts",
806
+ "path": "src/components/hx-action-bar/hx-action-bar.ts",
731
807
  "declarations": [
732
808
  {
733
809
  "kind": "class",
734
- "description": "A feedback component for communicating status messages, warnings, and errors.\nCritical for healthcare patient safety alerts.",
735
- "name": "HelixAlert",
810
+ "description": "A horizontal toolbar container for grouping related action buttons and controls.\nImplements the ARIA toolbar pattern with roving tabindex keyboard navigation.",
811
+ "name": "HelixActionBar",
736
812
  "cssProperties": [
737
813
  {
738
- "description": "Alert background color.",
739
- "name": "--hx-alert-bg",
740
- "default": "var(--hx-color-info-50)"
741
- },
742
- {
743
- "description": "Alert text color.",
744
- "name": "--hx-alert-color",
745
- "default": "var(--hx-color-info-800)"
746
- },
747
- {
748
- "description": "Alert border color.",
749
- "name": "--hx-alert-border-color",
750
- "default": "var(--hx-color-info-200)"
751
- },
752
- {
753
- "description": "Alert border radius.",
754
- "name": "--hx-alert-border-radius",
755
- "default": "var(--hx-border-radius-md)"
756
- },
757
- {
758
- "description": "Alert border width.",
759
- "name": "--hx-alert-border-width",
760
- "default": "var(--hx-border-width-thin)"
761
- },
762
- {
763
- "description": "Alert padding.",
764
- "name": "--hx-alert-padding",
765
- "default": "var(--hx-space-4)"
766
- },
767
- {
768
- "description": "Gap between alert elements.",
769
- "name": "--hx-alert-gap",
770
- "default": "var(--hx-space-3)"
814
+ "description": "Bar background color (default variant).",
815
+ "name": "--hx-action-bar-bg",
816
+ "default": "transparent"
771
817
  },
772
818
  {
773
- "description": "Alert icon color.",
774
- "name": "--hx-alert-icon-color",
775
- "default": "var(--hx-color-info-500)"
819
+ "description": "Bar border (default variant).",
820
+ "name": "--hx-action-bar-border",
821
+ "default": "none"
776
822
  },
777
823
  {
778
- "description": "Alert font family.",
779
- "name": "--hx-alert-font-family",
780
- "default": "var(--hx-font-family-sans)"
824
+ "description": "Inner padding.",
825
+ "name": "--hx-action-bar-padding",
826
+ "default": "var(--hx-space-2,0.5rem) var(--hx-space-3,0.75rem)"
781
827
  },
782
828
  {
783
- "description": "Minimum touch target size for the close button.",
784
- "name": "--hx-touch-target-size",
785
- "default": "44px"
829
+ "description": "Gap between slotted items.",
830
+ "name": "--hx-action-bar-gap",
831
+ "default": "var(--hx-space-2,0.5rem)"
786
832
  },
787
833
  {
788
- "description": "Width of the left border accent stripe.",
789
- "name": "--hx-alert-accent-width",
790
- "default": "4px"
834
+ "description": "Z-index when sticky or bottom position.",
835
+ "name": "--hx-action-bar-z-index",
836
+ "default": "10"
791
837
  }
792
838
  ],
793
839
  "cssParts": [
794
840
  {
795
- "description": "The outer alert container.",
796
- "name": "alert"
797
- },
798
- {
799
- "description": "The title/headline container.",
800
- "name": "title"
841
+ "description": "The root toolbar container element.",
842
+ "name": "base"
801
843
  },
802
844
  {
803
- "description": "The icon container.",
804
- "name": "icon"
845
+ "description": "The start (left) slot wrapper.",
846
+ "name": "start"
805
847
  },
806
848
  {
807
- "description": "The message content area.",
808
- "name": "message"
849
+ "description": "The center (default) slot wrapper.",
850
+ "name": "center"
809
851
  },
810
852
  {
811
- "description": "The dismiss button (only rendered when dismissible).",
812
- "name": "close-button"
853
+ "description": "The end (right) slot wrapper.",
854
+ "name": "end"
813
855
  },
814
856
  {
815
- "description": "The actions container.",
816
- "name": "actions"
857
+ "description": "The overflow slot wrapper (hidden when no overflow content).",
858
+ "name": "overflow"
817
859
  }
818
860
  ],
819
861
  "slots": [
820
862
  {
821
- "description": "Default slot for alert message content.",
822
- "name": ""
863
+ "description": "Left-aligned actions.",
864
+ "name": "start"
823
865
  },
824
866
  {
825
- "description": "Optional title/headline for the alert.",
826
- "name": "title"
867
+ "description": "Center content (default slot).",
868
+ "name": ""
827
869
  },
828
870
  {
829
- "description": "Custom icon to override the default variant icon.",
830
- "name": "icon"
871
+ "description": "Right-aligned actions.",
872
+ "name": "end"
831
873
  },
832
874
  {
833
- "description": "Action buttons rendered within the alert.",
834
- "name": "actions"
875
+ "description": "Actions revealed when the bar is constrained for space.",
876
+ "name": "overflow"
835
877
  }
836
878
  ],
837
879
  "members": [
838
880
  {
839
881
  "kind": "field",
840
- "name": "variant",
882
+ "name": "size",
841
883
  "type": {
842
- "text": "AlertVariant"
843
- },
844
- "default": "'info'",
845
- "description": "Visual variant of the alert that determines colors and ARIA semantics.",
846
- "attribute": "variant",
847
- "reflects": true
848
- },
849
- {
850
- "kind": "field",
851
- "name": "dismissible",
852
- "type": {
853
- "text": "boolean"
884
+ "text": "'sm' | 'md' | 'lg'"
854
885
  },
855
- "default": "false",
856
- "description": "Whether the alert can be dismissed by the user.",
857
- "attribute": "dismissible",
886
+ "default": "'md'",
887
+ "description": "Size of the action bar propagated as a data attribute to slotted children.",
888
+ "attribute": "size",
858
889
  "reflects": true
859
890
  },
860
891
  {
861
892
  "kind": "field",
862
- "name": "open",
893
+ "name": "variant",
863
894
  "type": {
864
- "text": "boolean"
895
+ "text": "'default' | 'outlined' | 'filled'"
865
896
  },
866
- "default": "true",
867
- "description": "Whether the alert is visible. Set to false to hide the alert.",
868
- "attribute": "open",
897
+ "default": "'default'",
898
+ "description": "Visual variant controlling the bar background.",
899
+ "attribute": "variant",
869
900
  "reflects": true
870
901
  },
871
902
  {
872
903
  "kind": "field",
873
- "name": "showIcon",
904
+ "name": "position",
874
905
  "type": {
875
- "text": "boolean"
906
+ "text": "'top' | 'bottom' | 'sticky'"
876
907
  },
877
- "default": "true",
878
- "description": "Whether to show the default variant icon. Set to false to hide the icon container entirely.\nNote: Boolean attribute semantics apply the attribute must be absent (not set to \"false\")\nto hide the icon. `<hx-alert show-icon=\"false\">` still shows the icon because the attribute\nis present; use `<hx-alert>` (attribute absent) or `el.showIcon = false` to hide it.",
879
- "attribute": "show-icon",
908
+ "default": "'top'",
909
+ "description": "Position and sticky behavior of the action bar.\n- `top` normal flow (default)\n- `sticky` sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` sticks to the bottom of the scroll container with iOS safe-area-inset support",
910
+ "attribute": "position",
880
911
  "reflects": true
881
912
  },
882
913
  {
883
914
  "kind": "field",
884
- "name": "accent",
915
+ "name": "sticky",
885
916
  "type": {
886
917
  "text": "boolean"
887
918
  },
888
- "default": "false",
889
- "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
890
- "attribute": "accent",
919
+ "deprecated": "Use `position=\"sticky\"` instead.\nWhen true, the bar sticks to the top of its scroll container.",
920
+ "attribute": "sticky",
891
921
  "reflects": true
892
922
  },
893
923
  {
894
924
  "kind": "field",
895
- "name": "returnFocusTo",
896
- "type": {
897
- "text": "string | null"
898
- },
899
- "default": "null",
900
- "description": "CSS selector for the element to return focus to after the alert is dismissed.\nWhen set, the component will find and focus the matching element after dismissal.\nIf not set, focus management is the caller's responsibility via the hx-after-close event.",
901
- "attribute": "return-focus-to"
902
- },
903
- {
904
- "kind": "field",
905
- "name": "_hasActions",
906
- "type": {
907
- "text": "boolean"
908
- },
909
- "privacy": "private",
910
- "default": "false"
911
- },
912
- {
913
- "kind": "field",
914
- "name": "_hasTitle",
925
+ "name": "_sticky",
915
926
  "type": {
916
927
  "text": "boolean"
917
928
  },
@@ -920,216 +931,205 @@
920
931
  },
921
932
  {
922
933
  "kind": "field",
923
- "name": "_actionsSlotChangeHandler",
934
+ "name": "ariaLabel",
924
935
  "type": {
925
- "text": "(() => void) | null"
936
+ "text": "string"
926
937
  },
927
- "privacy": "private",
928
- "default": "null"
938
+ "default": "'Actions'",
939
+ "description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.",
940
+ "attribute": "aria-label"
929
941
  },
930
942
  {
931
943
  "kind": "field",
932
- "name": "_titleSlotChangeHandler",
944
+ "name": "_focusableCache",
933
945
  "type": {
934
- "text": "(() => void) | null"
946
+ "text": "HTMLElement[] | null"
935
947
  },
936
948
  "privacy": "private",
937
- "default": "null"
949
+ "default": "null",
950
+ "description": "Cached list of focusable items — invalidated on slot change."
938
951
  },
939
952
  {
940
953
  "kind": "field",
941
- "name": "_isAssertive",
954
+ "name": "_hasOverflow",
942
955
  "type": {
943
956
  "text": "boolean"
944
957
  },
945
958
  "privacy": "private",
946
- "description": "Returns true when the variant requires assertive announcement.",
947
- "readonly": true
959
+ "default": "false",
960
+ "description": "Whether the overflow slot has assigned content."
948
961
  },
949
962
  {
950
963
  "kind": "field",
951
- "name": "_role",
952
- "type": {
953
- "text": "string"
954
- },
964
+ "name": "_handleKeydown",
955
965
  "privacy": "private",
956
- "description": "Returns the appropriate ARIA role based on variant.\nrole=\"alert\" implies aria-live=\"assertive\"; role=\"status\" implies aria-live=\"polite\".\nWe do NOT set aria-live explicitly to avoid double-announcements in JAWS.",
957
- "readonly": true
958
- },
959
- {
960
- "kind": "method",
961
- "name": "_renderInfoIcon",
962
- "privacy": "private"
963
- },
964
- {
965
- "kind": "method",
966
- "name": "_renderSuccessIcon",
967
- "privacy": "private"
966
+ "description": "Arrow function field stable reference for add/removeEventListener."
968
967
  },
969
968
  {
970
969
  "kind": "method",
971
- "name": "_renderWarningIcon",
972
- "privacy": "private"
970
+ "name": "_isFocusable",
971
+ "privacy": "private",
972
+ "return": {
973
+ "type": {
974
+ "text": "boolean"
975
+ }
976
+ },
977
+ "parameters": [
978
+ {
979
+ "name": "el",
980
+ "type": {
981
+ "text": "HTMLElement"
982
+ }
983
+ }
984
+ ]
973
985
  },
974
986
  {
975
987
  "kind": "method",
976
- "name": "_renderErrorIcon",
977
- "privacy": "private"
988
+ "name": "_getFocusableItems",
989
+ "privacy": "private",
990
+ "return": {
991
+ "type": {
992
+ "text": "HTMLElement[]"
993
+ }
994
+ }
978
995
  },
979
996
  {
980
997
  "kind": "method",
981
- "name": "_renderDefaultIcon",
982
- "privacy": "private"
998
+ "name": "_initRovingTabindex",
999
+ "privacy": "private",
1000
+ "return": {
1001
+ "type": {
1002
+ "text": "void"
1003
+ }
1004
+ }
983
1005
  },
984
1006
  {
985
1007
  "kind": "method",
986
- "name": "_renderCloseIcon",
987
- "privacy": "private"
1008
+ "name": "_moveFocus",
1009
+ "privacy": "private",
1010
+ "return": {
1011
+ "type": {
1012
+ "text": "void"
1013
+ }
1014
+ },
1015
+ "parameters": [
1016
+ {
1017
+ "name": "direction",
1018
+ "type": {
1019
+ "text": "'next' | 'prev'"
1020
+ }
1021
+ }
1022
+ ]
988
1023
  },
989
1024
  {
990
1025
  "kind": "method",
991
- "name": "_handleDismiss",
1026
+ "name": "_handleSlotChange",
992
1027
  "privacy": "private",
993
1028
  "return": {
994
1029
  "type": {
995
1030
  "text": "void"
996
1031
  }
997
- }
1032
+ },
1033
+ "parameters": [
1034
+ {
1035
+ "name": "e",
1036
+ "type": {
1037
+ "text": "Event"
1038
+ }
1039
+ }
1040
+ ]
998
1041
  }
999
1042
  ],
1000
- "events": [
1043
+ "attributes": [
1001
1044
  {
1002
- "name": "hx-close",
1045
+ "name": "size",
1003
1046
  "type": {
1004
- "text": "CustomEvent<{reason: string}>"
1047
+ "text": "'sm' | 'md' | 'lg'"
1005
1048
  },
1006
- "description": "Dispatched when the user dismisses the alert."
1049
+ "default": "'md'",
1050
+ "description": "Size of the action bar — propagated as a data attribute to slotted children.",
1051
+ "fieldName": "size",
1052
+ "attribute": "size"
1007
1053
  },
1008
- {
1009
- "name": "hx-after-close",
1010
- "type": {
1011
- "text": "CustomEvent"
1012
- },
1013
- "description": "Dispatched after the alert is dismissed."
1014
- }
1015
- ],
1016
- "attributes": [
1017
1054
  {
1018
1055
  "name": "variant",
1019
1056
  "type": {
1020
- "text": "AlertVariant"
1057
+ "text": "'default' | 'outlined' | 'filled'"
1021
1058
  },
1022
- "default": "'info'",
1023
- "description": "Visual variant of the alert that determines colors and ARIA semantics.",
1059
+ "default": "'default'",
1060
+ "description": "Visual variant controlling the bar background.",
1024
1061
  "fieldName": "variant",
1025
1062
  "attribute": "variant"
1026
1063
  },
1027
1064
  {
1028
- "name": "dismissible",
1029
- "type": {
1030
- "text": "boolean"
1031
- },
1032
- "default": "false",
1033
- "description": "Whether the alert can be dismissed by the user.",
1034
- "fieldName": "dismissible",
1035
- "attribute": "dismissible"
1036
- },
1037
- {
1038
- "name": "open",
1039
- "type": {
1040
- "text": "boolean"
1041
- },
1042
- "default": "true",
1043
- "description": "Whether the alert is visible. Set to false to hide the alert.",
1044
- "fieldName": "open",
1045
- "attribute": "open"
1046
- },
1047
- {
1048
- "name": "show-icon",
1065
+ "name": "position",
1049
1066
  "type": {
1050
- "text": "boolean"
1067
+ "text": "'top' | 'bottom' | 'sticky'"
1051
1068
  },
1052
- "default": "true",
1053
- "description": "Whether to show the default variant icon. Set to false to hide the icon container entirely.\nNote: Boolean attribute semantics apply the attribute must be absent (not set to \"false\")\nto hide the icon. `<hx-alert show-icon=\"false\">` still shows the icon because the attribute\nis present; use `<hx-alert>` (attribute absent) or `el.showIcon = false` to hide it.",
1054
- "fieldName": "showIcon",
1055
- "attribute": "show-icon"
1069
+ "default": "'top'",
1070
+ "description": "Position and sticky behavior of the action bar.\n- `top` normal flow (default)\n- `sticky` sticks to the top of the scroll container; add `scroll-padding-top` to the\n scroll container equal to the bar height to prevent anchor targets from scrolling behind it\n- `bottom` sticks to the bottom of the scroll container with iOS safe-area-inset support",
1071
+ "fieldName": "position",
1072
+ "attribute": "position"
1056
1073
  },
1057
1074
  {
1058
- "name": "accent",
1075
+ "name": "sticky",
1059
1076
  "type": {
1060
1077
  "text": "boolean"
1061
1078
  },
1062
- "default": "false",
1063
- "description": "When true, applies a left border accent stripe instead of a full border.\nCommon healthcare/enterprise dashboard pattern for visual distinction of alert types.",
1064
- "fieldName": "accent",
1065
- "attribute": "accent"
1079
+ "deprecated": "Use `position=\"sticky\"` instead.\nWhen true, the bar sticks to the top of its scroll container.",
1080
+ "fieldName": "sticky",
1081
+ "attribute": "sticky"
1066
1082
  },
1067
1083
  {
1068
- "name": "return-focus-to",
1084
+ "name": "aria-label",
1069
1085
  "type": {
1070
- "text": "string | null"
1086
+ "text": "string"
1071
1087
  },
1072
- "default": "null",
1073
- "description": "CSS selector for the element to return focus to after the alert is dismissed.\nWhen set, the component will find and focus the matching element after dismissal.\nIf not set, focus management is the caller's responsibility via the hx-after-close event.",
1074
- "fieldName": "returnFocusTo",
1075
- "attribute": "return-focus-to"
1088
+ "default": "'Actions'",
1089
+ "description": "Accessible label for the toolbar.\nRequired when multiple toolbars appear on the same page.",
1090
+ "fieldName": "ariaLabel",
1091
+ "attribute": "aria-label"
1076
1092
  }
1077
1093
  ],
1078
1094
  "superclass": {
1079
1095
  "name": "LitElement",
1080
1096
  "package": "lit"
1081
1097
  },
1082
- "tagName": "hx-alert",
1098
+ "tagName": "hx-action-bar",
1083
1099
  "customElement": true,
1084
- "summary": "Feedback alert for status messages with variant-based styling and ARIA live regions."
1100
+ "summary": "Horizontal action bar for grouping related controls."
1085
1101
  }
1086
1102
  ],
1087
1103
  "exports": [
1088
1104
  {
1089
1105
  "kind": "js",
1090
- "name": "HelixAlert",
1106
+ "name": "HelixActionBar",
1091
1107
  "declaration": {
1092
- "name": "HelixAlert",
1093
- "module": "src/components/hx-alert/hx-alert.ts"
1108
+ "name": "HelixActionBar",
1109
+ "module": "src/components/hx-action-bar/hx-action-bar.ts"
1094
1110
  }
1095
1111
  },
1096
1112
  {
1097
1113
  "kind": "custom-element-definition",
1098
- "name": "hx-alert",
1099
- "declaration": {
1100
- "name": "HelixAlert",
1101
- "module": "src/components/hx-alert/hx-alert.ts"
1102
- }
1103
- },
1104
- {
1105
- "kind": "js",
1106
- "name": "HxAlert",
1114
+ "name": "hx-action-bar",
1107
1115
  "declaration": {
1108
- "name": "HelixAlert",
1109
- "module": "src/components/hx-alert/hx-alert.ts"
1116
+ "name": "HelixActionBar",
1117
+ "module": "src/components/hx-action-bar/hx-action-bar.ts"
1110
1118
  }
1111
1119
  }
1112
1120
  ]
1113
1121
  },
1114
1122
  {
1115
1123
  "kind": "javascript-module",
1116
- "path": "src/components/hx-alert/index.ts",
1124
+ "path": "src/components/hx-action-bar/index.ts",
1117
1125
  "declarations": [],
1118
1126
  "exports": [
1119
1127
  {
1120
1128
  "kind": "js",
1121
- "name": "HelixAlert",
1122
- "declaration": {
1123
- "name": "HelixAlert",
1124
- "module": "./hx-alert.js"
1125
- }
1126
- },
1127
- {
1128
- "kind": "js",
1129
- "name": "AlertVariant",
1129
+ "name": "HelixActionBar",
1130
1130
  "declaration": {
1131
- "name": "AlertVariant",
1132
- "module": "./hx-alert.js"
1131
+ "name": "HelixActionBar",
1132
+ "module": "./hx-action-bar.js"
1133
1133
  }
1134
1134
  }
1135
1135
  ]
@@ -1852,220 +1852,297 @@
1852
1852
  },
1853
1853
  {
1854
1854
  "kind": "javascript-module",
1855
- "path": "src/components/hx-button/hx-button.ts",
1855
+ "path": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts",
1856
1856
  "declarations": [
1857
1857
  {
1858
1858
  "kind": "class",
1859
- "description": "A production-grade button component for user interaction. Supports multiple\nvisual variants, sizes, loading state, prefix/suffix slots, anchor rendering,\nand full ElementInternals form association.",
1860
- "name": "HelixButton",
1859
+ "description": "A single breadcrumb navigation item.",
1860
+ "name": "HelixBreadcrumbItem",
1861
1861
  "cssProperties": [
1862
1862
  {
1863
- "description": "Button background color.",
1864
- "name": "--hx-button-bg",
1865
- "default": "var(--hx-color-primary-500)"
1863
+ "description": "Link text color.",
1864
+ "name": "--hx-breadcrumb-link-color",
1865
+ "default": "var(--hx-color-primary-600)"
1866
1866
  },
1867
1867
  {
1868
- "description": "Button text color.",
1869
- "name": "--hx-button-color",
1870
- "default": "var(--hx-color-neutral-0)"
1868
+ "description": "Link hover text color.",
1869
+ "name": "--hx-breadcrumb-link-hover-color",
1870
+ "default": "var(--hx-color-primary-700)"
1871
1871
  },
1872
1872
  {
1873
- "description": "Button border color.",
1874
- "name": "--hx-button-border-color",
1875
- "default": "transparent"
1873
+ "description": "Current page text color.",
1874
+ "name": "--hx-breadcrumb-text-color",
1875
+ "default": "var(--hx-color-neutral-700)"
1876
1876
  },
1877
1877
  {
1878
- "description": "Button border radius.",
1879
- "name": "--hx-button-border-radius",
1880
- "default": "var(--hx-border-radius-md)"
1878
+ "description": "Separator character displayed after non-last items.",
1879
+ "name": "--hx-breadcrumb-separator-content",
1880
+ "default": "'/'"
1881
1881
  },
1882
1882
  {
1883
- "description": "Button font family.",
1884
- "name": "--hx-button-font-family",
1885
- "default": "var(--hx-font-family-sans)"
1883
+ "description": "Separator color.",
1884
+ "name": "--hx-breadcrumb-separator-color",
1885
+ "default": "var(--hx-color-neutral-400)"
1886
1886
  },
1887
1887
  {
1888
- "description": "Button font weight.",
1889
- "name": "--hx-button-font-weight",
1890
- "default": "var(--hx-font-weight-semibold)"
1888
+ "description": "Horizontal margin around separator.",
1889
+ "name": "--hx-breadcrumb-separator-gap",
1890
+ "default": "var(--hx-space-1)"
1891
1891
  },
1892
1892
  {
1893
- "description": "Focus ring color.",
1894
- "name": "--hx-button-focus-ring-color",
1895
- "default": "var(--hx-focus-ring-color)"
1893
+ "description": "Optional max-width for text truncation.",
1894
+ "name": "--hx-breadcrumb-item-max-width"
1896
1895
  }
1897
1896
  ],
1898
1897
  "cssParts": [
1899
1898
  {
1900
- "description": "The native button or anchor element.",
1901
- "name": "button"
1902
- },
1903
- {
1904
- "description": "The label text wrapper span.",
1905
- "name": "label"
1899
+ "description": "Wrapper around the link or text content.",
1900
+ "name": "item"
1906
1901
  },
1907
1902
  {
1908
- "description": "The prefix slot container span.",
1909
- "name": "prefix"
1903
+ "description": "The anchor element when href is provided (non-current items only).",
1904
+ "name": "link"
1910
1905
  },
1911
1906
  {
1912
- "description": "The suffix slot container span.",
1913
- "name": "suffix"
1907
+ "description": "The span element for the current page or items without href.",
1908
+ "name": "text"
1914
1909
  },
1915
1910
  {
1916
- "description": "The loading spinner SVG element.",
1917
- "name": "spinner"
1911
+ "description": "The separator element rendered after non-last items.",
1912
+ "name": "separator"
1918
1913
  }
1919
1914
  ],
1920
1915
  "slots": [
1921
1916
  {
1922
- "description": "Default slot for button label text or content.",
1917
+ "description": "The link or page text content. Accepts text, HTML, or icon elements.",
1923
1918
  "name": ""
1919
+ }
1920
+ ],
1921
+ "members": [
1922
+ {
1923
+ "kind": "field",
1924
+ "name": "href",
1925
+ "type": {
1926
+ "text": "string | undefined"
1927
+ },
1928
+ "default": "undefined",
1929
+ "description": "The URL for this breadcrumb link. Omit for the current page item.\nWhen `current` is true, this attribute is ignored and the item always\nrenders as static text per WAI-ARIA APG breadcrumb guidance.",
1930
+ "attribute": "href",
1931
+ "reflects": true
1924
1932
  },
1925
1933
  {
1926
- "description": "Icon or content rendered before the label.",
1927
- "name": "prefix"
1934
+ "kind": "field",
1935
+ "name": "current",
1936
+ "type": {
1937
+ "text": "boolean"
1938
+ },
1939
+ "default": "false",
1940
+ "description": "Marks this item as the current page. When set, the item always renders as\nstatic text (never a navigable link) and `aria-current=\"page\"` is placed on\nthe inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\ncanonical AT announcement (\"current page, Patient Records\").\n\nCan be set explicitly by consumers (e.g. Drupal Twig templates) to override\nthe default positional last-item detection in `hx-breadcrumb`. When any item\nin the breadcrumb has an explicit `current` attribute, the parent will not\noverride it.",
1941
+ "attribute": "current",
1942
+ "reflects": true
1943
+ }
1944
+ ],
1945
+ "attributes": [
1946
+ {
1947
+ "name": "href",
1948
+ "type": {
1949
+ "text": "string | undefined"
1950
+ },
1951
+ "default": "undefined",
1952
+ "description": "The URL for this breadcrumb link. Omit for the current page item.\nWhen `current` is true, this attribute is ignored and the item always\nrenders as static text per WAI-ARIA APG breadcrumb guidance.",
1953
+ "fieldName": "href",
1954
+ "attribute": "href"
1928
1955
  },
1929
1956
  {
1930
- "description": "Icon or content rendered after the label.",
1931
- "name": "suffix"
1957
+ "name": "current",
1958
+ "type": {
1959
+ "text": "boolean"
1960
+ },
1961
+ "default": "false",
1962
+ "description": "Marks this item as the current page. When set, the item always renders as\nstatic text (never a navigable link) and `aria-current=\"page\"` is placed on\nthe inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\ncanonical AT announcement (\"current page, Patient Records\").\n\nCan be set explicitly by consumers (e.g. Drupal Twig templates) to override\nthe default positional last-item detection in `hx-breadcrumb`. When any item\nin the breadcrumb has an explicit `current` attribute, the parent will not\noverride it.",
1963
+ "fieldName": "current",
1964
+ "attribute": "current"
1932
1965
  }
1933
1966
  ],
1967
+ "superclass": {
1968
+ "name": "LitElement",
1969
+ "package": "lit"
1970
+ },
1971
+ "tagName": "hx-breadcrumb-item",
1972
+ "customElement": true,
1973
+ "summary": "A navigation item within an hx-breadcrumb component. Renders as a link when `href` is\nprovided, or as static text for the current page item. The current page item is determined by\nthe `current` attribute (set explicitly or automatically by the parent `hx-breadcrumb`)."
1974
+ }
1975
+ ],
1976
+ "exports": [
1977
+ {
1978
+ "kind": "js",
1979
+ "name": "HelixBreadcrumbItem",
1980
+ "declaration": {
1981
+ "name": "HelixBreadcrumbItem",
1982
+ "module": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts"
1983
+ }
1984
+ },
1985
+ {
1986
+ "kind": "custom-element-definition",
1987
+ "name": "hx-breadcrumb-item",
1988
+ "declaration": {
1989
+ "name": "HelixBreadcrumbItem",
1990
+ "module": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts"
1991
+ }
1992
+ }
1993
+ ]
1994
+ },
1995
+ {
1996
+ "kind": "javascript-module",
1997
+ "path": "src/components/hx-breadcrumb/hx-breadcrumb.ts",
1998
+ "declarations": [
1999
+ {
2000
+ "kind": "class",
2001
+ "description": "",
2002
+ "name": "HelixBreadcrumb",
1934
2003
  "members": [
1935
2004
  {
1936
2005
  "kind": "field",
1937
- "name": "formAssociated",
2006
+ "name": "_instanceCounter",
1938
2007
  "type": {
1939
- "text": "boolean"
2008
+ "text": "number"
1940
2009
  },
2010
+ "privacy": "private",
1941
2011
  "static": true,
1942
- "default": "true"
2012
+ "default": "0",
2013
+ "description": "Per-instance counter used to generate stable, deterministic IDs for the\ninjected JSON-LD script tags. Deterministic IDs (vs Math.random()) allow\nSSR frameworks to match server-rendered script tags during hydration."
1943
2014
  },
1944
2015
  {
1945
2016
  "kind": "field",
1946
- "name": "_internals",
2017
+ "name": "separator",
1947
2018
  "type": {
1948
- "text": "ElementInternals"
2019
+ "text": "string"
1949
2020
  },
1950
- "privacy": "private"
2021
+ "default": "'/'",
2022
+ "description": "The separator character displayed between breadcrumb items.",
2023
+ "attribute": "separator"
1951
2024
  },
1952
2025
  {
1953
2026
  "kind": "field",
1954
- "name": "variant",
2027
+ "name": "label",
1955
2028
  "type": {
1956
- "text": "'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost' | 'outline'"
2029
+ "text": "string"
1957
2030
  },
1958
- "default": "'primary'",
1959
- "description": "Visual style variant of the button.",
1960
- "attribute": "variant",
1961
- "reflects": true
2031
+ "default": "'Breadcrumb'",
2032
+ "description": "The accessible label for the nav landmark.",
2033
+ "attribute": "label"
1962
2034
  },
1963
2035
  {
1964
2036
  "kind": "field",
1965
- "name": "size",
2037
+ "name": "maxItems",
1966
2038
  "type": {
1967
- "text": "'sm' | 'md' | 'lg'"
2039
+ "text": "number"
1968
2040
  },
1969
- "default": "'md'",
1970
- "description": "Size of the button.",
1971
- "attribute": "hx-size",
1972
- "reflects": true
2041
+ "default": "0",
2042
+ "description": "Maximum number of items to show before collapsing middle items with an ellipsis.\nSet to 0 (default) to show all items. The ellipsis is a keyboard-accessible\nbutton; activating it expands the full breadcrumb by setting maxItems to 0.",
2043
+ "attribute": "max-items"
1973
2044
  },
1974
2045
  {
1975
2046
  "kind": "field",
1976
- "name": "disabled",
2047
+ "name": "jsonLd",
1977
2048
  "type": {
1978
2049
  "text": "boolean"
1979
2050
  },
1980
2051
  "default": "false",
1981
- "description": "Whether the button is disabled. Prevents all interaction and form actions.",
1982
- "attribute": "disabled",
1983
- "reflects": true
2052
+ "description": "When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n\nNOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n`<script>` directly via `document.head.appendChild()` in a Drupal context:\n1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n2. Is not cacheable by Drupal's page cache.\n3. Will be wiped on BigPipe partial page replacements.\n\nFor Drupal integrations, leave `json-ld` false and use the structured data\nTwig template instead (see `hx-breadcrumb.twig` in the component directory).",
2053
+ "attribute": "json-ld"
1984
2054
  },
1985
2055
  {
1986
2056
  "kind": "field",
1987
- "name": "loading",
2057
+ "name": "_ellipsisItem",
1988
2058
  "type": {
1989
- "text": "boolean"
2059
+ "text": "Element | null"
1990
2060
  },
1991
- "default": "false",
1992
- "description": "Whether the button is in a loading state. Shows spinner, prevents interaction,\nand sets aria-busy. Does not set the disabled attribute.",
1993
- "attribute": "loading",
1994
- "reflects": true
2061
+ "privacy": "private",
2062
+ "default": "null"
1995
2063
  },
1996
2064
  {
1997
2065
  "kind": "field",
1998
- "name": "type",
2066
+ "name": "_jsonLdScript",
1999
2067
  "type": {
2000
- "text": "'button' | 'submit' | 'reset'"
2068
+ "text": "HTMLScriptElement | null"
2001
2069
  },
2002
- "default": "'button'",
2003
- "description": "The type attribute for the underlying button element. Ignored when href is set.",
2004
- "attribute": "type"
2070
+ "privacy": "private",
2071
+ "default": "null"
2005
2072
  },
2006
2073
  {
2007
2074
  "kind": "field",
2008
- "name": "href",
2075
+ "name": "_boundEllipsisClick",
2009
2076
  "type": {
2010
- "text": "string | undefined"
2077
+ "text": "(e: Event) => void"
2011
2078
  },
2012
- "default": "undefined",
2013
- "description": "When set, renders an anchor element instead of a button.",
2014
- "attribute": "href"
2079
+ "privacy": "private"
2015
2080
  },
2016
2081
  {
2017
2082
  "kind": "field",
2018
- "name": "target",
2083
+ "name": "_boundEllipsisKeydown",
2019
2084
  "type": {
2020
- "text": "string | undefined"
2085
+ "text": "(e: KeyboardEvent) => void"
2021
2086
  },
2022
- "default": "undefined",
2023
- "description": "Anchor target attribute. Only used when href is set.",
2024
- "attribute": "target"
2087
+ "privacy": "private"
2025
2088
  },
2026
2089
  {
2027
2090
  "kind": "field",
2028
- "name": "name",
2029
- "type": {
2030
- "text": "string | undefined"
2031
- },
2032
- "default": "undefined",
2033
- "description": "Form field name submitted via ElementInternals.setFormValue on submit.",
2034
- "attribute": "name"
2091
+ "name": "_managedCurrentItems",
2092
+ "privacy": "private",
2093
+ "readonly": true,
2094
+ "default": "new WeakSet<Element>()",
2095
+ "description": "Tracks which items had their `current` attribute set by this component\n(as opposed to set by a consumer/Drupal template). This lets us re-evaluate\npositional current-page detection on each slotchange without incorrectly\ntreating a previously component-set `current` attribute as a consumer-set\nexplicit override."
2035
2096
  },
2036
2097
  {
2037
2098
  "kind": "field",
2038
- "name": "value",
2039
- "type": {
2040
- "text": "string | undefined"
2041
- },
2042
- "default": "undefined",
2043
- "description": "Form field value submitted via ElementInternals.setFormValue on submit.",
2044
- "attribute": "value"
2099
+ "name": "_jsonLdId",
2100
+ "privacy": "private",
2101
+ "readonly": true,
2102
+ "default": "`hx-breadcrumb-ld-${++HelixBreadcrumb._instanceCounter}`",
2103
+ "description": "Stable per-instance ID used to tag the injected script element so that\nmultiple hx-breadcrumb instances on the same page don't produce conflicting\nor duplicate structured-data blocks. Each instance owns exactly one script\ntag identified by this ID; any stale tag from a previous render cycle is\nremoved before a new one is inserted.\n\nUses a static counter (not Math.random()) so IDs are deterministic across\nserver and client renders, enabling SSR hydration matching."
2045
2104
  },
2046
2105
  {
2047
- "kind": "field",
2048
- "name": "ariaLabel",
2049
- "type": {
2050
- "text": "string | null"
2106
+ "kind": "method",
2107
+ "name": "_getBreadcrumbItems",
2108
+ "privacy": "private",
2109
+ "return": {
2110
+ "type": {
2111
+ "text": "Element[]"
2112
+ }
2051
2113
  },
2052
- "default": "null",
2053
- "description": "Accessible label forwarded to the inner button/anchor. Required for icon-only usage.",
2054
- "attribute": "aria-label",
2055
- "reflects": true
2114
+ "parameters": [
2115
+ {
2116
+ "name": "slot",
2117
+ "type": {
2118
+ "text": "HTMLSlotElement"
2119
+ }
2120
+ }
2121
+ ],
2122
+ "description": "Returns only real breadcrumb items, excluding the managed ellipsis element."
2056
2123
  },
2057
2124
  {
2058
- "kind": "field",
2059
- "name": "form",
2060
- "type": {
2061
- "text": "HTMLFormElement | null"
2125
+ "kind": "method",
2126
+ "name": "_applyItemAttributes",
2127
+ "privacy": "private",
2128
+ "return": {
2129
+ "type": {
2130
+ "text": "void"
2131
+ }
2062
2132
  },
2063
- "description": "Returns the associated form element, if any.",
2064
- "readonly": true
2133
+ "parameters": [
2134
+ {
2135
+ "name": "items",
2136
+ "type": {
2137
+ "text": "Element[]"
2138
+ }
2139
+ }
2140
+ ],
2141
+ "description": "Applies aria/state attributes to the item list.\n\nCurrent-page detection: if any item has an explicit `current` attribute\n(e.g. set by a Drupal Twig template), that item is treated as the current\npage. Otherwise the last item is the current page (default behaviour).\n\nThis separation allows Drupal to control current-page marking without\nrelying on item order."
2065
2142
  },
2066
2143
  {
2067
2144
  "kind": "method",
2068
- "name": "_handleClick",
2145
+ "name": "_handleSlotChange",
2069
2146
  "privacy": "private",
2070
2147
  "return": {
2071
2148
  "type": {
@@ -2076,515 +2153,478 @@
2076
2153
  {
2077
2154
  "name": "e",
2078
2155
  "type": {
2079
- "text": "MouseEvent"
2156
+ "text": "Event"
2080
2157
  }
2081
2158
  }
2082
2159
  ]
2083
2160
  },
2084
2161
  {
2085
2162
  "kind": "method",
2086
- "name": "_renderSpinner",
2163
+ "name": "_handleSeparatorSlotChange",
2087
2164
  "privacy": "private",
2088
2165
  "return": {
2089
2166
  "type": {
2090
- "text": "TemplateResult"
2167
+ "text": "void"
2091
2168
  }
2092
- }
2169
+ },
2170
+ "parameters": [
2171
+ {
2172
+ "name": "e",
2173
+ "type": {
2174
+ "text": "Event"
2175
+ }
2176
+ }
2177
+ ]
2093
2178
  },
2094
2179
  {
2095
2180
  "kind": "method",
2096
- "name": "_renderInner",
2181
+ "name": "_applyCollapse",
2097
2182
  "privacy": "private",
2098
2183
  "return": {
2099
2184
  "type": {
2100
- "text": "TemplateResult"
2185
+ "text": "void"
2101
2186
  }
2102
- }
2103
- }
2104
- ],
2105
- "events": [
2106
- {
2107
- "name": "hx-click",
2108
- "type": {
2109
- "text": "CustomEvent<{originalEvent: MouseEvent}>"
2110
2187
  },
2111
- "description": "Dispatched when the button is clicked and is neither disabled nor loading."
2112
- }
2113
- ],
2114
- "attributes": [
2188
+ "parameters": [
2189
+ {
2190
+ "name": "items",
2191
+ "type": {
2192
+ "text": "Element[]"
2193
+ }
2194
+ }
2195
+ ]
2196
+ },
2115
2197
  {
2116
- "name": "variant",
2117
- "type": {
2118
- "text": "'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost' | 'outline'"
2198
+ "kind": "method",
2199
+ "name": "_removeCollapse",
2200
+ "privacy": "private",
2201
+ "return": {
2202
+ "type": {
2203
+ "text": "void"
2204
+ }
2119
2205
  },
2120
- "default": "'primary'",
2121
- "description": "Visual style variant of the button.",
2122
- "fieldName": "variant",
2123
- "attribute": "variant"
2206
+ "parameters": [
2207
+ {
2208
+ "name": "items",
2209
+ "type": {
2210
+ "text": "Element[]"
2211
+ }
2212
+ }
2213
+ ]
2124
2214
  },
2125
2215
  {
2126
- "name": "hx-size",
2127
- "type": {
2128
- "text": "'sm' | 'md' | 'lg'"
2216
+ "kind": "method",
2217
+ "name": "_handleEllipsisClick",
2218
+ "privacy": "private",
2219
+ "return": {
2220
+ "type": {
2221
+ "text": "void"
2222
+ }
2129
2223
  },
2130
- "default": "'md'",
2131
- "description": "Size of the button.",
2132
- "fieldName": "size",
2133
- "attribute": "hx-size"
2224
+ "parameters": [
2225
+ {
2226
+ "name": "e",
2227
+ "type": {
2228
+ "text": "Event"
2229
+ }
2230
+ }
2231
+ ]
2134
2232
  },
2135
2233
  {
2136
- "name": "disabled",
2137
- "type": {
2138
- "text": "boolean"
2234
+ "kind": "method",
2235
+ "name": "_handleEllipsisKeydown",
2236
+ "privacy": "private",
2237
+ "return": {
2238
+ "type": {
2239
+ "text": "void"
2240
+ }
2139
2241
  },
2140
- "default": "false",
2141
- "description": "Whether the button is disabled. Prevents all interaction and form actions.",
2142
- "fieldName": "disabled",
2143
- "attribute": "disabled"
2242
+ "parameters": [
2243
+ {
2244
+ "name": "e",
2245
+ "type": {
2246
+ "text": "KeyboardEvent"
2247
+ }
2248
+ }
2249
+ ]
2144
2250
  },
2145
2251
  {
2146
- "name": "loading",
2147
- "type": {
2148
- "text": "boolean"
2252
+ "kind": "method",
2253
+ "name": "_expandBreadcrumb",
2254
+ "privacy": "private",
2255
+ "return": {
2256
+ "type": {
2257
+ "text": "void"
2258
+ }
2149
2259
  },
2150
- "default": "false",
2151
- "description": "Whether the button is in a loading state. Shows spinner, prevents interaction,\nand sets aria-busy. Does not set the disabled attribute.",
2152
- "fieldName": "loading",
2153
- "attribute": "loading"
2260
+ "description": "Expands a collapsed breadcrumb by resetting maxItems to 0.\nCalled by the ellipsis expand button (click or Enter/Space)."
2154
2261
  },
2155
2262
  {
2156
- "name": "type",
2157
- "type": {
2158
- "text": "'button' | 'submit' | 'reset'"
2263
+ "kind": "method",
2264
+ "name": "_buildListItem",
2265
+ "privacy": "private",
2266
+ "return": {
2267
+ "type": {
2268
+ "text": "JsonLdListItem"
2269
+ }
2159
2270
  },
2160
- "default": "'button'",
2161
- "description": "The type attribute for the underlying button element. Ignored when href is set.",
2162
- "fieldName": "type",
2163
- "attribute": "type"
2271
+ "parameters": [
2272
+ {
2273
+ "name": "item",
2274
+ "type": {
2275
+ "text": "Element"
2276
+ }
2277
+ },
2278
+ {
2279
+ "name": "position",
2280
+ "type": {
2281
+ "text": "number"
2282
+ }
2283
+ }
2284
+ ],
2285
+ "description": "JSON-LD ListItem entry with typed fields to avoid Record<string, unknown>."
2164
2286
  },
2165
2287
  {
2166
- "name": "href",
2167
- "type": {
2168
- "text": "string | undefined"
2288
+ "kind": "method",
2289
+ "name": "_updateJsonLd",
2290
+ "privacy": "private",
2291
+ "return": {
2292
+ "type": {
2293
+ "text": "void"
2294
+ }
2169
2295
  },
2170
- "default": "undefined",
2171
- "description": "When set, renders an anchor element instead of a button.",
2172
- "fieldName": "href",
2173
- "attribute": "href"
2296
+ "parameters": [
2297
+ {
2298
+ "name": "items",
2299
+ "type": {
2300
+ "text": "Element[]"
2301
+ }
2302
+ }
2303
+ ]
2174
2304
  },
2175
2305
  {
2176
- "name": "target",
2306
+ "kind": "method",
2307
+ "name": "_removeJsonLd",
2308
+ "privacy": "private",
2309
+ "return": {
2310
+ "type": {
2311
+ "text": "void"
2312
+ }
2313
+ }
2314
+ }
2315
+ ],
2316
+ "attributes": [
2317
+ {
2318
+ "name": "separator",
2177
2319
  "type": {
2178
- "text": "string | undefined"
2320
+ "text": "string"
2179
2321
  },
2180
- "default": "undefined",
2181
- "description": "Anchor target attribute. Only used when href is set.",
2182
- "fieldName": "target",
2183
- "attribute": "target"
2322
+ "default": "'/'",
2323
+ "description": "The separator character displayed between breadcrumb items.",
2324
+ "fieldName": "separator",
2325
+ "attribute": "separator"
2184
2326
  },
2185
2327
  {
2186
- "name": "name",
2328
+ "name": "label",
2187
2329
  "type": {
2188
- "text": "string | undefined"
2330
+ "text": "string"
2189
2331
  },
2190
- "default": "undefined",
2191
- "description": "Form field name submitted via ElementInternals.setFormValue on submit.",
2192
- "fieldName": "name",
2193
- "attribute": "name"
2332
+ "default": "'Breadcrumb'",
2333
+ "description": "The accessible label for the nav landmark.",
2334
+ "fieldName": "label",
2335
+ "attribute": "label"
2194
2336
  },
2195
2337
  {
2196
- "name": "value",
2338
+ "name": "max-items",
2197
2339
  "type": {
2198
- "text": "string | undefined"
2340
+ "text": "number"
2199
2341
  },
2200
- "default": "undefined",
2201
- "description": "Form field value submitted via ElementInternals.setFormValue on submit.",
2202
- "fieldName": "value",
2203
- "attribute": "value"
2342
+ "default": "0",
2343
+ "description": "Maximum number of items to show before collapsing middle items with an ellipsis.\nSet to 0 (default) to show all items. The ellipsis is a keyboard-accessible\nbutton; activating it expands the full breadcrumb by setting maxItems to 0.",
2344
+ "fieldName": "maxItems",
2345
+ "attribute": "max-items"
2204
2346
  },
2205
2347
  {
2206
- "name": "aria-label",
2348
+ "name": "json-ld",
2207
2349
  "type": {
2208
- "text": "string | null"
2350
+ "text": "boolean"
2209
2351
  },
2210
- "default": "null",
2211
- "description": "Accessible label forwarded to the inner button/anchor. Required for icon-only usage.",
2212
- "fieldName": "ariaLabel",
2213
- "attribute": "aria-label"
2352
+ "default": "false",
2353
+ "description": "When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n\nNOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n`<script>` directly via `document.head.appendChild()` in a Drupal context:\n1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n2. Is not cacheable by Drupal's page cache.\n3. Will be wiped on BigPipe partial page replacements.\n\nFor Drupal integrations, leave `json-ld` false and use the structured data\nTwig template instead (see `hx-breadcrumb.twig` in the component directory).",
2354
+ "fieldName": "jsonLd",
2355
+ "attribute": "json-ld"
2214
2356
  }
2215
2357
  ],
2216
2358
  "superclass": {
2217
2359
  "name": "LitElement",
2218
2360
  "package": "lit"
2219
2361
  },
2220
- "tagName": "hx-button",
2221
- "customElement": true,
2222
- "summary": "Primary interactive element for triggering actions and form submission."
2362
+ "tagName": "hx-breadcrumb",
2363
+ "customElement": true
2364
+ },
2365
+ {
2366
+ "kind": "variable",
2367
+ "name": "name"
2223
2368
  }
2224
2369
  ],
2225
2370
  "exports": [
2226
2371
  {
2227
2372
  "kind": "js",
2228
- "name": "HelixButton",
2373
+ "name": "HelixBreadcrumb",
2229
2374
  "declaration": {
2230
- "name": "HelixButton",
2231
- "module": "src/components/hx-button/hx-button.ts"
2375
+ "name": "HelixBreadcrumb",
2376
+ "module": "src/components/hx-breadcrumb/hx-breadcrumb.ts"
2232
2377
  }
2233
2378
  },
2234
2379
  {
2235
2380
  "kind": "custom-element-definition",
2236
- "name": "hx-button",
2381
+ "name": "hx-breadcrumb",
2237
2382
  "declaration": {
2238
- "name": "HelixButton",
2239
- "module": "src/components/hx-button/hx-button.ts"
2383
+ "name": "HelixBreadcrumb",
2384
+ "module": "src/components/hx-breadcrumb/hx-breadcrumb.ts"
2240
2385
  }
2241
2386
  }
2242
2387
  ]
2243
2388
  },
2244
2389
  {
2245
2390
  "kind": "javascript-module",
2246
- "path": "src/components/hx-button/index.ts",
2391
+ "path": "src/components/hx-breadcrumb/index.ts",
2247
2392
  "declarations": [],
2248
2393
  "exports": [
2249
2394
  {
2250
2395
  "kind": "js",
2251
- "name": "HelixButton",
2252
- "declaration": {
2253
- "name": "HelixButton",
2254
- "module": "./hx-button.js"
2255
- }
2256
- }
2257
- ]
2258
- },
2259
- {
2260
- "kind": "javascript-module",
2261
- "path": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts",
2262
- "declarations": [
2263
- {
2264
- "kind": "class",
2265
- "description": "A single breadcrumb navigation item.",
2266
- "name": "HelixBreadcrumbItem",
2267
- "cssProperties": [
2268
- {
2269
- "description": "Link text color.",
2270
- "name": "--hx-breadcrumb-link-color",
2271
- "default": "var(--hx-color-primary-600)"
2272
- },
2273
- {
2274
- "description": "Link hover text color.",
2275
- "name": "--hx-breadcrumb-link-hover-color",
2276
- "default": "var(--hx-color-primary-700)"
2277
- },
2278
- {
2279
- "description": "Current page text color.",
2280
- "name": "--hx-breadcrumb-text-color",
2281
- "default": "var(--hx-color-neutral-700)"
2282
- },
2283
- {
2284
- "description": "Separator character displayed after non-last items.",
2285
- "name": "--hx-breadcrumb-separator-content",
2286
- "default": "'/'"
2287
- },
2288
- {
2289
- "description": "Separator color.",
2290
- "name": "--hx-breadcrumb-separator-color",
2291
- "default": "var(--hx-color-neutral-400)"
2292
- },
2293
- {
2294
- "description": "Horizontal margin around separator.",
2295
- "name": "--hx-breadcrumb-separator-gap",
2296
- "default": "var(--hx-space-1)"
2297
- },
2298
- {
2299
- "description": "Optional max-width for text truncation.",
2300
- "name": "--hx-breadcrumb-item-max-width"
2301
- }
2302
- ],
2303
- "cssParts": [
2304
- {
2305
- "description": "Wrapper around the link or text content.",
2306
- "name": "item"
2307
- },
2308
- {
2309
- "description": "The anchor element when href is provided (non-current items only).",
2310
- "name": "link"
2311
- },
2312
- {
2313
- "description": "The span element for the current page or items without href.",
2314
- "name": "text"
2315
- },
2316
- {
2317
- "description": "The separator element rendered after non-last items.",
2318
- "name": "separator"
2319
- }
2320
- ],
2321
- "slots": [
2322
- {
2323
- "description": "The link or page text content. Accepts text, HTML, or icon elements.",
2324
- "name": ""
2325
- }
2326
- ],
2327
- "members": [
2328
- {
2329
- "kind": "field",
2330
- "name": "href",
2331
- "type": {
2332
- "text": "string | undefined"
2333
- },
2334
- "default": "undefined",
2335
- "description": "The URL for this breadcrumb link. Omit for the current page item.\nWhen `current` is true, this attribute is ignored and the item always\nrenders as static text per WAI-ARIA APG breadcrumb guidance.",
2336
- "attribute": "href",
2337
- "reflects": true
2338
- },
2339
- {
2340
- "kind": "field",
2341
- "name": "current",
2342
- "type": {
2343
- "text": "boolean"
2344
- },
2345
- "default": "false",
2346
- "description": "Marks this item as the current page. When set, the item always renders as\nstatic text (never a navigable link) and `aria-current=\"page\"` is placed on\nthe inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\ncanonical AT announcement (\"current page, Patient Records\").\n\nCan be set explicitly by consumers (e.g. Drupal Twig templates) to override\nthe default positional last-item detection in `hx-breadcrumb`. When any item\nin the breadcrumb has an explicit `current` attribute, the parent will not\noverride it.",
2347
- "attribute": "current",
2348
- "reflects": true
2349
- }
2350
- ],
2351
- "attributes": [
2352
- {
2353
- "name": "href",
2354
- "type": {
2355
- "text": "string | undefined"
2356
- },
2357
- "default": "undefined",
2358
- "description": "The URL for this breadcrumb link. Omit for the current page item.\nWhen `current` is true, this attribute is ignored and the item always\nrenders as static text per WAI-ARIA APG breadcrumb guidance.",
2359
- "fieldName": "href",
2360
- "attribute": "href"
2361
- },
2362
- {
2363
- "name": "current",
2364
- "type": {
2365
- "text": "boolean"
2366
- },
2367
- "default": "false",
2368
- "description": "Marks this item as the current page. When set, the item always renders as\nstatic text (never a navigable link) and `aria-current=\"page\"` is placed on\nthe inner text element per WAI-ARIA APG breadcrumb guidance, yielding the\ncanonical AT announcement (\"current page, Patient Records\").\n\nCan be set explicitly by consumers (e.g. Drupal Twig templates) to override\nthe default positional last-item detection in `hx-breadcrumb`. When any item\nin the breadcrumb has an explicit `current` attribute, the parent will not\noverride it.",
2369
- "fieldName": "current",
2370
- "attribute": "current"
2371
- }
2372
- ],
2373
- "superclass": {
2374
- "name": "LitElement",
2375
- "package": "lit"
2376
- },
2377
- "tagName": "hx-breadcrumb-item",
2378
- "customElement": true,
2379
- "summary": "A navigation item within an hx-breadcrumb component. Renders as a link when `href` is\nprovided, or as static text for the current page item. The current page item is determined by\nthe `current` attribute (set explicitly or automatically by the parent `hx-breadcrumb`)."
2380
- }
2381
- ],
2382
- "exports": [
2383
- {
2384
- "kind": "js",
2385
- "name": "HelixBreadcrumbItem",
2396
+ "name": "HelixBreadcrumb",
2386
2397
  "declaration": {
2387
- "name": "HelixBreadcrumbItem",
2388
- "module": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts"
2398
+ "name": "HelixBreadcrumb",
2399
+ "module": "./hx-breadcrumb.js"
2389
2400
  }
2390
2401
  },
2391
2402
  {
2392
- "kind": "custom-element-definition",
2393
- "name": "hx-breadcrumb-item",
2403
+ "kind": "js",
2404
+ "name": "HelixBreadcrumbItem",
2394
2405
  "declaration": {
2395
2406
  "name": "HelixBreadcrumbItem",
2396
- "module": "src/components/hx-breadcrumb/hx-breadcrumb-item.ts"
2407
+ "module": "./hx-breadcrumb-item.js"
2397
2408
  }
2398
2409
  }
2399
2410
  ]
2400
2411
  },
2401
2412
  {
2402
2413
  "kind": "javascript-module",
2403
- "path": "src/components/hx-breadcrumb/hx-breadcrumb.ts",
2414
+ "path": "src/components/hx-button/hx-button.ts",
2404
2415
  "declarations": [
2405
2416
  {
2406
2417
  "kind": "class",
2407
- "description": "",
2408
- "name": "HelixBreadcrumb",
2418
+ "description": "A production-grade button component for user interaction. Supports multiple\nvisual variants, sizes, loading state, prefix/suffix slots, anchor rendering,\nand full ElementInternals form association.",
2419
+ "name": "HelixButton",
2420
+ "cssProperties": [
2421
+ {
2422
+ "description": "Button background color.",
2423
+ "name": "--hx-button-bg",
2424
+ "default": "var(--hx-color-primary-500)"
2425
+ },
2426
+ {
2427
+ "description": "Button text color.",
2428
+ "name": "--hx-button-color",
2429
+ "default": "var(--hx-color-neutral-0)"
2430
+ },
2431
+ {
2432
+ "description": "Button border color.",
2433
+ "name": "--hx-button-border-color",
2434
+ "default": "transparent"
2435
+ },
2436
+ {
2437
+ "description": "Button border radius.",
2438
+ "name": "--hx-button-border-radius",
2439
+ "default": "var(--hx-border-radius-md)"
2440
+ },
2441
+ {
2442
+ "description": "Button font family.",
2443
+ "name": "--hx-button-font-family",
2444
+ "default": "var(--hx-font-family-sans)"
2445
+ },
2446
+ {
2447
+ "description": "Button font weight.",
2448
+ "name": "--hx-button-font-weight",
2449
+ "default": "var(--hx-font-weight-semibold)"
2450
+ },
2451
+ {
2452
+ "description": "Focus ring color.",
2453
+ "name": "--hx-button-focus-ring-color",
2454
+ "default": "var(--hx-focus-ring-color)"
2455
+ }
2456
+ ],
2457
+ "cssParts": [
2458
+ {
2459
+ "description": "The native button or anchor element.",
2460
+ "name": "button"
2461
+ },
2462
+ {
2463
+ "description": "The label text wrapper span.",
2464
+ "name": "label"
2465
+ },
2466
+ {
2467
+ "description": "The prefix slot container span.",
2468
+ "name": "prefix"
2469
+ },
2470
+ {
2471
+ "description": "The suffix slot container span.",
2472
+ "name": "suffix"
2473
+ },
2474
+ {
2475
+ "description": "The loading spinner SVG element.",
2476
+ "name": "spinner"
2477
+ }
2478
+ ],
2479
+ "slots": [
2480
+ {
2481
+ "description": "Default slot for button label text or content.",
2482
+ "name": ""
2483
+ },
2484
+ {
2485
+ "description": "Icon or content rendered before the label.",
2486
+ "name": "prefix"
2487
+ },
2488
+ {
2489
+ "description": "Icon or content rendered after the label.",
2490
+ "name": "suffix"
2491
+ }
2492
+ ],
2409
2493
  "members": [
2410
2494
  {
2411
2495
  "kind": "field",
2412
- "name": "_instanceCounter",
2496
+ "name": "formAssociated",
2413
2497
  "type": {
2414
- "text": "number"
2498
+ "text": "boolean"
2415
2499
  },
2416
- "privacy": "private",
2417
2500
  "static": true,
2418
- "default": "0",
2419
- "description": "Per-instance counter used to generate stable, deterministic IDs for the\ninjected JSON-LD script tags. Deterministic IDs (vs Math.random()) allow\nSSR frameworks to match server-rendered script tags during hydration."
2501
+ "default": "true"
2420
2502
  },
2421
2503
  {
2422
2504
  "kind": "field",
2423
- "name": "separator",
2505
+ "name": "_internals",
2424
2506
  "type": {
2425
- "text": "string"
2507
+ "text": "ElementInternals"
2426
2508
  },
2427
- "default": "'/'",
2428
- "description": "The separator character displayed between breadcrumb items.",
2429
- "attribute": "separator"
2509
+ "privacy": "private"
2430
2510
  },
2431
2511
  {
2432
2512
  "kind": "field",
2433
- "name": "label",
2513
+ "name": "variant",
2434
2514
  "type": {
2435
- "text": "string"
2515
+ "text": "'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost' | 'outline'"
2436
2516
  },
2437
- "default": "'Breadcrumb'",
2438
- "description": "The accessible label for the nav landmark.",
2439
- "attribute": "label"
2517
+ "default": "'primary'",
2518
+ "description": "Visual style variant of the button.",
2519
+ "attribute": "variant",
2520
+ "reflects": true
2440
2521
  },
2441
2522
  {
2442
2523
  "kind": "field",
2443
- "name": "maxItems",
2524
+ "name": "size",
2444
2525
  "type": {
2445
- "text": "number"
2526
+ "text": "'sm' | 'md' | 'lg'"
2446
2527
  },
2447
- "default": "0",
2448
- "description": "Maximum number of items to show before collapsing middle items with an ellipsis.\nSet to 0 (default) to show all items. The ellipsis is a keyboard-accessible\nbutton; activating it expands the full breadcrumb by setting maxItems to 0.",
2449
- "attribute": "max-items"
2528
+ "default": "'md'",
2529
+ "description": "Size of the button.",
2530
+ "attribute": "hx-size",
2531
+ "reflects": true
2450
2532
  },
2451
2533
  {
2452
2534
  "kind": "field",
2453
- "name": "jsonLd",
2535
+ "name": "disabled",
2454
2536
  "type": {
2455
2537
  "text": "boolean"
2456
2538
  },
2457
2539
  "default": "false",
2458
- "description": "When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n\nNOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n`<script>` directly via `document.head.appendChild()` in a Drupal context:\n1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n2. Is not cacheable by Drupal's page cache.\n3. Will be wiped on BigPipe partial page replacements.\n\nFor Drupal integrations, leave `json-ld` false and use the structured data\nTwig template instead (see `hx-breadcrumb.twig` in the component directory).",
2459
- "attribute": "json-ld"
2540
+ "description": "Whether the button is disabled. Prevents all interaction and form actions.",
2541
+ "attribute": "disabled",
2542
+ "reflects": true
2460
2543
  },
2461
2544
  {
2462
2545
  "kind": "field",
2463
- "name": "_ellipsisItem",
2546
+ "name": "loading",
2464
2547
  "type": {
2465
- "text": "Element | null"
2548
+ "text": "boolean"
2466
2549
  },
2467
- "privacy": "private",
2468
- "default": "null"
2550
+ "default": "false",
2551
+ "description": "Whether the button is in a loading state. Shows spinner, prevents interaction,\nand sets aria-busy. Does not set the disabled attribute.",
2552
+ "attribute": "loading",
2553
+ "reflects": true
2469
2554
  },
2470
2555
  {
2471
2556
  "kind": "field",
2472
- "name": "_jsonLdScript",
2557
+ "name": "type",
2473
2558
  "type": {
2474
- "text": "HTMLScriptElement | null"
2559
+ "text": "'button' | 'submit' | 'reset'"
2475
2560
  },
2476
- "privacy": "private",
2477
- "default": "null"
2561
+ "default": "'button'",
2562
+ "description": "The type attribute for the underlying button element. Ignored when href is set.",
2563
+ "attribute": "type"
2478
2564
  },
2479
2565
  {
2480
2566
  "kind": "field",
2481
- "name": "_boundEllipsisClick",
2567
+ "name": "href",
2482
2568
  "type": {
2483
- "text": "(e: Event) => void"
2569
+ "text": "string | undefined"
2484
2570
  },
2485
- "privacy": "private"
2571
+ "default": "undefined",
2572
+ "description": "When set, renders an anchor element instead of a button.",
2573
+ "attribute": "href"
2486
2574
  },
2487
2575
  {
2488
2576
  "kind": "field",
2489
- "name": "_boundEllipsisKeydown",
2577
+ "name": "target",
2490
2578
  "type": {
2491
- "text": "(e: KeyboardEvent) => void"
2579
+ "text": "string | undefined"
2492
2580
  },
2493
- "privacy": "private"
2494
- },
2495
- {
2496
- "kind": "field",
2497
- "name": "_managedCurrentItems",
2498
- "privacy": "private",
2499
- "readonly": true,
2500
- "default": "new WeakSet<Element>()",
2501
- "description": "Tracks which items had their `current` attribute set by this component\n(as opposed to set by a consumer/Drupal template). This lets us re-evaluate\npositional current-page detection on each slotchange without incorrectly\ntreating a previously component-set `current` attribute as a consumer-set\nexplicit override."
2581
+ "default": "undefined",
2582
+ "description": "Anchor target attribute. Only used when href is set.",
2583
+ "attribute": "target"
2502
2584
  },
2503
2585
  {
2504
2586
  "kind": "field",
2505
- "name": "_jsonLdId",
2506
- "privacy": "private",
2507
- "readonly": true,
2508
- "default": "`hx-breadcrumb-ld-${++HelixBreadcrumb._instanceCounter}`",
2509
- "description": "Stable per-instance ID used to tag the injected script element so that\nmultiple hx-breadcrumb instances on the same page don't produce conflicting\nor duplicate structured-data blocks. Each instance owns exactly one script\ntag identified by this ID; any stale tag from a previous render cycle is\nremoved before a new one is inserted.\n\nUses a static counter (not Math.random()) so IDs are deterministic across\nserver and client renders, enabling SSR hydration matching."
2510
- },
2511
- {
2512
- "kind": "method",
2513
- "name": "_getBreadcrumbItems",
2514
- "privacy": "private",
2515
- "return": {
2516
- "type": {
2517
- "text": "Element[]"
2518
- }
2587
+ "name": "name",
2588
+ "type": {
2589
+ "text": "string | undefined"
2519
2590
  },
2520
- "parameters": [
2521
- {
2522
- "name": "slot",
2523
- "type": {
2524
- "text": "HTMLSlotElement"
2525
- }
2526
- }
2527
- ],
2528
- "description": "Returns only real breadcrumb items, excluding the managed ellipsis element."
2591
+ "default": "undefined",
2592
+ "description": "Form field name submitted via ElementInternals.setFormValue on submit.",
2593
+ "attribute": "name"
2529
2594
  },
2530
2595
  {
2531
- "kind": "method",
2532
- "name": "_applyItemAttributes",
2533
- "privacy": "private",
2534
- "return": {
2535
- "type": {
2536
- "text": "void"
2537
- }
2596
+ "kind": "field",
2597
+ "name": "value",
2598
+ "type": {
2599
+ "text": "string | undefined"
2538
2600
  },
2539
- "parameters": [
2540
- {
2541
- "name": "items",
2542
- "type": {
2543
- "text": "Element[]"
2544
- }
2545
- }
2546
- ],
2547
- "description": "Applies aria/state attributes to the item list.\n\nCurrent-page detection: if any item has an explicit `current` attribute\n(e.g. set by a Drupal Twig template), that item is treated as the current\npage. Otherwise the last item is the current page (default behaviour).\n\nThis separation allows Drupal to control current-page marking without\nrelying on item order."
2601
+ "default": "undefined",
2602
+ "description": "Form field value submitted via ElementInternals.setFormValue on submit.",
2603
+ "attribute": "value"
2548
2604
  },
2549
2605
  {
2550
- "kind": "method",
2551
- "name": "_handleSlotChange",
2552
- "privacy": "private",
2553
- "return": {
2554
- "type": {
2555
- "text": "void"
2556
- }
2606
+ "kind": "field",
2607
+ "name": "ariaLabel",
2608
+ "type": {
2609
+ "text": "string | null"
2557
2610
  },
2558
- "parameters": [
2559
- {
2560
- "name": "e",
2561
- "type": {
2562
- "text": "Event"
2563
- }
2564
- }
2565
- ]
2611
+ "default": "null",
2612
+ "description": "Accessible label forwarded to the inner button/anchor. Required for icon-only usage.",
2613
+ "attribute": "aria-label",
2614
+ "reflects": true
2566
2615
  },
2567
2616
  {
2568
- "kind": "method",
2569
- "name": "_handleSeparatorSlotChange",
2570
- "privacy": "private",
2571
- "return": {
2572
- "type": {
2573
- "text": "void"
2574
- }
2617
+ "kind": "field",
2618
+ "name": "form",
2619
+ "type": {
2620
+ "text": "HTMLFormElement | null"
2575
2621
  },
2576
- "parameters": [
2577
- {
2578
- "name": "e",
2579
- "type": {
2580
- "text": "Event"
2581
- }
2582
- }
2583
- ]
2622
+ "description": "Returns the associated form element, if any.",
2623
+ "readonly": true
2584
2624
  },
2585
2625
  {
2586
2626
  "kind": "method",
2587
- "name": "_applyCollapse",
2627
+ "name": "_handleClick",
2588
2628
  "privacy": "private",
2589
2629
  "return": {
2590
2630
  "type": {
@@ -2593,224 +2633,184 @@
2593
2633
  },
2594
2634
  "parameters": [
2595
2635
  {
2596
- "name": "items",
2636
+ "name": "e",
2597
2637
  "type": {
2598
- "text": "Element[]"
2638
+ "text": "MouseEvent"
2599
2639
  }
2600
2640
  }
2601
2641
  ]
2602
2642
  },
2603
2643
  {
2604
2644
  "kind": "method",
2605
- "name": "_removeCollapse",
2645
+ "name": "_renderSpinner",
2606
2646
  "privacy": "private",
2607
2647
  "return": {
2608
2648
  "type": {
2609
- "text": "void"
2610
- }
2611
- },
2612
- "parameters": [
2613
- {
2614
- "name": "items",
2615
- "type": {
2616
- "text": "Element[]"
2617
- }
2649
+ "text": "TemplateResult"
2618
2650
  }
2619
- ]
2651
+ }
2620
2652
  },
2621
2653
  {
2622
2654
  "kind": "method",
2623
- "name": "_handleEllipsisClick",
2655
+ "name": "_renderInner",
2624
2656
  "privacy": "private",
2625
2657
  "return": {
2626
2658
  "type": {
2627
- "text": "void"
2659
+ "text": "TemplateResult"
2628
2660
  }
2661
+ }
2662
+ }
2663
+ ],
2664
+ "events": [
2665
+ {
2666
+ "name": "hx-click",
2667
+ "type": {
2668
+ "text": "CustomEvent<{originalEvent: MouseEvent}>"
2629
2669
  },
2630
- "parameters": [
2631
- {
2632
- "name": "e",
2633
- "type": {
2634
- "text": "Event"
2635
- }
2636
- }
2637
- ]
2670
+ "description": "Dispatched when the button is clicked and is neither disabled nor loading."
2671
+ }
2672
+ ],
2673
+ "attributes": [
2674
+ {
2675
+ "name": "variant",
2676
+ "type": {
2677
+ "text": "'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost' | 'outline'"
2678
+ },
2679
+ "default": "'primary'",
2680
+ "description": "Visual style variant of the button.",
2681
+ "fieldName": "variant",
2682
+ "attribute": "variant"
2638
2683
  },
2639
2684
  {
2640
- "kind": "method",
2641
- "name": "_handleEllipsisKeydown",
2642
- "privacy": "private",
2643
- "return": {
2644
- "type": {
2645
- "text": "void"
2646
- }
2685
+ "name": "hx-size",
2686
+ "type": {
2687
+ "text": "'sm' | 'md' | 'lg'"
2647
2688
  },
2648
- "parameters": [
2649
- {
2650
- "name": "e",
2651
- "type": {
2652
- "text": "KeyboardEvent"
2653
- }
2654
- }
2655
- ]
2689
+ "default": "'md'",
2690
+ "description": "Size of the button.",
2691
+ "fieldName": "size",
2692
+ "attribute": "hx-size"
2656
2693
  },
2657
2694
  {
2658
- "kind": "method",
2659
- "name": "_expandBreadcrumb",
2660
- "privacy": "private",
2661
- "return": {
2662
- "type": {
2663
- "text": "void"
2664
- }
2695
+ "name": "disabled",
2696
+ "type": {
2697
+ "text": "boolean"
2665
2698
  },
2666
- "description": "Expands a collapsed breadcrumb by resetting maxItems to 0.\nCalled by the ellipsis expand button (click or Enter/Space)."
2699
+ "default": "false",
2700
+ "description": "Whether the button is disabled. Prevents all interaction and form actions.",
2701
+ "fieldName": "disabled",
2702
+ "attribute": "disabled"
2667
2703
  },
2668
2704
  {
2669
- "kind": "method",
2670
- "name": "_buildListItem",
2671
- "privacy": "private",
2672
- "return": {
2673
- "type": {
2674
- "text": "JsonLdListItem"
2675
- }
2705
+ "name": "loading",
2706
+ "type": {
2707
+ "text": "boolean"
2676
2708
  },
2677
- "parameters": [
2678
- {
2679
- "name": "item",
2680
- "type": {
2681
- "text": "Element"
2682
- }
2683
- },
2684
- {
2685
- "name": "position",
2686
- "type": {
2687
- "text": "number"
2688
- }
2689
- }
2690
- ],
2691
- "description": "JSON-LD ListItem entry with typed fields to avoid Record<string, unknown>."
2709
+ "default": "false",
2710
+ "description": "Whether the button is in a loading state. Shows spinner, prevents interaction,\nand sets aria-busy. Does not set the disabled attribute.",
2711
+ "fieldName": "loading",
2712
+ "attribute": "loading"
2692
2713
  },
2693
2714
  {
2694
- "kind": "method",
2695
- "name": "_updateJsonLd",
2696
- "privacy": "private",
2697
- "return": {
2698
- "type": {
2699
- "text": "void"
2700
- }
2715
+ "name": "type",
2716
+ "type": {
2717
+ "text": "'button' | 'submit' | 'reset'"
2701
2718
  },
2702
- "parameters": [
2703
- {
2704
- "name": "items",
2705
- "type": {
2706
- "text": "Element[]"
2707
- }
2708
- }
2709
- ]
2719
+ "default": "'button'",
2720
+ "description": "The type attribute for the underlying button element. Ignored when href is set.",
2721
+ "fieldName": "type",
2722
+ "attribute": "type"
2710
2723
  },
2711
2724
  {
2712
- "kind": "method",
2713
- "name": "_removeJsonLd",
2714
- "privacy": "private",
2715
- "return": {
2716
- "type": {
2717
- "text": "void"
2718
- }
2719
- }
2720
- }
2721
- ],
2722
- "attributes": [
2725
+ "name": "href",
2726
+ "type": {
2727
+ "text": "string | undefined"
2728
+ },
2729
+ "default": "undefined",
2730
+ "description": "When set, renders an anchor element instead of a button.",
2731
+ "fieldName": "href",
2732
+ "attribute": "href"
2733
+ },
2723
2734
  {
2724
- "name": "separator",
2735
+ "name": "target",
2725
2736
  "type": {
2726
- "text": "string"
2737
+ "text": "string | undefined"
2727
2738
  },
2728
- "default": "'/'",
2729
- "description": "The separator character displayed between breadcrumb items.",
2730
- "fieldName": "separator",
2731
- "attribute": "separator"
2739
+ "default": "undefined",
2740
+ "description": "Anchor target attribute. Only used when href is set.",
2741
+ "fieldName": "target",
2742
+ "attribute": "target"
2732
2743
  },
2733
2744
  {
2734
- "name": "label",
2745
+ "name": "name",
2735
2746
  "type": {
2736
- "text": "string"
2747
+ "text": "string | undefined"
2737
2748
  },
2738
- "default": "'Breadcrumb'",
2739
- "description": "The accessible label for the nav landmark.",
2740
- "fieldName": "label",
2741
- "attribute": "label"
2749
+ "default": "undefined",
2750
+ "description": "Form field name submitted via ElementInternals.setFormValue on submit.",
2751
+ "fieldName": "name",
2752
+ "attribute": "name"
2742
2753
  },
2743
2754
  {
2744
- "name": "max-items",
2755
+ "name": "value",
2745
2756
  "type": {
2746
- "text": "number"
2757
+ "text": "string | undefined"
2747
2758
  },
2748
- "default": "0",
2749
- "description": "Maximum number of items to show before collapsing middle items with an ellipsis.\nSet to 0 (default) to show all items. The ellipsis is a keyboard-accessible\nbutton; activating it expands the full breadcrumb by setting maxItems to 0.",
2750
- "fieldName": "maxItems",
2751
- "attribute": "max-items"
2759
+ "default": "undefined",
2760
+ "description": "Form field value submitted via ElementInternals.setFormValue on submit.",
2761
+ "fieldName": "value",
2762
+ "attribute": "value"
2752
2763
  },
2753
2764
  {
2754
- "name": "json-ld",
2765
+ "name": "aria-label",
2755
2766
  "type": {
2756
- "text": "boolean"
2767
+ "text": "string | null"
2757
2768
  },
2758
- "default": "false",
2759
- "description": "When true, injects a JSON-LD BreadcrumbList structured data script into the document head.\n\nNOTE: Drupal manages `<head>` content via its own render pipeline. Injecting a\n`<script>` directly via `document.head.appendChild()` in a Drupal context:\n1. Bypasses Drupal's deduplication and `hook_html_head_alter()` hook.\n2. Is not cacheable by Drupal's page cache.\n3. Will be wiped on BigPipe partial page replacements.\n\nFor Drupal integrations, leave `json-ld` false and use the structured data\nTwig template instead (see `hx-breadcrumb.twig` in the component directory).",
2760
- "fieldName": "jsonLd",
2761
- "attribute": "json-ld"
2769
+ "default": "null",
2770
+ "description": "Accessible label forwarded to the inner button/anchor. Required for icon-only usage.",
2771
+ "fieldName": "ariaLabel",
2772
+ "attribute": "aria-label"
2762
2773
  }
2763
2774
  ],
2764
2775
  "superclass": {
2765
2776
  "name": "LitElement",
2766
2777
  "package": "lit"
2767
2778
  },
2768
- "tagName": "hx-breadcrumb",
2769
- "customElement": true
2770
- },
2771
- {
2772
- "kind": "variable",
2773
- "name": "name"
2779
+ "tagName": "hx-button",
2780
+ "customElement": true,
2781
+ "summary": "Primary interactive element for triggering actions and form submission."
2774
2782
  }
2775
2783
  ],
2776
2784
  "exports": [
2777
2785
  {
2778
2786
  "kind": "js",
2779
- "name": "HelixBreadcrumb",
2787
+ "name": "HelixButton",
2780
2788
  "declaration": {
2781
- "name": "HelixBreadcrumb",
2782
- "module": "src/components/hx-breadcrumb/hx-breadcrumb.ts"
2789
+ "name": "HelixButton",
2790
+ "module": "src/components/hx-button/hx-button.ts"
2783
2791
  }
2784
2792
  },
2785
2793
  {
2786
2794
  "kind": "custom-element-definition",
2787
- "name": "hx-breadcrumb",
2795
+ "name": "hx-button",
2788
2796
  "declaration": {
2789
- "name": "HelixBreadcrumb",
2790
- "module": "src/components/hx-breadcrumb/hx-breadcrumb.ts"
2797
+ "name": "HelixButton",
2798
+ "module": "src/components/hx-button/hx-button.ts"
2791
2799
  }
2792
2800
  }
2793
2801
  ]
2794
2802
  },
2795
2803
  {
2796
2804
  "kind": "javascript-module",
2797
- "path": "src/components/hx-breadcrumb/index.ts",
2805
+ "path": "src/components/hx-button/index.ts",
2798
2806
  "declarations": [],
2799
2807
  "exports": [
2800
2808
  {
2801
2809
  "kind": "js",
2802
- "name": "HelixBreadcrumb",
2803
- "declaration": {
2804
- "name": "HelixBreadcrumb",
2805
- "module": "./hx-breadcrumb.js"
2806
- }
2807
- },
2808
- {
2809
- "kind": "js",
2810
- "name": "HelixBreadcrumbItem",
2810
+ "name": "HelixButton",
2811
2811
  "declaration": {
2812
- "name": "HelixBreadcrumbItem",
2813
- "module": "./hx-breadcrumb-item.js"
2812
+ "name": "HelixButton",
2813
+ "module": "./hx-button.js"
2814
2814
  }
2815
2815
  }
2816
2816
  ]