@keboola/design 2.1.0 → 3.1.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
@@ -7,15 +7,53 @@ var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var reactTooltip = require('@radix-ui/react-tooltip');
9
9
  var classVarianceAuthority = require('class-variance-authority');
10
+ var brandRegistry = require('@keboola/brand-registry');
10
11
  var jsxRuntime = require('react/jsx-runtime');
12
+ var DOMPurify = require('dompurify');
11
13
  var reactSlot = require('@radix-ui/react-slot');
12
- var lucideReact = require('lucide-react');
14
+ var lucide_react_star = require('lucide-react');
13
15
 
14
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
17
 
18
+ function _interopNamespace(e) {
19
+ if (e && e.__esModule) return e;
20
+ var n = Object.create(null);
21
+ if (e) {
22
+ Object.keys(e).forEach(function (k) {
23
+ if (k !== 'default') {
24
+ var d = Object.getOwnPropertyDescriptor(e, k);
25
+ Object.defineProperty(n, k, d.get ? d : {
26
+ enumerable: true,
27
+ get: function () { return e[k]; }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n.default = e;
33
+ return Object.freeze(n);
34
+ }
35
+
16
36
  var colors__default = /*#__PURE__*/_interopDefault(colors);
37
+ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
38
+ var lucide_react_star__namespace = /*#__PURE__*/_interopNamespace(lucide_react_star);
17
39
 
18
- // src/blocks/MermaidDiagram/MermaidDiagram.tsx
40
+ var __defProp = Object.defineProperty;
41
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
42
+ var __getOwnPropNames = Object.getOwnPropertyNames;
43
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
44
+ var __export = (target, all) => {
45
+ for (var name in all)
46
+ __defProp(target, name, { get: all[name], enumerable: true });
47
+ };
48
+ var __copyProps = (to, from, except, desc) => {
49
+ if (from && typeof from === "object" || typeof from === "function") {
50
+ for (let key of __getOwnPropNames(from))
51
+ if (!__hasOwnProp.call(to, key) && key !== except)
52
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
53
+ }
54
+ return to;
55
+ };
56
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
19
57
  var twMerge = tailwindMerge.extendTailwindMerge({
20
58
  prefix: "tw-"
21
59
  });
@@ -31,17 +69,49 @@ var keyCodes = {
31
69
  ENTER: "Enter",
32
70
  SPACE: " "
33
71
  };
72
+ var ThemeContext = react.createContext(null);
73
+
74
+ // src/components/internal/useIsLegacyBrand.ts
75
+ var useIsLegacyBrand = () => {
76
+ const context = react.use(ThemeContext);
77
+ return context === null || context.brand.id === brandRegistry.keboolaLegacy.id;
78
+ };
34
79
  var tooltipVariants = classVarianceAuthority.cva(
35
80
  [
36
81
  "tailwindcss-preflight",
37
82
  "tw-inline-block",
38
- "tw-rounded",
39
- "tw-bg-neutral-800",
40
- "tw-text-white",
41
83
  "tw-break-anywhere",
42
84
  "tw-max-h-96",
43
85
  "tw-overflow-y-auto",
44
- "tw-z-[1060]"
86
+ "tw-z-[1060]",
87
+ // legacy (dark) chrome — default
88
+ "tw-rounded",
89
+ "tw-bg-neutral-800",
90
+ "tw-text-white",
91
+ // argo chrome overrides — semantic floating-panel tokens
92
+ "data-[argo=true]:tw-rounded-2xl",
93
+ "data-[argo=true]:tw-border",
94
+ "data-[argo=true]:tw-border-solid",
95
+ "data-[argo=true]:tw-border-border",
96
+ "data-[argo=true]:tw-bg-popover",
97
+ "data-[argo=true]:tw-text-popover-foreground",
98
+ "data-[argo=true]:tw-shadow-md",
99
+ // argo open animation
100
+ "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
101
+ "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
102
+ "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
103
+ "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
104
+ "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
105
+ "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
106
+ // argo closed animation
107
+ "data-[argo=true]:data-[state=closed]:tw-animate-out",
108
+ "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
109
+ "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
110
+ // argo position animation
111
+ "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
112
+ "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
113
+ "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
114
+ "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
45
115
  ],
46
116
  {
47
117
  defaultVariants: {
@@ -74,6 +144,7 @@ var tooltipVariants = classVarianceAuthority.cva(
74
144
  var TooltipContent = ({
75
145
  className,
76
146
  variant,
147
+ argo,
77
148
  keepOpenOnPointerDownOutside = false,
78
149
  children,
79
150
  onPointerDownOutside,
@@ -83,6 +154,8 @@ var TooltipContent = ({
83
154
  placement = "right",
84
155
  ...rest
85
156
  }) => {
157
+ const isLegacy = useIsLegacyBrand();
158
+ const renderArgo = !isLegacy || argo === true;
86
159
  const handlePointerDownOutside = (event) => {
87
160
  if (keepOpenOnPointerDownOutside) event.preventDefault();
88
161
  onPointerDownOutside?.(event);
@@ -91,7 +164,8 @@ var TooltipContent = ({
91
164
  reactTooltip.Content,
92
165
  {
93
166
  ...rest,
94
- "data-tooltip-content": true,
167
+ "data-tooltip-content": renderArgo ? void 0 : true,
168
+ "data-argo": renderArgo,
95
169
  sideOffset,
96
170
  collisionPadding,
97
171
  onPointerDownOutside: handlePointerDownOutside,
@@ -150,6 +224,7 @@ var Tooltip = ({
150
224
  className,
151
225
  keepOpenOnTriggerClick = false,
152
226
  variant,
227
+ argo,
153
228
  placement = "right",
154
229
  forceHide = false,
155
230
  forceShow = false,
@@ -188,6 +263,7 @@ var Tooltip = ({
188
263
  {
189
264
  className,
190
265
  variant: resolvedVariant,
266
+ argo,
191
267
  placement,
192
268
  keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
193
269
  children: tooltip
@@ -214,7 +290,7 @@ var ANIMATION_CLASS_NAME = cn(
214
290
  "tw-relative",
215
291
  "tw-overflow-hidden",
216
292
  "tw-pointer-events-none",
217
- "tw-bg-neutral-150",
293
+ "tw-bg-muted",
218
294
  // before
219
295
  'before:tw-content-[""]',
220
296
  "before:tw-opacity-100",
@@ -239,6 +315,33 @@ var Skeleton = ({ height = "md", className, count = 1 }) => {
239
315
  key
240
316
  )) });
241
317
  };
318
+
319
+ // src/icons/index.ts
320
+ var icons_exports = {};
321
+ __export(icons_exports, {
322
+ Keboola: () => Keboola
323
+ });
324
+ __reExport(icons_exports, lucide_react_star__namespace);
325
+ var Keboola = react.forwardRef(
326
+ ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
327
+ "svg",
328
+ {
329
+ ref,
330
+ xmlns: "http://www.w3.org/2000/svg",
331
+ width: size,
332
+ height: size,
333
+ viewBox: "0 0 300 512",
334
+ fill: color,
335
+ className: cn("lucide", className),
336
+ ...rest,
337
+ children: [
338
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M152 320C79.7 320 24.5 233.9 24.5 124.7C24.5 15.6 70.5 0 152 0s123.6 15.6 123.6 124.7C275.5 233.9 217.7 320 152 320zm-8.7-50.5c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm55.7 0c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm68.9 115.1c10.2 9.3 20.2 20.5 29 35c5.9 9.7 2.6 22.1-7.5 27.8c-3.4 1.9-7.1 2.8-10.7 2.8c-7.2 0-14.3-3.6-18.3-10c-6.8-11.1-13.8-18.9-21.7-26.1c-7.3-6.7-15.6-12.7-24.9-19.5c-.7-.5-1.4-1-2.1-1.5c-5-3.6-10-6.8-14.9-9.4c.6 1 1.2 2.1 1.8 3.2c14.4 26.4 29.2 63.1 29.2 104.9c0 11.2-9.5 20.3-21.2 20.3c-11.7 0-21.2-9.1-21.2-20.3c.1-31.8-11.6-62.3-23.8-84.9c-4-7.4-8-13.9-11.6-19.3c-3.4 5.2-7.2 11.3-11 18.3c-12.5 22.7-24.5 53.8-24.4 86c0 11.2-9.5 20.3-21.2 20.3s-21.2-9.1-21.2-20.3c.1-41.8 14.9-78.4 29.2-104.9c.6-1.1 1.2-2.1 1.8-3.2c-5 2.7-9.9 5.8-14.9 9.4c-.6 .5-1.3 .9-1.9 1.4c-9.5 6.9-17.8 12.9-25.1 19.7c-7.9 7.2-14.9 15.1-21.7 26.1c-5.9 9.7-18.9 12.9-29 7.2C.5 441.8-2.9 429.3 3.1 419.7c8.9-14.4 18.8-25.7 29-35c9.2-8.4 18.5-15.1 27.6-21.7c1-.7 2-1.4 3-2.2c4.7-3.5 9.6-6.7 14.6-9.6c-5-2.9-9.8-6.1-14.6-9.6C39.8 325 19.9 302.5 3.1 275.1c-5.9-9.7-2.6-22.1 7.5-27.8c10.1-5.7 23.1-2.5 29 7.2c14.6 23.7 31.1 42 48.7 54.9c18.9 13.7 37.4 20.5 56.5 21.5c1.7-.1 3.5-.1 5.2-.1c1.8 0 3.5 .1 5.2 .1c0 0 0 0 0 0c19.1-1.1 37.6-7.9 56.5-21.5c17.6-12.8 34.2-31.2 48.7-54.9c6-9.7 18.9-12.9 29-7.2c10.1 5.7 13.4 18.1 7.5 27.8c-16.8 27.4-36.7 49.9-59.6 66.6c-4.7 3.5-9.6 6.7-14.5 9.6c4.9 2.9 9.8 6.1 14.5 9.6c.9 .7 1.8 1.3 2.7 2c9.2 6.7 18.5 13.5 27.9 22z" }),
339
+ children
340
+ ]
341
+ }
342
+ )
343
+ );
344
+ Keboola.displayName = "Keboola";
242
345
  var variants = classVarianceAuthority.cva(
243
346
  [
244
347
  "tailwindcss-preflight",
@@ -426,6 +529,8 @@ var argoVariants = classVarianceAuthority.cva(
426
529
  "tw-bg-clip-padding",
427
530
  // anchor support
428
531
  "!tw-no-underline",
532
+ "aria-disabled:tw-cursor-not-allowed",
533
+ "aria-disabled:tw-opacity-50",
429
534
  // icon
430
535
  "tw-shrink-0",
431
536
  "[&_svg]:tw-pointer-events-none",
@@ -528,14 +633,11 @@ var Button = ({
528
633
  block = false,
529
634
  ...buttonProps
530
635
  }) => {
636
+ const isLegacy = useIsLegacyBrand();
637
+ const renderArgo = !isLegacy || argo;
531
638
  const Comp = asChild ? reactSlot.Root : "button";
532
639
  const isIconOnly = String(size).startsWith("icon");
533
- const classNames = argo ? argoVariants({ variant, size, block, className }) : variants({
534
- size,
535
- variant,
536
- block,
537
- className
538
- });
640
+ const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
539
641
  const handleClick = (event) => {
540
642
  const isAnchor = event.currentTarget.tagName === "A";
541
643
  if (isAnchor && disabled) {
@@ -557,7 +659,7 @@ var Button = ({
557
659
  onClick: handleClick,
558
660
  className: cn(classNames),
559
661
  children: [
560
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
662
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
561
663
  /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
562
664
  ]
563
665
  }
@@ -626,7 +728,7 @@ var Clipboard = ({
626
728
  )
627
729
  ] });
628
730
  };
629
- var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
731
+ var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Copy, {});
630
732
  var ClipboardButton = ({
631
733
  // clipboard props
632
734
  text,
@@ -656,6 +758,10 @@ var MIN_SCALE = 0.5;
656
758
  var MAX_SCALE = 3;
657
759
  var ZOOM_STEP = 0.1;
658
760
  var ZoomableSvg = ({ html, copyText, className }) => {
761
+ const safeHtml = react.useMemo(
762
+ () => DOMPurify__default.default.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
763
+ [html]
764
+ );
659
765
  const containerRef = react.useRef(null);
660
766
  const [scale, setScale] = react.useState(1);
661
767
  const [translate, setTranslate] = react.useState({ x: 0, y: 0 });
@@ -751,7 +857,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
751
857
  isFullscreen && "tw-h-full [&>svg]:tw-h-full"
752
858
  ),
753
859
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
754
- dangerouslySetInnerHTML: { __html: html }
860
+ dangerouslySetInnerHTML: { __html: safeHtml }
755
861
  }
756
862
  )
757
863
  }
@@ -788,7 +894,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
788
894
  "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
789
895
  onClick: () => setIsFullscreen((f) => !f),
790
896
  argo: true,
791
- children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "tw-size-4" })
897
+ children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Maximize2, { className: "tw-size-4" })
792
898
  }
793
899
  )
794
900
  }
@@ -804,7 +910,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
804
910
  "div",
805
911
  {
806
912
  role: "presentation",
807
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-neutral-50 tw-p-4",
913
+ className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
808
914
  onClick: stopPropagation,
809
915
  children: diagramContent
810
916
  }
@@ -814,13 +920,18 @@ var ZoomableSvg = ({ html, copyText, className }) => {
814
920
  "div",
815
921
  {
816
922
  className: cn(
817
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-150 tw-bg-neutral-50",
923
+ "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
818
924
  className
819
925
  ),
820
926
  children: diagramContent
821
927
  }
822
928
  );
823
929
  };
930
+ var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
931
+ var resolvePrimary = () => {
932
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
933
+ return `rgb(${channels})`;
934
+ };
824
935
  var mermaidPromise = null;
825
936
  var getMermaid = () => {
826
937
  if (!mermaidPromise) {
@@ -869,7 +980,7 @@ var getMermaid = () => {
869
980
  taskTextColor: colors__default.default.neutral[800],
870
981
  taskTextDarkColor: colors__default.default.neutral[800],
871
982
  taskTextLightColor: colors__default.default.neutral[800],
872
- activeTaskBorderColor: colors__default.default.primary.DEFAULT,
983
+ activeTaskBorderColor: resolvePrimary(),
873
984
  activeTaskBkgColor: colors__default.default.secondary[200],
874
985
  doneTaskBorderColor: colors__default.default.primary[600],
875
986
  doneTaskBkgColor: colors__default.default.primary[100],
@@ -921,46 +1032,28 @@ var makeResponsive = (svgString) => {
921
1032
  };
922
1033
  var RENDER_DEBOUNCE_MS = 300;
923
1034
  var svgCache = /* @__PURE__ */ new Map();
1035
+ var resolveSyncSvg = (code) => {
1036
+ const cached = svgCache.get(code);
1037
+ if (cached) return cached;
1038
+ const fast = tryFastRender(code);
1039
+ if (fast) svgCache.set(code, fast);
1040
+ return fast;
1041
+ };
924
1042
  var MermaidDiagram = ({ code }) => {
925
1043
  const id = react.useId();
926
- const [svg, setSvg] = react.useState(() => {
927
- const cached = svgCache.get(code);
928
- if (cached) return cached;
929
- const fast = tryFastRender(code);
930
- if (fast) {
931
- svgCache.set(code, fast);
932
- return fast;
933
- }
934
- return null;
935
- });
1044
+ const [svg, setSvg] = react.useState(() => resolveSyncSvg(code));
936
1045
  const [renderFailed, setRenderFailed] = react.useState(false);
937
1046
  const debounceRef = react.useRef(null);
938
1047
  const renderIdRef = react.useRef(0);
939
1048
  const [prevCode, setPrevCode] = react.useState(code);
940
1049
  if (code !== prevCode) {
941
1050
  setPrevCode(code);
942
- const cached = svgCache.get(code);
943
- const fast = cached ?? tryFastRender(code);
944
- if (fast && !cached) svgCache.set(code, fast);
945
- setSvg(fast);
1051
+ setSvg(resolveSyncSvg(code));
946
1052
  setRenderFailed(false);
947
1053
  }
948
1054
  react.useEffect(() => {
949
- if (svgCache.has(code)) {
950
- setSvg(svgCache.get(code));
951
- setRenderFailed(false);
952
- return;
953
- }
954
- const fastResult = tryFastRender(code);
955
- if (fastResult) {
956
- svgCache.set(code, fastResult);
957
- setSvg(fastResult);
958
- setRenderFailed(false);
959
- return;
960
- }
961
- setSvg(null);
1055
+ if (svgCache.has(code)) return;
962
1056
  const currentRenderId = ++renderIdRef.current;
963
- setRenderFailed(false);
964
1057
  if (debounceRef.current) {
965
1058
  clearTimeout(debounceRef.current);
966
1059
  }