@genesislcap/foundation-header 14.496.2-alpha-2c4a633.0 → 14.498.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.
@@ -30,6 +30,7 @@ export type NavEventDetailMap = {
30
30
  'misc-icon-clicked': void;
31
31
  'notification-icon-clicked': void;
32
32
  'language-changed': void;
33
+ 'feature-flags-changed': string[];
33
34
  'nav-button-clicked': NavButtonClickDetail;
34
35
  };
35
36
  /**
@@ -40,8 +41,25 @@ export type LanguageOptions = {
40
41
  availableLanguages: string[];
41
42
  selectedLanguage: string;
42
43
  };
44
+ /**
45
+ * A single feature flag option shown in the header multi-select.
46
+ * @public
47
+ */
48
+ export type FeatureFlagDefinition = {
49
+ /** Feature flag name used in the URL as `feature.<name>`. */
50
+ name: string;
51
+ /** Display label for the multi-select option. */
52
+ label: string;
53
+ };
54
+ /**
55
+ * Options for the feature flags selector
56
+ * @public
57
+ */
58
+ export type FeatureFlagOptions = {
59
+ availableFlags: FeatureFlagDefinition[];
60
+ };
43
61
  declare const Navigation_base: abstract new (...args: any[]) => {
44
- $emit<K extends "luminance-icon-clicked" | "logout-clicked" | "misc-icon-clicked" | "notification-icon-clicked" | "language-changed" | "nav-button-clicked">(...args: NavEventDetailMap[K] extends void ? [type: K, options?: import("@genesislcap/foundation-events").EmitOptions] : [type: K, detail: NavEventDetailMap[K], options?: import("@genesislcap/foundation-events").EmitOptions]): import("@genesislcap/foundation-events").EmitReturn;
62
+ $emit<K extends "luminance-icon-clicked" | "logout-clicked" | "misc-icon-clicked" | "notification-icon-clicked" | "language-changed" | "feature-flags-changed" | "nav-button-clicked">(...args: NavEventDetailMap[K] extends void ? [type: K, options?: import("@genesislcap/foundation-events").EmitOptions] : [type: K, detail: NavEventDetailMap[K], options?: import("@genesislcap/foundation-events").EmitOptions]): import("@genesislcap/foundation-events").EmitReturn;
45
63
  accessKey: string;
46
64
  readonly accessKeyLabel: string;
47
65
  autocapitalize: string;
@@ -416,6 +434,7 @@ declare const Navigation_base: abstract new (...args: any[]) => {
416
434
  * @param show-connection-indicator - Boolean attribute which controls whether the navigation bar will display the connection indicator.
417
435
  * @param show-environment-indicator - Boolean attribute which controls whether the navigation bar will display the environment indicator.
418
436
  * @param show-language-selector - Boolean attribute which controls whether the navigation bar will display the language selector.
437
+ * @param show-feature-flags-selector - Optional. Force-show the Feature Flags button; normally unnecessary because the button appears automatically when `featureFlagOptions.availableFlags` is non-empty.
419
438
  * @param hide-side-bar - Boolean attribute which controls whether the navigation bar will display the side bar.
420
439
  * @param show-account-menu - Boolean attribute which controls whether the navigation bar will display the account menu.
421
440
  * @param logout-button-position - String attribute which controls the position of the logout button in the header.
@@ -424,6 +443,7 @@ declare const Navigation_base: abstract new (...args: any[]) => {
424
443
  * @param routeButtons - Array of objects which define the route buttons to be displayed in the navigation bar.
425
444
  * @param routeNavItems - Array of {@link @genesislcap/foundation-ui#FoundationRouteNavItem | FoundationRouteNavItems} which define the route buttons to be displayed in the navigation bar.
426
445
  * @param languageOptions - Object which defines the language options to be displayed in the language selector.
446
+ * @param featureFlagOptions - Object which defines the feature flag options. When `availableFlags` is non-empty, the Feature Flags button is shown automatically.
427
447
  * @param inactivity-timeout-minutes - Number attribute which sets the inactivity timeout in minutes (default: 30).
428
448
  * @param inactivity-warning-minutes - Number attribute which sets the inactivity warning time in minutes before timeout (default: 5).
429
449
  * @param enable-inactivity-monitoring - Boolean attribute which controls whether to enable inactivity monitoring (default: true).
@@ -434,6 +454,7 @@ declare const Navigation_base: abstract new (...args: any[]) => {
434
454
  * @fires misc-icon-clicked - Dispatched when the user clicks on the miscellaneous behaviour icon in the navigation bar.
435
455
  * @fires notification-icon-clicked - Dispatched when the user clicks on the notification icon in the navigation bar.
436
456
  * @fires language-changed - Dispatched when the user changes the language in the language selector.
457
+ * @fires feature-flags-changed - Dispatched when the user changes the selected feature flags. detail: `string[]`
437
458
  * @fires logout-clicked - Dispatched when the user clicks logout button.
438
459
  * @fires nav-button-clicked - Dispatched when the user clicks a navigation button. detail: `NavButtonClickDetail`
439
460
  *
@@ -498,6 +519,10 @@ export declare class Navigation extends Navigation_base {
498
519
  * Called when the component is connected to the DOM
499
520
  */
500
521
  connectedCallback(): Promise<void>;
522
+ /**
523
+ * @internal
524
+ */
525
+ readyChanged(_previous: boolean, next: boolean): void;
501
526
  setLuminance(): void;
502
527
  /**
503
528
  * Initialize the inactivity manager
@@ -596,6 +621,49 @@ export declare class Navigation extends Navigation_base {
596
621
  * Object which defines the language options to be displayed in the language selector
597
622
  */
598
623
  languageOptions: LanguageOptions;
624
+ /**
625
+ * Optional boolean attribute to force-show the Feature Flags button.
626
+ * Control via `show-feature-flags-selector`
627
+ *
628
+ * @remarks
629
+ *
630
+ * Usually unnecessary: the button is shown automatically when
631
+ * {@link Navigation.featureFlagOptions} has a non-empty `availableFlags` list.
632
+ */
633
+ showFeatureFlagsSelector: boolean;
634
+ /**
635
+ * Feature flags available in the header selector.
636
+ *
637
+ * @remarks
638
+ *
639
+ * When `availableFlags` is non-empty, the Feature Flags button is shown automatically.
640
+ * Selected flags are synced to URL `feature.*` query params and the page reloads so
641
+ * boot-time consumers re-evaluate.
642
+ */
643
+ featureFlagOptions: FeatureFlagOptions;
644
+ /**
645
+ * Whether the feature flags panel is open.
646
+ * @internal
647
+ */
648
+ featureFlagsPanelOpen: boolean;
649
+ /**
650
+ * @internal
651
+ */
652
+ featureFlagOptionsChanged(): void;
653
+ /**
654
+ * @internal
655
+ */
656
+ showFeatureFlagsSelectorChanged(): void;
657
+ /**
658
+ * Re-run `[hidden]` bindings on the feature flags nav control.
659
+ *
660
+ * @remarks
661
+ * FAST `when(false)` does not reliably re-open when `featureFlagOptions` is assigned after
662
+ * connect (common with React props). The nav markup stays mounted; visibility uses `[hidden]`.
663
+ *
664
+ * @internal
665
+ */
666
+ private notifyFeatureFlagsNavVisibility;
599
667
  /**
600
668
  * Boolean attribute which controls whether to include the sideNav component
601
669
  * Control via`hide-side-bar`
@@ -801,6 +869,32 @@ export declare class Navigation extends Navigation_base {
801
869
  * @experimental
802
870
  */
803
871
  changeLanguage(e: CustomEvent): void;
872
+ /**
873
+ * Toggles the feature flags panel open/closed.
874
+ */
875
+ toggleFeatureFlagsPanel(): void;
876
+ /**
877
+ * Changes the active URL feature flags and reloads the page.
878
+ *
879
+ * @remarks
880
+ *
881
+ * Activated when the user changes the selection in the feature flags multi-select.
882
+ * Writes presence-only `feature.<name>` query params via
883
+ * {@link @genesislcap/foundation-utils#setActivatedFeatures}.
884
+ */
885
+ changeFeatureFlags(e: CustomEvent<string[]>): void;
886
+ /**
887
+ * Multiselect options derived from {@link Navigation.featureFlagOptions}.
888
+ */
889
+ getFeatureFlagMultiselectOptions(): {
890
+ value: string;
891
+ label: string;
892
+ }[];
893
+ /**
894
+ * Currently selected feature flag names based on URL `feature.*` params.
895
+ * Multiselect expects selected option *values* (strings), not full option objects.
896
+ */
897
+ getSelectedFeatureFlagValues(): string[];
804
898
  /**
805
899
  * To localised text
806
900
  * @remarks
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,iDAuZgD,CAAC"}
1
+ {"version":3,"file":"main.styles.d.ts","sourceRoot":"","sources":["../../../src/main/main.styles.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,iDA+bgD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAIA,OAAO,EAAO,YAAY,EAAkC,MAAM,uBAAuB,CAAC;AAe1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAazC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,EAAE,YAAY,MAAM,EAAE,SAAS,MAAM,WAM5F,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAIpD,CAAC;AAuMF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,+BAyJvB,CAAC;AAiDF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAM,2BAIzC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAEpD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,+BAAc,CAAC"}
1
+ {"version":3,"file":"main.template.d.ts","sourceRoot":"","sources":["../../../src/main/main.template.ts"],"names":[],"mappings":"AAIA,OAAO,EAAO,YAAY,EAAkC,MAAM,uBAAuB,CAAC;AAiB1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAazC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,EAAE,YAAY,MAAM,EAAE,SAAS,MAAM,WAM5F,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAIpD,CAAC;AAuMF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,+BAoMvB,CAAC;AAiDF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAM,2BAIzC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAEpD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,+BAAc,CAAC"}
@@ -54,6 +54,7 @@ export declare const Navigation: React.ForwardRefExoticComponent<
54
54
  onMiscIconClicked?: (event: CustomEvent<unknown>) => void;
55
55
  onNotificationIconClicked?: (event: CustomEvent<unknown>) => void;
56
56
  onLanguageChanged?: (event: CustomEvent<unknown>) => void;
57
+ onFeatureFlagsChanged?: (event: CustomEvent<string[]>) => void;
57
58
  onLogoutClicked?: (event: CustomEvent<unknown>) => void;
58
59
  onNavButtonClicked?: (event: CustomEvent<NavButtonClickDetail>) => void;
59
60
  }
@@ -69,6 +70,7 @@ export declare const ZeroHeader: React.ForwardRefExoticComponent<
69
70
  onMiscIconClicked?: (event: CustomEvent<unknown>) => void;
70
71
  onNotificationIconClicked?: (event: CustomEvent<unknown>) => void;
71
72
  onLanguageChanged?: (event: CustomEvent<unknown>) => void;
73
+ onFeatureFlagsChanged?: (event: CustomEvent<string[]>) => void;
72
74
  onLogoutClicked?: (event: CustomEvent<unknown>) => void;
73
75
  onNavButtonClicked?: (event: CustomEvent<NavButtonClickDetail>) => void;
74
76
  }
@@ -84,6 +86,7 @@ export declare const RapidHeader: React.ForwardRefExoticComponent<
84
86
  onMiscIconClicked?: (event: CustomEvent<unknown>) => void;
85
87
  onNotificationIconClicked?: (event: CustomEvent<unknown>) => void;
86
88
  onLanguageChanged?: (event: CustomEvent<unknown>) => void;
89
+ onFeatureFlagsChanged?: (event: CustomEvent<string[]>) => void;
87
90
  onLogoutClicked?: (event: CustomEvent<unknown>) => void;
88
91
  onNavButtonClicked?: (event: CustomEvent<NavButtonClickDetail>) => void;
89
92
  }
@@ -37,6 +37,10 @@ export declare const selectTag: string;
37
37
  * @internal
38
38
  */
39
39
  export declare const optionTag: string;
40
+ /**
41
+ * @internal
42
+ */
43
+ export declare const multiselectTag: string;
40
44
  /**
41
45
  * @internal
42
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/tags/tags.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AAEH;;GAEG;AACH,eAAO,MAAQ,eAAe,+CACkB,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,OAAO,QAA+B,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAA8C,CAAC;AAElF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAA+C,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,WAAW,QAAmC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,aAAQ,EAAE,YAAO,WAc7C,CAAC"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/tags/tags.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AAEH;;GAEG;AACH,eAAO,MAAQ,eAAe,+CACkB,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,OAAO,QAA+B,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAA8C,CAAC;AAElF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAA+C,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,SAAS,QAAiC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,WAAW,QAAmC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,aAAQ,EAAE,YAAO,WAc7C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rapid.template.d.ts","sourceRoot":"","sources":["../../../src/templates/rapid.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAe1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAIpD,CAAC;AAuKF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,+BA2HzB,CAAC"}
1
+ {"version":3,"file":"rapid.template.d.ts","sourceRoot":"","sources":["../../../src/templates/rapid.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAiB1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,UAAU,CAIpD,CAAC;AAuKF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,+BAqKzB,CAAC"}
@@ -17,7 +17,7 @@ function rapidDesignSystemImport() {
17
17
  * @public
18
18
  */
19
19
  export const registerCommonRapidComponents = () => __awaiter(void 0, void 0, void 0, function* () {
20
- const { provideDesignSystem, rapidIcon, rapidButton, designSystemProvider: rapidDesignSystemProvider, rapidSelect, rapidListboxOption, rapidFlyout, rapidConnectionIndicator, } = yield rapidDesignSystemImport();
20
+ const { provideDesignSystem, rapidIcon, rapidButton, designSystemProvider: rapidDesignSystemProvider, rapidSelect, rapidListboxOption, rapidMultiselect, rapidFlyout, rapidConnectionIndicator, } = yield rapidDesignSystemImport();
21
21
  /**
22
22
  * Register the components the app is using with the system.
23
23
  */
@@ -29,5 +29,5 @@ export const registerCommonRapidComponents = () => __awaiter(void 0, void 0, voi
29
29
  /**
30
30
  * Common across most routes, so batch register these lightweight components upfront.
31
31
  */
32
- rapidIcon(), rapidButton(), rapidSelect(), rapidListboxOption(), rapidFlyout(), rapidConnectionIndicator);
32
+ rapidIcon(), rapidButton(), rapidSelect(), rapidListboxOption(), rapidMultiselect(), rapidFlyout(), rapidConnectionIndicator);
33
33
  });
@@ -3,7 +3,7 @@ import { __awaiter } from "tslib";
3
3
  * @public
4
4
  */
5
5
  export const registerCommonZeroComponents = () => __awaiter(void 0, void 0, void 0, function* () {
6
- const { provideDesignSystem, zeroIcon, zeroButton, zeroDesignSystemProvider, zeroSelect, zeroListboxOption, zeroFlyout, } = yield import(
6
+ const { provideDesignSystem, zeroIcon, zeroButton, zeroDesignSystemProvider, zeroSelect, zeroListboxOption, zeroMultiselect, zeroFlyout, } = yield import(
7
7
  /* webpackChunkName: "foundation-zero" */
8
8
  '@genesislcap/foundation-zero');
9
9
  /**
@@ -17,5 +17,5 @@ export const registerCommonZeroComponents = () => __awaiter(void 0, void 0, void
17
17
  /**
18
18
  * Common across most routes, so batch register these lightweight components upfront.
19
19
  */
20
- zeroIcon(), zeroButton(), zeroSelect(), zeroListboxOption(), zeroFlyout());
20
+ zeroIcon(), zeroButton(), zeroSelect(), zeroListboxOption(), zeroMultiselect(), zeroFlyout());
21
21
  });
@@ -13,6 +13,7 @@ export const templateOptionsByDesiginSystemPrefix = {
13
13
  environmentIndicator: 'zero-environment-indicator',
14
14
  select: 'zero-select',
15
15
  option: 'zero-option',
16
+ multiselect: 'zero-multiselect',
16
17
  flyout: 'zero-flyout',
17
18
  provider: 'zero-design-system-provider',
18
19
  },
@@ -24,6 +25,7 @@ export const templateOptionsByDesiginSystemPrefix = {
24
25
  environmentIndicator: 'rapid-environment-indicator',
25
26
  select: 'rapid-select',
26
27
  option: 'rapid-option',
28
+ multiselect: 'rapid-multiselect',
27
29
  flyout: 'rapid-flyout',
28
30
  provider: 'rapid-design-system-provider',
29
31
  },
@@ -0,0 +1,5 @@
1
+ /**
2
+ * True when the Feature Flags button should be visible in the header nav.
3
+ * @internal
4
+ */
5
+ export const isFeatureFlagsNavVisible = (host) => { var _a, _b, _c; return !!host.showFeatureFlagsSelector || ((_c = (_b = (_a = host.featureFlagOptions) === null || _a === void 0 ? void 0 : _a.availableFlags) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 0; };
@@ -5,8 +5,8 @@ import { EventEmitter } from '@genesislcap/foundation-events';
5
5
  import { I18next } from '@genesislcap/foundation-i18n';
6
6
  import { FoundationRouteNav } from '@genesislcap/foundation-ui';
7
7
  import { User } from '@genesislcap/foundation-user';
8
- import { InactivityManager, RouteUtil } from '@genesislcap/foundation-utils';
9
- import { attr, Container, customElement, GenesisElement, observable } from '@genesislcap/web-core';
8
+ import { InactivityManager, isFeatureActivated, RouteUtil, setActivatedFeatures, } from '@genesislcap/foundation-utils';
9
+ import { attr, Container, customElement, GenesisElement, observable, Observable, } from '@genesislcap/web-core';
10
10
  import logo from '../assets/logo.svg';
11
11
  import { HeaderConfig } from '../config/config';
12
12
  import { rapidTemplate } from '../templates/rapid.template';
@@ -36,6 +36,7 @@ const DEFAULT_INACTIVITY_WARNING_MINUTES = 5;
36
36
  * @param show-connection-indicator - Boolean attribute which controls whether the navigation bar will display the connection indicator.
37
37
  * @param show-environment-indicator - Boolean attribute which controls whether the navigation bar will display the environment indicator.
38
38
  * @param show-language-selector - Boolean attribute which controls whether the navigation bar will display the language selector.
39
+ * @param show-feature-flags-selector - Optional. Force-show the Feature Flags button; normally unnecessary because the button appears automatically when `featureFlagOptions.availableFlags` is non-empty.
39
40
  * @param hide-side-bar - Boolean attribute which controls whether the navigation bar will display the side bar.
40
41
  * @param show-account-menu - Boolean attribute which controls whether the navigation bar will display the account menu.
41
42
  * @param logout-button-position - String attribute which controls the position of the logout button in the header.
@@ -44,6 +45,7 @@ const DEFAULT_INACTIVITY_WARNING_MINUTES = 5;
44
45
  * @param routeButtons - Array of objects which define the route buttons to be displayed in the navigation bar.
45
46
  * @param routeNavItems - Array of {@link @genesislcap/foundation-ui#FoundationRouteNavItem | FoundationRouteNavItems} which define the route buttons to be displayed in the navigation bar.
46
47
  * @param languageOptions - Object which defines the language options to be displayed in the language selector.
48
+ * @param featureFlagOptions - Object which defines the feature flag options. When `availableFlags` is non-empty, the Feature Flags button is shown automatically.
47
49
  * @param inactivity-timeout-minutes - Number attribute which sets the inactivity timeout in minutes (default: 30).
48
50
  * @param inactivity-warning-minutes - Number attribute which sets the inactivity warning time in minutes before timeout (default: 5).
49
51
  * @param enable-inactivity-monitoring - Boolean attribute which controls whether to enable inactivity monitoring (default: true).
@@ -54,6 +56,7 @@ const DEFAULT_INACTIVITY_WARNING_MINUTES = 5;
54
56
  * @fires misc-icon-clicked - Dispatched when the user clicks on the miscellaneous behaviour icon in the navigation bar.
55
57
  * @fires notification-icon-clicked - Dispatched when the user clicks on the notification icon in the navigation bar.
56
58
  * @fires language-changed - Dispatched when the user changes the language in the language selector.
59
+ * @fires feature-flags-changed - Dispatched when the user changes the selected feature flags. detail: `string[]`
57
60
  * @fires logout-clicked - Dispatched when the user clicks logout button.
58
61
  * @fires nav-button-clicked - Dispatched when the user clicks a navigation button. detail: `NavButtonClickDetail`
59
62
  *
@@ -157,6 +160,21 @@ let Navigation = class Navigation extends EventEmitter(GenesisElement) {
157
160
  availableLanguages: Object.keys((_a = this.i18next.config.resources) !== null && _a !== void 0 ? _a : {}),
158
161
  selectedLanguage: this.i18next.config.lng,
159
162
  };
163
+ /**
164
+ * Optional boolean attribute to force-show the Feature Flags button.
165
+ * Control via `show-feature-flags-selector`
166
+ *
167
+ * @remarks
168
+ *
169
+ * Usually unnecessary: the button is shown automatically when
170
+ * {@link Navigation.featureFlagOptions} has a non-empty `availableFlags` list.
171
+ */
172
+ this.showFeatureFlagsSelector = false;
173
+ /**
174
+ * Whether the feature flags panel is open.
175
+ * @internal
176
+ */
177
+ this.featureFlagsPanelOpen = false;
160
178
  /**
161
179
  * String attribute which controls the position of the logout button in the header
162
180
  * Control via `logout-button-position`
@@ -193,8 +211,19 @@ let Navigation = class Navigation extends EventEmitter(GenesisElement) {
193
211
  this.userName = (_a = this.user.userName) !== null && _a !== void 0 ? _a : 'Genesis User';
194
212
  }
195
213
  this.initializeInactivityManager();
214
+ this.notifyFeatureFlagsNavVisibility();
215
+ // React and other hosts often assign object properties after connect.
216
+ queueMicrotask(() => this.notifyFeatureFlagsNavVisibility());
196
217
  });
197
218
  }
219
+ /**
220
+ * @internal
221
+ */
222
+ readyChanged(_previous, next) {
223
+ if (next) {
224
+ this.notifyFeatureFlagsNavVisibility();
225
+ }
226
+ }
198
227
  setLuminance() {
199
228
  localStorage.setItem('luminance', this.luminanceToggle ? 'light' : 'dark');
200
229
  }
@@ -240,6 +269,31 @@ let Navigation = class Navigation extends EventEmitter(GenesisElement) {
240
269
  showNotificationsButtonChanged() {
241
270
  logger.deprecated('show-notification-button', 'Leave unset and add/remove PBC Notify instead.');
242
271
  }
272
+ /**
273
+ * @internal
274
+ */
275
+ featureFlagOptionsChanged() {
276
+ this.notifyFeatureFlagsNavVisibility();
277
+ }
278
+ /**
279
+ * @internal
280
+ */
281
+ showFeatureFlagsSelectorChanged() {
282
+ this.notifyFeatureFlagsNavVisibility();
283
+ }
284
+ /**
285
+ * Re-run `[hidden]` bindings on the feature flags nav control.
286
+ *
287
+ * @remarks
288
+ * FAST `when(false)` does not reliably re-open when `featureFlagOptions` is assigned after
289
+ * connect (common with React props). The nav markup stays mounted; visibility uses `[hidden]`.
290
+ *
291
+ * @internal
292
+ */
293
+ notifyFeatureFlagsNavVisibility() {
294
+ Observable.notify(this, 'featureFlagOptions');
295
+ Observable.notify(this, 'showFeatureFlagsSelector');
296
+ }
243
297
  /**
244
298
  * @internal
245
299
  */
@@ -431,6 +485,48 @@ let Navigation = class Navigation extends EventEmitter(GenesisElement) {
431
485
  this.$emit('language-changed', e.detail.value);
432
486
  this.i18next.changeLanguageTo(e.detail.value);
433
487
  }
488
+ /**
489
+ * Toggles the feature flags panel open/closed.
490
+ */
491
+ toggleFeatureFlagsPanel() {
492
+ this.featureFlagsPanelOpen = !this.featureFlagsPanelOpen;
493
+ }
494
+ /**
495
+ * Changes the active URL feature flags and reloads the page.
496
+ *
497
+ * @remarks
498
+ *
499
+ * Activated when the user changes the selection in the feature flags multi-select.
500
+ * Writes presence-only `feature.<name>` query params via
501
+ * {@link @genesislcap/foundation-utils#setActivatedFeatures}.
502
+ */
503
+ changeFeatureFlags(e) {
504
+ var _a;
505
+ const selected = ((_a = e.detail) !== null && _a !== void 0 ? _a : []).filter((name) => !!name);
506
+ this.featureFlagsPanelOpen = false;
507
+ this.$emit('feature-flags-changed', selected);
508
+ setActivatedFeatures(selected);
509
+ }
510
+ /**
511
+ * Multiselect options derived from {@link Navigation.featureFlagOptions}.
512
+ */
513
+ getFeatureFlagMultiselectOptions() {
514
+ var _a, _b;
515
+ return ((_b = (_a = this.featureFlagOptions) === null || _a === void 0 ? void 0 : _a.availableFlags) !== null && _b !== void 0 ? _b : []).map(({ name, label }) => ({
516
+ value: name,
517
+ label,
518
+ }));
519
+ }
520
+ /**
521
+ * Currently selected feature flag names based on URL `feature.*` params.
522
+ * Multiselect expects selected option *values* (strings), not full option objects.
523
+ */
524
+ getSelectedFeatureFlagValues() {
525
+ var _a, _b;
526
+ return ((_b = (_a = this.featureFlagOptions) === null || _a === void 0 ? void 0 : _a.availableFlags) !== null && _b !== void 0 ? _b : [])
527
+ .map(({ name }) => name)
528
+ .filter((name) => isFeatureActivated(name));
529
+ }
434
530
  /**
435
531
  * To localised text
436
532
  * @remarks
@@ -567,6 +663,15 @@ __decorate([
567
663
  __decorate([
568
664
  observable
569
665
  ], Navigation.prototype, "languageOptions", void 0);
666
+ __decorate([
667
+ attr({ mode: 'boolean', attribute: 'show-feature-flags-selector' })
668
+ ], Navigation.prototype, "showFeatureFlagsSelector", void 0);
669
+ __decorate([
670
+ observable
671
+ ], Navigation.prototype, "featureFlagOptions", void 0);
672
+ __decorate([
673
+ observable
674
+ ], Navigation.prototype, "featureFlagsPanelOpen", void 0);
570
675
  __decorate([
571
676
  attr({ mode: 'boolean', attribute: 'hide-side-bar' })
572
677
  ], Navigation.prototype, "hideSideBar", void 0);
@@ -186,6 +186,46 @@ export const MainStyles = css `
186
186
  border-color: #333;
187
187
  }
188
188
 
189
+ .feature-flags-wrapper {
190
+ position: relative;
191
+ display: flex;
192
+ align-items: center;
193
+ padding: 0;
194
+ margin: 0;
195
+ line-height: 0;
196
+ font-size: 0;
197
+ }
198
+
199
+ .feature-flags-wrapper[hidden] {
200
+ display: none !important;
201
+ }
202
+
203
+ .feature-flags-button {
204
+ position: relative;
205
+ z-index: 2;
206
+ }
207
+
208
+ .feature-flags-panel {
209
+ position: absolute;
210
+ top: 100%;
211
+ right: 0;
212
+ z-index: 1000;
213
+ margin-top: calc(var(--design-unit) * 1px);
214
+ padding: calc(var(--design-unit) * 2px);
215
+ background: var(--foundation-header-background-color, var(--neutral-layer-2));
216
+ border: calc(var(--stroke-width) * 1px) solid var(--neutral-stroke-rest);
217
+ border-radius: calc(var(--control-corner-radius) * 1px);
218
+ box-shadow: 0 4px 12px rgb(0 0 0 / 20%);
219
+ line-height: normal;
220
+ font-size: var(--type-ramp-base-font-size);
221
+ }
222
+
223
+ .feature-flags-selector {
224
+ width: 250px;
225
+ min-width: 250px;
226
+ max-width: 250px;
227
+ }
228
+
189
229
  ${flyoutTag}::part(flyout),
190
230
  ${flyoutTag}::part(footer) {
191
231
  padding: 0;
@@ -3,7 +3,8 @@ import { getApp } from '@genesislcap/foundation-shell/app';
3
3
  import { avoidTreeShaking } from '@genesislcap/foundation-utils';
4
4
  import { ref, classNames, html, repeat, when } from '@genesislcap/web-core';
5
5
  import { ControlPanel } from '../components';
6
- import { aiIndicatorTag, buttonTag, connectionIndicatorTag, environmentIndicatorTag, flyoutTag, getTagHelper, iconTag, optionTag, providerTag, selectTag, } from '../tags';
6
+ import { aiIndicatorTag, buttonTag, connectionIndicatorTag, environmentIndicatorTag, flyoutTag, getTagHelper, iconTag, multiselectTag, optionTag, providerTag, selectTag, } from '../tags';
7
+ import { isFeatureFlagsNavVisible } from './feature-flags-nav';
7
8
  avoidTreeShaking(ControlPanel);
8
9
  const app = getApp();
9
10
  /**
@@ -331,6 +332,45 @@ export const navTemplate = html `
331
332
  `)}
332
333
  </${selectTag}>
333
334
  `)}
335
+ <div
336
+ class="feature-flags-wrapper"
337
+ part="feature-flags-wrapper"
338
+ ?hidden=${(x) => !isFeatureFlagsNavVisible(x)}
339
+ >
340
+ <${buttonTag}
341
+ appearance="neutral-grey"
342
+ class="nav-button feature-flags-button"
343
+ data-test-id="feature-flags-button"
344
+ part="feature-flags-button"
345
+ aria-label="Feature flags"
346
+ aria-haspopup="true"
347
+ ?aria-expanded=${(x) => x.featureFlagsPanelOpen}
348
+ @click=${(x) => x.toggleFeatureFlagsPanel()}
349
+ >
350
+ Feature Flags
351
+ </${buttonTag}>
352
+ ${when((x) => x.featureFlagsPanelOpen, html `
353
+ <div
354
+ class="feature-flags-panel"
355
+ data-test-id="feature-flags-selector"
356
+ part="feature-flags-panel"
357
+ >
358
+ <${multiselectTag}
359
+ class="feature-flags-selector"
360
+ name="Features"
361
+ ?search="${() => false}"
362
+ ?all="${() => false}"
363
+ ?creatable="${() => false}"
364
+ :options=${(x) => x.getFeatureFlagMultiselectOptions()}
365
+ :selectedOptions=${(x) => x.getSelectedFeatureFlagValues()}
366
+ @selectionChange="${(x, c) => x.changeFeatureFlags(c.event)}"
367
+ aria-label="Select Features"
368
+ >
369
+ <span slot="label">Select Features</span>
370
+ </${multiselectTag}>
371
+ </div>
372
+ `)}
373
+ </div>
334
374
  ${() => accountMenuTemplate}
335
375
  </div>
336
376
  ${when((x) => x.showControlPanel, html `
@@ -42,6 +42,10 @@ export const selectTag = tagFor(templateOptions.select);
42
42
  * @internal
43
43
  */
44
44
  export const optionTag = tagFor(templateOptions.option);
45
+ /**
46
+ * @internal
47
+ */
48
+ export const multiselectTag = tagFor(templateOptions.multiselect);
45
49
  /**
46
50
  * @internal
47
51
  */
@@ -1,6 +1,7 @@
1
1
  import { isAIFeatureEnabled } from '@genesislcap/foundation-ai';
2
2
  import { getApp } from '@genesislcap/foundation-shell/app';
3
3
  import { html, repeat, when } from '@genesislcap/web-core';
4
+ import { isFeatureFlagsNavVisible } from '../main/feature-flags-nav';
4
5
  import { getTagHelper } from '../tags';
5
6
  const app = getApp();
6
7
  const getTagHelperRapid = getTagHelper.bind(null, 'rapid');
@@ -12,6 +13,7 @@ const connectionIndicatorTag = getTagHelperRapid('connectionIndicator');
12
13
  const aiIndicatorTag = getTagHelperRapid('aiIndicator');
13
14
  const optionTag = getTagHelperRapid('option');
14
15
  const selectTag = getTagHelperRapid('select');
16
+ const multiselectTag = getTagHelperRapid('multiselect');
15
17
  /**
16
18
  * Top level template for Navigation class
17
19
  *
@@ -276,6 +278,45 @@ ${when((x) => !x.hideSideBar, sideNavTemplate)}
276
278
  `)}
277
279
  </${selectTag}>
278
280
  `)}
281
+ <div
282
+ class="feature-flags-wrapper"
283
+ part="feature-flags-wrapper"
284
+ ?hidden=${(x) => !isFeatureFlagsNavVisible(x)}
285
+ >
286
+ <${buttonTag}
287
+ appearance="neutral-grey"
288
+ class="nav-button feature-flags-button"
289
+ data-test-id="feature-flags-button"
290
+ part="feature-flags-button"
291
+ aria-label="Feature flags"
292
+ aria-haspopup="true"
293
+ ?aria-expanded=${(x) => x.featureFlagsPanelOpen}
294
+ @click=${(x) => x.toggleFeatureFlagsPanel()}
295
+ >
296
+ Feature Flags
297
+ </${buttonTag}>
298
+ ${when((x) => x.featureFlagsPanelOpen, html `
299
+ <div
300
+ class="feature-flags-panel"
301
+ data-test-id="feature-flags-selector"
302
+ part="feature-flags-panel"
303
+ >
304
+ <${multiselectTag}
305
+ class="feature-flags-selector"
306
+ name="Features"
307
+ ?search="${() => false}"
308
+ ?all="${() => false}"
309
+ ?creatable="${() => false}"
310
+ :options=${(x) => x.getFeatureFlagMultiselectOptions()}
311
+ :selectedOptions=${(x) => x.getSelectedFeatureFlagValues()}
312
+ @selectionChange="${(x, c) => x.changeFeatureFlags(c.event)}"
313
+ aria-label="Select Features"
314
+ >
315
+ <span slot="label">Select Features</span>
316
+ </${multiselectTag}>
317
+ </div>
318
+ `)}
319
+ </div>
279
320
 
280
321
  <${buttonTag} appearance="neutral-grey" data-test-id="user-button" class="nav-button" aria-label="User button">
281
322
  <${iconTag} name="user-circle"></${iconTag}>