@tenorlab/react-dashboard 1.2.4 → 1.2.7
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/dist/components/DynamicWidgetLoader.d.ts +2 -1
- package/dist/components/WidgetContainer.d.ts +1 -1
- package/dist/components/WidgetsCatalogFlyout.d.ts +3 -2
- package/dist/components/dashboard-primitives/index.d.ts +0 -4
- package/dist/components/index.d.ts +0 -2
- package/dist/components/interfaces/core-react.interfaces.d.ts +1 -1
- package/dist/components/interfaces/index.d.ts +0 -4
- package/dist/components/use-dashboard-store.d.ts +1 -1
- package/dist/components/use-dashboard-undo-service.d.ts +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/react-dashboard.es.js +1473 -1708
- package/package.json +2 -1
- package/dist/components/dashboard-primitives/color-utils.d.ts +0 -12
- package/dist/components/dashboard-primitives/css-vars-utils.d.ts +0 -6
- package/dist/components/dashboard-primitives/parse-container-title.d.ts +0 -2
- package/dist/components/dashboard-primitives/use-distinct-css-classes.d.ts +0 -1
- package/dist/components/dashboard-settings/dashboard-settings-utils.d.ts +0 -4
- package/dist/components/dashboard-settings/dashboard-settings.d.ts +0 -2
- package/dist/components/dashboard-settings/index.d.ts +0 -2
- package/dist/components/interfaces/core.base.d.ts +0 -73
- package/dist/components/interfaces/core.interfaces.d.ts +0 -39
- package/dist/components/interfaces/core.utils.d.ts +0 -66
- package/dist/components/interfaces/storage-service.interfaces.d.ts +0 -8
- package/dist/components/use-dashboard-storage-service.d.ts +0 -2
- package/dist/react-dashboard.css +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenorlab/react-dashboard",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"description": "Foundation components for creating user-configurable dashboards in React",
|
|
5
5
|
"author": "Damiano Fusco",
|
|
6
6
|
"type": "module",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"main": "./dist/react-dashboard.umd.js",
|
|
51
51
|
"module": "./dist/react-dashboard.es.js",
|
|
52
52
|
"devDependencies": {
|
|
53
|
+
"@tenorlab/dashboard-core": "^1.0.0",
|
|
53
54
|
"@types/node": "^24.10.1",
|
|
54
55
|
"@types/react-dom": "19.2.3",
|
|
55
56
|
"@vitejs/plugin-react": "^5.1.1",
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export declare const resolveColorFromClass: (classNames: string | string[], property?: "color" | "backgroundColor") => string;
|
|
2
|
-
export declare const resolvedColors: {
|
|
3
|
-
primary: string;
|
|
4
|
-
secondary: string;
|
|
5
|
-
success: string;
|
|
6
|
-
danger: string;
|
|
7
|
-
warning: string;
|
|
8
|
-
info: string;
|
|
9
|
-
disabled: string;
|
|
10
|
-
neutral: string;
|
|
11
|
-
body: string;
|
|
12
|
-
};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { IDashboardSettingEntry } from '../interfaces';
|
|
2
|
-
export declare const cssVarsUtils: {
|
|
3
|
-
getCssVariableValue: (cssPropertyName: string) => string | null;
|
|
4
|
-
setCssVariableValue: (cssPropertyName: string, value: string) => void;
|
|
5
|
-
restoreCssVarsFromSettings: (settings: IDashboardSettingEntry[]) => void;
|
|
6
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const getDistinctCssClasses: (defaultClasses: string, ...additionalClasses: string[]) => string;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
export type TDashboardWidgetKey = string;
|
|
2
|
-
export type TWidgetCategory = 'Widget' | 'Chart' | 'Container';
|
|
3
|
-
export type TWidgetMetaInfoBase<TFrameworkElementType = any> = {
|
|
4
|
-
name: string;
|
|
5
|
-
description: string;
|
|
6
|
-
categories: TWidgetCategory[];
|
|
7
|
-
noDuplicatedWidgets?: boolean;
|
|
8
|
-
icon: TFrameworkElementType | undefined;
|
|
9
|
-
externalDependencies: string[];
|
|
10
|
-
};
|
|
11
|
-
export interface IDashboardGridPropsBase {
|
|
12
|
-
isEditing: boolean;
|
|
13
|
-
zoomScale: number;
|
|
14
|
-
responsiveGrid: boolean;
|
|
15
|
-
}
|
|
16
|
-
export type TWidgetSize = 'default' | 'large' | 'xlarge';
|
|
17
|
-
export type TWidgetDirection = 'row' | 'column';
|
|
18
|
-
export interface IDashboardWidgetPropsBase<TExtraProps = any> {
|
|
19
|
-
index: number;
|
|
20
|
-
maxIndex: number;
|
|
21
|
-
widgetKey: TDashboardWidgetKey;
|
|
22
|
-
parentWidgetKey?: TDashboardWidgetKey;
|
|
23
|
-
isEditing: boolean;
|
|
24
|
-
highlight?: boolean;
|
|
25
|
-
testId?: string;
|
|
26
|
-
title?: string;
|
|
27
|
-
size?: TWidgetSize;
|
|
28
|
-
borderCssClasses?: string;
|
|
29
|
-
backgroundCssClasses?: string;
|
|
30
|
-
hideTitle?: boolean;
|
|
31
|
-
noShadow?: boolean;
|
|
32
|
-
noBorder?: boolean;
|
|
33
|
-
noPadding?: boolean;
|
|
34
|
-
direction?: TWidgetDirection;
|
|
35
|
-
extraProps?: TExtraProps;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 1. Define the Async Loader type
|
|
39
|
-
* Type for the function that performs the asynchronous dynamic import.
|
|
40
|
-
* It must return a promise that resolves to the module containing the widget component
|
|
41
|
-
* as its default export (or a named export if you change the loading strategy).
|
|
42
|
-
*
|
|
43
|
-
* TFrameworkComponent could be "React.ComponentType<any>"" or "VueComponent" etc
|
|
44
|
-
*/
|
|
45
|
-
export type TWidgetFactoryBase<TFrameworkComponent = any> = () => Promise<{
|
|
46
|
-
default: TFrameworkComponent;
|
|
47
|
-
}>;
|
|
48
|
-
/**
|
|
49
|
-
* 2. Define the flexible Catalog Entry
|
|
50
|
-
* Definition of a single widget or container in the catalog.
|
|
51
|
-
* It must have EITHER a direct 'component' reference OR a 'loader' function.
|
|
52
|
-
*
|
|
53
|
-
* TFrameworkElementType: see TWidgetMetaInfoBase
|
|
54
|
-
* TFrameworkComponentType: i.e. React.ComponentType<any> (see TWidgetFactoryBase)
|
|
55
|
-
*/
|
|
56
|
-
export interface IDynamicWidgetCatalogEntryBase<TFrameworkElementType = any, TFrameworkComponentType = any> {
|
|
57
|
-
key: TDashboardWidgetKey;
|
|
58
|
-
title: string;
|
|
59
|
-
isContainer?: boolean;
|
|
60
|
-
meta?: TWidgetMetaInfoBase<TFrameworkElementType>;
|
|
61
|
-
component?: TFrameworkComponentType;
|
|
62
|
-
loader?: TWidgetFactoryBase<TFrameworkComponentType>;
|
|
63
|
-
}
|
|
64
|
-
export type TDashboardWidgetCatalogBase<TFrameworkElementType = any, TFrameworkComponentType = any> = Map<TDashboardWidgetKey, IDynamicWidgetCatalogEntryBase<TFrameworkElementType, TFrameworkComponentType>>;
|
|
65
|
-
export type TGetDefaultWidgetMetaFromKeyOptions = {
|
|
66
|
-
title?: string;
|
|
67
|
-
description?: string;
|
|
68
|
-
};
|
|
69
|
-
export type TGetDefaultWidgetMetaFromKey = (widgetKey: TDashboardWidgetKey, options?: TGetDefaultWidgetMetaFromKeyOptions) => TWidgetMetaInfoBase<any>;
|
|
70
|
-
export type TManifestEntry = {
|
|
71
|
-
url: string;
|
|
72
|
-
meta: TWidgetMetaInfoBase;
|
|
73
|
-
};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { TDashboardWidgetKey } from './core.base';
|
|
2
|
-
export interface IChildWidgetConfigEntry {
|
|
3
|
-
parentWidgetKey: TDashboardWidgetKey;
|
|
4
|
-
widgetKey: TDashboardWidgetKey;
|
|
5
|
-
}
|
|
6
|
-
export interface IDashboardSettingEntry {
|
|
7
|
-
key: string;
|
|
8
|
-
name: string;
|
|
9
|
-
description: string;
|
|
10
|
-
cssProperty: string;
|
|
11
|
-
step: number;
|
|
12
|
-
defaultUnit: string;
|
|
13
|
-
minValue: number;
|
|
14
|
-
defaultValue: string;
|
|
15
|
-
value: string;
|
|
16
|
-
}
|
|
17
|
-
export interface IDashboardConfig {
|
|
18
|
-
userID: number | string;
|
|
19
|
-
clientAppKey: string;
|
|
20
|
-
dashboardId: string;
|
|
21
|
-
dashboardName: string;
|
|
22
|
-
zoomScale: number;
|
|
23
|
-
responsiveGrid: boolean;
|
|
24
|
-
widgets: TDashboardWidgetKey[];
|
|
25
|
-
childWidgetsConfig: IChildWidgetConfigEntry[];
|
|
26
|
-
cssSettings: IDashboardSettingEntry[];
|
|
27
|
-
_version?: number;
|
|
28
|
-
_stateDescription?: string;
|
|
29
|
-
}
|
|
30
|
-
export type TUndoHistoryEntry = {
|
|
31
|
-
undoIndex: number;
|
|
32
|
-
config: IDashboardConfig;
|
|
33
|
-
};
|
|
34
|
-
export type TDashboardUndoStatus = {
|
|
35
|
-
isUndoDisabled: boolean;
|
|
36
|
-
isRedoDisabled: boolean;
|
|
37
|
-
_currentIndex?: number;
|
|
38
|
-
_historyLength?: number;
|
|
39
|
-
};
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type { TDashboardWidgetKey, TWidgetMetaInfoBase, TDashboardWidgetCatalogBase, TGetDefaultWidgetMetaFromKey, TWidgetFactoryBase, IDynamicWidgetCatalogEntryBase } from './core.base';
|
|
2
|
-
import type { IDashboardConfig } from './core.interfaces';
|
|
3
|
-
export declare const blankDashboardConfig: IDashboardConfig;
|
|
4
|
-
export declare const DashboardMinZoomScale: 0.7;
|
|
5
|
-
export declare const DashboardMaxZoomScale: 1;
|
|
6
|
-
export declare const DashboardZoomStep: 0.05;
|
|
7
|
-
export declare const ensureZoomScaleIsWithinRange: (value: number) => number;
|
|
8
|
-
export declare const getNewZoomScaleWithinRange: (currentZoomScale: number, direction: -1 | 1) => number;
|
|
9
|
-
export declare const removeEmptyContainers: (dashboardConfig: IDashboardConfig) => IDashboardConfig;
|
|
10
|
-
/**
|
|
11
|
-
* @name ensureContainersSequence
|
|
12
|
-
* @description
|
|
13
|
-
* Ensures that the container widgets are numbered sequentially in the dashboardConfig, but the original order is preserved.
|
|
14
|
-
*/
|
|
15
|
-
export declare const ensureContainersSequence: (dashboardConfig: IDashboardConfig) => IDashboardConfig;
|
|
16
|
-
export declare const getDefaultWidgetMetaFromKey: TGetDefaultWidgetMetaFromKey;
|
|
17
|
-
/**
|
|
18
|
-
* @name getDefaultWidgetMetaFromMap
|
|
19
|
-
* @description Helper to get widget meta info from the catalog by key.
|
|
20
|
-
*/
|
|
21
|
-
export declare const getDefaultWidgetMetaFromMap: <TFrameworkElementType = any>(widgetKey: TDashboardWidgetKey, defaultWidgetMetaMap: Record<TDashboardWidgetKey, TWidgetMetaInfoBase<TFrameworkElementType>>, options?: {
|
|
22
|
-
title?: string;
|
|
23
|
-
description?: string;
|
|
24
|
-
}) => TWidgetMetaInfoBase<TFrameworkElementType>;
|
|
25
|
-
/**
|
|
26
|
-
* @name getWidgetMetaFromCatalog
|
|
27
|
-
* @description Helper to get widget meta info from the catalog by key.
|
|
28
|
-
*/
|
|
29
|
-
export declare const getWidgetMetaFromCatalog: <TFrameworkElementType = any, TFrameworkComponentType = any>(widgetKey: TDashboardWidgetKey, widgetsCatalog: TDashboardWidgetCatalogBase<TFrameworkElementType, TFrameworkComponentType>) => TWidgetMetaInfoBase<TFrameworkElementType>;
|
|
30
|
-
/**
|
|
31
|
-
* @name createStaticEntry
|
|
32
|
-
* Helper function to create static entries
|
|
33
|
-
* This helps keep the catalog registration clean
|
|
34
|
-
*/
|
|
35
|
-
export declare const createStaticEntry: <TFrameworkComponentType = any>(key: string, component: TFrameworkComponentType, metaData?: TWidgetMetaInfoBase) => [string, IDynamicWidgetCatalogEntryBase];
|
|
36
|
-
/**
|
|
37
|
-
* @name createDynamicEntry
|
|
38
|
-
* Helper function to create dynamic entries
|
|
39
|
-
* This helps keep the catalog registration clean
|
|
40
|
-
*/
|
|
41
|
-
export declare const createDynamicEntry: (key: string, loader: TWidgetFactoryBase, metaData: TWidgetMetaInfoBase) => [string, IDynamicWidgetCatalogEntryBase];
|
|
42
|
-
/**
|
|
43
|
-
* Enhanced helper to derive key and title from widget file paths.
|
|
44
|
-
* Handles:
|
|
45
|
-
* - widget-revenue-trends1 -> WidgetRevenueTrends1
|
|
46
|
-
* - widget-with-extraprops -> WidgetWithExtraprops
|
|
47
|
-
* - widget-revenue-trends-async -> WidgetRevenueTrendsAsync
|
|
48
|
-
*/
|
|
49
|
-
export declare const parseKeyAndTitleFromFilePath: (path: string) => {
|
|
50
|
-
key: TDashboardWidgetKey;
|
|
51
|
-
title: string;
|
|
52
|
-
folder: string;
|
|
53
|
-
} | null;
|
|
54
|
-
export declare const getMetaInfoFromFile: (widgetMetaModules: Record<string, Record<string, TWidgetMetaInfoBase>>, baseSrcPath: string, folder: string, key: string) => TWidgetMetaInfoBase | undefined;
|
|
55
|
-
export declare const remoteWidgetDiscovery: (manifestUrl: string) => Promise<{
|
|
56
|
-
entries: [string, IDynamicWidgetCatalogEntryBase][];
|
|
57
|
-
message: string;
|
|
58
|
-
details: string;
|
|
59
|
-
}>;
|
|
60
|
-
/**
|
|
61
|
-
* @name localWidgetDiscovery
|
|
62
|
-
* @description Scans local directories for widgets.
|
|
63
|
-
* If lazy is true, it registers loaders. If false, it registers static components.
|
|
64
|
-
*/
|
|
65
|
-
export declare const localWidgetDiscovery: (baseSrcPath: string, // e.g., "/src/async-widgets" or "/src/bundled-widgets"
|
|
66
|
-
widgetModules: Record<string, any>, widgetMetaModules: Record<string, any>, lazy?: boolean) => [string, IDynamicWidgetCatalogEntryBase][];
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { TDashboardWidgetCatalogBase } from './core.base';
|
|
2
|
-
import type { IDashboardConfig } from './core.interfaces';
|
|
3
|
-
export type TGetSavedDashboards = (userID: number | string, clientAppKey: string, widgetCatalog: TDashboardWidgetCatalogBase, defaultDashboardConfig: IDashboardConfig) => Promise<IDashboardConfig[]>;
|
|
4
|
-
export type TSaveDashboards = (userID: number | string, clientAppKey: string, dashboardConfigs: IDashboardConfig[], widgetCatalog: TDashboardWidgetCatalogBase) => Promise<boolean>;
|
|
5
|
-
export interface IDashboardStorageService {
|
|
6
|
-
getSavedDashboards: TGetSavedDashboards;
|
|
7
|
-
saveDashboards: TSaveDashboards;
|
|
8
|
-
}
|
package/dist/react-dashboard.css
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
html{--bwj-dashboard-num-columns: 3;--bwj-dashboard-gap: 1.25rem;--bwj-dashboard-transform-scale: 1;--bwj-dashboard-add-cols: 1;--bwj-widget-width: 21rem;--bwj-widget-border-radius: .33rem;--bwj-widget-inner-px: 1rem;--bwj-widget-inner-py: .75rem;--bwj-widget-header-px: var(--bwj-widget-inner-px);--bwj-widget-header-py: 1rem;--bwj-widget-title-size: .8rem;--bwj-widget-title-weight: 600;--bwj-dashboard-debug-container-flex-row: none;--bwj-dashboard-debug-container-flex-column: none;--bwj-dashboard-debug-container-grid-large-inner: none}html .dashboard-main-grid{width:100%;display:grid;grid-template-columns:repeat(var(--bwj-dashboard-num-columns, 4),minmax(var(--bwj-widget-width),1fr));gap:var(--bwj-dashboard-gap, 1.5rem);transform:scale(var(--bwj-dashboard-transform-scale, 1));transform-origin:top left}html .dashboard-main-grid.editing{row-gap:calc(var(--bwj-dashboard-gap) + .8rem)}html .dashboard-main-grid:not(.responsive-grid){max-width:min-content}html .dashboard-main-grid.responsive-grid{width:100%}html .dashboard-widget-container{--bwj-border-opacity: .5;flex:1 1 0%;width:100%}html .dashboard-widget-container .widget-container-header{display:none;position:absolute;height:1.85rem;inset:-1.85rem -1px auto;cursor:pointer;padding:0 .33rem}html .dashboard-widget-container .widget-container-header .actions-inner{transition:all .3s ease-in-out;width:100%;display:none;align-items:center;justify-content:space-between;font-size:.8rem}html .dashboard-widget-container.editing{border-top:none!important;border-bottom-left-radius:var(--bwj-widget-border-radius, .3rem);border-bottom-right-radius:var(--bwj-widget-border-radius, .3rem)}html .dashboard-widget-container.editing .widget-container-header{display:flex;border-bottom:none!important;border-top-left-radius:var(--bwj-widget-border-radius, .3rem);border-top-right-radius:var(--bwj-widget-border-radius, .3rem)}html .dashboard-widget-container.editing .widget-container-header>.actions-inner{display:flex!important}html .dashboard-widget-container.editing.highlight-container:before{content:"";position:absolute;inset:-1.85rem 0 0;box-shadow:0 2px 10px 6px oklch(var(--bwj-primary-okl) var(--bwj-primary-okc) var(--bwj-primary-okh) / .5);pointer-events:none}html .dashboard-widget{flex:1 1 0%;display:flex;flex-direction:column;position:relative;border-radius:var(--bwj-widget-border-radius, .3rem);height:100%;width:100%}html .dashboard-widget:not(.no-shadow){box-shadow:1px 2px 8px #0000001a}html .dashboard-widget.no-shadow{box-shadow:none}html .dashboard-widget.transparent-widget{background-color:transparent}html .dashboard-widget .widget-title-wrapper .widget-title{font-size:var(--bwj-widget-title-size, .75rem);font-weight:var(--bwj-widget-title-weight, 600)}html .dashboard-widget .widget-inner{flex:1 1 0%;display:flex;flex-direction:column;justify-content:space-between}html .dashboard-widget:not(.no-padding) .widget-inner{padding:var(--bwj-widget-inner-py, 1rem) var(--bwj-widget-inner-px, 1.5rem)}html .dashboard-widget.no-padding .widget-inner{padding:0}html .dashboard-widget .widget-header{padding:var(--bwj-widget-header-py, 1rem) var(--bwj-widget-header-px, 1.5rem)}html .dashboard-widget-container .widget-container-inner{padding:0;gap:var(--bwj-dashboard-gap, 1.5rem)}html .dashboard-widget-container.direction-row.widget-container-flex{grid-column:1 / -1;width:100%;outline:var(--bwj-dashboard-debug-container-flex-row)}html .dashboard-widget-container.direction-row.widget-container-flex .widget-container-inner{display:flex;flex-direction:row;height:100%}html .dashboard-widget-container.direction-row.widget-container-flex .widget-container-inner .dashboard-widget{min-width:5%;max-width:100%}html .dashboard-widget-container.direction-column.widget-container-flex .widget-container-inner{display:flex;flex-direction:column;height:100%;outline:var(--bwj-dashboard-debug-container-flex-column)}html .dashboard-widget-container.direction-column.widget-container-flex .widget-container-inner .dashboard-widget{min-width:5%;max-width:100%}html .dashboard-widget-container.large-widget.widget-container-grid .widget-container-inner{display:grid;grid-template-columns:repeat(2,minmax(var(--bwj-widget-width),1fr));outline:var(--bwj-dashboard-debug-container-grid-large-inner)}html .dashboard-main-grid.responsive-grid .dashboard-widget-container:not(.large-widget):not(.xlarge-widget),html .dashboard-main-grid.responsive-grid .dashboard-widget:not(.large-widget):not(.xlarge-widget){min-width:20%;max-width:100%}html .dashboard-main-grid:not(.responsive-grid) .dashboard-widget-container:not(.widget-container-flex):not(.large-widget):not(.xlarge-widget),html .widget-container-flex:not(.direction-row) .dashboard-main-grid:not(.responsive-grid) .dashboard-widget:not(.large-widget):not(.xlarge-widget){min-width:var(--bwj-widget-width);max-width:var(--bwj-widget-width)}html .dashboard-widget-container.large-widget,html .dashboard-widget.large-widget{grid-column:span 2}html .dashboard-main-grid:not(.responsive-grid) .dashboard-widget-container.large-widget,html .dashboard-main-grid:not(.responsive-grid) .dashboard-widget.large-widget{max-width:calc(680px + var(--bwj-dashboard-gap, 1.5rem))}html .dashboard-widget-container.xlarge-widget,html .dashboard-widget.xlarge-widget{grid-column:span 3}html .dashboard-main-grid:not(.responsive-grid) .dashboard-widget-container.xlarge-widget,html .dashboard-main-grid:not(.responsive-grid) .dashboard-widget.xlarge-widget{max-width:calc(1020px + (var(--bwj-dashboard-gap, 1.5rem) * 2))}html .widget-header .actions-inner{display:none;align-items:center;gap:.25rem}html .widget-header .actions-inner .actions-buttons-container{align-items:center;gap:.25rem}html .dashboard-widget.editing:hover .actions-inner{display:flex!important}html .dashboard-widget-container.editing .widget-container-header .actions-inner{display:flex}html .actions-buttons-container{display:flex!important;align-items:center!important;gap:.25rem!important}html .dashboard-number{font-variant-numeric:tabular-nums;font-size:2.5rem;font-weight:700}html .dashboard-number.number-xl{font-size:3.5rem}html .dashboard-number.number-lg{font-size:2.5rem}html .dashboard-number.number-base{font-size:1.5rem}html .dashboard-progress-bar{padding:0;width:100%;height:1.5rem;border-radius:.75rem}html .dashboard-progress{padding:0;height:1.25rem;border-radius:.75rem}@media(max-width:769px){html .dashboard-main-grid{display:flex;flex-direction:column;width:100%;max-width:100%!important}html .dashboard-widget-container.widget-container-flex.direction-row{max-width:100%;grid-column:auto}html .dashboard-widget-container.widget-container-flex.direction-row .widget-container-inner{display:flex;flex-wrap:wrap;flex-direction:column!important;width:100%}}@media(min-width:770px){html .dashboard-main-grid{--bwj-dashboard-num-columns: calc(2 + var(--bwj-dashboard-add-cols))}}@media(max-width:1119px){html .dashboard-widget-container.widget-container-flex.direction-row{max-width:100%;grid-column:auto}html .dashboard-widget-container.widget-container-flex.direction-row .widget-container-inner{display:flex;flex-wrap:wrap;flex-direction:column!important;width:100%}}@media(min-width:1120px){html .dashboard-main-grid{--bwj-dashboard-num-columns: calc(3 + var(--bwj-dashboard-add-cols))}}@media(min-width:1480px){html .dashboard-main-grid{--bwj-dashboard-num-columns: calc(4 + var(--bwj-dashboard-add-cols))}}@media(min-width:1840px){html .dashboard-main-grid{--bwj-dashboard-num-columns: calc(5 + var(--bwj-dashboard-add-cols))}}@media(min-width:2220px){html .dashboard-main-grid{--bwj-dashboard-num-columns: calc(6 + var(--bwj-dashboard-add-cols))}}
|