@frame-kit/ui-ng-patterns 0.1.7 → 0.1.8

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": "@frame-kit/ui-ng-patterns",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Opinionated, dashboard-ready Angular component patterns composed from @frame-kit/ui-ng.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -17,7 +17,7 @@
17
17
  "@angular/forms": "^21.2.0",
18
18
  "@angular/platform-browser": "^21.2.0",
19
19
  "@angular/router": "^21.2.0",
20
- "@frame-kit/ui-ng": "0.1.7",
20
+ "@frame-kit/ui-ng": "0.1.8",
21
21
  "rxjs": "^7.0.0"
22
22
  },
23
23
  "sideEffects": false,
@@ -39,8 +39,14 @@ declare class PageHeaderComponent {
39
39
  readonly title: _angular_core.InputSignal<string>;
40
40
  readonly description: _angular_core.InputSignal<string | null>;
41
41
  readonly headingLevel: _angular_core.InputSignal<HeadlineLevel>;
42
+ readonly className: _angular_core.InputSignal<string>;
43
+ readonly id: _angular_core.InputSignal<string | null>;
44
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
45
+ readonly classes: _angular_core.Signal<string>;
46
+ get hostClass(): string;
47
+ get hostId(): string | null;
42
48
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageHeaderComponent, never>;
43
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "fk-page-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "headingLevel": { "alias": "headingLevel"; "required": false; "isSignal": true; }; }, {}, never, ["[pageHeaderLeading]", "[pageHeaderTrailing]", "[pageHeaderActions]"], true, never>;
49
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "fk-page-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "headingLevel": { "alias": "headingLevel"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["[pageHeaderLeading]", "[pageHeaderTrailing]", "[pageHeaderActions]"], true, never>;
44
50
  }
45
51
 
46
52
  /**
@@ -90,9 +96,13 @@ declare class TableEmptyStateComponent {
90
96
  declare class ContentSplitLayoutComponent {
91
97
  readonly endWidth: _angular_core.InputSignal<string | null>;
92
98
  readonly gap: _angular_core.InputSignal<string>;
93
- readonly hostClass = "fk-content-split-layout";
99
+ readonly className: _angular_core.InputSignal<string>;
100
+ readonly id: _angular_core.InputSignal<string | null>;
101
+ readonly classes: _angular_core.Signal<string>;
102
+ get hostClass(): string;
103
+ get hostId(): string | null;
94
104
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentSplitLayoutComponent, never>;
95
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentSplitLayoutComponent, "fk-content-split-layout", never, { "endWidth": { "alias": "endWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; }, {}, never, ["[start]", "[end]"], true, never>;
105
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentSplitLayoutComponent, "fk-content-split-layout", never, { "endWidth": { "alias": "endWidth"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["[start]", "[end]"], true, never>;
96
106
  }
97
107
 
98
108
  /**
@@ -644,9 +654,9 @@ interface Point {
644
654
  * live in the widget and persist to `localStorage` under `storageKey` — these
645
655
  * are UI preferences, not part of the model.
646
656
  *
647
- * **Appearance-agnostic.** All colour flows through `--fk-*` tokens with neutral
648
- * (near-black / grey) raw fallbacks, so with no theme it renders monochrome;
649
- * point the tokens at a brand scale to colour it.
657
+ * **Opinionated but themeable.** It ships a house look out of the box; all
658
+ * colour flows through `--fk-onboarding-guide-*` tokens, so overriding those
659
+ * (e.g. pointing them at a brand scale) retints it without touching the markup.
650
660
  *
651
661
  * ```html
652
662
  * <fk-onboarding-guide
@@ -761,5 +771,184 @@ declare class OnboardingGuideComponent {
761
771
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OnboardingGuideComponent, "fk-onboarding-guide", never, { "steps": { "alias": "steps"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "startCollapsed": { "alias": "startCollapsed"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "markDoneLabel": { "alias": "markDoneLabel"; "required": false; "isSignal": true; }; "goLiveLabel": { "alias": "goLiveLabel"; "required": false; "isSignal": true; }; "stepsWord": { "alias": "stepsWord"; "required": false; "isSignal": true; }; "doneWord": { "alias": "doneWord"; "required": false; "isSignal": true; }; "stepsLeftWord": { "alias": "stepsLeftWord"; "required": false; "isSignal": true; }; "allDoneLabel": { "alias": "allDoneLabel"; "required": false; "isSignal": true; }; "renameLabel": { "alias": "renameLabel"; "required": false; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; "checkIcon": { "alias": "checkIcon"; "required": false; "isSignal": true; }; "caretIcon": { "alias": "caretIcon"; "required": false; "isSignal": true; }; "editIcon": { "alias": "editIcon"; "required": false; "isSignal": true; }; "collapseIcon": { "alias": "collapseIcon"; "required": false; "isSignal": true; }; "dismissIcon": { "alias": "dismissIcon"; "required": false; "isSignal": true; }; "expandIcon": { "alias": "expandIcon"; "required": false; "isSignal": true; }; "actionIcon": { "alias": "actionIcon"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "stepAction": "stepAction"; "stepMarkDone": "stepMarkDone"; "substepToggle": "substepToggle"; "goLive": "goLive"; "renameClick": "renameClick"; "dismiss": "dismiss"; "collapsedChange": "collapsedChange"; }, never, never, true, [{ directive: typeof i1.CdkDrag; inputs: {}; outputs: {}; }]>;
762
772
  }
763
773
 
764
- export { ColumnsComponent, ContentSplitLayoutComponent, DetailPanelComponent, DialogFooterComponent, DialogHeaderComponent, DialogShellComponent, OnboardingGuideComponent, PageHeaderComponent, SidebarNavComponent, SidebarNavItemDirective, TableEmptyStateComponent };
774
+ /**
775
+ * Layout for a dashboard search/filter bar. It lays out a primary search field
776
+ * and fixed-width filter dropdowns in a responsive row and compacts the
777
+ * projected `fk-form-field` / `fk-input` / `fk-select` controls to the house
778
+ * filter-bar size — so every dashboard's filter bar reads the same without
779
+ * per-page CSS.
780
+ *
781
+ * It owns **layout and responsiveness only** — no surrounding border,
782
+ * background, or elevation. If you want the bar to sit inside a card, wrap it in
783
+ * your own surface.
784
+ *
785
+ * Tag the primary search field with the `search` attribute (grows to fill) and
786
+ * each fixed-width filter with the `filter` attribute. Under a narrow container
787
+ * the row stacks and every control goes full-width.
788
+ *
789
+ * ```html
790
+ * <fk-search-bar-layout>
791
+ * <fk-form-field search>
792
+ * <fk-icon fkPrefix name="magnifier-outline" size="sm" />
793
+ * <fk-input formControlName="q" placeholder="Search…" />
794
+ * </fk-form-field>
795
+ *
796
+ * <fk-form-field filter>
797
+ * <fk-select formControlName="status" [options]="options" />
798
+ * </fk-form-field>
799
+ * </fk-search-bar-layout>
800
+ * ```
801
+ *
802
+ * Uses `ViewEncapsulation.None` so it can style the projected controls (the
803
+ * `[search]` / `[filter]` children and the select chevron); its rules are scoped
804
+ * under the block class.
805
+ */
806
+ declare class SearchBarLayoutComponent {
807
+ readonly className: _angular_core.InputSignal<string>;
808
+ readonly id: _angular_core.InputSignal<string | null>;
809
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
810
+ readonly classes: _angular_core.Signal<string>;
811
+ get hostClass(): string;
812
+ readonly role = "search";
813
+ get hostId(): string | null;
814
+ get hostAriaLabel(): string | null;
815
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SearchBarLayoutComponent, never>;
816
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SearchBarLayoutComponent, "fk-search-bar-layout", never, { "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
817
+ }
818
+
819
+ /**
820
+ * A titled content section for a dashboard page: an optional heading followed by
821
+ * projected content, with consistent vertical rhythm between the section and its
822
+ * own children.
823
+ *
824
+ * Spacing is top-margin only (never a parent `gap`), so a consumer's per-child
825
+ * `margin-top` overrides cleanly instead of stacking on an invisible gap. The
826
+ * first child sits flush; each subsequent child gets the section rhythm.
827
+ * `marginTop` overrides the section's own top margin per instance.
828
+ *
829
+ * ```html
830
+ * <fk-content-page-section title="Members" [level]="3">
831
+ * <p>…</p>
832
+ * <fk-data-table />
833
+ * </fk-content-page-section>
834
+ * ```
835
+ *
836
+ * Uses `ViewEncapsulation.None` so the inter-child rhythm rule reaches projected
837
+ * content; its rules are scoped under the block class.
838
+ */
839
+ declare class ContentPageSectionComponent {
840
+ readonly title: _angular_core.InputSignal<string | null>;
841
+ readonly level: _angular_core.InputSignal<HeadlineLevel>;
842
+ readonly marginTop: _angular_core.InputSignal<string | null>;
843
+ readonly className: _angular_core.InputSignal<string>;
844
+ readonly id: _angular_core.InputSignal<string | null>;
845
+ readonly classes: _angular_core.Signal<string>;
846
+ get hostClass(): string;
847
+ get hostId(): string | null;
848
+ get hostMarginTop(): string | null;
849
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentPageSectionComponent, never>;
850
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentPageSectionComponent, "fk-content-page-section", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "marginTop": { "alias": "marginTop"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
851
+ }
852
+
853
+ /**
854
+ * Lays its `fk-content-column` children out **side by side**, wrapping and
855
+ * ultimately stacking to a single column based on the row's *own* available
856
+ * width — never the viewport (so it reacts when a sidenav opens or it sits in a
857
+ * narrow panel). Same intrinsic CSS grid as `fk-columns`
858
+ * (`repeat(auto-fit, minmax(min, 1fr))`); `minColumnWidth` is the single knob
859
+ * for when columns stack.
860
+ *
861
+ * Optionally **bordered**, with an optional **headline**
862
+ * (`fk-content-column-headline`) that sits *outside* the border — so the row
863
+ * reads as a titled section wrapping a set of columns.
864
+ *
865
+ * ```html
866
+ * <fk-content-row [bordered]="true" minColumnWidth="16rem">
867
+ * <fk-content-column-headline>Providers</fk-content-column-headline>
868
+ * <fk-content-column>…</fk-content-column>
869
+ * <fk-content-column>…</fk-content-column>
870
+ * </fk-content-row>
871
+ * ```
872
+ */
873
+ declare class ContentRowComponent {
874
+ /**
875
+ * The smallest width a column may shrink to before the row drops to fewer
876
+ * columns — the single knob that controls when columns wrap/stack.
877
+ */
878
+ readonly minColumnWidth: _angular_core.InputSignal<string>;
879
+ /**
880
+ * Optional cap on how wide a column may grow. Unset (default), columns fill
881
+ * the row (`1fr`); when set, columns stop at this width and leftover space
882
+ * stays empty (columns aligned to the start).
883
+ */
884
+ readonly maxColumnWidth: _angular_core.InputSignal<string | null>;
885
+ /** Gap between side-by-side columns and between wrapped rows. */
886
+ readonly gutter: _angular_core.InputSignal<string>;
887
+ /** Draws a bordered, padded box around the columns (not the headline). */
888
+ readonly bordered: _angular_core.InputSignal<boolean>;
889
+ readonly className: _angular_core.InputSignal<string>;
890
+ readonly id: _angular_core.InputSignal<string | null>;
891
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
892
+ readonly classes: _angular_core.Signal<string>;
893
+ get hostClass(): string;
894
+ get hostId(): string | null;
895
+ get hostAriaLabel(): string | null;
896
+ get hostMin(): string;
897
+ get hostMax(): string | null;
898
+ get hostGutter(): string;
899
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentRowComponent, never>;
900
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentRowComponent, "fk-content-row", never, { "minColumnWidth": { "alias": "minColumnWidth"; "required": false; "isSignal": true; }; "maxColumnWidth": { "alias": "maxColumnWidth"; "required": false; "isSignal": true; }; "gutter": { "alias": "gutter"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["fk-content-column-headline", "*"], true, never>;
901
+ }
902
+
903
+ /**
904
+ * A single content column — a vertical block of stacked content, with an
905
+ * optional **border** and an optional **headline** (`fk-content-column-headline`)
906
+ * that sits *outside* that border. The semantic unit that goes inside an
907
+ * `fk-content-row` (which lays columns side by side and stacks them when narrow),
908
+ * or stands alone as a bordered, titled section.
909
+ *
910
+ * ```html
911
+ * <fk-content-column [bordered]="true">
912
+ * <fk-content-column-headline>Provider</fk-content-column-headline>
913
+ * …
914
+ * </fk-content-column>
915
+ * ```
916
+ */
917
+ declare class ContentColumnComponent {
918
+ /** Draws a bordered, padded box around the content (not the headline). */
919
+ readonly bordered: _angular_core.InputSignal<boolean>;
920
+ readonly className: _angular_core.InputSignal<string>;
921
+ readonly id: _angular_core.InputSignal<string | null>;
922
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
923
+ readonly classes: _angular_core.Signal<string>;
924
+ get hostClass(): string;
925
+ get hostId(): string | null;
926
+ get hostAriaLabel(): string | null;
927
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentColumnComponent, never>;
928
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentColumnComponent, "fk-content-column", never, { "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["fk-content-column-headline", "*"], true, never>;
929
+ }
930
+
931
+ /**
932
+ * Optional headline for `fk-content-column` / `fk-content-row`. Projected
933
+ * *outside* the bordered region, so it labels the group without being boxed in
934
+ * with the content. Projects its own text/markup.
935
+ *
936
+ * ```html
937
+ * <fk-content-column [bordered]="true">
938
+ * <fk-content-column-headline>Provider</fk-content-column-headline>
939
+ * …
940
+ * </fk-content-column>
941
+ * ```
942
+ */
943
+ declare class ContentColumnHeadlineComponent {
944
+ readonly className: _angular_core.InputSignal<string>;
945
+ readonly id: _angular_core.InputSignal<string | null>;
946
+ readonly classes: _angular_core.Signal<string>;
947
+ get hostClass(): string;
948
+ get hostId(): string | null;
949
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ContentColumnHeadlineComponent, never>;
950
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ContentColumnHeadlineComponent, "fk-content-column-headline", never, { "className": { "alias": "className"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
951
+ }
952
+
953
+ export { ColumnsComponent, ContentColumnComponent, ContentColumnHeadlineComponent, ContentPageSectionComponent, ContentRowComponent, ContentSplitLayoutComponent, DetailPanelComponent, DialogFooterComponent, DialogHeaderComponent, DialogShellComponent, OnboardingGuideComponent, PageHeaderComponent, SearchBarLayoutComponent, SidebarNavComponent, SidebarNavItemDirective, TableEmptyStateComponent };
765
954
  export type { DialogConfirmVariant, DialogHeaderTint, OnboardingStep, OnboardingSubstep, OnboardingSubstepToggle, SidebarNavChild, SidebarNavGroup, SidebarNavItem, SidebarNavLink, SidebarNavModel };