@akcelik/strct 0.31.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akcelik/strct",
3
- "version": "0.31.1",
3
+ "version": "1.2.0",
4
4
  "description": "UIStruct — a standalone Angular component library with a tokenised, multi-palette theme system, built for datacenter / infrastructure management UIs.",
5
5
  "author": "Serkan Akcelik <serkan.akcelik@gmail.com>",
6
6
  "license": "MIT",
@@ -1798,6 +1798,8 @@ declare class StrctDatepicker implements ControlValueAccessor {
1798
1798
  /** Placeholder text when empty. */
1799
1799
  readonly placeholder: _angular_core.InputSignal<string>;
1800
1800
  protected readonly dow: string[];
1801
+ protected readonly dowFull: string[];
1802
+ protected readonly titleId: string;
1801
1803
  readonly value: _angular_core.WritableSignal<string>;
1802
1804
  readonly open: _angular_core.WritableSignal<boolean>;
1803
1805
  readonly isDisabled: _angular_core.WritableSignal<boolean>;
@@ -1808,12 +1810,21 @@ declare class StrctDatepicker implements ControlValueAccessor {
1808
1810
  protected readonly monthLabel: _angular_core.Signal<string>;
1809
1811
  protected readonly displayLabel: _angular_core.Signal<string>;
1810
1812
  protected readonly cells: _angular_core.Signal<DayCell[]>;
1813
+ /** The 42 cells chunked into ARIA grid rows (weeks). */
1814
+ protected readonly weeks: _angular_core.Signal<DayCell[][]>;
1815
+ /** Accessible name of one day cell: "Tuesday, March 4, 2026". */
1816
+ protected cellAria(cell: DayCell): string;
1811
1817
  private onChange;
1812
1818
  private onTouched;
1813
1819
  toggle(): void;
1814
1820
  shiftMonth(delta: number): void;
1815
1821
  pick(iso: string): void;
1822
+ constructor();
1816
1823
  onKeydown(event: KeyboardEvent): void;
1824
+ /** Day-of-week (0–6) of the keyboard cursor. */
1825
+ private focusedDow;
1826
+ /** Close the panel and hand focus back to the input. */
1827
+ private close;
1817
1828
  private syncFocus;
1818
1829
  private shiftFocus;
1819
1830
  protected onDocClick(event: MouseEvent): void;
@@ -2065,10 +2076,22 @@ interface StrctDatagridLazyState {
2065
2076
  sortKey: string | null;
2066
2077
  sortDir: SortDir;
2067
2078
  }
2068
- /** Persistable user column preferences (widths from resize, hidden from the chooser). */
2079
+ /** Persistable user column preferences (widths from resize, hidden from the
2080
+ * chooser, order from drag-reorder). */
2069
2081
  interface StrctDatagridColumnState {
2070
2082
  widths?: Record<string, number>;
2071
2083
  hidden?: string[];
2084
+ order?: string[];
2085
+ }
2086
+ /** One rendered tbody item: a data row, or a group header. */
2087
+ interface DgItem {
2088
+ row?: StrctRow;
2089
+ group?: {
2090
+ key: unknown;
2091
+ label: string;
2092
+ count: number;
2093
+ collapsed: boolean;
2094
+ };
2072
2095
  }
2073
2096
  /**
2074
2097
  * Marks the expandable-row detail template. The row is the template's implicit
@@ -2189,6 +2212,14 @@ declare class StrctDatagrid {
2189
2212
  readonly stateKey: _angular_core.InputSignal<string | null>;
2190
2213
  /** User column preferences (two-way): widths from resize, hidden from the chooser. */
2191
2214
  readonly columnState: _angular_core.ModelSignal<StrctDatagridColumnState | null>;
2215
+ /** Let the user reorder data columns by dragging their headers. */
2216
+ readonly reorderable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2217
+ /**
2218
+ * Group rows by this column key: the grid renders a collapsible header row
2219
+ * per distinct value (with a count), respecting the current sort within
2220
+ * groups. Paging is bypassed while grouped; not combinable with `virtual`.
2221
+ */
2222
+ readonly groupBy: _angular_core.InputSignal<string | null>;
2192
2223
  /** Emitted when the selection changes. */
2193
2224
  readonly selectionChange: _angular_core.OutputEmitterRef<StrctRow[]>;
2194
2225
  /** Emitted when the refresh button is clicked. */
@@ -2228,8 +2259,24 @@ declare class StrctDatagrid {
2228
2259
  protected readonly paneOpen: _angular_core.Signal<boolean>;
2229
2260
  /** Whether to render the trailing row-actions (kebab) column. */
2230
2261
  protected readonly canActions: _angular_core.Signal<boolean>;
2262
+ /** User-chosen column order (keys); unknown keys keep declared positions. */
2263
+ private readonly columnOrder;
2264
+ /** Declared columns re-arranged by the user's drag order. */
2265
+ private readonly orderedColumns;
2231
2266
  /** Only the first column is shown while the detail pane is open. */
2232
2267
  protected readonly visibleColumns: _angular_core.Signal<StrctDatagridColumn[]>;
2268
+ protected readonly dragKey: _angular_core.WritableSignal<string | null>;
2269
+ protected readonly dropKey: _angular_core.WritableSignal<string | null>;
2270
+ protected onColDragStart(key: string, event: DragEvent): void;
2271
+ protected onColDragOver(key: string, event: DragEvent): void;
2272
+ protected onColDrop(key: string): void;
2273
+ protected onColDragEnd(): void;
2274
+ private readonly collapsedGroups;
2275
+ /** Collapse / expand one group header. */
2276
+ toggleGroup(key: unknown): void;
2277
+ /** What tbody renders: plain (virtual/paged) rows, or groups + their rows. */
2278
+ protected readonly displayItems: _angular_core.Signal<DgItem[]>;
2279
+ protected itemKey(it: DgItem): unknown;
2233
2280
  protected readonly sorted: _angular_core.Signal<StrctRow[]>;
2234
2281
  protected readonly paged: _angular_core.Signal<StrctRow[]>;
2235
2282
  /** Full count for the pager / footer (server total in lazy mode). */
@@ -2273,6 +2320,14 @@ declare class StrctDatagrid {
2273
2320
  * current order (client mode: the full sorted set, not just the page).
2274
2321
  */
2275
2322
  toCSV(): string;
2323
+ /**
2324
+ * The grid as a real .xlsx workbook (dependency-free SpreadsheetML):
2325
+ * header labels + every non-hidden column in the current order, all rows in
2326
+ * the current sort; numeric cells stay numeric.
2327
+ */
2328
+ toXLSX(): Uint8Array;
2329
+ /** Download the grid as an .xlsx file. */
2330
+ downloadXLSX(filename?: string): void;
2276
2331
  /** Download the grid as a CSV file. */
2277
2332
  downloadCSV(filename?: string): void;
2278
2333
  protected colspan(): number;
@@ -2298,7 +2353,7 @@ declare class StrctDatagrid {
2298
2353
  private commitSelection;
2299
2354
  private compare;
2300
2355
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctDatagrid, never>;
2301
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "singleLine": { "alias": "singleLine"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; }, { "columnState": "columnStateChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2356
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctDatagrid, "strct-datagrid", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "detailPane": { "alias": "detailPane"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "singleLine": { "alias": "singleLine"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "resizable": { "alias": "resizable"; "required": false; "isSignal": true; }; "columnChooser": { "alias": "columnChooser"; "required": false; "isSignal": true; }; "sync": { "alias": "sync"; "required": false; "isSignal": true; }; "footerActionsDisabled": { "alias": "footerActionsDisabled"; "required": false; "isSignal": true; }; "rowId": { "alias": "rowId"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "initialSelection": { "alias": "initialSelection"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; "columnState": { "alias": "columnState"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; }, { "columnState": "columnStateChange"; "selectionChange": "selectionChange"; "syncChange": "syncChange"; "rowAction": "rowAction"; "lazyLoad": "lazyLoad"; }, ["detailDef", "actionBarDef", "cellDefs"], ["[strctDatagridActionBar]"], true, never>;
2302
2357
  }
2303
2358
 
2304
2359
  /** Timeline node state colors. */
@@ -2512,6 +2567,19 @@ declare class StrctChart {
2512
2567
  * Double-click, Escape or the reset chip zooms back out.
2513
2568
  */
2514
2569
  readonly zoom: _angular_core.InputSignalWithTransform<boolean, unknown>;
2570
+ /**
2571
+ * Stack multi-series values cumulatively: each series draws its line at the
2572
+ * running total and fills the band down to the series below (nulls break the
2573
+ * stack at that slot). Tooltips keep the original per-series values.
2574
+ */
2575
+ readonly stacked: _angular_core.InputSignalWithTransform<boolean, unknown>;
2576
+ /** Y-axis scale. `log` needs positive values; non-positives clamp to the floor. */
2577
+ readonly scale: _angular_core.InputSignal<"linear" | "log">;
2578
+ /**
2579
+ * Per-point timestamps (ms epoch or Date). When set, x positions map to real
2580
+ * time, so uneven sampling renders honestly instead of equally spaced.
2581
+ */
2582
+ readonly times: _angular_core.InputSignal<(number | Date)[] | null>;
2515
2583
  /** Tooltip text for a gap (null) point. */
2516
2584
  readonly gapText: _angular_core.InputSignal<string>;
2517
2585
  /** Accessible label of the reset-zoom chip (localizable). */
@@ -2565,11 +2633,16 @@ declare class StrctChart {
2565
2633
  private chartH;
2566
2634
  /** Horizontal gap between two data points, in px (of the visible window). */
2567
2635
  private stepX;
2568
- /** Real values inside the visible window (multi-aware; bands included). */
2636
+ /** Real values inside the visible window (multi-aware; bands included;
2637
+ * per-slot totals when stacked). */
2569
2638
  private readonly visibleValues;
2570
2639
  private readonly yMax;
2571
2640
  private readonly yMin;
2641
+ /** Smallest positive visible value — the floor of a log axis. */
2642
+ private readonly logFloor;
2572
2643
  private yOf;
2644
+ /** Timestamps normalized to ms (null when the axis is index-based). */
2645
+ private readonly timesMs;
2573
2646
  protected readonly points: _angular_core.Signal<(Pt | null)[]>;
2574
2647
  /** Non-gap points only (dot rendering). */
2575
2648
  protected readonly dotPts: _angular_core.Signal<Pt[]>;
@@ -2659,7 +2732,8 @@ declare class StrctChart {
2659
2732
  protected readonly chartAria: _angular_core.Signal<string>;
2660
2733
  /** aria-live text announcing the hovered / keyboard-selected point. */
2661
2734
  protected readonly srText: _angular_core.Signal<string>;
2662
- /** Pixel x of a data index (shared by the plot, labels and annotations). */
2735
+ /** Pixel x of a data index (shared by the plot, labels and annotations).
2736
+ * With `times`, positions map to real timestamps — uneven sampling shows. */
2663
2737
  protected xOf(i: number): number;
2664
2738
  /** Set the local hover index, emitting `hoverIndex` on change. */
2665
2739
  private setHover;
@@ -2680,7 +2754,7 @@ declare class StrctChart {
2680
2754
  /** The chart as a PNG data URL at the given scale (default 2×). */
2681
2755
  toPNG(scale?: number): Promise<string>;
2682
2756
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StrctChart, never>;
2683
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChart, "strct-chart", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "curve": { "alias": "curve"; "required": false; "isSignal": true; }; "area": { "alias": "area"; "required": false; "isSignal": true; }; "glow": { "alias": "glow"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "dots": { "alias": "dots"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "xTicks": { "alias": "xTicks"; "required": false; "isSignal": true; }; "xFormat": { "alias": "xFormat"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "yAxis": { "alias": "yAxis"; "required": false; "isSignal": true; }; "yTicks": { "alias": "yTicks"; "required": false; "isSignal": true; }; "axisFormat": { "alias": "axisFormat"; "required": false; "isSignal": true; }; "thresholds": { "alias": "thresholds"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "agoFormat": { "alias": "agoFormat"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "annotations": { "alias": "annotations"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "brush": { "alias": "brush"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "gapText": { "alias": "gapText"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; }, { "hoverIndex": "hoverIndex"; "brushChange": "brushChange"; }, never, never, true, never>;
2757
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StrctChart, "strct-chart", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "curve": { "alias": "curve"; "required": false; "isSignal": true; }; "area": { "alias": "area"; "required": false; "isSignal": true; }; "glow": { "alias": "glow"; "required": false; "isSignal": true; }; "live": { "alias": "live"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "dots": { "alias": "dots"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "xTicks": { "alias": "xTicks"; "required": false; "isSignal": true; }; "xFormat": { "alias": "xFormat"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "yAxis": { "alias": "yAxis"; "required": false; "isSignal": true; }; "yTicks": { "alias": "yTicks"; "required": false; "isSignal": true; }; "axisFormat": { "alias": "axisFormat"; "required": false; "isSignal": true; }; "thresholds": { "alias": "thresholds"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "agoFormat": { "alias": "agoFormat"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "annotations": { "alias": "annotations"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "brush": { "alias": "brush"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "times": { "alias": "times"; "required": false; "isSignal": true; }; "gapText": { "alias": "gapText"; "required": false; "isSignal": true; }; "resetLabel": { "alias": "resetLabel"; "required": false; "isSignal": true; }; }, { "hoverIndex": "hoverIndex"; "brushChange": "brushChange"; }, never, never, true, never>;
2684
2758
  }
2685
2759
 
2686
2760
  /** A single weighted slice of a donut chart. */