@fluxo-dev/shell 26.3.6 → 26.4.1

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,22 +1,22 @@
1
1
  {
2
2
  "name": "@fluxo-dev/shell",
3
- "version": "26.3.6",
3
+ "version": "26.4.1",
4
4
  "peerDependencies": {
5
5
  "react": "^18.3.1",
6
6
  "@mantine/core": "^7.12.2",
7
7
  "react-router-dom": "^6.11.2",
8
8
  "react-redux": "^8.0.5",
9
9
  "@reduxjs/toolkit": "^1.9.1",
10
- "@fluxo-dev/api-client-base": "^26.3.6",
11
- "@fluxo-dev/shell-bi": "^26.3.6",
12
- "@fluxo-dev/shell-hub": "^26.3.6",
13
- "@fluxo-dev/shell-mfe": "^26.3.6",
14
- "@fluxo-dev/shell-printing": "^26.3.6",
15
- "@fluxo-dev/shell-reporting": "^26.3.6",
16
- "@fluxo-dev/shell-workflow": "^26.3.6",
17
- "@fluxo-dev/shell-ravify": "^26.3.6",
18
- "@fluxo-dev/state": "^26.3.6",
19
- "@fluxo-dev/ui-components": "^26.3.6",
10
+ "@fluxo-dev/api-client-base": "^26.4.0",
11
+ "@fluxo-dev/shell-bi": "^26.4.0",
12
+ "@fluxo-dev/shell-hub": "^26.4.0",
13
+ "@fluxo-dev/shell-mfe": "^26.4.0",
14
+ "@fluxo-dev/shell-printing": "^26.4.0",
15
+ "@fluxo-dev/shell-reporting": "^26.4.0",
16
+ "@fluxo-dev/shell-workflow": "^26.4.0",
17
+ "@fluxo-dev/shell-ravify": "^26.4.0",
18
+ "@fluxo-dev/state": "^26.4.0",
19
+ "@fluxo-dev/ui-components": "^26.4.0",
20
20
  "@scalar/api-reference-react": "0.9.1",
21
21
  "@devexpress/analytics-core": "25.2.6",
22
22
  "devexpress-dashboard": "25.2.6",
package/src/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { FluxoShell, type FluxoShellProps, type ShellFrontend, type ShellUI, ShellUINavigation, ShellUISearchPosition, ShellUISearchType } from './lib/app';
1
+ export { FluxoShell, type FluxoShellProps, type ShellFrontend, type ShellUI, ShellLayoutVariant, ShellUINavigation, ShellUISearchPosition, ShellUISearchType } from './lib/app';
2
+ export { ShellBrandingProvider, useShellBranding, useShellBrandSurface, resolveShellBackground, resolveShellBackgroundTopColor, isBrandCustomizationAllowed, type ShellBranding, type ShellFixedBrand, type ShellSidebarBackground, type ShellBrandSurface, } from './lib/branding';
2
3
  export { FrontendSwitch } from './lib/components/frontend-switch';
3
4
  export { ScreenSharingProvider, useScreenSharingContext } from './lib/contexts/screen-sharing-context';
4
5
  export { ScreenSharingWidget, type ScreenSharingWidgetProps } from './lib/components/screen-sharing-widget';
package/src/lib/app.d.ts CHANGED
@@ -4,6 +4,7 @@ import './app.module.css';
4
4
  import '../style.css';
5
5
  import 'dayjs/locale/it';
6
6
  import { FrontendSwitcherUiProps } from './pages/frontend-switcher/frontend-switcher';
7
+ import { ShellBranding } from './branding';
7
8
  /**
8
9
  * The ShellFrontend interface represents a frontend that can be rendered by the FluxoShell component.
9
10
  */
@@ -24,9 +25,24 @@ export type ShellFrontend = {
24
25
  * Optional properties for the admin layout. If you use custom layouts, this props will be ignored.
25
26
  */
26
27
  adminLayoutProps?: {
27
- ui?: ShellUI;
28
+ /**
29
+ * Sovrascrive (in modo parziale) la configurazione `ui` della shell per questo frontend.
30
+ * Qui è possibile scegliere anche il layout da usare tramite `layout`.
31
+ */
32
+ ui?: Partial<ShellUI>;
28
33
  };
29
34
  };
35
+ /**
36
+ * Layout disponibili per il frontend "admin".
37
+ *
38
+ * - `Classic`: layout storico (app bar colorata a tutta larghezza + sidebar chiara).
39
+ * - `Modern`: sidebar laterale colorata a tutta altezza, striscia dello stesso colore
40
+ * che prosegue in alto a tutta larghezza e contenuto arrotondato in alto a sinistra.
41
+ */
42
+ export declare enum ShellLayoutVariant {
43
+ Classic = "classic",
44
+ Modern = "modern"
45
+ }
30
46
  export declare enum ShellUINavigation {
31
47
  Sidebar = 1,
32
48
  Topbar = 2,
@@ -45,6 +61,11 @@ export declare enum ShellUISearchType {
45
61
  }
46
62
  export interface ShellUI {
47
63
  navigation: ShellUINavigation;
64
+ /**
65
+ * Layout della shell. Se omesso viene usato {@link ShellLayoutVariant.Classic},
66
+ * quindi il comportamento resta identico alle installazioni esistenti.
67
+ */
68
+ layout?: ShellLayoutVariant;
48
69
  security: {
49
70
  showMyProfile: boolean;
50
71
  };
@@ -92,6 +113,15 @@ export interface FluxoShellProps {
92
113
  loginConfig?: ShellLoginConfig;
93
114
  ui: ShellUI;
94
115
  slots?: ShellSlots;
116
+ /**
117
+ * Branding del progetto consumer.
118
+ *
119
+ * Se non valorizzato, logo e colori continuano ad arrivare dal backend e restano
120
+ * modificabili dalla scheda "Brand" dell'amministrazione (comportamento storico).
121
+ * Se viene impostato un brand fisso (`branding.fixed`) oppure
122
+ * `branding.allowCustomization: false`, la scheda "Brand" non è più visibile né raggiungibile.
123
+ */
124
+ branding?: ShellBranding;
95
125
  routing?: {
96
126
  basename?: string;
97
127
  };
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { ShellBranding, ShellFixedBrand } from './branding';
3
+ export interface ShellBrandingContextValue {
4
+ /** Configurazione di branding passata dal progetto consumer (se presente) */
5
+ branding?: ShellBranding;
6
+ /** Brand fisso, se impostato */
7
+ fixed?: ShellFixedBrand;
8
+ /** Se `false` la scheda "Brand" dell'amministrazione è nascosta e non raggiungibile */
9
+ allowCustomization: boolean;
10
+ }
11
+ export interface ShellBrandingProviderProps {
12
+ branding?: ShellBranding;
13
+ children: React.ReactNode;
14
+ }
15
+ export declare function ShellBrandingProvider({ branding, children }: ShellBrandingProviderProps): import("react/jsx-runtime").JSX.Element;
16
+ /**
17
+ * Restituisce la configurazione di branding corrente.
18
+ * Se il progetto consumer non ha configurato nulla, la personalizzazione è permessa
19
+ * e non esiste nessun brand fisso (comportamento storico).
20
+ */
21
+ export declare function useShellBranding(): ShellBrandingContextValue;
22
+ export interface ShellBrandSurface {
23
+ /** Valore CSS per lo sfondo di sidebar / app bar (colore pieno o gradiente) */
24
+ background: string;
25
+ /** Colore pieno corrispondente alla parte alta dello sfondo */
26
+ topColor: string;
27
+ /** Logo orizzontale */
28
+ logo?: string;
29
+ /** Logo compatto (icona). In assenza di brand fisso coincide con `logo` */
30
+ logoIcon?: string;
31
+ logoHeight: number;
32
+ logoIconHeight: number;
33
+ /** `true` quando il brand è fissato dal progetto consumer */
34
+ isFixed: boolean;
35
+ }
36
+ /**
37
+ * Risolve logo e colori da usare nella chrome della shell:
38
+ * - se è impostato un brand fisso vince quello (nessuna chiamata al backend);
39
+ * - altrimenti si usa la configurazione salvata lato server (comportamento storico).
40
+ */
41
+ export declare function useShellBrandSurface(): ShellBrandSurface;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Modello di branding della shell.
3
+ *
4
+ * Tutto quello che è definito qui è completamente opzionale: se il progetto consumer
5
+ * non passa nessuna configurazione di branding la shell continua a comportarsi
6
+ * esattamente come prima (logo e colori arrivano dal backend e sono modificabili
7
+ * dalla scheda "Brand" dell'amministrazione).
8
+ */
9
+ /**
10
+ * Colore di sfondo della sidebar / barra superiore.
11
+ * Può essere un colore fisso (es. `#1d2e63`) oppure un gradiente.
12
+ */
13
+ export type ShellSidebarBackground = string | {
14
+ /** Colore iniziale del gradiente (in alto) */
15
+ from: string;
16
+ /** Colore finale del gradiente (in basso) */
17
+ to: string;
18
+ /** Angolo del gradiente in gradi. Default: 180 (dall'alto verso il basso) */
19
+ angle?: number;
20
+ };
21
+ /**
22
+ * Brand "fisso" deciso dal progetto consumer.
23
+ * Quando è valorizzato la personalizzazione del brand viene disabilitata:
24
+ * la scheda "Brand" dell'amministrazione non è più visibile né raggiungibile.
25
+ */
26
+ export interface ShellFixedBrand {
27
+ /** Logo orizzontale completo (PNG/SVG: url oppure data-uri) */
28
+ logoFull: string;
29
+ /** Solo icona / simbolo, usato quando la sidebar è compressa */
30
+ logoIcon: string;
31
+ /** Altezza massima (px) del logo orizzontale. Default: 24 */
32
+ logoHeight?: number;
33
+ /** Altezza massima (px) dell'icona. Default: valore di `logoHeight` */
34
+ logoIconHeight?: number;
35
+ /** Colore (o gradiente) della sidebar e della striscia superiore */
36
+ sidebarBackground: ShellSidebarBackground;
37
+ /**
38
+ * Palette del brand a 10 tonalità. Se fornita sovrascrive quella restituita
39
+ * dal backend, così anche i colori del tema restano bloccati sul brand del progetto.
40
+ */
41
+ colors?: string[];
42
+ }
43
+ export interface ShellBranding {
44
+ /**
45
+ * Se `false` la scheda "Brand" dell'amministrazione viene nascosta e la relativa
46
+ * pagina non è raggiungibile. Default: `true`, oppure `false` quando è impostato `fixed`.
47
+ */
48
+ allowCustomization?: boolean;
49
+ /** Brand fisso del progetto consumer. Se valorizzato disabilita la personalizzazione. */
50
+ fixed?: ShellFixedBrand;
51
+ }
52
+ /**
53
+ * Converte uno {@link ShellSidebarBackground} nel corrispondente valore CSS.
54
+ */
55
+ export declare function resolveShellBackground(background?: ShellSidebarBackground): string | undefined;
56
+ /**
57
+ * Colore "pieno" da usare dove un gradiente non è applicabile
58
+ * (es. la striscia superiore che deve combaciare con la parte alta della sidebar).
59
+ */
60
+ export declare function resolveShellBackgroundTopColor(background?: ShellSidebarBackground): string | undefined;
61
+ /**
62
+ * Determina se la personalizzazione del brand è permessa in base alla configurazione.
63
+ */
64
+ export declare function isBrandCustomizationAllowed(branding?: ShellBranding): boolean;
@@ -0,0 +1,2 @@
1
+ export { isBrandCustomizationAllowed, resolveShellBackground, resolveShellBackgroundTopColor, type ShellBranding, type ShellFixedBrand, type ShellSidebarBackground, } from './branding';
2
+ export { ShellBrandingProvider, useShellBranding, useShellBrandSurface, type ShellBrandingContextValue, type ShellBrandingProviderProps, type ShellBrandSurface, } from './branding-context';
@@ -3,6 +3,15 @@ export interface AppContentProps {
3
3
  withMultipleSessions: boolean;
4
4
  shellUi: ShellUI;
5
5
  asideWidth?: number;
6
+ /**
7
+ * Altezza della chrome superiore. Se omessa viene dedotta dal tipo di navigazione
8
+ * (comportamento storico: 48px con sidebar, 88px con top menu).
9
+ */
10
+ headerHeight?: number;
11
+ /**
12
+ * Stile della barra multi-sessione. `classic` (default) mantiene l'aspetto storico.
13
+ */
14
+ tabsVariant?: 'classic' | 'modern';
6
15
  }
7
16
  declare function AppContent(props: AppContentProps): import("react/jsx-runtime").JSX.Element;
8
17
  export default AppContent;
@@ -7,6 +7,11 @@ interface NavBarItemProps {
7
7
  links?: AppMenuItem[];
8
8
  level: number;
9
9
  isMinimal?: boolean;
10
+ /**
11
+ * `default`: voce su sfondo chiaro (comportamento storico).
12
+ * `onColor`: voce su sfondo colorato (sidebar del layout "modern").
13
+ */
14
+ variant?: 'default' | 'onColor';
10
15
  }
11
- export declare function NavBarItem({ icon: Icon, label, routerLink, initiallyOpened, links, level, isMinimal }: NavBarItemProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function NavBarItem({ icon: Icon, label, routerLink, initiallyOpened, links, level, isMinimal, variant }: NavBarItemProps): import("react/jsx-runtime").JSX.Element;
12
17
  export {};
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { ShellUI } from '../../app';
3
+ import './modern.css';
4
+ export interface ModernAppBarProps {
5
+ brandName: string;
6
+ /**
7
+ * Elemento di brand del progetto consumer (es. "powered by").
8
+ * Nel layout "modern" viene mostrato nel popover utente, che ha sfondo chiaro:
9
+ * la sidebar è colorata e un logo scuro rischierebbe di risultare illeggibile.
10
+ */
11
+ brandElement?: React.ReactNode;
12
+ shellUi: ShellUI;
13
+ /** Larghezza corrente della sidebar (0 su mobile) */
14
+ sidebarWidth: number;
15
+ /** Se true mostra il pulsante per aprire/chiudere l'aside AI */
16
+ isAiEnabled?: boolean;
17
+ aiAsideOpened?: boolean;
18
+ onAiAsideToggle?: () => void;
19
+ }
20
+ /**
21
+ * Barra superiore del layout "modern".
22
+ *
23
+ * È composta da due parti:
24
+ * - una striscia del colore della sidebar che prosegue a tutta larghezza in alto;
25
+ * - una barra bianca arrotondata in alto a sinistra, che apre il contenuto.
26
+ */
27
+ export declare function ModernAppBar(props: ModernAppBarProps): import("react/jsx-runtime").JSX.Element;
28
+ export default ModernAppBar;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Costanti geometriche del layout "modern".
3
+ *
4
+ * L'altezza complessiva della chrome superiore viene comunicata allo stato della shell
5
+ * (`dispatchSetAppBarHeight`), così `useShellLayout`, `ShellPage` e `PageHeader`
6
+ * calcolano gli offset corretti senza valori hardcoded.
7
+ */
8
+ /** Striscia superiore, a tutta larghezza, con il colore della sidebar */
9
+ export declare const MODERN_STRIP_HEIGHT = 8;
10
+ /** Barra bianca con ricerca e azioni, arrotondata in alto a sinistra */
11
+ export declare const MODERN_BAR_HEIGHT = 56;
12
+ /** Altezza totale della chrome superiore */
13
+ export declare const MODERN_HEADER_HEIGHT: number;
14
+ /**
15
+ * Scala degli arrotondamenti del layout "modern".
16
+ * Volutamente contenuta: morbido ma non "a pillola".
17
+ */
18
+ /** Controlli: bottoni, input, icone, tab, voci di menu */
19
+ export declare const MODERN_RADIUS_CONTROL = 6;
20
+ /** Contenitori: card, griglie */
21
+ export declare const MODERN_RADIUS_SURFACE = 10;
22
+ /** Superfici grandi: contenuto, pannelli laterali, card di login */
23
+ export declare const MODERN_RADIUS_PANEL = 12;
24
+ /** Raggio dell'angolo in alto a sinistra del contenuto */
25
+ export declare const MODERN_CONTENT_RADIUS = 12;
26
+ export declare const MODERN_SIDEBAR_WIDTH_OPEN = 248;
27
+ export declare const MODERN_SIDEBAR_WIDTH_CLOSED = 64;
28
+ /**
29
+ * Il layout "modern" non ha footer bar: le informazioni essenziali (stato connessione,
30
+ * utente, amministrazione, versione) stanno in fondo alla sidebar.
31
+ */
32
+ export declare const MODERN_FOOTER_HEIGHT = 0;
33
+ export declare const MODERN_ASIDE_WIDTH = 400;
34
+ /** Larghezza della sidebar in funzione dello stato di apertura */
35
+ export declare function getModernSidebarWidth(navbarOpened: boolean): number;
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { FluxoClientConfiguration } from '@fluxo-dev/state';
3
+ import { ShellUI } from '../../app';
4
+ export interface ModernShellLayoutProps {
5
+ appVersion: string;
6
+ brandName: string;
7
+ brandElement?: React.ReactNode;
8
+ currentShellUI: ShellUI;
9
+ navbarOpened: boolean;
10
+ isMobile: boolean | undefined;
11
+ hasAdminAccess: boolean;
12
+ fluxoClientConfig: FluxoClientConfiguration | null;
13
+ showDisconnectionOverlay: boolean;
14
+ maxAttemptsReached: boolean;
15
+ reconnectAttempts: number;
16
+ isRetrying: boolean;
17
+ handleManualRetry: () => Promise<void>;
18
+ isAiEnabled: boolean;
19
+ aiAsideOpened: boolean;
20
+ onAiAsideToggle: () => void;
21
+ }
22
+ /**
23
+ * Layout "modern": sidebar laterale colorata a tutta altezza, striscia dello stesso
24
+ * colore che prosegue in alto a tutta larghezza e contenuto arrotondato in alto a sinistra.
25
+ *
26
+ * L'altezza complessiva della chrome superiore è identica a quella del layout classico
27
+ * (48px), così tutti i componenti di pagina condivisi continuano a funzionare senza modifiche.
28
+ */
29
+ export declare const ModernShellLayout: React.FC<ModernShellLayoutProps>;
30
+ export default ModernShellLayout;
@@ -0,0 +1,10 @@
1
+ export interface ModernNavbarProps {
2
+ brandName: string;
3
+ appVersion: string;
4
+ }
5
+ /**
6
+ * Sidebar del layout "modern": colorata (colore fisso o gradiente del brand),
7
+ * a tutta altezza, con logo in alto e toggle di apertura/chiusura in basso.
8
+ */
9
+ export declare function ModernNavbar({ brandName, appVersion }: ModernNavbarProps): import("react/jsx-runtime").JSX.Element;
10
+ export default ModernNavbar;
@@ -0,0 +1,17 @@
1
+ export interface ModernSidebarFooterProps {
2
+ appVersion: string;
3
+ brandName: string;
4
+ /** Sidebar compressa: mostra solo le icone */
5
+ collapsed: boolean;
6
+ /** Mostra la riga di apertura/chiusura della sidebar (nascosta su mobile: c'è il burger) */
7
+ withCollapseToggle: boolean;
8
+ }
9
+ /**
10
+ * Blocco in fondo alla sidebar del layout "modern".
11
+ *
12
+ * Il layout "modern" non ha la footer bar: qui vivono le informazioni essenziali che
13
+ * nel layout classico stanno nel footer (stato della connessione, stato utente,
14
+ * link all'amministrazione, versione) più il tracciamento dell'attività utente.
15
+ */
16
+ export declare function ModernSidebarFooter({ appVersion, brandName, collapsed, withCollapseToggle, }: ModernSidebarFooterProps): import("react/jsx-runtime").JSX.Element;
17
+ export default ModernSidebarFooter;
@@ -0,0 +1,12 @@
1
+ export interface DisconnectionOverlayProps {
2
+ maxAttemptsReached: boolean;
3
+ reconnectAttempts: number;
4
+ isRetrying: boolean;
5
+ onRetry: () => Promise<void> | void;
6
+ }
7
+ /**
8
+ * Overlay di blocco applicazione mostrato quando la connessione WebSocket è persa.
9
+ * Condiviso da tutti i layout della shell.
10
+ */
11
+ export declare function DisconnectionOverlay({ maxAttemptsReached, reconnectAttempts, isRetrying, onRetry, }: DisconnectionOverlayProps): import("react/jsx-runtime").JSX.Element;
12
+ export default DisconnectionOverlay;
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { FluxoClientConfiguration } from '@fluxo-dev/state';
3
+ /**
4
+ * Wrapper condiviso dai layout della shell: il RavifyProvider viene montato
5
+ * solo per gli utenti con accesso amministrativo.
6
+ */
7
+ export declare const WithRavifyProvider: React.FC<{
8
+ children: React.ReactNode;
9
+ hasAdminAccess: boolean;
10
+ fluxoClientConfig: FluxoClientConfiguration | null;
11
+ }>;
12
+ export default WithRavifyProvider;
@@ -1,5 +1,9 @@
1
- import { ShellLoginConfig } from '../../app';
2
- export declare function ForgotPassword(props: {
1
+ import { ShellLayoutVariant, ShellLoginConfig } from '../../app';
2
+ export interface ForgotPasswordProps {
3
3
  loginConfig?: ShellLoginConfig;
4
- }): import("react/jsx-runtime").JSX.Element;
4
+ brandName?: string;
5
+ /** Variante di layout della shell: con `modern` usa la card centrata */
6
+ layout?: ShellLayoutVariant;
7
+ }
8
+ export declare function ForgotPassword(props: ForgotPasswordProps): import("react/jsx-runtime").JSX.Element;
5
9
  export default ForgotPassword;
@@ -1,7 +1,12 @@
1
- import { ShellLoginConfig } from '../../app';
1
+ import { ShellLayoutVariant, ShellLoginConfig } from '../../app';
2
2
  export interface LoginPageProps {
3
3
  brandName: string;
4
4
  loginConfig?: ShellLoginConfig;
5
+ /**
6
+ * Variante di layout della shell. Con {@link ShellLayoutVariant.Modern} la pagina
7
+ * usa la card centrata su sfondo scuro derivato dal brand.
8
+ */
9
+ layout?: ShellLayoutVariant;
5
10
  }
6
11
  declare function LoginPage(props: LoginPageProps): import("react/jsx-runtime").JSX.Element;
7
12
  export default LoginPage;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export interface ModernAuthShellProps {
3
+ brandName: string;
4
+ children: React.ReactNode;
5
+ }
6
+ /**
7
+ * Cornice delle pagine di autenticazione nel layout "modern": card centrata su
8
+ * sfondo scuro derivato dal brand.
9
+ *
10
+ * Il logo sta fuori dalla card di proposito: quello del brand è pensato per la
11
+ * sidebar colorata (tipicamente chiaro) e su fondo bianco rischierebbe di sparire.
12
+ */
13
+ export declare function ModernAuthShell({ brandName, children }: ModernAuthShellProps): import("react/jsx-runtime").JSX.Element;
14
+ export default ModernAuthShell;
@@ -1,2 +1,8 @@
1
- export declare function ResetPassword(): import("react/jsx-runtime").JSX.Element;
1
+ import { ShellLayoutVariant } from '../../app';
2
+ export interface ResetPasswordProps {
3
+ brandName?: string;
4
+ /** Variante di layout della shell: con `modern` usa la card centrata */
5
+ layout?: ShellLayoutVariant;
6
+ }
7
+ export declare function ResetPassword(props?: ResetPasswordProps): import("react/jsx-runtime").JSX.Element;
2
8
  export default ResetPassword;