@keboola/design 6.3.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mermaid.cjs CHANGED
@@ -9,6 +9,7 @@ var reactTooltip = require('@radix-ui/react-tooltip');
9
9
  var classVarianceAuthority = require('class-variance-authority');
10
10
  var brandRegistry = require('@keboola/brand-registry');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
+ var reactDom = require('react-dom');
12
13
  var DOMPurify = require('dompurify');
13
14
  var reactSlot = require('@radix-ui/react-slot');
14
15
  var lucide_react_star = require('lucide-react');
@@ -251,6 +252,7 @@ var Tooltip = ({
251
252
  placement = "right",
252
253
  forceHide = false,
253
254
  forceShow = false,
255
+ delayDuration,
254
256
  // trigger props
255
257
  triggerAsChild = false
256
258
  }) => {
@@ -270,6 +272,7 @@ var Tooltip = ({
270
272
  {
271
273
  open: !!tooltip && (open || forceShow) && !forceHide,
272
274
  onOpenChange: setOpen,
275
+ delayDuration,
273
276
  disableHoverableContent: isActionVariant,
274
277
  children: [
275
278
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -342,7 +345,8 @@ var Skeleton = ({ height = "md", className, count = 1 }) => {
342
345
  var icons_exports = {};
343
346
  __export(icons_exports, {
344
347
  Google: () => Google,
345
- Keboola: () => Keboola
348
+ Keboola: () => Keboola,
349
+ Microsoft: () => Microsoft
346
350
  });
347
351
  __reExport(icons_exports, lucide_react_star__namespace);
348
352
  var Google = react.forwardRef(
@@ -401,6 +405,7 @@ var Keboola = react.forwardRef(
401
405
  width: size,
402
406
  height: size,
403
407
  viewBox: "0 0 300 512",
408
+ overflow: "visible",
404
409
  fill: color,
405
410
  className: cn("lucide", className),
406
411
  ...rest,
@@ -412,6 +417,29 @@ var Keboola = react.forwardRef(
412
417
  )
413
418
  );
414
419
  Keboola.displayName = "Keboola";
420
+ var Microsoft = react.forwardRef(
421
+ ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
422
+ "svg",
423
+ {
424
+ ref,
425
+ xmlns: "http://www.w3.org/2000/svg",
426
+ width: size,
427
+ height: size,
428
+ viewBox: "0 0 21 21",
429
+ fill: "none",
430
+ className: cn("lucide", className),
431
+ ...rest,
432
+ children: [
433
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
434
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
435
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
436
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
437
+ children
438
+ ]
439
+ }
440
+ )
441
+ );
442
+ Microsoft.displayName = "Microsoft";
415
443
  var variants = classVarianceAuthority.cva(
416
444
  [
417
445
  "tailwindcss-preflight",
@@ -836,10 +864,13 @@ var ClipboardButton = ({
836
864
  var MIN_SCALE = 0.5;
837
865
  var MAX_SCALE = 3;
838
866
  var ZOOM_STEP = 0.1;
839
- var ZoomableSvg = ({ html, copyText, className }) => {
867
+ var ZoomableSvg = ({ html, copyText, className, allowForeignObject }) => {
840
868
  const safeHtml = react.useMemo(
841
- () => DOMPurify__default.default.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
842
- [html]
869
+ () => DOMPurify__default.default.sanitize(html, {
870
+ USE_PROFILES: { svg: true, svgFilters: true },
871
+ ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
872
+ }),
873
+ [html, allowForeignObject]
843
874
  );
844
875
  const containerRef = react.useRef(null);
845
876
  const [scale, setScale] = react.useState(1);
@@ -868,7 +899,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
868
899
  };
869
900
  el.addEventListener("wheel", onWheel, { passive: false });
870
901
  return () => el.removeEventListener("wheel", onWheel);
871
- }, []);
902
+ }, [isFullscreen]);
872
903
  const didDragRef = react.useRef(false);
873
904
  const handleMouseDown = react.useCallback(
874
905
  (e) => {
@@ -975,14 +1006,18 @@ var ZoomableSvg = ({ html, copyText, className }) => {
975
1006
  }
976
1007
  );
977
1008
  if (isFullscreen) {
978
- return /* @__PURE__ */ jsxRuntime.jsx(
979
- "div",
980
- {
981
- role: "presentation",
982
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
983
- onClick: stopPropagation,
984
- children: diagramContent
985
- }
1009
+ return reactDom.createPortal(
1010
+ /* @__PURE__ */ jsxRuntime.jsx(
1011
+ "div",
1012
+ {
1013
+ role: "presentation",
1014
+ "data-testid": "zoomable-svg-fullscreen",
1015
+ className: "tailwindcss-preflight tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
1016
+ onClick: stopPropagation,
1017
+ children: diagramContent
1018
+ }
1019
+ ),
1020
+ document.body
986
1021
  );
987
1022
  }
988
1023
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -996,15 +1031,47 @@ var ZoomableSvg = ({ html, copyText, className }) => {
996
1031
  }
997
1032
  );
998
1033
  };
1034
+
1035
+ // src/blocks/MermaidDiagram/svgTransforms.ts
1036
+ var HTML_TAG = /<[^>]+>/g;
1037
+ var FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
1038
+ var ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
1039
+ var flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
1040
+ const text = inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim();
1041
+ return `${open}${text}${close}`;
1042
+ });
1043
+ var STYLE_ATTR = /\s+style="([^"]*)"/i;
1044
+ var makeResponsive = (svgString) => {
1045
+ const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1046
+ const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1047
+ return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
1048
+ const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? "";
1049
+ const styleDecls = existingStyle.replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
1050
+ let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
1051
+ nextAttrs += ' width="100%"';
1052
+ const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
1053
+ if (styleParts) nextAttrs += ` style="${styleParts}"`;
1054
+ return `${open}${nextAttrs}${close}`;
1055
+ });
1056
+ };
999
1057
  var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
1000
1058
  var resolvePrimary = () => {
1001
1059
  const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
1002
1060
  return `rgb(${channels})`;
1003
1061
  };
1004
1062
  var mermaidPromise = null;
1063
+ var registerLucideIconPack = (m) => {
1064
+ m.registerIconPacks([
1065
+ {
1066
+ name: "lucide",
1067
+ loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default)
1068
+ }
1069
+ ]);
1070
+ };
1005
1071
  var getMermaid = () => {
1006
1072
  if (!mermaidPromise) {
1007
1073
  mermaidPromise = import('mermaid').then((m) => {
1074
+ registerLucideIconPack(m.default);
1008
1075
  m.default.initialize({
1009
1076
  startOnLoad: false,
1010
1077
  securityLevel: "strict",
@@ -1068,7 +1135,9 @@ var getMermaid = () => {
1068
1135
  return mermaidPromise;
1069
1136
  };
1070
1137
  var stripFontImports = (svg) => svg.replace(/@import\s+url\([^)]*fonts\.googleapis\.com[^)]*\);?\s*/g, "");
1138
+ var hasIconSyntax = (code) => /@\{[^}]*\bicon\s*:/.test(code) || /\b(?:icon|service|group)\b[^\n(]*\(\s*[\w-]+:/.test(code) || /\bfa[bslr]?:fa-/.test(code);
1071
1139
  var tryFastRender = (code) => {
1140
+ if (hasIconSyntax(code)) return null;
1072
1141
  try {
1073
1142
  return stripFontImports(
1074
1143
  beautifulMermaid.renderMermaidSVG(code, {
@@ -1078,27 +1147,11 @@ var tryFastRender = (code) => {
1078
1147
  font: "Inter, system-ui, sans-serif"
1079
1148
  })
1080
1149
  );
1081
- } catch {
1150
+ } catch (err) {
1151
+ console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1082
1152
  return null;
1083
1153
  }
1084
1154
  };
1085
- var makeResponsive = (svgString) => {
1086
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1087
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1088
- let result = svgString.replace(/(<svg[^>]*?)\s+width="[^"]*"/i, '$1 width="100%"').replace(/(<svg[^>]*?)\s+height="[^"]*"/i, "$1");
1089
- if (!vbWidth) return result;
1090
- const hasStyle = /(<svg[^>]*?)\s+style="([^"]*)"/i.test(result);
1091
- if (hasStyle) {
1092
- result = result.replace(/(<svg[^>]*?)\s+style="([^"]*)"/i, (_m, pre, styles) => {
1093
- const cleaned = styles.replace(/max-width:\s*[^;"]*;?\s*/g, "").trim();
1094
- const combined = [cleaned, `max-width: ${vbWidth}px`].filter(Boolean).join("; ");
1095
- return `${pre} style="${combined}"`;
1096
- });
1097
- } else {
1098
- result = result.replace(/<svg/, `<svg style="max-width: ${vbWidth}px"`);
1099
- }
1100
- return result;
1101
- };
1102
1155
  var RENDER_DEBOUNCE_MS = 300;
1103
1156
  var svgCache = /* @__PURE__ */ new Map();
1104
1157
  var resolveSyncSvg = (code) => {
@@ -1139,8 +1192,9 @@ var MermaidDiagram = ({ code }) => {
1139
1192
  try {
1140
1193
  const result = await mermaidModule.default.render(rendererId, code, container);
1141
1194
  if (renderIdRef.current === currentRenderId && result) {
1142
- svgCache.set(code, result.svg);
1143
- setSvg(result.svg);
1195
+ const svgOutput = flattenForeignObjectLabels(result.svg);
1196
+ svgCache.set(code, svgOutput);
1197
+ setSvg(svgOutput);
1144
1198
  setRenderFailed(false);
1145
1199
  }
1146
1200
  } finally {
@@ -1187,7 +1241,8 @@ var MermaidDiagram = ({ code }) => {
1187
1241
  copyText: `\`\`\`mermaid
1188
1242
  ${code}
1189
1243
  \`\`\``,
1190
- className: "tw-my-3"
1244
+ className: "tw-my-3",
1245
+ allowForeignObject: true
1191
1246
  },
1192
1247
  code
1193
1248
  );