@burdenoff/microfe-bigconsole 2026.712.1 → 2026.713.2

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 (38) hide show
  1. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js +144 -69
  2. package/dist/bigconsole/assistant/createSandboxAssistantTransport.js.map +1 -1
  3. package/dist/bigconsole/components/builder/BuilderCanvas.js +21 -0
  4. package/dist/bigconsole/components/builder/BuilderCanvas.js.map +1 -0
  5. package/dist/bigconsole/components/builder/BuilderTopbar.js +33 -0
  6. package/dist/bigconsole/components/builder/BuilderTopbar.js.map +1 -0
  7. package/dist/bigconsole/components/builder/DashboardEditorShell.js +20 -0
  8. package/dist/bigconsole/components/builder/DashboardEditorShell.js.map +1 -0
  9. package/dist/bigconsole/components/builder/WidgetInspector.js +14 -0
  10. package/dist/bigconsole/components/builder/WidgetInspector.js.map +1 -0
  11. package/dist/bigconsole/components/builder/index.js +4 -0
  12. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js +45 -0
  13. package/dist/bigconsole/components/builder/inspector/AdvancedSection.js.map +1 -0
  14. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js +43 -0
  15. package/dist/bigconsole/components/builder/inspector/AppearanceSection.js.map +1 -0
  16. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js +124 -0
  17. package/dist/bigconsole/components/builder/inspector/DataBindingSection.js.map +1 -0
  18. package/dist/bigconsole/components/builder/inspector/GeneralSection.js +50 -0
  19. package/dist/bigconsole/components/builder/inspector/GeneralSection.js.map +1 -0
  20. package/dist/bigconsole/components/builder/inspector/index.js +4 -0
  21. package/dist/bigconsole/components/dashboard/DashboardCanvas.js +221 -199
  22. package/dist/bigconsole/components/dashboard/DashboardCanvas.js.map +1 -1
  23. package/dist/bigconsole/components/dashboard/WidgetPalette.js +145 -102
  24. package/dist/bigconsole/components/dashboard/WidgetPalette.js.map +1 -1
  25. package/dist/bigconsole/components/dashboard/index.js +4 -0
  26. package/dist/bigconsole/components/widgets/PropertiesPanel.js +529 -742
  27. package/dist/bigconsole/components/widgets/PropertiesPanel.js.map +1 -1
  28. package/dist/bigconsole/components/widgets/WidgetWrapper.js +227 -226
  29. package/dist/bigconsole/components/widgets/WidgetWrapper.js.map +1 -1
  30. package/dist/bigconsole/pages/DashboardBuilderPage.js +221 -316
  31. package/dist/bigconsole/pages/DashboardBuilderPage.js.map +1 -1
  32. package/dist/bigconsole/utils/widgetBinding.js +115 -0
  33. package/dist/bigconsole/utils/widgetBinding.js.map +1 -0
  34. package/package.json +2 -2
  35. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js +0 -883
  36. package/dist/bigconsole/components/widgets/WidgetConfigDialog.js.map +0 -1
  37. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js +0 -311
  38. package/dist/bigconsole/components/widgets/WidgetTypeSelector.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ import { memo as e } from "react";
2
+ import { Select as t, SelectContent as n, SelectItem as r, SelectTrigger as i, SelectValue as a } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
+ //#region src/bigconsole/components/builder/inspector/AdvancedSection.tsx
5
+ var c = e(function({ renderer: e, rendererOptions: c, onRendererChange: l, templateEditor: u }) {
6
+ let d = c.find((t) => t.value === e);
7
+ return /* @__PURE__ */ s("section", {
8
+ className: "border-t border-border-default pt-4",
9
+ "aria-labelledby": "widget-advanced-renderer-heading",
10
+ children: [
11
+ /* @__PURE__ */ o("h3", {
12
+ id: "widget-advanced-renderer-heading",
13
+ className: "mb-1 text-sm font-semibold text-text-primary",
14
+ children: "Renderer"
15
+ }),
16
+ /* @__PURE__ */ s(t, {
17
+ value: e,
18
+ onValueChange: (e) => l(e),
19
+ children: [/* @__PURE__ */ o(i, {
20
+ className: "h-9 text-sm",
21
+ children: /* @__PURE__ */ o(a, { placeholder: "Select renderer" })
22
+ }), /* @__PURE__ */ o(n, {
23
+ position: "popper",
24
+ side: "bottom",
25
+ sideOffset: 4,
26
+ align: "start",
27
+ className: "max-h-52",
28
+ children: c.map((e) => /* @__PURE__ */ o(r, {
29
+ value: e.value,
30
+ children: e.label
31
+ }, e.value))
32
+ })]
33
+ }),
34
+ d && /* @__PURE__ */ o("p", {
35
+ className: "mt-1 text-sm text-text-muted",
36
+ children: d.description
37
+ }),
38
+ u
39
+ ]
40
+ });
41
+ });
42
+ //#endregion
43
+ export { c as AdvancedSection };
44
+
45
+ //# sourceMappingURL=AdvancedSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdvancedSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AdvancedSection.tsx"],"sourcesContent":["import { type FC, type ReactNode, memo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@burdenoff/fe-libs/ui';\nimport type { RendererType } from '../../../types';\n\nexport interface AdvancedRendererOption {\n value: RendererType;\n label: string;\n description: string;\n}\n\nexport interface AdvancedSectionProps {\n renderer: RendererType;\n rendererOptions: AdvancedRendererOption[];\n onRendererChange: (renderer: RendererType) => void;\n templateEditor?: ReactNode;\n}\n\n/** Renderer/template controls; actions and integrations migrate here next. */\nexport const AdvancedSection: FC<AdvancedSectionProps> = memo(function AdvancedSection({\n renderer,\n rendererOptions,\n onRendererChange,\n templateEditor,\n}) {\n const selectedOption = rendererOptions.find((option) => option.value === renderer);\n\n return (\n <section className=\"border-t border-border-default pt-4\" aria-labelledby=\"widget-advanced-renderer-heading\">\n <h3 id=\"widget-advanced-renderer-heading\" className=\"mb-1 text-sm font-semibold text-text-primary\">\n Renderer\n </h3>\n <Select value={renderer} onValueChange={(value) => onRendererChange(value as RendererType)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue placeholder=\"Select renderer\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" side=\"bottom\" sideOffset={4} align=\"start\" className=\"max-h-52\">\n {rendererOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {selectedOption && <p className=\"mt-1 text-sm text-text-muted\">{selectedOption.description}</p>}\n {templateEditor}\n </section>\n );\n});\n"],"mappings":";;;;AAkBA,IAAa,IAA4C,EAAK,SAAyB,EACrF,aACA,oBACA,qBACA,qBACC;CACD,IAAM,IAAiB,EAAgB,MAAM,MAAW,EAAO,UAAU,EAAS;AAElF,QACE,kBAAC,WAAD;EAAS,WAAU;EAAsC,mBAAgB;YAAzE;GACE,kBAAC,MAAD;IAAI,IAAG;IAAmC,WAAU;cAA+C;IAE9F,CAAA;GACL,kBAAC,GAAD;IAAQ,OAAO;IAAU,gBAAgB,MAAU,EAAiB,EAAsB;cAA1F,CACE,kBAAC,GAAD;KAAe,WAAU;eACvB,kBAAC,GAAD,EAAa,aAAY,mBAAoB,CAAA;KAC/B,CAAA,EAChB,kBAAC,GAAD;KAAe,UAAS;KAAS,MAAK;KAAS,YAAY;KAAG,OAAM;KAAQ,WAAU;eACnF,EAAgB,KAAK,MACpB,kBAAC,GAAD;MAA+B,OAAO,EAAO;gBAC1C,EAAO;MACG,EAFI,EAAO,MAEX,CACb;KACY,CAAA,CACT;;GACR,KAAkB,kBAAC,KAAD;IAAG,WAAU;cAAgC,EAAe;IAAgB,CAAA;GAC9F;GACO;;EAEZ"}
@@ -0,0 +1,43 @@
1
+ import e from "../../widgets/chart/ChartConfig.js";
2
+ import t from "../../widgets/gauge/GaugeConfig.js";
3
+ import n from "../../widgets/list/ListConfig.js";
4
+ import r from "../../widgets/metric-card/MetricCardConfig.js";
5
+ import i from "../../widgets/progress/ProgressConfig.js";
6
+ import a from "../../widgets/table/TableConfig.js";
7
+ import { memo as o } from "react";
8
+ import { jsx as s } from "react/jsx-runtime";
9
+ //#region src/bigconsole/components/builder/inspector/AppearanceSection.tsx
10
+ function c(e) {
11
+ return e;
12
+ }
13
+ function l(o) {
14
+ switch (o) {
15
+ case "metric_card":
16
+ case "kpi_card_comparison": return c(r);
17
+ case "chart":
18
+ case "funnel_chart": return c(e);
19
+ case "table":
20
+ case "pivot_table": return c(a);
21
+ case "gauge": return c(t);
22
+ case "progress": return c(i);
23
+ case "list": return c(n);
24
+ default: return null;
25
+ }
26
+ }
27
+ var u = o(function({ widgetType: e, config: t, onChange: n }) {
28
+ let r = l(e);
29
+ return r ? /* @__PURE__ */ s(r, {
30
+ config: t,
31
+ onChange: n
32
+ }) : /* @__PURE__ */ s("div", {
33
+ className: "rounded-lg bg-bg-sunken p-4 text-center",
34
+ children: /* @__PURE__ */ s("p", {
35
+ className: "text-sm text-text-secondary",
36
+ children: "No style options for this widget type"
37
+ })
38
+ });
39
+ });
40
+ //#endregion
41
+ export { u as AppearanceSection };
42
+
43
+ //# sourceMappingURL=AppearanceSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppearanceSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/AppearanceSection.tsx"],"sourcesContent":["import { type ComponentType, type FC, memo } from 'react';\nimport type { WidgetType } from '../../../types';\nimport { MetricCardConfig } from '../../widgets/metric-card/MetricCardConfig';\nimport { ChartConfig } from '../../widgets/chart/ChartConfig';\nimport { TableConfig } from '../../widgets/table/TableConfig';\nimport { GaugeConfig } from '../../widgets/gauge/GaugeConfig';\nimport { ProgressConfig } from '../../widgets/progress/ProgressConfig';\nimport { ListConfig } from '../../widgets/list/ListConfig';\n\ninterface ConfigComponentProps {\n config: never;\n onChange: (config: never) => void;\n}\n\n// Legacy widget config components expose distinct config interfaces even though\n// they share the same runtime { config, onChange } contract. Keep the narrowing\n// cast in this adapter instead of spreading `never` casts across inspector code.\nfunction asConfigComponent(component: ComponentType<unknown>): ComponentType<ConfigComponentProps> {\n return component as unknown as ComponentType<ConfigComponentProps>;\n}\n\nexport interface AppearanceSectionProps {\n widgetType: WidgetType;\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n}\n\nfunction getConfigComponent(type: WidgetType): ComponentType<ConfigComponentProps> | null {\n switch (type) {\n case 'metric_card':\n case 'kpi_card_comparison':\n return asConfigComponent(MetricCardConfig as ComponentType<unknown>);\n case 'chart':\n case 'funnel_chart':\n return asConfigComponent(ChartConfig as ComponentType<unknown>);\n case 'table':\n case 'pivot_table':\n return asConfigComponent(TableConfig as ComponentType<unknown>);\n case 'gauge':\n return asConfigComponent(GaugeConfig as ComponentType<unknown>);\n case 'progress':\n return asConfigComponent(ProgressConfig as ComponentType<unknown>);\n case 'list':\n return asConfigComponent(ListConfig as ComponentType<unknown>);\n default:\n return null;\n }\n}\n\n/** Widget-specific visual configuration with a shared empty state. */\nexport const AppearanceSection: FC<AppearanceSectionProps> = memo(function AppearanceSection({\n widgetType,\n config,\n onChange,\n}) {\n const ConfigComponent = getConfigComponent(widgetType);\n\n if (!ConfigComponent) {\n return (\n <div className=\"rounded-lg bg-bg-sunken p-4 text-center\">\n <p className=\"text-sm text-text-secondary\">No style options for this widget type</p>\n </div>\n );\n }\n\n return <ConfigComponent config={config as never} onChange={onChange as (config: never) => void} />;\n});\n"],"mappings":";;;;;;;;;AAiBA,SAAS,EAAkB,GAAwE;AACjG,QAAO;;AAST,SAAS,EAAmB,GAA8D;AACxF,SAAQ,GAAR;EACE,KAAK;EACL,KAAK,sBACH,QAAO,EAAkB,EAA2C;EACtE,KAAK;EACL,KAAK,eACH,QAAO,EAAkB,EAAsC;EACjE,KAAK;EACL,KAAK,cACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,QACH,QAAO,EAAkB,EAAsC;EACjE,KAAK,WACH,QAAO,EAAkB,EAAyC;EACpE,KAAK,OACH,QAAO,EAAkB,EAAqC;EAChE,QACE,QAAO;;;AAKb,IAAa,IAAgD,EAAK,SAA2B,EAC3F,eACA,WACA,eACC;CACD,IAAM,IAAkB,EAAmB,EAAW;AAUtD,QARK,IAQE,kBAAC,GAAD;EAAyB;EAA2B;EAAuC,CAAA,GAN9F,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aAA8B;GAAyC,CAAA;EAChF,CAAA;EAKV"}
@@ -0,0 +1,124 @@
1
+ import e from "../../parser/DataSinkSelector.js";
2
+ import t from "../../parser/ParserSelector.js";
3
+ import { Input as n, Label as r, Spinner as i } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ //#region src/bigconsole/components/builder/inspector/DataBindingSection.tsx
6
+ var s = {
7
+ unbound: "Select a DataSink to begin",
8
+ loading: "Testing parser and detecting fields…",
9
+ bound: "Binding ready",
10
+ no_data: "Parser returned no data",
11
+ parser_error: "Parser test failed",
12
+ field_mismatch: "Some mapped fields were not found"
13
+ }, c = ({ consoleId: c, binding: l, dataSinkKey: u, dataPath: d, status: f, missingFields: p = [], preview: m, error: h, onDataSinkChange: g, onParserChange: _, onDataPathChange: v }) => /* @__PURE__ */ o("div", {
14
+ className: "space-y-4",
15
+ children: [
16
+ /* @__PURE__ */ a("div", {
17
+ className: "rounded-md border border-border-subtle bg-bg-sunken p-3",
18
+ children: /* @__PURE__ */ a("p", {
19
+ className: "text-xs text-text-secondary",
20
+ children: "Connect this widget to a DataSink and Parser to display transformed data."
21
+ })
22
+ }),
23
+ /* @__PURE__ */ o("div", {
24
+ className: "space-y-2",
25
+ children: [
26
+ /* @__PURE__ */ a(r, { children: "DataSink" }),
27
+ /* @__PURE__ */ a(e, {
28
+ value: u,
29
+ onChange: g,
30
+ placeholder: "Select a DataSink..."
31
+ }),
32
+ u && /* @__PURE__ */ o("p", {
33
+ className: "text-xs text-text-secondary",
34
+ children: [
35
+ "Key: ",
36
+ u,
37
+ l.source.ref && /* @__PURE__ */ o("span", {
38
+ className: "ml-2 text-text-tertiary",
39
+ children: [
40
+ "ID: ",
41
+ l.source.ref.slice(0, 8),
42
+ "..."
43
+ ]
44
+ })
45
+ ]
46
+ })
47
+ ]
48
+ }),
49
+ /* @__PURE__ */ o("div", {
50
+ className: "space-y-2",
51
+ children: [
52
+ /* @__PURE__ */ a(r, { children: "Parser" }),
53
+ /* @__PURE__ */ a(t, {
54
+ consoleId: c,
55
+ value: l.parserId ?? null,
56
+ onChange: _,
57
+ filterInputSinkKey: u ?? void 0,
58
+ filterStatus: void 0,
59
+ placeholder: u ? "Select a parser..." : "Select a DataSink first...",
60
+ disabled: !u
61
+ }),
62
+ /* @__PURE__ */ o("p", {
63
+ className: "flex items-center gap-1 text-xs text-text-secondary",
64
+ role: "status",
65
+ children: [f === "loading" && /* @__PURE__ */ a(i, { style: {
66
+ width: "12px",
67
+ height: "12px"
68
+ } }), s[f]]
69
+ }),
70
+ h && /* @__PURE__ */ a("p", {
71
+ className: "text-xs text-status-error",
72
+ children: h
73
+ }),
74
+ p.length > 0 && /* @__PURE__ */ o("p", {
75
+ className: "text-xs text-status-warning",
76
+ children: ["Missing: ", p.join(", ")]
77
+ })
78
+ ]
79
+ }),
80
+ l.parserId && Object.keys(l.fields).length > 0 && /* @__PURE__ */ o("div", {
81
+ className: "rounded-md border border-status-success bg-status-success-muted p-3",
82
+ children: [/* @__PURE__ */ a("p", {
83
+ className: "mb-2 text-xs font-medium text-status-success",
84
+ children: "Field mappings configured"
85
+ }), /* @__PURE__ */ a("div", {
86
+ className: "space-y-1 text-xs text-text-secondary",
87
+ children: Object.entries(l.fields).map(([e, t]) => /* @__PURE__ */ o("p", { children: [
88
+ e,
89
+ ": ",
90
+ /* @__PURE__ */ a("code", {
91
+ className: "rounded bg-bg-sunken px-1",
92
+ children: t
93
+ })
94
+ ] }, e))
95
+ })]
96
+ }),
97
+ m !== void 0 && /* @__PURE__ */ o("div", {
98
+ className: "space-y-2",
99
+ children: [/* @__PURE__ */ a(r, { children: "Live Preview" }), /* @__PURE__ */ a("pre", {
100
+ className: "max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary",
101
+ children: JSON.stringify(m, null, 2)
102
+ })]
103
+ }),
104
+ /* @__PURE__ */ o("div", {
105
+ className: "space-y-2",
106
+ children: [
107
+ /* @__PURE__ */ a(r, { children: "Data Path (Optional)" }),
108
+ /* @__PURE__ */ a(n, {
109
+ value: d ?? "",
110
+ onChange: (e) => v(e.target.value || void 0),
111
+ placeholder: "e.g., summary.totalRevenue"
112
+ }),
113
+ /* @__PURE__ */ a("p", {
114
+ className: "text-xs text-text-secondary",
115
+ children: "Path to extract specific data from the parser output (dot notation)"
116
+ })
117
+ ]
118
+ })
119
+ ]
120
+ });
121
+ //#endregion
122
+ export { c as DataBindingSection };
123
+
124
+ //# sourceMappingURL=DataBindingSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataBindingSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/DataBindingSection.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Input, Label, Spinner } from '@burdenoff/fe-libs/ui';\nimport type { WidgetBinding, WidgetBindingStatus } from '../../../types';\nimport { DataSinkSelector } from '../../parser/DataSinkSelector';\nimport { ParserSelector } from '../../parser/ParserSelector';\n\nexport interface DataBindingSectionProps {\n consoleId: string;\n binding: WidgetBinding;\n dataSinkKey: string | null;\n dataPath?: string;\n status: WidgetBindingStatus;\n missingFields?: string[];\n preview?: unknown;\n error?: string | null;\n onDataSinkChange: (key: string | null) => void;\n onParserChange: (parserId: string | null) => void;\n onDataPathChange: (path: string | undefined) => void;\n}\n\nconst STATUS_LABELS: Record<WidgetBindingStatus, string> = {\n unbound: 'Select a DataSink to begin',\n loading: 'Testing parser and detecting fields…',\n bound: 'Binding ready',\n no_data: 'Parser returned no data',\n parser_error: 'Parser test failed',\n field_mismatch: 'Some mapped fields were not found',\n};\n\nexport const DataBindingSection: FC<DataBindingSectionProps> = ({\n consoleId,\n binding,\n dataSinkKey,\n dataPath,\n status,\n missingFields = [],\n preview,\n error,\n onDataSinkChange,\n onParserChange,\n onDataPathChange,\n}) => (\n <div className=\"space-y-4\">\n <div className=\"rounded-md border border-border-subtle bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary\">\n Connect this widget to a DataSink and Parser to display transformed data.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>DataSink</Label>\n <DataSinkSelector value={dataSinkKey} onChange={onDataSinkChange} placeholder=\"Select a DataSink...\" />\n {dataSinkKey && (\n <p className=\"text-xs text-text-secondary\">\n Key: {dataSinkKey}\n {binding.source.ref && (\n <span className=\"ml-2 text-text-tertiary\">ID: {binding.source.ref.slice(0, 8)}...</span>\n )}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label>Parser</Label>\n <ParserSelector\n consoleId={consoleId}\n value={binding.parserId ?? null}\n onChange={onParserChange}\n filterInputSinkKey={dataSinkKey ?? undefined}\n filterStatus={undefined}\n placeholder={dataSinkKey ? 'Select a parser...' : 'Select a DataSink first...'}\n disabled={!dataSinkKey}\n />\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\" role=\"status\">\n {status === 'loading' && <Spinner style={{ width: '12px', height: '12px' }} />}\n {STATUS_LABELS[status]}\n </p>\n {error && <p className=\"text-xs text-status-error\">{error}</p>}\n {missingFields.length > 0 && <p className=\"text-xs text-status-warning\">Missing: {missingFields.join(', ')}</p>}\n </div>\n\n {binding.parserId && Object.keys(binding.fields).length > 0 && (\n <div className=\"rounded-md border border-status-success bg-status-success-muted p-3\">\n <p className=\"mb-2 text-xs font-medium text-status-success\">Field mappings configured</p>\n <div className=\"space-y-1 text-xs text-text-secondary\">\n {Object.entries(binding.fields).map(([name, path]) => (\n <p key={name}>\n {name}: <code className=\"rounded bg-bg-sunken px-1\">{path}</code>\n </p>\n ))}\n </div>\n </div>\n )}\n\n {preview !== undefined && (\n <div className=\"space-y-2\">\n <Label>Live Preview</Label>\n <pre className=\"max-h-40 overflow-auto rounded-md border border-border-subtle bg-bg-sunken p-3 text-xs text-text-secondary\">\n {JSON.stringify(preview, null, 2)}\n </pre>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label>Data Path (Optional)</Label>\n <Input\n value={dataPath ?? ''}\n onChange={(event) => onDataPathChange(event.target.value || undefined)}\n placeholder=\"e.g., summary.totalRevenue\"\n />\n <p className=\"text-xs text-text-secondary\">Path to extract specific data from the parser output (dot notation)</p>\n </div>\n </div>\n);\n"],"mappings":";;;;;AAoBA,IAAM,IAAqD;CACzD,SAAS;CACT,SAAS;CACT,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CACjB,EAEY,KAAmD,EAC9D,cACA,YACA,gBACA,aACA,WACA,mBAAgB,EAAE,EAClB,YACA,UACA,qBACA,mBACA,0BAEA,kBAAC,OAAD;CAAK,WAAU;WAAf;EACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA;GACA,CAAA;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,YAAgB,CAAA;IACvB,kBAAC,GAAD;KAAkB,OAAO;KAAa,UAAU;KAAkB,aAAY;KAAyB,CAAA;IACtG,KACC,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MACnC;MACL,EAAQ,OAAO,OACd,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0C;QAAK,EAAQ,OAAO,IAAI,MAAM,GAAG,EAAE;QAAC;QAAU;;MAExF;;IAEF;;EAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,UAAc,CAAA;IACrB,kBAAC,GAAD;KACa;KACX,OAAO,EAAQ,YAAY;KAC3B,UAAU;KACV,oBAAoB,KAAe,KAAA;KACnC,cAAc,KAAA;KACd,aAAa,IAAc,uBAAuB;KAClD,UAAU,CAAC;KACX,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;KAAsD,MAAK;eAAxE,CACG,MAAW,aAAa,kBAAC,GAAD,EAAS,OAAO;MAAE,OAAO;MAAQ,QAAQ;MAAQ,EAAI,CAAA,EAC7E,EAAc,GACb;;IACH,KAAS,kBAAC,KAAD;KAAG,WAAU;eAA6B;KAAU,CAAA;IAC7D,EAAc,SAAS,KAAK,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA2C,aAAU,EAAc,KAAK,KAAK,CAAK;;IAC3G;;EAEL,EAAQ,YAAY,OAAO,KAAK,EAAQ,OAAO,CAAC,SAAS,KACxD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAA+C;IAA6B,CAAA,EACzF,kBAAC,OAAD;IAAK,WAAU;cACZ,OAAO,QAAQ,EAAQ,OAAO,CAAC,KAAK,CAAC,GAAM,OAC1C,kBAAC,KAAD,EAAA,UAAA;KACG;KAAK;KAAE,kBAAC,QAAD;MAAM,WAAU;gBAA6B;MAAY,CAAA;KAC/D,EAAA,EAFI,EAEJ,CACJ;IACE,CAAA,CACF;;EAGP,MAAY,KAAA,KACX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAA,UAAO,gBAAoB,CAAA,EAC3B,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAK,UAAU,GAAS,MAAM,EAAE;IAC7B,CAAA,CACF;;EAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAA,UAAO,wBAA4B,CAAA;IACnC,kBAAC,GAAD;KACE,OAAO,KAAY;KACnB,WAAW,MAAU,EAAiB,EAAM,OAAO,SAAS,KAAA,EAAU;KACtE,aAAY;KACZ,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAuE,CAAA;IAC9G;;EACF"}
@@ -0,0 +1,50 @@
1
+ import { memo as e } from "react";
2
+ import { Input as t, Textarea as n } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
+ //#region src/bigconsole/components/builder/inspector/GeneralSection.tsx
5
+ var a = e(function({ title: e, description: a, refreshInterval: o, onTitleChange: s, onDescriptionChange: c, onRefreshIntervalChange: l }) {
6
+ let u = "mb-1 block text-sm font-semibold text-text-primary";
7
+ return /* @__PURE__ */ i("div", {
8
+ className: "flex flex-col gap-4",
9
+ children: [
10
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
11
+ htmlFor: "widget-inspector-title",
12
+ className: u,
13
+ children: "Title"
14
+ }), /* @__PURE__ */ r(t, {
15
+ id: "widget-inspector-title",
16
+ value: e,
17
+ onChange: (e) => s(e.target.value),
18
+ className: "h-9 text-sm"
19
+ })] }),
20
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
21
+ htmlFor: "widget-inspector-description",
22
+ className: u,
23
+ children: "Description"
24
+ }), /* @__PURE__ */ r(n, {
25
+ id: "widget-inspector-description",
26
+ value: a,
27
+ onChange: (e) => c(e.target.value),
28
+ rows: 3,
29
+ className: "resize-none text-sm"
30
+ })] }),
31
+ /* @__PURE__ */ i("div", { children: [/* @__PURE__ */ r("label", {
32
+ htmlFor: "widget-inspector-refresh",
33
+ className: u,
34
+ children: "Auto-Refresh (seconds)"
35
+ }), /* @__PURE__ */ r(t, {
36
+ id: "widget-inspector-refresh",
37
+ type: "number",
38
+ value: o ?? "",
39
+ onChange: (e) => l(e.target.value === "" ? void 0 : Number(e.target.value)),
40
+ min: 0,
41
+ placeholder: "No auto-refresh",
42
+ className: "h-9 text-sm"
43
+ })] })
44
+ ]
45
+ });
46
+ });
47
+ //#endregion
48
+ export { a as GeneralSection };
49
+
50
+ //# sourceMappingURL=GeneralSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneralSection.js","names":[],"sources":["../../../../../src/bigconsole/components/builder/inspector/GeneralSection.tsx"],"sourcesContent":["import { type FC, memo } from 'react';\nimport { Input, Textarea } from '@burdenoff/fe-libs/ui';\n\nexport interface GeneralSectionProps {\n title: string;\n description: string;\n refreshInterval?: number;\n onTitleChange: (title: string) => void;\n onDescriptionChange: (description: string) => void;\n onRefreshIntervalChange: (refreshInterval: number | undefined) => void;\n}\n\n/** Widget identity and refresh settings shared by every widget type. */\nexport const GeneralSection: FC<GeneralSectionProps> = memo(function GeneralSection({\n title,\n description,\n refreshInterval,\n onTitleChange,\n onDescriptionChange,\n onRefreshIntervalChange,\n}) {\n const labelClassName = 'mb-1 block text-sm font-semibold text-text-primary';\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div>\n <label htmlFor=\"widget-inspector-title\" className={labelClassName}>\n Title\n </label>\n <Input\n id=\"widget-inspector-title\"\n value={title}\n onChange={(event) => onTitleChange(event.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n\n <div>\n <label htmlFor=\"widget-inspector-description\" className={labelClassName}>\n Description\n </label>\n <Textarea\n id=\"widget-inspector-description\"\n value={description}\n onChange={(event) => onDescriptionChange(event.target.value)}\n rows={3}\n className=\"resize-none text-sm\"\n />\n </div>\n\n <div>\n <label htmlFor=\"widget-inspector-refresh\" className={labelClassName}>\n Auto-Refresh (seconds)\n </label>\n <Input\n id=\"widget-inspector-refresh\"\n type=\"number\"\n value={refreshInterval ?? ''}\n onChange={(event) =>\n onRefreshIntervalChange(event.target.value === '' ? undefined : Number(event.target.value))\n }\n min={0}\n placeholder=\"No auto-refresh\"\n className=\"h-9 text-sm\"\n />\n </div>\n </div>\n );\n});\n"],"mappings":";;;;AAaA,IAAa,IAA0C,EAAK,SAAwB,EAClF,UACA,gBACA,oBACA,kBACA,wBACA,8BACC;CACD,IAAM,IAAiB;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAAyB,WAAW;cAAgB;IAE3D,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,OAAO;IACP,WAAW,MAAU,EAAc,EAAM,OAAO,MAAM;IACtD,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAA+B,WAAW;cAAgB;IAEjE,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,OAAO;IACP,WAAW,MAAU,EAAoB,EAAM,OAAO,MAAM;IAC5D,MAAM;IACN,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;IAAO,SAAQ;IAA2B,WAAW;cAAgB;IAE7D,CAAA,EACR,kBAAC,GAAD;IACE,IAAG;IACH,MAAK;IACL,OAAO,KAAmB;IAC1B,WAAW,MACT,EAAwB,EAAM,OAAO,UAAU,KAAK,KAAA,IAAY,OAAO,EAAM,OAAO,MAAM,CAAC;IAE7F,KAAK;IACL,aAAY;IACZ,WAAU;IACV,CAAA,CACE,EAAA,CAAA;GACF;;EAER"}
@@ -0,0 +1,4 @@
1
+ import "./AdvancedSection.js";
2
+ import "./AppearanceSection.js";
3
+ import "./GeneralSection.js";
4
+ import "./DataBindingSection.js";