@thebuoyant-tsdev/mui-ts-library 3.4.0 → 3.6.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/README.de.md CHANGED
@@ -313,6 +313,29 @@ import type {
313
313
 
314
314
  ## Changelog
315
315
 
316
+ ### [3.6.1] — 2026-06-22
317
+
318
+ **⚠️ TypeScript-Kompatibilitäts-Fix**
319
+ - `v3.4.0`/`v3.5.0` machten neue Translation-Felder auf `TagSelectionTranslation` und `SqlEditorTranslation` erforderlich, was TypeScript-Builds für Code brach, der eine eigenständige Variable gegen den vollen benannten Typ deklariert. Diese Felder sind jetzt optional — alte Objekt-Literale kompilieren wieder, keine Code-Änderung nötig.
320
+
321
+ ---
322
+
323
+ ### [3.6.0] — 2026-06-22
324
+
325
+ **Storybook & StackBlitz — Praxisnahe Vitrine**
326
+ - 17 neue Storybook-Stories über alle 11 Komponenten, jede mit einem komplett anderen, realistischen Datensatz (Festplatten-Analyse, Handelsströme, Bauprojekt-Zeitpläne, Support-Ticket-Routing u.v.m.) statt Prop-Toggle-Varianten auf einer generischen Fixture.
327
+ - StackBlitz-Demo-Karten zeigen jetzt eine Use-Case-Kategorie zur schnellen Einordnung, mit geschärftem Hero-Text.
328
+
329
+ ---
330
+
331
+ ### [3.5.0] — 2026-06-22
332
+
333
+ **SqlEditor — Query-Verlauf**
334
+ - Neue Option `toolbarConfig.showHistory` speichert jede ausgeführte Abfrage in `localStorage` und lädt sie per Klick wieder. Neue Props: `queryHistoryKey`, `queryHistoryMaxEntries`.
335
+ - D3-Chart-Storybook-Stories demonstrieren jetzt automatisch Drill-down, Zoom und Hover-Highlight beim Laden.
336
+
337
+ ---
338
+
316
339
  ### [3.4.0] — 2026-06-21
317
340
 
318
341
  **Accessibility & Test-Coverage**
package/README.md CHANGED
@@ -313,6 +313,29 @@ import type {
313
313
 
314
314
  ## Changelog
315
315
 
316
+ ### [3.6.1] — 2026-06-22
317
+
318
+ **⚠️ TypeScript Compatibility Fix**
319
+ - `v3.4.0`/`v3.5.0` made new translation fields required on `TagSelectionTranslation` and `SqlEditorTranslation`, breaking TypeScript builds for code that declares a standalone variable against the full named type. Those fields are now optional — old object literals compile again, no code change needed.
320
+
321
+ ---
322
+
323
+ ### [3.6.0] — 2026-06-22
324
+
325
+ **Storybook & StackBlitz — Real-World Showcase**
326
+ - 17 new Storybook stories across all 11 components, each with a genuinely different, realistic dataset (disk-usage analysis, trade flows, construction schedules, support-ticket routing, and more) instead of prop-toggle variations on one generic fixture.
327
+ - StackBlitz demo cards now show a use-case category for quick orientation, with sharpened hero copy.
328
+
329
+ ---
330
+
331
+ ### [3.5.0] — 2026-06-22
332
+
333
+ **SqlEditor — Query History**
334
+ - New `toolbarConfig.showHistory` option saves every executed query to `localStorage` and lets you reload it with one click. New props: `queryHistoryKey`, `queryHistoryMaxEntries`.
335
+ - D3 chart Storybook stories now auto-demonstrate drill-down, zoom, and hover-highlight on load.
336
+
337
+ ---
338
+
316
339
  ### [3.4.0] — 2026-06-21
317
340
 
318
341
  **Accessibility & Test Coverage**
@@ -1,2 +1,2 @@
1
1
  import { type SqlEditorProps } from "./SqlEditor.types";
2
- export declare function SqlEditor({ value, onChange, placeholder, height, width, disabled, readonly, error, helperText, name, dialect, showLineNumbers, showLineColumn, showErrorCount, toolbarConfig, translation, highlightColors, schema, onExecute, onLint, onBlur, onFocus, }: SqlEditorProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function SqlEditor({ value, onChange, placeholder, height, width, disabled, readonly, error, helperText, name, dialect, showLineNumbers, showLineColumn, showErrorCount, toolbarConfig, translation, highlightColors, schema, queryHistoryKey, queryHistoryMaxEntries, onExecute, onLint, onBlur, onFocus, }: SqlEditorProps): import("react/jsx-runtime").JSX.Element;
@@ -3,64 +3,77 @@ import { DEFAULT_SQL_EDITOR_TOOLBAR_CONFIG as t, DEFAULT_SQL_EDITOR_TRANSLATION
3
3
  import { SqlEditorContent as r } from "./SqlEditorContent.js";
4
4
  import { SqlEditorToolbar as i } from "./SqlEditorToolbar.js";
5
5
  import { SqlEditorFooter as a } from "./SqlEditorFooter.js";
6
- import { useCallback as o, useRef as s, useState as c } from "react";
7
- import { Box as l, Divider as u, Paper as d } from "@mui/material";
8
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
6
+ import { useSqlQueryHistory as o } from "./useSqlQueryHistory.js";
7
+ import { useCallback as s, useRef as c, useState as l } from "react";
8
+ import { Box as u, Divider as d, Paper as f } from "@mui/material";
9
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
9
10
  //#region src/components/sql-editor/SqlEditor.tsx
10
- function h({ value: h, onChange: g, placeholder: _, height: v, width: y, disabled: b = !1, readonly: x = !1, error: S = !1, helperText: C, name: w, dialect: T = "standard", showLineNumbers: E = !0, showLineColumn: D = !0, showErrorCount: O = !1, toolbarConfig: k, translation: A, highlightColors: j, schema: M, onExecute: N, onLint: P, onBlur: F, onFocus: I }) {
11
- let L = {
11
+ function g({ value: g, onChange: _, placeholder: ee, height: v, width: y, disabled: b = !1, readonly: x = !1, error: S = !1, helperText: C, name: w, dialect: T = "standard", showLineNumbers: E = !0, showLineColumn: D = !0, showErrorCount: O = !1, toolbarConfig: k, translation: A, highlightColors: j, schema: M, queryHistoryKey: N = "sql-editor-query-history", queryHistoryMaxEntries: P = 20, onExecute: F, onLint: I, onBlur: L, onFocus: R }) {
12
+ let z = {
12
13
  ...n,
13
14
  ...A
14
- }, R = {
15
+ }, B = {
15
16
  ...t,
16
17
  ...k
17
- }, z = e(v), B = e(y), V = z === "auto", H = V ? void 0 : z ?? 300, U = s(null), [W, G] = c(null), [K, q] = c({
18
+ }, { history: te, addEntry: V, clearHistory: H } = o(N, P), U = e(v), W = e(y), G = U === "auto", K = G ? void 0 : U ?? 300, q = c(null), [J, Y] = l(null), [X, Z] = l({
18
19
  line: 1,
19
20
  col: 1
20
- }), [J, Y] = c(0), X = o((e) => {
21
- U.current = e, G(e);
22
- }, []), Z = o((e, t) => {
23
- q({
21
+ }), [Q, ne] = l(0), re = s((e) => {
22
+ q.current = e, Y(e);
23
+ }, []), ie = s((e, t) => {
24
+ Z({
24
25
  line: e,
25
26
  col: t
26
27
  });
27
- }, []), Q = o((e) => {
28
- Y(e);
29
- }, []), $ = D || O || !!C;
30
- return /* @__PURE__ */ m(l, {
28
+ }, []), ae = s((e) => {
29
+ ne(e);
30
+ }, []), $ = F ? (e) => {
31
+ V(e), F(e);
32
+ } : void 0, oe = s((e) => {
33
+ let t = q.current;
34
+ t && (t.dispatch({ changes: {
35
+ from: 0,
36
+ to: t.state.doc.length,
37
+ insert: e
38
+ } }), t.focus()), _?.(e);
39
+ }, [_]), se = D || O || !!C;
40
+ return /* @__PURE__ */ h(u, {
31
41
  sx: {
32
- width: B ?? "100%",
33
- ...V ? {
42
+ width: W ?? "100%",
43
+ ...G ? {
34
44
  display: "flex",
35
45
  flexDirection: "column",
36
46
  flex: 1
37
47
  } : {}
38
48
  },
39
49
  children: [
40
- /* @__PURE__ */ m(d, {
50
+ /* @__PURE__ */ h(f, {
41
51
  variant: "outlined",
42
52
  sx: {
43
53
  display: "flex",
44
54
  flexDirection: "column",
45
55
  overflow: "hidden",
46
- ...V ? { flex: 1 } : { height: H },
56
+ ...G ? { flex: 1 } : { height: K },
47
57
  borderColor: S ? "error.main" : void 0,
48
58
  "&:focus-within": {
49
59
  borderColor: S ? "error.main" : "primary.main",
50
60
  borderWidth: 2
51
61
  }
52
62
  },
53
- children: [!x && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(i, {
54
- editorView: W,
55
- toolbarConfig: R,
56
- translation: L,
63
+ children: [!x && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(i, {
64
+ editorView: J,
65
+ toolbarConfig: B,
66
+ translation: z,
57
67
  dialect: T,
58
68
  disabled: b,
59
- onExecute: N
60
- }), /* @__PURE__ */ p(u, {})] }), /* @__PURE__ */ p(r, {
61
- value: h,
62
- onChange: g,
63
- placeholder: _,
69
+ onExecute: $,
70
+ queryHistory: te,
71
+ onSelectHistoryEntry: oe,
72
+ onClearHistory: H
73
+ }), /* @__PURE__ */ m(d, {})] }), /* @__PURE__ */ m(r, {
74
+ value: g,
75
+ onChange: _,
76
+ placeholder: ee,
64
77
  disabled: b,
65
78
  readonly: x,
66
79
  showLineNumbers: E,
@@ -69,32 +82,32 @@ function h({ value: h, onChange: g, placeholder: _, height: v, width: y, disable
69
82
  stringColor: j?.string,
70
83
  identifierColor: j?.identifier,
71
84
  schema: M,
72
- onExecute: N,
73
- onLint: P,
74
- onDiagnosticsChange: P ? Q : void 0,
75
- onViewReady: X,
76
- onCursorChange: Z,
77
- onBlur: F,
78
- onFocus: I
85
+ onExecute: $,
86
+ onLint: I,
87
+ onDiagnosticsChange: I ? ae : void 0,
88
+ onViewReady: re,
89
+ onCursorChange: ie,
90
+ onBlur: L,
91
+ onFocus: R
79
92
  })]
80
93
  }),
81
- $ && /* @__PURE__ */ p(a, {
94
+ se && /* @__PURE__ */ m(a, {
82
95
  helperText: C,
83
96
  error: S,
84
97
  showLineColumn: D,
85
98
  showErrorCount: O,
86
- diagnosticsCount: J,
87
- cursorLine: K.line,
88
- cursorCol: K.col,
89
- translation: L
99
+ diagnosticsCount: Q,
100
+ cursorLine: X.line,
101
+ cursorCol: X.col,
102
+ translation: z
90
103
  }),
91
- w && /* @__PURE__ */ p("input", {
104
+ w && /* @__PURE__ */ m("input", {
92
105
  type: "hidden",
93
106
  name: w,
94
- value: h ?? ""
107
+ value: g ?? ""
95
108
  })
96
109
  ]
97
110
  });
98
111
  }
99
112
  //#endregion
100
- export { h as SqlEditor };
113
+ export { g as SqlEditor };
@@ -10,6 +10,8 @@ export type SqlEditorToolbarConfig = {
10
10
  showClear?: boolean;
11
11
  showExecute?: boolean;
12
12
  showUndoRedo?: boolean;
13
+ /** Shows a "Query history" button — requires `onExecute` to be set (default: false). */
14
+ showHistory?: boolean;
13
15
  };
14
16
  export declare const DEFAULT_SQL_EDITOR_TOOLBAR_CONFIG: Required<SqlEditorToolbarConfig>;
15
17
  export type SqlEditorTranslation = {
@@ -22,8 +24,14 @@ export type SqlEditorTranslation = {
22
24
  redo: string;
23
25
  lineColumn: string;
24
26
  errorCount: string;
27
+ /** @since 3.5.0 — optional for backward compatibility with full-literal objects typed before this field existed. */
28
+ history?: string;
29
+ /** @since 3.5.0 — optional for backward compatibility with full-literal objects typed before this field existed. */
30
+ historyEmpty?: string;
31
+ /** @since 3.5.0 — optional for backward compatibility with full-literal objects typed before this field existed. */
32
+ clearHistory?: string;
25
33
  };
26
- export declare const DEFAULT_SQL_EDITOR_TRANSLATION: SqlEditorTranslation;
34
+ export declare const DEFAULT_SQL_EDITOR_TRANSLATION: Required<SqlEditorTranslation>;
27
35
  export type SqlEditorDialect = "standard" | "mysql" | "postgresql" | "sqlite" | "mssql";
28
36
  export type SqlColumn = {
29
37
  name: string;
@@ -55,6 +63,10 @@ export type SqlEditorProps = {
55
63
  /** Name for native form submission via hidden input. */
56
64
  name?: string;
57
65
  placeholder?: string;
66
+ /** localStorage key for the query history — set a unique value if multiple SqlEditors run on the same page (default: "sql-editor-query-history"). */
67
+ queryHistoryKey?: string;
68
+ /** Maximum number of entries kept in the query history (default: 20). */
69
+ queryHistoryMaxEntries?: number;
58
70
  readonly?: boolean;
59
71
  schema?: SqlSchema;
60
72
  showErrorCount?: boolean;
@@ -4,7 +4,8 @@ var e = {
4
4
  showCopy: !0,
5
5
  showClear: !0,
6
6
  showExecute: !1,
7
- showUndoRedo: !0
7
+ showUndoRedo: !0,
8
+ showHistory: !1
8
9
  }, t = {
9
10
  format: "Format SQL",
10
11
  copy: "Copy",
@@ -14,7 +15,10 @@ var e = {
14
15
  undo: "Undo",
15
16
  redo: "Redo",
16
17
  lineColumn: "Ln {line}, Col {col}",
17
- errorCount: "{count} error(s)"
18
+ errorCount: "{count} error(s)",
19
+ history: "Query history",
20
+ historyEmpty: "No queries yet",
21
+ clearHistory: "Clear history"
18
22
  };
19
23
  //#endregion
20
24
  export { e as DEFAULT_SQL_EDITOR_TOOLBAR_CONFIG, t as DEFAULT_SQL_EDITOR_TRANSLATION };
@@ -7,7 +7,7 @@ type SqlEditorFooterProps = {
7
7
  diagnosticsCount: number;
8
8
  cursorLine: number;
9
9
  cursorCol: number;
10
- translation: SqlEditorTranslation;
10
+ translation: Required<SqlEditorTranslation>;
11
11
  };
12
12
  export declare function SqlEditorFooter({ helperText, error, showLineColumn, showErrorCount, diagnosticsCount, cursorLine, cursorCol, translation: t, }: SqlEditorFooterProps): import("react/jsx-runtime").JSX.Element;
13
13
  export {};
@@ -0,0 +1,11 @@
1
+ import type { SqlEditorTranslation } from "./SqlEditor.types";
2
+ import type { SqlQueryHistoryEntry } from "./util/sqlQueryHistory.util";
3
+ type SqlEditorHistoryMenuProps = {
4
+ history: SqlQueryHistoryEntry[];
5
+ onSelect: (sql: string) => void;
6
+ onClear: () => void;
7
+ translation: Required<SqlEditorTranslation>;
8
+ disabled?: boolean;
9
+ };
10
+ export declare function SqlEditorHistoryMenu({ history, onSelect, onClear, translation: t, disabled, }: SqlEditorHistoryMenuProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,75 @@
1
+ import { useState as e } from "react";
2
+ import { Divider as t, IconButton as n, ListItemIcon as r, ListItemText as i, Menu as a, MenuItem as o, Tooltip as s, Typography as c } from "@mui/material";
3
+ import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
4
+ import f from "@mui/icons-material/History";
5
+ import p from "@mui/icons-material/DeleteSweep";
6
+ //#region src/components/sql-editor/SqlEditorHistoryMenu.tsx
7
+ function m(e, t = 60) {
8
+ let n = e.replace(/\s+/g, " ").trim();
9
+ return n.length > t ? `${n.slice(0, t)}…` : n;
10
+ }
11
+ function h({ history: h, onSelect: g, onClear: _, translation: v, disabled: y }) {
12
+ let [b, x] = e(null);
13
+ function S() {
14
+ x(null);
15
+ }
16
+ function C(e) {
17
+ g(e), S();
18
+ }
19
+ function w() {
20
+ _(), S();
21
+ }
22
+ return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u(s, {
23
+ title: v.history,
24
+ arrow: !0,
25
+ children: /* @__PURE__ */ u("span", { children: /* @__PURE__ */ u(n, {
26
+ size: "small",
27
+ onClick: (e) => x(e.currentTarget),
28
+ disabled: y,
29
+ "aria-label": v.history,
30
+ children: /* @__PURE__ */ u(f, { fontSize: "small" })
31
+ }) })
32
+ }), /* @__PURE__ */ d(a, {
33
+ anchorEl: b,
34
+ open: !!b,
35
+ onClose: S,
36
+ slotProps: { paper: { sx: {
37
+ minWidth: 280,
38
+ maxWidth: 400
39
+ } } },
40
+ children: [
41
+ h.length === 0 && /* @__PURE__ */ u(o, {
42
+ disabled: !0,
43
+ children: /* @__PURE__ */ u(i, { children: v.historyEmpty })
44
+ }),
45
+ h.map((e) => /* @__PURE__ */ u(o, {
46
+ onClick: () => C(e.sql),
47
+ children: /* @__PURE__ */ u(i, {
48
+ primary: m(e.sql),
49
+ secondary: /* @__PURE__ */ u(c, {
50
+ variant: "caption",
51
+ color: "text.secondary",
52
+ children: new Date(e.timestamp).toLocaleString()
53
+ }),
54
+ slotProps: { primary: { sx: {
55
+ fontFamily: "monospace",
56
+ fontSize: "0.8125rem"
57
+ } } }
58
+ })
59
+ }, e.timestamp)),
60
+ h.length > 0 && /* @__PURE__ */ u(t, {}),
61
+ h.length > 0 && /* @__PURE__ */ d(o, {
62
+ onClick: w,
63
+ children: [/* @__PURE__ */ u(r, { children: /* @__PURE__ */ u(p, {
64
+ fontSize: "small",
65
+ color: "error"
66
+ }) }), /* @__PURE__ */ u(i, {
67
+ sx: { color: "error.main" },
68
+ children: v.clearHistory
69
+ })]
70
+ })
71
+ ]
72
+ })] });
73
+ }
74
+ //#endregion
75
+ export { h as SqlEditorHistoryMenu };
@@ -1,12 +1,16 @@
1
1
  import type { EditorView } from "@codemirror/view";
2
2
  import type { SqlEditorDialect, SqlEditorToolbarConfig, SqlEditorTranslation } from "./SqlEditor.types";
3
+ import type { SqlQueryHistoryEntry } from "./util/sqlQueryHistory.util";
3
4
  type SqlEditorToolbarProps = {
4
5
  editorView: EditorView | null;
5
6
  toolbarConfig: Required<SqlEditorToolbarConfig>;
6
- translation: SqlEditorTranslation;
7
+ translation: Required<SqlEditorTranslation>;
7
8
  dialect: SqlEditorDialect;
8
9
  disabled?: boolean;
9
10
  onExecute?: (sql: string) => void;
11
+ queryHistory?: SqlQueryHistoryEntry[];
12
+ onSelectHistoryEntry?: (sql: string) => void;
13
+ onClearHistory?: () => void;
10
14
  };
11
- export declare function SqlEditorToolbar({ editorView, toolbarConfig: tc, translation: t, dialect, disabled, onExecute, }: SqlEditorToolbarProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function SqlEditorToolbar({ editorView, toolbarConfig: tc, translation: t, dialect, disabled, onExecute, queryHistory, onSelectHistoryEntry, onClearHistory, }: SqlEditorToolbarProps): import("react/jsx-runtime").JSX.Element;
12
16
  export {};
@@ -1,54 +1,55 @@
1
1
  import { ToolbarButton as e } from "../shared/ToolbarButton.js";
2
- import { useState as t } from "react";
3
- import { Box as n, Divider as r } from "@mui/material";
4
- import { redo as i, undo as a } from "@codemirror/commands";
5
- import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
6
- import l from "@mui/icons-material/ContentCopy";
7
- import u from "@mui/icons-material/Check";
8
- import d from "@mui/icons-material/Delete";
9
- import f from "@mui/icons-material/Undo";
10
- import p from "@mui/icons-material/Redo";
11
- import m from "@mui/icons-material/AutoFixHigh";
12
- import h from "@mui/icons-material/PlayArrow";
13
- import { format as g } from "sql-formatter";
2
+ import { SqlEditorHistoryMenu as t } from "./SqlEditorHistoryMenu.js";
3
+ import { useState as n } from "react";
4
+ import { Box as r, Divider as i } from "@mui/material";
5
+ import { redo as a, undo as o } from "@codemirror/commands";
6
+ import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
7
+ import u from "@mui/icons-material/ContentCopy";
8
+ import d from "@mui/icons-material/Check";
9
+ import f from "@mui/icons-material/Delete";
10
+ import p from "@mui/icons-material/Undo";
11
+ import m from "@mui/icons-material/Redo";
12
+ import h from "@mui/icons-material/AutoFixHigh";
13
+ import g from "@mui/icons-material/PlayArrow";
14
+ import { format as _ } from "sql-formatter";
14
15
  //#region src/components/sql-editor/SqlEditorToolbar.tsx
15
- var _ = {
16
+ var v = {
16
17
  standard: "sql",
17
18
  mysql: "mysql",
18
19
  postgresql: "postgresql",
19
20
  sqlite: "sqlite",
20
21
  mssql: "tsql"
21
22
  };
22
- function v({ editorView: v, toolbarConfig: y, translation: b, dialect: x, disabled: S, onExecute: C }) {
23
- let [w, T] = t(!1), E = S || !v;
24
- function D() {
25
- let e = v?.state.doc.toString() ?? "";
23
+ function y({ editorView: y, toolbarConfig: b, translation: x, dialect: S, disabled: C, onExecute: w, queryHistory: T = [], onSelectHistoryEntry: E, onClearHistory: D }) {
24
+ let [O, k] = n(!1), A = C || !y;
25
+ function j() {
26
+ let e = y?.state.doc.toString() ?? "";
26
27
  navigator.clipboard.writeText(e).then(() => {
27
- T(!0), setTimeout(() => T(!1), 2e3);
28
+ k(!0), setTimeout(() => k(!1), 2e3);
28
29
  });
29
30
  }
30
- function O() {
31
- let e = v;
31
+ function M() {
32
+ let e = y;
32
33
  e && (e.dispatch({ changes: {
33
34
  from: 0,
34
35
  to: e.state.doc.length,
35
36
  insert: ""
36
37
  } }), e.focus());
37
38
  }
38
- function k() {
39
- let e = v;
40
- e && (a(e), e.focus());
39
+ function N() {
40
+ let e = y;
41
+ e && (o(e), e.focus());
41
42
  }
42
- function A() {
43
- let e = v;
44
- e && (i(e), e.focus());
43
+ function P() {
44
+ let e = y;
45
+ e && (a(e), e.focus());
45
46
  }
46
- function j() {
47
- let e = v;
47
+ function F() {
48
+ let e = y;
48
49
  if (!e) return;
49
50
  let t = e.state.doc.toString();
50
51
  try {
51
- let n = g(t, { language: _[x] });
52
+ let n = _(t, { language: v[S] });
52
53
  e.dispatch({ changes: {
53
54
  from: 0,
54
55
  to: e.state.doc.length,
@@ -57,12 +58,12 @@ function v({ editorView: v, toolbarConfig: y, translation: b, dialect: x, disabl
57
58
  } catch {}
58
59
  e.focus();
59
60
  }
60
- function M() {
61
- let e = v;
62
- !e || !C || C(e.state.doc.toString());
61
+ function I() {
62
+ let e = y;
63
+ !e || !w || w(e.state.doc.toString());
63
64
  }
64
- let N = y.showFormat, P = y.showCopy || y.showClear, F = y.showUndoRedo, I = y.showExecute && !!C;
65
- return /* @__PURE__ */ c(n, {
65
+ let L = b.showFormat, R = b.showCopy || b.showClear, z = b.showUndoRedo, B = b.showExecute && !!w, V = b.showHistory && !!w && !!E && !!D;
66
+ return /* @__PURE__ */ l(r, {
66
67
  sx: {
67
68
  display: "flex",
68
69
  flexWrap: "wrap",
@@ -74,78 +75,89 @@ function v({ editorView: v, toolbarConfig: y, translation: b, dialect: x, disabl
74
75
  role: "toolbar",
75
76
  "aria-label": "SQL editor actions",
76
77
  children: [
77
- N && /* @__PURE__ */ s(n, {
78
+ L && /* @__PURE__ */ c(r, {
78
79
  sx: {
79
80
  display: "flex",
80
81
  gap: .25
81
82
  },
82
- children: /* @__PURE__ */ s(e, {
83
- label: b.format,
84
- icon: /* @__PURE__ */ s(m, { fontSize: "small" }),
85
- onClick: j,
86
- disabled: E
83
+ children: /* @__PURE__ */ c(e, {
84
+ label: x.format,
85
+ icon: /* @__PURE__ */ c(h, { fontSize: "small" }),
86
+ onClick: F,
87
+ disabled: A
87
88
  })
88
89
  }),
89
- N && (P || F) && /* @__PURE__ */ s(r, {
90
+ L && (R || z) && /* @__PURE__ */ c(i, {
90
91
  orientation: "vertical",
91
92
  flexItem: !0,
92
93
  sx: { mx: .5 }
93
94
  }),
94
- P && /* @__PURE__ */ c(n, {
95
+ R && /* @__PURE__ */ l(r, {
95
96
  sx: {
96
97
  display: "flex",
97
98
  gap: .25
98
99
  },
99
- children: [y.showCopy && /* @__PURE__ */ s(e, {
100
- label: w ? b.copySuccess : b.copy,
101
- icon: w ? /* @__PURE__ */ s(u, {
100
+ children: [b.showCopy && /* @__PURE__ */ c(e, {
101
+ label: O ? x.copySuccess : x.copy,
102
+ icon: O ? /* @__PURE__ */ c(d, {
102
103
  fontSize: "small",
103
104
  color: "success"
104
- }) : /* @__PURE__ */ s(l, { fontSize: "small" }),
105
- onClick: D,
106
- disabled: E
107
- }), y.showClear && /* @__PURE__ */ s(e, {
108
- label: b.clear,
109
- icon: /* @__PURE__ */ s(d, { fontSize: "small" }),
110
- onClick: O,
111
- disabled: E
105
+ }) : /* @__PURE__ */ c(u, { fontSize: "small" }),
106
+ onClick: j,
107
+ disabled: A
108
+ }), b.showClear && /* @__PURE__ */ c(e, {
109
+ label: x.clear,
110
+ icon: /* @__PURE__ */ c(f, { fontSize: "small" }),
111
+ onClick: M,
112
+ disabled: A
112
113
  })]
113
114
  }),
114
- P && F && /* @__PURE__ */ s(r, {
115
+ R && z && /* @__PURE__ */ c(i, {
115
116
  orientation: "vertical",
116
117
  flexItem: !0,
117
118
  sx: { mx: .5 }
118
119
  }),
119
- F && /* @__PURE__ */ c(n, {
120
+ z && /* @__PURE__ */ l(r, {
120
121
  sx: {
121
122
  display: "flex",
122
123
  gap: .25
123
124
  },
124
- children: [/* @__PURE__ */ s(e, {
125
- label: b.undo,
126
- icon: /* @__PURE__ */ s(f, { fontSize: "small" }),
127
- onClick: k,
128
- disabled: E
129
- }), /* @__PURE__ */ s(e, {
130
- label: b.redo,
131
- icon: /* @__PURE__ */ s(p, { fontSize: "small" }),
132
- onClick: A,
133
- disabled: E
125
+ children: [/* @__PURE__ */ c(e, {
126
+ label: x.undo,
127
+ icon: /* @__PURE__ */ c(p, { fontSize: "small" }),
128
+ onClick: N,
129
+ disabled: A
130
+ }), /* @__PURE__ */ c(e, {
131
+ label: x.redo,
132
+ icon: /* @__PURE__ */ c(m, { fontSize: "small" }),
133
+ onClick: P,
134
+ disabled: A
134
135
  })]
135
136
  }),
136
- I && /* @__PURE__ */ c(o, { children: [(P || F) && /* @__PURE__ */ s(r, {
137
+ V && /* @__PURE__ */ l(s, { children: [(R || z) && /* @__PURE__ */ c(i, {
138
+ orientation: "vertical",
139
+ flexItem: !0,
140
+ sx: { mx: .5 }
141
+ }), /* @__PURE__ */ c(t, {
142
+ history: T,
143
+ onSelect: E,
144
+ onClear: D,
145
+ translation: x,
146
+ disabled: C
147
+ })] }),
148
+ B && /* @__PURE__ */ l(s, { children: [(R || z || V) && /* @__PURE__ */ c(i, {
137
149
  orientation: "vertical",
138
150
  flexItem: !0,
139
151
  sx: { mx: .5 }
140
- }), /* @__PURE__ */ s(e, {
141
- label: b.execute,
142
- icon: /* @__PURE__ */ s(h, { fontSize: "small" }),
143
- onClick: M,
144
- disabled: E
152
+ }), /* @__PURE__ */ c(e, {
153
+ label: x.execute,
154
+ icon: /* @__PURE__ */ c(g, { fontSize: "small" }),
155
+ onClick: I,
156
+ disabled: A
145
157
  })] }),
146
- !N && !P && !F && !I && /* @__PURE__ */ s(n, { sx: { height: 32 } })
158
+ !L && !R && !z && !V && !B && /* @__PURE__ */ c(r, { sx: { height: 32 } })
147
159
  ]
148
160
  });
149
161
  }
150
162
  //#endregion
151
- export { v as SqlEditorToolbar };
163
+ export { y as SqlEditorToolbar };
@@ -0,0 +1,6 @@
1
+ import { type SqlQueryHistoryEntry } from "./util/sqlQueryHistory.util";
2
+ export declare function useSqlQueryHistory(storageKey: string, maxEntries: number): {
3
+ history: SqlQueryHistoryEntry[];
4
+ addEntry: (sql: string) => void;
5
+ clearHistory: () => void;
6
+ };
@@ -0,0 +1,20 @@
1
+ import { addQueryToHistory as e, loadQueryHistory as t, saveQueryHistory as n } from "./util/sqlQueryHistory.util.js";
2
+ import { useCallback as r, useState as i } from "react";
3
+ //#region src/components/sql-editor/useSqlQueryHistory.ts
4
+ function a(a, o) {
5
+ let [s, c] = i(() => t(a));
6
+ return {
7
+ history: s,
8
+ addEntry: r((t) => {
9
+ c((r) => {
10
+ let i = e(r, t, o);
11
+ return n(a, i), i;
12
+ });
13
+ }, [a, o]),
14
+ clearHistory: r(() => {
15
+ c([]), n(a, []);
16
+ }, [a])
17
+ };
18
+ }
19
+ //#endregion
20
+ export { a as useSqlQueryHistory };