analytica-frontend-lib 1.0.39 → 1.0.41

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/index.js CHANGED
@@ -27,10 +27,13 @@ __export(src_exports, {
27
27
  Chips: () => Chips_default,
28
28
  Divider: () => Divider_default,
29
29
  DropdownMenu: () => DropdownMenu_default,
30
+ DropdownMenuItem: () => DropdownMenuItem,
31
+ DropdownMenuSeparator: () => DropdownMenuSeparator,
30
32
  DropdownMenuTrigger: () => DropdownMenuTrigger,
31
33
  IconButton: () => IconButton_default,
32
34
  IconRoundedButton: () => IconRoundedButton_default,
33
35
  Input: () => Input_default,
36
+ Menu: () => Menu_default,
34
37
  MenuContent: () => MenuContent,
35
38
  MenuItem: () => MenuItem,
36
39
  MenuLabel: () => MenuLabel,
@@ -828,48 +831,34 @@ var import_jsx_runtime11 = require("react/jsx-runtime");
828
831
  var SIZE_CLASSES4 = {
829
832
  small: {
830
833
  radio: "w-5 h-5",
831
- // 20px x 20px
832
834
  textSize: "sm",
833
835
  spacing: "gap-1.5",
834
- // 6px
835
836
  borderWidth: "border-2",
836
- dotSize: "w-1.5 h-1.5",
837
- // 6px inner dot
837
+ dotSize: "w-2 h-2",
838
838
  labelHeight: "h-5"
839
839
  },
840
840
  medium: {
841
841
  radio: "w-6 h-6",
842
- // 24px x 24px
843
842
  textSize: "md",
844
843
  spacing: "gap-2",
845
- // 8px
846
844
  borderWidth: "border-2",
847
- dotSize: "w-2 h-2",
848
- // 8px inner dot
845
+ dotSize: "w-2.5 h-2.5",
849
846
  labelHeight: "h-6"
850
847
  },
851
848
  large: {
852
849
  radio: "w-7 h-7",
853
- // 28px x 28px
854
850
  textSize: "lg",
855
851
  spacing: "gap-2",
856
- // 8px
857
852
  borderWidth: "border-2",
858
- // 2px border (consistent with others)
859
- dotSize: "w-2.5 h-2.5",
860
- // 10px inner dot
853
+ dotSize: "w-3 h-3",
861
854
  labelHeight: "h-7"
862
855
  },
863
856
  extraLarge: {
864
857
  radio: "w-8 h-8",
865
- // 32px x 32px (larger than large)
866
858
  textSize: "xl",
867
859
  spacing: "gap-3",
868
- // 12px
869
860
  borderWidth: "border-2",
870
- // 2px border (consistent with others)
871
- dotSize: "w-3 h-3",
872
- // 12px inner dot
861
+ dotSize: "w-3.5 h-3.5",
873
862
  labelHeight: "h-8"
874
863
  }
875
864
  };
@@ -881,39 +870,27 @@ var STATE_CLASSES2 = {
881
870
  },
882
871
  hovered: {
883
872
  unchecked: "border-border-500 bg-background",
884
- // #8C8D8D hover state for unchecked
885
873
  checked: "border-info-700 bg-background"
886
- // Adjust checked border for hover
887
874
  },
888
875
  focused: {
889
876
  unchecked: "border-border-400 bg-background",
890
- // #A5A3A3 for unchecked radio
891
877
  checked: "border-primary-950 bg-background"
892
- // #124393 for checked radio
893
878
  },
894
879
  invalid: {
895
880
  unchecked: "border-border-400 bg-background",
896
- // #A5A3A3 for unchecked radio
897
881
  checked: "border-primary-950 bg-background"
898
- // #124393 for checked radio
899
882
  },
900
883
  disabled: {
901
884
  unchecked: "border-border-400 bg-background cursor-not-allowed",
902
- // #A5A3A3 for unchecked radio
903
885
  checked: "border-primary-950 bg-background cursor-not-allowed"
904
- // #124393 for checked radio
905
886
  }
906
887
  };
907
888
  var DOT_CLASSES = {
908
889
  default: "bg-primary-950",
909
890
  hovered: "bg-info-700",
910
- // #1C61B2 hover state for checked dot
911
891
  focused: "bg-primary-950",
912
- // #124393 for focused checked dot
913
892
  invalid: "bg-primary-950",
914
- // #124393 for invalid checked dot
915
893
  disabled: "bg-primary-950"
916
- // #124393 for disabled checked dot
917
894
  };
918
895
  var Radio = (0, import_react6.forwardRef)(
919
896
  ({
@@ -999,7 +976,7 @@ var Radio = (0, import_react6.forwardRef)(
999
976
  label && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1000
977
  "div",
1001
978
  {
1002
- className: `flex flex-row items-center ${sizeClasses.labelHeight}`,
979
+ className: `flex flex-row items-center ${sizeClasses.labelHeight} flex-1 min-w-0`,
1003
980
  children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1004
981
  Text_default,
1005
982
  {
@@ -1007,7 +984,7 @@ var Radio = (0, import_react6.forwardRef)(
1007
984
  htmlFor: inputId,
1008
985
  size: sizeClasses.textSize,
1009
986
  weight: "normal",
1010
- className: `${getCursorClass()} select-none leading-normal flex items-center font-roboto ${labelClassName}`,
987
+ className: `${getCursorClass()} select-none leading-normal flex items-center font-roboto truncate ${labelClassName}`,
1011
988
  color: getTextColor(),
1012
989
  children: label
1013
990
  }
@@ -1022,7 +999,7 @@ var Radio = (0, import_react6.forwardRef)(
1022
999
  {
1023
1000
  size: "sm",
1024
1001
  weight: "normal",
1025
- className: "mt-1.5",
1002
+ className: "mt-1.5 truncate",
1026
1003
  color: "text-error-600",
1027
1004
  children: errorMessage
1028
1005
  }
@@ -1032,7 +1009,7 @@ var Radio = (0, import_react6.forwardRef)(
1032
1009
  {
1033
1010
  size: "sm",
1034
1011
  weight: "normal",
1035
- className: "mt-1.5",
1012
+ className: "mt-1.5 truncate",
1036
1013
  color: "text-text-500",
1037
1014
  children: helperText
1038
1015
  }
@@ -1510,7 +1487,6 @@ var SIZE_CLASSES7 = {
1510
1487
  // 4px height (h-1 = 4px in Tailwind)
1511
1488
  bar: "h-1",
1512
1489
  // 4px height for the fill bar
1513
- labelSize: "xs",
1514
1490
  spacing: "gap-2",
1515
1491
  // 8px gap between label and progress bar
1516
1492
  layout: "flex-col",
@@ -1523,8 +1499,6 @@ var SIZE_CLASSES7 = {
1523
1499
  // 8px height (h-2 = 8px in Tailwind)
1524
1500
  bar: "h-2",
1525
1501
  // 8px height for the fill bar
1526
- labelSize: "xs",
1527
- // 12px font size (xs in Tailwind)
1528
1502
  spacing: "gap-2",
1529
1503
  // 8px gap between progress bar and label
1530
1504
  layout: "flex-row items-center",
@@ -1566,25 +1540,25 @@ var ProgressBar = ({
1566
1540
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1567
1541
  "div",
1568
1542
  {
1569
- className: `flex ${sizeClasses.layout} ${sizeClasses.spacing} ${className}`,
1543
+ className: `flex ${sizeClasses.layout} ${size === "medium" ? "gap-2" : sizeClasses.spacing} ${className}`,
1570
1544
  children: [
1571
1545
  size === "small" && (label || showPercentage) && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex flex-row items-center justify-between w-full", children: [
1572
1546
  label && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1573
1547
  Text_default,
1574
1548
  {
1575
1549
  as: "div",
1576
- size: sizeClasses.labelSize,
1550
+ size: "xs",
1577
1551
  weight: "medium",
1578
- className: `text-text-950 ${labelClassName}`,
1552
+ className: `text-text-950 leading-none tracking-normal text-center ${labelClassName}`,
1579
1553
  children: label
1580
1554
  }
1581
1555
  ),
1582
1556
  showPercentage && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1583
1557
  Text_default,
1584
1558
  {
1585
- size: sizeClasses.labelSize,
1559
+ size: "xs",
1586
1560
  weight: "medium",
1587
- className: `text-text-700 text-center ${percentageClassName}`,
1561
+ className: `text-text-950 leading-none tracking-normal text-center ${percentageClassName}`,
1588
1562
  children: [
1589
1563
  Math.round(percentage),
1590
1564
  "%"
@@ -1619,9 +1593,9 @@ var ProgressBar = ({
1619
1593
  size === "medium" && showPercentage && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1620
1594
  Text_default,
1621
1595
  {
1622
- size: sizeClasses.labelSize,
1596
+ size: "xs",
1623
1597
  weight: "medium",
1624
- className: `text-text-950 text-center flex-none w-[70px] ${percentageClassName}`,
1598
+ className: `text-text-950 leading-none tracking-normal text-center flex-none ${percentageClassName}`,
1625
1599
  children: [
1626
1600
  Math.round(percentage),
1627
1601
  "%"
@@ -1632,9 +1606,9 @@ var ProgressBar = ({
1632
1606
  Text_default,
1633
1607
  {
1634
1608
  as: "div",
1635
- size: sizeClasses.labelSize,
1609
+ size: "xs",
1636
1610
  weight: "medium",
1637
- className: `text-text-950 flex-none ${labelClassName}`,
1611
+ className: `text-text-950 leading-none tracking-normal text-center flex-none ${labelClassName}`,
1638
1612
  children: label
1639
1613
  }
1640
1614
  )
@@ -2018,7 +1992,7 @@ var MenuContent = (0, import_react9.forwardRef)(
2018
1992
  }
2019
1993
  );
2020
1994
  MenuContent.displayName = "MenuContent";
2021
- var MenuItem = (0, import_react9.forwardRef)(
1995
+ var DropdownMenuItem = (0, import_react9.forwardRef)(
2022
1996
  ({
2023
1997
  className,
2024
1998
  size = "small",
@@ -2081,8 +2055,8 @@ var MenuItem = (0, import_react9.forwardRef)(
2081
2055
  );
2082
2056
  }
2083
2057
  );
2084
- MenuItem.displayName = "MenuItem";
2085
- var MenuSeparator = (0, import_react9.forwardRef)(({ className, store: _store, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2058
+ DropdownMenuItem.displayName = "DropdownMenuItem";
2059
+ var DropdownMenuSeparator = (0, import_react9.forwardRef)(({ className, store: _store, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2086
2060
  "div",
2087
2061
  {
2088
2062
  ref,
@@ -2090,7 +2064,7 @@ var MenuSeparator = (0, import_react9.forwardRef)(({ className, store: _store, .
2090
2064
  ...props
2091
2065
  }
2092
2066
  ));
2093
- MenuSeparator.displayName = "MenuSeparator";
2067
+ DropdownMenuSeparator.displayName = "DropdownMenuSeparator";
2094
2068
  var ProfileMenuTrigger = (0, import_react9.forwardRef)(({ className, onClick, store: externalStore, ...props }, ref) => {
2095
2069
  const store = useDropdownStore(externalStore);
2096
2070
  const open = (0, import_zustand2.useStore)(store, (s) => s.open);
@@ -2459,6 +2433,170 @@ var SelectItem = (0, import_react10.forwardRef)(
2459
2433
  );
2460
2434
  SelectItem.displayName = "SelectItem";
2461
2435
  var Select_default = Select;
2436
+
2437
+ // src/components/Menu/Menu.tsx
2438
+ var import_zustand4 = require("zustand");
2439
+ var import_react11 = require("react");
2440
+ var import_phosphor_react9 = require("phosphor-react");
2441
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2442
+ var createMenuStore = () => (0, import_zustand4.create)((set) => ({
2443
+ value: "",
2444
+ setValue: (value) => set({ value })
2445
+ }));
2446
+ var useMenuStore = (externalStore) => {
2447
+ if (!externalStore) throw new Error("MenuItem must be inside Menu");
2448
+ return externalStore;
2449
+ };
2450
+ var VARIANT_CLASSES5 = {
2451
+ menu: "bg-background shadow-soft-shadow-1",
2452
+ menu2: "overflow-x-auto scroll-smooth",
2453
+ breadcrumb: ""
2454
+ };
2455
+ var Menu = (0, import_react11.forwardRef)(
2456
+ ({
2457
+ className,
2458
+ children,
2459
+ defaultValue,
2460
+ value: propValue,
2461
+ variant = "menu",
2462
+ onValueChange,
2463
+ ...props
2464
+ }, ref) => {
2465
+ const storeRef = (0, import_react11.useRef)(null);
2466
+ storeRef.current ??= createMenuStore();
2467
+ const store = storeRef.current;
2468
+ const { setValue, value } = (0, import_zustand4.useStore)(store, (s) => s);
2469
+ (0, import_react11.useEffect)(() => {
2470
+ setValue(propValue ?? defaultValue);
2471
+ }, [defaultValue, propValue, setValue]);
2472
+ (0, import_react11.useEffect)(() => {
2473
+ onValueChange?.(value);
2474
+ }, [value, onValueChange]);
2475
+ const baseClasses = "w-full flex flex-row items-center gap-2 py-2 px-6";
2476
+ const variantClasses = VARIANT_CLASSES5[variant];
2477
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2478
+ "ul",
2479
+ {
2480
+ ref,
2481
+ className: `
2482
+ ${baseClasses}
2483
+ ${variantClasses}
2484
+ ${className ?? ""}
2485
+ `,
2486
+ style: variant === "menu2" ? { scrollbarWidth: "none", msOverflowStyle: "none" } : void 0,
2487
+ ...props,
2488
+ children: injectStore3(children, store)
2489
+ }
2490
+ );
2491
+ }
2492
+ );
2493
+ Menu.displayName = "Menu";
2494
+ var MenuItem = (0, import_react11.forwardRef)(
2495
+ ({
2496
+ className,
2497
+ children,
2498
+ value,
2499
+ disabled = false,
2500
+ store: externalStore,
2501
+ variant = "menu",
2502
+ ...props
2503
+ }, ref) => {
2504
+ const store = useMenuStore(externalStore);
2505
+ const { value: selectedValue, setValue } = (0, import_zustand4.useStore)(store, (s) => s);
2506
+ const handleClick = (e) => {
2507
+ if (!disabled) setValue(value);
2508
+ props.onClick?.(e);
2509
+ };
2510
+ const commonProps = {
2511
+ role: "menuitem",
2512
+ "aria-disabled": disabled,
2513
+ ref,
2514
+ onClick: handleClick,
2515
+ onKeyDown: (e) => {
2516
+ if (["Enter", " "].includes(e.key)) handleClick(e);
2517
+ },
2518
+ tabIndex: disabled ? -1 : 0,
2519
+ ...props
2520
+ };
2521
+ const variants = {
2522
+ menu: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2523
+ "li",
2524
+ {
2525
+ "data-variant": "menu",
2526
+ className: `
2527
+ w-full flex flex-col gap-0.5 items-center py-1 px-2 rounded-sm font-medium text-xs
2528
+ [&>svg]:size-6 cursor-pointer hover:bg-primary-600 hover:text-text
2529
+ focus:outline-none focus:border-2-indicator-info focus:border-2
2530
+ ${selectedValue === value ? "bg-primary-50 text-primary-950" : "text-text-950"}
2531
+ ${className ?? ""}
2532
+ `,
2533
+ ...commonProps,
2534
+ children
2535
+ }
2536
+ ),
2537
+ menu2: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2538
+ "li",
2539
+ {
2540
+ "data-variant": "menu2",
2541
+ className: `
2542
+ flex flex-row items-center p-4 gap-2 border-b-2 border-transparent text-text-950 text-sx font-bold cursor-pointer
2543
+ ${selectedValue === value ? "border-b-primary-950" : ""}
2544
+ `,
2545
+ ...commonProps,
2546
+ children
2547
+ }
2548
+ ),
2549
+ breadcrumb: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2550
+ "li",
2551
+ {
2552
+ "data-variant": "breadcrumb",
2553
+ className: `
2554
+ p-2 rounded-lg hover:text-primary-600 cursor-pointer font-bold text-xs
2555
+ focus:outline-none focus:border-indicator-info focus:border-2
2556
+ ${selectedValue === value ? "text-primary-950" : "text-text-600"}
2557
+ ${className ?? ""}
2558
+ `,
2559
+ ...commonProps,
2560
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2561
+ "span",
2562
+ {
2563
+ className: `
2564
+ border-b border-text-600 hover:border-primary-600 text-inherit
2565
+ ${selectedValue === value ? "border-b-primary-950" : "border-b-primary-600"}
2566
+ `,
2567
+ children
2568
+ }
2569
+ )
2570
+ }
2571
+ )
2572
+ };
2573
+ return variants[variant] ?? variants["menu"];
2574
+ }
2575
+ );
2576
+ MenuItem.displayName = "MenuItem";
2577
+ var MenuSeparator = (0, import_react11.forwardRef)(
2578
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2579
+ "li",
2580
+ {
2581
+ ref,
2582
+ "aria-hidden": "true",
2583
+ className: `[&>svg]:w-4 [&>svg]:h-4 text-text-600 ${className ?? ""}`,
2584
+ ...props,
2585
+ children: children ?? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_phosphor_react9.CaretRight, {})
2586
+ }
2587
+ )
2588
+ );
2589
+ MenuSeparator.displayName = "MenuSeparator";
2590
+ var injectStore3 = (children, store) => import_react11.Children.map(children, (child) => {
2591
+ if (!(0, import_react11.isValidElement)(child)) return child;
2592
+ const typedChild = child;
2593
+ const shouldInject = typedChild.type === MenuItem;
2594
+ return (0, import_react11.cloneElement)(typedChild, {
2595
+ ...shouldInject ? { store } : {},
2596
+ ...typedChild.props.children ? { children: injectStore3(typedChild.props.children, store) } : {}
2597
+ });
2598
+ });
2599
+ var Menu_default = Menu;
2462
2600
  // Annotate the CommonJS export names for ESM import in node:
2463
2601
  0 && (module.exports = {
2464
2602
  Alert,
@@ -2468,10 +2606,13 @@ var Select_default = Select;
2468
2606
  Chips,
2469
2607
  Divider,
2470
2608
  DropdownMenu,
2609
+ DropdownMenuItem,
2610
+ DropdownMenuSeparator,
2471
2611
  DropdownMenuTrigger,
2472
2612
  IconButton,
2473
2613
  IconRoundedButton,
2474
2614
  Input,
2615
+ Menu,
2475
2616
  MenuContent,
2476
2617
  MenuItem,
2477
2618
  MenuLabel,