@mk-kit/ui 0.42.0 → 0.43.0

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 (46) hide show
  1. package/README.md +3 -3
  2. package/THIRD_PARTY_NOTICES.md +4 -2
  3. package/fesm2022/mk-kit-ui-block-editor.mjs +4 -2
  4. package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -1
  5. package/fesm2022/mk-kit-ui-checkbox.mjs +4 -2
  6. package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -1
  7. package/fesm2022/mk-kit-ui-core.mjs +131 -1
  8. package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
  9. package/fesm2022/mk-kit-ui-data.mjs +437 -7
  10. package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
  11. package/fesm2022/mk-kit-ui-datetime.mjs +88 -50
  12. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
  13. package/fesm2022/mk-kit-ui-dynamic-form.mjs +149 -2
  14. package/fesm2022/mk-kit-ui-dynamic-form.mjs.map +1 -1
  15. package/fesm2022/mk-kit-ui-feedback.mjs +1 -1
  16. package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
  17. package/fesm2022/mk-kit-ui-forms.mjs +325 -77
  18. package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
  19. package/fesm2022/mk-kit-ui-icon-extended.mjs +425 -0
  20. package/fesm2022/mk-kit-ui-icon-extended.mjs.map +1 -0
  21. package/fesm2022/mk-kit-ui-icon.mjs +296 -459
  22. package/fesm2022/mk-kit-ui-icon.mjs.map +1 -1
  23. package/fesm2022/mk-kit-ui-query-builder.mjs +1 -1
  24. package/fesm2022/mk-kit-ui-query-builder.mjs.map +1 -1
  25. package/fesm2022/mk-kit-ui-rich-text.mjs +4 -2
  26. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
  27. package/fesm2022/mk-kit-ui-table.mjs +10 -2
  28. package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
  29. package/fesm2022/mk-kit-ui.mjs +1 -0
  30. package/fesm2022/mk-kit-ui.mjs.map +1 -1
  31. package/package.json +5 -1
  32. package/schematics/migrate-primeng/transform.js +4 -1
  33. package/schematics/ng-add/index.js +30 -2
  34. package/schematics/ng-add/schema.json +6 -0
  35. package/types/mk-kit-ui-block-editor.d.ts +2 -0
  36. package/types/mk-kit-ui-checkbox.d.ts +2 -0
  37. package/types/mk-kit-ui-core.d.ts +72 -2
  38. package/types/mk-kit-ui-data.d.ts +203 -2
  39. package/types/mk-kit-ui-datetime.d.ts +41 -19
  40. package/types/mk-kit-ui-dynamic-form.d.ts +44 -1
  41. package/types/mk-kit-ui-forms.d.ts +154 -16
  42. package/types/mk-kit-ui-icon-extended.d.ts +83 -0
  43. package/types/mk-kit-ui-icon.d.ts +100 -17
  44. package/types/mk-kit-ui-rich-text.d.ts +2 -0
  45. package/types/mk-kit-ui-table.d.ts +0 -17
  46. package/types/mk-kit-ui.d.ts +1 -0
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, ChangeDetectionStrategy, Component, booleanAttribute, inject, ElementRef, Renderer2, DOCUMENT, PLATFORM_ID, numberAttribute, computed, effect, Directive, signal, contentChildren, output, DestroyRef, afterNextRender, afterRenderEffect, untracked, Injector, viewChild, model, forwardRef, contentChild, TemplateRef, ViewEncapsulation } from '@angular/core';
3
- import { isPlatformBrowser, DOCUMENT as DOCUMENT$1, NgTemplateOutlet } from '@angular/common';
4
- import { mkUniqueId, MK_I18N, MkFieldContext, mkHighlight } from '@mk-kit/ui/core';
2
+ import { input, ChangeDetectionStrategy, Component, booleanAttribute, inject, ElementRef, Renderer2, DOCUMENT, PLATFORM_ID, numberAttribute, computed, effect, Directive, signal, contentChildren, output, TemplateRef, model, contentChild, linkedSignal, DestroyRef, afterNextRender, afterRenderEffect, untracked, Injector, viewChild, forwardRef, ViewEncapsulation } from '@angular/core';
3
+ import { isPlatformBrowser, NgTemplateOutlet, DOCUMENT as DOCUMENT$1 } from '@angular/common';
4
+ import { mkUniqueId, MK_I18N, MkFieldContext, mkInjectFieldTouched, mkHighlight } from '@mk-kit/ui/core';
5
5
  import { MkIcon } from '@mk-kit/ui/icon';
6
6
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import { MkCopyToClipboard } from '@mk-kit/ui/directives';
@@ -680,6 +680,434 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
680
680
  }, template: "<div class=\"mk-timeline-item__marker\">\n <span class=\"mk-timeline-item__dot\">\n @if (icon()) {\n <mk-icon [name]=\"icon()\" [size]=\"14\" />\n }\n </span>\n <span class=\"mk-timeline-item__connector\" aria-hidden=\"true\"></span>\n</div>\n\n<div class=\"mk-timeline-item__content\">\n @if (time()) {\n <span class=\"mk-timeline-item__time\">{{ time() }}</span>\n }\n @if (heading()) {\n <p class=\"mk-timeline-item__heading\">{{ heading() }}</p>\n }\n <div class=\"mk-timeline-item__body\">\n <ng-content />\n </div>\n</div>\n", styles: [":host{--_dot: var(--mk-primary);--_marker: 1.75rem;display:flex;gap:var(--mk-space-3);font-family:var(--mk-font-sans);color:var(--mk-text)}:host([data-tone=primary]){--_dot: var(--mk-primary)}:host([data-tone=success]){--_dot: var(--mk-success)}:host([data-tone=warning]){--_dot: var(--mk-warning)}:host([data-tone=danger]){--_dot: var(--mk-danger)}:host([data-tone=info]){--_dot: var(--mk-info)}:host([data-tone=neutral]){--_dot: var(--mk-text-muted)}.mk-timeline-item__marker{position:relative;flex:none;display:flex;justify-content:center;width:var(--_marker)}.mk-timeline-item__dot{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;width:.75rem;height:.75rem;margin-top:.5rem;border-radius:var(--mk-radius-circle);background-color:var(--_dot);color:var(--mk-primary-contrast);box-shadow:0 0 0 3px var(--mk-surface)}:host(.mk-timeline-item--icon) .mk-timeline-item__dot{width:var(--_marker);height:var(--_marker);margin-top:0;color:var(--_dot);background-color:color-mix(in srgb,var(--_dot) 16%,var(--mk-surface));box-shadow:0 0 0 3px var(--mk-surface),inset 0 0 0 1.5px color-mix(in srgb,var(--_dot) 40%,transparent)}.mk-timeline-item__connector{position:absolute;top:var(--_marker);bottom:0;left:50%;width:2px;transform:translate(-50%);background-color:var(--mk-border)}:host(:last-child) .mk-timeline-item__connector{display:none}.mk-timeline-item__content{flex:1 1 auto;min-width:0;padding-bottom:var(--mk-space-5)}:host(:last-child) .mk-timeline-item__content{padding-bottom:0}.mk-timeline-item__time{display:block;font-size:var(--mk-font-size-xs);font-weight:var(--mk-font-weight-medium);color:var(--mk-text-subtle)}.mk-timeline-item__heading{margin:0;font-size:var(--mk-font-size-md);font-weight:var(--mk-font-weight-semibold);line-height:var(--mk-line-height-snug);color:var(--mk-text)}.mk-timeline-item__body{margin-top:var(--mk-space-1);font-size:var(--mk-font-size-md);line-height:var(--mk-line-height-normal);color:var(--mk-text-muted)}.mk-timeline-item__body:empty{display:none}\n"] }]
681
681
  }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], time: [{ type: i0.Input, args: [{ isSignal: true, alias: "time", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }] } });
682
682
 
683
+ /**
684
+ * Build the nested `nodes` input from a flat `parentId` list (the shape most
685
+ * HR / directory APIs return). Row order is preserved among siblings; rows
686
+ * whose `parentId` does not match any row become roots.
687
+ *
688
+ * ```ts
689
+ * const nodes = mkOrgChartFromFlat([
690
+ * { id: 'ceo', label: 'Ada' },
691
+ * { id: 'cto', label: 'Grace', parentId: 'ceo' },
692
+ * ]);
693
+ * ```
694
+ */
695
+ function mkOrgChartFromFlat(list) {
696
+ const byId = new Map();
697
+ for (const row of list) {
698
+ const node = { id: row.id };
699
+ if (row.label !== undefined)
700
+ node.label = row.label;
701
+ if (row.data !== undefined)
702
+ node.data = row.data;
703
+ if (row.expanded !== undefined)
704
+ node.expanded = row.expanded;
705
+ byId.set(row.id, node);
706
+ }
707
+ const roots = [];
708
+ for (const row of list) {
709
+ const node = byId.get(row.id);
710
+ const parent = row.parentId != null ? byId.get(row.parentId) : undefined;
711
+ if (parent && parent !== node)
712
+ (parent.children ??= []).push(node);
713
+ else
714
+ roots.push(node);
715
+ }
716
+ return roots;
717
+ }
718
+ /**
719
+ * Custom node card for `mk-org-chart`:
720
+ *
721
+ * ```html
722
+ * <mk-org-chart [nodes]="nodes">
723
+ * <ng-template mkOrgChartNodeDef let-node let-selected="selected">
724
+ * <strong>{{ node.label }}</strong> — {{ node.data?.title }}
725
+ * </ng-template>
726
+ * </mk-org-chart>
727
+ * ```
728
+ *
729
+ * Bind the same array you pass to `nodes` to get a typed `node.data` in the
730
+ * template: `<ng-template [mkOrgChartNodeDef]="nodes" let-node>`.
731
+ */
732
+ class MkOrgChartNodeDef {
733
+ /**
734
+ * Type-inference hook only (the value is not used at runtime): bind the
735
+ * `nodes` array so `let-node` is typed as `MkOrgChartNode<T>`.
736
+ */
737
+ mkOrgChartNodeDef = input(undefined, /* @ts-ignore */
738
+ ...(ngDevMode ? [{ debugName: "mkOrgChartNodeDef" }] : /* istanbul ignore next */ []));
739
+ template = inject((TemplateRef));
740
+ static ngTemplateContextGuard(_dir, ctx) {
741
+ return true;
742
+ }
743
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkOrgChartNodeDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
744
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: MkOrgChartNodeDef, isStandalone: true, selector: "ng-template[mkOrgChartNodeDef]", inputs: { mkOrgChartNodeDef: { classPropertyName: "mkOrgChartNodeDef", publicName: "mkOrgChartNodeDef", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
745
+ }
746
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkOrgChartNodeDef, decorators: [{
747
+ type: Directive,
748
+ args: [{ selector: 'ng-template[mkOrgChartNodeDef]' }]
749
+ }], propDecorators: { mkOrgChartNodeDef: [{ type: i0.Input, args: [{ isSignal: true, alias: "mkOrgChartNodeDef", required: false }] }] } });
750
+ /**
751
+ * Organisation chart — a reporting-line hierarchy drawn with plain nested
752
+ * lists and CSS connectors (no canvas, prints and themes like everything
753
+ * else). Feed it a tree (`nodes`) or convert a flat `parentId` list with
754
+ * {@link mkOrgChartFromFlat}. Nodes render as a default card (avatar /
755
+ * initials, label, `data.title`) or through an `mkOrgChartNodeDef` template.
756
+ *
757
+ * Follows the ARIA tree pattern (`role="tree"` / `treeitem` / `group`, one
758
+ * roving tab stop). Keyboard (top-down; the axes swap for `orientation="left"`
759
+ * and in RTL): Down = first child (expands a collapsed node first), Up =
760
+ * parent, Left/Right = previous/next sibling, Home/End = first/last visible
761
+ * node, Enter/Space = select (or toggle when not selectable), `*` = expand
762
+ * all siblings, `+`/`-` = expand/collapse.
763
+ *
764
+ * ```html
765
+ * <mk-org-chart
766
+ * [nodes]="company"
767
+ * selectable
768
+ * [(selected)]="personId"
769
+ * collapsible
770
+ * (nodeClick)="open($event)"
771
+ * />
772
+ * ```
773
+ */
774
+ class MkOrgChart {
775
+ host = inject(ElementRef);
776
+ document = inject(DOCUMENT);
777
+ /** Localised strings (override globally via `provideMkI18n`). */
778
+ i18n = inject(MK_I18N);
779
+ /** The hierarchy to render (roots first). */
780
+ nodes = input([], /* @ts-ignore */
781
+ ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
782
+ /** Root at the top (children below) or at the inline start (children to the side). */
783
+ orientation = input('top', /* @ts-ignore */
784
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
785
+ /** Allow choosing a node (adds selection styling + `aria-selected`). */
786
+ selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
787
+ /** Show a toggle on every parent so branches can be hidden. */
788
+ collapsible = input(false, { ...(ngDevMode ? { debugName: "collapsible" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
789
+ /** Scale factor applied to the whole chart (clamped to 0.5–2). */
790
+ zoom = input(1, { ...(ngDevMode ? { debugName: "zoom" } : /* istanbul ignore next */ {}), transform: numberAttribute });
791
+ /** Accessible name for the tree. */
792
+ ariaLabel = input(this.i18n.orgChartLabel, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
793
+ /** Two-way selected node id (`null` = nothing selected). */
794
+ selected = model(null, /* @ts-ignore */
795
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
796
+ /**
797
+ * Two-way ids of the expanded parents. Leave unbound to let the chart
798
+ * manage expansion itself (seeded from each node's `expanded` flag).
799
+ */
800
+ expanded = model(undefined, /* @ts-ignore */
801
+ ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
802
+ /** Emits the node whose card was clicked or activated with Enter/Space. */
803
+ nodeClick = output();
804
+ /** Emits whenever a node is expanded or collapsed. */
805
+ nodeToggle = output();
806
+ nodeDef = contentChild((MkOrgChartNodeDef), /* @ts-ignore */
807
+ ...(ngDevMode ? [{ debugName: "nodeDef" }] : /* istanbul ignore next */ []));
808
+ zoomLevel = computed(() => {
809
+ const z = this.zoom();
810
+ return Number.isFinite(z) ? Math.min(2, Math.max(0.5, z)) : 1;
811
+ }, /* @ts-ignore */
812
+ ...(ngDevMode ? [{ debugName: "zoomLevel" }] : /* istanbul ignore next */ []));
813
+ /**
814
+ * Expanded parent ids. Controlled by `expanded` when bound; otherwise kept
815
+ * locally — a node's `expanded` flag only seeds ids not present in the
816
+ * previous `nodes` value, so re-emitting the array never reverts branches
817
+ * the user has since toggled.
818
+ */
819
+ expandedIds = linkedSignal({ ...(ngDevMode ? { debugName: "expandedIds" } : /* istanbul ignore next */ {}), source: () => ({ nodes: this.nodes(), expanded: this.expanded() }),
820
+ computation: ({ nodes, expanded }, previous) => {
821
+ if (expanded)
822
+ return new Set(expanded);
823
+ const prev = previous?.value;
824
+ const known = previous ? collectIds(previous.source.nodes) : null;
825
+ const next = new Set();
826
+ walk(nodes, (node) => {
827
+ if (!node.children?.length)
828
+ return;
829
+ const isKnown = known?.has(node.id) ?? false;
830
+ if (isKnown ? prev.has(node.id) : node.expanded !== false)
831
+ next.add(node.id);
832
+ });
833
+ return next;
834
+ } });
835
+ /** Id of the node holding the roving tab stop. */
836
+ activeId = signal(null, /* @ts-ignore */
837
+ ...(ngDevMode ? [{ debugName: "activeId" }] : /* istanbul ignore next */ []));
838
+ /** Visible nodes in DOM (pre-order) order. */
839
+ rows = computed(() => {
840
+ const collapsible = this.collapsible();
841
+ const expandedIds = this.expandedIds();
842
+ const out = [];
843
+ const visit = (list, depth, parentId) => {
844
+ const siblings = list.map((n) => n.id);
845
+ for (const node of list) {
846
+ const hasChildren = !!node.children?.length;
847
+ const expanded = hasChildren && (!collapsible || expandedIds.has(node.id));
848
+ out.push({ node, depth, parentId, siblings, hasChildren, expanded });
849
+ if (expanded)
850
+ visit(node.children, depth + 1, node.id);
851
+ }
852
+ };
853
+ visit(this.nodes(), 1, null);
854
+ return out;
855
+ }, /* @ts-ignore */
856
+ ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
857
+ rowById = computed(() => new Map(this.rows().map((r) => [r.node.id, r])), /* @ts-ignore */
858
+ ...(ngDevMode ? [{ debugName: "rowById" }] : /* istanbul ignore next */ []));
859
+ /** The single id with `tabindex="0"` (falls back to the first visible node). */
860
+ tabStopId = computed(() => {
861
+ const active = this.activeId();
862
+ if (active !== null && this.rowById().has(active))
863
+ return active;
864
+ return this.rows()[0]?.node.id ?? null;
865
+ }, /* @ts-ignore */
866
+ ...(ngDevMode ? [{ debugName: "tabStopId" }] : /* istanbul ignore next */ []));
867
+ // ---- template helpers --------------------------------------------------
868
+ isExpanded(node) {
869
+ if (!node.children?.length)
870
+ return false;
871
+ return !this.collapsible() || this.expandedIds().has(node.id);
872
+ }
873
+ isSelected(node) {
874
+ return this.selectable() && this.selected() === node.id;
875
+ }
876
+ tabIndexFor(node) {
877
+ return this.tabStopId() === node.id ? 0 : -1;
878
+ }
879
+ toggleLabel(node) {
880
+ const tpl = this.isExpanded(node) ? this.i18n.orgChartCollapse : this.i18n.orgChartExpand;
881
+ return tpl.replace('{label}', node.label ?? node.id);
882
+ }
883
+ context(node, depth) {
884
+ return {
885
+ $implicit: node,
886
+ node,
887
+ depth,
888
+ expanded: this.isExpanded(node),
889
+ selected: this.isSelected(node),
890
+ };
891
+ }
892
+ /** `data.title` / `data.avatar` of the default card, read defensively. */
893
+ field(node, key) {
894
+ const data = node.data;
895
+ const value = data?.[key];
896
+ return typeof value === 'string' && value ? value : undefined;
897
+ }
898
+ // ---- state changes -----------------------------------------------------
899
+ /** Expand or collapse a parent (no-op for leaves / non-collapsible charts). */
900
+ toggle(node) {
901
+ this.setExpanded(node, !this.isExpanded(node));
902
+ }
903
+ /** Expand or collapse a parent explicitly. */
904
+ setExpanded(node, expanded) {
905
+ if (!this.collapsible() || !node.children?.length)
906
+ return;
907
+ if (this.expandedIds().has(node.id) === expanded)
908
+ return;
909
+ const next = new Set(this.expandedIds());
910
+ if (expanded)
911
+ next.add(node.id);
912
+ else
913
+ next.delete(node.id);
914
+ this.expandedIds.set(next);
915
+ this.expanded.set([...next]);
916
+ this.nodeToggle.emit({ node, expanded });
917
+ }
918
+ /** Select a node by reference (no-op unless `selectable`). */
919
+ select(node) {
920
+ if (!this.selectable())
921
+ return;
922
+ this.selected.set(node.id);
923
+ }
924
+ activate(node) {
925
+ this.activeId.set(node.id);
926
+ if (this.selectable())
927
+ this.select(node);
928
+ this.nodeClick.emit(node);
929
+ }
930
+ onCardClick(event, node) {
931
+ event.stopPropagation();
932
+ this.activate(node);
933
+ }
934
+ onToggleClick(event, node) {
935
+ event.stopPropagation();
936
+ this.activeId.set(node.id);
937
+ this.toggle(node);
938
+ this.focusItem(node.id);
939
+ }
940
+ /** Keeps the roving tab stop on whichever item last received focus. */
941
+ onFocusIn(event) {
942
+ const id = this.itemIdOf(event.target);
943
+ if (id !== null)
944
+ this.activeId.set(id);
945
+ }
946
+ onKeydown(event) {
947
+ if (!(event instanceof KeyboardEvent))
948
+ return;
949
+ const id = this.itemIdOf(event.target);
950
+ if (id === null)
951
+ return;
952
+ const row = this.rowById().get(id);
953
+ if (!row)
954
+ return;
955
+ const node = row.node;
956
+ const intent = this.intentOf(event.key);
957
+ switch (intent) {
958
+ case 'into':
959
+ event.preventDefault();
960
+ if (row.hasChildren && !row.expanded) {
961
+ this.setExpanded(node, true);
962
+ }
963
+ else if (row.expanded) {
964
+ this.focusItem(node.children[0].id);
965
+ }
966
+ return;
967
+ case 'parent':
968
+ event.preventDefault();
969
+ if (row.parentId !== null)
970
+ this.focusItem(row.parentId);
971
+ return;
972
+ case 'next':
973
+ case 'prev': {
974
+ event.preventDefault();
975
+ const i = row.siblings.indexOf(id);
976
+ const target = row.siblings[intent === 'next' ? i + 1 : i - 1];
977
+ if (target !== undefined)
978
+ this.focusItem(target);
979
+ return;
980
+ }
981
+ }
982
+ switch (event.key) {
983
+ case 'Home':
984
+ event.preventDefault();
985
+ this.focusItem(this.rows()[0]?.node.id ?? null);
986
+ break;
987
+ case 'End': {
988
+ event.preventDefault();
989
+ const rows = this.rows();
990
+ this.focusItem(rows[rows.length - 1]?.node.id ?? null);
991
+ break;
992
+ }
993
+ case 'Enter':
994
+ case ' ':
995
+ event.preventDefault();
996
+ if (!this.selectable() && row.hasChildren && this.collapsible()) {
997
+ this.toggle(node);
998
+ }
999
+ this.activate(node);
1000
+ break;
1001
+ case '*': {
1002
+ event.preventDefault();
1003
+ const nodes = this.siblingsOf(row);
1004
+ for (const sibling of nodes)
1005
+ this.setExpanded(sibling, true);
1006
+ break;
1007
+ }
1008
+ case '+':
1009
+ case '=':
1010
+ event.preventDefault();
1011
+ this.setExpanded(node, true);
1012
+ break;
1013
+ case '-':
1014
+ event.preventDefault();
1015
+ this.setExpanded(node, false);
1016
+ break;
1017
+ }
1018
+ }
1019
+ /**
1020
+ * Map an arrow key to a tree direction. Top-down: Down = into, Up = parent,
1021
+ * Left/Right = siblings (mirrored in RTL). Left-to-right: Right = into,
1022
+ * Left = parent (mirrored in RTL), Up/Down = siblings.
1023
+ */
1024
+ intentOf(key) {
1025
+ const rtl = this.isRtl();
1026
+ if (this.orientation() === 'left') {
1027
+ switch (key) {
1028
+ case 'ArrowRight':
1029
+ return rtl ? 'parent' : 'into';
1030
+ case 'ArrowLeft':
1031
+ return rtl ? 'into' : 'parent';
1032
+ case 'ArrowDown':
1033
+ return 'next';
1034
+ case 'ArrowUp':
1035
+ return 'prev';
1036
+ }
1037
+ return null;
1038
+ }
1039
+ switch (key) {
1040
+ case 'ArrowDown':
1041
+ return 'into';
1042
+ case 'ArrowUp':
1043
+ return 'parent';
1044
+ case 'ArrowRight':
1045
+ return rtl ? 'prev' : 'next';
1046
+ case 'ArrowLeft':
1047
+ return rtl ? 'next' : 'prev';
1048
+ }
1049
+ return null;
1050
+ }
1051
+ siblingsOf(row) {
1052
+ const list = row.parentId === null
1053
+ ? this.nodes()
1054
+ : (this.rowById().get(row.parentId)?.node.children ?? []);
1055
+ return list.filter((n) => !!n.children?.length);
1056
+ }
1057
+ isRtl() {
1058
+ const el = this.host.nativeElement;
1059
+ const dir = el.closest('[dir]')?.getAttribute('dir');
1060
+ if (dir)
1061
+ return dir.toLowerCase() === 'rtl';
1062
+ const view = this.document.defaultView;
1063
+ return (view?.getComputedStyle(el).direction ?? 'ltr') === 'rtl';
1064
+ }
1065
+ itemIdOf(target) {
1066
+ if (!(target instanceof Element))
1067
+ return null;
1068
+ const item = target.closest('.mk-org-chart__item');
1069
+ if (!item || !this.host.nativeElement.contains(item))
1070
+ return null;
1071
+ return item.dataset['mkId'] ?? null;
1072
+ }
1073
+ focusItem(id) {
1074
+ if (id === null)
1075
+ return;
1076
+ this.activeId.set(id);
1077
+ const items = this.host.nativeElement.querySelectorAll('.mk-org-chart__item');
1078
+ for (const item of Array.from(items)) {
1079
+ if (item.dataset['mkId'] === id) {
1080
+ item.focus();
1081
+ return;
1082
+ }
1083
+ }
1084
+ }
1085
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkOrgChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
1086
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MkOrgChart, isStandalone: true, selector: "mk-org-chart", inputs: { nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selectedChange", expanded: "expandedChange", nodeClick: "nodeClick", nodeToggle: "nodeToggle" }, host: { properties: { "class.mk-org-chart--top": "orientation() === 'top'", "class.mk-org-chart--left": "orientation() === 'left'", "class.mk-org-chart--selectable": "selectable()", "class.mk-org-chart--collapsible": "collapsible()" }, classAttribute: "mk-org-chart" }, queries: [{ propertyName: "nodeDef", first: true, predicate: (MkOrgChartNodeDef), descendants: true, isSignal: true }], exportAs: ["mkOrgChart"], ngImport: i0, template: "<div class=\"mk-org-chart__scroller\">\n <div class=\"mk-org-chart__canvas\" [style.zoom]=\"zoomLevel()\">\n <ul\n class=\"mk-org-chart__level mk-org-chart__level--root\"\n role=\"tree\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (keydown)=\"onKeydown($event)\"\n (focusin)=\"onFocusIn($event)\"\n >\n @for (node of nodes(); track node.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: node, depth: 1 }\"\n />\n }\n </ul>\n </div>\n</div>\n\n<ng-template #itemTpl let-node=\"node\" let-depth=\"depth\">\n <li\n class=\"mk-org-chart__item\"\n role=\"treeitem\"\n [attr.data-mk-id]=\"node.id\"\n [class.mk-org-chart__item--expanded]=\"isExpanded(node)\"\n [class.mk-org-chart__item--collapsed]=\"node.children?.length && !isExpanded(node)\"\n [attr.aria-level]=\"depth\"\n [attr.aria-expanded]=\"node.children?.length ? isExpanded(node) : null\"\n [attr.aria-selected]=\"selectable() ? isSelected(node) : null\"\n [attr.tabindex]=\"tabIndexFor(node)\"\n >\n <div\n class=\"mk-org-chart__node\"\n [class.mk-org-chart__node--selected]=\"isSelected(node)\"\n [class.mk-org-chart__node--custom]=\"!!nodeDef()\"\n (click)=\"onCardClick($event, node)\"\n >\n @if (nodeDef(); as def) {\n <ng-container\n *ngTemplateOutlet=\"def.template; context: context(node, depth)\"\n />\n } @else {\n <mk-avatar\n class=\"mk-org-chart__avatar\"\n size=\"sm\"\n [name]=\"node.label ?? node.id\"\n [src]=\"field(node, 'avatar')\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <span class=\"mk-org-chart__text\">\n <span class=\"mk-org-chart__label\">{{ node.label ?? node.id }}</span>\n @if (field(node, 'title'); as title) {\n <span class=\"mk-org-chart__title\">{{ title }}</span>\n }\n </span>\n }\n @if (collapsible() && node.children?.length) {\n <button\n type=\"button\"\n class=\"mk-org-chart__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"toggleLabel(node)\"\n [attr.aria-expanded]=\"isExpanded(node)\"\n (click)=\"onToggleClick($event, node)\"\n >\n <span class=\"mk-org-chart__caret\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n @if (isExpanded(node)) {\n <ul class=\"mk-org-chart__level mk-org-chart__level--nested\" role=\"group\">\n @for (child of node.children; track child.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{--_line: var(--mk-border-strong);--_line-w: var(--mk-border-width);--_gap-main: var(--mk-space-8);--_gap-cross: var(--mk-space-4);--_card-w: 11rem;display:block;font-family:var(--mk-font-sans);color:var(--mk-text)}.mk-org-chart__scroller{overflow:auto;max-width:100%}.mk-org-chart__canvas{display:inline-block;min-width:100%;padding:var(--mk-space-2);box-sizing:border-box}.mk-org-chart__level{display:flex;list-style:none;margin:0;padding:0;position:relative}.mk-org-chart__level--root{justify-content:center}.mk-org-chart__item{position:relative;display:flex;align-items:center;outline:none}:host(.mk-org-chart--top) .mk-org-chart__level{flex-direction:row}:host(.mk-org-chart--top) .mk-org-chart__level--nested{padding-block-start:var(--_gap-main)}:host(.mk-org-chart--top) .mk-org-chart__level--nested:before{content:\"\";position:absolute;top:0;inset-inline-start:50%;width:0;height:var(--_gap-main);border-inline-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--top) .mk-org-chart__item{flex-direction:column;padding:var(--_gap-main) calc(var(--_gap-cross) / 2) 0}:host(.mk-org-chart--top) .mk-org-chart__item:before,:host(.mk-org-chart--top) .mk-org-chart__item:after{content:\"\";position:absolute;top:0;width:50%;height:var(--_gap-main);border-block-start:var(--_line-w) solid var(--_line);pointer-events:none}:host(.mk-org-chart--top) .mk-org-chart__item:before{inset-inline-end:50%}:host(.mk-org-chart--top) .mk-org-chart__item:after{inset-inline-start:50%;border-inline-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--top) .mk-org-chart__item:first-child:before{display:none}:host(.mk-org-chart--top) .mk-org-chart__item:last-child:after{border-block-start-color:transparent}:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item{padding-block-start:0}:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item:before,:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item:after{display:none}:host(.mk-org-chart--left) .mk-org-chart__level{flex-direction:column}:host(.mk-org-chart--left) .mk-org-chart__level--root{align-items:flex-start}:host(.mk-org-chart--left) .mk-org-chart__level--nested{padding-inline-start:var(--_gap-main)}:host(.mk-org-chart--left) .mk-org-chart__level--nested:before{content:\"\";position:absolute;top:50%;inset-inline-start:0;width:var(--_gap-main);height:0;border-block-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--left) .mk-org-chart__item{flex-direction:row;padding-block:calc(var(--_gap-cross) / 2);padding-inline:var(--_gap-main) 0}:host(.mk-org-chart--left) .mk-org-chart__item:before,:host(.mk-org-chart--left) .mk-org-chart__item:after{content:\"\";position:absolute;inset-inline-start:0;width:var(--_gap-main);height:50%;border-inline-start:var(--_line-w) solid var(--_line);pointer-events:none}:host(.mk-org-chart--left) .mk-org-chart__item:before{top:0}:host(.mk-org-chart--left) .mk-org-chart__item:after{top:50%;border-block-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--left) .mk-org-chart__item:first-child:before{display:none}:host(.mk-org-chart--left) .mk-org-chart__item:last-child:after{border-inline-start-color:transparent}:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item{padding-inline-start:0}:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item:before,:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item:after{display:none}.mk-org-chart__node{position:relative;z-index:1;display:flex;align-items:center;gap:var(--mk-space-3);box-sizing:border-box;min-width:var(--_card-w);max-width:calc(var(--_card-w) * 2);min-height:2.75rem;padding:var(--mk-space-2) var(--mk-space-3);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);background:var(--mk-surface);box-shadow:var(--mk-shadow-xs);text-align:start;transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),background-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}.mk-org-chart__node--custom{display:block;min-width:0;max-width:none;min-height:0;padding:0;border:0;background:transparent;box-shadow:none}:host(.mk-org-chart--selectable) .mk-org-chart__node{cursor:pointer;-webkit-user-select:none;user-select:none}:host(.mk-org-chart--selectable) .mk-org-chart__node:not(.mk-org-chart__node--custom):hover{border-color:var(--mk-border-strong);background-color:color-mix(in srgb,var(--mk-surface),var(--mk-hover-overlay))}.mk-org-chart__node--selected:not(.mk-org-chart__node--custom),:host(.mk-org-chart--selectable) .mk-org-chart__node--selected:not(.mk-org-chart__node--custom):hover{border-color:var(--mk-primary);background-color:var(--mk-primary-subtle);box-shadow:0 0 0 1px var(--mk-primary)}.mk-org-chart__item:focus-visible>.mk-org-chart__node{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-radius:var(--mk-radius-md)}.mk-org-chart__avatar{flex:none}.mk-org-chart__text{display:flex;flex-direction:column;min-width:0;line-height:var(--mk-line-height-snug)}.mk-org-chart__label{font-size:var(--mk-font-size-sm);font-weight:var(--mk-font-weight-semibold);color:var(--mk-text);overflow-wrap:anywhere}.mk-org-chart__title{font-size:var(--mk-font-size-xs);color:var(--mk-text-muted);overflow-wrap:anywhere}.mk-org-chart__node--selected .mk-org-chart__label{color:var(--mk-primary-subtle-text)}.mk-org-chart__toggle{position:absolute;z-index:2;display:grid;place-items:center;width:1.25rem;height:1.25rem;padding:0;margin:0;border:var(--mk-border-width) solid var(--mk-border-strong);border-radius:var(--mk-radius-circle);background:var(--mk-surface);color:var(--mk-text-muted);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),color var(--mk-duration-fast) var(--mk-ease-standard)}@media(pointer:coarse){.mk-org-chart__toggle:after{content:\"\";position:absolute;inset:min(0px,(100% - 24px) / 2)}}.mk-org-chart__toggle:hover{background:var(--mk-surface-2);color:var(--mk-text)}.mk-org-chart__toggle:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}:host(.mk-org-chart--top) .mk-org-chart__toggle{bottom:0;left:50%;transform:translate(-50%,50%)}:host(.mk-org-chart--left) .mk-org-chart__toggle{top:50%;inset-inline-end:0;transform:translateY(-50%);margin-inline-end:-.625rem}.mk-org-chart__caret{width:.35rem;height:.35rem;border-inline-end:2px solid currentColor;border-block-end:2px solid currentColor;transition:transform var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-org-chart--top) .mk-org-chart__caret{transform:translateY(-1px) rotate(45deg)}:host(.mk-org-chart--top) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translateY(1px) rotate(-135deg)}:host(.mk-org-chart--left) .mk-org-chart__caret{transform:translate(-1px) rotate(-45deg)}:host(.mk-org-chart--left) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translate(1px) rotate(135deg)}:host(.mk-org-chart--left:dir(rtl)) .mk-org-chart__caret{transform:translate(1px) rotate(135deg)}:host(.mk-org-chart--left:dir(rtl)) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translate(-1px) rotate(-45deg)}@media(prefers-reduced-motion:reduce){.mk-org-chart__node,.mk-org-chart__toggle,.mk-org-chart__caret{transition:none}}@media print{.mk-org-chart__scroller{overflow:visible}.mk-org-chart__canvas{display:block;zoom:1!important}.mk-org-chart__node{box-shadow:none;break-inside:avoid}.mk-org-chart__toggle{display:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MkAvatar, selector: "mk-avatar", inputs: ["src", "name", "alt", "size", "shape", "status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1087
+ }
1088
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkOrgChart, decorators: [{
1089
+ type: Component,
1090
+ args: [{ selector: 'mk-org-chart', exportAs: 'mkOrgChart', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, MkAvatar], host: {
1091
+ class: 'mk-org-chart',
1092
+ '[class.mk-org-chart--top]': "orientation() === 'top'",
1093
+ '[class.mk-org-chart--left]': "orientation() === 'left'",
1094
+ '[class.mk-org-chart--selectable]': 'selectable()',
1095
+ '[class.mk-org-chart--collapsible]': 'collapsible()',
1096
+ }, template: "<div class=\"mk-org-chart__scroller\">\n <div class=\"mk-org-chart__canvas\" [style.zoom]=\"zoomLevel()\">\n <ul\n class=\"mk-org-chart__level mk-org-chart__level--root\"\n role=\"tree\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (keydown)=\"onKeydown($event)\"\n (focusin)=\"onFocusIn($event)\"\n >\n @for (node of nodes(); track node.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: node, depth: 1 }\"\n />\n }\n </ul>\n </div>\n</div>\n\n<ng-template #itemTpl let-node=\"node\" let-depth=\"depth\">\n <li\n class=\"mk-org-chart__item\"\n role=\"treeitem\"\n [attr.data-mk-id]=\"node.id\"\n [class.mk-org-chart__item--expanded]=\"isExpanded(node)\"\n [class.mk-org-chart__item--collapsed]=\"node.children?.length && !isExpanded(node)\"\n [attr.aria-level]=\"depth\"\n [attr.aria-expanded]=\"node.children?.length ? isExpanded(node) : null\"\n [attr.aria-selected]=\"selectable() ? isSelected(node) : null\"\n [attr.tabindex]=\"tabIndexFor(node)\"\n >\n <div\n class=\"mk-org-chart__node\"\n [class.mk-org-chart__node--selected]=\"isSelected(node)\"\n [class.mk-org-chart__node--custom]=\"!!nodeDef()\"\n (click)=\"onCardClick($event, node)\"\n >\n @if (nodeDef(); as def) {\n <ng-container\n *ngTemplateOutlet=\"def.template; context: context(node, depth)\"\n />\n } @else {\n <mk-avatar\n class=\"mk-org-chart__avatar\"\n size=\"sm\"\n [name]=\"node.label ?? node.id\"\n [src]=\"field(node, 'avatar')\"\n alt=\"\"\n aria-hidden=\"true\"\n />\n <span class=\"mk-org-chart__text\">\n <span class=\"mk-org-chart__label\">{{ node.label ?? node.id }}</span>\n @if (field(node, 'title'); as title) {\n <span class=\"mk-org-chart__title\">{{ title }}</span>\n }\n </span>\n }\n @if (collapsible() && node.children?.length) {\n <button\n type=\"button\"\n class=\"mk-org-chart__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"toggleLabel(node)\"\n [attr.aria-expanded]=\"isExpanded(node)\"\n (click)=\"onToggleClick($event, node)\"\n >\n <span class=\"mk-org-chart__caret\" aria-hidden=\"true\"></span>\n </button>\n }\n </div>\n @if (isExpanded(node)) {\n <ul class=\"mk-org-chart__level mk-org-chart__level--nested\" role=\"group\">\n @for (child of node.children; track child.id) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl; context: { node: child, depth: depth + 1 }\"\n />\n }\n </ul>\n }\n </li>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{--_line: var(--mk-border-strong);--_line-w: var(--mk-border-width);--_gap-main: var(--mk-space-8);--_gap-cross: var(--mk-space-4);--_card-w: 11rem;display:block;font-family:var(--mk-font-sans);color:var(--mk-text)}.mk-org-chart__scroller{overflow:auto;max-width:100%}.mk-org-chart__canvas{display:inline-block;min-width:100%;padding:var(--mk-space-2);box-sizing:border-box}.mk-org-chart__level{display:flex;list-style:none;margin:0;padding:0;position:relative}.mk-org-chart__level--root{justify-content:center}.mk-org-chart__item{position:relative;display:flex;align-items:center;outline:none}:host(.mk-org-chart--top) .mk-org-chart__level{flex-direction:row}:host(.mk-org-chart--top) .mk-org-chart__level--nested{padding-block-start:var(--_gap-main)}:host(.mk-org-chart--top) .mk-org-chart__level--nested:before{content:\"\";position:absolute;top:0;inset-inline-start:50%;width:0;height:var(--_gap-main);border-inline-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--top) .mk-org-chart__item{flex-direction:column;padding:var(--_gap-main) calc(var(--_gap-cross) / 2) 0}:host(.mk-org-chart--top) .mk-org-chart__item:before,:host(.mk-org-chart--top) .mk-org-chart__item:after{content:\"\";position:absolute;top:0;width:50%;height:var(--_gap-main);border-block-start:var(--_line-w) solid var(--_line);pointer-events:none}:host(.mk-org-chart--top) .mk-org-chart__item:before{inset-inline-end:50%}:host(.mk-org-chart--top) .mk-org-chart__item:after{inset-inline-start:50%;border-inline-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--top) .mk-org-chart__item:first-child:before{display:none}:host(.mk-org-chart--top) .mk-org-chart__item:last-child:after{border-block-start-color:transparent}:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item{padding-block-start:0}:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item:before,:host(.mk-org-chart--top) .mk-org-chart__level--root>.mk-org-chart__item:after{display:none}:host(.mk-org-chart--left) .mk-org-chart__level{flex-direction:column}:host(.mk-org-chart--left) .mk-org-chart__level--root{align-items:flex-start}:host(.mk-org-chart--left) .mk-org-chart__level--nested{padding-inline-start:var(--_gap-main)}:host(.mk-org-chart--left) .mk-org-chart__level--nested:before{content:\"\";position:absolute;top:50%;inset-inline-start:0;width:var(--_gap-main);height:0;border-block-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--left) .mk-org-chart__item{flex-direction:row;padding-block:calc(var(--_gap-cross) / 2);padding-inline:var(--_gap-main) 0}:host(.mk-org-chart--left) .mk-org-chart__item:before,:host(.mk-org-chart--left) .mk-org-chart__item:after{content:\"\";position:absolute;inset-inline-start:0;width:var(--_gap-main);height:50%;border-inline-start:var(--_line-w) solid var(--_line);pointer-events:none}:host(.mk-org-chart--left) .mk-org-chart__item:before{top:0}:host(.mk-org-chart--left) .mk-org-chart__item:after{top:50%;border-block-start:var(--_line-w) solid var(--_line)}:host(.mk-org-chart--left) .mk-org-chart__item:first-child:before{display:none}:host(.mk-org-chart--left) .mk-org-chart__item:last-child:after{border-inline-start-color:transparent}:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item{padding-inline-start:0}:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item:before,:host(.mk-org-chart--left) .mk-org-chart__level--root>.mk-org-chart__item:after{display:none}.mk-org-chart__node{position:relative;z-index:1;display:flex;align-items:center;gap:var(--mk-space-3);box-sizing:border-box;min-width:var(--_card-w);max-width:calc(var(--_card-w) * 2);min-height:2.75rem;padding:var(--mk-space-2) var(--mk-space-3);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-md);background:var(--mk-surface);box-shadow:var(--mk-shadow-xs);text-align:start;transition:border-color var(--mk-duration-fast) var(--mk-ease-standard),background-color var(--mk-duration-fast) var(--mk-ease-standard),box-shadow var(--mk-duration-fast) var(--mk-ease-standard)}.mk-org-chart__node--custom{display:block;min-width:0;max-width:none;min-height:0;padding:0;border:0;background:transparent;box-shadow:none}:host(.mk-org-chart--selectable) .mk-org-chart__node{cursor:pointer;-webkit-user-select:none;user-select:none}:host(.mk-org-chart--selectable) .mk-org-chart__node:not(.mk-org-chart__node--custom):hover{border-color:var(--mk-border-strong);background-color:color-mix(in srgb,var(--mk-surface),var(--mk-hover-overlay))}.mk-org-chart__node--selected:not(.mk-org-chart__node--custom),:host(.mk-org-chart--selectable) .mk-org-chart__node--selected:not(.mk-org-chart__node--custom):hover{border-color:var(--mk-primary);background-color:var(--mk-primary-subtle);box-shadow:0 0 0 1px var(--mk-primary)}.mk-org-chart__item:focus-visible>.mk-org-chart__node{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset);border-radius:var(--mk-radius-md)}.mk-org-chart__avatar{flex:none}.mk-org-chart__text{display:flex;flex-direction:column;min-width:0;line-height:var(--mk-line-height-snug)}.mk-org-chart__label{font-size:var(--mk-font-size-sm);font-weight:var(--mk-font-weight-semibold);color:var(--mk-text);overflow-wrap:anywhere}.mk-org-chart__title{font-size:var(--mk-font-size-xs);color:var(--mk-text-muted);overflow-wrap:anywhere}.mk-org-chart__node--selected .mk-org-chart__label{color:var(--mk-primary-subtle-text)}.mk-org-chart__toggle{position:absolute;z-index:2;display:grid;place-items:center;width:1.25rem;height:1.25rem;padding:0;margin:0;border:var(--mk-border-width) solid var(--mk-border-strong);border-radius:var(--mk-radius-circle);background:var(--mk-surface);color:var(--mk-text-muted);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),color var(--mk-duration-fast) var(--mk-ease-standard)}@media(pointer:coarse){.mk-org-chart__toggle:after{content:\"\";position:absolute;inset:min(0px,(100% - 24px) / 2)}}.mk-org-chart__toggle:hover{background:var(--mk-surface-2);color:var(--mk-text)}.mk-org-chart__toggle:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}:host(.mk-org-chart--top) .mk-org-chart__toggle{bottom:0;left:50%;transform:translate(-50%,50%)}:host(.mk-org-chart--left) .mk-org-chart__toggle{top:50%;inset-inline-end:0;transform:translateY(-50%);margin-inline-end:-.625rem}.mk-org-chart__caret{width:.35rem;height:.35rem;border-inline-end:2px solid currentColor;border-block-end:2px solid currentColor;transition:transform var(--mk-duration-fast) var(--mk-ease-standard)}:host(.mk-org-chart--top) .mk-org-chart__caret{transform:translateY(-1px) rotate(45deg)}:host(.mk-org-chart--top) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translateY(1px) rotate(-135deg)}:host(.mk-org-chart--left) .mk-org-chart__caret{transform:translate(-1px) rotate(-45deg)}:host(.mk-org-chart--left) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translate(1px) rotate(135deg)}:host(.mk-org-chart--left:dir(rtl)) .mk-org-chart__caret{transform:translate(1px) rotate(135deg)}:host(.mk-org-chart--left:dir(rtl)) .mk-org-chart__item--expanded>.mk-org-chart__node>.mk-org-chart__toggle .mk-org-chart__caret{transform:translate(-1px) rotate(-45deg)}@media(prefers-reduced-motion:reduce){.mk-org-chart__node,.mk-org-chart__toggle,.mk-org-chart__caret{transition:none}}@media print{.mk-org-chart__scroller{overflow:visible}.mk-org-chart__canvas{display:block;zoom:1!important}.mk-org-chart__node{box-shadow:none;break-inside:avoid}.mk-org-chart__toggle{display:none}}\n"] }]
1097
+ }], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeToggle: [{ type: i0.Output, args: ["nodeToggle"] }], nodeDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => MkOrgChartNodeDef), { isSignal: true }] }] } });
1098
+ function walk(list, fn) {
1099
+ for (const node of list) {
1100
+ fn(node);
1101
+ if (node.children?.length)
1102
+ walk(node.children, fn);
1103
+ }
1104
+ }
1105
+ function collectIds(list) {
1106
+ const ids = new Set();
1107
+ walk(list, (n) => ids.add(n.id));
1108
+ return ids;
1109
+ }
1110
+
683
1111
  /**
684
1112
  * Stat card — a compact KPI tile for dashboards. Shows a label, a primary
685
1113
  * value and an optional trend delta. The trend is conveyed by an arrow glyph
@@ -3490,6 +3918,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
3490
3918
  class MkInlineEdit {
3491
3919
  injector = inject(Injector);
3492
3920
  field = inject(MkFieldContext, { optional: true });
3921
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
3922
+ fieldTouched = mkInjectFieldTouched();
3493
3923
  i18n = inject(MK_I18N);
3494
3924
  displayRef = viewChild('display', /* @ts-ignore */
3495
3925
  ...(ngDevMode ? [{ debugName: "displayRef" }] : /* istanbul ignore next */ []));
@@ -3532,7 +3962,7 @@ class MkInlineEdit {
3532
3962
  ...(ngDevMode ? [{ debugName: "effectiveSize" }] : /* istanbul ignore next */ []));
3533
3963
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
3534
3964
  ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
3535
- isInvalid = computed(() => this.invalid() || (this.field?.hasError() ?? false), /* @ts-ignore */
3965
+ isInvalid = computed(() => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false), /* @ts-ignore */
3536
3966
  ...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
3537
3967
  labelledBy = computed(() => this.field?.labelId ?? null, /* @ts-ignore */
3538
3968
  ...(ngDevMode ? [{ debugName: "labelledBy" }] : /* istanbul ignore next */ []));
@@ -4344,11 +4774,11 @@ class MkCarousel {
4344
4774
  this.io = undefined;
4345
4775
  }
4346
4776
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkCarousel, deps: [], target: i0.ɵɵFactoryTarget.Component });
4347
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MkCarousel, isStandalone: true, selector: "mk-carousel", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, showDots: { classPropertyName: "showDots", publicName: "showDots", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, userPaused: { classPropertyName: "userPaused", publicName: "userPaused", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange", userPaused: "userPausedChange" }, host: { classAttribute: "mk-carousel" }, queries: [{ propertyName: "slides", predicate: MkCarouselSlide, isSignal: true }], ngImport: i0, template: "<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '\u25B6' : '\u23F8' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">\u2039</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">\u203A</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font-family:var(--mk-font-sans)}.mk-carousel__viewport{position:relative;overflow:hidden;border-radius:var(--mk-radius-md);touch-action:pan-y}.mk-carousel__viewport:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__track{display:flex;transition:transform var(--mk-duration-normal, .24s) var(--mk-ease-standard)}.mk-carousel__track--dragging{transition:none}.mk-carousel__slide{flex:0 0 100%;min-width:0}.mk-carousel__playpause{position:absolute;top:var(--mk-space-2);inset-inline-start:var(--mk-space-2);z-index:1;display:grid;place-items:center;width:2rem;height:2rem;padding:0;font-size:var(--mk-font-size-sm);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__playpause:hover{background-color:var(--mk-surface-2)}.mk-carousel__playpause:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow{position:absolute;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__arrow:hover{background-color:var(--mk-surface-2)}.mk-carousel__arrow:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow--prev{inset-inline-start:var(--mk-space-2)}.mk-carousel__arrow--next{inset-inline-end:var(--mk-space-2)}.mk-carousel__arrow:dir(rtl) span{display:inline-block;transform:scaleX(-1)}.mk-carousel__dots{display:flex;justify-content:center;gap:var(--mk-space-2);margin-top:var(--mk-space-2)}.mk-carousel__dot{width:.5rem;height:.5rem;padding:0;background-color:var(--mk-border-strong);border:none;border-radius:var(--mk-radius-circle);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),transform var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__dot:hover{background-color:var(--mk-text-muted)}.mk-carousel__dot:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__dot--active{background-color:var(--mk-primary);transform:scale(1.25)}@media(prefers-reduced-motion:reduce){.mk-carousel__track,.mk-carousel__arrow,.mk-carousel__dot{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4777
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: MkCarousel, isStandalone: true, selector: "mk-carousel", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, showDots: { classPropertyName: "showDots", publicName: "showDots", isSignal: true, isRequired: false, transformFunction: null }, showArrows: { classPropertyName: "showArrows", publicName: "showArrows", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, userPaused: { classPropertyName: "userPaused", publicName: "userPaused", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange", userPaused: "userPausedChange" }, host: { classAttribute: "mk-carousel" }, queries: [{ propertyName: "slides", predicate: MkCarouselSlide, isSignal: true }], ngImport: i0, template: "<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '\u25B6' : '\u23F8' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">\u2039</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">\u203A</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font-family:var(--mk-font-sans)}.mk-carousel__viewport{position:relative;overflow:hidden;border-radius:var(--mk-radius-md);touch-action:pan-y}.mk-carousel__viewport:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__track{display:flex;transition:transform var(--mk-duration-normal, .24s) var(--mk-ease-standard)}.mk-carousel__track--dragging{transition:none}:host ::ng-deep .mk-carousel__slide{flex:0 0 100%;min-width:0;box-sizing:border-box}.mk-carousel__playpause{position:absolute;top:var(--mk-space-2);inset-inline-start:var(--mk-space-2);z-index:1;display:grid;place-items:center;width:2rem;height:2rem;padding:0;font-size:var(--mk-font-size-sm);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__playpause:hover{background-color:var(--mk-surface-2)}.mk-carousel__playpause:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow{position:absolute;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__arrow:hover{background-color:var(--mk-surface-2)}.mk-carousel__arrow:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow--prev{inset-inline-start:var(--mk-space-2)}.mk-carousel__arrow--next{inset-inline-end:var(--mk-space-2)}.mk-carousel__arrow:dir(rtl) span{display:inline-block;transform:scaleX(-1)}.mk-carousel__dots{display:flex;justify-content:center;gap:var(--mk-space-2);margin-top:var(--mk-space-2)}.mk-carousel__dot{width:.5rem;height:.5rem;padding:0;background-color:var(--mk-border-strong);border:none;border-radius:var(--mk-radius-circle);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),transform var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__dot:hover{background-color:var(--mk-text-muted)}.mk-carousel__dot:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__dot--active{background-color:var(--mk-primary);transform:scale(1.25)}@media(prefers-reduced-motion:reduce){.mk-carousel__track,.mk-carousel__arrow,.mk-carousel__dot{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4348
4778
  }
4349
4779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: MkCarousel, decorators: [{
4350
4780
  type: Component,
4351
- args: [{ selector: 'mk-carousel', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'mk-carousel' }, template: "<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '\u25B6' : '\u23F8' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">\u2039</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">\u203A</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font-family:var(--mk-font-sans)}.mk-carousel__viewport{position:relative;overflow:hidden;border-radius:var(--mk-radius-md);touch-action:pan-y}.mk-carousel__viewport:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__track{display:flex;transition:transform var(--mk-duration-normal, .24s) var(--mk-ease-standard)}.mk-carousel__track--dragging{transition:none}.mk-carousel__slide{flex:0 0 100%;min-width:0}.mk-carousel__playpause{position:absolute;top:var(--mk-space-2);inset-inline-start:var(--mk-space-2);z-index:1;display:grid;place-items:center;width:2rem;height:2rem;padding:0;font-size:var(--mk-font-size-sm);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__playpause:hover{background-color:var(--mk-surface-2)}.mk-carousel__playpause:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow{position:absolute;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__arrow:hover{background-color:var(--mk-surface-2)}.mk-carousel__arrow:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow--prev{inset-inline-start:var(--mk-space-2)}.mk-carousel__arrow--next{inset-inline-end:var(--mk-space-2)}.mk-carousel__arrow:dir(rtl) span{display:inline-block;transform:scaleX(-1)}.mk-carousel__dots{display:flex;justify-content:center;gap:var(--mk-space-2);margin-top:var(--mk-space-2)}.mk-carousel__dot{width:.5rem;height:.5rem;padding:0;background-color:var(--mk-border-strong);border:none;border-radius:var(--mk-radius-circle);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),transform var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__dot:hover{background-color:var(--mk-text-muted)}.mk-carousel__dot:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__dot--active{background-color:var(--mk-primary);transform:scale(1.25)}@media(prefers-reduced-motion:reduce){.mk-carousel__track,.mk-carousel__arrow,.mk-carousel__dot{transition:none}}\n"] }]
4781
+ args: [{ selector: 'mk-carousel', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'mk-carousel' }, template: "<div\n class=\"mk-carousel__viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n [attr.aria-label]=\"ariaLabel()\"\n tabindex=\"0\"\n (keydown)=\"onKeydown($event)\"\n (mouseenter)=\"pause()\"\n (mouseleave)=\"resume()\"\n (focusin)=\"pause()\"\n (focusout)=\"resume()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n>\n @if (autoplay()) {\n <button\n type=\"button\"\n class=\"mk-carousel__playpause\"\n [attr.aria-label]=\"userPaused() ? i18n.playSlideshow : i18n.pauseSlideshow\"\n [attr.aria-pressed]=\"userPaused()\"\n (click)=\"toggleUserPause()\"\n >\n <span aria-hidden=\"true\">{{ userPaused() ? '\u25B6' : '\u23F8' }}</span>\n </button>\n }\n <div\n class=\"mk-carousel__track\"\n [class.mk-carousel__track--dragging]=\"dragging()\"\n [style.transform]=\"trackTransform()\"\n >\n <ng-content />\n </div>\n\n @if (showArrows() && count() > 1) {\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--prev\"\n [attr.aria-label]=\"i18n.previousSlide\"\n (click)=\"prev()\"\n >\n <span aria-hidden=\"true\">\u2039</span>\n </button>\n <button\n type=\"button\"\n class=\"mk-carousel__arrow mk-carousel__arrow--next\"\n [attr.aria-label]=\"i18n.nextSlide\"\n (click)=\"next()\"\n >\n <span aria-hidden=\"true\">\u203A</span>\n </button>\n }\n</div>\n\n@if (showDots() && count() > 1) {\n <div class=\"mk-carousel__dots\">\n @for (dot of dots(); track dot) {\n <button\n type=\"button\"\n class=\"mk-carousel__dot\"\n [class.mk-carousel__dot--active]=\"dot === index()\"\n [attr.aria-current]=\"dot === index() || null\"\n [attr.aria-label]=\"i18n.goToSlide(dot + 1)\"\n (click)=\"goTo(dot)\"\n ></button>\n }\n </div>\n}\n\n<div class=\"mk-visually-hidden\" [attr.aria-live]=\"liveMode()\">{{ liveText() }}</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font-family:var(--mk-font-sans)}.mk-carousel__viewport{position:relative;overflow:hidden;border-radius:var(--mk-radius-md);touch-action:pan-y}.mk-carousel__viewport:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__track{display:flex;transition:transform var(--mk-duration-normal, .24s) var(--mk-ease-standard)}.mk-carousel__track--dragging{transition:none}:host ::ng-deep .mk-carousel__slide{flex:0 0 100%;min-width:0;box-sizing:border-box}.mk-carousel__playpause{position:absolute;top:var(--mk-space-2);inset-inline-start:var(--mk-space-2);z-index:1;display:grid;place-items:center;width:2rem;height:2rem;padding:0;font-size:var(--mk-font-size-sm);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__playpause:hover{background-color:var(--mk-surface-2)}.mk-carousel__playpause:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow{position:absolute;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:2rem;height:2rem;font-size:var(--mk-font-size-lg);line-height:1;color:var(--mk-text);background-color:var(--mk-surface);border:var(--mk-border-width) solid var(--mk-border);border-radius:var(--mk-radius-circle);box-shadow:var(--mk-shadow-sm);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__arrow:hover{background-color:var(--mk-surface-2)}.mk-carousel__arrow:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__arrow--prev{inset-inline-start:var(--mk-space-2)}.mk-carousel__arrow--next{inset-inline-end:var(--mk-space-2)}.mk-carousel__arrow:dir(rtl) span{display:inline-block;transform:scaleX(-1)}.mk-carousel__dots{display:flex;justify-content:center;gap:var(--mk-space-2);margin-top:var(--mk-space-2)}.mk-carousel__dot{width:.5rem;height:.5rem;padding:0;background-color:var(--mk-border-strong);border:none;border-radius:var(--mk-radius-circle);cursor:pointer;transition:background-color var(--mk-duration-fast) var(--mk-ease-standard),transform var(--mk-duration-fast) var(--mk-ease-standard)}.mk-carousel__dot:hover{background-color:var(--mk-text-muted)}.mk-carousel__dot:focus-visible{outline:var(--mk-focus-ring-width) solid var(--mk-focus-ring);outline-offset:var(--mk-focus-ring-offset)}.mk-carousel__dot--active{background-color:var(--mk-primary);transform:scale(1.25)}@media(prefers-reduced-motion:reduce){.mk-carousel__track,.mk-carousel__arrow,.mk-carousel__dot{transition:none}}\n"] }]
4352
4782
  }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MkCarouselSlide), { isSignal: true }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }, { type: i0.Output, args: ["indexChange"] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], showDots: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDots", required: false }] }], showArrows: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrows", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], userPaused: [{ type: i0.Input, args: [{ isSignal: true, alias: "userPaused", required: false }] }, { type: i0.Output, args: ["userPausedChange"] }] } });
4353
4783
 
4354
4784
  /**
@@ -6492,5 +6922,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
6492
6922
  * Generated bundle index. Do not edit.
6493
6923
  */
6494
6924
 
6495
- export { MK_CHART_PALETTE_SIZE, MK_HEATMAP_MIN_CONTRAST, MkAvatar, MkAvatarGroup, MkBadge, MkBadgeOverlay, MkBarChart, MkCalendarHeatmap, MkCard, MkCardFooter, MkCardHeader, MkCardTitle, MkCarousel, MkCarouselSlide, MkCode, MkCountdown, MkDescItem, MkDescriptionList, MkDiff, MkDivider, MkDonutChart, MkEmptyState, MkFunnelChart, MkGauge, MkHeatmap, MkInlineEdit, MkJsonViewer, MkKanban, MkLineChart, MkList, MkListItem, MkLogViewer, MkMarkdown, MkProfileActions, MkProfileCard, MkProfileMeta, MkProgressBar, MkProgressRing, MkQrCode, MkRadarChart, MkScatterChart, MkSkeleton, MkSkeletonPreset, MkSparkline, MkSpinner, MkStatCard, MkTag, MkTimeline, MkTimelineItem, MkTreemap, MkVirtualScroll, mkArcPath, mkAreaPath, mkBuildJsonTree, mkChartColor, mkComputeDiff, mkContrastRatio, mkDiffStats, mkEncodeQr, mkFormatCompact, mkHeatmapCellColors, mkLinePath, mkLinearScale, mkMixRgb, mkNiceTicks, mkParseAnsi, mkParseMarkdown, mkParseRgb, mkRelativeLuminance, mkRenderMarkdown, mkSplitDuration, mkSquarify, mkStripAnsi };
6925
+ export { MK_CHART_PALETTE_SIZE, MK_HEATMAP_MIN_CONTRAST, MkAvatar, MkAvatarGroup, MkBadge, MkBadgeOverlay, MkBarChart, MkCalendarHeatmap, MkCard, MkCardFooter, MkCardHeader, MkCardTitle, MkCarousel, MkCarouselSlide, MkCode, MkCountdown, MkDescItem, MkDescriptionList, MkDiff, MkDivider, MkDonutChart, MkEmptyState, MkFunnelChart, MkGauge, MkHeatmap, MkInlineEdit, MkJsonViewer, MkKanban, MkLineChart, MkList, MkListItem, MkLogViewer, MkMarkdown, MkOrgChart, MkOrgChartNodeDef, MkProfileActions, MkProfileCard, MkProfileMeta, MkProgressBar, MkProgressRing, MkQrCode, MkRadarChart, MkScatterChart, MkSkeleton, MkSkeletonPreset, MkSparkline, MkSpinner, MkStatCard, MkTag, MkTimeline, MkTimelineItem, MkTreemap, MkVirtualScroll, mkArcPath, mkAreaPath, mkBuildJsonTree, mkChartColor, mkComputeDiff, mkContrastRatio, mkDiffStats, mkEncodeQr, mkFormatCompact, mkHeatmapCellColors, mkLinePath, mkLinearScale, mkMixRgb, mkNiceTicks, mkOrgChartFromFlat, mkParseAnsi, mkParseMarkdown, mkParseRgb, mkRelativeLuminance, mkRenderMarkdown, mkSplitDuration, mkSquarify, mkStripAnsi };
6496
6926
  //# sourceMappingURL=mk-kit-ui-data.mjs.map