@konce-pt/angular 0.7.9 → 0.7.10

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.
@@ -1351,7 +1351,7 @@ function KptSplitButton_ng_template_6_Template(rf, ctx) { if (rf & 1) {
1351
1351
  * Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
1352
1352
  *
1353
1353
  * @example
1354
- * <kpt-split-button [items]="items" (primaryClick)="save()" (select)="onItem($event)">Zapisz</kpt-split-button>
1354
+ * <kpt-split-button [items]="items" (primaryClick)="save()" (selected)="onItem($event)">Zapisz</kpt-split-button>
1355
1355
  */
1356
1356
  class KptSplitButton {
1357
1357
  constructor() {
@@ -1361,7 +1361,7 @@ class KptSplitButton {
1361
1361
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
1362
1362
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1363
1363
  this.primaryClick = output();
1364
- this.select = output();
1364
+ this.selected = output();
1365
1365
  this.i18n = inject(KptI18n);
1366
1366
  this.open = signal(false, /* @ts-ignore */
1367
1367
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
@@ -1373,11 +1373,11 @@ class KptSplitButton {
1373
1373
  pick(item) {
1374
1374
  if (item.disabled)
1375
1375
  return;
1376
- this.select.emit(item);
1376
+ this.selected.emit(item);
1377
1377
  this.open.set(false);
1378
1378
  }
1379
1379
  static { this.ɵfac = function KptSplitButton_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptSplitButton)(); }; }
1380
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptSplitButton, selectors: [["kpt-split-button"]], hostAttrs: [1, "kpt-split-button-host"], inputs: { variant: [1, "variant"], items: [1, "items"], disabled: [1, "disabled"] }, outputs: { primaryClick: "primaryClick", select: "select" }, ngContentSelectors: _c0$z, decls: 7, vars: 8, consts: [["origin", "cdkOverlayOrigin"], [1, "kpt-split-button"], ["type", "button", 1, "kpt-split-button__main", 3, "click", "disabled"], ["type", "button", "cdkOverlayOrigin", "", 1, "kpt-split-button__toggle", 3, "click", "disabled"], ["name", "chevron-down"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-split-button__panel"], ["role", "separator", 1, "kpt-split-button__separator"], ["role", "presentation", 1, "kpt-split-button__header"], ["type", "button", 1, "kpt-split-button__item", 3, "kpt-split-button__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-split-button__text"], [1, "kpt-split-button__label"], [1, "kpt-split-button__description"], ["type", "button", 1, "kpt-split-button__item", 3, "click", "disabled"], [1, "kpt-split-button__badge", 3, "value", "variant"]], template: function KptSplitButton_Template(rf, ctx) { if (rf & 1) {
1380
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptSplitButton, selectors: [["kpt-split-button"]], hostAttrs: [1, "kpt-split-button-host"], inputs: { variant: [1, "variant"], items: [1, "items"], disabled: [1, "disabled"] }, outputs: { primaryClick: "primaryClick", selected: "selected" }, ngContentSelectors: _c0$z, decls: 7, vars: 8, consts: [["origin", "cdkOverlayOrigin"], [1, "kpt-split-button"], ["type", "button", 1, "kpt-split-button__main", 3, "click", "disabled"], ["type", "button", "cdkOverlayOrigin", "", 1, "kpt-split-button__toggle", 3, "click", "disabled"], ["name", "chevron-down"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-split-button__panel"], ["role", "separator", 1, "kpt-split-button__separator"], ["role", "presentation", 1, "kpt-split-button__header"], ["type", "button", 1, "kpt-split-button__item", 3, "kpt-split-button__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-split-button__text"], [1, "kpt-split-button__label"], [1, "kpt-split-button__description"], ["type", "button", 1, "kpt-split-button__item", 3, "click", "disabled"], [1, "kpt-split-button__badge", 3, "value", "variant"]], template: function KptSplitButton_Template(rf, ctx) { if (rf & 1) {
1381
1381
  i0.ɵɵprojectionDef();
1382
1382
  i0.ɵɵelementStart(0, "div", 1)(1, "button", 2);
1383
1383
  i0.ɵɵlistener("click", function KptSplitButton_Template_button_click_1_listener() { return ctx.primaryClick.emit(); });
@@ -1479,7 +1479,7 @@ class KptSplitButton {
1479
1479
  </div>
1480
1480
  </ng-template>
1481
1481
  `, host: { class: 'kpt-split-button-host' }, styles: ["@charset \"UTF-8\";@layer kpt.components{.kpt-split-button-host{display:inline-flex}.kpt-split-button{--_bg: var(--kpt-color-primary);--_fg: var(--kpt-color-on-primary);--_bg-hover: var(--kpt-color-primary-hover);display:inline-flex;border-radius:var(--kpt-button-radius, .5rem);overflow:hidden}.kpt-split-button[data-variant=tonal]{--_bg: var(--kpt-color-muted);--_fg: var(--kpt-color-on-muted);--_bg-hover: var(--kpt-color-muted-hover)}.kpt-split-button__main,.kpt-split-button__toggle{border:0;background:var(--_bg);color:var(--_fg);cursor:pointer;font:inherit;font-size:var(--kpt-font-size-sm, .875rem);font-weight:var(--kpt-font-weight-medium, 500);height:2.5rem;position:relative;isolation:isolate}.kpt-split-button__main:after,.kpt-split-button__toggle:after{content:\"\";position:absolute;inset:0;z-index:-1;background-color:var(--_bg-hover);opacity:0;pointer-events:none;transition:opacity var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard)}.kpt-split-button__main:hover:not(:disabled):after,.kpt-split-button__toggle:hover:not(:disabled):after{opacity:1}.kpt-split-button__main:disabled,.kpt-split-button__toggle:disabled{opacity:.5;cursor:not-allowed}@media(prefers-reduced-motion:reduce){.kpt-split-button__main:after,.kpt-split-button__toggle:after{transition:none}}.kpt-split-button__main{padding-inline:var(--kpt-space-4, 1rem)}.kpt-split-button__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;border-inline-start:1px solid color-mix(in oklch,var(--_fg) 25%,transparent)}.kpt-split-button__panel{min-width:11rem;padding:.25rem;background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem);box-shadow:var(--kpt-elevation-3)}.kpt-split-button__item{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);width:100%;padding:.5rem .6rem;border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font:inherit;font-size:var(--kpt-font-size-sm, .875rem);text-align:start;cursor:pointer}.kpt-split-button__item:hover:not(:disabled){background:var(--kpt-color-surface-variant)}.kpt-split-button__item:disabled{opacity:.45;cursor:not-allowed}.kpt-split-button__item--danger{color:var(--kpt-color-danger)}.kpt-split-button__item kpt-icon{color:var(--kpt-color-on-surface-muted)}.kpt-split-button__header{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);padding:.5rem .6rem;font-size:var(--kpt-font-size-sm, .875rem);cursor:default}.kpt-split-button__header .kpt-split-button__label{font-weight:var(--kpt-font-weight-semibold, 600)}.kpt-split-button__header kpt-icon{color:var(--kpt-color-on-surface-muted)}.kpt-split-button__text{display:flex;flex-direction:column;min-width:0}.kpt-split-button__label,.kpt-split-button__description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kpt-split-button__description{color:var(--kpt-color-on-surface-muted);font-size:var(--kpt-font-size-xs, .75rem)}.kpt-split-button__badge{margin-inline-start:auto}.kpt-split-button__separator{height:1px;margin:.25rem 0;background:var(--kpt-color-border)}}\n"] }]
1482
- }], null, { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], primaryClick: [{ type: i0.Output, args: ["primaryClick"] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
1482
+ }], null, { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], primaryClick: [{ type: i0.Output, args: ["primaryClick"] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
1483
1483
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptSplitButton, { className: "KptSplitButton", filePath: "lib/split-button/split-button.component.ts", lineNumber: 101 }); })();
1484
1484
 
1485
1485
  // Do not edit directly — generated by scripts/gen-tokens.mjs
@@ -2795,6 +2795,11 @@ function KptClock_Conditional_14_Template(rf, ctx) { if (rf & 1) {
2795
2795
  const R_OUTER = 40;
2796
2796
  const R_INNER = 26;
2797
2797
  const pad$2 = (n) => String(n).padStart(2, '0');
2798
+ /** Pozycja znacznika (% tarczy) na pierścieniu o promieniu `radius`: 12 na górze, zegarowo. */
2799
+ function markPos(index, radius) {
2800
+ const theta = (index / 12) * 2 * Math.PI;
2801
+ return { x: 50 + radius * Math.sin(theta), y: 50 - radius * Math.cos(theta) };
2802
+ }
2798
2803
  /**
2799
2804
  * Tarcza zegara (wybór godziny) — dwa etapy: godziny → minuty, klik lub przeciąganie.
2800
2805
  * Format 12/24h (`hourFormat`); w 24h dodatkowy wewnętrzny pierścień 13–00, w 12h AM/PM.
@@ -2826,66 +2831,14 @@ class KptClock {
2826
2831
  ...(ngDevMode ? [{ debugName: "hourLabel" }] : /* istanbul ignore next */ []));
2827
2832
  this.minuteLabel = computed(() => pad$2(this.minute()), /* @ts-ignore */
2828
2833
  ...(ngDevMode ? [{ debugName: "minuteLabel" }] : /* istanbul ignore next */ []));
2829
- this.hourMarks = computed(() => {
2830
- const marks = [];
2831
- if (this.hourFormat() === 12) {
2832
- const ap = this.ampm();
2833
- const curH12 = this.hour12();
2834
- for (let i = 0; i < 12; i++) {
2835
- const theta = (i / 12) * 2 * Math.PI;
2836
- const h12 = i === 0 ? 12 : i;
2837
- marks.push({
2838
- label: String(h12),
2839
- hour24: this.from12h(h12, ap),
2840
- x: 50 + R_OUTER * Math.sin(theta),
2841
- y: 50 - R_OUTER * Math.cos(theta),
2842
- inner: false,
2843
- selected: curH12 === h12,
2844
- });
2845
- }
2846
- return marks;
2847
- }
2848
- const cur = this.hour();
2849
- for (let i = 0; i < 12; i++) {
2850
- const theta = (i / 12) * 2 * Math.PI;
2851
- const hour24 = i === 0 ? 12 : i;
2852
- marks.push({
2853
- label: i === 0 ? '12' : String(i),
2854
- hour24,
2855
- x: 50 + R_OUTER * Math.sin(theta),
2856
- y: 50 - R_OUTER * Math.cos(theta),
2857
- inner: false,
2858
- selected: cur === hour24,
2859
- });
2860
- }
2861
- for (let i = 0; i < 12; i++) {
2862
- const theta = (i / 12) * 2 * Math.PI;
2863
- const hour24 = i === 0 ? 0 : i + 12;
2864
- marks.push({
2865
- label: i === 0 ? '00' : String(i + 12),
2866
- hour24,
2867
- x: 50 + R_INNER * Math.sin(theta),
2868
- y: 50 - R_INNER * Math.cos(theta),
2869
- inner: true,
2870
- selected: cur === hour24,
2871
- });
2872
- }
2873
- return marks;
2874
- }, /* @ts-ignore */
2834
+ /** W 12h jeden pierścień; w 24h zewnętrzny (12, 1–11) i wewnętrzny (00, 13–23). */
2835
+ this.hourMarks = computed(() => this.hourFormat() === 12 ? this.marks12h() : [...this.marks24hOuter(), ...this.marks24hInner()], /* @ts-ignore */
2875
2836
  ...(ngDevMode ? [{ debugName: "hourMarks" }] : /* istanbul ignore next */ []));
2876
2837
  this.minuteMarks = computed(() => {
2877
2838
  const cur = this.minute();
2878
2839
  return Array.from({ length: 12 }, (_, i) => {
2879
2840
  const val = i * 5;
2880
- const theta = (i / 12) * 2 * Math.PI;
2881
- return {
2882
- label: pad$2(val),
2883
- hour24: val,
2884
- x: 50 + R_OUTER * Math.sin(theta),
2885
- y: 50 - R_OUTER * Math.cos(theta),
2886
- inner: false,
2887
- selected: cur === val,
2888
- };
2841
+ return { label: pad$2(val), hour24: val, ...markPos(i, R_OUTER), inner: false, selected: cur === val };
2889
2842
  });
2890
2843
  }, /* @ts-ignore */
2891
2844
  ...(ngDevMode ? [{ debugName: "minuteMarks" }] : /* istanbul ignore next */ []));
@@ -2911,6 +2864,31 @@ class KptClock {
2911
2864
  const base = h12 % 12; // 12 → 0
2912
2865
  return ap === 'PM' ? base + 12 : base;
2913
2866
  }
2867
+ marks12h() {
2868
+ const ap = this.ampm();
2869
+ const cur = this.hour();
2870
+ return Array.from({ length: 12 }, (_, i) => {
2871
+ const h12 = i === 0 ? 12 : i;
2872
+ // Wartość docelowa bierze bieżące AM/PM — tarcza pokazuje tylko jedną połowę doby.
2873
+ const hour24 = this.from12h(h12, ap);
2874
+ return { label: String(h12), hour24, ...markPos(i, R_OUTER), inner: false, selected: cur === hour24 };
2875
+ });
2876
+ }
2877
+ marks24hOuter() {
2878
+ const cur = this.hour();
2879
+ return Array.from({ length: 12 }, (_, i) => {
2880
+ const hour24 = i === 0 ? 12 : i;
2881
+ return { label: String(hour24), hour24, ...markPos(i, R_OUTER), inner: false, selected: cur === hour24 };
2882
+ });
2883
+ }
2884
+ marks24hInner() {
2885
+ const cur = this.hour();
2886
+ return Array.from({ length: 12 }, (_, i) => {
2887
+ const hour24 = i === 0 ? 0 : i + 12;
2888
+ // `pad` daje '00' dla północy; 13–23 są już dwucyfrowe.
2889
+ return { label: pad$2(hour24), hour24, ...markPos(i, R_INNER), inner: true, selected: cur === hour24 };
2890
+ });
2891
+ }
2914
2892
  setPhase(phase) {
2915
2893
  this.clockPhase.set(phase);
2916
2894
  }
@@ -2939,24 +2917,32 @@ class KptClock {
2939
2917
  if (deg < 0)
2940
2918
  deg += 360;
2941
2919
  if (this.clockPhase() === 'hours') {
2942
- const idx = Math.round(deg / 30) % 12;
2943
- if (this.hourFormat() === 12) {
2944
- const h12 = idx === 0 ? 12 : idx;
2945
- this.hour.set(this.from12h(h12, this.ampm()));
2946
- }
2947
- else {
2948
- const radius = Math.hypot(dx, dy) / (rect.width / 2);
2949
- const inner = radius < (R_OUTER + R_INNER) / 2 / 50;
2950
- this.hour.set(inner ? (idx === 0 ? 0 : idx + 12) : idx === 0 ? 12 : idx);
2951
- }
2920
+ this.setHourFromAngle(deg, Math.hypot(dx, dy) / (rect.width / 2));
2952
2921
  }
2953
2922
  else {
2954
- const step = Math.max(1, this.minuteStep());
2955
- const raw = Math.round(deg / 6) % 60;
2956
- this.minute.set((Math.round(raw / step) * step) % 60);
2923
+ this.setMinuteFromAngle(deg);
2957
2924
  }
2958
2925
  this.emit();
2959
2926
  }
2927
+ /** Godzina z kąta; w 24h o pierścieniu (a więc o 12–23 vs 0–11) decyduje promień kliknięcia. */
2928
+ setHourFromAngle(deg, radius) {
2929
+ const idx = Math.round(deg / 30) % 12;
2930
+ if (this.hourFormat() === 12) {
2931
+ this.hour.set(this.from12h(idx === 0 ? 12 : idx, this.ampm()));
2932
+ return;
2933
+ }
2934
+ const inner = radius < (R_OUTER + R_INNER) / 2 / 50;
2935
+ if (inner)
2936
+ this.hour.set(idx === 0 ? 0 : idx + 12);
2937
+ else
2938
+ this.hour.set(idx === 0 ? 12 : idx);
2939
+ }
2940
+ /** Minuta z kąta, dociągnięta do `minuteStep`. */
2941
+ setMinuteFromAngle(deg) {
2942
+ const step = Math.max(1, this.minuteStep());
2943
+ const raw = Math.round(deg / 6) % 60;
2944
+ this.minute.set((Math.round(raw / step) * step) % 60);
2945
+ }
2960
2946
  onDialUp() {
2961
2947
  if (this.clockPhase() === 'hours')
2962
2948
  this.clockPhase.set('minutes');
@@ -3056,7 +3042,7 @@ class KptClock {
3056
3042
  </div>
3057
3043
  `, host: { class: 'kpt-clock-host' }, styles: ["@layer kpt.components{.kpt-clock-host{display:block}.kpt-clock__time{display:flex;align-items:center;justify-content:center;gap:var(--kpt-space-1, .25rem);margin-bottom:var(--kpt-space-3, .75rem);font-variant-numeric:tabular-nums}.kpt-clock__seg{border:0;background:none;padding:.1rem .4rem;border-radius:var(--kpt-radius-sm, .25rem);font-size:var(--kpt-font-size-2xl, 1.5rem);font-weight:var(--kpt-font-weight-semibold, 600);color:var(--kpt-color-on-surface-muted);cursor:pointer}.kpt-clock__seg.is-active{color:var(--kpt-color-primary);background:var(--kpt-color-muted)}.kpt-clock__colon{font-size:var(--kpt-font-size-2xl, 1.5rem);font-weight:var(--kpt-font-weight-semibold, 600);color:var(--kpt-color-on-surface-muted)}.kpt-clock__ampm{display:flex;flex-direction:column;gap:2px;margin-inline-start:var(--kpt-space-2, .5rem)}.kpt-clock__ampm button{border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);background:none;padding:.1rem .4rem;border-radius:var(--kpt-radius-sm, .25rem);font-size:var(--kpt-font-size-xs, .75rem);font-weight:var(--kpt-font-weight-semibold, 600);color:var(--kpt-color-on-surface-muted);cursor:pointer}.kpt-clock__ampm button.is-active{background:var(--kpt-color-primary);border-color:var(--kpt-color-primary);color:var(--kpt-color-on-primary)}.kpt-clock__face{position:relative;width:13rem;max-width:100%;aspect-ratio:1;margin:0 auto;border-radius:50%;background:var(--kpt-color-surface-variant);touch-action:none;-webkit-user-select:none;user-select:none}.kpt-clock__center{position:absolute;left:50%;top:50%;width:8px;height:8px;transform:translate(-50%,-50%);border-radius:50%;background:var(--kpt-color-primary);z-index:2}.kpt-clock__hand{position:absolute;left:50%;bottom:50%;width:2px;height:40%;margin-left:-1px;transform-origin:bottom center;background:var(--kpt-color-primary);z-index:1}.kpt-clock__hand--inner{height:26%}.kpt-clock__hand:before{content:\"\";position:absolute;top:-3px;left:50%;width:8px;height:8px;transform:translate(-50%);border-radius:50%;background:var(--kpt-color-primary)}.kpt-clock__num{position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:0;border-radius:50%;background:none;color:var(--kpt-color-on-surface);font:inherit;font-size:var(--kpt-font-size-sm, .875rem);cursor:pointer;z-index:2}.kpt-clock__num:hover{background:var(--kpt-color-muted)}.kpt-clock__num--inner{width:1.6rem;height:1.6rem;font-size:var(--kpt-font-size-xs, .75rem);color:var(--kpt-color-on-surface-muted)}.kpt-clock__num--selected{background:var(--kpt-color-primary)!important;color:var(--kpt-color-on-primary)}}\n"] }]
3058
3044
  }], () => [], { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], hourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourFormat", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }] }); })();
3059
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptClock, { className: "KptClock", filePath: "lib/datepicker/clock.component.ts", lineNumber: 94 }); })();
3045
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptClock, { className: "KptClock", filePath: "lib/datepicker/clock.component.ts", lineNumber: 100 }); })();
3060
3046
 
3061
3047
  const _forTrack0$8 = ($index, $item) => $item.iso;
3062
3048
  const _forTrack1$2 = ($index, $item) => $item.label;
@@ -3536,42 +3522,29 @@ class KptDatepicker {
3536
3522
  return this.formatTime(t?.h ?? 0, t?.m ?? 0);
3537
3523
  }, /* @ts-ignore */
3538
3524
  ...(ngDevMode ? [{ debugName: "timeBarLabel" }] : /* istanbul ignore next */ []));
3525
+ /**
3526
+ * Tekst w triggerze. Każdy tryb ma własny format wartości, więc `display` tylko rozdziela
3527
+ * robotę — formatowanie siedzi w metodach `display*` niżej. Wartość niepasująca do formatu
3528
+ * trybu daje pusty string (trigger nie pokazuje śmieci, np. po ręcznej podmianie modelu).
3529
+ */
3539
3530
  this.display = computed(() => {
3540
3531
  const v = this.value();
3541
3532
  if (!v)
3542
3533
  return '';
3543
3534
  const iso = this.displayFormat() === 'iso';
3544
3535
  switch (this.selectionMode()) {
3545
- case 'monthYear': {
3546
- const m = /^(\d{4})-(\d{2})$/.exec(v);
3547
- return m ? (iso ? v : `${m[2]}.${m[1]}`) : '';
3548
- }
3536
+ case 'monthYear':
3537
+ return this.displayMonthYear(v, iso);
3549
3538
  case 'year':
3550
3539
  return /^\d{4}$/.test(v) ? v : '';
3551
- case 'month': {
3552
- const m = /^(\d{2})$/.exec(v);
3553
- if (!m)
3554
- return '';
3555
- return this.monthDisplay() === 'number' ? m[1] : (this.months()[+m[1] - 1] ?? '');
3556
- }
3557
- case 'time': {
3558
- const t = this.parseTime(v);
3559
- return t ? this.formatTime(t.h, t.m) : '';
3560
- }
3561
- case 'datetime': {
3562
- const dt = this.parseDateTime(v);
3563
- if (!dt)
3564
- return '';
3565
- const datePart = iso ? dt.date : `${dt.date.slice(8, 10)}.${dt.date.slice(5, 7)}.${dt.date.slice(0, 4)}`;
3566
- const sep = iso ? 'T' : ' ';
3567
- return `${datePart}${sep}${this.formatTime(dt.h, dt.m)}`;
3568
- }
3569
- default: {
3570
- const d = this.parseDate(v);
3571
- if (!d)
3572
- return '';
3573
- return iso ? toIso$1(d) : `${pad$1(d.getDate())}.${pad$1(d.getMonth() + 1)}.${d.getFullYear()}`;
3574
- }
3540
+ case 'month':
3541
+ return this.displayMonth(v);
3542
+ case 'time':
3543
+ return this.displayTime(v);
3544
+ case 'datetime':
3545
+ return this.displayDateTime(v, iso);
3546
+ default:
3547
+ return this.displayDate(v, iso);
3575
3548
  }
3576
3549
  }, /* @ts-ignore */
3577
3550
  ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
@@ -3720,6 +3693,36 @@ class KptDatepicker {
3720
3693
  }
3721
3694
  return `${pad$1(h)}:${pad$1(m)}`;
3722
3695
  }
3696
+ displayMonthYear(v, iso) {
3697
+ const m = /^(\d{4})-(\d{2})$/.exec(v);
3698
+ if (!m)
3699
+ return '';
3700
+ return iso ? v : `${m[2]}.${m[1]}`;
3701
+ }
3702
+ displayMonth(v) {
3703
+ const m = /^(\d{2})$/.exec(v);
3704
+ if (!m)
3705
+ return '';
3706
+ return this.monthDisplay() === 'number' ? m[1] : (this.months()[+m[1] - 1] ?? '');
3707
+ }
3708
+ displayTime(v) {
3709
+ const t = this.parseTime(v);
3710
+ return t ? this.formatTime(t.h, t.m) : '';
3711
+ }
3712
+ displayDateTime(v, iso) {
3713
+ const dt = this.parseDateTime(v);
3714
+ if (!dt)
3715
+ return '';
3716
+ const datePart = iso ? dt.date : `${dt.date.slice(8, 10)}.${dt.date.slice(5, 7)}.${dt.date.slice(0, 4)}`;
3717
+ const sep = iso ? 'T' : ' ';
3718
+ return `${datePart}${sep}${this.formatTime(dt.h, dt.m)}`;
3719
+ }
3720
+ displayDate(v, iso) {
3721
+ const d = this.parseDate(v);
3722
+ if (!d)
3723
+ return '';
3724
+ return iso ? toIso$1(d) : `${pad$1(d.getDate())}.${pad$1(d.getMonth() + 1)}.${d.getFullYear()}`;
3725
+ }
3723
3726
  // ── Parsowanie ──
3724
3727
  parseDate(iso) {
3725
3728
  const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(iso ?? '');
@@ -9224,62 +9227,35 @@ class KptCellEditDef {
9224
9227
  }], null, { kptCellEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "kptCellEdit", required: true }] }] }); })();
9225
9228
 
9226
9229
  /*
9227
- * Escapowanie komórek CSV dla `exportCsv()` — pure TS, wydzielone żeby dało się
9228
- * testować `node --test` bez ciągnięcia Angulara.
9230
+ * Zamiana wartości komórki na tekst dla filtrowania, sortowania i podsumowań — pure TS,
9231
+ * wydzielone żeby dało się testować `node --test` bez ciągnięcia Angulara (jak `csv-export.ts`).
9229
9232
  */
9230
- // Znak startowy, który arkusz kalkulacyjny czyta jako początek formuły (CWE-1236).
9231
- const FORMULA_PREFIX = /^[=+\-@\t\r]/;
9232
- function stringifyCsvValue(value) {
9233
+ /**
9234
+ * Tekst z dowolnej wartości komórki. Prymitywy, `Date` i tablice zachowują się jak `String()`,
9235
+ * natomiast zwykły obiekt daje **pusty string**, nie `'[object Object]'`: ten drugi udawałby
9236
+ * sensowną zawartość — filtr tekstowy „obj" dopasowywałby każdy wiersz z obiektem w komórce,
9237
+ * a sortowanie uznawało je wszystkie za równe.
9238
+ */
9239
+ function toText(value) {
9233
9240
  switch (typeof value) {
9234
- case 'undefined':
9235
- return '';
9236
9241
  case 'string':
9237
9242
  return value;
9238
9243
  case 'number':
9239
9244
  case 'boolean':
9240
9245
  case 'bigint':
9241
9246
  return String(value);
9242
- default:
9247
+ case 'object':
9243
9248
  if (value === null)
9244
9249
  return '';
9245
9250
  if (value instanceof Date)
9246
- return value.toISOString();
9247
- return JSON.stringify(value);
9248
- }
9249
- }
9250
- /** Escapuje pojedynczą wartość komórki/nagłówka do bezpiecznego pola CSV (separator `;`). */
9251
- function escapeCsvCell(value) {
9252
- let text = stringifyCsvValue(value);
9253
- // Wiodący `'` każe arkuszowi traktować komórkę jako tekst — sam znak nie jest wyświetlany.
9254
- if (FORMULA_PREFIX.test(text))
9255
- text = `'${text}`;
9256
- return /[",\n;]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
9257
- }
9258
-
9259
- /**
9260
- * Szablon rozwijanego wiersza (row detail) dla `kpt-data-table`. Renderowany pod
9261
- * wierszem po rozwinięciu. Kontekst: `$implicit` = wiersz. Wymaga `expandable`.
9262
- *
9263
- * @example
9264
- * <kpt-data-table [columns]="cols" [data]="rows" expandable>
9265
- * <ng-template kptRowDetail let-row>
9266
- * <div class="szczegoly">{{ row.opis }}</div>
9267
- * </ng-template>
9268
- * </kpt-data-table>
9269
- */
9270
- class KptRowDetailDef {
9271
- constructor() {
9272
- this.template = inject(TemplateRef);
9251
+ return value.toString();
9252
+ if (Array.isArray(value))
9253
+ return value.map(toText).join(',');
9254
+ return '';
9255
+ default:
9256
+ return '';
9273
9257
  }
9274
- static { this.ɵfac = function KptRowDetailDef_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptRowDetailDef)(); }; }
9275
- static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: KptRowDetailDef, selectors: [["ng-template", "kptRowDetail", ""]] }); }
9276
9258
  }
9277
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KptRowDetailDef, [{
9278
- type: Directive,
9279
- args: [{
9280
- selector: 'ng-template[kptRowDetail]',
9281
- }]
9282
- }], null, null); })();
9283
9259
 
9284
9260
  /*
9285
9261
  * Agregacje wiersza podsumowania (`<tfoot>`) — pure TS, wydzielone żeby dało się
@@ -9297,8 +9273,8 @@ function toNumber(value) {
9297
9273
  if (typeof value === 'number')
9298
9274
  return value;
9299
9275
  if (typeof value === 'string' && value.trim() !== '')
9300
- return parseFloat(value);
9301
- return NaN;
9276
+ return Number.parseFloat(value);
9277
+ return Number.NaN;
9302
9278
  }
9303
9279
  /**
9304
9280
  * Agreguje jedno pole po wierszach. `count` liczy wiersze; pozostałe funkcje pomijają
@@ -9328,6 +9304,137 @@ function aggregate(rows, field, fn) {
9328
9304
  }
9329
9305
  }
9330
9306
 
9307
+ /*
9308
+ * Dopasowanie wiersza do filtrów kolumn tabeli — pure TS, wydzielone żeby dało się
9309
+ * testować `node --test` bez ciągnięcia Angulara (jak `csv-export.ts` i `summary.ts`).
9310
+ * Komponent trzyma tylko stan filtrów; cała semantyka „czy komórka pasuje" jest tutaj.
9311
+ */
9312
+ /** Data komórki w formacie `YYYY-MM-DD` — do porównań leksykograficznych z granicami zakresu. */
9313
+ function toIsoDate(value) {
9314
+ if (value instanceof Date) {
9315
+ const p = (n) => String(n).padStart(2, '0');
9316
+ return `${value.getFullYear()}-${p(value.getMonth() + 1)}-${p(value.getDate())}`;
9317
+ }
9318
+ return toText(value);
9319
+ }
9320
+ /** Filtr „pusty" (nie wybrano nic) przepuszcza każdy wiersz. */
9321
+ function isEmptyFilterValue(value) {
9322
+ return value == null || value === '' || (Array.isArray(value) && value.length === 0);
9323
+ }
9324
+ const matchesText = (cell, value) => toText(cell).toLowerCase().includes(toText(value).toLowerCase());
9325
+ const matchesNumber = (cell, value) => toText(cell).includes(toText(value));
9326
+ const matchesSelect = (cell, value) => {
9327
+ const picked = Array.isArray(value) ? value : [value];
9328
+ // Komórka-tablica (np. lista tagów/członków) → dopasuj, gdy zawiera dowolną z wybranych wartości.
9329
+ if (Array.isArray(cell))
9330
+ return cell.some((c) => picked.includes(c));
9331
+ return picked.includes(cell);
9332
+ };
9333
+ const matchesNumberRange = (cell, value) => {
9334
+ const { min, max } = value ?? {};
9335
+ const lo = min == null || min === '' ? null : Number.parseFloat(min);
9336
+ const hi = max == null || max === '' ? null : Number.parseFloat(max);
9337
+ if (lo === null && hi === null)
9338
+ return true;
9339
+ const num = toNumber(cell);
9340
+ if (Number.isNaN(num))
9341
+ return false;
9342
+ if (lo !== null && num < lo)
9343
+ return false;
9344
+ if (hi !== null && num > hi)
9345
+ return false;
9346
+ return true;
9347
+ };
9348
+ const matchesSlider = (cell, value) => {
9349
+ const [lo, hi] = value;
9350
+ const num = toNumber(cell);
9351
+ if (Number.isNaN(num))
9352
+ return false;
9353
+ return num >= lo && num <= hi;
9354
+ };
9355
+ const matchesDateRange = (cell, value) => {
9356
+ const { start, end } = value ?? {};
9357
+ if (!start && !end)
9358
+ return true;
9359
+ const iso = toIsoDate(cell);
9360
+ if (start && iso < start)
9361
+ return false;
9362
+ if (end && iso > end)
9363
+ return false;
9364
+ return true;
9365
+ };
9366
+ /** Mapa zamiast `switch` — `Record` po unii typów wymusza komplet, więc nie ma martwego `default`. */
9367
+ const MATCHERS = {
9368
+ text: matchesText,
9369
+ number: matchesNumber,
9370
+ select: matchesSelect,
9371
+ numberRange: matchesNumberRange,
9372
+ slider: matchesSlider,
9373
+ dateRange: matchesDateRange,
9374
+ };
9375
+ /** Czy komórka przechodzi filtr kolumny. Wartości pustych filtrów odsiewa `isEmptyFilterValue`. */
9376
+ function matchesColumnFilter(filter, cell, value) {
9377
+ return MATCHERS[filter.type](cell, value);
9378
+ }
9379
+
9380
+ /*
9381
+ * Escapowanie komórek CSV dla `exportCsv()` — pure TS, wydzielone żeby dało się
9382
+ * testować `node --test` bez ciągnięcia Angulara.
9383
+ */
9384
+ // Znak startowy, który arkusz kalkulacyjny czyta jako początek formuły (CWE-1236).
9385
+ const FORMULA_PREFIX = /^[=+\-@\t\r]/;
9386
+ function stringifyCsvValue(value) {
9387
+ switch (typeof value) {
9388
+ case 'undefined':
9389
+ return '';
9390
+ case 'string':
9391
+ return value;
9392
+ case 'number':
9393
+ case 'boolean':
9394
+ case 'bigint':
9395
+ return String(value);
9396
+ default:
9397
+ if (value === null)
9398
+ return '';
9399
+ if (value instanceof Date)
9400
+ return value.toISOString();
9401
+ return JSON.stringify(value);
9402
+ }
9403
+ }
9404
+ /** Escapuje pojedynczą wartość komórki/nagłówka do bezpiecznego pola CSV (separator `;`). */
9405
+ function escapeCsvCell(value) {
9406
+ let text = stringifyCsvValue(value);
9407
+ // Wiodący `'` każe arkuszowi traktować komórkę jako tekst — sam znak nie jest wyświetlany.
9408
+ if (FORMULA_PREFIX.test(text))
9409
+ text = `'${text}`;
9410
+ return /[",\n;]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
9411
+ }
9412
+
9413
+ /**
9414
+ * Szablon rozwijanego wiersza (row detail) dla `kpt-data-table`. Renderowany pod
9415
+ * wierszem po rozwinięciu. Kontekst: `$implicit` = wiersz. Wymaga `expandable`.
9416
+ *
9417
+ * @example
9418
+ * <kpt-data-table [columns]="cols" [data]="rows" expandable>
9419
+ * <ng-template kptRowDetail let-row>
9420
+ * <div class="szczegoly">{{ row.opis }}</div>
9421
+ * </ng-template>
9422
+ * </kpt-data-table>
9423
+ */
9424
+ class KptRowDetailDef {
9425
+ constructor() {
9426
+ this.template = inject(TemplateRef);
9427
+ }
9428
+ static { this.ɵfac = function KptRowDetailDef_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptRowDetailDef)(); }; }
9429
+ static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: KptRowDetailDef, selectors: [["ng-template", "kptRowDetail", ""]] }); }
9430
+ }
9431
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(KptRowDetailDef, [{
9432
+ type: Directive,
9433
+ args: [{
9434
+ selector: 'ng-template[kptRowDetail]',
9435
+ }]
9436
+ }], null, null); })();
9437
+
9331
9438
  const _c0$e = ["scrollEl"];
9332
9439
  const _c1$5 = ["theadEl"];
9333
9440
  const _c2$2 = ["editorHost"];
@@ -9875,7 +9982,7 @@ const REM_PX = 16;
9875
9982
  const CHECKBOX_FROZEN_W = 3; // rem
9876
9983
  const EXPANDER_FROZEN_W = 2.5; // rem
9877
9984
  /** Edytory renderujące panel w CDK Overlay — otwierane od razu i zatwierdzane na zamknięciu panelu. */
9878
- const OVERLAY_EDITORS = ['date', 'select', 'multiselect'];
9985
+ const OVERLAY_EDITORS = new Set(['date', 'select', 'multiselect']);
9879
9986
  /** Tablice (multiselect) porównujemy po zawartości, resztę po referencji. */
9880
9987
  function sameEditValue(a, b) {
9881
9988
  if (a === b)
@@ -10082,7 +10189,7 @@ class KptDataTable {
10082
10189
  const cols = this.columns();
10083
10190
  let rows = this.data();
10084
10191
  if (query) {
10085
- rows = rows.filter((row) => cols.some((col) => String(row[col.field] ?? '').toLowerCase().includes(query)));
10192
+ rows = rows.filter((row) => cols.some((col) => toText(row[col.field]).toLowerCase().includes(query)));
10086
10193
  }
10087
10194
  if (this.hasColumnFilters()) {
10088
10195
  rows = rows.filter((row) => this.matchesColumnFilters(row));
@@ -10106,7 +10213,7 @@ class KptDataTable {
10106
10213
  return -1;
10107
10214
  if (typeof av === 'number' && typeof bv === 'number')
10108
10215
  return (av - bv) * sign;
10109
- return String(av).localeCompare(String(bv)) * sign;
10216
+ return toText(av).localeCompare(toText(bv)) * sign;
10110
10217
  });
10111
10218
  }, /* @ts-ignore */
10112
10219
  ...(ngDevMode ? [{ debugName: "sorted" }] : /* istanbul ignore next */ []));
@@ -10169,15 +10276,16 @@ class KptDataTable {
10169
10276
  const overrides = this.summaryValues() ?? {};
10170
10277
  const map = new Map();
10171
10278
  for (const col of this.visibleOrderedColumns()) {
10172
- if (!col.summary && !(col.field in overrides))
10279
+ const summary = col.summary;
10280
+ // Gotowa wartość z `summaryValues` wygrywa z wyliczeniem — i wystarcza sama w sobie.
10281
+ if (col.field in overrides) {
10282
+ map.set(col.field, this.formatSummary(overrides[col.field], summary?.format));
10173
10283
  continue;
10174
- const raw = col.field in overrides
10175
- ? overrides[col.field]
10176
- : typeof col.summary.fn === 'function'
10177
- ? col.summary.fn(rows)
10178
- : aggregate(rows, col.field, col.summary.fn);
10179
- const format = col.summary?.format;
10180
- map.set(col.field, format ? format(raw) : raw == null ? '' : String(raw));
10284
+ }
10285
+ if (!summary)
10286
+ continue;
10287
+ const raw = typeof summary.fn === 'function' ? summary.fn(rows) : aggregate(rows, col.field, summary.fn);
10288
+ map.set(col.field, this.formatSummary(raw, summary.format));
10181
10289
  }
10182
10290
  return map;
10183
10291
  }, /* @ts-ignore */
@@ -10367,7 +10475,7 @@ class KptDataTable {
10367
10475
  // poza edytorem zamyka panel, a więc zatwierdza i zamyka edycję — bez tego edytor z zamkniętym
10368
10476
  // panelem potrafiłby zostać otwarty w nieskończoność.
10369
10477
  const type = col.edit?.type;
10370
- this.editorPanelOpen.set(!!type && OVERLAY_EDITORS.includes(type));
10478
+ this.editorPanelOpen.set(!!type && OVERLAY_EDITORS.has(type));
10371
10479
  }
10372
10480
  /**
10373
10481
  * Panel edytora zamknięty (wybór, klik poza, Esc) → zatwierdź. Celowo NIE wieszamy tego na
@@ -10454,73 +10562,23 @@ class KptDataTable {
10454
10562
  const v = this.columnFilters()[col.field];
10455
10563
  return v ?? [mn, mx];
10456
10564
  }
10457
- static toIso(value) {
10458
- if (value instanceof Date) {
10459
- const p = (n) => String(n).padStart(2, '0');
10460
- return `${value.getFullYear()}-${p(value.getMonth() + 1)}-${p(value.getDate())}`;
10461
- }
10462
- return String(value ?? '');
10463
- }
10565
+ /** Semantyka dopasowania siedzi w `./column-filter` — tu zostaje tylko spięcie ze stanem. */
10464
10566
  matchesColumnFilters(row) {
10465
10567
  const filters = this.columnFilters();
10568
+ const cells = row;
10466
10569
  return this.columns().every((col) => {
10467
- const f = col.filter;
10468
- if (!f)
10570
+ const filter = col.filter;
10571
+ if (!filter)
10469
10572
  return true;
10470
- const fv = filters[col.field];
10471
- if (fv == null || fv === '' || (Array.isArray(fv) && fv.length === 0))
10573
+ const value = filters[col.field];
10574
+ if (isEmptyFilterValue(value))
10472
10575
  return true;
10473
- const cell = row[col.field];
10474
- switch (f.type) {
10475
- case 'text':
10476
- return String(cell ?? '').toLowerCase().includes(String(fv).toLowerCase());
10477
- case 'number':
10478
- return String(cell ?? '').includes(String(fv));
10479
- case 'select': {
10480
- const vals = Array.isArray(fv) ? fv : [fv];
10481
- // Komórka-tablica (np. lista tagów/członków) → dopasuj, gdy zawiera dowolną z wybranych wartości.
10482
- if (Array.isArray(cell))
10483
- return cell.some((c) => vals.includes(c));
10484
- return vals.includes(cell);
10485
- }
10486
- case 'numberRange': {
10487
- const { min, max } = fv ?? {};
10488
- const hasMin = min != null && min !== '';
10489
- const hasMax = max != null && max !== '';
10490
- if (!hasMin && !hasMax)
10491
- return true;
10492
- const num = typeof cell === 'number' ? cell : parseFloat(String(cell ?? ''));
10493
- if (Number.isNaN(num))
10494
- return false;
10495
- if (hasMin && num < parseFloat(min))
10496
- return false;
10497
- if (hasMax && num > parseFloat(max))
10498
- return false;
10499
- return true;
10500
- }
10501
- case 'slider': {
10502
- const [lo, hi] = fv;
10503
- const num = typeof cell === 'number' ? cell : parseFloat(String(cell ?? ''));
10504
- if (Number.isNaN(num))
10505
- return false;
10506
- return num >= lo && num <= hi;
10507
- }
10508
- case 'dateRange': {
10509
- const { start, end } = fv ?? { start: '', end: '' };
10510
- if (!start && !end)
10511
- return true;
10512
- const iso = KptDataTable.toIso(cell);
10513
- if (start && iso < start)
10514
- return false;
10515
- if (end && iso > end)
10516
- return false;
10517
- return true;
10518
- }
10519
- default:
10520
- return true;
10521
- }
10576
+ return matchesColumnFilter(filter, cells[col.field], value);
10522
10577
  });
10523
10578
  }
10579
+ formatSummary(raw, format) {
10580
+ return format ? format(raw) : toText(raw);
10581
+ }
10524
10582
  summaryText(field) {
10525
10583
  return this.summaryTexts().get(field) ?? '';
10526
10584
  }
@@ -10528,7 +10586,7 @@ class KptDataTable {
10528
10586
  parseWidthPx(width) {
10529
10587
  if (!width)
10530
10588
  return 8 * REM_PX;
10531
- const n = parseFloat(width);
10589
+ const n = Number.parseFloat(width);
10532
10590
  if (Number.isNaN(n))
10533
10591
  return 8 * REM_PX;
10534
10592
  return width.trim().endsWith('px') ? n : n * REM_PX;
@@ -10692,7 +10750,7 @@ class KptDataTable {
10692
10750
  '[style.--kpt-thead-offset]': "theadOffset() + 'px'",
10693
10751
  }, template: "@if (filterable() || exportable()) {\n <div class=\"kpt-data-table__toolbar\">\n @if (filterable()) {\n <input\n class=\"kpt-data-table__filter\"\n type=\"search\"\n [attr.placeholder]=\"i18n.t('dataTable.search')\"\n [value]=\"filterText()\"\n (input)=\"onFilter($event)\"\n />\n }\n @if (exportable()) {\n <kpt-button variant=\"outline\" size=\"sm\" (click)=\"exportCsv()\">{{ i18n.t('dataTable.exportCsv') }}</kpt-button>\n }\n </div>\n}\n\n<div class=\"kpt-data-table__scroll\" #scrollEl [style.max-height]=\"scrollHeight()\" (scroll)=\"onScroll($event)\">\n <table\n class=\"kpt-data-table__table\"\n [class.kpt-data-table__table--frozen]=\"hasFrozen()\"\n [class.kpt-data-table__table--virtual]=\"virtualScroll()\"\n >\n <thead #theadEl>\n @if (hasColumnFilters() && filterRowPosition() === 'top') {\n <ng-container [ngTemplateOutlet]=\"filterRowTpl\" />\n }\n <tr>\n @if (hasRowDetail()) {\n <th class=\"kpt-data-table__expander\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"expanderStickyLeft()\"></th>\n }\n @if (selectable() === 'multiple') {\n <th class=\"kpt-data-table__checkbox\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"checkboxStickyLeft()\">\n <input\n type=\"checkbox\"\n [checked]=\"pageAllSelected()\"\n [indeterminate]=\"pageSomeSelected()\"\n (change)=\"toggleAllOnPage()\"\n [attr.aria-label]=\"i18n.t('dataTable.selectAll')\"\n />\n </th>\n } @else if (selectable() === 'single') {\n <th class=\"kpt-data-table__checkbox\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"checkboxStickyLeft()\"></th>\n }\n @for (col of visibleOrderedColumns(); track col.field) {\n <th\n [attr.draggable]=\"isColDraggable(col) ? true : null\"\n [style.width]=\"col.width\"\n [style.left.px]=\"frozenLeft(col.field)\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [class.kpt-data-table__cell--frozen]=\"isFrozen(col.field)\"\n [class.kpt-data-table__th--sortable]=\"col.sortable\"\n [class.kpt-data-table__th--draggable]=\"isColDraggable(col)\"\n [class.kpt-data-table__th--dragover]=\"dragField() !== null && dragField() !== col.field && !col.frozen\"\n [attr.aria-sort]=\"ariaSort(col)\"\n (click)=\"toggleSort(col)\"\n (dragstart)=\"onColDragStart(col.field, $event)\"\n (dragover)=\"reorderable() ? onColDragOver(col.field, $event) : null\"\n (drop)=\"reorderable() ? onColDrop(col.field, $event) : null\"\n (dragend)=\"onColDragEnd()\"\n >\n @if (isColDraggable(col)) {\n <kpt-icon class=\"kpt-data-table__grip\" name=\"grip-vertical\" />\n }\n <span>{{ col.header }}</span>\n @if (col.sortable) {\n <kpt-icon\n class=\"kpt-data-table__sort\"\n [class.kpt-data-table__sort--active]=\"ariaSort(col) !== 'none'\"\n [name]=\"sortIconName(col)\"\n />\n }\n </th>\n }\n </tr>\n @if (hasColumnFilters() && filterRowPosition() === 'bottom') {\n <ng-container [ngTemplateOutlet]=\"filterRowTpl\" />\n }\n </thead>\n <tbody>\n @if (loading()) {\n <tr><td class=\"kpt-data-table__state\" [attr.colspan]=\"colspan()\">{{ i18n.t('dataTable.loading') }}</td></tr>\n } @else if (displayCount() === 0) {\n <tr><td class=\"kpt-data-table__state\" [attr.colspan]=\"colspan()\">{{ emptyText() }}</td></tr>\n } @else if (virtualScroll()) {\n @if (topPad() > 0) {\n <tr class=\"kpt-data-table__spacer\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"topPad()\"></td></tr>\n }\n @for (row of virtualRows(); track trackRow(row)) {\n <ng-container [ngTemplateOutlet]=\"rowTpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n @if (bottomPad() > 0) {\n <tr class=\"kpt-data-table__spacer\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"bottomPad()\"></td></tr>\n }\n } @else {\n @for (row of paged(); track trackRow(row)) {\n <ng-container [ngTemplateOutlet]=\"rowTpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n }\n </tbody>\n @if (hasSummary() && !loading() && displayCount() > 0) {\n <tfoot>\n <tr class=\"kpt-data-table__summary\">\n @if (summaryLabelSpan() > 0) {\n <th\n class=\"kpt-data-table__summary-label\"\n [attr.colspan]=\"summaryLabelSpan()\"\n [class.kpt-data-table__cell--frozen]=\"hasFrozen()\"\n [style.left.px]=\"hasFrozen() ? 0 : null\"\n >\n {{ summaryLabelText() }}\n </th>\n }\n @for (col of visibleOrderedColumns(); track col.field; let i = $index) {\n @if (i >= summaryStartIndex()) {\n <td\n [attr.data-align]=\"col.align ?? 'end'\"\n [style.width]=\"col.width\"\n [style.left.px]=\"frozenLeft(col.field)\"\n [class.kpt-data-table__cell--frozen]=\"isFrozen(col.field)\"\n >\n {{ summaryText(col.field) }}\n </td>\n }\n }\n </tr>\n </tfoot>\n }\n </table>\n</div>\n\n<ng-template #rowTpl let-row>\n <tr\n [class.kpt-data-table__row--selected]=\"isSelected(row)\"\n [class.kpt-data-table__row--expanded]=\"hasRowDetail() && isExpanded(row)\"\n [style.height.px]=\"virtualScroll() ? rowHeight() : null\"\n (click)=\"onRowClick(row)\"\n >\n @if (hasRowDetail()) {\n <td class=\"kpt-data-table__expander\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"expanderStickyLeft()\">\n <button\n type=\"button\"\n class=\"kpt-data-table__expander-btn\"\n [class.kpt-data-table__expander-btn--open]=\"isExpanded(row)\"\n [attr.aria-expanded]=\"isExpanded(row)\"\n [attr.aria-label]=\"i18n.t('dataTable.expandRow')\"\n (click)=\"$event.stopPropagation(); toggleExpand(row)\"\n >\n <kpt-icon name=\"chevron-right\" />\n </button>\n </td>\n }\n @if (selectable() !== 'none') {\n <td class=\"kpt-data-table__checkbox\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"checkboxStickyLeft()\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n [attr.aria-label]=\"i18n.t('dataTable.selectRow')\"\n />\n </td>\n }\n @for (col of visibleOrderedColumns(); track col.field) {\n <td\n [attr.data-align]=\"col.align ?? 'start'\"\n [style.left.px]=\"frozenLeft(col.field)\"\n [class.kpt-data-table__cell--frozen]=\"isFrozen(col.field)\"\n [class.kpt-data-table__cell--editable]=\"isEditable(col) && !isEditingCell(row, col.field)\"\n [attr.tabindex]=\"isEditable(col) && !isEditingCell(row, col.field) ? 0 : null\"\n [attr.aria-label]=\"isEditable(col) && !isEditingCell(row, col.field) ? i18n.t('dataTable.editCell', { column: col.header }) : null\"\n (click)=\"isEditable(col) ? startEdit(row, col, $event) : null\"\n (keydown.enter)=\"isEditable(col) && !isEditingCell(row, col.field) ? startEdit(row, col, $event) : null\"\n >\n @if (isEditingCell(row, col.field)) {\n <div\n class=\"kpt-data-table__editor\"\n #editorHost\n (click)=\"$event.stopPropagation()\"\n (focusout)=\"onEditorFocusOut($event)\"\n >\n @if (cellEditTemplate(col.field); as etpl) {\n <ng-container\n [ngTemplateOutlet]=\"etpl\"\n [ngTemplateOutletContext]=\"{ $implicit: editingValue(), row, commit: commitEditValue, cancel: cancelEdit }\"\n />\n } @else {\n @switch (col.edit?.type) {\n @case ('text') {\n <kpt-input\n [value]=\"$any(editingValue()) ?? ''\"\n [placeholder]=\"col.edit.placeholder ?? ''\"\n (valueChange)=\"editingValue.set($event)\"\n (keydown.enter)=\"commitEdit()\"\n (keydown.escape)=\"cancelEdit()\"\n />\n }\n @case ('number') {\n <kpt-input-number\n [value]=\"$any(editingValue())\"\n [min]=\"col.edit.min\"\n [max]=\"col.edit.max\"\n [step]=\"col.edit.step ?? 1\"\n (valueChange)=\"editingValue.set($event)\"\n (keydown.enter)=\"commitEdit()\"\n (keydown.escape)=\"cancelEdit()\"\n />\n }\n @case ('date') {\n <kpt-datepicker\n [value]=\"$any(editingValue()) ?? ''\"\n (valueChange)=\"editingValue.set($event)\"\n [open]=\"editorPanelOpen()\"\n (openChange)=\"onEditorPanelToggle($event)\"\n />\n }\n @case ('select') {\n <kpt-select\n [options]=\"col.edit.options ?? []\"\n [placeholder]=\"col.edit.placeholder ?? ''\"\n [value]=\"editingValue()\"\n (valueChange)=\"editingValue.set($event)\"\n [open]=\"editorPanelOpen()\"\n (openChange)=\"onEditorPanelToggle($event)\"\n />\n }\n @case ('multiselect') {\n <kpt-select\n multiple\n filter\n [options]=\"col.edit.options ?? []\"\n [placeholder]=\"col.edit.placeholder ?? ''\"\n [value]=\"editingValue()\"\n (valueChange)=\"editingValue.set($event)\"\n [open]=\"editorPanelOpen()\"\n (openChange)=\"onEditorPanelToggle($event)\"\n />\n }\n }\n }\n </div>\n } @else if (cellTemplate(col.field); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row, value: getValue(row, col.field) }\"\n />\n } @else {\n {{ getValue(row, col.field) }}\n }\n </td>\n }\n </tr>\n @if (hasRowDetail() && isExpanded(row) && !virtualScroll()) {\n <tr class=\"kpt-data-table__detail-row\">\n <td class=\"kpt-data-table__detail\" [attr.colspan]=\"colspan()\">\n <ng-container [ngTemplateOutlet]=\"rowDetailTpl()\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </td>\n </tr>\n }\n</ng-template>\n\n<ng-template #filterRowTpl>\n <tr class=\"kpt-data-table__filter-row\">\n @if (hasRowDetail()) {\n <th class=\"kpt-data-table__expander\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"expanderStickyLeft()\"></th>\n }\n @if (selectable() !== 'none') {\n <th class=\"kpt-data-table__checkbox\" [class.kpt-data-table__cell--frozen]=\"hasFrozen()\" [style.left.px]=\"checkboxStickyLeft()\"></th>\n }\n @for (col of visibleOrderedColumns(); track col.field) {\n <th\n [style.width]=\"col.width\"\n [style.left.px]=\"frozenLeft(col.field)\"\n [attr.data-align]=\"col.align ?? 'start'\"\n [class.kpt-data-table__cell--frozen]=\"isFrozen(col.field)\"\n >\n @switch (col.filter?.type) {\n @case ('text') {\n <input\n class=\"kpt-data-table__fcell\"\n type=\"search\"\n [attr.placeholder]=\"col.filter.placeholder || ''\"\n [attr.aria-label]=\"i18n.t('dataTable.filter', { column: col.header })\"\n [value]=\"$any(columnFilters()[col.field]) || ''\"\n (input)=\"setColumnFilter(col.field, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n @case ('number') {\n <input\n class=\"kpt-data-table__fcell\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.placeholder]=\"col.filter.placeholder || ''\"\n [attr.aria-label]=\"i18n.t('dataTable.filter', { column: col.header })\"\n [value]=\"$any(columnFilters()[col.field]) || ''\"\n (input)=\"onNumberFilter(col.field, $event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n @case ('select') {\n <kpt-select\n [options]=\"col.filter.options || []\"\n [multiple]=\"!!col.filter.multiple\"\n filter\n [placeholder]=\"col.filter.placeholder || i18n.t('dataTable.all')\"\n [value]=\"columnFilters()[col.field] ?? null\"\n (valueChange)=\"setColumnFilter(col.field, $event)\"\n />\n }\n @case ('numberRange') {\n <div class=\"kpt-data-table__frange\">\n <input\n class=\"kpt-data-table__fcell\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.placeholder]=\"i18n.t('dataTable.min')\"\n [attr.aria-label]=\"i18n.t('dataTable.filterMin', { column: col.header })\"\n [value]=\"rangeVal(col.field).min\"\n (input)=\"setRangeFilter(col.field, 'min', $event)\"\n (click)=\"$event.stopPropagation()\"\n />\n <input\n class=\"kpt-data-table__fcell\"\n type=\"text\"\n inputmode=\"numeric\"\n [attr.placeholder]=\"i18n.t('dataTable.max')\"\n [attr.aria-label]=\"i18n.t('dataTable.filterMax', { column: col.header })\"\n [value]=\"rangeVal(col.field).max\"\n (input)=\"setRangeFilter(col.field, 'max', $event)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @case ('slider') {\n <div class=\"kpt-data-table__fslider\" (click)=\"$event.stopPropagation()\">\n <kpt-slider\n range\n [min]=\"col.filter.min ?? 0\"\n [max]=\"col.filter.max ?? 100\"\n [step]=\"col.filter.step ?? 1\"\n [value]=\"sliderVal(col)\"\n (valueChange)=\"setColumnFilter(col.field, $event)\"\n showValue\n />\n </div>\n }\n @case ('dateRange') {\n <kpt-date-range\n [placeholder]=\"col.filter.placeholder || i18n.t('dataTable.dateRange')\"\n [value]=\"$any(columnFilters()[col.field]) || { start: '', end: '' }\"\n (valueChange)=\"setColumnFilter(col.field, $event)\"\n />\n }\n }\n </th>\n }\n </tr>\n</ng-template>\n\n@if (pageSize() > 0 && !virtualScroll()) {\n <div class=\"kpt-data-table__pager\">\n <ng-content select=\"[kptPaginatorActions]\" />\n <kpt-paginator\n [length]=\"filteredCount()\"\n [pageIndex]=\"pageIndex()\"\n (pageIndexChange)=\"pageIndex.set($event)\"\n [pageSize]=\"pageSizeState()\"\n (pageSizeChange)=\"pageSizeState.set($event)\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n />\n </div>\n}\n", styles: ["@layer kpt.components{.kpt-data-table{display:flex;flex-direction:column;background:var(--kpt-table-bg);color:var(--kpt-table-fg);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border);border-radius:var(--kpt-table-radius, .75rem);overflow:hidden;flex-grow:1}.kpt-data-table__toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--kpt-space-3, .75rem);padding:var(--kpt-space-3, .75rem);border-bottom:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border)}.kpt-data-table__filter{width:100%;max-width:20rem;height:2.25rem;padding-inline:var(--kpt-space-3, .75rem);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-form-field-border);border-radius:var(--kpt-form-field-radius, .5rem);background:var(--kpt-form-field-bg);color:var(--kpt-form-field-text)}.kpt-data-table__filter:focus-visible{outline:none;border-color:var(--kpt-form-field-border-focus);box-shadow:0 0 0 2px color-mix(in oklch,var(--kpt-form-field-border-focus) 30%,transparent)}.kpt-data-table__scroll{overflow:auto}.kpt-data-table__pager{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem)}.kpt-data-table__pager [kptPaginatorActions]{margin-inline-start:.5rem}.kpt-data-table__pager kpt-paginator{flex:1 1 auto;min-width:0}.kpt-data-table__table{width:100%;border-collapse:collapse;font-size:var(--kpt-font-size-sm, .875rem)}.kpt-data-table__table--frozen{width:max-content;min-width:100%}.kpt-data-table__table th,.kpt-data-table__table td{padding:var(--kpt-table-cell-padding, .75rem);text-align:start;border-bottom:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border)}.kpt-data-table__table th[data-align=center],.kpt-data-table__table td[data-align=center]{text-align:center}.kpt-data-table__table th[data-align=end],.kpt-data-table__table td[data-align=end]{text-align:end}.kpt-data-table__table thead th{position:sticky;top:0;z-index:1;background:var(--kpt-table-header-bg);color:var(--kpt-table-header-fg);font-weight:var(--kpt-font-weight-semibold, 600);white-space:nowrap;-webkit-user-select:none;user-select:none}.kpt-data-table__table thead tr:nth-child(2) th{top:var(--kpt-thead-offset, 0px)}.kpt-data-table__table tfoot th,.kpt-data-table__table tfoot td{position:sticky;bottom:0;z-index:1;background:var(--kpt-table-summary-bg, var(--kpt-table-header-bg));color:var(--kpt-table-header-fg);font-weight:var(--kpt-font-weight-semibold, 600);white-space:nowrap;border-bottom:0;border-top:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border)}.kpt-data-table__table .kpt-data-table__summary-label{text-align:end}.kpt-data-table__filter-row th{padding:var(--kpt-space-2, .5rem);font-weight:var(--kpt-font-weight-normal, 400);cursor:auto}.kpt-data-table__fcell{width:100%;height:2rem;padding-inline:var(--kpt-space-2, .5rem);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-form-field-border);border-radius:var(--kpt-form-field-radius, .5rem);background:var(--kpt-form-field-bg);color:var(--kpt-form-field-text);font:inherit}.kpt-data-table__fcell:focus-visible{outline:none;border-color:var(--kpt-form-field-border-focus);box-shadow:0 0 0 2px color-mix(in oklch,var(--kpt-form-field-border-focus) 30%,transparent)}.kpt-data-table__filter-row kpt-select,.kpt-data-table__filter-row kpt-date-range{display:block;width:100%;font-weight:var(--kpt-font-weight-normal, 400)}.kpt-data-table__frange{display:flex;gap:var(--kpt-space-2, .5rem)}.kpt-data-table__frange .kpt-data-table__fcell{min-width:0}.kpt-data-table__fslider .kpt-slider-host{width:100%}.kpt-data-table__fslider .kpt-slider__value{min-width:auto;font-size:var(--kpt-font-size-xs, .75rem);color:var(--kpt-color-on-surface-muted)}.kpt-data-table__th--sortable{cursor:pointer}.kpt-data-table__th--sortable:hover{color:var(--kpt-color-on-surface)}.kpt-data-table__cell--editable{cursor:pointer}.kpt-data-table__cell--editable:hover{background:var(--kpt-table-row-hover)}.kpt-data-table__cell--editable:focus-visible{outline:var(--kpt-border-width-medium, 2px) solid var(--kpt-color-focus-ring);outline-offset:-2px}.kpt-data-table__editor{display:block;min-width:8rem}.kpt-data-table__editor .kpt-input-number-host{max-width:6.5rem}.kpt-data-table__editor .kpt-input-number__btn{width:1.75rem}.kpt-data-table__sort{margin-inline-start:.35em;opacity:.35}.kpt-data-table__sort--active{opacity:1}.kpt-data-table__th--draggable{cursor:grab}.kpt-data-table__th--draggable:active{cursor:grabbing}.kpt-data-table__th--dragover{box-shadow:inset 2px 0 0 0 var(--kpt-color-primary)}.kpt-data-table__grip{margin-inline-end:.4em;opacity:.45}.kpt-data-table__checkbox{width:1px;white-space:nowrap;text-align:center}.kpt-data-table__checkbox input[type=checkbox]{appearance:none;-webkit-appearance:none;position:relative;display:inline-block;width:1.15rem;height:1.15rem;margin:0;vertical-align:middle;cursor:pointer;border:var(--kpt-border-width-medium, 2px) solid var(--kpt-form-field-border);border-radius:var(--kpt-radius-sm, .25rem);background:var(--kpt-form-field-bg);transition:background-color var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard),border-color var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard)}.kpt-data-table__checkbox input[type=checkbox]:after{content:\"\";position:absolute;inset:0;opacity:0;background-color:var(--kpt-color-on-primary);transition:opacity var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard);-webkit-mask:no-repeat center/.85rem;mask:no-repeat center/.85rem}.kpt-data-table__checkbox input[type=checkbox]:checked,.kpt-data-table__checkbox input[type=checkbox]:indeterminate{background:var(--kpt-color-primary);border-color:var(--kpt-color-primary)}.kpt-data-table__checkbox input[type=checkbox]:checked:after{opacity:1;-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M13 4.5 6.5 11 3 7.5' fill='none' stroke='%23000' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M13 4.5 6.5 11 3 7.5' fill='none' stroke='%23000' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")}.kpt-data-table__checkbox input[type=checkbox]:indeterminate:after{opacity:1;-webkit-mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8h9' fill='none' stroke='%23000' stroke-width='2.25' stroke-linecap='round'/%3E%3C/svg%3E\");mask-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8h9' fill='none' stroke='%23000' stroke-width='2.25' stroke-linecap='round'/%3E%3C/svg%3E\")}.kpt-data-table__checkbox input[type=checkbox]:focus-visible{outline:var(--kpt-border-width-medium, 2px) solid var(--kpt-color-focus-ring);outline-offset:2px}.kpt-data-table__expander{width:2.5rem;min-width:2.5rem;text-align:center;white-space:nowrap}.kpt-data-table__expander-btn{display:inline-flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;border:none;border-radius:var(--kpt-radius-sm, .25rem);background:transparent;color:var(--kpt-color-on-surface-muted);cursor:pointer;transition:background-color var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard),color var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard)}.kpt-data-table__expander-btn kpt-icon{display:inline-flex;transition:transform var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard)}.kpt-data-table__expander-btn:hover{background:var(--kpt-table-row-hover);color:var(--kpt-color-on-surface)}.kpt-data-table__expander-btn:focus-visible{outline:var(--kpt-border-width-medium, 2px) solid var(--kpt-color-focus-ring);outline-offset:2px}.kpt-data-table__expander-btn--open{color:var(--kpt-color-primary)}.kpt-data-table__expander-btn--open kpt-icon{transform:rotate(90deg)}.kpt-data-table__detail-row>.kpt-data-table__detail{padding:var(--kpt-space-4, 1rem);background:var(--kpt-table-detail-bg, var(--kpt-color-surface-variant, var(--kpt-table-row-hover)));border-bottom:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border);box-shadow:inset 3px 0 0 0 var(--kpt-color-primary)}.kpt-data-table tbody tr{transition:background-color var(--kpt-motion-duration-fast, .12s) var(--kpt-motion-easing-standard)}.kpt-data-table tbody tr:hover{background:var(--kpt-table-row-hover)}.kpt-data-table tbody tr.kpt-data-table__detail-row:hover{background:transparent}.kpt-data-table__row--selected{background:var(--kpt-table-row-selected)!important}.kpt-data-table__row--expanded{background:var(--kpt-table-row-hover)}.kpt-data-table__table--frozen .kpt-data-table__checkbox{width:3rem;min-width:3rem}.kpt-data-table__table--frozen .kpt-data-table__expander{width:2.5rem;min-width:2.5rem}.kpt-data-table__cell--frozen{position:sticky;z-index:1;background:var(--kpt-table-bg);border-inline-end:var(--kpt-border-width-thin, 1px) solid var(--kpt-table-border)}.kpt-data-table thead th.kpt-data-table__cell--frozen{z-index:3;background:var(--kpt-table-header-bg)}.kpt-data-table tfoot th.kpt-data-table__cell--frozen,.kpt-data-table tfoot td.kpt-data-table__cell--frozen{z-index:3;background:var(--kpt-table-summary-bg, var(--kpt-table-header-bg))}.kpt-data-table tbody tr:hover .kpt-data-table__cell--frozen{background:var(--kpt-table-row-hover)}.kpt-data-table__row--selected.kpt-data-table__row--selected .kpt-data-table__cell--frozen,.kpt-data-table tbody tr.kpt-data-table__row--selected .kpt-data-table__cell--frozen{background:var(--kpt-table-row-selected)}.kpt-data-table__state{padding:var(--kpt-space-8, 2rem)!important;text-align:center!important;color:var(--kpt-color-on-surface-muted)}.kpt-data-table__table--virtual td{padding-block:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpt-data-table__spacer td{padding:0!important;border:0!important}.kpt-data-table tbody tr:last-child td{border-bottom:0}}\n"] }]
10694
10752
  }], () => [], { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], filterable: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterable", required: false }] }], filterRowPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterRowPosition", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], scrollHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollHeight", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], reorderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "reorderable", required: false }] }], exportable: [{ type: i0.Input, args: [{ isSignal: true, alias: "exportable", required: false }] }], exportFilename: [{ type: i0.Input, args: [{ isSignal: true, alias: "exportFilename", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], totalRecords: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRecords", required: false }] }], expandable: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandable", required: false }] }], multiExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiExpand", required: false }] }], summaryLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "summaryLabel", required: false }] }], summaryValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "summaryValues", required: false }] }], selection: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }, { type: i0.Output, args: ["selectionChange"] }], expandedRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedRows", required: false }] }, { type: i0.Output, args: ["expandedRowsChange"] }], hiddenFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenFields", required: false }] }, { type: i0.Output, args: ["hiddenFieldsChange"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], lazyLoad: [{ type: i0.Output, args: ["lazyLoad"] }], cellEdit: [{ type: i0.Output, args: ["cellEdit"] }], scrollEl: [{ type: i0.ViewChild, args: ['scrollEl', { isSignal: true }] }], theadEl: [{ type: i0.ViewChild, args: ['theadEl', { isSignal: true }] }], editorHost: [{ type: i0.ViewChild, args: ['editorHost', { isSignal: true }] }], cellDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KptCellDef), { isSignal: true }] }], cellEditDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KptCellEditDef), { isSignal: true }] }], rowDetailDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KptRowDetailDef), { isSignal: true }] }] }); })();
10695
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptDataTable, { className: "KptDataTable", filePath: "lib/data-table/data-table.component.ts", lineNumber: 173 }); })();
10753
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptDataTable, { className: "KptDataTable", filePath: "lib/data-table/data-table.component.ts", lineNumber: 157 }); })();
10696
10754
 
10697
10755
  const _c0$d = a0 => ({ $implicit: a0, level: 0 });
10698
10756
  const _c1$4 = (a0, a1) => ({ $implicit: a0, level: a1 });
@@ -12071,7 +12129,7 @@ function KptMenu_ng_template_3_Template(rf, ctx) { if (rf & 1) {
12071
12129
  * Wymaga stylów overlay CDK: `import '@angular/cdk/overlay-prebuilt.css';`
12072
12130
  *
12073
12131
  * @example
12074
- * <kpt-menu [items]="items" (select)="onSelect($event)">
12132
+ * <kpt-menu [items]="items" (selected)="onSelect($event)">
12075
12133
  * <kpt-button variant="outline">Opcje</kpt-button>
12076
12134
  * </kpt-menu>
12077
12135
  */
@@ -12079,7 +12137,7 @@ class KptMenu {
12079
12137
  constructor() {
12080
12138
  this.items = input([], /* @ts-ignore */
12081
12139
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
12082
- this.select = output();
12140
+ this.selected = output();
12083
12141
  this.open = signal(false, /* @ts-ignore */
12084
12142
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
12085
12143
  this.positions = [
@@ -12097,11 +12155,11 @@ class KptMenu {
12097
12155
  pick(item) {
12098
12156
  if (item.disabled)
12099
12157
  return;
12100
- this.select.emit(item);
12158
+ this.selected.emit(item);
12101
12159
  this.close();
12102
12160
  }
12103
12161
  static { this.ɵfac = function KptMenu_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptMenu)(); }; }
12104
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMenu, selectors: [["kpt-menu"]], hostAttrs: [1, "kpt-menu-host"], inputs: { items: [1, "items"] }, outputs: { select: "select" }, ngContentSelectors: _c0$5, decls: 4, vars: 4, consts: [["origin", "cdkOverlayOrigin"], ["cdkOverlayOrigin", "", 1, "kpt-menu__trigger", 3, "click"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-menu__panel"], ["role", "separator", 1, "kpt-menu__separator"], ["role", "presentation", 1, "kpt-menu__header"], ["type", "button", "role", "menuitem", 1, "kpt-menu__item", 3, "kpt-menu__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-menu__text"], [1, "kpt-menu__label"], [1, "kpt-menu__description"], ["type", "button", "role", "menuitem", 1, "kpt-menu__item", 3, "click", "disabled"], [1, "kpt-menu__badge", 3, "value", "variant"]], template: function KptMenu_Template(rf, ctx) { if (rf & 1) {
12162
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMenu, selectors: [["kpt-menu"]], hostAttrs: [1, "kpt-menu-host"], inputs: { items: [1, "items"] }, outputs: { selected: "selected" }, ngContentSelectors: _c0$5, decls: 4, vars: 4, consts: [["origin", "cdkOverlayOrigin"], ["cdkOverlayOrigin", "", 1, "kpt-menu__trigger", 3, "click"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-menu__panel"], ["role", "separator", 1, "kpt-menu__separator"], ["role", "presentation", 1, "kpt-menu__header"], ["type", "button", "role", "menuitem", 1, "kpt-menu__item", 3, "kpt-menu__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-menu__text"], [1, "kpt-menu__label"], [1, "kpt-menu__description"], ["type", "button", "role", "menuitem", 1, "kpt-menu__item", 3, "click", "disabled"], [1, "kpt-menu__badge", 3, "value", "variant"]], template: function KptMenu_Template(rf, ctx) { if (rf & 1) {
12105
12163
  i0.ɵɵprojectionDef();
12106
12164
  i0.ɵɵelementStart(0, "span", 1, 0);
12107
12165
  i0.ɵɵlistener("click", function KptMenu_Template_span_click_0_listener() { return ctx.toggle(); });
@@ -12176,7 +12234,7 @@ class KptMenu {
12176
12234
  </div>
12177
12235
  </ng-template>
12178
12236
  `, host: { class: 'kpt-menu-host' }, styles: ["@charset \"UTF-8\";@layer kpt.components{.kpt-menu-host{display:inline-flex}.kpt-menu__trigger{display:inline-flex;cursor:pointer}.kpt-menu__panel{min-width:11rem;padding:.25rem;background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem);box-shadow:var(--kpt-elevation-3)}.kpt-menu__item{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);width:100%;padding:.5rem .6rem;border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font:inherit;font-size:var(--kpt-font-size-sm, .875rem);text-align:start;cursor:pointer}.kpt-menu__item:hover:not(:disabled){background:var(--kpt-color-surface-variant)}.kpt-menu__item:disabled{opacity:.45;cursor:not-allowed}.kpt-menu__item--danger{color:var(--kpt-color-danger)}.kpt-menu__item kpt-icon{color:var(--kpt-color-on-surface-muted)}.kpt-menu__item--danger kpt-icon{color:var(--kpt-color-danger)}.kpt-menu__header{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);padding:.5rem .6rem;font-size:var(--kpt-font-size-sm, .875rem);cursor:default}.kpt-menu__header .kpt-menu__label{font-weight:var(--kpt-font-weight-semibold, 600)}.kpt-menu__header kpt-icon{color:var(--kpt-color-on-surface-muted)}.kpt-menu__text{display:flex;flex-direction:column;min-width:0}.kpt-menu__label,.kpt-menu__description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kpt-menu__description{color:var(--kpt-color-on-surface-muted);font-size:var(--kpt-font-size-xs, .75rem)}.kpt-menu__badge{margin-inline-start:auto}.kpt-menu__separator{height:1px;margin:.25rem 0;background:var(--kpt-color-border)}}\n"] }]
12179
- }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
12237
+ }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
12180
12238
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptMenu, { className: "KptMenu", filePath: "lib/menu/menu.component.ts", lineNumber: 116 }); })();
12181
12239
 
12182
12240
  const _c0$4 = [[["", "kptPopoverTrigger", ""]], "*"];
@@ -12629,7 +12687,7 @@ function KptContextMenu_Conditional_2_Template(rf, ctx) { if (rf & 1) {
12629
12687
  * Menu kontekstowe (PPM) na obszarze projekcji. Panel pozycjonowany do kursora.
12630
12688
  *
12631
12689
  * @example
12632
- * <kpt-context-menu [items]="items" (select)="onSelect($event)">
12690
+ * <kpt-context-menu [items]="items" (selected)="onSelect($event)">
12633
12691
  * <div class="obszar">Kliknij prawym przyciskiem</div>
12634
12692
  * </kpt-context-menu>
12635
12693
  */
@@ -12637,7 +12695,7 @@ class KptContextMenu {
12637
12695
  constructor() {
12638
12696
  this.items = input([], /* @ts-ignore */
12639
12697
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
12640
- this.select = output();
12698
+ this.selected = output();
12641
12699
  this.open = signal(false, /* @ts-ignore */
12642
12700
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
12643
12701
  this.x = signal(0, /* @ts-ignore */
@@ -12657,11 +12715,11 @@ class KptContextMenu {
12657
12715
  pick(item) {
12658
12716
  if (item.disabled)
12659
12717
  return;
12660
- this.select.emit(item);
12718
+ this.selected.emit(item);
12661
12719
  this.close();
12662
12720
  }
12663
12721
  static { this.ɵfac = function KptContextMenu_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptContextMenu)(); }; }
12664
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptContextMenu, selectors: [["kpt-context-menu"]], hostAttrs: [1, "kpt-context-menu-host"], inputs: { items: [1, "items"] }, outputs: { select: "select" }, ngContentSelectors: _c0$2, decls: 3, vars: 1, consts: [[1, "kpt-context-menu__area", 3, "contextmenu"], [1, "kpt-context-menu__backdrop", 3, "click", "contextmenu"], ["role", "menu", 1, "kpt-context-menu__panel"], ["role", "separator", 1, "kpt-context-menu__separator"], ["role", "presentation", 1, "kpt-context-menu__header"], ["type", "button", "role", "menuitem", 1, "kpt-context-menu__item", 3, "kpt-context-menu__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-context-menu__text"], [1, "kpt-context-menu__label"], [1, "kpt-context-menu__description"], ["type", "button", "role", "menuitem", 1, "kpt-context-menu__item", 3, "click", "disabled"], [1, "kpt-context-menu__badge", 3, "value", "variant"]], template: function KptContextMenu_Template(rf, ctx) { if (rf & 1) {
12722
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptContextMenu, selectors: [["kpt-context-menu"]], hostAttrs: [1, "kpt-context-menu-host"], inputs: { items: [1, "items"] }, outputs: { selected: "selected" }, ngContentSelectors: _c0$2, decls: 3, vars: 1, consts: [[1, "kpt-context-menu__area", 3, "contextmenu"], [1, "kpt-context-menu__backdrop", 3, "click", "contextmenu"], ["role", "menu", 1, "kpt-context-menu__panel"], ["role", "separator", 1, "kpt-context-menu__separator"], ["role", "presentation", 1, "kpt-context-menu__header"], ["type", "button", "role", "menuitem", 1, "kpt-context-menu__item", 3, "kpt-context-menu__item--danger", "disabled"], ["size", "sm", 3, "src", "name", "icon"], [3, "name"], [1, "kpt-context-menu__text"], [1, "kpt-context-menu__label"], [1, "kpt-context-menu__description"], ["type", "button", "role", "menuitem", 1, "kpt-context-menu__item", 3, "click", "disabled"], [1, "kpt-context-menu__badge", 3, "value", "variant"]], template: function KptContextMenu_Template(rf, ctx) { if (rf & 1) {
12665
12723
  i0.ɵɵprojectionDef();
12666
12724
  i0.ɵɵelementStart(0, "div", 0);
12667
12725
  i0.ɵɵlistener("contextmenu", function KptContextMenu_Template_div_contextmenu_0_listener($event) { return ctx.onContext($event); });
@@ -12734,7 +12792,7 @@ class KptContextMenu {
12734
12792
  </div>
12735
12793
  }
12736
12794
  `, host: { class: 'kpt-context-menu-host' }, styles: ["@charset \"UTF-8\";@layer kpt.components{.kpt-context-menu-host{display:block}.kpt-context-menu__area{display:contents}.kpt-context-menu__backdrop{position:fixed;inset:0;z-index:var(--kpt-z-overlay, 1000)}.kpt-context-menu__panel{position:fixed;z-index:calc(var(--kpt-z-overlay, 1000) + 1);min-width:11rem;padding:var(--kpt-space-1, .25rem);background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem);box-shadow:var(--kpt-elevation-3)}.kpt-context-menu__item{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);width:100%;padding:var(--kpt-space-2, .5rem) var(--kpt-space-3, .75rem);border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font-size:var(--kpt-font-size-sm, .875rem);text-align:left;cursor:pointer}.kpt-context-menu__item:hover:not(:disabled){background:var(--kpt-color-muted)}.kpt-context-menu__item:disabled{opacity:.5;cursor:not-allowed}.kpt-context-menu__item--danger{color:var(--kpt-color-danger)}.kpt-context-menu__header{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);padding:var(--kpt-space-2, .5rem) var(--kpt-space-3, .75rem);font-size:var(--kpt-font-size-sm, .875rem);cursor:default}.kpt-context-menu__header .kpt-context-menu__label{font-weight:var(--kpt-font-weight-semibold, 600)}.kpt-context-menu__header kpt-icon{color:var(--kpt-color-on-surface-muted)}.kpt-context-menu__text{display:flex;flex-direction:column;min-width:0}.kpt-context-menu__label,.kpt-context-menu__description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kpt-context-menu__description{color:var(--kpt-color-on-surface-muted);font-size:var(--kpt-font-size-xs, .75rem)}.kpt-context-menu__badge{margin-inline-start:auto}.kpt-context-menu__separator{height:1px;margin:var(--kpt-space-1, .25rem) 0;background:var(--kpt-color-border)}}\n"] }]
12737
- }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
12795
+ }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
12738
12796
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptContextMenu, { className: "KptContextMenu", filePath: "lib/context-menu/context-menu.component.ts", lineNumber: 82 }); })();
12739
12797
 
12740
12798
  function KptMenubar_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
@@ -12824,13 +12882,13 @@ function KptMenubar_For_2_Template(rf, ctx) { if (rf & 1) {
12824
12882
  * `import '@angular/cdk/overlay-prebuilt.css';`
12825
12883
  *
12826
12884
  * @example
12827
- * <kpt-menubar [items]="items" (select)="onSelect($event)" />
12885
+ * <kpt-menubar [items]="items" (selected)="onSelect($event)" />
12828
12886
  */
12829
12887
  class KptMenubar {
12830
12888
  constructor() {
12831
12889
  this.items = input([], /* @ts-ignore */
12832
12890
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
12833
- this.select = output();
12891
+ this.selected = output();
12834
12892
  this.openIndex = signal(null, /* @ts-ignore */
12835
12893
  ...(ngDevMode ? [{ debugName: "openIndex" }] : /* istanbul ignore next */ []));
12836
12894
  this.positions = [
@@ -12845,21 +12903,21 @@ class KptMenubar {
12845
12903
  this.openIndex.update((cur) => (cur === i ? null : i));
12846
12904
  }
12847
12905
  else {
12848
- this.select.emit(item);
12906
+ this.selected.emit(item);
12849
12907
  this.closeAll();
12850
12908
  }
12851
12909
  }
12852
12910
  pick(item) {
12853
12911
  if (item.disabled)
12854
12912
  return;
12855
- this.select.emit(item);
12913
+ this.selected.emit(item);
12856
12914
  this.closeAll();
12857
12915
  }
12858
12916
  closeAll() {
12859
12917
  this.openIndex.set(null);
12860
12918
  }
12861
12919
  static { this.ɵfac = function KptMenubar_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptMenubar)(); }; }
12862
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMenubar, selectors: [["kpt-menubar"]], hostAttrs: [1, "kpt-menubar-host"], inputs: { items: [1, "items"] }, outputs: { select: "select" }, decls: 3, vars: 0, consts: [["origin", "cdkOverlayOrigin"], ["role", "menubar", 1, "kpt-menubar"], [1, "kpt-menubar__group"], ["type", "button", "role", "menuitem", "cdkOverlayOrigin", "", 1, "kpt-menubar__top", 3, "click", "disabled"], [3, "name"], ["name", "chevron-down", 1, "kpt-menubar__caret"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-menubar__dropdown"], ["role", "separator", 1, "kpt-menubar__separator"], ["type", "button", "role", "menuitem", 1, "kpt-menubar__item", 3, "kpt-menubar__item--danger", "disabled"], ["type", "button", "role", "menuitem", 1, "kpt-menubar__item", 3, "click", "disabled"]], template: function KptMenubar_Template(rf, ctx) { if (rf & 1) {
12920
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMenubar, selectors: [["kpt-menubar"]], hostAttrs: [1, "kpt-menubar-host"], inputs: { items: [1, "items"] }, outputs: { selected: "selected" }, decls: 3, vars: 0, consts: [["origin", "cdkOverlayOrigin"], ["role", "menubar", 1, "kpt-menubar"], [1, "kpt-menubar__group"], ["type", "button", "role", "menuitem", "cdkOverlayOrigin", "", 1, "kpt-menubar__top", 3, "click", "disabled"], [3, "name"], ["name", "chevron-down", 1, "kpt-menubar__caret"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "menu", 1, "kpt-menubar__dropdown"], ["role", "separator", 1, "kpt-menubar__separator"], ["type", "button", "role", "menuitem", 1, "kpt-menubar__item", 3, "kpt-menubar__item--danger", "disabled"], ["type", "button", "role", "menuitem", 1, "kpt-menubar__item", 3, "click", "disabled"]], template: function KptMenubar_Template(rf, ctx) { if (rf & 1) {
12863
12921
  i0.ɵɵelementStart(0, "nav", 1);
12864
12922
  i0.ɵɵrepeaterCreate(1, KptMenubar_For_2_Template, 8, 10, "div", 2, i0.ɵɵrepeaterTrackByIndex);
12865
12923
  i0.ɵɵelementEnd();
@@ -12923,7 +12981,7 @@ class KptMenubar {
12923
12981
  }
12924
12982
  </nav>
12925
12983
  `, host: { class: 'kpt-menubar-host' }, styles: ["@layer kpt.components{.kpt-menubar-host{display:block}.kpt-menubar{display:flex;align-items:center;gap:var(--kpt-space-1, .25rem);padding:var(--kpt-space-1, .25rem);background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem)}.kpt-menubar__group{display:inline-flex}.kpt-menubar__top{display:inline-flex;align-items:center;gap:var(--kpt-space-2, .5rem);padding:var(--kpt-space-2, .5rem) var(--kpt-space-3, .75rem);border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font-size:var(--kpt-font-size-sm, .875rem);cursor:pointer}.kpt-menubar__top:hover:not(:disabled),.kpt-menubar__top.is-open{background:var(--kpt-color-muted)}.kpt-menubar__top:disabled{opacity:.5;cursor:not-allowed}.kpt-menubar__caret{opacity:.6}.kpt-menubar__dropdown{min-width:12rem;padding:var(--kpt-space-1, .25rem);background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem);box-shadow:var(--kpt-elevation-3)}.kpt-menubar__item{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);width:100%;padding:var(--kpt-space-2, .5rem) var(--kpt-space-3, .75rem);border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font-size:var(--kpt-font-size-sm, .875rem);text-align:left;cursor:pointer}.kpt-menubar__item:hover:not(:disabled){background:var(--kpt-color-muted)}.kpt-menubar__item:disabled{opacity:.5;cursor:not-allowed}.kpt-menubar__item--danger{color:var(--kpt-color-danger)}.kpt-menubar__separator{height:1px;margin:var(--kpt-space-1, .25rem) 0;background:var(--kpt-color-border)}}\n"] }]
12926
- }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
12984
+ }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
12927
12985
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptMenubar, { className: "KptMenubar", filePath: "lib/menubar/menubar.component.ts", lineNumber: 76 }); })();
12928
12986
 
12929
12987
  const _c0$1 = () => [];
@@ -13013,13 +13071,13 @@ function KptMegamenu_ng_template_4_Template(rf, ctx) { if (rf & 1) {
13013
13071
  * `import '@angular/cdk/overlay-prebuilt.css';`
13014
13072
  *
13015
13073
  * @example
13016
- * <kpt-megamenu [items]="items" (select)="onSelect($event)" />
13074
+ * <kpt-megamenu [items]="items" (selected)="onSelect($event)" />
13017
13075
  */
13018
13076
  class KptMegamenu {
13019
13077
  constructor() {
13020
13078
  this.items = input([], /* @ts-ignore */
13021
13079
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
13022
- this.select = output();
13080
+ this.selected = output();
13023
13081
  this.openIndex = signal(null, /* @ts-ignore */
13024
13082
  ...(ngDevMode ? [{ debugName: "openIndex" }] : /* istanbul ignore next */ []));
13025
13083
  this.positions = [
@@ -13037,14 +13095,14 @@ class KptMegamenu {
13037
13095
  pick(link) {
13038
13096
  if (link.disabled)
13039
13097
  return;
13040
- this.select.emit(link);
13098
+ this.selected.emit(link);
13041
13099
  this.closeAll();
13042
13100
  }
13043
13101
  closeAll() {
13044
13102
  this.openIndex.set(null);
13045
13103
  }
13046
13104
  static { this.ɵfac = function KptMegamenu_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptMegamenu)(); }; }
13047
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMegamenu, selectors: [["kpt-megamenu"]], hostAttrs: [1, "kpt-megamenu-host"], inputs: { items: [1, "items"] }, outputs: { select: "select" }, decls: 5, vars: 4, consts: [["origin", "cdkOverlayOrigin"], ["role", "menubar", "cdkOverlayOrigin", "", 1, "kpt-megamenu"], ["type", "button", "role", "menuitem", 1, "kpt-megamenu__top", 3, "is-open"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["type", "button", "role", "menuitem", 1, "kpt-megamenu__top", 3, "click"], [3, "name"], ["name", "chevron-down", 1, "kpt-megamenu__caret"], ["role", "menu", 1, "kpt-megamenu__panel"], [1, "kpt-megamenu__column"], [1, "kpt-megamenu__col-title"], ["type", "button", 1, "kpt-megamenu__link", 3, "disabled"], ["type", "button", 1, "kpt-megamenu__link", 3, "click", "disabled"]], template: function KptMegamenu_Template(rf, ctx) { if (rf & 1) {
13105
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptMegamenu, selectors: [["kpt-megamenu"]], hostAttrs: [1, "kpt-megamenu-host"], inputs: { items: [1, "items"] }, outputs: { selected: "selected" }, decls: 5, vars: 4, consts: [["origin", "cdkOverlayOrigin"], ["role", "menubar", "cdkOverlayOrigin", "", 1, "kpt-megamenu"], ["type", "button", "role", "menuitem", 1, "kpt-megamenu__top", 3, "is-open"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["type", "button", "role", "menuitem", 1, "kpt-megamenu__top", 3, "click"], [3, "name"], ["name", "chevron-down", 1, "kpt-megamenu__caret"], ["role", "menu", 1, "kpt-megamenu__panel"], [1, "kpt-megamenu__column"], [1, "kpt-megamenu__col-title"], ["type", "button", 1, "kpt-megamenu__link", 3, "disabled"], ["type", "button", 1, "kpt-megamenu__link", 3, "click", "disabled"]], template: function KptMegamenu_Template(rf, ctx) { if (rf & 1) {
13048
13106
  i0.ɵɵelementStart(0, "nav", 1, 0);
13049
13107
  i0.ɵɵrepeaterCreate(2, KptMegamenu_For_3_Template, 5, 4, "button", 2, i0.ɵɵrepeaterTrackByIndex);
13050
13108
  i0.ɵɵelementEnd();
@@ -13102,7 +13160,7 @@ class KptMegamenu {
13102
13160
  </div>
13103
13161
  </ng-template>
13104
13162
  `, host: { class: 'kpt-megamenu-host' }, styles: ["@layer kpt.components{.kpt-megamenu-host{display:block}.kpt-megamenu{position:relative;display:flex;align-items:center;gap:var(--kpt-space-1, .25rem);padding:var(--kpt-space-1, .25rem);background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem)}.kpt-megamenu__top{display:inline-flex;align-items:center;gap:var(--kpt-space-2, .5rem);padding:var(--kpt-space-2, .5rem) var(--kpt-space-3, .75rem);border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font-size:var(--kpt-font-size-sm, .875rem);cursor:pointer}.kpt-megamenu__top:hover,.kpt-megamenu__top.is-open{background:var(--kpt-color-muted)}.kpt-megamenu__caret{opacity:.6}.kpt-megamenu__panel{display:flex;gap:var(--kpt-space-6, 1.5rem);min-width:min(40rem,90vw);padding:var(--kpt-space-4, 1rem);background:var(--kpt-color-surface-raised);border:var(--kpt-border-width-thin, 1px) solid var(--kpt-color-border);border-radius:var(--kpt-radius-md, .5rem);box-shadow:var(--kpt-elevation-3)}.kpt-megamenu__column{min-width:9rem}.kpt-megamenu__col-title{margin-bottom:var(--kpt-space-2, .5rem);font-size:var(--kpt-font-size-xs, .75rem);font-weight:var(--kpt-font-weight-semibold, 600);text-transform:uppercase;letter-spacing:.04em;color:var(--kpt-color-on-surface-muted)}.kpt-megamenu__link{display:flex;align-items:center;gap:var(--kpt-space-2, .5rem);width:100%;padding:var(--kpt-space-2, .5rem);border:0;border-radius:var(--kpt-radius-sm, .25rem);background:none;color:var(--kpt-color-on-surface);font-size:var(--kpt-font-size-sm, .875rem);text-align:left;cursor:pointer}.kpt-megamenu__link:hover:not(:disabled){background:var(--kpt-color-muted)}.kpt-megamenu__link:disabled{opacity:.5;cursor:not-allowed}}\n"] }]
13105
- }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
13163
+ }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
13106
13164
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptMegamenu, { className: "KptMegamenu", filePath: "lib/megamenu/megamenu.component.ts", lineNumber: 66 }); })();
13107
13165
 
13108
13166
  /**
@@ -13324,7 +13382,7 @@ function KptSpeedDial_Conditional_7_Template(rf, ctx) { if (rf & 1) {
13324
13382
  * Speed dial — FAB rozwijający zestaw akcji. Buduje na `kpt-fab`.
13325
13383
  *
13326
13384
  * @example
13327
- * <kpt-speed-dial [items]="actions" direction="up" (select)="onAction($event)" />
13385
+ * <kpt-speed-dial [items]="actions" direction="up" (selected)="onAction($event)" />
13328
13386
  */
13329
13387
  class KptSpeedDial {
13330
13388
  constructor() {
@@ -13337,7 +13395,7 @@ class KptSpeedDial {
13337
13395
  /** Etykieta a11y FAB (stan zamknięty); bez wartości używa i18n (`speedDial.actions`). */
13338
13396
  this.ariaLabel = input(/* @ts-ignore */
13339
13397
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13340
- this.select = output();
13398
+ this.selected = output();
13341
13399
  this.i18n = inject(KptI18n);
13342
13400
  this.effectiveAriaLabel = computed(() => this.ariaLabel() ?? this.i18n.t('speedDial.actions'), /* @ts-ignore */
13343
13401
  ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
@@ -13353,11 +13411,11 @@ class KptSpeedDial {
13353
13411
  pick(item) {
13354
13412
  if (item.disabled)
13355
13413
  return;
13356
- this.select.emit(item);
13414
+ this.selected.emit(item);
13357
13415
  this.close();
13358
13416
  }
13359
13417
  static { this.ɵfac = function KptSpeedDial_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KptSpeedDial)(); }; }
13360
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptSpeedDial, selectors: [["kpt-speed-dial"]], hostAttrs: [1, "kpt-speed-dial-host"], inputs: { items: [1, "items"], direction: [1, "direction"], icon: [1, "icon"], ariaLabel: [1, "ariaLabel"] }, outputs: { select: "select" }, decls: 8, vars: 6, consts: [[1, "kpt-speed-dial"], [1, "kpt-speed-dial__actions"], ["type", "button", 1, "kpt-speed-dial__action", 3, "disabled"], [3, "click", "ariaLabel"], [1, "kpt-speed-dial__trigger-icon"], [3, "name"], [1, "kpt-speed-dial__backdrop"], ["type", "button", 1, "kpt-speed-dial__action", 3, "click", "disabled"], [1, "kpt-speed-dial__label"], [1, "kpt-speed-dial__backdrop", 3, "click"]], template: function KptSpeedDial_Template(rf, ctx) { if (rf & 1) {
13418
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KptSpeedDial, selectors: [["kpt-speed-dial"]], hostAttrs: [1, "kpt-speed-dial-host"], inputs: { items: [1, "items"], direction: [1, "direction"], icon: [1, "icon"], ariaLabel: [1, "ariaLabel"] }, outputs: { selected: "selected" }, decls: 8, vars: 6, consts: [[1, "kpt-speed-dial"], [1, "kpt-speed-dial__actions"], ["type", "button", 1, "kpt-speed-dial__action", 3, "disabled"], [3, "click", "ariaLabel"], [1, "kpt-speed-dial__trigger-icon"], [3, "name"], [1, "kpt-speed-dial__backdrop"], ["type", "button", 1, "kpt-speed-dial__action", 3, "click", "disabled"], [1, "kpt-speed-dial__label"], [1, "kpt-speed-dial__backdrop", 3, "click"]], template: function KptSpeedDial_Template(rf, ctx) { if (rf & 1) {
13361
13419
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
13362
13420
  i0.ɵɵrepeaterCreate(2, KptSpeedDial_For_3_Template, 3, 4, "button", 2, i0.ɵɵrepeaterTrackByIndex);
13363
13421
  i0.ɵɵelementEnd();
@@ -13398,7 +13456,7 @@ class KptSpeedDial {
13398
13456
  </div>
13399
13457
  @if (open()) { <div class="kpt-speed-dial__backdrop" (click)="close()"></div> }
13400
13458
  `, host: { class: 'kpt-speed-dial-host' }, styles: ["@layer kpt.components{.kpt-speed-dial-host{display:inline-block}.kpt-speed-dial{position:relative;display:inline-flex;z-index:calc(var(--kpt-z-overlay, 1000) + 1)}.kpt-speed-dial__trigger-icon{display:inline-flex;transition:transform .2s ease}.kpt-speed-dial.is-open .kpt-speed-dial__trigger-icon{transform:rotate(45deg)}.kpt-speed-dial__actions{position:absolute;display:flex;gap:var(--kpt-space-2, .5rem);opacity:0;pointer-events:none;transition:opacity .15s ease}.kpt-speed-dial.is-open .kpt-speed-dial__actions{opacity:1;pointer-events:auto}.kpt-speed-dial[data-direction=up] .kpt-speed-dial__actions{flex-direction:column-reverse;bottom:calc(100% + .5rem);left:50%;transform:translate(-50%)}.kpt-speed-dial[data-direction=down] .kpt-speed-dial__actions{flex-direction:column;top:calc(100% + .5rem);left:50%;transform:translate(-50%)}.kpt-speed-dial[data-direction=left] .kpt-speed-dial__actions{flex-direction:row-reverse;right:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.kpt-speed-dial[data-direction=right] .kpt-speed-dial__actions{flex-direction:row;left:calc(100% + .5rem);top:50%;transform:translateY(-50%)}.kpt-speed-dial__action{display:inline-flex;align-items:center;gap:var(--kpt-space-2, .5rem);height:2.5rem;padding-inline:var(--kpt-space-3, .75rem);border:0;border-radius:999px;background:var(--kpt-color-surface-raised);color:var(--kpt-color-on-surface);box-shadow:var(--kpt-elevation-2);cursor:pointer;white-space:nowrap}.kpt-speed-dial__action:hover:not(:disabled){background:var(--kpt-color-muted)}.kpt-speed-dial__action:disabled{opacity:.5;cursor:not-allowed}.kpt-speed-dial__label{font-size:var(--kpt-font-size-sm, .875rem)}.kpt-speed-dial__backdrop{position:fixed;inset:0;z-index:var(--kpt-z-overlay, 1000)}}\n"] }]
13401
- }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], select: [{ type: i0.Output, args: ["select"] }] }); })();
13459
+ }], null, { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], selected: [{ type: i0.Output, args: ["selected"] }] }); })();
13402
13460
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KptSpeedDial, { className: "KptSpeedDial", filePath: "lib/speed-dial/speed-dial.component.ts", lineNumber: 39 }); })();
13403
13461
 
13404
13462
  /*