hazo_ui 3.3.0 → 3.4.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/dist/index.js CHANGED
@@ -74,6 +74,7 @@ import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
74
74
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
75
75
  import { Toaster, toast } from 'sonner';
76
76
  export { toast as rawToast } from 'sonner';
77
+ import { useHazoState } from 'hazo_state/client';
77
78
 
78
79
  var __create = Object.create;
79
80
  var __defProp = Object.defineProperty;
@@ -7931,6 +7932,18 @@ function useFullscreen(elementRef) {
7931
7932
  }, [enter, exit]);
7932
7933
  return { isFullscreen: is_fullscreen, enter, exit, toggle };
7933
7934
  }
7935
+ function use_wake_lock(active) {
7936
+ const { acquired, request, release } = useWakeLock();
7937
+ useEffect(() => {
7938
+ if (active && !acquired) void request();
7939
+ if (!active && acquired) void release();
7940
+ }, [active, acquired, request, release]);
7941
+ }
7942
+ function use_fullscreen() {
7943
+ const ref = useRef(null);
7944
+ const { isFullscreen, toggle } = useFullscreen(ref);
7945
+ return { is_fullscreen: isFullscreen, toggle, ref };
7946
+ }
7934
7947
  function KanbanCard({
7935
7948
  item,
7936
7949
  renderCard,
@@ -10633,6 +10646,177 @@ function CelebrationModalInner({
10633
10646
  );
10634
10647
  }
10635
10648
 
10636
- export { ANIMATION_PRESETS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CELEBRATION_GRADIENT, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CelebrationProvider, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, CommandNodeExtension, CommandPill, CommandPopover, DateRangeSelector, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorBanner, ErrorPage, HazoContextProvider, HazoUiConfirmDialog, HazoUiDialog, DialogClose as HazoUiDialogClose, DialogContent as HazoUiDialogContent, DialogDescription as HazoUiDialogDescription, DialogFooter as HazoUiDialogFooter, DialogHeader as HazoUiDialogHeader, DialogOverlay as HazoUiDialogOverlay, DialogPortal as HazoUiDialogPortal, Dialog as HazoUiDialogRoot, DialogTitle as HazoUiDialogTitle, DialogTrigger as HazoUiDialogTrigger, HazoUiFlexInput, HazoUiFlexRadio, HazoUiKanban, HazoUiKanbanFilter, HazoUiMultiFilterDialog, HazoUiMultiSortDialog, HazoUiPillRadio, HazoUiRte, HazoUiTable, HazoUiTextarea, HazoUiTextbox, HazoUiToaster, HoverCard, HoverCardContent, HoverCardTrigger, Input, InverseSparkline, Label3 as Label, LineChart, LoadingTimeout, MarkdownEditor, MultiLineChart, Popover, PopoverContent, PopoverTrigger, ProgressiveImage, RadioGroup, RadioGroupItem, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Command as ShadcnCommand, CommandEmpty as ShadcnCommandEmpty, CommandGroup as ShadcnCommandGroup, CommandInput as ShadcnCommandInput, CommandItem as ShadcnCommandItem, CommandList as ShadcnCommandList, Skeleton, SkeletonBar, SkeletonCircle, SkeletonGroup, SkeletonRect, Sparkline, Spinner, StackedBars, Switch, Table2 as Table, TableBody, TableCaption, TableCell2 as TableCell, TableFooter, TableHead, TableHeader2 as TableHeader, TableRow2 as TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, applyKanbanFilter, buttonGroupVariants, celebrate, cn, create_command_suggestion_extension, errorToast, format_num, generateUUID, get_hazo_ui_config, get_logger, parse_commands_from_text, pick_x_label_indices, reset_hazo_ui_config, resolve_animation_classes, set_hazo_ui_config, set_logger, successToast, text_to_tiptap_content, toggleVariants, useClickOutside, useCopyToClipboard, useDebounce, useErrorDisplay, useFullscreen, useIsMobile, useLoadingState, useLocalStorage, useMediaQuery, useSessionStorage, useViewport, useWakeLock };
10649
+ // src/components/hazo_ui_eta_progress/eta.ts
10650
+ function median(values) {
10651
+ if (values.length === 0) return 0;
10652
+ const sorted = [...values].sort((a, b) => a - b);
10653
+ const mid = Math.floor(sorted.length / 2);
10654
+ return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
10655
+ }
10656
+ function computeEta(durationWindow, unitCount, concurrency = 1, fallbackUnitMs = 5e3) {
10657
+ const unitMs = durationWindow.length > 0 ? median(durationWindow) : fallbackUnitMs;
10658
+ return unitMs * Math.ceil(unitCount / Math.max(1, concurrency));
10659
+ }
10660
+ function easeToward(elapsed, eta, maxCap = 0.95) {
10661
+ if (eta <= 0 || elapsed <= 0) return 0;
10662
+ const t = elapsed / eta;
10663
+ return maxCap * (1 - Math.exp(-1.5 * t));
10664
+ }
10665
+ function HazoUiProgressBar({
10666
+ value,
10667
+ label,
10668
+ showPercent = false,
10669
+ size = 8,
10670
+ className
10671
+ }) {
10672
+ const pct = Math.round(Math.min(1, Math.max(0, value)) * 100);
10673
+ return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
10674
+ (label || showPercent) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-1", children: [
10675
+ label && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: label }),
10676
+ showPercent && /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground tabular-nums", children: [
10677
+ pct,
10678
+ "%"
10679
+ ] })
10680
+ ] }),
10681
+ /* @__PURE__ */ jsx(
10682
+ "div",
10683
+ {
10684
+ role: "progressbar",
10685
+ "aria-valuenow": pct,
10686
+ "aria-valuemin": 0,
10687
+ "aria-valuemax": 100,
10688
+ "aria-label": label,
10689
+ className: "w-full rounded-full overflow-hidden bg-muted",
10690
+ style: { height: size },
10691
+ children: /* @__PURE__ */ jsx(
10692
+ "div",
10693
+ {
10694
+ className: "h-full rounded-full bg-accent transition-[width] duration-200 ease-out motion-reduce:transition-none",
10695
+ style: { width: `${pct}%` }
10696
+ }
10697
+ )
10698
+ }
10699
+ )
10700
+ ] });
10701
+ }
10702
+ function useEtaProgress(opts) {
10703
+ const {
10704
+ unitCount,
10705
+ concurrency = 1,
10706
+ fallbackUnitMs = 5e3,
10707
+ loadDurations,
10708
+ appendDuration
10709
+ } = opts;
10710
+ const [value, setValue] = React26.useState(0);
10711
+ const stateRef = React26.useRef({
10712
+ started: false,
10713
+ finished: false,
10714
+ startTime: 0,
10715
+ unitsDone: 0,
10716
+ unitTimestamps: [],
10717
+ // timestamps of each unitDone() call
10718
+ eta: 0,
10719
+ rafId: 0
10720
+ });
10721
+ const stop = React26.useCallback(() => {
10722
+ if (stateRef.current.rafId) {
10723
+ cancelAnimationFrame(stateRef.current.rafId);
10724
+ stateRef.current.rafId = 0;
10725
+ }
10726
+ }, []);
10727
+ React26.useEffect(() => stop, [stop]);
10728
+ const tick = React26.useCallback(() => {
10729
+ const s = stateRef.current;
10730
+ if (s.finished || !s.started) return;
10731
+ const elapsed = Date.now() - s.startTime;
10732
+ const timeValue = easeToward(elapsed, s.eta);
10733
+ const unitValue = unitCount > 0 ? s.unitsDone / unitCount : 0;
10734
+ setValue(Math.max(timeValue, unitValue));
10735
+ s.rafId = requestAnimationFrame(tick);
10736
+ }, [unitCount]);
10737
+ const start = React26.useCallback(() => {
10738
+ const s = stateRef.current;
10739
+ if (s.started) return;
10740
+ const window2 = loadDurations();
10741
+ const eta = computeEta(window2, unitCount, concurrency, fallbackUnitMs);
10742
+ s.started = true;
10743
+ s.finished = false;
10744
+ s.startTime = Date.now();
10745
+ s.unitsDone = 0;
10746
+ s.unitTimestamps = [];
10747
+ s.eta = eta;
10748
+ stop();
10749
+ s.rafId = requestAnimationFrame(tick);
10750
+ }, [loadDurations, unitCount, concurrency, fallbackUnitMs, stop, tick]);
10751
+ const unitDone = React26.useCallback(() => {
10752
+ const s = stateRef.current;
10753
+ if (!s.started || s.finished) return;
10754
+ s.unitsDone = Math.min(s.unitsDone + 1, unitCount);
10755
+ s.unitTimestamps.push(Date.now());
10756
+ }, [unitCount]);
10757
+ const finish = React26.useCallback(() => {
10758
+ const s = stateRef.current;
10759
+ if (s.finished) return;
10760
+ s.finished = true;
10761
+ stop();
10762
+ setValue(1);
10763
+ if (s.started && s.unitTimestamps.length > 0) {
10764
+ const totalMs = Date.now() - s.startTime;
10765
+ const perUnitMs = totalMs / Math.ceil(unitCount / Math.max(1, concurrency));
10766
+ appendDuration(perUnitMs);
10767
+ }
10768
+ s.started = false;
10769
+ s.unitsDone = 0;
10770
+ }, [stop, unitCount, concurrency, appendDuration]);
10771
+ return { value, start, unitDone, finish };
10772
+ }
10773
+ function HazoUiEtaProgress({
10774
+ estimateKey,
10775
+ unitCount,
10776
+ concurrency = 1,
10777
+ windowSize = 5,
10778
+ fallbackUnitMs = 5e3,
10779
+ level = "global",
10780
+ label,
10781
+ endpoint,
10782
+ handleRef,
10783
+ className
10784
+ }) {
10785
+ const { value: stored, append } = useHazoState(estimateKey, {
10786
+ level,
10787
+ fallback: [],
10788
+ ...endpoint ? { endpoint } : {}
10789
+ });
10790
+ const durationWindow = Array.isArray(stored) ? stored : [];
10791
+ const loadDurations = React26.useCallback(() => durationWindow, [durationWindow]);
10792
+ const appendDuration = React26.useCallback(
10793
+ (ms) => {
10794
+ append(ms, windowSize);
10795
+ },
10796
+ [append, windowSize]
10797
+ );
10798
+ const handle = useEtaProgress({
10799
+ unitCount,
10800
+ concurrency,
10801
+ fallbackUnitMs,
10802
+ loadDurations,
10803
+ appendDuration
10804
+ });
10805
+ React26.useEffect(() => {
10806
+ if (handleRef) {
10807
+ handleRef.current = handle;
10808
+ }
10809
+ }, [handleRef, handle]);
10810
+ return /* @__PURE__ */ jsx(
10811
+ HazoUiProgressBar,
10812
+ {
10813
+ value: handle.value,
10814
+ label,
10815
+ className
10816
+ }
10817
+ );
10818
+ }
10819
+
10820
+ export { ANIMATION_PRESETS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CELEBRATION_GRADIENT, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CelebrationProvider, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, CommandNodeExtension, CommandPill, CommandPopover, DateRangeSelector, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorBanner, ErrorPage, HazoContextProvider, HazoUiConfirmDialog, HazoUiDialog, DialogClose as HazoUiDialogClose, DialogContent as HazoUiDialogContent, DialogDescription as HazoUiDialogDescription, DialogFooter as HazoUiDialogFooter, DialogHeader as HazoUiDialogHeader, DialogOverlay as HazoUiDialogOverlay, DialogPortal as HazoUiDialogPortal, Dialog as HazoUiDialogRoot, DialogTitle as HazoUiDialogTitle, DialogTrigger as HazoUiDialogTrigger, HazoUiEtaProgress, HazoUiFlexInput, HazoUiFlexRadio, HazoUiKanban, HazoUiKanbanFilter, HazoUiMultiFilterDialog, HazoUiMultiSortDialog, HazoUiPillRadio, HazoUiProgressBar, HazoUiRte, HazoUiTable, HazoUiTextarea, HazoUiTextbox, HazoUiToaster, HoverCard, HoverCardContent, HoverCardTrigger, Input, InverseSparkline, Label3 as Label, LineChart, LoadingTimeout, MarkdownEditor, MultiLineChart, Popover, PopoverContent, PopoverTrigger, ProgressiveImage, RadioGroup, RadioGroupItem, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Command as ShadcnCommand, CommandEmpty as ShadcnCommandEmpty, CommandGroup as ShadcnCommandGroup, CommandInput as ShadcnCommandInput, CommandItem as ShadcnCommandItem, CommandList as ShadcnCommandList, Skeleton, SkeletonBar, SkeletonCircle, SkeletonGroup, SkeletonRect, Sparkline, Spinner, StackedBars, Switch, Table2 as Table, TableBody, TableCaption, TableCell2 as TableCell, TableFooter, TableHead, TableHeader2 as TableHeader, TableRow2 as TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, applyKanbanFilter, buttonGroupVariants, celebrate, cn, computeEta, create_command_suggestion_extension, easeToward, errorToast, format_num, generateUUID, get_hazo_ui_config, get_logger, median, parse_commands_from_text, pick_x_label_indices, reset_hazo_ui_config, resolve_animation_classes, set_hazo_ui_config, set_logger, successToast, text_to_tiptap_content, toggleVariants, useClickOutside, useCopyToClipboard, useDebounce, useErrorDisplay, useEtaProgress, useFullscreen, useIsMobile, useLoadingState, useLocalStorage, useMediaQuery, useSessionStorage, useViewport, useWakeLock, use_fullscreen, use_wake_lock };
10637
10821
  //# sourceMappingURL=index.js.map
10638
10822
  //# sourceMappingURL=index.js.map