@evotecit/canopyx 0.3.15 → 0.3.18

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 (118) hide show
  1. package/CanopyX.Html/Assets/canopyx-board.css +50 -0
  2. package/CanopyX.Html/Assets/canopyx-board.js +39 -0
  3. package/CanopyX.Html/Assets/canopyx-buckets.js +15 -0
  4. package/CanopyX.Html/Assets/canopyx-calculations.css +7 -0
  5. package/CanopyX.Html/Assets/canopyx-calculations.js +52 -0
  6. package/CanopyX.Html/Assets/canopyx-calendar-edit.js +3 -3
  7. package/CanopyX.Html/Assets/canopyx-calendar.css +5 -24
  8. package/CanopyX.Html/Assets/canopyx-calendar.js +14 -19
  9. package/CanopyX.Html/Assets/canopyx-cell-range.js +16 -14
  10. package/CanopyX.Html/Assets/canopyx-changes.css +6 -24
  11. package/CanopyX.Html/Assets/canopyx-changes.js +18 -15
  12. package/CanopyX.Html/Assets/canopyx-compare.css +37 -0
  13. package/CanopyX.Html/Assets/canopyx-compare.js +12 -0
  14. package/CanopyX.Html/Assets/canopyx-data.js +3 -3
  15. package/CanopyX.Html/Assets/canopyx-editing.css +2 -2
  16. package/CanopyX.Html/Assets/canopyx-editing.js +2 -2
  17. package/CanopyX.Html/Assets/canopyx-enhance.js +4 -4
  18. package/CanopyX.Html/Assets/canopyx-export.js +54 -13
  19. package/CanopyX.Html/Assets/canopyx-facets.css +14 -5
  20. package/CanopyX.Html/Assets/canopyx-facets.js +19 -15
  21. package/CanopyX.Html/Assets/canopyx-filter-editor.css +71 -85
  22. package/CanopyX.Html/Assets/canopyx-filter-editor.js +20 -16
  23. package/CanopyX.Html/Assets/canopyx-flow-checks.css +2 -0
  24. package/CanopyX.Html/Assets/canopyx-flow-checks.js +5 -4
  25. package/CanopyX.Html/Assets/canopyx-flow-dialog.css +2 -0
  26. package/CanopyX.Html/Assets/canopyx-flow-dialog.js +1 -1
  27. package/CanopyX.Html/Assets/canopyx-flow-entry.css +136 -12
  28. package/CanopyX.Html/Assets/canopyx-flow-entry.js +5 -5
  29. package/CanopyX.Html/Assets/canopyx-flow-facts.js +2 -0
  30. package/CanopyX.Html/Assets/canopyx-flow-module.mjs +5 -5
  31. package/CanopyX.Html/Assets/canopyx-flow.js +8 -7
  32. package/CanopyX.Html/Assets/canopyx-format-editor.js +2 -2
  33. package/CanopyX.Html/Assets/canopyx-formatting.js +10 -9
  34. package/CanopyX.Html/Assets/canopyx-grid-module.mjs +185 -131
  35. package/CanopyX.Html/Assets/canopyx-grid.css +228 -96
  36. package/CanopyX.Html/Assets/canopyx-grid.js +185 -131
  37. package/CanopyX.Html/Assets/canopyx-grouping.css +22 -15
  38. package/CanopyX.Html/Assets/canopyx-grouping.js +24 -17
  39. package/CanopyX.Html/Assets/canopyx-interactive.css +197 -74
  40. package/CanopyX.Html/Assets/canopyx-interactive.js +38 -45
  41. package/CanopyX.Html/Assets/canopyx-labels-de.js +177 -9
  42. package/CanopyX.Html/Assets/canopyx-labels-es.js +177 -9
  43. package/CanopyX.Html/Assets/canopyx-labels-fr.js +176 -8
  44. package/CanopyX.Html/Assets/canopyx-labels-it.js +176 -8
  45. package/CanopyX.Html/Assets/canopyx-labels-pl.js +176 -8
  46. package/CanopyX.Html/Assets/canopyx-layouts.css +48 -20
  47. package/CanopyX.Html/Assets/canopyx-layouts.js +36 -14
  48. package/CanopyX.Html/Assets/canopyx-link.js +2 -2
  49. package/CanopyX.Html/Assets/canopyx-live.css +1 -3
  50. package/CanopyX.Html/Assets/canopyx-live.js +20 -15
  51. package/CanopyX.Html/Assets/canopyx-matrix.css +1 -8
  52. package/CanopyX.Html/Assets/canopyx-matrix.js +11 -11
  53. package/CanopyX.Html/Assets/canopyx-module.mjs +38 -45
  54. package/CanopyX.Html/Assets/canopyx-office-export.js +2936 -0
  55. package/CanopyX.Html/Assets/canopyx-path.css +45 -0
  56. package/CanopyX.Html/Assets/canopyx-path.js +28 -0
  57. package/CanopyX.Html/Assets/canopyx-pivot.css +75 -0
  58. package/CanopyX.Html/Assets/canopyx-pivot.js +72 -0
  59. package/CanopyX.Html/Assets/canopyx-plan.css +56 -0
  60. package/CanopyX.Html/Assets/canopyx-plan.js +67 -0
  61. package/CanopyX.Html/Assets/canopyx-presenters.js +2 -2
  62. package/CanopyX.Html/Assets/canopyx-record-panel.css +11 -2
  63. package/CanopyX.Html/Assets/canopyx-record-panel.js +18 -12
  64. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +225 -164
  65. package/CanopyX.Html/Assets/canopyx-reporting.css +240 -107
  66. package/CanopyX.Html/Assets/canopyx-reporting.js +225 -164
  67. package/CanopyX.Html/Assets/canopyx-stack.css +35 -0
  68. package/CanopyX.Html/Assets/canopyx-stack.js +24 -0
  69. package/CanopyX.Html/Assets/canopyx-time-slider.css +18 -0
  70. package/CanopyX.Html/Assets/canopyx-time-slider.js +27 -0
  71. package/CanopyX.Html/Assets/canopyx-timeline.js +6 -5
  72. package/CanopyX.Html/Assets/canopyx-tree-tools.css +36 -35
  73. package/CanopyX.Html/Assets/canopyx-tree-tools.js +15 -12
  74. package/CanopyX.Html/Assets/canopyx-ui-menu.css +41 -0
  75. package/CanopyX.Html/Assets/canopyx-ui-menu.js +64 -0
  76. package/CanopyX.Html/Assets/canopyx-ui-navigation.css +73 -0
  77. package/CanopyX.Html/Assets/canopyx-ui-navigation.js +39 -0
  78. package/CanopyX.Html/Assets/canopyx-ui-overlays.css +79 -0
  79. package/CanopyX.Html/Assets/canopyx-ui-overlays.js +42 -0
  80. package/CanopyX.Html/Assets/canopyx-ui-picker.css +12 -0
  81. package/CanopyX.Html/Assets/canopyx-ui-picker.js +6 -0
  82. package/CanopyX.Html/Assets/canopyx-ui-stepper.css +174 -0
  83. package/CanopyX.Html/Assets/canopyx-ui-stepper.js +48 -0
  84. package/CanopyX.Html/Assets/canopyx-ui-tabs.css +153 -0
  85. package/CanopyX.Html/Assets/canopyx-ui-tabs.js +47 -0
  86. package/CanopyX.Html/Assets/canopyx-values.css +5 -0
  87. package/CanopyX.Html/Assets/canopyx-values.js +13 -0
  88. package/CanopyX.Html/Assets/canopyx-view-intents.css +12 -0
  89. package/CanopyX.Html/Assets/canopyx-view-intents.js +56 -0
  90. package/CanopyX.Html/Assets/canopyx.css +197 -71
  91. package/CanopyX.Html/Assets/canopyx.js +29 -19
  92. package/JavaScript/board.d.ts +30 -0
  93. package/JavaScript/changes.d.ts +4 -1
  94. package/JavaScript/facets.d.ts +5 -3
  95. package/JavaScript/flow.d.ts +6 -0
  96. package/JavaScript/grid.d.ts +153 -17
  97. package/JavaScript/hosts.d.ts +14 -1
  98. package/JavaScript/index.d.ts +4 -2
  99. package/JavaScript/live.d.ts +2 -0
  100. package/JavaScript/locales/de.mjs +177 -9
  101. package/JavaScript/locales/es.mjs +177 -9
  102. package/JavaScript/locales/fr.mjs +176 -8
  103. package/JavaScript/locales/it.mjs +176 -8
  104. package/JavaScript/locales/pl.mjs +176 -8
  105. package/JavaScript/matrix.d.ts +4 -1
  106. package/JavaScript/path.d.ts +33 -0
  107. package/JavaScript/pivot.d.ts +135 -0
  108. package/JavaScript/plan.d.ts +23 -0
  109. package/JavaScript/protocol.d.ts +16 -3
  110. package/JavaScript/records.d.ts +20 -4
  111. package/JavaScript/stack.d.ts +28 -0
  112. package/JavaScript/time-slider.d.ts +58 -0
  113. package/JavaScript/ui.d.ts +261 -0
  114. package/JavaScript/view-intents.d.ts +45 -0
  115. package/README.md +22 -3
  116. package/ThirdParty/OfficeIMO/LICENSE +21 -0
  117. package/ThirdParty/OfficeIMO/README.md +13 -0
  118. package/package.json +76 -3
@@ -1,7 +1,14 @@
1
1
  // Generated from CanopyX/Views/Locales/labels.json by Build/Sync-Assets.ps1.
2
2
  const labels = Object.freeze({
3
3
  gridNoExportColumns: "Żadna widoczna kolumna nie obsługuje eksportu.",
4
+ gridDownloadXlsx: "Skoroszyt Excel (.xlsx)",
5
+ gridDownloadPdf: "PDF",
6
+ gridExportWorkbookHint: "Formatowanie, grupy i sumy",
7
+ gridExportPdfHint: "Raport stronicowany z powtarzanymi nagłówkami",
8
+ gridExportCsvHint: "Wartości tekstowe (.csv)",
9
+ gridExportCopy: "Kopiuj do schowka",
4
10
  searchPlaceholder: "Szukaj",
11
+ gridRegexSearch: "Szukaj według wzorca",
5
12
  searchResults: "Wyniki wyszukiwania",
6
13
  searchResultCount: "Wyniki: {count}",
7
14
  searchResultCountOfTotal: "Wyniki: {count} z {total}",
@@ -116,7 +123,7 @@ const labels = Object.freeze({
116
123
  gridAllResults: "Wszystkie wyniki",
117
124
  gridVisibleRows: "Widoczne wiersze",
118
125
  gridAllRows: "Wszystkie wiersze",
119
- gridDownloadCsv: "Pobierz plik CSV",
126
+ gridDownloadCsv: "CSV",
120
127
  gridCopy: "Kopiuj",
121
128
  gridDetails: "Szczegóły rekordu",
122
129
  gridCellRangeSelected: "Zaznaczono wiersze: {rows} × kolumny: {columns}",
@@ -215,7 +222,7 @@ const labels = Object.freeze({
215
222
  gridGroupMissing: "Brak wartości",
216
223
  gridGroupExpand: "Rozwiń grupę",
217
224
  gridGroupCollapse: "Zwiń grupę",
218
- gridSummary: "Podsumowanie wyników",
225
+ gridSummary: "Suma całkowita",
219
226
  gridGroupOrder: "Kolejność grup jest ustalona w raporcie",
220
227
  gridAggregateCount: "liczba {value}",
221
228
  gridAggregateSum: "suma {value}",
@@ -350,7 +357,7 @@ const labels = Object.freeze({
350
357
  gridLiveChanged: "Zmienione wiersze: dodane {added}, zaktualizowane {updated}, usunięte {removed}",
351
358
  gridLiveSorted: "Wiersze przeniesiono na miejsca zgodne z sortowaniem.",
352
359
  gridLiveRecordRemoved: "Ten rekord został usunięty.",
353
- gridFacetPanel: "Filtruj według",
360
+ gridFacetPanel: "Doprecyzuj",
354
361
  gridFacetPanelHide: "Ukryj panel filtrów",
355
362
  gridFacetPanelShow: "Pokaż panel filtrów",
356
363
  gridFacetShowMore: "Pokaż więcej: {count}",
@@ -506,11 +513,6 @@ const labels = Object.freeze({
506
513
  calendarOccurrenceTitle: "Zmień wydarzenie cykliczne",
507
514
  calendarOccurrenceReadOnly: "Nie można zapisać tej części serii, ponieważ niektóre wartości są tylko do odczytu.",
508
515
  calendarThisEvent: "To wydarzenie",
509
- calendarEditOccurrence: "Edytuj to wystąpienie",
510
- calendarRemoveOccurrence: "Usuń to wystąpienie",
511
- calendarOccurrenceScope: "Zmienia się tylko {date}; pozostałe daty wydarzenia {title} pozostają bez zmian.",
512
- calendarSharedResources: "{count} {resources}",
513
- calendarResourceWindow: "{resources} {start}–{end} z {total}",
514
516
  calendarThisAndFollowing: "To i następne wydarzenia",
515
517
  calendarAllEvents: "Wszystkie wydarzenia",
516
518
  calendarSources: "Kalendarze",
@@ -774,6 +776,172 @@ const labels = Object.freeze({
774
776
  changeCopyRequest: "Kopiuj żądanie",
775
777
  changeFiltered: "Filtry: {filters}",
776
778
  changePrintLimit: "Pominięte w wydruku wiersze: {count}.",
779
+ gridPivotFieldOptions: "Opcje pola",
780
+ gridCalculationResultType: "Typ wyniku",
781
+ gridCalculationDivideZero: "Dzielenie przez zero",
782
+ gridCalculationAdd: "Dodaj kolumnę obliczeniową",
783
+ gridCalculationTitle: "Nazwa kolumny",
784
+ gridCalculationId: "Identyfikator kolumny",
785
+ gridCalculationExpression: "Wyrażenie",
786
+ gridCalculationError: "Błąd obliczenia: {error}",
787
+ gridCalculationInvalid: "Sprawdź wyrażenie, odwołania do kolumn i typ wyniku.",
788
+ gridCalculationHelp: "Użyj [columnId], działań arytmetycznych, IF, COALESCE, ROUND, CONCAT, DATEPART lub DATEDIFF.",
789
+ gridCalculationNumber: "Liczba",
790
+ gridCalculationDate: "Data i czas",
791
+ gridPivot: "Tabela przestawna",
792
+ gridPivotRows: "Grupy wierszy",
793
+ gridPivotColumns: "Grupy kolumn",
794
+ gridPivotValues: "Wartości",
795
+ gridPivotFlat: "Pokaż rekordy",
796
+ gridPivotConfigure: "Ustawienia tabeli przestawnej",
797
+ gridPivotOther: "Pozostałe",
798
+ gridPivotLimited: "Widoczne ścieżki kolumn: {shown} z {total}; reszta w grupie Pozostałe. Sumy częściowe obejmują wszystkie pasujące elementy podrzędne.",
799
+ gridPivotColumn: "Wybierz kolumnę",
800
+ gridPivotTopN: "Najwyższe kolumny",
801
+ gridPivotSort: "Kolejność wierszy",
802
+ gridPivotDrill: "Pokaż rekordy dla: {row}, {column}",
803
+ gridPivotReturn: "Wróć do tabeli przestawnej",
804
+ gridPivotInvalid: "Wybierz poprawne osie i co najmniej jedną wartość.",
805
+ gridShowAs: "Pokaż wartości jako",
806
+ gridShowAsValue: "Wartość",
807
+ gridShowAsPercentGrandTotal: "% sumy całkowitej",
808
+ gridShowAsPercentParent: "% sumy grupy nadrzędnej",
809
+ gridShowAsPercentColumn: "% sumy kolumny",
810
+ gridShowAsPercentRow: "% sumy wiersza",
811
+ gridShowAsRunningTotal: "Suma narastająca",
812
+ gridShowAsRank: "Pozycja",
813
+ gridShowAsDifference: "Różnica względem poprzedniej wartości",
814
+ gridShowAsPercentChange: "% zmiany względem poprzedniej wartości",
815
+ gridBucket: "Przedział",
816
+ gridBucketNone: "Dokładne wartości",
817
+ gridBucketDay: "Dzień",
818
+ gridBucketWeek: "Tydzień",
819
+ gridBucketMonth: "Miesiąc",
820
+ gridBucketQuarter: "Kwartał",
821
+ gridBucketYear: "Rok",
822
+ gridBucketHour: "Godzina dnia",
823
+ gridBucketWeekday: "Dzień tygodnia",
824
+ gridBucketWidth: "Szerokość przedziału",
825
+ gridBucketEdges: "Granice przedziałów",
826
+ gridBucketOrigin: "Początek przedziałów",
827
+ gridBucketInvalid: "Podaj poprawne ustawienia przedziałów.",
828
+ boardLane: "Tor",
829
+ boardUnassigned: "Nieprzypisane",
830
+ boardEmpty: "Brak rekordów w tym torze",
831
+ boardWip: "{count} / {limit}",
832
+ boardWipFull: "Tor {lane} osiągnął limit pracy ({limit}).",
833
+ boardMove: "Przenieś do toru",
834
+ boardMoved: "Przeniesiono {title} do {lane}.",
835
+ boardRejected: "Przeniesienie nie zostało zaakceptowane.",
836
+ boardPending: "Oczekiwanie na akceptację przeniesienia…",
837
+ boardPartial: "Wyświetlono pierwsze {count} rekordów. Zawęź filtry, aby zobaczyć pozostałe.",
838
+ boardKeys: "Alt+Lewo lub Alt+Prawo przenosi między torami; Góra i Dół przegląda karty.",
839
+ planMilestone: "Kamień milowy",
840
+ planCritical: "Ścieżka krytyczna",
841
+ planBaseline: "Plan bazowy: {start} – {end}",
842
+ planDependency: "{from} kończy się przed rozpoczęciem {to}",
843
+ planDependencyConflict: "Konflikt zależności z {task}",
844
+ planOverlapConflict: "Nakłada się na {task}",
845
+ planIncomplete: "Pełna sieć zadań jest niedostępna; host musi sprawdzić tę propozycję.",
846
+ planInvalidRange: "Zadanie musi kończyć się w chwili rozpoczęcia lub później.",
847
+ planInvalidResource: "Wybierz zasób zadania.",
848
+ planProposal: "Propozycja {task}: {start} – {end}",
849
+ planMoveHint: "Alt+Lewo lub Alt+Prawo proponuje nową datę; Alt+Góra lub Alt+Dół proponuje zasób.",
850
+ planActual: "Rzeczywiste",
851
+ planPending: "Propozycja oczekuje na hosta",
852
+ planBaselineLabel: "Plan bazowy",
853
+ planDependencies: "Zależności",
854
+ planConflict: "Konflikt",
855
+ calendarEditOccurrence: "Edytuj to wystąpienie",
856
+ calendarRemoveOccurrence: "Usuń to wystąpienie",
857
+ calendarOccurrenceScope: "Zmienia się tylko {date}; pozostałe daty wydarzenia {title} pozostają bez zmian.",
858
+ calendarSharedResources: "{count} {resources}",
859
+ calendarResourceWindow: "{resources} {start}–{end} z {total}",
860
+ viewIntentWords: "Całe słowa",
861
+ viewIntentSubstring: "Tekst zawiera",
862
+ viewIntentPreview: "Proponowane zmiany",
863
+ viewIntentApplied: "Zastosowano zmiany widoku.",
864
+ viewIntentSuperseded: "Widok się zmienił. Ponownie wyświetl podgląd propozycji.",
865
+ viewIntentSearch: "Szukaj: {search}",
866
+ viewIntentSort: "Sortuj według {columns}",
867
+ viewIntentGroup: "Grupuj wiersze według {columns}",
868
+ viewIntentColumns: "Pokaż kolumny: {columns}",
869
+ compareSummary: "Porównanie zbiorów danych",
870
+ compareAdded: "Dodane",
871
+ compareRemoved: "Usunięte",
872
+ compareChanged: "Zmienione",
873
+ compareUnchanged: "Bez zmian",
874
+ compareOnlyChanges: "Tylko zmiany",
875
+ compareColumnChanges: "[one]{column}: {count} zmieniona komórka[few]{column}: {count} zmienione komórki[many]{column}: {count} zmienionych komórek[other]{column}: {count} zmienionych komórek",
876
+ compareChanges: "Zmiany",
877
+ viewIntentClearSearch: "Wyczyść wyszukiwanie",
878
+ viewIntentRemoveGrouping: "Usuń grupowanie",
879
+ viewIntentFlat: "Pokaż rekordy",
880
+ viewIntentAscending: "rosnąco",
881
+ viewIntentDescending: "malejąco",
882
+ viewIntentNotEqual: "nie jest",
883
+ viewIntentGreater: "większe niż",
884
+ viewIntentAtLeast: "co najmniej",
885
+ viewIntentLess: "mniejsze niż",
886
+ viewIntentAtMost: "co najwyżej",
887
+ viewIntentFilter: "Pokaż wiersze, gdzie {column} {operator} {values}",
888
+ viewIntentOnly: "Pokaż tylko {column}: {values}",
889
+ viewIntentPivot: "Wiersze: {rows}; kolumny: {columns}; wartości: {values}",
890
+ viewIntentAllRows: "wszystkie rekordy",
891
+ viewIntentTotals: "sumy",
892
+ viewIntentTuples: "Pokaż pasujące kombinacje {columns}: {values}",
893
+ viewIntentExcludeTuples: "Wyklucz pasujące kombinacje {columns}: {values}",
894
+ viewIntentNoChanges: "Ten widok jest już wybrany.",
895
+ pathEmpty: "Brak ścieżek do wyświetlenia",
896
+ pathSource: "Źródło",
897
+ pathTarget: "Cel",
898
+ pathStep: "Krok {number} z {total}",
899
+ pathCycle: "Cykl",
900
+ pathForeign: "Zewnętrzny",
901
+ pathDisabled: "Wyłączony",
902
+ pathKeys: "Przeglądaj kroki klawiszem Tab lub strzałkami; Enter lub Spacja otwiera rekord.",
903
+ pathPartial: "Wyświetlono {shown} z {total} kroków.",
904
+ stackWinner: "Wynik wybrany",
905
+ stackEnforced: "Wymuszona",
906
+ stackFiltered: "Odfiltrowana",
907
+ stackEmpty: "Brak warstw do wyświetlenia.",
908
+ stackOrder: "Kolejność przetwarzania",
909
+ stackTruncated: "Wyświetlono {shown} z {total} warstw w kolejności przetwarzania; wybrana warstwa jest zawsze uwzględniona.",
910
+ timePlay: "Odtwórz",
911
+ timePause: "Wstrzymaj",
912
+ timePrevious: "Poprzedni stan",
913
+ timeNext: "Następny stan",
914
+ timePosition: "Stan {index} z {count}",
915
+ timeFrame: "Stan z {time}",
916
+ timeReducedMotion: "Automatyczne odtwarzanie jest wyłączone z powodu ograniczenia ruchu. Przeglądaj stany ręcznie.",
917
+ tabsMore: "Więcej",
918
+ tabsMoreSelected: "Więcej: {label}",
919
+ tabsScrollPrevious: "Poprzednie karty",
920
+ tabsScrollNext: "Następne karty",
921
+ tabsSection: "Sekcja",
922
+ tabsPosition: "{current} z {total}",
923
+ tabsPause: "Wstrzymaj",
924
+ tabsPlay: "Odtwórz",
925
+ tabsMotionDisabled: "Automatyczne przełączanie kart jest wyłączone przy ograniczeniu ruchu",
926
+ stepperStepOf: "Krok {current} z {total}",
927
+ stepperBack: "Wstecz",
928
+ stepperNext: "Dalej",
929
+ stepperFinish: "Zakończ",
930
+ stepperSkip: "Pomiń",
931
+ stepperSaveDraft: "Zapisz wersję roboczą",
932
+ stepperAllSteps: "Wszystkie kroki",
933
+ stepperOptional: "Opcjonalny",
934
+ stepperCompleted: "Ukończono",
935
+ stepperSkipped: "Pominięto",
936
+ stepperIssues: "Problemy do rozwiązania: {count}",
937
+ stepperIssue: "1 problem do rozwiązania",
938
+ dialogClose: "Zamknij",
939
+ drawerClose: "Zamknij",
940
+ drawerPrevious: "Poprzedni rekord",
941
+ drawerNext: "Następny rekord",
942
+ stateLoading: "Ładowanie…",
943
+ stateRetry: "Ponów",
944
+ stateDetails: "Szczegóły",
777
945
  });
778
946
  const staticLabels = Object.freeze({
779
947
  overflowNote: "Pokazano {shown} z {total} wierszy.",
@@ -1,3 +1,4 @@
1
+ import type { TimePlaybackApi } from "./time-slider.js";
1
2
  // Type declarations for the matrix view (docs/matrix.md): the matrix document, its state and the API of createMatrix.
2
3
  import type { CellValue } from "./protocol.js";
3
4
 
@@ -139,6 +140,8 @@ export interface MatrixOptions {
139
140
 
140
141
  /** The API of a matrix. Call it once `ready` has settled; a call made before the matrix part is in waits for it and returns a promise instead. */
141
142
  export interface MatrixApi {
143
+ /** Snapshot controls; available after ready when the document supplies timeSlider. */
144
+ readonly playback: TimePlaybackApi;
142
145
  readonly element: HTMLElement;
143
146
  readonly view: MatrixDocument;
144
147
  readonly ready: Promise<MatrixApi>;
@@ -154,7 +157,7 @@ export interface MatrixApi {
154
157
  /** Moves focus to a cell; false when the row or column is not shown. */
155
158
  focusCell(row: string, column: string): boolean;
156
159
  /** Replaces the document, keeping the query that still applies (live refresh). */
157
- update(view: MatrixDocument): void;
160
+ update(view: MatrixDocument): void | Promise<void>;
158
161
  destroy(): void;
159
162
  }
160
163
 
@@ -0,0 +1,33 @@
1
+ import type { CanopyBadge } from "./protocol.js";
2
+
3
+ /** An annotation supplied by the host, never inferred from the records. Disabled steps still open for reading. */
4
+ export type GridPathFlag = "cycle" | "foreign" | "disabled";
5
+
6
+ /** One occurrence of a record; repeated identities retain their supplied position and annotations. */
7
+ export interface GridPathHop {
8
+ /** Explicit stable identity of an existing inline grid record. */
9
+ record: string;
10
+ /** Optional host explanation, 1 to 4,096 characters, nonblank and without controls. */
11
+ label?: string;
12
+ /** Distinct annotations in display order. */
13
+ flags?: GridPathFlag[];
14
+ /** Up to 16 existing-wire badges; text is at most 256 characters and title at most 4,096. */
15
+ badges?: CanopyBadge[];
16
+ }
17
+
18
+ /** A source-to-target chain with one to 256 explicitly ordered steps. */
19
+ export interface GridPathChain {
20
+ /** Unique among chains; nonblank, without controls, at most 256 characters. */
21
+ id: string;
22
+ /** Nonblank host heading without controls, at most 4,096 characters. */
23
+ label: string;
24
+ hops: GridPathHop[];
25
+ }
26
+
27
+ /** Optional path renderer over stable inline grid records. No route discovery or domain calculations. */
28
+ export interface GridPathDefinition {
29
+ /** Defaults to the row header, then the first visible column. */
30
+ titleColumn?: string;
31
+ /** At most 200 chains and 10,000 step occurrences in total. Empty shows the empty state. */
32
+ chains: GridPathChain[];
33
+ }
@@ -0,0 +1,135 @@
1
+ import type { CellValue } from "./protocol.js";
2
+ import type { GridAggregateDisplayValue, GridGroupLevel, GridQuery } from "./grid.js";
3
+
4
+ /** A declared sortable/filterable field, optionally bucketed. Aggregate ordering uses sortByTotal instead. */
5
+ export type GridPivotLevel = Omit<GridGroupLevel, "aggregate">;
6
+ /** Bounded full-query cross-tabulation. The value axis names declared reporting aggregates. */
7
+ export interface GridPivotDefinition {
8
+ /** Up to four levels, outermost first. Empty axes produce totals only. */
9
+ readonly rows: readonly GridPivotLevel[];
10
+ /** Up to two levels, outermost first. */
11
+ readonly columns: readonly GridPivotLevel[];
12
+ /** One to 32 distinct declared aggregate IDs. */
13
+ readonly values: readonly string[];
14
+ /** One to 200 leaf columns including Other; defaults to 200. */
15
+ readonly maxColumns?: number;
16
+ /** One to 200 highest-total complete column paths, ranked by the first value aggregate. */
17
+ readonly topNColumns?: number;
18
+ readonly sortByTotal?: { readonly aggregate: string; readonly direction: "asc" | "desc" };
19
+ }
20
+ /** Presentation intent saved with the view; collapsing never changes raw result aggregates. */
21
+ export interface GridPivotState extends GridPivotDefinition {
22
+ readonly active: boolean;
23
+ readonly collapsedRows: readonly string[];
24
+ readonly collapsedColumns: readonly string[];
25
+ /** The selected column on a compact screen. Keys are opaque result identities. */
26
+ readonly columnKey?: string;
27
+ }
28
+ /** An offset query with a mandatory accepted revision, plus its pivot definition. Paging does not limit pivot input. */
29
+ export interface GridPivotQuery {
30
+ readonly protocol: "canopyx/2";
31
+ readonly type: "gridPivotQuery";
32
+ readonly query: GridQuery & { readonly revision: string };
33
+ readonly definition: GridPivotDefinition;
34
+ }
35
+ /** A raw prefix, total, or synthetic Other node. Datetime path operands retain explicit-zone ISO strings. */
36
+ export interface GridPivotAxisNode {
37
+ /** Opaque bounded identity; at most 65536 UTF-16 code units. */
38
+ readonly key: string;
39
+ readonly parent?: string;
40
+ readonly path: readonly CellValue[];
41
+ readonly other: boolean;
42
+ }
43
+ /** A populated prefix intersection. Missing intersections have zero counts and operation-specific empty values. */
44
+ export interface GridPivotCell {
45
+ readonly row: string;
46
+ readonly column: string;
47
+ readonly count: number;
48
+ readonly aggregates: Readonly<Record<string, number | null>>;
49
+ }
50
+ /** The data-only result written by CanopyPivot.Compute(...).ToJson(); no dataset ownership is implied. */
51
+ export interface GridPivotResult {
52
+ readonly protocol: "canopyx/2";
53
+ readonly type: "gridPivot";
54
+ readonly view: string;
55
+ readonly definition: GridPivotDefinition;
56
+ readonly matched: number;
57
+ readonly distinctColumns: number;
58
+ readonly columnsLimited: boolean;
59
+ /** Total first, followed by depth-first prefixes; at most 10001 nodes. */
60
+ readonly rows: readonly GridPivotAxisNode[];
61
+ /** Total first, retained prefixes, then Other; at most 402 nodes. */
62
+ readonly columns: readonly GridPivotAxisNode[];
63
+ /** Complete retained column paths, used as one atomic exclusion predicate for Other drill-through. */
64
+ readonly retainedColumns: readonly (readonly CellValue[])[];
65
+ /** At most 100000 populated intersections, including exact prefix totals. */
66
+ readonly cells: readonly GridPivotCell[];
67
+ }
68
+ /** Hosted and browser-accepted results echo the exact accepted offset query and its revision. */
69
+ export interface GridPivotAcceptedResult extends GridPivotResult {
70
+ readonly query: GridQuery & { readonly revision: string };
71
+ readonly revision: string;
72
+ }
73
+ /** Numeric export values stay numeric; adapters apply numberFormat instead of parsing text. */
74
+ export interface GridPivotExportValue extends GridAggregateDisplayValue { readonly text: string; }
75
+ /** Presentation of an accepted axis identity. Prefix summaries precede their descendants; grand totals follow them. */
76
+ export interface GridPivotExportAxisPresentation {
77
+ /** Opaque key into rowAxis or columnAxis; do not infer identity from a localized title. */
78
+ readonly axisKey: string;
79
+ readonly outlineLevel: number;
80
+ readonly summary: boolean;
81
+ readonly grandTotal: boolean;
82
+ readonly collapsed: boolean;
83
+ readonly hidden: boolean;
84
+ }
85
+ export interface GridPivotExportRow extends GridPivotExportAxisPresentation {
86
+ readonly id: string;
87
+ readonly cells: Readonly<Record<string, GridPivotExportValue | { readonly value: string; readonly text: string }>>;
88
+ }
89
+ export interface GridPivotExportColumn extends GridPivotExportAxisPresentation {
90
+ readonly id: string;
91
+ readonly title: string;
92
+ readonly kind: "number";
93
+ readonly aggregate: string;
94
+ }
95
+ /** A contiguous descendant range, excluding its leading prefix summary columns. */
96
+ export interface GridPivotExportColumnGroup {
97
+ readonly key: string;
98
+ readonly parent?: string;
99
+ /** Zero-based index into snapshot.columns, including the row-label column. */
100
+ readonly firstColumn: number;
101
+ readonly columnCount: number;
102
+ /** One-based axis depth. */
103
+ readonly depth: number;
104
+ readonly collapsed: boolean;
105
+ readonly hidden: boolean;
106
+ }
107
+ /** Frozen full-query pivot export, independent of flat-record export scopes. Includes all prefixes and descendants. */
108
+ export interface GridPivotExportSnapshot {
109
+ readonly view: string;
110
+ readonly query: GridQuery;
111
+ readonly definition: GridPivotDefinition;
112
+ readonly columns: readonly ({ readonly id: string; readonly title: string; readonly kind: "text" } | GridPivotExportColumn)[];
113
+ readonly rows: readonly GridPivotExportRow[];
114
+ readonly columnGroups: readonly GridPivotExportColumnGroup[];
115
+ readonly rowAxis: readonly GridPivotAxisNode[];
116
+ readonly columnAxis: readonly GridPivotAxisNode[];
117
+ /** Underlying accepted records, not the number of projected prefix rows. */
118
+ readonly matched: number;
119
+ readonly distinctColumns: number;
120
+ readonly retainedColumns: readonly (readonly CellValue[])[];
121
+ /** Omitted complete paths are combined in Other; the accepted record scope and totals remain complete. */
122
+ readonly columnsLimited: boolean;
123
+ }
124
+ /** Data-only pivot metadata accompanying an ordinary frozen export capture. Columns and enumerated rows stay outside it. */
125
+ export type GridPivotExportDescriptor = Pick<GridPivotExportSnapshot,
126
+ "definition" | "rowAxis" | "columnAxis" | "columnGroups" | "distinctColumns" | "retainedColumns" | "columnsLimited">;
127
+ /** Available only on reporting grids with an initial pivot or pivotable enabled. */
128
+ export interface GridPivotApi {
129
+ getPivot?(): GridPivotState | null;
130
+ /** False shows flat records while retaining the configured definition. Resolves after acceptance. */
131
+ setPivot?(definition: GridPivotDefinition | false): Promise<void>;
132
+ getPivotResult?(): GridPivotAcceptedResult | null;
133
+ getPivotExport?(): Promise<GridPivotExportSnapshot>;
134
+ setPivotCollapsed?(axis: "rows" | "columns", key: string, collapsed: boolean): Promise<void>;
135
+ }
@@ -0,0 +1,23 @@
1
+ /** Optional planning over the calendar resource timeline; durations and lags use elapsed time. */
2
+ export interface GridPlanDefinition {
3
+ baselineStart?: string;
4
+ baselineEnd?: string;
5
+ /** Boolean or text 'true' cells declare milestones; zero-duration tasks are milestones too. */
6
+ milestone?: string;
7
+ /** Emphasize zero-slack tasks only when the complete task network is available. Defaults to true. */
8
+ criticalPath?: boolean;
9
+ proposeMoves?: boolean;
10
+ avoidOverlap?: boolean;
11
+ dependencies?: { predecessor: string; successor: string; lagMinutes?: number }[];
12
+ }
13
+
14
+ /** A proposal leaves actual dates and resources unchanged; the host validates, persists and refreshes them. */
15
+ export interface GridPlanChangeProposal {
16
+ readonly id: string;
17
+ readonly previous: { readonly start: string; readonly end: string; readonly resource: string | null };
18
+ readonly proposed: { readonly start: string; readonly end: string; readonly resource: string | null };
19
+ readonly conflicts: readonly { readonly kind: string; readonly id: string | null; readonly label: string }[];
20
+ }
21
+ export interface GridPlanOptions {
22
+ propose?(proposal: GridPlanChangeProposal, context: { signal: AbortSignal }): void | PromiseLike<void>;
23
+ }
@@ -202,10 +202,12 @@ export type InlineNode = LeafNode | DetailNode | InlineBranch<InlineNode>;
202
202
 
203
203
  /** Names accepted by the interactive runtime; omitted translations use English. */
204
204
  export type LabelName =
205
+ | "gridShowAs" | "gridShowAsValue" | "gridShowAsPercentGrandTotal" | "gridShowAsPercentParent" | "gridShowAsPercentColumn" | "gridShowAsPercentRow" | "gridShowAsRunningTotal" | "gridShowAsRank" | "gridShowAsDifference" | "gridShowAsPercentChange"
206
+ | "gridBucket" | "gridBucketNone" | "gridBucketDay" | "gridBucketWeek" | "gridBucketMonth" | "gridBucketQuarter" | "gridBucketYear" | "gridBucketHour" | "gridBucketWeekday" | "gridBucketWidth" | "gridBucketEdges" | "gridBucketOrigin" | "gridBucketInvalid"
205
207
  | "gridPaging" | "gridPageRange" | "gridPageNumber" | "gridPageLength" | "gridFirstPage" | "gridPreviousPage" | "gridNextPage" | "gridLastPage" | "gridPageInfo" | "gridPageInfoFiltered" | "gridPageButton"
206
208
  | "gridUnknownCount" | "gridMatchedCount" | "gridCursorRange"
207
- | "gridResultCount" | "gridClearQuery" | "gridRemoveSearch" | "gridGroupedFilters" | "gridRemoveGroup" | "gridRemoveCondition"
208
- | "gridExport" | "gridFilteredResults" | "gridSelectedRows" | "gridAllResults" | "gridVisibleRows" | "gridAllRows" | "gridDownloadCsv" | "gridCopy" | "gridDetails"
209
+ | "gridResultCount" | "gridRegexSearch" | "gridClearQuery" | "gridRemoveSearch" | "gridGroupedFilters" | "gridRemoveGroup" | "gridRemoveCondition"
210
+ | "gridExport" | "gridFilteredResults" | "gridSelectedRows" | "gridAllResults" | "gridVisibleRows" | "gridAllRows" | "gridDownloadCsv" | "gridDownloadXlsx" | "gridDownloadPdf" | "gridCopy" | "gridDetails"
209
211
  | "searchPlaceholder" | "searchResults" | "searchResultCount" | "searchResultCountOfTotal"
210
212
  | "searchResultCountOfMany" | "searchNoResults" | "searchTooShort" | "searchWordTooShort" | "searchFailed"
211
213
  | "columns" | "hiddenColumns" | "visibleColumns" | "resizeColumn" | "columnWidth" | "loading" | "loadError" | "queryFailed"
@@ -225,6 +227,7 @@ export type LabelName =
225
227
  | "gridSelectionQueryCount" | "gridSelectionQueryUnknown" | "gridSelectRecord"
226
228
  | "gridGroupHeading" | "gridGroupMissing" | "gridGroupExpand" | "gridGroupCollapse" | "gridSummary" | "gridGroupOrder" | "gridAggregateCount" | "gridAggregateSum" | "gridAggregateAverage" | "gridAggregateMinimum" | "gridAggregateMaximum" | "gridGroupBy" | "gridUngroup" | "gridGroupDrop" | "gridExpandAll" | "gridCollapseAll" | "gridExpandLevel" | "gridCollapseLevel" | "gridGroupMove" | "gridGroupSortBy" | "gridGroupSortValue" | "gridGroupSortAggregate" | "gridSelectGroup" | "gridAggregateDistinct" | "gridShowDetail" | "gridHideDetail" | "gridDetailOf" | "gridDetailFailed"
227
229
  | "gridExportProgress" | "gridExportReading" | "gridExportCancelled" | "gridCancelExport" | "gridNoExportColumns" | "gridPrint"
230
+ | "gridExportWorkbookHint" | "gridExportPdfHint" | "gridExportCsvHint" | "gridExportCopy"
228
231
  | "matchesHighlight" | "matchesCount" | "matchesPosition" | "matchesNone" | "matchesLoaded" | "matchesPrevious" | "matchesNext" | "matchesAnnounce"
229
232
  | "layoutMenu" | "layoutFit" | "layoutScroll" | "layoutCards" | "layoutDensity" | "layoutCompact" | "layoutNormal" | "layoutComfortable" | "layoutChanged" | "layoutSort"
230
233
  | "gridFitContent"
@@ -270,7 +273,17 @@ export type LabelName =
270
273
  | "calendarZoom" | "calendarZoomHour" | "calendarZoomDay" | "calendarZoomWeek" | "calendarZoomMonth" | "calendarZoomQuarter" | "calendarResources" | "calendarCapacity"
271
274
  | "calendarCapacityAt" | "calendarBusy" | "calendarOverlaps" | "calendarUnavailable" | "calendarOutsideHours" | "calendarConflict" | "calendarNotAllowed" | "calendarMoved"
272
275
  | "calendarResized" | "calendarSeriesMoved" | "calendarSeriesTime" | "calendarMoveHelp" | "calendarEdit" | "calendarSaveFailed" | "calendarExport" | "calendarTimeRange" | "calendarSelected"
273
- | "calendarLane" | "calendarHighlighted";
276
+ | "calendarLane" | "calendarHighlighted"
277
+ /** Standalone UI primitives; their English defaults load with the optional UI parts. */
278
+ | "tabsMore" | "tabsMoreSelected" | "tabsScrollPrevious" | "tabsScrollNext" | "tabsSection" | "tabsPosition" | "tabsPause" | "tabsPlay" | "tabsMotionDisabled"
279
+ | "stepperStepOf" | "stepperBack" | "stepperNext" | "stepperFinish" | "stepperSkip" | "stepperSaveDraft"
280
+ | "stepperAllSteps" | "stepperOptional" | "stepperCompleted" | "stepperSkipped" | "stepperIssues" | "stepperIssue"
281
+ | "dialogClose" | "drawerClose" | "drawerPrevious" | "drawerNext" | "stateLoading" | "stateRetry" | "stateDetails"
282
+ | "boardLane" | "boardUnassigned" | "boardEmpty" | "boardWip" | "boardWipFull" | "boardMove" | "boardMoved" | "boardRejected" | "boardPending" | "boardPartial" | "boardKeys" | "planMilestone" | "planCritical" | "planBaseline" | "planDependency" | "planDependencyConflict" | "planOverlapConflict" | "planIncomplete" | "planInvalidRange" | "planInvalidResource" | "planProposal" | "planMoveHint" | "planActual" | "planPending" | "planBaselineLabel" | "planDependencies" | "planConflict"
283
+ | "pathEmpty" | "pathSource" | "pathTarget" | "pathStep" | "pathCycle" | "pathForeign" | "pathDisabled" | "pathKeys" | "pathPartial" | "stackWinner" | "stackEnforced" | "stackFiltered" | "stackEmpty" | "stackOrder" | "stackTruncated" | "timePlay" | "timePause" | "timePrevious" | "timeNext" | "timePosition" | "timeFrame" | "timeReducedMotion"
284
+ /** Calculated-column editor and stable per-cell errors (flat grids only). */
285
+ | "gridCalculationAdd" | "gridCalculationTitle" | "gridCalculationId" | "gridCalculationExpression" | "gridCalculationError" | "gridCalculationInvalid" | "gridCalculationHelp" | "gridCalculationNumber" | "gridCalculationDate" | "gridCalculationResultType" | "gridCalculationDivideZero" | "gridPivotFieldOptions"
286
+ | "compareChanges" | "viewIntentClearSearch" | "viewIntentRemoveGrouping" | "viewIntentFlat" | "viewIntentAscending" | "viewIntentDescending" | "viewIntentNotEqual" | "viewIntentGreater" | "viewIntentAtLeast" | "viewIntentLess" | "viewIntentAtMost" | "viewIntentFilter" | "viewIntentOnly" | "viewIntentPivot" | "viewIntentAllRows" | "viewIntentTotals" | "viewIntentTuples" | "viewIntentExcludeTuples" | "viewIntentNoChanges" | "viewIntentPreview" | "viewIntentApplied" | "viewIntentSuperseded" | "viewIntentSearch" | "viewIntentSort" | "viewIntentGroup" | "viewIntentColumns" | "compareSummary" | "compareAdded" | "compareRemoved" | "compareChanged" | "compareUnchanged" | "compareOnlyChanges" | "compareColumnChanges" | "viewIntentWords" | "viewIntentSubstring";
274
287
  export type CanopyLabels = Partial<Record<LabelName, string>>;
275
288
 
276
289
  export interface InlineSourceDefinition { kind: "inline"; }
@@ -110,11 +110,21 @@ export interface RecordSectionContext {
110
110
  /** Draws a drawer section's content (a chart, for example) into element. */
111
111
  export type RecordSectionRenderer = (record: Readonly<{ id: string; cells?: Readonly<Record<string, Cell>>; fields?: Readonly<Record<string, Cell>>; label?: string }>,
112
112
  element: HTMLElement, context: RecordSectionContext) => void | PromiseLike<void>;
113
- /** An action of the record panel's actions menu. */
113
+ /** A detached snapshot of the selected record and its loaded details. */
114
+ export interface RecordActionContext {
115
+ readonly record: Readonly<{ id: string; cells?: Readonly<Record<string, Cell>>; fields?: Readonly<Record<string, Cell>> }>;
116
+ readonly view: string; readonly api: unknown; readonly payload: GridRecord | null; readonly signal: AbortSignal;
117
+ }
118
+ /** An action of the record panel's actions menu. Hosts must enforce authorization again when executing it. */
114
119
  export interface RecordAction {
120
+ /** Keeps the action focusable in its menu while preventing activation. */
121
+ readonly disabled?: boolean;
122
+ /** Evaluated after each record paint, including loaded details. Hidden actions cannot run through a stale control. */
123
+ readonly visible?: boolean | ((context: RecordActionContext) => boolean);
124
+ /** Also renders this action as a visible footer button. Menu access is retained. */
125
+ readonly prominent?: boolean | ((context: RecordActionContext) => boolean);
115
126
  readonly label: string;
116
- run(context: { readonly record: Readonly<{ id: string; cells?: Readonly<Record<string, Cell>>; fields?: Readonly<Record<string, Cell>> }>; readonly view: string; readonly api: unknown;
117
- readonly payload: GridRecord | null; readonly signal: AbortSignal }): void | PromiseLike<void>;
127
+ run(context: RecordActionContext): void | PromiseLike<void>;
118
128
  }
119
129
  /** The canopyx:openAll event's detail (and onOpenAll's argument): cancel it to filter the target grid yourself. */
120
130
  export interface RecordOpenAll {
@@ -122,9 +132,15 @@ export interface RecordOpenAll {
122
132
  readonly filters: readonly { readonly column: string; readonly operator: string; readonly values: readonly CellValue[] }[] | null;
123
133
  }
124
134
  /** Options that open a record (openRecord). */
125
- export interface OpenRecordOptions { readonly returnFocus?: Element | null; readonly path?: readonly string[]; readonly tab?: string; }
135
+ export interface OpenRecordOptions {
136
+ readonly returnFocus?: Element | null; readonly path?: readonly string[]; readonly tab?: string;
137
+ /** Read this record's details again after a host mutation, even when the grid's row/revision has not changed. */
138
+ readonly reload?: boolean;
139
+ }
126
140
  /** Host options of the record panel, on grids and trees. */
127
141
  export interface RecordPanelOptions {
142
+ /** Plain-text heading projection. The record is a detached read-only snapshot; title and subtitle are bounded. */
143
+ recordHeading?: (record: Readonly<{id:string; cells?:Readonly<Record<string,Cell>>; fields?:Readonly<Record<string,Cell>>}>) => {title:string;subtitle?:string};
128
144
  /** Loads a record's details when its drawer opens; used whatever the declared source. */
129
145
  loadRecord?: RecordLoader;
130
146
  /** Section renderers by name, beside the plugins' drawerSections. */
@@ -0,0 +1,28 @@
1
+ import type { CanopyBadge } from "./protocol.js";
2
+
3
+ /** Optional inline stack explanation. The host supplies processing order, states, reasons and the winner. */
4
+ export interface GridStackDefinition {
5
+ /** A declared column; defaults to the row-header column, then the first visible column. */
6
+ titleColumn?: string;
7
+ /** Up to 1,000 ordered layers. Empty is valid; a nonempty stack has exactly one winner. */
8
+ layers: GridStackLayer[];
9
+ }
10
+
11
+ /** A layer's identity is independent of its record, so several layers can open the same record panel. */
12
+ export interface GridStackLayer {
13
+ /** Unique, stable layer id. */
14
+ id: string;
15
+ /** Existing stable inline grid record id. */
16
+ record: string;
17
+ /** Nonblank host explanation; CanopyX performs no precedence calculations. */
18
+ reason: string;
19
+ /** Optional context in addition to the record title. */
20
+ label?: string;
21
+ /** Exactly one true value in a nonempty stack. A winner cannot be filtered. */
22
+ winner?: boolean;
23
+ /** Host-supplied state, independent of winner selection. */
24
+ enforced?: boolean;
25
+ /** Host-supplied exclusion, kept visible with its reason. */
26
+ filtered?: boolean;
27
+ badges?: CanopyBadge[];
28
+ }
@@ -0,0 +1,58 @@
1
+ // Host-provided snapshot replay for matrix and propagation views (docs/time-slider.md).
2
+ import type { MatrixDocument } from "./matrix.js";
3
+ import type { PropagationDocument } from "./changes.js";
4
+
5
+ /** One complete view captured by the host, with the parent view's id and type. Nested sliders are forbidden. */
6
+ export interface TimeSnapshot<T extends MatrixDocument | PropagationDocument> {
7
+ /** ISO 8601 instant with a zone. Instants are distinct and strictly ascending at Date.parse millisecond precision. */
8
+ at: string;
9
+ /** Optional visible description of this frame, at most 200 characters. */
10
+ label?: string;
11
+ view: Omit<T, "timeSlider"> & { timeSlider?: never };
12
+ }
13
+
14
+ /** Local replay of 1 to 500 host-provided frames. Playback starts manually; no history is fetched. */
15
+ export interface TimeSlider<T extends MatrixDocument | PropagationDocument> {
16
+ /** Timed playback interval, 100 to 60,000 milliseconds. Defaults to 1,000. Reduced motion disables timed play. */
17
+ interval?: number;
18
+ /** Zero-based initial frame index. Omitted selects the latest frame. */
19
+ initial?: number;
20
+ snapshots: TimeSnapshot<T>[];
21
+ }
22
+
23
+ /** Current frame and playback status. Available after the containing view's ready promise resolves. */
24
+ export interface TimePlaybackState {
25
+ /** Zero-based selected frame. */
26
+ index: number;
27
+ count: number;
28
+ /** The selected snapshot's ISO 8601 instant. */
29
+ at: string;
30
+ playing: boolean;
31
+ reducedMotion: boolean;
32
+ }
33
+
34
+ /** The nested api.playback controller. Methods are synchronous after api.ready, which includes initial frame application. */
35
+ export interface TimePlaybackApi {
36
+ /** Starts timed replay unless reduced motion is requested. */
37
+ play(): void;
38
+ pause(): void;
39
+ /** Moves by delta frames, one forward by default. */
40
+ step(delta?: number): void;
41
+ /** Selects a zero-based frame. */
42
+ seek(index: number): void;
43
+ getState(): TimePlaybackState;
44
+ }
45
+
46
+ declare module "./matrix.js" {
47
+ interface MatrixDocument {
48
+ /** Optional local snapshot replay. Manual stepping remains available with reduced motion. */
49
+ timeSlider?: TimeSlider<MatrixDocument>;
50
+ }
51
+ }
52
+
53
+ declare module "./changes.js" {
54
+ interface PropagationDocument {
55
+ /** Optional local snapshot replay. Manual stepping remains available with reduced motion. */
56
+ timeSlider?: TimeSlider<PropagationDocument>;
57
+ }
58
+ }