@foxeltech/angular-ui 0.7.108 → 0.7.131

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 (31) hide show
  1. package/components.css +24 -5
  2. package/fesm2022/foxeltech-angular-ui-chart.mjs +25 -1
  3. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
  4. package/fesm2022/foxeltech-angular-ui-flow.mjs +42 -11
  5. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
  6. package/fesm2022/foxeltech-angular-ui.mjs +102 -28
  7. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  8. package/package.json +3 -2
  9. package/src/lib/styles/components.css +24 -5
  10. package/src/lib/styles/tokens.css +3 -0
  11. package/src/lib/styles/utilities.css +9 -4
  12. package/src/lib/ui/components/bar-list/bar-list.component.html +19 -18
  13. package/src/lib/ui/components/bar-list/bar-list.component.scss +63 -0
  14. package/src/lib/ui/components/breadcrumb/breadcrumb.component.css +31 -0
  15. package/src/lib/ui/components/breadcrumb/breadcrumb.component.html +6 -1
  16. package/src/lib/ui/components/button/button.component.html +37 -225
  17. package/src/lib/ui/components/button/button.component.scss +30 -0
  18. package/src/lib/ui/components/drawer/drawer.component.html +32 -7
  19. package/src/lib/ui/components/drawer/drawer.component.scss +114 -17
  20. package/src/lib/ui/components/filter-pills/filter-pills.component.html +4 -1
  21. package/src/lib/ui/components/filter-pills/filter-pills.component.scss +23 -0
  22. package/src/lib/ui/components/master-detail/master-detail.component.css +36 -8
  23. package/src/lib/ui/components/master-detail/master-detail.component.html +4 -2
  24. package/src/lib/ui/components/section-card/section-card.component.html +10 -5
  25. package/src/lib/ui/components/section-card/section-card.component.scss +28 -0
  26. package/src/lib/ui/components/stat-cards/stat-cards.component.css +48 -0
  27. package/src/lib/ui/components/stat-cards/stat-cards.component.html +16 -7
  28. package/tokens.css +3 -0
  29. package/types/foxeltech-angular-ui-flow.d.ts +24 -2
  30. package/types/foxeltech-angular-ui.d.ts +92 -5
  31. package/utilities.css +9 -4
@@ -16,6 +16,8 @@ import * as i1 from '@ngx-translate/core';
16
16
  import { TranslateService } from '@ngx-translate/core';
17
17
  import { ComponentType } from '@angular/cdk/portal';
18
18
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
19
+ import * as lucide_angular from 'lucide-angular';
20
+ import { LucideIconData } from 'lucide-angular';
19
21
 
20
22
  declare abstract class BaseComponent implements OnDestroy {
21
23
  protected injector: Injector;
@@ -1050,6 +1052,12 @@ interface Breadcrumb {
1050
1052
  mono?: boolean;
1051
1053
  /** Dropdown to switch the entity this crumb names. */
1052
1054
  switcher?: BreadcrumbSwitcher;
1055
+ /**
1056
+ * Renders the crumb as an accent CTA pill instead of a link or a chip — the
1057
+ * reference's "+ Create project" closing the Project Management trail.
1058
+ * Navigates to `url`; `icon` is the leading mark and defaults to `plus`.
1059
+ */
1060
+ cta?: boolean;
1053
1061
  }
1054
1062
  declare class BreadcrumbService {
1055
1063
  private breadcrumbs$;
@@ -1703,6 +1711,14 @@ interface DrawerItem {
1703
1711
  id: string;
1704
1712
  label: string;
1705
1713
  icon: string;
1714
+ /**
1715
+ * Lucide icon DATA (from `FX_LUCIDE_ICONS`), drawn instead of the HeroIcon
1716
+ * sprite when given. Data, not a name: the LUCIDE_ICONS provider does not
1717
+ * reach a federated remote's components — see FxLucideModule.
1718
+ */
1719
+ iconData?: unknown;
1720
+ /** Fill the lucide mark instead of outlining it (the reference's ❖ is solid). */
1721
+ iconSolid?: boolean;
1706
1722
  /** V2: renders as a non-interactive section caption (flat nav, no accordion). */
1707
1723
  heading?: boolean;
1708
1724
  route?: string;
@@ -1732,6 +1748,13 @@ declare class DrawerComponent implements OnInit, OnDestroy {
1732
1748
  constructor(router: Router);
1733
1749
  ngOnInit(): void;
1734
1750
  ngOnDestroy(): void;
1751
+ /**
1752
+ * Ignores presses while the 300ms width animation is still running. The
1753
+ * button rides the drawer's edge, travelling ~190px as it animates, so a
1754
+ * second press lands on whatever the button has just slid away from — and a
1755
+ * mid-flight toggle leaves the animation and `isExpanded` out of step.
1756
+ */
1757
+ private toggleLocked;
1735
1758
  toggleDrawer(): void;
1736
1759
  toggleAccordion(itemId: string): void;
1737
1760
  isAccordionExpanded(itemId: string): boolean;
@@ -1858,6 +1881,12 @@ interface FxFilterPillOption {
1858
1881
  label: string;
1859
1882
  /** Shown muted beside the label; null/undefined renders no count. */
1860
1883
  count?: number | null;
1884
+ /**
1885
+ * Optional lucide icon DATA (from `FX_LUCIDE_ICONS`), drawn before the label.
1886
+ * Passed as data rather than by name because the LUCIDE_ICONS provider does
1887
+ * not reach a federated remote's components — see FxLucideModule.
1888
+ */
1889
+ icon?: LucideIconData;
1861
1890
  }
1862
1891
  /**
1863
1892
  * V2 filter pills — the quick-filter row above ranked lists (design refs 02,
@@ -2068,8 +2097,27 @@ declare class MasterDetailComponent implements AfterViewInit, AfterContentInit {
2068
2097
  /** True when the host projected a [mdFacets] block — switches to 3 columns. */
2069
2098
  hasFacets: boolean;
2070
2099
  table: BaseMasterDetailComponent<any>;
2071
- /** Fixed list-pane width on lg+ viewports (stacked full-width below). */
2072
- readonly listWidth: _angular_core.InputSignal<string>;
2100
+ /**
2101
+ * Optional CAP on the list pane.
2102
+ *
2103
+ * The list is the flexible track now (the design's `204px 1fr 340px`), so it
2104
+ * takes whatever the rail and the detail leave. Set this only for a screen
2105
+ * whose rows genuinely stop reading better past some width; left unset the
2106
+ * property is not emitted at all and the pane simply fills.
2107
+ */
2108
+ readonly listWidth: _angular_core.InputSignal<string | null>;
2109
+ /**
2110
+ * The detail pane's fixed track — the design's own 340px, and 450px on the
2111
+ * screens anh Tú widened (17/09).
2112
+ *
2113
+ * Pass `'auto'` (or null) to give the detail the SPARE width instead and cap
2114
+ * the list at `listWidth` — the pre-0.7.130 behaviour, which Binaries and
2115
+ * Remediation keep because their panes carry header blocks, metric grids and
2116
+ * step lists that a narrow track cannot hold.
2117
+ */
2118
+ readonly detailWidth: _angular_core.InputSignal<string | null>;
2119
+ /** true = detail takes the spare width; false = it is a fixed track. */
2120
+ protected detailFluid(): boolean;
2073
2121
  /**
2074
2122
  * Chiều cao CHUNG của cả ba cụm (facets / list / detail). Mặc định trừ phần
2075
2123
  * chrome phía trên (topbar + tab strip + context line) khỏi viewport để
@@ -2115,7 +2163,7 @@ declare class MasterDetailComponent implements AfterViewInit, AfterContentInit {
2115
2163
  optionId(index: number): string;
2116
2164
  onKeydown(event: KeyboardEvent, index: number): void;
2117
2165
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MasterDetailComponent, never>;
2118
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; "isSignal": true; }; "paneHeight": { "alias": "paneHeight"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "skeletonCards": { "alias": "skeletonCards"; "required": false; "isSignal": true; }; "paginationStyle": { "alias": "paginationStyle"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "pageLabel": { "alias": "pageLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "facetsOpen": { "alias": "facetsOpen"; "required": false; "isSignal": true; }; "facetsLabel": { "alias": "facetsLabel"; "required": false; "isSignal": true; }; "expandFacetsLabel": { "alias": "expandFacetsLabel"; "required": false; "isSignal": true; }; "collapseFacetsLabel": { "alias": "collapseFacetsLabel"; "required": false; "isSignal": true; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdFacets]", "[mdHeader]", "[mdFilters]"], true, never>;
2166
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MasterDetailComponent, "fx-ui-master-detail", never, { "table": { "alias": "table"; "required": false; }; "listWidth": { "alias": "listWidth"; "required": false; "isSignal": true; }; "detailWidth": { "alias": "detailWidth"; "required": false; "isSignal": true; }; "paneHeight": { "alias": "paneHeight"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "skeletonCards": { "alias": "skeletonCards"; "required": false; "isSignal": true; }; "paginationStyle": { "alias": "paginationStyle"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "pageLabel": { "alias": "pageLabel"; "required": false; "isSignal": true; }; "ofLabel": { "alias": "ofLabel"; "required": false; "isSignal": true; }; "facetsOpen": { "alias": "facetsOpen"; "required": false; "isSignal": true; }; "facetsLabel": { "alias": "facetsLabel"; "required": false; "isSignal": true; }; "expandFacetsLabel": { "alias": "expandFacetsLabel"; "required": false; "isSignal": true; }; "collapseFacetsLabel": { "alias": "collapseFacetsLabel"; "required": false; "isSignal": true; }; }, {}, ["rowTemplate", "detailTemplate"], ["[mdFacets]", "[mdHeader]", "[mdFilters]"], true, never>;
2119
2167
  }
2120
2168
 
2121
2169
  interface FxMenuItem {
@@ -2471,7 +2519,6 @@ declare class BarListComponent {
2471
2519
  readonly select: _angular_core.OutputEmitterRef<FxBarListItem>;
2472
2520
  readonly max: _angular_core.Signal<number>;
2473
2521
  widthOf(item: FxBarListItem): number;
2474
- barClass(item: FxBarListItem): string;
2475
2522
  onSelect(item: FxBarListItem): void;
2476
2523
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BarListComponent, never>;
2477
2524
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BarListComponent, "fx-ui-bar-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
@@ -2769,6 +2816,46 @@ declare class UiModule {
2769
2816
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<UiModule>;
2770
2817
  }
2771
2818
 
2819
+ /**
2820
+ * The lucide marks this design system draws, PICKED rather than pulled in whole:
2821
+ * `lucide-angular` ships ~2,100 icons and `pick()` is the only thing keeping the
2822
+ * bundle to the ones actually rendered.
2823
+ *
2824
+ * Heroicons remain the general-purpose set — `fx-ui-hero-icon` serves them from
2825
+ * the self-hosted sprite with no runtime icon library, and that does not change.
2826
+ * Lucide is here for the two marks the Binary Intelligence reference draws as
2827
+ * inline SVG of its own, which the sprite has no equivalent of:
2828
+ *
2829
+ * - `star` the GitHub star beside a PoC's star count
2830
+ * - `radiation` the proprietary-exploit mark (identified by matching the
2831
+ * reference's path data against lucide-static, 16/09)
2832
+ * - `download` the Download PoC action in the exploit detail footer
2833
+ *
2834
+ * And the four sidebar marks, chosen to match the reference's nav GLYPHS shape
2835
+ * for shape rather than by meaning (16/09):
2836
+ * `▦` → `grid-2x2` a square split by a cross
2837
+ * `⊞` → `square-plus` a square with a plus inside
2838
+ * `▤` → `rows-3` a square split into three bands
2839
+ * `❖` → `diamond` a diamond outline
2840
+ *
2841
+ * Usage: import `FxLucideModule`, then `<lucide-icon name="star" [size]="12" />`.
2842
+ * Names are kebab-case; the component pascal-cases them to look the icon up.
2843
+ */
2844
+ declare const FX_LUCIDE_ICONS: {
2845
+ Star: lucide_angular.LucideIconData;
2846
+ Radiation: lucide_angular.LucideIconData;
2847
+ Download: lucide_angular.LucideIconData;
2848
+ Grid2x2: lucide_angular.LucideIconData;
2849
+ SquarePlus: lucide_angular.LucideIconData;
2850
+ Rows3: lucide_angular.LucideIconData;
2851
+ Diamond: lucide_angular.LucideIconData;
2852
+ };
2853
+ declare class FxLucideModule {
2854
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FxLucideModule, never>;
2855
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<FxLucideModule, never, [typeof lucide_angular.LucideAngularModule], [typeof lucide_angular.LucideAngularModule]>;
2856
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<FxLucideModule>;
2857
+ }
2858
+
2772
2859
  /** Users who asked the OS for reduced motion get instant state changes. */
2773
2860
  declare function fxMotionAllowed(): boolean;
2774
2861
  /** Shared timing so every screen moves the same way. */
@@ -2785,5 +2872,5 @@ declare const FX_MOTION: {
2785
2872
  /** Motion directives exported by UiModule (GSAP-based, reduced-motion aware). */
2786
2873
  declare const FX_MOTION_DIRECTIVES: readonly [typeof FxRevealDirective, typeof FxRevealGroupDirective, typeof FxCountUpDirective];
2787
2874
 
2788
- export { AuthInterceptor, AuthStateService, BarListComponent, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseTableComponent, BreadcrumbComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, CodeBlockComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FX_MOTION, FX_MOTION_DIRECTIVES, FX_SKELETON_DATA_KEY, FacetsRailComponent, FilterChipsComponent, FilterPillsComponent, FxComponent, FxCountUpDirective, FxDialogService, FxLoadStatusService, FxLoadingService, FxRevealDirective, FxRevealGroupDirective, FxRouteSkeletonService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, ListRowComponent, LoadStatusComponent, LoadingPanel, MasterDetailComponent, MenuComponent, MeterComponent, NotificationService, OG_LIGHT_THEMES, OG_PICKER_THEMES, OG_PICKER_THEME_META, OG_THEMES, OG_THEME_META, PendingBadgeComponent, PermissionGuard, PermissionService, PipelineStepperComponent, ProjectCardComponent, RadioButtonComponent, RadioButtonToggleComponent, RealtimeTableSync, RouteSkeletonComponent, SampleFrameComponent, ScoreBadgeComponent, ScreenshotFrameComponent, SearchBarComponent, SectionCardComponent, SegmentedComponent, SelectComponent, SeverityBadgesComponent, SkeletonDashboardComponent, SkeletonDetailComponent, SkeletonFacetsComponent, SkeletonFrameComponent, SkeletonListComponent, SliderComponent, SparkbarComponent, StageDotsComponent, StatCardsComponent, StatusDotComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemePickerComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule, anyFeatureEnabled, countTone, createApi, featureEnabled, fxListResolver, fxMotionAllowed, fxRevealElement, scoreTone, severityTone, toneBadge, toneBadgeSolid, toneBg, toneBorder, toneColor, toneDot, toneDotChart, toneFg, toneScale, toneText, toneTint };
2875
+ export { AuthInterceptor, AuthStateService, BarListComponent, BaseComponent, BaseDialogComponent, BaseMasterDetailComponent, BaseTableComponent, BreadcrumbComponent, BreadcrumbService, ButtonComponent, CheckboxComponent, CircleProgressBar, CodeBlockComponent, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, DrawerComponent, EmptyStateComponent, FX_ICON_SPRITE_URL, FX_LUCIDE_ICONS, FX_MOTION, FX_MOTION_DIRECTIVES, FX_SKELETON_DATA_KEY, FacetsRailComponent, FilterChipsComponent, FilterPillsComponent, FxComponent, FxCountUpDirective, FxDialogService, FxLoadStatusService, FxLoadingService, FxLucideModule, FxRevealDirective, FxRevealGroupDirective, FxRouteSkeletonService, FxStorageService, FxToastrService, FxUtils, FxValidators, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InfoFieldComponent, InputComponent, KanbanBoardComponent, ListRowComponent, LoadStatusComponent, LoadingPanel, MasterDetailComponent, MenuComponent, MeterComponent, NotificationService, OG_LIGHT_THEMES, OG_PICKER_THEMES, OG_PICKER_THEME_META, OG_THEMES, OG_THEME_META, PendingBadgeComponent, PermissionGuard, PermissionService, PipelineStepperComponent, ProjectCardComponent, RadioButtonComponent, RadioButtonToggleComponent, RealtimeTableSync, RouteSkeletonComponent, SampleFrameComponent, ScoreBadgeComponent, ScreenshotFrameComponent, SearchBarComponent, SectionCardComponent, SegmentedComponent, SelectComponent, SeverityBadgesComponent, SkeletonDashboardComponent, SkeletonDetailComponent, SkeletonFacetsComponent, SkeletonFrameComponent, SkeletonListComponent, SliderComponent, SparkbarComponent, StageDotsComponent, StatCardsComponent, StatusDotComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemePickerComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule, anyFeatureEnabled, countTone, createApi, featureEnabled, fxListResolver, fxMotionAllowed, fxRevealElement, scoreTone, severityTone, toneBadge, toneBadgeSolid, toneBg, toneBorder, toneColor, toneDot, toneDotChart, toneFg, toneScale, toneText, toneTint };
2789
2876
  export type { Breadcrumb, BreadcrumbOption, BreadcrumbSwitcher, ColumnChangedEvent, DrawerItem, ErrorMessages, FxApiClass, FxBarListItem, FxConfirmOptions, FxFacetGroup, FxFacetOption, FxFacetSelection, FxFeatureFlags, FxFilterChipOption, FxFilterPillOption, FxListRequest, FxListResolverContext, FxListRowBadge, FxLoadJob, FxMenuItem, FxPipelineStage, FxPipelineStageState, FxProjectCard, FxProjectCardChip, FxProjectCardMetric, FxSegmentedOption, FxSeverityBadge, FxSkeletonBlock, FxSkeletonBlockKind, FxSkeletonBlockSpec, FxSkeletonHint, FxStatCard, FxStatCardDelta, FxTableFilters, IRadioButton, KanbanColumn, NotificationCallback, NotificationConnectOptions, OgTheme, OgThemeMeta, RealtimeTableEvent, RealtimeTableSyncOptions, TableResult, TagType, ToastData, Tone, TreeNode, UploadResult };
package/utilities.css CHANGED
@@ -8,10 +8,15 @@
8
8
  }
9
9
 
10
10
  @utility btn-common {
11
- /* Compact size (anh Tú 29/08): h-8 + 13px label the pre-V2 h-10 read too
12
- large against the V2 density. leading-none: arbitrary text-[13px] inherits
13
- lh 1.5 and Archivo's uneven leading floats the ink ~1px above center. */
14
- @apply flex text-[13px] leading-none h-8 font-semibold px-large py-small items-center justify-center rounded-lg shadow-sm transition-all duration-200 disabled:opacity-50 disabled:pointer-events-none disabled:cursor-not-allowed;
11
+ /* The demo's `.og-button--sm` (anh Tú 17/09: compact như New Analysis)
12
+ 27px tall, 11.5px at weight 400, 12px sides, 7px radius. MEASURED off the
13
+ reference's own `.og-button--sm.bi-newbtn`, which is the topbar CTA: it
14
+ wore this shape through `!` overrides because the shared button was a size
15
+ above it. The h-8 / 13px / 600 this replaces was itself a step down from
16
+ pre-V2 h-10 (29/08); against V2 panel density it still read one notch
17
+ heavy. leading-none: an arbitrary font-size inherits lh 1.5 and Archivo's
18
+ uneven leading floats the ink ~1px above centre. */
19
+ @apply flex text-[length:var(--og-fs-xs)] leading-none h-[27px] font-normal px-[12px] py-[4px] items-center justify-center rounded-control shadow-sm transition-all duration-200 disabled:opacity-50 disabled:pointer-events-none disabled:cursor-not-allowed;
15
20
  }
16
21
 
17
22
  @utility btn-menu-common {