@konce-pt/angular 0.6.1 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +384 -0
  2. package/README.md +38 -19
  3. package/fesm2022/konce-pt-angular-charts.mjs +1409 -0
  4. package/fesm2022/konce-pt-angular-charts.mjs.map +1 -0
  5. package/fesm2022/konce-pt-angular-grid.mjs +232 -0
  6. package/{dist/fesm2022 → fesm2022}/konce-pt-angular-grid.mjs.map +1 -1
  7. package/fesm2022/konce-pt-angular-map.mjs +4568 -0
  8. package/fesm2022/konce-pt-angular-map.mjs.map +1 -0
  9. package/fesm2022/konce-pt-angular-roadmap.mjs +1919 -0
  10. package/fesm2022/konce-pt-angular-roadmap.mjs.map +1 -0
  11. package/fesm2022/konce-pt-angular.mjs +12307 -0
  12. package/fesm2022/konce-pt-angular.mjs.map +1 -0
  13. package/map/src/lib/llms.txt +741 -0
  14. package/package.json +44 -54
  15. package/roadmap/src/lib/llms.txt +112 -0
  16. package/src/lib/app-shell/llms.txt +89 -0
  17. package/src/lib/breakpoint/llms.txt +45 -0
  18. package/{dist/src → src}/lib/datepicker/llms.txt +3 -0
  19. package/src/lib/dialog/llms.txt +68 -0
  20. package/{dist/src → src}/lib/form-field/llms.txt +24 -1
  21. package/{dist/src → src}/lib/icon/llms.txt +2 -1
  22. package/{dist/src → src}/lib/input/llms.txt +14 -4
  23. package/src/lib/input-number/llms.txt +61 -0
  24. package/{dist/src → src}/lib/select/llms.txt +9 -0
  25. package/src/lib/sidenav/llms.txt +29 -0
  26. package/src/lib/toolbar/llms.txt +31 -0
  27. package/src/lib/tooltip/llms.txt +33 -0
  28. package/{dist/types → types}/konce-pt-angular-charts.d.ts +1 -0
  29. package/types/konce-pt-angular-charts.d.ts.map +1 -0
  30. package/{dist/types → types}/konce-pt-angular-grid.d.ts +1 -0
  31. package/types/konce-pt-angular-grid.d.ts.map +1 -0
  32. package/{dist/types → types}/konce-pt-angular-icons.d.ts +1 -0
  33. package/types/konce-pt-angular-icons.d.ts.map +1 -0
  34. package/types/konce-pt-angular-map.d.ts +1585 -0
  35. package/types/konce-pt-angular-map.d.ts.map +1 -0
  36. package/types/konce-pt-angular-roadmap.d.ts +649 -0
  37. package/types/konce-pt-angular-roadmap.d.ts.map +1 -0
  38. package/{dist/types → types}/konce-pt-angular.d.ts +373 -23
  39. package/types/konce-pt-angular.d.ts.map +1 -0
  40. package/dist/LICENSE +0 -21
  41. package/dist/README.md +0 -316
  42. package/dist/fesm2022/konce-pt-angular-charts.mjs +0 -957
  43. package/dist/fesm2022/konce-pt-angular-charts.mjs.map +0 -1
  44. package/dist/fesm2022/konce-pt-angular-grid.mjs +0 -218
  45. package/dist/fesm2022/konce-pt-angular.mjs +0 -8462
  46. package/dist/fesm2022/konce-pt-angular.mjs.map +0 -1
  47. package/dist/package.json +0 -79
  48. package/dist/src/lib/app-shell/llms.txt +0 -29
  49. package/dist/src/lib/dialog/llms.txt +0 -27
  50. package/dist/src/lib/input-number/llms.txt +0 -17
  51. package/dist/src/lib/sidenav/llms.txt +0 -20
  52. package/dist/src/lib/toolbar/llms.txt +0 -23
  53. package/dist/src/lib/tooltip/llms.txt +0 -19
  54. /package/{dist/charts → charts}/src/lib/llms.txt +0 -0
  55. /package/{dist/fesm2022 → fesm2022}/konce-pt-angular-icons.mjs +0 -0
  56. /package/{dist/fesm2022 → fesm2022}/konce-pt-angular-icons.mjs.map +0 -0
  57. /package/{dist/grid → grid}/src/lib/llms.txt +0 -0
  58. /package/{dist/src → src}/lib/accordion/llms.txt +0 -0
  59. /package/{dist/src → src}/lib/alert/llms.txt +0 -0
  60. /package/{dist/src → src}/lib/autocomplete/llms.txt +0 -0
  61. /package/{dist/src → src}/lib/avatar/llms.txt +0 -0
  62. /package/{dist/src → src}/lib/avatar-group/llms.txt +0 -0
  63. /package/{dist/src → src}/lib/badge/llms.txt +0 -0
  64. /package/{dist/src → src}/lib/bottom-sheet/llms.txt +0 -0
  65. /package/{dist/src → src}/lib/breadcrumb/llms.txt +0 -0
  66. /package/{dist/src → src}/lib/button/llms.txt +0 -0
  67. /package/{dist/src → src}/lib/button-group/llms.txt +0 -0
  68. /package/{dist/src → src}/lib/card/llms.txt +0 -0
  69. /package/{dist/src → src}/lib/carousel/llms.txt +0 -0
  70. /package/{dist/src → src}/lib/checkbox/llms.txt +0 -0
  71. /package/{dist/src → src}/lib/chip/llms.txt +0 -0
  72. /package/{dist/src → src}/lib/chips-input/llms.txt +0 -0
  73. /package/{dist/src → src}/lib/color-picker/llms.txt +0 -0
  74. /package/{dist/src → src}/lib/confirm/llms.txt +0 -0
  75. /package/{dist/src → src}/lib/context-menu/llms.txt +0 -0
  76. /package/{dist/src → src}/lib/data-table/llms.txt +0 -0
  77. /package/{dist/src → src}/lib/data-view/llms.txt +0 -0
  78. /package/{dist/src → src}/lib/date-range/llms.txt +0 -0
  79. /package/{dist/src → src}/lib/divider/llms.txt +0 -0
  80. /package/{dist/src → src}/lib/drawer/llms.txt +0 -0
  81. /package/{dist/src → src}/lib/empty/llms.txt +0 -0
  82. /package/{dist/src → src}/lib/fab/llms.txt +0 -0
  83. /package/{dist/src → src}/lib/fieldset/llms.txt +0 -0
  84. /package/{dist/src → src}/lib/file-upload/llms.txt +0 -0
  85. /package/{dist/src → src}/lib/galleria/llms.txt +0 -0
  86. /package/{dist/src → src}/lib/i18n/llms.txt +0 -0
  87. /package/{dist/src → src}/lib/icon-button/llms.txt +0 -0
  88. /package/{dist/src → src}/lib/image/llms.txt +0 -0
  89. /package/{dist/src → src}/lib/input-mask/llms.txt +0 -0
  90. /package/{dist/src → src}/lib/input-otp/llms.txt +0 -0
  91. /package/{dist/src → src}/lib/knob/llms.txt +0 -0
  92. /package/{dist/src → src}/lib/listbox/llms.txt +0 -0
  93. /package/{dist/src → src}/lib/megamenu/llms.txt +0 -0
  94. /package/{dist/src → src}/lib/menu/llms.txt +0 -0
  95. /package/{dist/src → src}/lib/menubar/llms.txt +0 -0
  96. /package/{dist/src → src}/lib/meter-group/llms.txt +0 -0
  97. /package/{dist/src → src}/lib/order-list/llms.txt +0 -0
  98. /package/{dist/src → src}/lib/paginator/llms.txt +0 -0
  99. /package/{dist/src → src}/lib/panel/llms.txt +0 -0
  100. /package/{dist/src → src}/lib/password/llms.txt +0 -0
  101. /package/{dist/src → src}/lib/pick-list/llms.txt +0 -0
  102. /package/{dist/src → src}/lib/popover/llms.txt +0 -0
  103. /package/{dist/src → src}/lib/progress/llms.txt +0 -0
  104. /package/{dist/src → src}/lib/radio-group/llms.txt +0 -0
  105. /package/{dist/src → src}/lib/rating/llms.txt +0 -0
  106. /package/{dist/src → src}/lib/rich-text/llms.txt +0 -0
  107. /package/{dist/src → src}/lib/scroll-top/llms.txt +0 -0
  108. /package/{dist/src → src}/lib/skeleton/llms.txt +0 -0
  109. /package/{dist/src → src}/lib/slider/llms.txt +0 -0
  110. /package/{dist/src → src}/lib/speed-dial/llms.txt +0 -0
  111. /package/{dist/src → src}/lib/spinner/llms.txt +0 -0
  112. /package/{dist/src → src}/lib/split-button/llms.txt +0 -0
  113. /package/{dist/src → src}/lib/splitter/llms.txt +0 -0
  114. /package/{dist/src → src}/lib/stepper/llms.txt +0 -0
  115. /package/{dist/src → src}/lib/switch/llms.txt +0 -0
  116. /package/{dist/src → src}/lib/switch-group/llms.txt +0 -0
  117. /package/{dist/src → src}/lib/tabs/llms.txt +0 -0
  118. /package/{dist/src → src}/lib/textarea/llms.txt +0 -0
  119. /package/{dist/src → src}/lib/timeline/llms.txt +0 -0
  120. /package/{dist/src → src}/lib/toast/llms.txt +0 -0
  121. /package/{dist/src → src}/lib/tree/llms.txt +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"konce-pt-angular-roadmap.mjs","sources":["../../roadmap/src/core/calendar.ts","../../roadmap/src/core/scale.ts","../../roadmap/src/core/auto-range.ts","../../roadmap/src/core/layout.ts","../../roadmap/src/core/links.ts","../../roadmap/src/core/timeline.ts","../../roadmap/src/lib/roadmap.component.html","../../roadmap/src/lib/roadmap.component.ts","../../roadmap/src/public-api.ts","../../roadmap/src/konce-pt-angular-roadmap.ts"],"sourcesContent":["/*\n * Arytmetyka kalendarzowa w czasie LOKALNYM, odporna na zmianę czasu (DST).\n *\n * Roadmapa jest narzędziem planistycznym — użytkownik myśli zegarem ściennym,\n * więc wszystkie obliczenia idą po lokalnych polach daty.\n *\n * ZASADA: nigdy nie dodajemy milisekund. `t + 86_400_000` na 2026-03-29 00:00 CET\n * daje 2026-03-30 01:00 (dryf kumulatywny), a na 2026-10-25 daje tę samą datę\n * dwa razy. Zamiast tego iterujemy po polach `Date` (`setDate`, `setHours`),\n * bo one normalizują wynik do lokalnego zegara ściennego.\n *\n * Wszystkie różnice dni/tygodni liczymy przez `Math.round`, nigdy `floor`/`ceil`:\n * doba DST to 0.958 albo 1.042 doby, a `round` te odchyłki pochłania.\n */\n\nimport type { KptDateInput, KptRoadmapZoom } from './types';\n\nconst MS_DAY = 86_400_000;\nconst MS_WEEK = 604_800_000;\nconst MS_HOUR = 3_600_000;\n\n/** Normalizuje dowolne wejście daty do epoch ms. Zwraca NaN dla wartości nieparsowalnych. */\nexport function toTimestamp(value: KptDateInput): number {\n if (typeof value === 'number') return value;\n if (value instanceof Date) return value.getTime();\n return new Date(value).getTime();\n}\n\n/** Kopia obiektu Date — nigdy nie mutujemy argumentów. */\nfunction clone(date: Date): Date {\n return new Date(date);\n}\n\n/**\n * Początek lokalnej doby.\n *\n * Guard: w strefach, gdzie przejście DST wypada o północy (np. America/Santiago),\n * `setHours(0, …)` potrafi wylądować w dobie poprzedniej — wtedy korygujemy\n * o jedną dobę w przód.\n */\nexport function startOfDay(date: Date): Date {\n const result = clone(date);\n result.setHours(0, 0, 0, 0);\n if (result.getDate() !== date.getDate() || result.getMonth() !== date.getMonth()) {\n result.setTime(date.getTime());\n result.setHours(0, 0, 0, 0);\n if (result.getTime() < date.getTime() - MS_DAY) result.setDate(result.getDate() + 1);\n }\n return result;\n}\n\n/** Dodaje `n` dób kalendarzowych, zachowując godzinę ścienną (DST-safe). */\nexport function addDays(date: Date, n: number): Date {\n const result = clone(date);\n result.setDate(result.getDate() + n);\n return result;\n}\n\n/** Dodaje `n` godzin ściennych. Godzina nieistniejąca (wiosna) normalizuje się w przód. */\nexport function addHours(date: Date, n: number): Date {\n const result = clone(date);\n result.setHours(result.getHours() + n);\n return result;\n}\n\n/** Liczba dni w miesiącu (`month` 0-indeksowany). */\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Dodaje `n` miesięcy z przycięciem dnia (31 stycznia + 1 miesiąc = 28/29 lutego). */\nexport function addMonths(date: Date, n: number): Date {\n const result = clone(date);\n const day = result.getDate();\n result.setDate(1);\n result.setMonth(result.getMonth() + n);\n result.setDate(Math.min(day, daysInMonth(result.getFullYear(), result.getMonth())));\n return result;\n}\n\n/**\n * Różnica w pełnych dobach kalendarzowych.\n * `Math.round` jest konieczny: doba DST ma 23 h (0.958) albo 25 h (1.042),\n * więc `Math.floor` gubiłby jeden dzień dwa razy w roku.\n */\nexport function diffDays(a: Date, b: Date): number {\n return Math.round((startOfDay(b).getTime() - startOfDay(a).getTime()) / MS_DAY);\n}\n\n/** Czy obie daty wypadają w tej samej lokalnej dobie? */\nexport function isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\n// ──────────────────────────────────────────────────────────────────── ISO 8601\n\n/**\n * Dzień tygodnia wg ISO 8601: 1 = poniedziałek … 7 = niedziela.\n * `Date#getDay()` zwraca 0 dla niedzieli, stąd przesunięcie.\n */\nexport function isoWeekday(date: Date): number {\n return ((date.getDay() + 6) % 7) + 1;\n}\n\n/** Poniedziałek tygodnia ISO zawierającego `date` (początek doby). */\nexport function startOfIsoWeek(date: Date): Date {\n const day = startOfDay(date);\n return startOfDay(addDays(day, -(isoWeekday(day) - 1)));\n}\n\n/**\n * Czwartek tygodnia ISO zawierającego `date`.\n *\n * Czwartek jest kotwicą ISO: rok czwartka to rok tygodnia, a odległość między\n * czwartkami dwóch tygodni to zawsze dokładnie N tygodni.\n */\nfunction isoThursday(date: Date): Date {\n const day = startOfDay(date);\n return startOfDay(addDays(day, 4 - isoWeekday(day)));\n}\n\n/**\n * Rok tygodnia ISO 8601 — bywa różny od `getFullYear()` na przełomie roku.\n * Przykłady: 2025-12-29 → 2026 (tydzień 1), 2027-01-03 → 2026 (tydzień 53).\n */\nexport function isoWeekYear(date: Date): number {\n return isoThursday(date).getFullYear();\n}\n\n/**\n * Numer tygodnia ISO 8601 (1..53).\n * Tydzień zaczyna się w poniedziałek, a tydzień 1 to ten, który zawiera pierwszy\n * czwartek roku (równoważnie: zawiera 4 stycznia).\n *\n * `Math.round` jest tu krytyczny: przy DST różnica dwóch północy to 7 dni ±1 h\n * (6.994 / 7.006), więc `Math.floor` zaniżałby numer tygodnia przez pół roku.\n */\nexport function isoWeekNumber(date: Date): number {\n const thursday = isoThursday(date);\n const jan4 = new Date(thursday.getFullYear(), 0, 4);\n const firstThursday = isoThursday(jan4);\n return 1 + Math.round((thursday.getTime() - firstThursday.getTime()) / MS_WEEK);\n}\n\n/** Liczba tygodni ISO w danym roku tygodniowym (52 albo 53). */\nexport function isoWeeksInYear(weekYear: number): number {\n // 28 grudnia zawsze leży w ostatnim tygodniu ISO danego roku.\n return isoWeekNumber(new Date(weekYear, 11, 28));\n}\n\n// ─────────────────────────────────────────────────── zaokrąglanie do jednostki\n\n/** Początek jednostki zoomu zawierającej `date` (w dół). */\nexport function floorToUnit(date: Date, zoom: KptRoadmapZoom): Date {\n const result = clone(date);\n switch (zoom) {\n case 'hour':\n result.setMinutes(0, 0, 0);\n return result;\n case 'day':\n return startOfDay(result);\n case 'week':\n return startOfIsoWeek(result);\n case 'month':\n result.setDate(1);\n return startOfDay(result);\n case 'quarter':\n result.setMonth(Math.floor(result.getMonth() / 3) * 3, 1);\n return startOfDay(result);\n case 'year':\n result.setMonth(0, 1);\n return startOfDay(result);\n }\n}\n\n/** Dodaje `n` jednostek zoomu (DST-safe — po polach daty, nie po ms). */\nexport function addUnits(date: Date, zoom: KptRoadmapZoom, n: number): Date {\n switch (zoom) {\n case 'hour':\n return addHours(date, n);\n case 'day':\n return addDays(date, n);\n case 'week':\n return addDays(date, n * 7);\n case 'month':\n return addMonths(date, n);\n case 'quarter':\n return addMonths(date, n * 3);\n case 'year':\n return addMonths(date, n * 12);\n }\n}\n\n/** Początek następnej jednostki zoomu; bez zmian, gdy `date` już leży na granicy. */\nexport function ceilToUnit(date: Date, zoom: KptRoadmapZoom): Date {\n const floored = floorToUnit(date, zoom);\n if (floored.getTime() === date.getTime()) return floored;\n return addUnits(floored, zoom, 1);\n}\n\n/**\n * Liczba pełnych jednostek zoomu między dwiema granicami (DST-safe).\n * Dla 'hour' liczymy wprost po ms — doba DST po prostu ma 23 albo 25 godzin\n * i tyle właśnie powinno powstać kolumn.\n */\nexport function countUnits(start: Date, end: Date, zoom: KptRoadmapZoom): number {\n switch (zoom) {\n case 'hour':\n return Math.round((end.getTime() - start.getTime()) / MS_HOUR);\n case 'day':\n return diffDays(start, end);\n case 'week':\n return Math.round(diffDays(start, end) / 7);\n case 'month':\n return (end.getFullYear() - start.getFullYear()) * 12 + (end.getMonth() - start.getMonth());\n case 'quarter':\n return Math.round(((end.getFullYear() - start.getFullYear()) * 12 + (end.getMonth() - start.getMonth())) / 3);\n case 'year':\n return end.getFullYear() - start.getFullYear();\n }\n}\n\n/** Numer kwartału (1..4) dla danej daty. */\nexport function quarterOf(date: Date): number {\n return Math.floor(date.getMonth() / 3) + 1;\n}\n","/*\n * Skalowanie liniowe i pomocniki liczbowe.\n *\n * `linearScale` i `extent` są celowo zduplikowane z `charts/src/core/scale.ts`\n * (ten sam kontrakt): import między subpathami tworzyłby twardą zależność\n * `roadmap → charts` dla kilkunastu linii kodu.\n */\n\n/** Zakres [min, max] tablicy liczb (0..0 dla pustej). */\nexport function extent(values: readonly number[]): [number, number] {\n if (values.length === 0) return [0, 0];\n let min = values[0];\n let max = values[0];\n for (const v of values) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return [min, max];\n}\n\n/** Interpolacja liniowa domeny → zakresu (np. czas → udział 0..1). */\nexport function linearScale(\n domainMin: number,\n domainMax: number,\n rangeMin: number,\n rangeMax: number,\n): (value: number) => number {\n const dSpan = domainMax - domainMin || 1;\n const rSpan = rangeMax - rangeMin;\n return (value: number) => rangeMin + ((value - domainMin) / dSpan) * rSpan;\n}\n\n/** Ogranicza wartość do przedziału [min, max]. */\nexport function clamp(value: number, min: number, max: number): number {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n}\n\n/**\n * Skraca liczbę na potrzeby atrybutu `d` ścieżki SVG.\n * Odpowiednik prywatnego `n()` z `charts/src/core/bar.ts` — trzyma ścieżki krótkie.\n */\nexport function svgNum(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(3);\n}\n","/*\n * Wyznaczanie zakresu osi czasu z danych.\n *\n * Krańce zawsze wyrównujemy na zewnątrz do granicy jednostki zoomu, żeby\n * pierwsza i ostatnia kolumna nie były ucięte w połowie.\n */\n\nimport { addUnits, ceilToUnit, countUnits, floorToUnit, toTimestamp } from './calendar';\nimport { extent } from './scale';\nimport type { KptRoadmapConfig, KptRoadmapItem, KptRoadmapNormalizedItem, KptRoadmapZoom, KptTimeRange } from './types';\n\n/** Margines po obu stronach danych, w jednostkach zoomu. */\nconst DEFAULT_PAD: Record<KptRoadmapZoom, number> = {\n hour: 2,\n day: 2,\n week: 1,\n month: 1,\n quarter: 1,\n year: 0,\n};\n\n/** Minimalna szerokość osi, w jednostkach zoomu — żeby jeden item nie dał jednej kolumny. */\nconst DEFAULT_MIN: Record<KptRoadmapZoom, number> = {\n hour: 12,\n day: 14,\n week: 8,\n month: 6,\n quarter: 4,\n year: 3,\n};\n\nexport interface KptAutoRangeOptions {\n zoom: KptRoadmapZoom;\n /** Margines po obu stronach w jednostkach zoomu. */\n padUnits?: number;\n /** Minimalna szerokość osi w jednostkach zoomu. */\n minUnits?: number;\n /** Czy zakres ma zawsze obejmować „dziś\". Domyślnie true. */\n includeToday?: boolean;\n today?: number;\n}\n\n/** Zbiera skrajne wartości czasu z itemów, pomijając wpisy z niepoprawną datą. */\nfunction collectBounds(items: readonly KptRoadmapItem[]): number[] {\n const bounds: number[] = [];\n for (const item of items) {\n const start = toTimestamp(item.start);\n if (!Number.isFinite(start)) continue;\n const end = item.end !== undefined ? toTimestamp(item.end) : start;\n bounds.push(start, Number.isFinite(end) ? end : start);\n }\n return bounds;\n}\n\n/**\n * Zakres osi wyliczony z danych: min(start)…max(end) powiększony o margines\n * i wyrównany do granic jednostki zoomu.\n * Dla pustej listy zwraca okno wokół „dziś\" o szerokości `minUnits`.\n */\nexport function autoRange(items: readonly KptRoadmapItem[], opts: KptAutoRangeOptions): KptTimeRange {\n const { zoom } = opts;\n const pad = opts.padUnits ?? DEFAULT_PAD[zoom];\n const minUnits = opts.minUnits ?? DEFAULT_MIN[zoom];\n const todayTs = opts.today ?? Date.now();\n\n const bounds = collectBounds(items);\n if ((opts.includeToday ?? true) && bounds.length > 0) bounds.push(todayTs);\n\n const [min, max] = bounds.length > 0 ? extent(bounds) : [todayTs, todayTs];\n\n // Margines dodajemy po polach daty (DST-safe), nie przez arytmetykę na ms.\n let start = floorToUnit(addUnits(new Date(min), zoom, -pad), zoom);\n let end = ceilToUnit(addUnits(new Date(max), zoom, pad), zoom);\n\n // Dociągnięcie do minimalnej szerokości — symetrycznie, zaczynając od prawej.\n let units = countUnits(start, end, zoom);\n while (units < minUnits) {\n end = addUnits(end, zoom, 1);\n units++;\n if (units < minUnits) {\n start = addUnits(start, zoom, -1);\n units++;\n }\n }\n\n return { start: start.getTime(), end: end.getTime() };\n}\n\n/**\n * Ostateczny zakres osi. `config.range` ma priorytet, a brakujący kraniec\n * uzupełniamy z `autoRange`. Wynik zawsze leży na granicach jednostki zoomu.\n */\nexport function resolveRange(\n config: Pick<KptRoadmapConfig, 'range' | 'zoom' | 'today' | 'timeline'>,\n items: readonly (KptRoadmapItem | KptRoadmapNormalizedItem)[],\n): KptTimeRange {\n const zoom = config.zoom ?? 'week';\n const todaySource = config.today ?? config.timeline?.today;\n const today = todaySource !== undefined ? toTimestamp(todaySource) : Date.now();\n\n // `KptRoadmapNormalizedItem` niesie oryginał w `source` — sprowadzamy oba kształty\n // do postaci akceptowanej przez `autoRange`.\n const raw = items.map((item) => ('source' in item ? item.source : item));\n const auto = autoRange(raw, { zoom, today });\n\n const startTs = config.range?.start ?? auto.start;\n const endTs = config.range?.end ?? auto.end;\n\n const start = floorToUnit(new Date(startTs), zoom);\n let end = ceilToUnit(new Date(endTs), zoom);\n // Zakres musi obejmować co najmniej jedną kolumnę.\n if (end.getTime() <= start.getTime()) end = addUnits(start, zoom, 1);\n\n return { start: start.getTime(), end: end.getTime() };\n}\n","/*\n * Układ wierszy: normalizacja itemów, spłaszczenie grup do listy wierszy\n * renderowalnych, przydział pasów przy nakładaniu się zadań i wirtualizacja.\n *\n * Offset pionowy (`top`) liczymy tutaj, dzięki czemu warstwa widoku pozycjonuje\n * wiersze absolutnie, a wirtualizacja sprowadza się do wycięcia podlisty —\n * bez elementów dystansowych i z obsługą wierszy o różnej wysokości.\n */\n\nimport { toTimestamp } from './calendar';\nimport type {\n KptRoadmapGroup,\n KptRoadmapItem,\n KptRoadmapNormalizedItem,\n KptRoadmapRowOptions,\n KptTimeRange,\n} from './types';\n\nexport type KptRoadmapRowKind = 'group' | 'item';\n\n/** Item osadzony w konkretnym wierszu i pasie. */\nexport interface KptRoadmapPlacedItem<TMeta = unknown> extends KptRoadmapNormalizedItem<TMeta> {\n /** Indeks pasa w obrębie wiersza (0 przy trybie 'row-per-item'). */\n lane: number;\n rowKey: string;\n}\n\n/** Wyliczony agregat grupy. */\nexport interface KptRoadmapGroupState {\n collapsed: boolean;\n /** Liczba itemów należących do grupy. */\n itemCount: number;\n /** Zakres zbiorczy (null, gdy grupa pusta). */\n span: KptTimeRange | null;\n /** Postęp ważony czasem trwania, 0..1 (null, gdy żaden item go nie podaje). */\n progress: number | null;\n}\n\n/** Wiersz renderowalny — jednostka wirtualizacji. */\nexport interface KptRoadmapRow<TItem = unknown, TGroup = unknown> {\n key: string;\n kind: KptRoadmapRowKind;\n /** Indeks w spłaszczonej liście widocznych wierszy. */\n index: number;\n /** Poziom zagnieżdżenia — wcięcie w kolumnie etykiet. */\n depth: number;\n /** Offset od góry w px (skumulowany). */\n top: number;\n height: number;\n /** Liczba pasów (>1 tylko w trybie 'pack'). */\n laneCount: number;\n /** Wypełnione dla `kind === 'group'`. */\n group?: KptRoadmapGroup<TGroup>;\n groupState?: KptRoadmapGroupState;\n /** Wypełnione dla `kind === 'item'`. */\n items: readonly KptRoadmapPlacedItem<TItem>[];\n}\n\n/** Wpis odrzucony przy normalizacji — do ostrzeżeń w trybie deweloperskim. */\nexport interface KptRoadmapInvalidItem {\n id: string;\n reason: string;\n}\n\nexport interface KptRoadmapLayout<TItem = unknown, TGroup = unknown> {\n rows: readonly KptRoadmapRow<TItem, TGroup>[];\n /** Łączna wysokość w px. */\n totalHeight: number;\n /** Wszystkie znormalizowane itemy po `id` — także te w zwiniętych grupach. */\n byId: ReadonlyMap<string, KptRoadmapNormalizedItem<TItem>>;\n /** Mapa `itemId → rowKey` dla itemów widocznych. */\n rowOfItem: ReadonlyMap<string, string>;\n /** Itemy odrzucone (zła data, duplikat `id`). */\n invalid: readonly KptRoadmapInvalidItem[];\n}\n\nconst DEFAULT_ITEM_HEIGHT = 44;\nconst DEFAULT_GROUP_HEIGHT = 38;\nconst DEFAULT_LANE_HEIGHT = 28;\n\n/**\n * Normalizuje itemy: daty na ms, brak `end` oznacza kamień milowy.\n * Odrzuca wpisy z nieparsowalną datą oraz duplikaty `id`.\n */\nexport function normalizeItems<T>(items: readonly KptRoadmapItem<T>[]): {\n valid: KptRoadmapNormalizedItem<T>[];\n invalid: KptRoadmapInvalidItem[];\n} {\n const valid: KptRoadmapNormalizedItem<T>[] = [];\n const invalid: KptRoadmapInvalidItem[] = [];\n const seen = new Set<string>();\n\n for (const item of items) {\n if (!item.id) {\n invalid.push({ id: String(item.label ?? '?'), reason: 'brak id' });\n continue;\n }\n if (seen.has(item.id)) {\n invalid.push({ id: item.id, reason: 'zduplikowane id' });\n continue;\n }\n\n const start = toTimestamp(item.start);\n if (!Number.isFinite(start)) {\n invalid.push({ id: item.id, reason: 'niepoprawna data początkowa' });\n continue;\n }\n\n const rawEnd = item.end !== undefined ? toTimestamp(item.end) : start;\n if (!Number.isFinite(rawEnd)) {\n invalid.push({ id: item.id, reason: 'niepoprawna data końcowa' });\n continue;\n }\n\n // Odwrócony zakres prostujemy zamiast odrzucać — dane bywają brudne.\n const from = Math.min(start, rawEnd);\n const to = Math.max(start, rawEnd);\n const isMilestone = item.milestone === true || item.end === undefined || from === to;\n\n seen.add(item.id);\n valid.push({\n source: item,\n id: item.id,\n start: from,\n end: isMilestone ? from : to,\n isMilestone,\n durationMs: isMilestone ? 0 : to - from,\n });\n }\n\n return { valid, invalid };\n}\n\n/** Zakres zbiorczy listy itemów: min(start)…max(end). */\nexport function spanOf(items: readonly KptRoadmapNormalizedItem[]): KptTimeRange | null {\n if (items.length === 0) return null;\n let start = items[0].start;\n let end = items[0].end;\n for (const item of items) {\n if (item.start < start) start = item.start;\n if (item.end > end) end = item.end;\n }\n return { start, end };\n}\n\n/**\n * Postęp grupy ważony czasem trwania.\n * Kamienie milowe mają zerową długość, więc liczymy je z wagą 1.\n */\nexport function rollupProgress(items: readonly KptRoadmapNormalizedItem[]): number | null {\n let weightSum = 0;\n let progressSum = 0;\n let any = false;\n\n for (const item of items) {\n const progress = item.source.progress;\n if (progress === undefined) continue;\n any = true;\n const weight = item.isMilestone ? 1 : Math.max(1, item.durationMs);\n weightSum += weight;\n progressSum += weight * Math.min(1, Math.max(0, progress));\n }\n\n return any && weightSum > 0 ? progressSum / weightSum : null;\n}\n\n/**\n * Zachłanne przydzielanie pasów (interval partitioning).\n * Itemy sortujemy po czasie startu i wkładamy do pierwszego pasa, w którym\n * poprzednie zadanie zdążyło się skończyć. Zwraca liczbę użytych pasów.\n */\nexport function packLanes(items: KptRoadmapPlacedItem[], minGapMs = 0): number {\n const sorted = [...items].sort((a, b) => a.start - b.start || a.end - b.end);\n /** Ostatni zajęty koniec dla każdego pasa. */\n const laneEnd: number[] = [];\n\n for (const item of sorted) {\n const to = Math.max(item.end, item.start);\n let lane = laneEnd.findIndex((end) => end + minGapMs <= item.start);\n if (lane === -1) {\n lane = laneEnd.length;\n laneEnd.push(to);\n } else {\n laneEnd[lane] = to;\n }\n item.lane = lane;\n }\n\n return Math.max(1, laneEnd.length);\n}\n\n/** Głębokość grupy w drzewie `parentId` (z zabezpieczeniem przed cyklem). */\nfunction groupDepth(group: KptRoadmapGroup, byId: Map<string, KptRoadmapGroup>): number {\n let depth = 0;\n let current = group.parentId;\n const guard = new Set<string>([group.id]);\n while (current && !guard.has(current)) {\n guard.add(current);\n depth++;\n current = byId.get(current)?.parentId;\n }\n return depth;\n}\n\n/** Czy któryś z przodków grupy jest zwinięty? */\nfunction hasCollapsedAncestor(\n group: KptRoadmapGroup,\n byId: Map<string, KptRoadmapGroup>,\n collapsed: ReadonlySet<string>,\n): boolean {\n let current = group.parentId;\n const guard = new Set<string>([group.id]);\n while (current && !guard.has(current)) {\n if (collapsed.has(current)) return true;\n guard.add(current);\n current = byId.get(current)?.parentId;\n }\n return false;\n}\n\n/**\n * Spłaszcza grupy i itemy do listy wierszy renderowalnych.\n *\n * Kolejność: grupy w kolejności podanej przez użytkownika, wewnątrz itemy\n * posortowane po czasie startu, na końcu itemy bez `groupId`. Zwinięta grupa\n * nie emituje wierszy potomnych, ale jej zakres zbiorczy nadal obejmuje dzieci.\n *\n * @param collapsed zbiór `id` grup zwiniętych (stan trzymany w sygnale komponentu)\n */\nexport function buildRows<TItem, TGroup>(\n items: readonly KptRoadmapItem<TItem>[],\n groups: readonly KptRoadmapGroup<TGroup>[] | undefined,\n collapsed: ReadonlySet<string>,\n opts?: KptRoadmapRowOptions,\n): KptRoadmapLayout<TItem, TGroup> {\n const mode = opts?.mode ?? 'row-per-item';\n const itemHeight = opts?.itemHeight ?? DEFAULT_ITEM_HEIGHT;\n const groupHeight = opts?.groupHeight ?? DEFAULT_GROUP_HEIGHT;\n const laneHeight = opts?.laneHeight ?? DEFAULT_LANE_HEIGHT;\n const minGap = opts?.packMinGapMs ?? 0;\n\n const { valid, invalid } = normalizeItems(items);\n const byId = new Map<string, KptRoadmapNormalizedItem<TItem>>(valid.map((item) => [item.id, item]));\n const rowOfItem = new Map<string, string>();\n const rows: KptRoadmapRow<TItem, TGroup>[] = [];\n\n const groupList = groups ?? [];\n const groupById = new Map<string, KptRoadmapGroup<TGroup>>(groupList.map((group) => [group.id, group]));\n\n // Itemy w kubełkach wg grupy; nieznane `groupId` traktujemy jak brak grupy.\n const buckets = new Map<string, KptRoadmapNormalizedItem<TItem>[]>();\n const ungrouped: KptRoadmapNormalizedItem<TItem>[] = [];\n for (const item of valid) {\n const groupId = item.source.groupId;\n if (groupId && groupById.has(groupId)) {\n const bucket = buckets.get(groupId);\n if (bucket) bucket.push(item);\n else buckets.set(groupId, [item]);\n } else {\n ungrouped.push(item);\n }\n }\n for (const bucket of buckets.values()) bucket.sort((a, b) => a.start - b.start || a.end - b.end);\n ungrouped.sort((a, b) => a.start - b.start || a.end - b.end);\n\n let top = 0;\n\n /** Dokłada wiersze itemów — jeden na item albo jeden spakowany. */\n const pushItemRows = (bucket: readonly KptRoadmapNormalizedItem<TItem>[], depth: number, keyPrefix: string): void => {\n if (bucket.length === 0) return;\n\n if (mode === 'pack') {\n const rowKey = `${keyPrefix}:pack`;\n const placed: KptRoadmapPlacedItem<TItem>[] = bucket.map((item) => ({ ...item, lane: 0, rowKey }));\n const laneCount = packLanes(placed, minGap);\n const height = Math.max(itemHeight, laneCount * laneHeight + 8);\n for (const item of placed) rowOfItem.set(item.id, rowKey);\n rows.push({\n key: rowKey,\n kind: 'item',\n index: rows.length,\n depth,\n top,\n height,\n laneCount,\n items: placed,\n });\n top += height;\n return;\n }\n\n for (const item of bucket) {\n const rowKey = `item:${item.id}`;\n rowOfItem.set(item.id, rowKey);\n rows.push({\n key: rowKey,\n kind: 'item',\n index: rows.length,\n depth,\n top,\n height: itemHeight,\n laneCount: 1,\n items: [{ ...item, lane: 0, rowKey }],\n });\n top += itemHeight;\n }\n };\n\n for (const group of groupList) {\n // Grupa pod zwiniętym przodkiem w ogóle się nie renderuje.\n if (hasCollapsedAncestor(group, groupById, collapsed)) continue;\n\n const bucket = buckets.get(group.id) ?? [];\n const depth = groupDepth(group, groupById);\n const isCollapsed = collapsed.has(group.id);\n const rowKey = `group:${group.id}`;\n\n rows.push({\n key: rowKey,\n kind: 'group',\n index: rows.length,\n depth,\n top,\n height: groupHeight,\n laneCount: 1,\n group,\n groupState: {\n collapsed: isCollapsed,\n itemCount: bucket.length,\n // Pasek zbiorczy obejmuje dzieci również wtedy, gdy grupa jest zwinięta.\n span: group.summary === 'none' ? null : spanOf(bucket),\n progress: rollupProgress(bucket),\n },\n items: [],\n });\n top += groupHeight;\n\n if (!isCollapsed) pushItemRows(bucket, depth + 1, `group:${group.id}`);\n }\n\n if (ungrouped.length > 0) {\n if (opts?.showUngroupedHeader) {\n const rowKey = 'group:__ungrouped';\n const isCollapsed = collapsed.has('__ungrouped');\n rows.push({\n key: rowKey,\n kind: 'group',\n index: rows.length,\n depth: 0,\n top,\n height: groupHeight,\n laneCount: 1,\n group: { id: '__ungrouped', label: opts.ungroupedLabel ?? '' } as KptRoadmapGroup<TGroup>,\n groupState: {\n collapsed: isCollapsed,\n itemCount: ungrouped.length,\n span: spanOf(ungrouped),\n progress: rollupProgress(ungrouped),\n },\n items: [],\n });\n top += groupHeight;\n if (!isCollapsed) pushItemRows(ungrouped, 1, 'ungrouped');\n } else {\n pushItemRows(ungrouped, 0, 'ungrouped');\n }\n }\n\n return { rows, totalHeight: top, byId, rowOfItem, invalid };\n}\n\n/** Indeks pierwszego wiersza sięgającego pozycji `y` (binary search po `top`). */\nfunction firstRowAt(rows: readonly KptRoadmapRow[], y: number): number {\n let lo = 0;\n let hi = rows.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (rows[mid].top + rows[mid].height <= y) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/**\n * Wycinek wierszy widocznych w oknie przewijania.\n * Szuka binarnie po skumulowanym `top`, więc działa także dla wierszy\n * o różnej wysokości (tryb 'pack').\n */\nexport function sliceRows<TItem, TGroup>(\n layout: KptRoadmapLayout<TItem, TGroup>,\n scrollTop: number,\n viewportHeight: number,\n buffer = 4,\n): { rows: readonly KptRoadmapRow<TItem, TGroup>[]; startIndex: number; endIndex: number } {\n const all = layout.rows;\n if (all.length === 0 || viewportHeight <= 0) {\n return { rows: all, startIndex: 0, endIndex: all.length };\n }\n\n const first = firstRowAt(all, Math.max(0, scrollTop));\n const last = firstRowAt(all, Math.max(0, scrollTop + viewportHeight));\n const startIndex = Math.max(0, first - buffer);\n const endIndex = Math.min(all.length, last + buffer + 1);\n\n return { rows: all.slice(startIndex, endIndex), startIndex, endIndex };\n}\n","/*\n * Geometria zależności między paskami — warstwa SVG nad torami.\n *\n * Overlay pracuje w pikselach, nie w procentach: zaokrąglenie narożnika wymaga\n * tych samych jednostek na obu osiach, inaczej łuki byłyby zniekształcone.\n */\n\nimport { svgNum } from './scale';\nimport type {\n KptRoadmapDependencyOptions,\n KptRoadmapLink,\n KptRoadmapLinkType,\n KptRoadmapNormalizedItem,\n KptRoadmapPoint,\n KptRoadmapRect,\n KptRoadmapVariant,\n} from './types';\n\n/** Pasek w układzie px overlaya wraz z czasem — czas służy do detekcji naruszeń. */\nexport interface KptLinkEndpoint {\n id: string;\n rect: KptRoadmapRect;\n startTs: number;\n endTs: number;\n}\n\nexport interface KptLinkGeom {\n key: string;\n from: string;\n to: string;\n type: KptRoadmapLinkType;\n /** Ścieżka `d` łamanej z zaokrąglonymi narożnikami. */\n path: string;\n /** Ścieżka grotu strzałki (trójkąt domknięty przez `Z`). */\n arrow: string;\n variant?: KptRoadmapVariant;\n color?: string;\n /** Następnik startuje wcześniej, niż pozwala zależność (z uwzględnieniem `lag`). */\n isViolated: boolean;\n}\n\nconst DEFAULT_STUB = 12;\nconst DEFAULT_CORNER = 6;\nconst DEFAULT_ARROW = 6;\n\n/** Stabilny klucz krawędzi — pozwala pominąć duplikaty i służy jako trackBy. */\nfunction linkKey(link: KptRoadmapLink): string {\n return link.id ?? `${link.from}→${link.to}:${link.type ?? 'FS'}`;\n}\n\n/**\n * Scala zależności z `item.dependsOn` (skrót oznacza typ 'FS' bez lagu)\n * z listą `config.links`, odrzuca krawędzie wiszące i wykrywa cykle.\n */\nexport function resolveLinks(\n items: readonly KptRoadmapNormalizedItem[],\n links: readonly KptRoadmapLink[] | undefined,\n): { links: KptRoadmapLink[]; cycles: string[][] } {\n const known = new Set(items.map((item) => item.id));\n const merged = new Map<string, KptRoadmapLink>();\n\n const add = (link: KptRoadmapLink): void => {\n if (!known.has(link.from) || !known.has(link.to) || link.from === link.to) return;\n const key = linkKey(link);\n if (!merged.has(key)) merged.set(key, link);\n };\n\n for (const item of items) {\n for (const dependency of item.source.dependsOn ?? []) {\n if (typeof dependency === 'string') add({ from: dependency, to: item.id, type: 'FS' });\n else add(dependency);\n }\n }\n for (const link of links ?? []) add(link);\n\n return { links: [...merged.values()], cycles: findCycles([...merged.values()]) };\n}\n\n/** Wykrywa cykle w grafie zależności (DFS z kolorowaniem wierzchołków). */\nfunction findCycles(links: readonly KptRoadmapLink[]): string[][] {\n const adjacency = new Map<string, string[]>();\n for (const link of links) {\n const list = adjacency.get(link.from);\n if (list) list.push(link.to);\n else adjacency.set(link.from, [link.to]);\n }\n\n const cycles: string[][] = [];\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n\n const visit = (node: string): void => {\n const current = state.get(node);\n if (current === 'done') return;\n if (current === 'visiting') {\n const from = stack.lastIndexOf(node);\n if (from !== -1) cycles.push(stack.slice(from));\n return;\n }\n state.set(node, 'visiting');\n stack.push(node);\n for (const next of adjacency.get(node) ?? []) visit(next);\n stack.pop();\n state.set(node, 'done');\n };\n\n for (const node of adjacency.keys()) visit(node);\n return cycles;\n}\n\n/** Czy zależność jest naruszona? Liczone w ms, nie w pikselach. */\nfunction violates(link: KptRoadmapLink, source: KptLinkEndpoint, target: KptLinkEndpoint): boolean {\n const lag = link.lag ?? 0;\n switch (link.type ?? 'FS') {\n case 'FS':\n return target.startTs < source.endTs + lag;\n case 'SS':\n return target.startTs < source.startTs + lag;\n case 'FF':\n return target.endTs < source.endTs + lag;\n case 'SF':\n return target.endTs < source.startTs + lag;\n }\n}\n\n/** Usuwa punkty pokrywające się i leżące na jednej prostej z sąsiadami. */\nfunction dedupeCollinear(points: readonly KptRoadmapPoint[]): KptRoadmapPoint[] {\n const result: KptRoadmapPoint[] = [];\n for (const point of points) {\n const last = result.at(-1);\n if (last && Math.abs(last.x - point.x) < 1e-6 && Math.abs(last.y - point.y) < 1e-6) continue;\n result.push(point);\n }\n for (let i = result.length - 2; i >= 1; i--) {\n const previous = result[i - 1];\n const current = result[i];\n const next = result[i + 1];\n const collinearX = Math.abs(previous.x - current.x) < 1e-6 && Math.abs(current.x - next.x) < 1e-6;\n const collinearY = Math.abs(previous.y - current.y) < 1e-6 && Math.abs(current.y - next.y) < 1e-6;\n if (collinearX || collinearY) result.splice(i, 1);\n }\n return result;\n}\n\n/**\n * Łamana ortogonalna z zaokrąglonymi narożnikami.\n * Narożnik rysujemy krzywą kwadratową — dla kąta prostego wygląda jak łuk,\n * a ścieżka jest o połowę krótsza. Promień przycinamy do połowy krótszego\n * z sąsiednich odcinków, żeby ciasne zakręty nie tworzyły pętli.\n */\nexport function roundedPolyline(points: readonly KptRoadmapPoint[], radius: number): string {\n const path = dedupeCollinear(points);\n if (path.length < 2) return '';\n\n const parts: string[] = [`M ${svgNum(path[0].x)} ${svgNum(path[0].y)}`];\n\n for (let i = 1; i < path.length - 1; i++) {\n const previous = path[i - 1];\n const current = path[i];\n const next = path[i + 1];\n const lengthIn = Math.hypot(current.x - previous.x, current.y - previous.y);\n const lengthOut = Math.hypot(next.x - current.x, next.y - current.y);\n const r = Math.max(0, Math.min(radius, lengthIn / 2, lengthOut / 2));\n\n if (r === 0 || lengthIn === 0 || lengthOut === 0) {\n parts.push(`L ${svgNum(current.x)} ${svgNum(current.y)}`);\n continue;\n }\n\n const enter = {\n x: current.x + ((previous.x - current.x) / lengthIn) * r,\n y: current.y + ((previous.y - current.y) / lengthIn) * r,\n };\n const leave = {\n x: current.x + ((next.x - current.x) / lengthOut) * r,\n y: current.y + ((next.y - current.y) / lengthOut) * r,\n };\n parts.push(\n `L ${svgNum(enter.x)} ${svgNum(enter.y)}`,\n `Q ${svgNum(current.x)} ${svgNum(current.y)} ${svgNum(leave.x)} ${svgNum(leave.y)}`,\n );\n }\n\n const last = path.at(-1)!;\n parts.push(`L ${svgNum(last.x)} ${svgNum(last.y)}`);\n return parts.join(' ');\n}\n\n/** Grot strzałki w punkcie `point`, skierowany zgodnie z `direction`. */\nexport function arrowHead(point: KptRoadmapPoint, direction: 'left' | 'right', size: number): string {\n const sign = direction === 'right' ? 1 : -1;\n const baseX = point.x - sign * size;\n return [\n `M ${svgNum(point.x)} ${svgNum(point.y)}`,\n `L ${svgNum(baseX)} ${svgNum(point.y - size / 2)}`,\n `L ${svgNum(baseX)} ${svgNum(point.y + size / 2)}`,\n 'Z',\n ].join(' ');\n}\n\n/** Kotwica wyjścia/wejścia zależnie od typu: -1 = lewa krawędź, 1 = prawa. */\nfunction anchors(type: KptRoadmapLinkType): { out: -1 | 1; in: -1 | 1 } {\n switch (type) {\n case 'FS':\n return { out: 1, in: -1 };\n case 'SS':\n return { out: -1, in: -1 };\n case 'FF':\n return { out: 1, in: 1 };\n case 'SF':\n return { out: -1, in: 1 };\n }\n}\n\nfunction edgePoint(rect: KptRoadmapRect, side: -1 | 1): KptRoadmapPoint {\n return { x: side === 1 ? rect.x + rect.width : rect.x, y: rect.y + rect.height / 2 };\n}\n\n/**\n * Trasa łamanej między dwoma kotwicami.\n *\n * Konwencja kierunków: `outDir` i `inDir` wskazują stronę paska (-1 = lewa\n * krawędź, +1 = prawa), więc odsunięcie „na zewnątrz\" to zawsze `x + dir * stub`.\n *\n * Gdy cel leży za końcem źródła, wystarczy prosty schodek: pion wypada między\n * paskami. W przeciwnym razie trzeba je obejść poziomym objazdem prowadzonym\n * w połowie odstępu między wierszami.\n */\nfunction route(\n out: KptRoadmapPoint,\n outDir: -1 | 1,\n anchor: KptRoadmapPoint,\n endPoint: KptRoadmapPoint,\n inDir: -1 | 1,\n stub: number,\n detourGap: number,\n): KptRoadmapPoint[] {\n const afterOut = out.x + outDir * stub;\n const beforeIn = endPoint.x + inDir * stub;\n\n if (outDir === inDir) {\n // SS / FF — obie kotwice po tej samej stronie pasków. Wspólny pion musi ominąć\n // oba paski, więc bierzemy punkt najdalej wysunięty w kierunku wyjścia;\n // inaczej trasa schowałaby się pod paskiem, z którego wychodzi.\n const middle = outDir === -1 ? Math.min(afterOut, beforeIn) : Math.max(afterOut, beforeIn);\n return [out, { x: middle, y: out.y }, { x: middle, y: endPoint.y }, endPoint];\n }\n\n // FS / SF — kotwice po przeciwnych stronach. Prosty schodek ma sens tylko wtedy,\n // gdy między paskami zostaje miejsce na czytelny pion. Zapas liczymy względem\n // rzeczywistej krawędzi celu (`anchor`), a nie skróconego o grot końca trzonu.\n // Warunek `room >= 0` jest równoważny „odstęp >= 2 * stub\", więc próg zawijasa\n // wynika wprost z geometrii i nie wymaga osobnej stałej.\n const room = (anchor.x + inDir * stub - afterOut) * (inDir === -1 ? 1 : -1);\n\n if (room >= 0) {\n const lo = Math.min(afterOut, beforeIn);\n const hi = Math.max(afterOut, beforeIn);\n const middle = Math.min(hi, Math.max(lo, (out.x + endPoint.x) / 2));\n return [out, { x: middle, y: out.y }, { x: middle, y: endPoint.y }, endPoint];\n }\n\n // Paski stykają się albo cel cofa się względem źródła — prowadzimy trasę wokół,\n // przez odstęp między wierszami.\n const detourY = Math.abs(endPoint.y - out.y) < 1e-6 ? out.y + detourGap : (out.y + endPoint.y) / 2;\n return [\n out,\n { x: afterOut, y: out.y },\n { x: afterOut, y: detourY },\n { x: beforeIn, y: detourY },\n { x: beforeIn, y: endPoint.y },\n endPoint,\n ];\n}\n\n/**\n * Geometria pojedynczej zależności.\n * Zwraca `null`, gdy któryś koniec nie jest widoczny (zwinięta grupa albo\n * wiersz poza oknem wirtualizacji).\n */\nexport function linkGeometry(\n link: KptRoadmapLink,\n source: KptLinkEndpoint | undefined,\n target: KptLinkEndpoint | undefined,\n opts?: KptRoadmapDependencyOptions,\n): KptLinkGeom | null {\n if (!source || !target) return null;\n\n const type = link.type ?? 'FS';\n const stub = opts?.stub ?? DEFAULT_STUB;\n const corner = opts?.cornerRadius ?? DEFAULT_CORNER;\n const arrowSize = opts?.arrowSize ?? DEFAULT_ARROW;\n const side = anchors(type);\n\n const from = edgePoint(source.rect, side.out);\n const to = edgePoint(target.rect, side.in);\n // Grot dosuwamy do krawędzi paska, więc trzon kończy się tuż przed nim —\n // czyli o długość grotu na zewnątrz celu.\n const tip = to;\n const shaftEnd = { x: to.x + side.in * arrowSize, y: to.y };\n\n const detourGap = Math.max(source.rect.height, target.rect.height);\n const points = route(from, side.out, to, shaftEnd, side.in, stub, detourGap);\n\n const highlight = opts?.highlightViolations ?? true;\n\n return {\n key: linkKey(link),\n from: link.from,\n to: link.to,\n type,\n path: roundedPolyline(points, corner),\n arrow: arrowHead(tip, side.in === -1 ? 'right' : 'left', arrowSize),\n variant: link.variant,\n color: link.color,\n isViolated: highlight ? violates(link, source, target) : false,\n };\n}\n","/*\n * Model osi czasu: kolumny dolnego poziomu nagłówka, pasma górnego poziomu\n * oraz skala czas ↔ pozycja.\n *\n * Skala domyślna ('uniform') odwzorowuje czas odcinkami: każda kolumna ma równą\n * szerokość, a wewnątrz niej interpolujemy liniowo po ms. Dzięki temu doba po\n * zmianie czasu (23/25 h) i luty nie są węższe od sąsiadów, a skala pozostaje\n * ciągła i monotoniczna — zadanie może zaczynać się w środku dnia.\n */\n\nimport {\n addHours,\n addUnits,\n floorToUnit,\n isSameDay,\n isoWeekNumber,\n isoWeekYear,\n quarterOf,\n toTimestamp,\n} from './calendar';\nimport { clamp, linearScale } from './scale';\nimport type {\n KptRoadmapPositionMode,\n KptRoadmapZoom,\n KptTimeRange,\n KptTimelineOptions,\n KptWorkHours,\n} from './types';\n\n/** Pojedyncza kolumna dolnego poziomu nagłówka i linii siatki. */\nexport interface KptTimelineCell {\n /** Indeks w `cells` (0-based) — podstawa skali 'uniform'. */\n index: number;\n /** Klucz trackBy. */\n key: string;\n /** Początek jednostki (ms, lokalny). */\n start: number;\n /** Początek następnej jednostki (ms, wyłącznie). Uwzględnia doby 23/25 h. */\n end: number;\n /** Etykieta dolnego poziomu, np. '35', '24', '09:00'. */\n label: string;\n /** Podpis pod etykietą, np. '24.08–30.08' albo 'pon'. */\n sublabel?: string;\n /** Pełny opis do atrybutu `title`. */\n title: string;\n /** Lewa krawędź 0..1. */\n ratioStart: number;\n /** Prawa krawędź 0..1. */\n ratioEnd: number;\n isToday: boolean;\n isWeekend: boolean;\n /** Poza oknem godzin roboczych (tylko `workHours.mode === 'dim'`). */\n isNonWorking: boolean;\n isMonthBoundary: boolean;\n isQuarterBoundary: boolean;\n isYearBoundary: boolean;\n /** Przed tą kolumną wycięto zakres (`workHours.mode === 'skip'`). */\n hasGapBefore: boolean;\n}\n\n/** Grupa kolumn tworząca górny poziom nagłówka (np. miesiąc nad tygodniami). */\nexport interface KptTimelineBand {\n key: string;\n start: number;\n end: number;\n /** Indeks pierwszej i ostatniej obejmowanej kolumny (włącznie). */\n fromIndex: number;\n toIndex: number;\n /** Liczba obejmowanych kolumn. */\n span: number;\n ratioStart: number;\n ratioEnd: number;\n /** Etykieta główna, np. 'sierpień'. */\n label: string;\n /** Etykieta pomocnicza, np. '2026'. */\n sublabel?: string;\n /** Pierwsze pasmo danego roku — nośnik czarnego znacznika roku. */\n isYearStart: boolean;\n /** Rok do znacznika; ustawiony tylko gdy `isYearStart`. */\n yearBadge?: string;\n}\n\n/** Geometria paska na osi (wartości 0..1). */\nexport interface KptSpanGeom {\n left: number;\n width: number;\n /** Item zaczyna się przed lewą krawędzią zakresu. */\n clippedStart: boolean;\n /** Item kończy się za prawą krawędzią zakresu. */\n clippedEnd: boolean;\n /** Czy jakakolwiek część mieści się w zakresie. */\n visible: boolean;\n}\n\n/** Niemutowalny model osi czasu — wynik `buildTimeline`. */\nexport interface KptTimelineModel {\n zoom: KptRoadmapZoom;\n range: KptTimeRange;\n positionMode: KptRoadmapPositionMode;\n cells: readonly KptTimelineCell[];\n bands: readonly KptTimelineBand[];\n /** Czy górny poziom nagłówka istnieje. */\n hasBands: boolean;\n /** Pozycja „dziś\" 0..1 albo null, gdy poza zakresem. */\n todayRatio: number | null;\n /** Czas → pozycja 0..1 (monotoniczna, clampowana do zakresu). */\n toRatio(timestamp: number): number;\n /** Pozycja 0..1 → czas (odwrotność `toRatio`; podstawa pod drag&drop). */\n fromRatio(ratio: number): number;\n /** Geometria przedziału wraz z informacją o przycięciu. */\n span(startTs: number, endTs: number): KptSpanGeom;\n}\n\n/** Domyślna jednostka górnego poziomu nagłówka dla danego zoomu. */\nconst DEFAULT_BAND: Record<KptRoadmapZoom, KptRoadmapZoom | 'none'> = {\n hour: 'day',\n day: 'week',\n week: 'month',\n month: 'quarter',\n quarter: 'year',\n year: 'none',\n};\n\nconst DEFAULT_MAX_CELLS = 4000;\nconst DEFAULT_WEEKEND: readonly number[] = [0, 6];\n\ninterface ResolvedOptions {\n locale: string | undefined;\n todayTs: number;\n weekendDays: readonly number[];\n workHours: Required<KptWorkHours> | null;\n bandUnit: KptRoadmapZoom | 'none';\n positionMode: KptRoadmapPositionMode;\n weekPrefix: string;\n maxCells: number;\n}\n\nfunction resolveOptions(zoom: KptRoadmapZoom, opts: KptTimelineOptions | undefined): ResolvedOptions {\n const workHours = opts?.workHours;\n return {\n locale: opts?.locale,\n todayTs: opts?.today !== undefined ? toTimestamp(opts.today) : Date.now(),\n weekendDays: opts?.weekendDays ?? DEFAULT_WEEKEND,\n // Okno godzin roboczych ma sens tylko przy kolumnach godzinowych.\n workHours:\n zoom === 'hour' && workHours\n ? {\n from: workHours.from,\n to: workHours.to,\n mode: workHours.mode ?? 'skip',\n skipWeekends: workHours.skipWeekends ?? true,\n }\n : null,\n bandUnit: opts?.bandUnit ?? DEFAULT_BAND[zoom],\n positionMode: opts?.positionMode ?? 'uniform',\n weekPrefix: opts?.weekPrefix ?? 'W',\n maxCells: opts?.maxCells ?? DEFAULT_MAX_CELLS,\n };\n}\n\n/** Zestaw formaterów `Intl` tworzony raz na wywołanie — nie per komórka. */\ninterface Formatters {\n dayNum: Intl.DateTimeFormat;\n weekdayShort: Intl.DateTimeFormat;\n dayMonth: Intl.DateTimeFormat;\n monthLong: Intl.DateTimeFormat;\n monthShort: Intl.DateTimeFormat;\n dayLong: Intl.DateTimeFormat;\n hour: Intl.DateTimeFormat;\n}\n\nfunction makeFormatters(locale: string | undefined): Formatters {\n return {\n dayNum: new Intl.DateTimeFormat(locale, { day: 'numeric' }),\n weekdayShort: new Intl.DateTimeFormat(locale, { weekday: 'short' }),\n dayMonth: new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit' }),\n monthLong: new Intl.DateTimeFormat(locale, { month: 'long' }),\n monthShort: new Intl.DateTimeFormat(locale, { month: 'short' }),\n dayLong: new Intl.DateTimeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' }),\n hour: new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit', hour12: false }),\n };\n}\n\nfunction isWeekendDay(date: Date, o: ResolvedOptions): boolean {\n return o.weekendDays.includes(date.getDay());\n}\n\n/** Czy dana godzina mieści się w oknie roboczym (i poza weekendem, gdy tak ustawiono)? */\nfunction isWorkingSlot(date: Date, o: ResolvedOptions): boolean {\n const wh = o.workHours;\n if (!wh) return true;\n if (wh.skipWeekends && isWeekendDay(date, o)) return false;\n const hour = date.getHours();\n return hour >= wh.from && hour < wh.to;\n}\n\n/**\n * Kotwica przypisania kolumny do pasma.\n * Dla tygodnia bierzemy czwartek — tak samo jak ISO wyznacza rok tygodnia,\n * więc tydzień na przełomie miesiąca trafia do miesiąca swojego czwartku.\n */\nfunction bandAnchor(cellStart: Date, zoom: KptRoadmapZoom): Date {\n if (zoom !== 'week') return cellStart;\n const anchor = new Date(cellStart);\n anchor.setDate(anchor.getDate() + 3);\n return anchor;\n}\n\n/**\n * Wielka pierwsza litera. `Intl` zwraca nazwy zgodne z ortografią języka — po polsku,\n * francusku czy czesku miesiące i dni tygodnia pisze się małą literą, po angielsku\n * i niemiecku wielką. Na osi czasu i w podpowiedziach chcemy jednolitego wyglądu\n * niezależnie od języka, więc podnosimy wyłącznie pierwszy znak; reszta zostaje bez\n * zmian, żeby „wtorek, 15 września 2026\" nie stało się „Wtorek, 15 Września 2026\".\n */\nfunction capitalizeFirst(text: string): string {\n if (!text) return text;\n const first = text.charAt(0);\n const upper = first.toLocaleUpperCase();\n // `toLocaleUpperCase` bywa dłuższe niż źródło (np. niemieckie ß → SS) — wtedy\n // zostawiamy oryginał, bo zamiana zmieniłaby długość i wygląd etykiety.\n return upper.length === first.length ? upper + text.slice(1) : text;\n}\n\nfunction cellLabels(\n start: Date,\n zoom: KptRoadmapZoom,\n o: ResolvedOptions,\n f: Formatters,\n): { label: string; sublabel?: string; title: string } {\n switch (zoom) {\n case 'hour':\n return {\n label: f.hour.format(start),\n title: capitalizeFirst(`${f.dayLong.format(start)}, ${f.hour.format(start)}`),\n };\n case 'day':\n return {\n label: f.dayNum.format(start),\n sublabel: capitalizeFirst(f.weekdayShort.format(start)),\n title: capitalizeFirst(f.dayLong.format(start)),\n };\n case 'week': {\n // Podpis to prawdziwy zakres dat tygodnia: poniedziałek – niedziela.\n const sunday = new Date(start);\n sunday.setDate(sunday.getDate() + 6);\n const range = `${f.dayMonth.format(start)}–${f.dayMonth.format(sunday)}`;\n return {\n label: `${o.weekPrefix}${isoWeekNumber(start)}`,\n sublabel: range,\n title: `${o.weekPrefix}${isoWeekNumber(start)} ${isoWeekYear(start)} · ${range}`,\n };\n }\n case 'month':\n return {\n label: capitalizeFirst(f.monthShort.format(start)),\n title: capitalizeFirst(`${f.monthLong.format(start)} ${start.getFullYear()}`),\n };\n case 'quarter':\n return { label: `Q${quarterOf(start)}`, title: `Q${quarterOf(start)} ${start.getFullYear()}` };\n case 'year':\n return { label: String(start.getFullYear()), title: String(start.getFullYear()) };\n }\n}\n\nfunction bandLabels(\n start: Date,\n unit: KptRoadmapZoom,\n f: Formatters,\n): { label: string; sublabel?: string } {\n switch (unit) {\n case 'hour':\n return { label: f.hour.format(start) };\n case 'day':\n return { label: capitalizeFirst(f.dayLong.format(start)) };\n case 'week':\n return { label: `W${isoWeekNumber(start)}`, sublabel: capitalizeFirst(f.monthLong.format(start)) };\n case 'month':\n return { label: capitalizeFirst(f.monthLong.format(start)), sublabel: String(start.getFullYear()) };\n case 'quarter':\n return { label: `Q${quarterOf(start)}`, sublabel: String(start.getFullYear()) };\n case 'year':\n return { label: String(start.getFullYear()) };\n }\n}\n\n/**\n * Rok kolumny użyty do wykrycia granicy roku.\n * Przy zoomie tygodniowym musi to być rok tygodnia ISO — inaczej W53/2026\n * (28.12.2026) dostałaby błędnie znacznik „2027\".\n */\nfunction yearOfCell(date: Date, zoom: KptRoadmapZoom): number {\n return zoom === 'week' ? isoWeekYear(date) : date.getFullYear();\n}\n\n/**\n * Początek następnej kolumny albo `null`, gdy kursor nie potrafi się już posunąć.\n * DST wiosną przy zoomie godzinowym: 02:00 nie istnieje, więc `setHours`\n * normalizuje na 03:00 i zwykły krok mógłby nie wyprzedzić `cursor` — wtedy\n * przeskakujemy o dwie godziny.\n */\nfunction nextBoundary(cursor: Date, zoom: KptRoadmapZoom): Date | null {\n const next = addUnits(cursor, zoom, 1);\n if (next.getTime() > cursor.getTime()) return next;\n const jumped = addHours(cursor, 2);\n return jumped.getTime() > cursor.getTime() ? jumped : null;\n}\n\n/**\n * Czy kolumna obejmuje „dziś\"? Dla jednostek grubszych niż tydzień akceptujemy\n * dodatkowo zgodność samej daty — `todayTs` bywa znormalizowane do północy.\n */\nfunction isTodayCell(cursor: Date, next: Date, zoom: KptRoadmapZoom, o: ResolvedOptions, today: Date): boolean {\n const withinSpan = o.todayTs >= cursor.getTime() && o.todayTs < next.getTime();\n if (zoom === 'hour' || zoom === 'day' || zoom === 'week') return withinSpan;\n return withinSpan || isSameDay(cursor, today);\n}\n\n/** Flagi wyglądu kolumny: tło weekendu/godzin niepracujących i granice okresów. */\nfunction cellDecorations(\n cursor: Date,\n zoom: KptRoadmapZoom,\n o: ResolvedOptions,\n): Pick<KptTimelineCell, 'isWeekend' | 'isNonWorking' | 'isMonthBoundary' | 'isQuarterBoundary'> {\n const isDayGrid = zoom === 'day' || zoom === 'hour';\n return {\n isWeekend: isDayGrid && isWeekendDay(cursor, o),\n isNonWorking: o.workHours?.mode === 'dim' && !isWorkingSlot(cursor, o),\n isMonthBoundary: isDayGrid && cursor.getDate() === 1,\n isQuarterBoundary: (zoom === 'month' || zoom === 'quarter') && cursor.getMonth() % 3 === 0,\n };\n}\n\nfunction buildCells(range: KptTimeRange, zoom: KptRoadmapZoom, o: ResolvedOptions, f: Formatters): KptTimelineCell[] {\n const cells: KptTimelineCell[] = [];\n const today = new Date(o.todayTs);\n // Startujemy od granicy jednostki — inaczej pierwsza kolumna byłaby ucięta.\n let cursor = floorToUnit(new Date(range.start), zoom);\n let pendingGap = false;\n let previousYear: number | null = null;\n let guard = 0;\n\n while (cursor.getTime() < range.end && guard++ < o.maxCells) {\n const next = nextBoundary(cursor, zoom);\n if (next === null) break;\n\n if (o.workHours?.mode === 'skip' && !isWorkingSlot(cursor, o)) {\n pendingGap = true;\n cursor = next;\n continue;\n }\n\n const year = yearOfCell(cursor, zoom);\n const labels = cellLabels(cursor, zoom, o, f);\n\n cells.push({\n index: cells.length,\n key: String(cursor.getTime()),\n start: cursor.getTime(),\n end: next.getTime(),\n label: labels.label,\n sublabel: labels.sublabel,\n title: labels.title,\n ratioStart: 0,\n ratioEnd: 0,\n isToday: isTodayCell(cursor, next, zoom, o, today),\n ...cellDecorations(cursor, zoom, o),\n isYearBoundary: previousYear !== null && year !== previousYear,\n hasGapBefore: pendingGap,\n });\n\n pendingGap = false;\n previousYear = year;\n cursor = next;\n }\n\n return cells;\n}\n\nfunction applyRatios(cells: KptTimelineCell[], mode: KptRoadmapPositionMode, range: KptTimeRange): void {\n const count = cells.length;\n if (count === 0) return;\n if (mode === 'uniform') {\n const step = 1 / count;\n for (const cell of cells) {\n cell.ratioStart = cell.index * step;\n cell.ratioEnd = (cell.index + 1) * step;\n }\n return;\n }\n const scale = linearScale(range.start, range.end, 0, 1);\n for (const cell of cells) {\n cell.ratioStart = clamp(scale(cell.start), 0, 1);\n cell.ratioEnd = clamp(scale(cell.end), 0, 1);\n }\n}\n\n/** Indeks kolumny zawierającej `ts`, albo pierwszej kolumny po `ts`. */\nfunction findCell(cells: readonly KptTimelineCell[], ts: number): number {\n let lo = 0;\n let hi = cells.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (ts >= cells[mid].end) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nfunction buildBands(\n cells: readonly KptTimelineCell[],\n zoom: KptRoadmapZoom,\n o: ResolvedOptions,\n f: Formatters,\n): KptTimelineBand[] {\n const unit = o.bandUnit;\n if (unit === 'none' || cells.length === 0) return [];\n\n const bands: KptTimelineBand[] = [];\n let seenYear: number | null = null;\n\n for (const cell of cells) {\n const anchor = bandAnchor(new Date(cell.start), zoom);\n const bandStart = floorToUnit(anchor, unit);\n const key = String(bandStart.getTime());\n const last = bands.at(-1);\n\n if (last?.key === key) {\n last.toIndex = cell.index;\n last.span += 1;\n last.ratioEnd = cell.ratioEnd;\n last.end = cell.end;\n continue;\n }\n\n const labels = bandLabels(bandStart, unit, f);\n const year = unit === 'week' ? isoWeekYear(bandStart) : bandStart.getFullYear();\n const isYearStart = seenYear === null ? bands.length === 0 : year !== seenYear;\n seenYear = year;\n\n bands.push({\n key,\n start: cell.start,\n end: cell.end,\n fromIndex: cell.index,\n toIndex: cell.index,\n span: 1,\n ratioStart: cell.ratioStart,\n ratioEnd: cell.ratioEnd,\n label: labels.label,\n sublabel: labels.sublabel,\n isYearStart,\n // Znacznik roku niesie tylko pierwsze pasmo danego roku.\n yearBadge: isYearStart ? String(year) : undefined,\n });\n }\n\n return bands;\n}\n\n/**\n * Buduje model osi czasu: kolumny, pasma nagłówka i skalę.\n * Wszystkie obliczenia w czasie LOKALNYM przeglądarki.\n *\n * @param range zakres osi w ms — zwykle wynik `resolveRange`\n * @param zoom poziom przybliżenia\n * @param opts locale, „dziś\", weekendy, godziny robocze, tryb pozycjonowania\n */\nexport function buildTimeline(\n range: KptTimeRange,\n zoom: KptRoadmapZoom,\n opts?: KptTimelineOptions,\n): KptTimelineModel {\n const o = resolveOptions(zoom, opts);\n const f = makeFormatters(o.locale);\n const cells = buildCells(range, zoom, o, f);\n applyRatios(cells, o.positionMode, range);\n const bands = buildBands(cells, zoom, o, f);\n\n const count = cells.length;\n const first = cells[0];\n const last = cells[count - 1];\n\n /** Czas → 0..1. Skala odcinkowa: indeks kolumny + interpolacja w jej wnętrzu. */\n const toRatio = (ts: number): number => {\n if (count === 0) return 0;\n if (o.positionMode === 'linear') {\n return clamp(linearScale(range.start, range.end, 0, 1)(ts), 0, 1);\n }\n if (ts <= first.start) return 0;\n if (ts >= last.end) return 1;\n const index = findCell(cells, ts);\n const cell = cells[index];\n // `ts` może wpaść w lukę wyciętą przez `workHours: 'skip'` — wtedy\n // interpolacja wychodzi poza [0, 1] i clamp dociąga ją do krawędzi kolumny.\n const inner = clamp(linearScale(cell.start, cell.end, 0, 1)(ts), 0, 1);\n return (index + inner) / count;\n };\n\n const fromRatio = (ratio: number): number => {\n if (count === 0) return range.start;\n if (o.positionMode === 'linear') {\n return range.start + clamp(ratio, 0, 1) * (range.end - range.start);\n }\n const scaled = clamp(ratio, 0, 1) * count;\n const index = Math.min(count - 1, Math.floor(scaled));\n const cell = cells[index];\n // Poprawnie odwzorowuje także dobę 25-godzinną — długość bierzemy z kolumny.\n return cell.start + (scaled - index) * (cell.end - cell.start);\n };\n\n const span = (startTs: number, endTs: number): KptSpanGeom => {\n const lo = Math.min(startTs, endTs);\n const hi = Math.max(startTs, endTs);\n const axisStart = count > 0 ? first.start : range.start;\n const axisEnd = count > 0 ? last.end : range.end;\n const left = toRatio(lo);\n const right = toRatio(hi);\n return {\n left,\n width: Math.max(0, right - left),\n clippedStart: lo < axisStart,\n clippedEnd: hi > axisEnd,\n // Kamień milowy ma zerową szerokość, więc sam dotyk krawędzi wystarczy.\n visible: hi >= axisStart && lo <= axisEnd,\n };\n };\n\n const todayInRange = count > 0 && o.todayTs >= first.start && o.todayTs <= last.end;\n\n return {\n zoom,\n range,\n positionMode: o.positionMode,\n cells,\n bands,\n hasBands: bands.length > 0,\n todayRatio: todayInRange ? toRatio(o.todayTs) : null,\n toRatio,\n fromRatio,\n span,\n };\n}\n","<div\n #scrollEl\n class=\"kpt-roadmap__scroll\"\n [style.max-block-size]=\"scrollHeight()\"\n (scroll)=\"onScroll($event)\"\n>\n <!-- Nagłówek: przykleja się do góry, gdy podano stałą wysokość. -->\n <div class=\"kpt-roadmap__head\">\n <div class=\"kpt-roadmap__head-label\"></div>\n\n <div class=\"kpt-roadmap__head-track\">\n @if (timeline().hasBands) {\n <div class=\"kpt-roadmap__bands\">\n @for (band of timeline().bands; track band.key) {\n <div\n class=\"kpt-roadmap__band\"\n [class.kpt-roadmap__band--year-start]=\"band.isYearStart\"\n [style.inline-size.%]=\"(band.ratioEnd - band.ratioStart) * 100\"\n [kptTooltip]=\"band.sublabel ? band.label + ' ' + band.sublabel : band.label\"\n kptTooltipOnlyWhenTruncated\n >\n @if (band.yearBadge) {\n <span class=\"kpt-roadmap__year-badge\">{{ band.yearBadge }}</span>\n }\n <span class=\"kpt-roadmap__band-label\">{{ band.label }}</span>\n @if (band.sublabel && !band.yearBadge) {\n <span class=\"kpt-roadmap__band-sublabel\">{{ band.sublabel }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- Nagłówek definiuje siatkę, więc to on jest źródłem pomiaru szerokości toru. -->\n <div #laneMeasure class=\"kpt-roadmap__cells\">\n @for (cell of timeline().cells; track cell.key) {\n <div\n class=\"kpt-roadmap__cell\"\n [class.kpt-roadmap__cell--weekend]=\"cell.isWeekend\"\n [class.kpt-roadmap__cell--today]=\"cell.isToday && showToday()\"\n [class.kpt-roadmap__cell--year-boundary]=\"cell.isYearBoundary\"\n [class.kpt-roadmap__cell--gap-before]=\"cell.hasGapBefore\"\n [style.inline-size.%]=\"(cell.ratioEnd - cell.ratioStart) * 100\"\n [kptTooltip]=\"cell.title\"\n >\n <span class=\"kpt-roadmap__cell-label\">{{ cell.label }}</span>\n @if (cell.sublabel) {\n <span class=\"kpt-roadmap__cell-sublabel\">{{ cell.sublabel }}</span>\n }\n </div>\n }\n </div>\n\n <!-- Znacznik „dziś\" mieszka w nagłówku: warstwa siatki ma własny kontekst\n układania, więc nic w niej nie może znaleźć się nad nagłówkiem. -->\n @if (showToday() && timeline().todayRatio !== null) {\n <span\n class=\"kpt-roadmap__today-dot\"\n [style.inset-inline-start.%]=\"timeline().todayRatio! * 100\"\n [attr.title]=\"i18n.t('roadmap.today')\"\n ></span>\n }\n </div>\n </div>\n\n @if (isEmpty()) {\n <div class=\"kpt-roadmap__empty\">{{ i18n.t('roadmap.empty') }}</div>\n } @else {\n <div class=\"kpt-roadmap__body\" [style.block-size.px]=\"layout().totalHeight\">\n <!-- Siatka tła: kolumny weekendowe, granice roku i znacznik dziś. -->\n <div class=\"kpt-roadmap__grid\" aria-hidden=\"true\">\n <div class=\"kpt-roadmap__grid-cells\">\n @for (cell of timeline().cells; track cell.key) {\n <div\n class=\"kpt-roadmap__grid-cell\"\n [class.kpt-roadmap__grid-cell--weekend]=\"cell.isWeekend\"\n [class.kpt-roadmap__grid-cell--non-working]=\"cell.isNonWorking\"\n [class.kpt-roadmap__grid-cell--year-boundary]=\"cell.isYearBoundary\"\n [class.kpt-roadmap__grid-cell--gap-before]=\"cell.hasGapBefore\"\n [style.inline-size.%]=\"(cell.ratioEnd - cell.ratioStart) * 100\"\n ></div>\n }\n </div>\n\n @if (showToday() && timeline().todayRatio !== null) {\n <!-- Sama prowadnica; znacznik siedzi w nagłówku, żeby był nad nim widoczny. -->\n <div class=\"kpt-roadmap__today\" [style.inset-inline-start.%]=\"timeline().todayRatio! * 100\"></div>\n }\n </div>\n\n <!-- Zależności rysowane nad paskami, pod kolumną etykiet. -->\n @if (links().length > 0) {\n <svg\n class=\"kpt-roadmap__links\"\n [attr.viewBox]=\"'0 0 ' + laneWidth() + ' ' + layout().totalHeight\"\n [attr.width]=\"laneWidth()\"\n [attr.height]=\"layout().totalHeight\"\n aria-hidden=\"true\"\n >\n @for (link of links(); track link.key) {\n <g\n class=\"kpt-roadmap__link\"\n [class.kpt-roadmap__link--violated]=\"link.isViolated\"\n [attr.data-variant]=\"link.variant\"\n >\n <path class=\"kpt-roadmap__link-path\" [attr.d]=\"link.path\" [style.stroke]=\"link.color\" />\n <path class=\"kpt-roadmap__link-arrow\" [attr.d]=\"link.arrow\" [style.fill]=\"link.color\" />\n </g>\n }\n </svg>\n }\n\n @for (row of visibleRows(); track row.key) {\n <div\n class=\"kpt-roadmap__row\"\n [class.kpt-roadmap__row--group]=\"row.kind === 'group'\"\n [style.inset-block-start.px]=\"row.top\"\n [style.block-size.px]=\"row.height\"\n >\n <div\n class=\"kpt-roadmap__label\"\n [style.padding-inline-start.rem]=\"0.75 + row.depth * 1\"\n [class.kpt-roadmap__label--group]=\"row.kind === 'group'\"\n [kptTooltip]=\"labelTooltip(row)\"\n kptTooltipOnlyWhenTruncated\n >\n @if (row.group; as group) {\n <button\n type=\"button\"\n class=\"kpt-roadmap__toggle\"\n [attr.aria-expanded]=\"!isCollapsed(group)\"\n [attr.aria-label]=\"isCollapsed(group) ? i18n.t('roadmap.expandGroup') : i18n.t('roadmap.collapseGroup')\"\n (click)=\"toggleGroup(group)\"\n >\n <span class=\"kpt-roadmap__toggle-icon\" [class.kpt-roadmap__toggle-icon--open]=\"!isCollapsed(group)\">\n </span>\n </button>\n <!-- Dymek siedzi na stacku, nie na całej etykiecie: w grupie tekst jest\n o poziom głębiej, a pomiar obejmuje tylko bezpośrednie dzieci hosta. -->\n <span\n class=\"kpt-roadmap__label-stack\"\n [kptTooltip]=\"group.sublabel ? group.label + ' — ' + group.sublabel : group.label\"\n kptTooltipOnlyWhenTruncated\n >\n <span class=\"kpt-roadmap__label-text kpt-roadmap__label-text--group\">{{ group.label }}</span>\n @if (group.sublabel) {\n <span class=\"kpt-roadmap__label-sub\">{{ group.sublabel }}</span>\n }\n </span>\n @if (row.groupState; as state) {\n @if (state.itemCount) {\n <span class=\"kpt-roadmap__label-count\">{{ state.itemCount }}</span>\n }\n }\n } @else if (row.items[0]; as first) {\n <span class=\"kpt-roadmap__label-text\">{{ first.source.label }}</span>\n @if (row.items.length === 1 && first.source.sublabel) {\n <span class=\"kpt-roadmap__label-sub\">{{ first.source.sublabel }}</span>\n }\n }\n </div>\n\n <div class=\"kpt-roadmap__lane\">\n @if (row.kind === 'group') {\n @if (summary(row); as sum) {\n <div\n class=\"kpt-roadmap__summary\"\n [attr.data-variant]=\"sum.variant\"\n [style.inset-inline-start.%]=\"sum.left\"\n [style.inline-size.%]=\"sum.width\"\n [style.background]=\"sum.color\"\n ></div>\n }\n } @else {\n @for (bar of bars(row); track bar.item.id) {\n @if (bar.isMilestone) {\n <div\n class=\"kpt-roadmap__milestone\"\n [attr.data-variant]=\"bar.variant\"\n [kptTooltip]=\"bar.title\"\n [attr.aria-label]=\"i18n.t('roadmap.milestone') + ': ' + bar.label\"\n [style.inset-inline-start.%]=\"bar.left\"\n [style.inset-block-start.px]=\"bar.top\"\n [style.inline-size.px]=\"bar.height\"\n [style.block-size.px]=\"bar.height\"\n [style.background]=\"bar.color\"\n tabindex=\"0\"\n (click)=\"onItemClick(bar.item)\"\n (keydown)=\"onItemKeydown($event, bar.item)\"\n ></div>\n } @else {\n <div\n class=\"kpt-roadmap__bar\"\n [attr.data-variant]=\"bar.variant\"\n [kptTooltip]=\"bar.title\"\n kptTooltipOnlyWhenTruncated\n [class.kpt-roadmap__bar--clipped-start]=\"bar.clippedStart\"\n [class.kpt-roadmap__bar--clipped-end]=\"bar.clippedEnd\"\n [class.kpt-roadmap__bar--disabled]=\"bar.item.source.disabled\"\n [style.inset-inline-start.%]=\"bar.left\"\n [style.inline-size.%]=\"bar.width\"\n [style.inset-block-start.px]=\"bar.top\"\n [style.block-size.px]=\"bar.height\"\n [style.background]=\"bar.color\"\n tabindex=\"0\"\n (click)=\"onItemClick(bar.item)\"\n (keydown)=\"onItemKeydown($event, bar.item)\"\n >\n @if (bar.progress !== null) {\n <span class=\"kpt-roadmap__bar-progress\" [style.inline-size.%]=\"bar.progress * 100\"></span>\n }\n <span class=\"kpt-roadmap__bar-label\">{{ bar.label }}</span>\n </div>\n }\n }\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { KptI18n, KptTooltip } from '@konce-pt/angular';\nimport { resolveRange } from '../core/auto-range';\nimport { buildRows, sliceRows, type KptRoadmapPlacedItem, type KptRoadmapRow } from '../core/layout';\nimport { linkGeometry, resolveLinks, type KptLinkEndpoint, type KptLinkGeom } from '../core/links';\nimport { buildTimeline, type KptTimelineModel } from '../core/timeline';\nimport type {\n KptRoadmapConfig,\n KptRoadmapGroup,\n KptRoadmapItem,\n KptRoadmapZoom,\n KptTimeRange,\n} from '../core/types';\n\n/** Domyślna szerokość kolumny dla danego zoomu (px). */\nconst CELL_WIDTH: Record<KptRoadmapZoom, number> = {\n year: 96,\n quarter: 88,\n month: 80,\n week: 76,\n day: 44,\n hour: 46,\n};\n\n/** Wysokość paska w trybie „jeden item na wiersz\" (px). */\nconst BAR_HEIGHT = 22;\n/** Odstęp między pasami w trybie „pack\" (px). */\nconst LANE_GAP = 4;\n\n/** Pasek gotowy do związania w szablonie. */\ninterface BarVm<TMeta = unknown> {\n item: KptRoadmapPlacedItem<TMeta>;\n /** Pozycja i szerokość w procentach szerokości toru. */\n left: number;\n width: number;\n /** Offset pionowy wewnątrz wiersza (px). */\n top: number;\n height: number;\n label: string;\n title: string;\n variant: string;\n color?: string;\n progress: number | null;\n isMilestone: boolean;\n clippedStart: boolean;\n clippedEnd: boolean;\n}\n\n/** Pasek zbiorczy grupy. */\ninterface SummaryVm {\n left: number;\n width: number;\n variant: string;\n color?: string;\n}\n\n/**\n * Roadmapa — wiersze zadań na poziomej osi czasu (widok typu Gantt).\n *\n * Układ opiera się na DOM i `position: sticky` (kolumna etykiet oraz nagłówek),\n * paski są pozycjonowane procentowo w torze, a zależności rysuje warstwa SVG\n * rozpięta nad torami. Cała geometria pochodzi z rdzenia w `../core`.\n */\n@Component({\n selector: 'kpt-roadmap',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [KptTooltip],\n templateUrl: './roadmap.component.html',\n styleUrl: './roadmap.component.scss',\n host: {\n class: 'kpt-roadmap',\n '[style.--kpt-roadmap-cells]': 'timeline().cells.length',\n '[style.--kpt-roadmap-cell-w.px]': 'cellWidth()',\n '[style.--kpt-roadmap-label-w]': 'labelWidth()',\n '[class.kpt-roadmap--fixed-height]': '!!scrollHeight()',\n },\n})\nexport class KptRoadmap<TItem = unknown, TGroup = unknown> {\n protected readonly i18n = inject(KptI18n);\n\n /** Pełna konfiguracja: dane, zoom, zakres i opcje. */\n readonly config = input.required<KptRoadmapConfig<TItem, TGroup>>();\n /** Stała wysokość obszaru przewijania (np. '420px'). Włącza przyklejony nagłówek. */\n readonly scrollHeight = input<string | null>(null);\n /** Szerokość kolumny etykiet. */\n readonly labelWidth = input('14rem');\n /** Szerokość kolumny osi czasu; brak ⇒ wartość zależna od zoomu. */\n readonly cellWidthPx = input<number | null>(null);\n /** Znacznik „dziś\". */\n readonly showToday = input(true, { transform: booleanAttribute });\n /** Renderowanie tylko widocznych wierszy. Warto włączyć od ~100 wierszy. */\n readonly virtual = input(false, { transform: booleanAttribute });\n\n /** Zwinięte grupy (dwukierunkowe). */\n readonly collapsedGroups = model<string[]>([]);\n\n /**\n * Grupy zwinięte na starcie przez `group.collapsed`. Trzymamy je osobno od modelu,\n * żeby dwukierunkowe wiązanie pozostało w rękach aplikacji, a zwinięcie zadeklarowane\n * w danych nadal działało. Resetuje się, gdy zmieni się lista grup.\n */\n private readonly collapsedFromConfig = linkedSignal<readonly KptRoadmapGroup<TGroup>[] | undefined, string[]>({\n source: () => this.config().groups,\n computation: (groups) => (groups ?? []).filter((group) => group.collapsed).map((group) => group.id),\n });\n\n /** Suma obu źródeł — stan faktycznie użyty do budowy wierszy. */\n private readonly collapsedIds = computed(() => new Set([...this.collapsedFromConfig(), ...this.collapsedGroups()]));\n\n readonly itemClick = output<KptRoadmapItem<TItem>>();\n /** Emitowane przy każdej zmianie wyliczonego zakresu osi. */\n readonly rangeChange = output<KptTimeRange>();\n\n private readonly scrollEl = viewChild<ElementRef<HTMLElement>>('scrollEl');\n private readonly laneEl = viewChild<ElementRef<HTMLElement>>('laneMeasure');\n\n protected readonly scrollTop = signal(0);\n protected readonly viewportHeight = signal(0);\n /** Szerokość toru w px — potrzebna warstwie SVG, która pracuje w pikselach. */\n protected readonly laneWidth = signal(0);\n\n protected readonly zoom = computed<KptRoadmapZoom>(() => this.config().zoom ?? 'week');\n protected readonly cellWidth = computed(() => this.cellWidthPx() ?? CELL_WIDTH[this.zoom()]);\n\n protected readonly range = computed(() => resolveRange(this.config(), this.config().items));\n\n protected readonly timeline = computed<KptTimelineModel>(() => {\n const config = this.config();\n return buildTimeline(this.range(), this.zoom(), {\n ...config.timeline,\n locale: config.locale ?? config.timeline?.locale ?? this.i18n.locale(),\n today: config.today ?? config.timeline?.today,\n weekPrefix: config.timeline?.weekPrefix ?? this.i18n.t('roadmap.week'),\n });\n });\n\n protected readonly layout = computed(() => {\n const config = this.config();\n return buildRows<TItem, TGroup>(config.items, config.groups, this.collapsedIds(), config.rows);\n });\n\n /** Wiersze faktycznie renderowane — całość albo okno wirtualizacji. */\n protected readonly visibleRows = computed<readonly KptRoadmapRow<TItem, TGroup>[]>(() => {\n const layout = this.layout();\n if (!this.virtual()) return layout.rows;\n const height = this.viewportHeight();\n if (height <= 0) return layout.rows;\n return sliceRows(layout, this.scrollTop(), height).rows;\n });\n\n protected readonly isEmpty = computed(() => this.layout().rows.length === 0);\n\n private readonly barHeight = computed(() => this.config().rows?.laneHeight ?? BAR_HEIGHT);\n\n constructor() {\n // Zakres jest wielkością wyliczaną — informujemy o nim po każdym przeliczeniu.\n afterRenderEffect(() => {\n this.rangeChange.emit(this.range());\n });\n\n // Pomiar toru i okna przewijania; oba wpływają wyłącznie na warstwę widoku.\n afterRenderEffect((onCleanup) => {\n const lane = this.laneEl()?.nativeElement;\n const scroll = this.scrollEl()?.nativeElement;\n if (!lane || typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(() => {\n this.laneWidth.set(lane.clientWidth);\n if (scroll) this.viewportHeight.set(scroll.clientHeight);\n });\n observer.observe(lane);\n if (scroll) observer.observe(scroll);\n\n this.laneWidth.set(lane.clientWidth);\n if (scroll) this.viewportHeight.set(scroll.clientHeight);\n\n onCleanup(() => observer.disconnect());\n });\n\n // Ostrzeżenie dla danych, których nie da się narysować.\n afterRenderEffect(() => {\n const invalid = this.layout().invalid;\n if (invalid.length > 0 && typeof ngDevMode !== 'undefined' && ngDevMode) {\n console.warn(\n '[kpt-roadmap] Pominięto elementy:',\n invalid.map((entry) => `${entry.id} (${entry.reason})`).join(', '),\n );\n }\n });\n }\n\n protected onScroll(event: Event): void {\n const target = event.target as HTMLElement;\n this.scrollTop.set(target.scrollTop);\n }\n\n /** Wysokość paska wraz z odstępem — wspólna dla widoku i geometrii zależności. */\n private laneStep(): number {\n return this.barHeight() + LANE_GAP;\n }\n\n /** Offset pionowy paska wewnątrz wiersza (px). */\n private barTop(row: KptRoadmapRow<TItem, TGroup>, lane: number): number {\n const total = row.laneCount * this.barHeight() + (row.laneCount - 1) * LANE_GAP;\n return Math.max(0, (row.height - total) / 2) + lane * this.laneStep();\n }\n\n /** Paski danego wiersza gotowe do renderu. */\n protected bars(row: KptRoadmapRow<TItem, TGroup>): BarVm<TItem>[] {\n const timeline = this.timeline();\n const height = this.barHeight();\n const result: BarVm<TItem>[] = [];\n\n for (const item of row.items) {\n const geom = timeline.span(item.start, item.end);\n if (!geom.visible) continue;\n const source = item.source;\n result.push({\n item,\n left: geom.left * 100,\n width: geom.width * 100,\n top: this.barTop(row, item.lane),\n height,\n label: source.label,\n title: source.sublabel ? `${source.label} — ${source.sublabel}` : source.label,\n variant: source.variant ?? 'primary',\n color: source.color,\n progress: source.progress ?? null,\n isMilestone: item.isMilestone,\n clippedStart: geom.clippedStart,\n clippedEnd: geom.clippedEnd,\n });\n }\n\n return result;\n }\n\n /** Pasek zbiorczy wiersza grupy. */\n protected summary(row: KptRoadmapRow<TItem, TGroup>): SummaryVm | null {\n const span = row.groupState?.span;\n if (!span) return null;\n const geom = this.timeline().span(span.start, span.end);\n if (!geom.visible) return null;\n return {\n left: geom.left * 100,\n width: geom.width * 100,\n variant: row.group?.variant ?? 'neutral',\n color: row.group?.color,\n };\n }\n\n /**\n * Geometria zależności w pikselach.\n * Liczona dopiero po zmierzeniu toru; wiersze poza oknem wirtualizacji\n * nie mają końców, więc ich krawędzie są pomijane.\n */\n protected readonly links = computed<readonly KptLinkGeom[]>(() => {\n const config = this.config();\n if (config.dependencies?.enabled === false) return [];\n\n const width = this.laneWidth();\n if (width <= 0) return [];\n\n const layout = this.layout();\n const timeline = this.timeline();\n const height = this.barHeight();\n\n const endpoints = new Map<string, KptLinkEndpoint>();\n for (const row of this.visibleRows()) {\n for (const item of row.items) {\n const geom = timeline.span(item.start, item.end);\n if (!geom.visible) continue;\n // Romb kamienia milowego jest renderowany wyśrodkowany na dacie\n // (`translateX(-50%)`), więc jego prostokąt zaczyna się o pół rozmiaru wcześniej.\n const left = geom.left * width - (item.isMilestone ? height / 2 : 0);\n endpoints.set(item.id, {\n id: item.id,\n rect: {\n x: left,\n y: row.top + this.barTop(row, item.lane),\n width: Math.max(geom.width * width, item.isMilestone ? height : 1),\n height,\n },\n startTs: item.start,\n endTs: item.end,\n });\n }\n }\n\n const resolved = resolveLinks([...layout.byId.values()], config.links);\n const result: KptLinkGeom[] = [];\n for (const link of resolved.links) {\n const geom = linkGeometry(link, endpoints.get(link.from), endpoints.get(link.to), config.dependencies);\n if (geom) result.push(geom);\n }\n return result;\n });\n\n protected toggleGroup(group: KptRoadmapGroup<TGroup>): void {\n const current = this.collapsedGroups();\n if (this.collapsedIds().has(group.id)) {\n // Rozwijanie musi zdjąć grupę z obu źródeł, inaczej `group.collapsed`\n // natychmiast zwinęłoby ją z powrotem.\n this.collapsedFromConfig.update((ids) => ids.filter((id) => id !== group.id));\n this.collapsedGroups.set(current.filter((id) => id !== group.id));\n return;\n }\n this.collapsedGroups.set([...current, group.id]);\n }\n\n protected onItemClick(item: KptRoadmapPlacedItem<TItem>): void {\n if (item.source.disabled) return;\n this.itemClick.emit(item.source);\n }\n\n /** Obsługa klawiatury na pasku — Enter/Spacja działają jak kliknięcie. */\n protected onItemKeydown(event: KeyboardEvent, item: KptRoadmapPlacedItem<TItem>): void {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n this.onItemClick(item);\n }\n\n /**\n * Treść dymka dla kolumny etykiet. Pusta tam, gdzie dymek nie miałby czego\n * uzupełnić — dyrektywa pomija wtedy podpowiedź.\n */\n protected labelTooltip(row: KptRoadmapRow<TItem, TGroup>): string {\n // Wiersz grupy ma własny dymek, osadzony głębiej (na stosie etykiet).\n if (row.kind === 'group') return '';\n // Tryb 'pack' mieści wiele zadań w jednym wierszu — nie ma jednej etykiety.\n if (row.items.length !== 1) return '';\n const source = row.items[0].source;\n return source.sublabel ? `${source.label} — ${source.sublabel}` : source.label;\n }\n\n protected isCollapsed(group: KptRoadmapGroup<TGroup> | undefined): boolean {\n return group ? this.collapsedIds().has(group.id) : false;\n }\n\n protected trackRow = (_: number, row: KptRoadmapRow<TItem, TGroup>): string => row.key;\n protected trackBar = (_: number, bar: BarVm<TItem>): string => bar.item.id;\n}\n\ndeclare const ngDevMode: boolean | undefined;\n","/*\n * Public API — @konce-pt/angular/roadmap\n * Roadmapa / oś czasu typu Gantt (sygnały, zoneless). Rdzeń obliczeń: pure TS.\n */\nexport { KptRoadmap } from './lib/roadmap.component';\n\nexport type {\n KptRoadmapConfig,\n KptRoadmapItem,\n KptRoadmapGroup,\n KptRoadmapLink,\n KptRoadmapLinkType,\n KptRoadmapZoom,\n KptRoadmapVariant,\n KptRoadmapChange,\n KptRoadmapChangeKind,\n KptRoadmapConstraints,\n KptRoadmapNormalizedItem,\n KptRoadmapPositionMode,\n KptRoadmapRowMode,\n KptRoadmapRowOptions,\n KptRoadmapSummaryMode,\n KptRoadmapDependencyOptions,\n KptRoadmapInteractionOptions,\n KptTimelineOptions,\n KptTimeRange,\n KptWorkHours,\n KptDateInput,\n} from './core/types';\n\nexport type { KptTimelineCell, KptTimelineBand, KptTimelineModel, KptSpanGeom } from './core/timeline';\nexport type {\n KptRoadmapRow,\n KptRoadmapRowKind,\n KptRoadmapLayout,\n KptRoadmapGroupState,\n KptRoadmapPlacedItem,\n} from './core/layout';\nexport type { KptLinkGeom, KptLinkEndpoint } from './core/links';\n\n// Rdzeń obliczeniowy (pure TS) — przydatny do własnych rozszerzeń, SSR i testów.\nexport { buildTimeline } from './core/timeline';\nexport { buildRows, normalizeItems, packLanes, sliceRows, spanOf, rollupProgress } from './core/layout';\nexport { resolveLinks, linkGeometry, roundedPolyline, arrowHead } from './core/links';\nexport { autoRange, resolveRange } from './core/auto-range';\nexport {\n isoWeekNumber,\n isoWeekYear,\n isoWeekday,\n isoWeeksInYear,\n startOfIsoWeek,\n startOfDay,\n addDays,\n addHours,\n addMonths,\n addUnits,\n floorToUnit,\n ceilToUnit,\n countUnits,\n diffDays,\n daysInMonth,\n isSameDay,\n toTimestamp,\n} from './core/calendar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}