@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.js CHANGED
@@ -1,15 +1,33 @@
1
- import { useId, useState, useRef, useEffect, useCallback } from 'react';
1
+ import { createContext, forwardRef, useId, useState, useRef, useEffect, useMemo, useCallback, use } from 'react';
2
2
  import { renderMermaidSVG } from 'beautiful-mermaid';
3
3
  import colors from '@keboola/tailwind-config/colors';
4
4
  import { clsx } from 'clsx';
5
5
  import { extendTailwindMerge } from 'tailwind-merge';
6
6
  import { Root as Root$1, Trigger, Portal, Content } from '@radix-ui/react-tooltip';
7
7
  import { cva } from 'class-variance-authority';
8
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+ import { keboolaLegacy } from '@keboola/brand-registry';
9
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
10
+ import DOMPurify from 'dompurify';
9
11
  import { Root, Slottable } from '@radix-ui/react-slot';
10
- import { Minimize2, Maximize2, Loader2, Copy } from 'lucide-react';
12
+ import * as lucide_react_star from 'lucide-react';
11
13
 
12
- // src/blocks/MermaidDiagram/MermaidDiagram.tsx
14
+ var __defProp = Object.defineProperty;
15
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
16
+ var __getOwnPropNames = Object.getOwnPropertyNames;
17
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
18
+ var __export = (target, all) => {
19
+ for (var name in all)
20
+ __defProp(target, name, { get: all[name], enumerable: true });
21
+ };
22
+ var __copyProps = (to, from, except, desc) => {
23
+ if (from && typeof from === "object" || typeof from === "function") {
24
+ for (let key of __getOwnPropNames(from))
25
+ if (!__hasOwnProp.call(to, key) && key !== except)
26
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
27
+ }
28
+ return to;
29
+ };
30
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
13
31
  var twMerge = extendTailwindMerge({
14
32
  prefix: "tw-"
15
33
  });
@@ -25,17 +43,49 @@ var keyCodes = {
25
43
  ENTER: "Enter",
26
44
  SPACE: " "
27
45
  };
46
+ var ThemeContext = createContext(null);
47
+
48
+ // src/components/internal/useIsLegacyBrand.ts
49
+ var useIsLegacyBrand = () => {
50
+ const context = use(ThemeContext);
51
+ return context === null || context.brand.id === keboolaLegacy.id;
52
+ };
28
53
  var tooltipVariants = cva(
29
54
  [
30
55
  "tailwindcss-preflight",
31
56
  "tw-inline-block",
32
- "tw-rounded",
33
- "tw-bg-neutral-800",
34
- "tw-text-white",
35
57
  "tw-break-anywhere",
36
58
  "tw-max-h-96",
37
59
  "tw-overflow-y-auto",
38
- "tw-z-[1060]"
60
+ "tw-z-[1060]",
61
+ // legacy (dark) chrome — default
62
+ "tw-rounded",
63
+ "tw-bg-neutral-800",
64
+ "tw-text-white",
65
+ // argo chrome overrides — semantic floating-panel tokens
66
+ "data-[argo=true]:tw-rounded-2xl",
67
+ "data-[argo=true]:tw-border",
68
+ "data-[argo=true]:tw-border-solid",
69
+ "data-[argo=true]:tw-border-border",
70
+ "data-[argo=true]:tw-bg-popover",
71
+ "data-[argo=true]:tw-text-popover-foreground",
72
+ "data-[argo=true]:tw-shadow-md",
73
+ // argo open animation
74
+ "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
75
+ "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
76
+ "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
77
+ "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
78
+ "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
79
+ "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
80
+ // argo closed animation
81
+ "data-[argo=true]:data-[state=closed]:tw-animate-out",
82
+ "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
83
+ "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
84
+ // argo position animation
85
+ "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
86
+ "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
87
+ "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
88
+ "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
39
89
  ],
40
90
  {
41
91
  defaultVariants: {
@@ -68,6 +118,7 @@ var tooltipVariants = cva(
68
118
  var TooltipContent = ({
69
119
  className,
70
120
  variant,
121
+ argo,
71
122
  keepOpenOnPointerDownOutside = false,
72
123
  children,
73
124
  onPointerDownOutside,
@@ -77,6 +128,8 @@ var TooltipContent = ({
77
128
  placement = "right",
78
129
  ...rest
79
130
  }) => {
131
+ const isLegacy = useIsLegacyBrand();
132
+ const renderArgo = !isLegacy || argo === true;
80
133
  const handlePointerDownOutside = (event) => {
81
134
  if (keepOpenOnPointerDownOutside) event.preventDefault();
82
135
  onPointerDownOutside?.(event);
@@ -85,7 +138,8 @@ var TooltipContent = ({
85
138
  Content,
86
139
  {
87
140
  ...rest,
88
- "data-tooltip-content": true,
141
+ "data-tooltip-content": renderArgo ? void 0 : true,
142
+ "data-argo": renderArgo,
89
143
  sideOffset,
90
144
  collisionPadding,
91
145
  onPointerDownOutside: handlePointerDownOutside,
@@ -144,6 +198,7 @@ var Tooltip = ({
144
198
  className,
145
199
  keepOpenOnTriggerClick = false,
146
200
  variant,
201
+ argo,
147
202
  placement = "right",
148
203
  forceHide = false,
149
204
  forceShow = false,
@@ -182,6 +237,7 @@ var Tooltip = ({
182
237
  {
183
238
  className,
184
239
  variant: resolvedVariant,
240
+ argo,
185
241
  placement,
186
242
  keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
187
243
  children: tooltip
@@ -208,7 +264,7 @@ var ANIMATION_CLASS_NAME = cn(
208
264
  "tw-relative",
209
265
  "tw-overflow-hidden",
210
266
  "tw-pointer-events-none",
211
- "tw-bg-neutral-150",
267
+ "tw-bg-muted",
212
268
  // before
213
269
  'before:tw-content-[""]',
214
270
  "before:tw-opacity-100",
@@ -233,6 +289,33 @@ var Skeleton = ({ height = "md", className, count = 1 }) => {
233
289
  key
234
290
  )) });
235
291
  };
292
+
293
+ // src/icons/index.ts
294
+ var icons_exports = {};
295
+ __export(icons_exports, {
296
+ Keboola: () => Keboola
297
+ });
298
+ __reExport(icons_exports, lucide_react_star);
299
+ var Keboola = forwardRef(
300
+ ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
301
+ "svg",
302
+ {
303
+ ref,
304
+ xmlns: "http://www.w3.org/2000/svg",
305
+ width: size,
306
+ height: size,
307
+ viewBox: "0 0 300 512",
308
+ fill: color,
309
+ className: cn("lucide", className),
310
+ ...rest,
311
+ children: [
312
+ /* @__PURE__ */ 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" }),
313
+ children
314
+ ]
315
+ }
316
+ )
317
+ );
318
+ Keboola.displayName = "Keboola";
236
319
  var variants = cva(
237
320
  [
238
321
  "tailwindcss-preflight",
@@ -420,6 +503,8 @@ var argoVariants = cva(
420
503
  "tw-bg-clip-padding",
421
504
  // anchor support
422
505
  "!tw-no-underline",
506
+ "aria-disabled:tw-cursor-not-allowed",
507
+ "aria-disabled:tw-opacity-50",
423
508
  // icon
424
509
  "tw-shrink-0",
425
510
  "[&_svg]:tw-pointer-events-none",
@@ -522,14 +607,11 @@ var Button = ({
522
607
  block = false,
523
608
  ...buttonProps
524
609
  }) => {
610
+ const isLegacy = useIsLegacyBrand();
611
+ const renderArgo = !isLegacy || argo;
525
612
  const Comp = asChild ? Root : "button";
526
613
  const isIconOnly = String(size).startsWith("icon");
527
- const classNames = argo ? argoVariants({ variant, size, block, className }) : variants({
528
- size,
529
- variant,
530
- block,
531
- className
532
- });
614
+ const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
533
615
  const handleClick = (event) => {
534
616
  const isAnchor = event.currentTarget.tagName === "A";
535
617
  if (isAnchor && disabled) {
@@ -551,7 +633,7 @@ var Button = ({
551
633
  onClick: handleClick,
552
634
  className: cn(classNames),
553
635
  children: [
554
- isLoading && /* @__PURE__ */ jsx(Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
636
+ isLoading && /* @__PURE__ */ jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
555
637
  /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
556
638
  ]
557
639
  }
@@ -620,7 +702,7 @@ var Clipboard = ({
620
702
  )
621
703
  ] });
622
704
  };
623
- var DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
705
+ var DEFAULT_ICON = /* @__PURE__ */ jsx(icons_exports.Copy, {});
624
706
  var ClipboardButton = ({
625
707
  // clipboard props
626
708
  text,
@@ -650,6 +732,10 @@ var MIN_SCALE = 0.5;
650
732
  var MAX_SCALE = 3;
651
733
  var ZOOM_STEP = 0.1;
652
734
  var ZoomableSvg = ({ html, copyText, className }) => {
735
+ const safeHtml = useMemo(
736
+ () => DOMPurify.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
737
+ [html]
738
+ );
653
739
  const containerRef = useRef(null);
654
740
  const [scale, setScale] = useState(1);
655
741
  const [translate, setTranslate] = useState({ x: 0, y: 0 });
@@ -745,7 +831,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
745
831
  isFullscreen && "tw-h-full [&>svg]:tw-h-full"
746
832
  ),
747
833
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
748
- dangerouslySetInnerHTML: { __html: html }
834
+ dangerouslySetInnerHTML: { __html: safeHtml }
749
835
  }
750
836
  )
751
837
  }
@@ -782,7 +868,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
782
868
  "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
783
869
  onClick: () => setIsFullscreen((f) => !f),
784
870
  argo: true,
785
- children: isFullscreen ? /* @__PURE__ */ jsx(Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsx(Maximize2, { className: "tw-size-4" })
871
+ children: isFullscreen ? /* @__PURE__ */ jsx(icons_exports.Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsx(icons_exports.Maximize2, { className: "tw-size-4" })
786
872
  }
787
873
  )
788
874
  }
@@ -798,7 +884,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
798
884
  "div",
799
885
  {
800
886
  role: "presentation",
801
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-neutral-50 tw-p-4",
887
+ className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
802
888
  onClick: stopPropagation,
803
889
  children: diagramContent
804
890
  }
@@ -808,13 +894,18 @@ var ZoomableSvg = ({ html, copyText, className }) => {
808
894
  "div",
809
895
  {
810
896
  className: cn(
811
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-150 tw-bg-neutral-50",
897
+ "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
812
898
  className
813
899
  ),
814
900
  children: diagramContent
815
901
  }
816
902
  );
817
903
  };
904
+ var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
905
+ var resolvePrimary = () => {
906
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
907
+ return `rgb(${channels})`;
908
+ };
818
909
  var mermaidPromise = null;
819
910
  var getMermaid = () => {
820
911
  if (!mermaidPromise) {
@@ -863,7 +954,7 @@ var getMermaid = () => {
863
954
  taskTextColor: colors.neutral[800],
864
955
  taskTextDarkColor: colors.neutral[800],
865
956
  taskTextLightColor: colors.neutral[800],
866
- activeTaskBorderColor: colors.primary.DEFAULT,
957
+ activeTaskBorderColor: resolvePrimary(),
867
958
  activeTaskBkgColor: colors.secondary[200],
868
959
  doneTaskBorderColor: colors.primary[600],
869
960
  doneTaskBkgColor: colors.primary[100],
@@ -915,46 +1006,28 @@ var makeResponsive = (svgString) => {
915
1006
  };
916
1007
  var RENDER_DEBOUNCE_MS = 300;
917
1008
  var svgCache = /* @__PURE__ */ new Map();
1009
+ var resolveSyncSvg = (code) => {
1010
+ const cached = svgCache.get(code);
1011
+ if (cached) return cached;
1012
+ const fast = tryFastRender(code);
1013
+ if (fast) svgCache.set(code, fast);
1014
+ return fast;
1015
+ };
918
1016
  var MermaidDiagram = ({ code }) => {
919
1017
  const id = useId();
920
- const [svg, setSvg] = useState(() => {
921
- const cached = svgCache.get(code);
922
- if (cached) return cached;
923
- const fast = tryFastRender(code);
924
- if (fast) {
925
- svgCache.set(code, fast);
926
- return fast;
927
- }
928
- return null;
929
- });
1018
+ const [svg, setSvg] = useState(() => resolveSyncSvg(code));
930
1019
  const [renderFailed, setRenderFailed] = useState(false);
931
1020
  const debounceRef = useRef(null);
932
1021
  const renderIdRef = useRef(0);
933
1022
  const [prevCode, setPrevCode] = useState(code);
934
1023
  if (code !== prevCode) {
935
1024
  setPrevCode(code);
936
- const cached = svgCache.get(code);
937
- const fast = cached ?? tryFastRender(code);
938
- if (fast && !cached) svgCache.set(code, fast);
939
- setSvg(fast);
1025
+ setSvg(resolveSyncSvg(code));
940
1026
  setRenderFailed(false);
941
1027
  }
942
1028
  useEffect(() => {
943
- if (svgCache.has(code)) {
944
- setSvg(svgCache.get(code));
945
- setRenderFailed(false);
946
- return;
947
- }
948
- const fastResult = tryFastRender(code);
949
- if (fastResult) {
950
- svgCache.set(code, fastResult);
951
- setSvg(fastResult);
952
- setRenderFailed(false);
953
- return;
954
- }
955
- setSvg(null);
1029
+ if (svgCache.has(code)) return;
956
1030
  const currentRenderId = ++renderIdRef.current;
957
- setRenderFailed(false);
958
1031
  if (debounceRef.current) {
959
1032
  clearTimeout(debounceRef.current);
960
1033
  }