@fluid-app/rep-core 0.1.0 → 0.1.2
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/chunk-2IFFXFJL.js +621 -0
- package/dist/chunk-2IFFXFJL.js.map +1 -0
- package/dist/chunk-2SIG55BD.cjs +131 -0
- package/dist/chunk-2SIG55BD.cjs.map +1 -0
- package/dist/chunk-2SPTFZRC.js +72 -0
- package/dist/chunk-2SPTFZRC.js.map +1 -0
- package/dist/chunk-3I5Y3PEO.js +23 -0
- package/dist/chunk-3I5Y3PEO.js.map +1 -0
- package/dist/chunk-46PUWB7C.cjs +69 -0
- package/dist/chunk-46PUWB7C.cjs.map +1 -0
- package/dist/chunk-4WFDFEHC.js +134 -0
- package/dist/chunk-4WFDFEHC.js.map +1 -0
- package/dist/chunk-5NYM4UTW.cjs +58 -0
- package/dist/chunk-5NYM4UTW.cjs.map +1 -0
- package/dist/chunk-BWHUEED3.cjs +32 -0
- package/dist/chunk-BWHUEED3.cjs.map +1 -0
- package/dist/chunk-CMXYKDHC.cjs +666 -0
- package/dist/chunk-CMXYKDHC.cjs.map +1 -0
- package/dist/chunk-ESYAYVNK.cjs +136 -0
- package/dist/chunk-ESYAYVNK.cjs.map +1 -0
- package/dist/{chunk-6QLUUNJL.cjs → chunk-GDY76JA6.cjs} +2 -2
- package/dist/chunk-GDY76JA6.cjs.map +1 -0
- package/dist/chunk-HGVSPZEL.cjs +119 -0
- package/dist/chunk-HGVSPZEL.cjs.map +1 -0
- package/dist/chunk-HIDJYVKJ.js +54 -0
- package/dist/chunk-HIDJYVKJ.js.map +1 -0
- package/dist/chunk-HUR3MSO4.js +25 -0
- package/dist/chunk-HUR3MSO4.js.map +1 -0
- package/dist/chunk-LVLNO2YQ.cjs +28 -0
- package/dist/chunk-LVLNO2YQ.cjs.map +1 -0
- package/dist/chunk-N2K6W7FX.cjs +169 -0
- package/dist/chunk-N2K6W7FX.cjs.map +1 -0
- package/dist/chunk-NAMNXRI5.js +129 -0
- package/dist/chunk-NAMNXRI5.js.map +1 -0
- package/dist/chunk-OWU7MFJ2.cjs +15 -0
- package/dist/chunk-OWU7MFJ2.cjs.map +1 -0
- package/dist/chunk-PVTQWD4I.js +166 -0
- package/dist/chunk-PVTQWD4I.js.map +1 -0
- package/dist/chunk-PZ6BM57A.js +30 -0
- package/dist/chunk-PZ6BM57A.js.map +1 -0
- package/dist/chunk-SJQPHJL4.cjs +26 -0
- package/dist/chunk-SJQPHJL4.cjs.map +1 -0
- package/dist/chunk-V7D3QUE6.cjs +42 -0
- package/dist/chunk-V7D3QUE6.cjs.map +1 -0
- package/dist/chunk-VRF7QEID.js +67 -0
- package/dist/chunk-VRF7QEID.js.map +1 -0
- package/dist/chunk-WASVMCZB.js +13 -0
- package/dist/chunk-WASVMCZB.js.map +1 -0
- package/dist/chunk-WYOHFNNW.js +117 -0
- package/dist/chunk-WYOHFNNW.js.map +1 -0
- package/dist/chunk-XCNBVV4T.js +38 -0
- package/dist/chunk-XCNBVV4T.js.map +1 -0
- package/dist/{chunk-EWR5EIBP.js → chunk-YKF5ZFF5.js} +2 -2
- package/dist/chunk-YKF5ZFF5.js.map +1 -0
- package/dist/chunk-YXJMBVXO.cjs +76 -0
- package/dist/chunk-YXJMBVXO.cjs.map +1 -0
- package/dist/data-sources/DataAwareWidget.cjs +59 -0
- package/dist/data-sources/DataAwareWidget.cjs.map +1 -0
- package/dist/data-sources/DataAwareWidget.d.cts +30 -0
- package/dist/data-sources/DataAwareWidget.d.ts +30 -0
- package/dist/data-sources/DataAwareWidget.js +57 -0
- package/dist/data-sources/DataAwareWidget.js.map +1 -0
- package/dist/data-sources/ErrorState.cjs +12 -0
- package/dist/data-sources/ErrorState.cjs.map +1 -0
- package/dist/data-sources/ErrorState.d.cts +5 -0
- package/dist/data-sources/ErrorState.d.ts +5 -0
- package/dist/data-sources/ErrorState.js +3 -0
- package/dist/data-sources/ErrorState.js.map +1 -0
- package/dist/data-sources/context.cjs +10 -20
- package/dist/data-sources/context.cjs.map +1 -1
- package/dist/data-sources/context.d.cts +2 -2
- package/dist/data-sources/context.d.ts +2 -2
- package/dist/data-sources/context.js +1 -21
- package/dist/data-sources/context.js.map +1 -1
- package/dist/data-sources/fetchers/api.cjs +12 -0
- package/dist/data-sources/fetchers/api.cjs.map +1 -0
- package/dist/data-sources/fetchers/api.d.cts +8 -0
- package/dist/data-sources/fetchers/api.d.ts +8 -0
- package/dist/data-sources/fetchers/api.js +3 -0
- package/dist/data-sources/fetchers/api.js.map +1 -0
- package/dist/data-sources/fetchers/custom.cjs +12 -0
- package/dist/data-sources/fetchers/custom.cjs.map +1 -0
- package/dist/data-sources/fetchers/custom.d.cts +15 -0
- package/dist/data-sources/fetchers/custom.d.ts +15 -0
- package/dist/data-sources/fetchers/custom.js +3 -0
- package/dist/data-sources/fetchers/custom.js.map +1 -0
- package/dist/data-sources/fetchers/static.cjs +16 -0
- package/dist/data-sources/fetchers/static.cjs.map +1 -0
- package/dist/data-sources/fetchers/static.d.cts +38 -0
- package/dist/data-sources/fetchers/static.d.ts +38 -0
- package/dist/data-sources/fetchers/static.js +3 -0
- package/dist/data-sources/fetchers/static.js.map +1 -0
- package/dist/data-sources/registry-context.cjs +26 -0
- package/dist/data-sources/registry-context.cjs.map +1 -0
- package/dist/data-sources/registry-context.d.cts +41 -0
- package/dist/data-sources/registry-context.d.ts +41 -0
- package/dist/data-sources/registry-context.js +9 -0
- package/dist/data-sources/registry-context.js.map +1 -0
- package/dist/data-sources/registry.cjs +20 -0
- package/dist/data-sources/registry.cjs.map +1 -0
- package/dist/data-sources/registry.d.cts +17 -0
- package/dist/data-sources/registry.d.ts +17 -0
- package/dist/data-sources/registry.js +7 -0
- package/dist/data-sources/registry.js.map +1 -0
- package/dist/data-sources/transformers.cjs +12 -0
- package/dist/data-sources/transformers.cjs.map +1 -0
- package/dist/data-sources/transformers.d.cts +23 -0
- package/dist/data-sources/transformers.d.ts +23 -0
- package/dist/data-sources/transformers.js +3 -0
- package/dist/data-sources/transformers.js.map +1 -0
- package/dist/data-sources/types.d.cts +37 -2
- package/dist/data-sources/types.d.ts +37 -2
- package/dist/data-sources/use-widget-data.cjs +19 -0
- package/dist/data-sources/use-widget-data.cjs.map +1 -0
- package/dist/data-sources/use-widget-data.d.cts +16 -0
- package/dist/data-sources/use-widget-data.d.ts +16 -0
- package/dist/data-sources/use-widget-data.js +10 -0
- package/dist/data-sources/use-widget-data.js.map +1 -0
- package/dist/registries/index.cjs +8 -15
- package/dist/registries/index.cjs.map +1 -1
- package/dist/registries/index.d.cts +20 -7
- package/dist/registries/index.d.ts +20 -7
- package/dist/registries/index.js +8 -15
- package/dist/registries/index.js.map +1 -1
- package/dist/shareable-item-DkgWpwoU.d.cts +21 -0
- package/dist/shareable-item-DkgWpwoU.d.ts +21 -0
- package/dist/shell/AppShellLayout.cjs +14 -0
- package/dist/shell/AppShellLayout.cjs.map +1 -0
- package/dist/shell/AppShellLayout.d.cts +30 -0
- package/dist/shell/AppShellLayout.d.ts +30 -0
- package/dist/shell/AppShellLayout.js +5 -0
- package/dist/shell/AppShellLayout.js.map +1 -0
- package/dist/shell/ThemeModeContext.cjs +20 -0
- package/dist/shell/ThemeModeContext.cjs.map +1 -0
- package/dist/shell/ThemeModeContext.d.cts +27 -0
- package/dist/shell/ThemeModeContext.d.ts +27 -0
- package/dist/shell/ThemeModeContext.js +3 -0
- package/dist/shell/ThemeModeContext.js.map +1 -0
- package/dist/shell/index.cjs +135 -0
- package/dist/shell/index.cjs.map +1 -0
- package/dist/shell/index.d.cts +8 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.js +6 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/sidebar.cjs +105 -0
- package/dist/shell/sidebar.cjs.map +1 -0
- package/dist/shell/sidebar.d.cts +73 -0
- package/dist/shell/sidebar.d.ts +73 -0
- package/dist/shell/sidebar.js +4 -0
- package/dist/shell/sidebar.js.map +1 -0
- package/dist/shell/use-mobile.cjs +20 -0
- package/dist/shell/use-mobile.cjs.map +1 -0
- package/dist/shell/use-mobile.d.cts +5 -0
- package/dist/shell/use-mobile.d.ts +5 -0
- package/dist/shell/use-mobile.js +3 -0
- package/dist/shell/use-mobile.js.map +1 -0
- package/dist/theme/index.cjs +599 -970
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.d.cts +106 -2655
- package/dist/theme/index.d.ts +106 -2655
- package/dist/theme/index.js +570 -917
- package/dist/theme/index.js.map +1 -1
- package/dist/types/index.cjs +17 -17
- package/dist/types/index.d.cts +28 -4
- package/dist/types/index.d.ts +28 -4
- package/dist/types/index.js +1 -1
- package/dist/types-R1kV_DKF.d.cts +80 -0
- package/dist/types-R1kV_DKF.d.ts +80 -0
- package/dist/{shareable-item-DPmNZkE1.d.cts → widget-schema-36uGUTWL.d.cts} +5 -21
- package/dist/{shareable-item-DPmNZkE1.d.ts → widget-schema-DxdlJD8E.d.ts} +5 -21
- package/dist/widget-utils/index.cjs +3 -3
- package/dist/widget-utils/index.d.cts +3 -1
- package/dist/widget-utils/index.d.ts +3 -1
- package/dist/widget-utils/index.js +1 -1
- package/package.json +84 -13
- package/dist/chunk-6QLUUNJL.cjs.map +0 -1
- package/dist/chunk-EWR5EIBP.js.map +0 -1
- package/dist/theme-DrMUYZTO.d.cts +0 -22
- package/dist/theme-DrMUYZTO.d.ts +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/sidebar.tsx"],"names":["open"],"mappings":"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","file":"chunk-2IFFXFJL.js","sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { type VariantProps, cva } from \"class-variance-authority\";\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport * as React from \"react\";\n\nimport { useIsMobile } from \"./use-mobile\";\n\n// ---------------------------------------------------------------------------\n// Inlined utilities (avoid importing from builder's UI kit)\n// ---------------------------------------------------------------------------\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentPropsWithRef<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n}) {\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full w-px\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SIDEBAR_WIDTH = \"13rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\n// ---------------------------------------------------------------------------\n// Sidebar Context\n// ---------------------------------------------------------------------------\n\ntype SidebarContextValue = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n isPreviewMode: boolean;\n useBottomNav: boolean;\n};\n\nexport const SidebarContext = React.createContext<SidebarContextValue | null>(\n null,\n);\n\nfunction useSidebar(): SidebarContextValue {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\n// ---------------------------------------------------------------------------\n// SidebarProvider\n// ---------------------------------------------------------------------------\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n viewportWidth?: number;\n previewMode?: boolean;\n useBottomNav?: boolean;\n }\n>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n viewportWidth,\n previewMode,\n useBottomNav: useBottomNavProp = false,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const windowIsMobile = useIsMobile();\n // Use viewportWidth if provided, otherwise use actual window detection\n const isMobile =\n viewportWidth !== undefined ? viewportWidth < 768 : windowIsMobile;\n // Preview mode is active when viewportWidth is provided\n const isPreviewMode = viewportWidth !== undefined || !!previewMode;\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n // check if composer is focused - if so, let the composer handle the shortcut\n const activeElement = document.activeElement;\n const isComposerFocused =\n activeElement?.closest(\".group\\\\/composer\") ||\n activeElement?.closest(\"[data-toolbar]\") ||\n activeElement?.classList.contains(\"ProseMirror\");\n\n if (isComposerFocused) {\n return; // let the composer handle the shortcut\n }\n\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextValue>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n isPreviewMode,\n useBottomNav: useBottomNavProp,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n isPreviewMode,\n useBottomNavProp,\n ],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-0 w-full flex-1\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n },\n);\nSidebarProvider.displayName = \"SidebarProvider\";\n\n// ---------------------------------------------------------------------------\n// Sidebar\n// ---------------------------------------------------------------------------\n\nconst Sidebar = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n }\n>(\n (\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const {\n isMobile,\n state,\n openMobile,\n setOpenMobile,\n isPreviewMode,\n useBottomNav,\n } = useSidebar();\n\n // Define CSS variables for expanded and collapsed sidebar widths\n const sidebarWidth =\n state === \"expanded\" ? SIDEBAR_WIDTH : SIDEBAR_WIDTH_ICON;\n\n // When bottom nav is active on mobile, hide the sidebar entirely\n if (useBottomNav && isMobile) {\n return null;\n }\n\n if (collapsible === \"none\") {\n return (\n <div\n className={cn(\n \"flex w-(--sidebar-width) flex-col rounded-tl-lg bg-sidebar text-sidebar-foreground\",\n isPreviewMode ? \"h-full\" : \"h-[97vh]\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n // For mobile, render a slide-out sidebar with overlay\n // Use absolute positioning in preview mode so it stays within the preview container\n const positionClass = isPreviewMode ? \"absolute\" : \"fixed\";\n return (\n <>\n {/* Overlay - only visible when sidebar is open */}\n {openMobile && (\n <div\n className={cn(positionClass, \"inset-0 z-40 bg-black/50\")}\n onClick={() => setOpenMobile(false)}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Sidebar - slides in from left */}\n <div\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className={cn(\n positionClass,\n \"top-0 left-0 z-50 h-full w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground transition-transform duration-300 ease-in-out\",\n openMobile ? \"translate-x-0\" : \"-translate-x-full\",\n className,\n )}\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n ref={ref}\n {...props}\n >\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </div>\n </>\n );\n }\n\n return (\n <div\n ref={ref}\n className=\"group peer hidden bg-sidebar text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n style={\n {\n \"--sidebar-width\": sidebarWidth,\n } as React.CSSProperties\n }\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n className={cn(\n \"relative bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n className={cn(\n \"relative inset-y-0 z-[20] hidden w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n isPreviewMode ? \"h-full\" : \"h-svh\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className=\"flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n },\n);\nSidebar.displayName = \"Sidebar\";\n\n// ---------------------------------------------------------------------------\n// SidebarRail\n// ---------------------------------------------------------------------------\n\nconst SidebarRail = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-[10] hidden w-4 -translate-x-full transition-all ease-linear group-data-[side=left]:-right-[1.375rem] group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarRail.displayName = \"SidebarRail\";\n\n// ---------------------------------------------------------------------------\n// SidebarInset\n// ---------------------------------------------------------------------------\n\nconst SidebarInset = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n const { isPreviewMode, isMobile, useBottomNav } = useSidebar();\n return (\n <main\n ref={ref}\n className={cn(\n \"relative flex flex-1 flex-col\",\n isPreviewMode\n ? \"max-h-[calc(100svh-(--spacing(13)))]\"\n : \"min-h-svh peer-data-[variant=inset]:min-h-[calc(100svh-(--spacing(4)))]\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n useBottomNav &&\n isMobile &&\n \"pb-[calc(4rem+env(safe-area-inset-bottom))]\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInset.displayName = \"SidebarInset\";\n\n// ---------------------------------------------------------------------------\n// SidebarInput\n// ---------------------------------------------------------------------------\n\nconst SidebarInput = React.forwardRef<\n HTMLInputElement,\n React.ComponentProps<\"input\">\n>(({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n \"h-8 w-full rounded-md border bg-background px-3 text-sm shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring focus-visible:outline-none\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarInput.displayName = \"SidebarInput\";\n\n// ---------------------------------------------------------------------------\n// SidebarHeader / Footer\n// ---------------------------------------------------------------------------\n\nconst SidebarHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarHeader.displayName = \"SidebarHeader\";\n\nconst SidebarFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n});\nSidebarFooter.displayName = \"SidebarFooter\";\n\n// ---------------------------------------------------------------------------\n// SidebarSeparator\n// ---------------------------------------------------------------------------\n\nconst SidebarSeparator = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n }\n>(({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n});\nSidebarSeparator.displayName = \"SidebarSeparator\";\n\n// ---------------------------------------------------------------------------\n// SidebarContent\n// ---------------------------------------------------------------------------\n\nconst SidebarContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n \"scrollbar-none flex min-h-0 flex-1 flex-col gap-2 overflow-auto rounded group-data-[collapsible=icon]:gap-0 group-data-[collapsible=icon]:overflow-hidden group-data-[collapsible=icon]:pt-3\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarContent.displayName = \"SidebarContent\";\n\n// ---------------------------------------------------------------------------\n// SidebarGroup\n// ---------------------------------------------------------------------------\n\nconst SidebarGroup = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn(\n \"relative flex w-full min-w-0 flex-col p-2 group-data-[collapsible=icon]:py-0 group-data-[collapsible=icon]:pt-4\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroup.displayName = \"SidebarGroup\";\n\nconst SidebarGroupLabel = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\";\n\nconst SidebarGroupAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarGroupAction.displayName = \"SidebarGroupAction\";\n\nconst SidebarGroupContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n));\nSidebarGroupContent.displayName = \"SidebarGroupContent\";\n\n// ---------------------------------------------------------------------------\n// SidebarMenu\n// ---------------------------------------------------------------------------\n\nconst SidebarMenu = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n));\nSidebarMenu.displayName = \"SidebarMenu\";\n\nconst SidebarMenuItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n));\nSidebarMenuItem.displayName = \"SidebarMenuItem\";\n\n// ---------------------------------------------------------------------------\n// SidebarMenuButton\n// ---------------------------------------------------------------------------\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-primary hover:text-sidebar-primary-foreground focus-visible:ring-2 active:bg-sidebar-primary active:text-sidebar-primary-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-primary data-[active=true]:font-medium data-[active=true]:text-sidebar-primary-foreground data-[state=open]:hover:bg-sidebar-primary data-[state=open]:hover:text-sidebar-primary-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\",\n outline:\n \"shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-primary hover:text-sidebar-primary-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-primary))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n className,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n return button;\n },\n);\nSidebarMenuButton.displayName = \"SidebarMenuButton\";\n\n// ---------------------------------------------------------------------------\n// SidebarMenuAction / Badge / Skeleton\n// ---------------------------------------------------------------------------\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuAction.displayName = \"SidebarMenuAction\";\n\nconst SidebarMenuBadge = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n));\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\";\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n});\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\";\n\n// ---------------------------------------------------------------------------\n// SidebarMenuSub\n// ---------------------------------------------------------------------------\n\nconst SidebarMenuSub = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n));\nSidebarMenuSub.displayName = \"SidebarMenuSub\";\n\nconst SidebarMenuSubItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />);\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\";\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n});\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\";\n\n// ---------------------------------------------------------------------------\n// Exports\n// ---------------------------------------------------------------------------\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n useSidebar,\n};\n"]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/data-sources/transformers.ts
|
|
4
|
+
function extractImageUrl(d) {
|
|
5
|
+
if (d.image_url) return d.image_url;
|
|
6
|
+
if (d.imageUrl) return d.imageUrl;
|
|
7
|
+
if (d.thumbnail_url) return d.thumbnail_url;
|
|
8
|
+
if (d.src) return d.src;
|
|
9
|
+
const images = d.images;
|
|
10
|
+
if (images && images.length > 0) {
|
|
11
|
+
const firstImage = images[0];
|
|
12
|
+
if (firstImage?.image_url) return firstImage.image_url;
|
|
13
|
+
if (firstImage?.url) return firstImage.url;
|
|
14
|
+
}
|
|
15
|
+
const libraryItems = d.library_items;
|
|
16
|
+
if (libraryItems && libraryItems.length > 0) {
|
|
17
|
+
const firstItem = libraryItems[0];
|
|
18
|
+
const relateable = firstItem?.relateable;
|
|
19
|
+
if (relateable?.image_url) return relateable.image_url;
|
|
20
|
+
if (relateable?.imageUrl) return relateable.imageUrl;
|
|
21
|
+
if (relateable?.thumbnail_url) return relateable.thumbnail_url;
|
|
22
|
+
}
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
function extractDescription(d) {
|
|
26
|
+
const desc = d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? "";
|
|
27
|
+
if (typeof desc === "object" && desc !== null && "body" in desc) {
|
|
28
|
+
return desc.body ?? "";
|
|
29
|
+
}
|
|
30
|
+
return desc;
|
|
31
|
+
}
|
|
32
|
+
function extractCustomWidgetConfig(d, source) {
|
|
33
|
+
if (source === void 0 || source.type !== "custom") return {};
|
|
34
|
+
const selectedItem = source.selectedItems.find(
|
|
35
|
+
(s) => String(s.id) === String(d.id)
|
|
36
|
+
);
|
|
37
|
+
return selectedItem?.widgetConfig ?? {};
|
|
38
|
+
}
|
|
39
|
+
var toImagePropsFromShareable = (data) => {
|
|
40
|
+
const item = Array.isArray(data) ? data[0] : data;
|
|
41
|
+
if (!item || typeof item !== "object") {
|
|
42
|
+
return { src: "", alt: "Image", objectFit: "cover" };
|
|
43
|
+
}
|
|
44
|
+
const d = item;
|
|
45
|
+
return {
|
|
46
|
+
src: extractImageUrl(d),
|
|
47
|
+
alt: d.title ?? d.name ?? d.alt ?? "Image",
|
|
48
|
+
objectFit: "cover"
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
var toVideoPropsFromShareable = (data) => {
|
|
52
|
+
const item = Array.isArray(data) ? data[0] : data;
|
|
53
|
+
if (!item || typeof item !== "object") {
|
|
54
|
+
return { src: "", poster: "", caption: "" };
|
|
55
|
+
}
|
|
56
|
+
const d = item;
|
|
57
|
+
return {
|
|
58
|
+
src: (d.video_url ?? d.videoUrl ?? d.src) || "",
|
|
59
|
+
poster: extractImageUrl(d),
|
|
60
|
+
caption: d.title ?? d.name ?? d.caption ?? ""
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
var toShareableProps = (data, source) => {
|
|
64
|
+
if (!Array.isArray(data)) return [];
|
|
65
|
+
return data.map((item) => {
|
|
66
|
+
const d = item;
|
|
67
|
+
const widgetConfig = extractCustomWidgetConfig(d, source);
|
|
68
|
+
return {
|
|
69
|
+
id: d.id,
|
|
70
|
+
title: d.title ?? d.name ?? "",
|
|
71
|
+
description: extractDescription(d),
|
|
72
|
+
imageUrl: extractImageUrl(d),
|
|
73
|
+
videoUrl: (d.video_url ?? d.videoUrl) || null,
|
|
74
|
+
shareableType: d.type ?? d.relateable_type ?? d.shareableType ?? "",
|
|
75
|
+
kind: d.kind ?? "image",
|
|
76
|
+
status: d.status ?? "active",
|
|
77
|
+
price: d.display_price ?? d.price ?? null,
|
|
78
|
+
wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,
|
|
79
|
+
subscriptionPrice: d.subscription_price ?? null,
|
|
80
|
+
outOfStock: d.out_of_stock ?? false,
|
|
81
|
+
lowInStock: d.low_in_stock ?? false,
|
|
82
|
+
...d,
|
|
83
|
+
...widgetConfig
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
var toCarouselSlidesFromShareables = (data, source) => {
|
|
88
|
+
if (!Array.isArray(data)) return [];
|
|
89
|
+
return data.map((item, index) => {
|
|
90
|
+
const d = item;
|
|
91
|
+
const widgetConfig = extractCustomWidgetConfig(d, source);
|
|
92
|
+
const imageUrl = extractImageUrl(d);
|
|
93
|
+
const isVideo = d.kind === "video" || d.videoUrl || d.video_url;
|
|
94
|
+
const title = d.title ?? d.name ?? "";
|
|
95
|
+
const content = isVideo ? {
|
|
96
|
+
type: "VideoWidget",
|
|
97
|
+
props: {
|
|
98
|
+
src: (d.videoUrl ?? d.video_url) || "",
|
|
99
|
+
poster: imageUrl,
|
|
100
|
+
caption: title
|
|
101
|
+
}
|
|
102
|
+
} : {
|
|
103
|
+
type: "ImageWidget",
|
|
104
|
+
props: {
|
|
105
|
+
src: imageUrl,
|
|
106
|
+
alt: title || "Slide image",
|
|
107
|
+
objectFit: "cover"
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const baseSlide = {
|
|
111
|
+
id: String(d.id ?? `slide-${index}`),
|
|
112
|
+
content,
|
|
113
|
+
title,
|
|
114
|
+
description: extractDescription(d)
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
...baseSlide,
|
|
118
|
+
...widgetConfig
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
var WIDGET_TRANSFORMERS = {
|
|
123
|
+
toShareableProps,
|
|
124
|
+
toCarouselSlidesFromShareables,
|
|
125
|
+
toImagePropsFromShareable,
|
|
126
|
+
toVideoPropsFromShareable
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
exports.WIDGET_TRANSFORMERS = WIDGET_TRANSFORMERS;
|
|
130
|
+
//# sourceMappingURL=chunk-2SIG55BD.cjs.map
|
|
131
|
+
//# sourceMappingURL=chunk-2SIG55BD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/transformers.ts"],"names":[],"mappings":"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","file":"chunk-2SIG55BD.cjs","sourcesContent":["/**\n * Widget Transformers\n *\n * Transform functions that map API response data to widget-specific prop shapes.\n * Each widget has one transformer that handles all data structure variants:\n * - Standard: Direct field name match\n * - Legacy: Different field names that need mapping\n * - Minimal: Bare minimum fields that need defaults\n *\n * Usage:\n * 1. Transformers are registered in the DataSourceRegistry\n * 2. Reference by name in ApiDataSource.transform\n * 3. Applied after resultPath extraction, before targetProps assignment\n */\n\nimport type { DataTransformer, DataSource } from \"./types\";\n\n/**\n * Helper to extract image URL from various API response structures.\n * Handles:\n * - Flat fields (Medium, Page, Product): image_url, imageUrl, thumbnail_url, src\n * - Nested images array (EnrollmentPack): images[0].image_url\n * - Nested library_items (Library): library_items[0].relateable.image_url\n */\nfunction extractImageUrl(d: Record<string, unknown>): string {\n // Try flat fields first (Medium, Page, Product)\n if (d.image_url) return d.image_url as string;\n if (d.imageUrl) return d.imageUrl as string;\n if (d.thumbnail_url) return d.thumbnail_url as string;\n if (d.src) return d.src as string;\n\n // Try nested images array (EnrollmentPack)\n const images = d.images as Array<Record<string, unknown>> | undefined;\n if (images && images.length > 0) {\n const firstImage = images[0];\n if (firstImage?.image_url) return firstImage.image_url as string;\n if (firstImage?.url) return firstImage.url as string;\n }\n\n // Try nested library_items (Library/Playlist)\n const libraryItems = d.library_items as\n | Array<Record<string, unknown>>\n | undefined;\n if (libraryItems && libraryItems.length > 0) {\n const firstItem = libraryItems[0];\n const relateable = firstItem?.relateable as\n | Record<string, unknown>\n | undefined;\n if (relateable?.image_url) return relateable.image_url as string;\n if (relateable?.imageUrl) return relateable.imageUrl as string;\n if (relateable?.thumbnail_url) return relateable.thumbnail_url as string;\n }\n\n return \"\";\n}\n\n/**\n * Helper to extract description from various API response structures.\n * Handles different field names across endpoints.\n */\nfunction extractDescription(d: Record<string, unknown>): string {\n // Try various description field names\n const desc =\n d.description ?? d.stripped ?? d.stripped_description ?? d.body ?? \"\";\n\n // Handle nested description object (some APIs return { body: \"...\" })\n if (typeof desc === \"object\" && desc !== null && \"body\" in desc) {\n return ((desc as Record<string, unknown>).body as string) ?? \"\";\n }\n\n return desc as string;\n}\n\n/**\n * Helper to extract custom widget config from a selected item.\n */\nfunction extractCustomWidgetConfig(\n d: Record<string, unknown>,\n source: DataSource | undefined,\n): Record<string, unknown> {\n if (source === undefined || source.type !== \"custom\") return {};\n\n const selectedItem = source.selectedItems.find(\n (s) => String(s.id) === String(d.id),\n );\n return selectedItem?.widgetConfig ?? {};\n}\n\n/**\n * ImageWidget transformer from shareable data\n */\nconst toImagePropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", alt: \"Image\", objectFit: \"cover\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: extractImageUrl(d),\n alt: (d.title ?? d.name ?? d.alt ?? \"Image\") as string,\n objectFit: \"cover\" as const,\n };\n};\n\n/**\n * VideoWidget transformer from shareable data\n */\nconst toVideoPropsFromShareable: DataTransformer = (data) => {\n const item = Array.isArray(data) ? data[0] : data;\n if (!item || typeof item !== \"object\") {\n return { src: \"\", poster: \"\", caption: \"\" };\n }\n\n const d = item as Record<string, unknown>;\n return {\n src: ((d.video_url ?? d.videoUrl ?? d.src) as string) || \"\",\n poster: extractImageUrl(d),\n caption: (d.title ?? d.name ?? d.caption ?? \"\") as string,\n };\n};\n\n/**\n * Shareable content transformer\n * Normalizes shareable API responses to a consistent format\n */\nconst toShareableProps: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n return {\n id: d.id,\n title: (d.title ?? d.name ?? \"\") as string,\n description: extractDescription(d),\n imageUrl: extractImageUrl(d),\n videoUrl: ((d.video_url ?? d.videoUrl) as string) || null,\n shareableType: (d.type ??\n d.relateable_type ??\n d.shareableType ??\n \"\") as string,\n kind: (d.kind ?? \"image\") as string,\n status: (d.status ?? \"active\") as string,\n price: d.display_price ?? d.price ?? null,\n wholesalePrice: d.display_wholesale_price ?? d.wholesale_price ?? null,\n subscriptionPrice: d.subscription_price ?? null,\n outOfStock: d.out_of_stock ?? false,\n lowInStock: d.low_in_stock ?? false,\n ...d,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * Carousel slides from shareables transformer\n */\nconst toCarouselSlidesFromShareables: DataTransformer = (data, source) => {\n if (!Array.isArray(data)) return [];\n\n return data.map((item: unknown, index: number) => {\n const d = item as Record<string, unknown>;\n\n const widgetConfig = extractCustomWidgetConfig(d, source);\n\n const imageUrl = extractImageUrl(d);\n const isVideo = d.kind === \"video\" || d.videoUrl || d.video_url;\n const title = (d.title ?? d.name ?? \"\") as string;\n\n const content = isVideo\n ? {\n type: \"VideoWidget\",\n props: {\n src: ((d.videoUrl ?? d.video_url) as string) || \"\",\n poster: imageUrl,\n caption: title,\n },\n }\n : {\n type: \"ImageWidget\",\n props: {\n src: imageUrl,\n alt: title || \"Slide image\",\n objectFit: \"cover\",\n },\n };\n\n const baseSlide = {\n id: String(d.id ?? `slide-${index}`),\n content,\n title,\n description: extractDescription(d),\n };\n\n return {\n ...baseSlide,\n ...widgetConfig,\n };\n });\n};\n\n/**\n * All widget transformers bundled for registration\n */\nexport const WIDGET_TRANSFORMERS: Record<string, DataTransformer> = {\n toShareableProps,\n toCarouselSlidesFromShareables,\n toImagePropsFromShareable,\n toVideoPropsFromShareable,\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createContext, useSyncExternalStore, useCallback, useMemo, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/shell/ThemeModeContext.tsx
|
|
5
|
+
var ThemeModeContext = createContext(null);
|
|
6
|
+
var darkMediaQuery = typeof window !== "undefined" ? window.matchMedia("(prefers-color-scheme: dark)") : null;
|
|
7
|
+
function subscribeToPrefersColorScheme(callback) {
|
|
8
|
+
darkMediaQuery?.addEventListener("change", callback);
|
|
9
|
+
return () => darkMediaQuery?.removeEventListener("change", callback);
|
|
10
|
+
}
|
|
11
|
+
function getSystemPrefersDark() {
|
|
12
|
+
return darkMediaQuery?.matches ?? false;
|
|
13
|
+
}
|
|
14
|
+
function getServerSnapshot() {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
function ThemeModeProvider({
|
|
18
|
+
children,
|
|
19
|
+
mode,
|
|
20
|
+
onModeChange,
|
|
21
|
+
autoModeEnabled = true
|
|
22
|
+
}) {
|
|
23
|
+
const systemPrefersDark = useSyncExternalStore(
|
|
24
|
+
subscribeToPrefersColorScheme,
|
|
25
|
+
getSystemPrefersDark,
|
|
26
|
+
getServerSnapshot
|
|
27
|
+
);
|
|
28
|
+
const systemMode = systemPrefersDark ? "dark" : "light";
|
|
29
|
+
const displayMode = mode === "auto" ? systemMode : mode;
|
|
30
|
+
const cycleMode = useCallback(() => {
|
|
31
|
+
if (autoModeEnabled) {
|
|
32
|
+
const target = displayMode === "light" ? "dark" : "light";
|
|
33
|
+
onModeChange(target === systemMode ? "auto" : target);
|
|
34
|
+
} else {
|
|
35
|
+
onModeChange(mode === "light" ? "dark" : "light");
|
|
36
|
+
}
|
|
37
|
+
}, [mode, displayMode, systemMode, onModeChange, autoModeEnabled]);
|
|
38
|
+
const dataAttribute = getThemeModeAttribute(mode);
|
|
39
|
+
const value = useMemo(
|
|
40
|
+
() => ({
|
|
41
|
+
mode,
|
|
42
|
+
displayMode,
|
|
43
|
+
setMode: onModeChange,
|
|
44
|
+
autoModeEnabled,
|
|
45
|
+
cycleMode,
|
|
46
|
+
dataAttribute
|
|
47
|
+
}),
|
|
48
|
+
[
|
|
49
|
+
mode,
|
|
50
|
+
displayMode,
|
|
51
|
+
onModeChange,
|
|
52
|
+
autoModeEnabled,
|
|
53
|
+
cycleMode,
|
|
54
|
+
dataAttribute
|
|
55
|
+
]
|
|
56
|
+
);
|
|
57
|
+
return /* @__PURE__ */ jsx(ThemeModeContext.Provider, { value, children });
|
|
58
|
+
}
|
|
59
|
+
function useThemeMode() {
|
|
60
|
+
const ctx = useContext(ThemeModeContext);
|
|
61
|
+
if (!ctx) {
|
|
62
|
+
throw new Error("useThemeMode must be used within a ThemeModeProvider");
|
|
63
|
+
}
|
|
64
|
+
return ctx;
|
|
65
|
+
}
|
|
66
|
+
function getThemeModeAttribute(mode) {
|
|
67
|
+
return mode === "auto" ? void 0 : mode;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { ThemeModeProvider, getThemeModeAttribute, useThemeMode };
|
|
71
|
+
//# sourceMappingURL=chunk-2SPTFZRC.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-2SPTFZRC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/ThemeModeContext.tsx"],"names":[],"mappings":";;;;AAwBA,IAAM,gBAAA,GAAmB,cAA4C,IAAI,CAAA;AAEzE,IAAM,iBACJ,OAAO,MAAA,KAAW,cACd,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,GAChD,IAAA;AAEN,SAAS,8BAA8B,QAAA,EAAsB;AAC3D,EAAA,cAAA,EAAgB,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACnD,EAAA,OAAO,MAAM,cAAA,EAAgB,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AACrE;AAEA,SAAS,oBAAA,GAAgC;AACvC,EAAA,OAAO,gBAAgB,OAAA,IAAW,KAAA;AACpC;AAEA,SAAS,iBAAA,GAA6B;AACpC,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA,GAAkB;AACpB,CAAA,EAA2B;AACzB,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAAA,IACxB,6BAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,UAAA,GAA0B,oBAAoB,MAAA,GAAS,OAAA;AAE7D,EAAA,MAAM,WAAA,GAA2B,IAAA,KAAS,MAAA,GAAS,UAAA,GAAa,IAAA;AAEhE,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,IAAI,eAAA,EAAiB;AAEnB,MAAA,MAAM,MAAA,GAAsB,WAAA,KAAgB,OAAA,GAAU,MAAA,GAAS,OAAA;AAC/D,MAAA,YAAA,CAAa,MAAA,KAAW,UAAA,GAAa,MAAA,GAAS,MAAM,CAAA;AAAA,IACtD,CAAA,MAAO;AAEL,MAAA,YAAA,CAAa,IAAA,KAAS,OAAA,GAAU,MAAA,GAAS,OAAO,CAAA;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,aAAa,UAAA,EAAY,YAAA,EAAc,eAAe,CAAC,CAAA;AAEjE,EAAA,MAAM,aAAA,GAAgB,sBAAsB,IAAI,CAAA;AAEhD,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO;AAAA,MACL,IAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MACT,eAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACE,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OACxB,QAAA,EACH,CAAA;AAEJ;AAGO,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,GAAA,GAAM,WAAW,gBAAgB,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAsB,IAAA,EAAqC;AACzE,EAAA,OAAO,IAAA,KAAS,SAAS,MAAA,GAAY,IAAA;AACvC","file":"chunk-2SPTFZRC.js","sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\n\nexport type ThemeMode = \"auto\" | \"light\" | \"dark\";\n\nexport type DisplayMode = \"light\" | \"dark\";\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n displayMode: DisplayMode;\n setMode: (mode: ThemeMode) => void;\n autoModeEnabled: boolean;\n cycleMode: () => void;\n dataAttribute: string | undefined;\n}\n\nconst ThemeModeContext = createContext<ThemeModeContextValue | null>(null);\n\nconst darkMediaQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\")\n : null;\n\nfunction subscribeToPrefersColorScheme(callback: () => void) {\n darkMediaQuery?.addEventListener(\"change\", callback);\n return () => darkMediaQuery?.removeEventListener(\"change\", callback);\n}\n\nfunction getSystemPrefersDark(): boolean {\n return darkMediaQuery?.matches ?? false;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\ninterface ThemeModeProviderProps {\n children: ReactNode;\n mode: ThemeMode;\n onModeChange: (mode: ThemeMode) => void;\n /** When false, auto mode is skipped in the cycle (light↔dark only). Default true. */\n autoModeEnabled?: boolean;\n}\n\nexport function ThemeModeProvider({\n children,\n mode,\n onModeChange,\n autoModeEnabled = true,\n}: ThemeModeProviderProps) {\n const systemPrefersDark = useSyncExternalStore(\n subscribeToPrefersColorScheme,\n getSystemPrefersDark,\n getServerSnapshot,\n );\n\n const systemMode: DisplayMode = systemPrefersDark ? \"dark\" : \"light\";\n\n const displayMode: DisplayMode = mode === \"auto\" ? systemMode : mode;\n\n const cycleMode = useCallback(() => {\n if (autoModeEnabled) {\n // Toggle displayed mode. If target matches system preference, use \"auto\".\n const target: DisplayMode = displayMode === \"light\" ? \"dark\" : \"light\";\n onModeChange(target === systemMode ? \"auto\" : target);\n } else {\n // light ↔ dark\n onModeChange(mode === \"light\" ? \"dark\" : \"light\");\n }\n }, [mode, displayMode, systemMode, onModeChange, autoModeEnabled]);\n\n const dataAttribute = getThemeModeAttribute(mode);\n\n const value = useMemo(\n () => ({\n mode,\n displayMode,\n setMode: onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n }),\n [\n mode,\n displayMode,\n onModeChange,\n autoModeEnabled,\n cycleMode,\n dataAttribute,\n ],\n );\n\n return (\n <ThemeModeContext.Provider value={value}>\n {children}\n </ThemeModeContext.Provider>\n );\n}\n\n/** Access the current theme mode, setter, and cycle helper. Must be used within a `ThemeModeProvider`. */\nexport function useThemeMode(): ThemeModeContextValue {\n const ctx = useContext(ThemeModeContext);\n if (!ctx) {\n throw new Error(\"useThemeMode must be used within a ThemeModeProvider\");\n }\n return ctx;\n}\n\n/** Maps a ThemeMode to the value for `data-theme-mode`. Returns undefined for \"auto\". */\nexport function getThemeModeAttribute(mode: ThemeMode): string | undefined {\n return mode === \"auto\" ? undefined : mode;\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createContext, useMemo, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/data-sources/context.tsx
|
|
5
|
+
var DataSourceContext = createContext({});
|
|
6
|
+
function DataSourceProvider({
|
|
7
|
+
baseUrl,
|
|
8
|
+
getApiHeaders,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
const value = useMemo(
|
|
12
|
+
() => ({ baseUrl, getApiHeaders }),
|
|
13
|
+
[baseUrl, getApiHeaders]
|
|
14
|
+
);
|
|
15
|
+
return /* @__PURE__ */ jsx(DataSourceContext.Provider, { value, children });
|
|
16
|
+
}
|
|
17
|
+
function useDataSourceConfig() {
|
|
18
|
+
return useContext(DataSourceContext);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { DataSourceProvider, useDataSourceConfig };
|
|
22
|
+
//# sourceMappingURL=chunk-3I5Y3PEO.js.map
|
|
23
|
+
//# sourceMappingURL=chunk-3I5Y3PEO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/context.tsx"],"names":[],"mappings":";;;;AAOA,IAAM,iBAAA,GAAoB,aAAA,CAAsC,EAAE,CAAA;AAQ3D,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,OAAA,EAAS,aAAA,EAAc,CAAA;AAAA,IAChC,CAAC,SAAS,aAAa;AAAA,GACzB;AAEA,EAAA,uBACE,GAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,mBAAA,GAA8C;AAC5D,EAAA,OAAO,WAAW,iBAAiB,CAAA;AACrC","file":"chunk-3I5Y3PEO.js","sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport interface DataSourceContextValue {\n baseUrl?: string | undefined;\n getApiHeaders?: (() => Record<string, string>) | undefined;\n}\n\nconst DataSourceContext = createContext<DataSourceContextValue>({});\n\nexport interface DataSourceProviderProps {\n baseUrl?: string | undefined;\n getApiHeaders?: (() => Record<string, string>) | undefined;\n children: ReactNode;\n}\n\nexport function DataSourceProvider({\n baseUrl,\n getApiHeaders,\n children,\n}: DataSourceProviderProps) {\n const value = useMemo(\n () => ({ baseUrl, getApiHeaders }),\n [baseUrl, getApiHeaders],\n );\n\n return (\n <DataSourceContext.Provider value={value}>\n {children}\n </DataSourceContext.Provider>\n );\n}\n\nexport function useDataSourceConfig(): DataSourceContextValue {\n return useContext(DataSourceContext);\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/data-sources/fetchers/api.ts
|
|
4
|
+
function getByPath(obj, path) {
|
|
5
|
+
return path.split(".").reduce((current, key) => {
|
|
6
|
+
if (current && typeof current === "object" && key in current) {
|
|
7
|
+
return current[key];
|
|
8
|
+
}
|
|
9
|
+
return void 0;
|
|
10
|
+
}, obj);
|
|
11
|
+
}
|
|
12
|
+
function interpolateVariables(endpoint, variables) {
|
|
13
|
+
if (!variables) return endpoint;
|
|
14
|
+
const resolved = endpoint.replace(
|
|
15
|
+
/\{(\w+)\}/g,
|
|
16
|
+
(match, key) => variables[key] ?? match
|
|
17
|
+
);
|
|
18
|
+
const unresolved = resolved.match(/\{(\w+)\}/g);
|
|
19
|
+
if (unresolved) {
|
|
20
|
+
console.warn(
|
|
21
|
+
`[DataSource] Unresolved variable placeholders in endpoint: ${unresolved.join(", ")}. Endpoint: "${endpoint}". Available variables: ${Object.keys(variables).join(", ") || "(none)"}`
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
function resolveEndpointUrl(endpoint, baseUrl, variables) {
|
|
27
|
+
const resolved = interpolateVariables(endpoint, variables);
|
|
28
|
+
if (resolved.startsWith("http://") || resolved.startsWith("https://")) {
|
|
29
|
+
return resolved;
|
|
30
|
+
}
|
|
31
|
+
if (baseUrl) {
|
|
32
|
+
const base = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
33
|
+
const path = resolved.startsWith("/") ? resolved : `/${resolved}`;
|
|
34
|
+
return `${base}${path}`;
|
|
35
|
+
}
|
|
36
|
+
return resolved;
|
|
37
|
+
}
|
|
38
|
+
async function apiFetcher(source, context) {
|
|
39
|
+
const { endpoint, method = "GET", headers = {}, body } = source;
|
|
40
|
+
const mergedVariables = { ...context.variables, ...source.variables };
|
|
41
|
+
const url = resolveEndpointUrl(endpoint, context.baseUrl, mergedVariables);
|
|
42
|
+
const fetchOptions = {
|
|
43
|
+
method,
|
|
44
|
+
headers: {
|
|
45
|
+
"content-type": "application/json",
|
|
46
|
+
...context.getApiHeaders?.(),
|
|
47
|
+
...headers
|
|
48
|
+
},
|
|
49
|
+
signal: context.signal
|
|
50
|
+
};
|
|
51
|
+
if (body && (method === "POST" || method === "PUT")) {
|
|
52
|
+
fetchOptions.body = JSON.stringify(body);
|
|
53
|
+
}
|
|
54
|
+
const response = await fetch(url, fetchOptions);
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(
|
|
57
|
+
`API request failed: ${response.status} ${response.statusText}`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
if (source.resultPath) {
|
|
62
|
+
return getByPath(data, source.resultPath);
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
exports.apiFetcher = apiFetcher;
|
|
68
|
+
//# sourceMappingURL=chunk-46PUWB7C.cjs.map
|
|
69
|
+
//# sourceMappingURL=chunk-46PUWB7C.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/fetchers/api.ts"],"names":[],"mappings":"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","file":"chunk-46PUWB7C.cjs","sourcesContent":["import type { ApiDataSource, DataSourceContext } from \"../types\";\n\n/**\n * Extracts a value from an object using dot notation path\n * e.g., getByPath({ data: { items: [1,2,3] } }, 'data.items') => [1,2,3]\n */\nfunction getByPath(obj: unknown, path: string): unknown {\n return path.split(\".\").reduce((current, key) => {\n if (current && typeof current === \"object\" && key in current) {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n\n/**\n * Replaces {variable} placeholders in an endpoint path with values from the\n * variables map. E.g., \"/reps/{rep_id}/most_shared\" with { rep_id: \"42\" }\n * becomes \"/reps/42/most_shared\".\n */\nfunction interpolateVariables(\n endpoint: string,\n variables?: Record<string, string>,\n): string {\n if (!variables) return endpoint;\n const resolved = endpoint.replace(\n /\\{(\\w+)\\}/g,\n (match, key: string) => variables[key] ?? match,\n );\n const unresolved = resolved.match(/\\{(\\w+)\\}/g);\n if (unresolved) {\n console.warn(\n `[DataSource] Unresolved variable placeholders in endpoint: ${unresolved.join(\", \")}. ` +\n `Endpoint: \"${endpoint}\". Available variables: ${Object.keys(variables).join(\", \") || \"(none)\"}`,\n );\n }\n return resolved;\n}\n\n/**\n * Resolves the full URL for an endpoint.\n * - Substitutes {variable} placeholders from context variables\n * - Absolute URLs (starting with http:// or https://) are used as-is\n * - Relative paths are prefixed with the context's baseUrl\n */\nfunction resolveEndpointUrl(\n endpoint: string,\n baseUrl?: string,\n variables?: Record<string, string>,\n): string {\n const resolved = interpolateVariables(endpoint, variables);\n\n // If endpoint is already absolute, use it directly\n if (resolved.startsWith(\"http://\") || resolved.startsWith(\"https://\")) {\n return resolved;\n }\n\n // If we have a baseUrl, prepend it to the relative endpoint\n if (baseUrl) {\n // Ensure proper joining (no double slashes)\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = resolved.startsWith(\"/\") ? resolved : `/${resolved}`;\n return `${base}${path}`;\n }\n\n // No baseUrl provided, return endpoint as-is (will likely fail for relative paths)\n return resolved;\n}\n\n/**\n * Default API fetcher implementation\n */\nexport async function apiFetcher(\n source: ApiDataSource,\n context: DataSourceContext,\n): Promise<unknown> {\n const { endpoint, method = \"GET\", headers = {}, body } = source;\n\n // Merge context variables with per-source variables (source overrides context)\n const mergedVariables = { ...context.variables, ...source.variables };\n\n // Resolve the full URL, substituting variables and using baseUrl for relative endpoints\n const url = resolveEndpointUrl(endpoint, context.baseUrl, mergedVariables);\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n \"content-type\": \"application/json\",\n ...context.getApiHeaders?.(),\n ...headers,\n },\n signal: context.signal,\n };\n\n if (body && (method === \"POST\" || method === \"PUT\")) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(\n `API request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n\n // Extract data at resultPath if specified\n if (source.resultPath) {\n return getByPath(data, source.resultPath);\n }\n\n return data;\n}\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { useDataSourceRegistryConfig } from './chunk-XCNBVV4T.js';
|
|
2
|
+
import { useQueries } from '@tanstack/react-query';
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
|
+
|
|
5
|
+
function getSourceKey(source) {
|
|
6
|
+
if (source.type === "api") {
|
|
7
|
+
const varsKey = source.variables ? `:${JSON.stringify(source.variables)}` : "";
|
|
8
|
+
return `${source.endpoint}${varsKey}`;
|
|
9
|
+
}
|
|
10
|
+
if (source.type === "custom") {
|
|
11
|
+
const itemKeys = source.selectedItems?.map((item) => {
|
|
12
|
+
return `${item.shareableType}:${item.id}`;
|
|
13
|
+
}) ?? [];
|
|
14
|
+
return `custom:${itemKeys.join(",")}`;
|
|
15
|
+
}
|
|
16
|
+
if (source.type === "static") {
|
|
17
|
+
return `static:${source.staticType}:${source.selectedId}`;
|
|
18
|
+
}
|
|
19
|
+
return "unknown";
|
|
20
|
+
}
|
|
21
|
+
function resolvePropsFromQueries(queryResults, sources, errorConfig) {
|
|
22
|
+
if (sources.length === 0) return void 0;
|
|
23
|
+
if (queryResults.some((q) => q.isLoading && !q.data)) return void 0;
|
|
24
|
+
const failedQuery = queryResults.find((q) => q.error);
|
|
25
|
+
const hasError = !!failedQuery?.error;
|
|
26
|
+
if (hasError && errorConfig?.fallback) {
|
|
27
|
+
return errorConfig.fallback;
|
|
28
|
+
}
|
|
29
|
+
if (hasError) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
const resolvedProps = {};
|
|
33
|
+
for (const query of queryResults) {
|
|
34
|
+
if (!query.data) continue;
|
|
35
|
+
const { source, result } = query.data;
|
|
36
|
+
if (!source?.targetProps) continue;
|
|
37
|
+
if (result !== null && typeof result === "object" && !Array.isArray(result) && source.targetProps.length > 1) {
|
|
38
|
+
const resultObj = result;
|
|
39
|
+
for (const prop of source.targetProps) {
|
|
40
|
+
if (prop in resultObj) {
|
|
41
|
+
resolvedProps[prop] = resultObj[prop];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
for (const prop of source.targetProps) {
|
|
46
|
+
resolvedProps[prop] = result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return resolvedProps;
|
|
51
|
+
}
|
|
52
|
+
function useWidgetData(widget, options) {
|
|
53
|
+
const config = useDataSourceRegistryConfig();
|
|
54
|
+
const registry = options?.registry ?? config.registry;
|
|
55
|
+
const baseUrl = options?.baseUrl ?? config.baseUrl;
|
|
56
|
+
const getApiHeaders = config.getApiHeaders;
|
|
57
|
+
const variables = config.variables;
|
|
58
|
+
const sources = widget.dataSource?.sources ?? [];
|
|
59
|
+
const errorConfig = widget.dataSource?.error;
|
|
60
|
+
const widgetId = widget.id ?? "unknown";
|
|
61
|
+
const widgetType = widget.type;
|
|
62
|
+
const queryResultsRef = useRef([]);
|
|
63
|
+
const results = useQueries({
|
|
64
|
+
queries: sources.map((source) => ({
|
|
65
|
+
queryKey: [
|
|
66
|
+
"rep-widget-data",
|
|
67
|
+
getSourceKey(source),
|
|
68
|
+
baseUrl,
|
|
69
|
+
variables
|
|
70
|
+
],
|
|
71
|
+
queryFn: async ({
|
|
72
|
+
signal
|
|
73
|
+
}) => {
|
|
74
|
+
const context = {
|
|
75
|
+
widgetId,
|
|
76
|
+
widgetType,
|
|
77
|
+
signal,
|
|
78
|
+
baseUrl,
|
|
79
|
+
getApiHeaders,
|
|
80
|
+
variables
|
|
81
|
+
};
|
|
82
|
+
const fetcher = registry.fetchers[source.type];
|
|
83
|
+
if (!fetcher) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`No fetcher registered for source type: ${source.type}`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
const rawData = await fetcher(source, context);
|
|
89
|
+
let result = rawData;
|
|
90
|
+
if (source.transform) {
|
|
91
|
+
const transformer = registry.transformers[source.transform];
|
|
92
|
+
if (transformer) {
|
|
93
|
+
result = transformer(result, source);
|
|
94
|
+
} else {
|
|
95
|
+
console.warn(
|
|
96
|
+
`Transform "${source.transform}" not found in registry`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { source, result };
|
|
101
|
+
},
|
|
102
|
+
enabled: sources.length > 0,
|
|
103
|
+
retry: errorConfig?.retryCount ?? 0,
|
|
104
|
+
retryDelay: errorConfig?.retryDelay ?? 1e3,
|
|
105
|
+
refetchInterval: source.refreshInterval || false
|
|
106
|
+
}))
|
|
107
|
+
});
|
|
108
|
+
queryResultsRef.current = results;
|
|
109
|
+
const isLoading = results.some((q) => q.isLoading);
|
|
110
|
+
const failedQuery = results.find((q) => q.error);
|
|
111
|
+
const error = failedQuery?.error instanceof Error ? failedQuery.error : failedQuery?.error ? new Error(String(failedQuery.error)) : null;
|
|
112
|
+
const data = resolvePropsFromQueries(
|
|
113
|
+
results.map((q) => ({
|
|
114
|
+
data: q.data,
|
|
115
|
+
isLoading: q.isLoading,
|
|
116
|
+
error: q.error instanceof Error ? q.error : null
|
|
117
|
+
})),
|
|
118
|
+
sources,
|
|
119
|
+
errorConfig
|
|
120
|
+
);
|
|
121
|
+
const refetch = useCallback(() => {
|
|
122
|
+
queryResultsRef.current.forEach((q) => q.refetch());
|
|
123
|
+
}, []);
|
|
124
|
+
return {
|
|
125
|
+
data,
|
|
126
|
+
isLoading,
|
|
127
|
+
error,
|
|
128
|
+
refetch
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export { useWidgetData };
|
|
133
|
+
//# sourceMappingURL=chunk-4WFDFEHC.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-4WFDFEHC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-sources/use-widget-data.ts"],"names":[],"mappings":"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","file":"chunk-4WFDFEHC.js","sourcesContent":["import { useQueries } from \"@tanstack/react-query\";\nimport { useCallback, useRef } from \"react\";\nimport type { WidgetSchema } from \"../types/widget-schema\";\nimport type {\n DataSourceRegistry,\n WidgetDataResult,\n DataSourceContext,\n DataSource,\n} from \"./types\";\nimport { useDataSourceRegistryConfig } from \"./registry-context\";\n\ninterface UseWidgetDataOptions {\n /** Override the default registry from context */\n registry?: DataSourceRegistry | undefined;\n /** Base URL for API calls (e.g., \"https://api.fluid.app/api\") */\n baseUrl?: string | undefined;\n}\n\n/** Result shape from a single source query */\ninterface SourceQueryResult {\n source: DataSource;\n result: unknown;\n}\n\n/**\n * Generates a unique key for a data source to use in query caching.\n */\nfunction getSourceKey(source: DataSource): string {\n if (source.type === \"api\") {\n const varsKey = source.variables\n ? `:${JSON.stringify(source.variables)}`\n : \"\";\n return `${source.endpoint}${varsKey}`;\n }\n if (source.type === \"custom\") {\n const itemKeys =\n source.selectedItems?.map((item) => {\n return `${item.shareableType}:${item.id}`;\n }) ?? [];\n return `custom:${itemKeys.join(\",\")}`;\n }\n if (source.type === \"static\") {\n return `static:${source.staticType}:${source.selectedId}`;\n }\n return \"unknown\";\n}\n\n/**\n * Resolves query results into widget props by mapping each source's result\n * to its target props.\n */\nfunction resolvePropsFromQueries<T>(\n queryResults: ReadonlyArray<{\n data?: SourceQueryResult | undefined;\n isLoading: boolean;\n error: Error | null;\n }>,\n sources: DataSource[],\n errorConfig?: { fallback?: unknown },\n): T | undefined {\n if (sources.length === 0) return undefined;\n if (queryResults.some((q) => q.isLoading && !q.data)) return undefined;\n\n const failedQuery = queryResults.find((q) => q.error);\n const hasError = !!failedQuery?.error;\n\n if (hasError && errorConfig?.fallback) {\n return errorConfig.fallback as T;\n }\n\n if (hasError) {\n return undefined;\n }\n\n const resolvedProps: Record<string, unknown> = {};\n\n for (const query of queryResults) {\n if (!query.data) continue;\n const { source, result } = query.data;\n\n // Sentry fix: FLUID-ADMIN-1DH — source or targetProps can be undefined from malformed widget config\n if (!source?.targetProps) continue;\n\n if (\n result !== null &&\n typeof result === \"object\" &&\n !Array.isArray(result) &&\n source.targetProps.length > 1\n ) {\n const resultObj = result as Record<string, unknown>;\n for (const prop of source.targetProps) {\n if (prop in resultObj) {\n resolvedProps[prop] = resultObj[prop];\n }\n }\n } else {\n for (const prop of source.targetProps) {\n resolvedProps[prop] = result;\n }\n }\n }\n\n return resolvedProps as T;\n}\n\n/**\n * Hook that fetches and resolves data sources for a widget using React Query.\n */\nexport function useWidgetData<T = Record<string, unknown>>(\n widget: WidgetSchema,\n options?: UseWidgetDataOptions,\n): WidgetDataResult<T> {\n const config = useDataSourceRegistryConfig();\n const registry = options?.registry ?? config.registry;\n const baseUrl = options?.baseUrl ?? config.baseUrl;\n const getApiHeaders = config.getApiHeaders;\n const variables = config.variables;\n\n const sources = widget.dataSource?.sources ?? [];\n const errorConfig = widget.dataSource?.error;\n const widgetId = widget.id ?? \"unknown\";\n const widgetType = widget.type;\n\n const queryResultsRef = useRef<Array<{ refetch: () => void }>>([]);\n\n const results = useQueries({\n queries: sources.map((source: DataSource) => ({\n queryKey: [\n \"rep-widget-data\",\n getSourceKey(source),\n baseUrl,\n variables,\n ] as const,\n queryFn: async ({\n signal,\n }: {\n signal: AbortSignal;\n }): Promise<SourceQueryResult> => {\n const context: DataSourceContext = {\n widgetId,\n widgetType,\n signal,\n baseUrl,\n getApiHeaders,\n variables,\n };\n\n const fetcher = registry.fetchers[source.type];\n if (!fetcher) {\n throw new Error(\n `No fetcher registered for source type: ${source.type}`,\n );\n }\n\n const rawData = await fetcher(source, context);\n\n // Apply transform\n let result = rawData;\n if (source.transform) {\n const transformer = registry.transformers[source.transform];\n if (transformer) {\n result = transformer(result, source);\n } else {\n console.warn(\n `Transform \"${source.transform}\" not found in registry`,\n );\n }\n }\n return { source, result };\n },\n enabled: sources.length > 0,\n retry: errorConfig?.retryCount ?? 0,\n retryDelay: errorConfig?.retryDelay ?? 1000,\n refetchInterval: source.refreshInterval || false,\n })),\n });\n\n // Update ref for refetch callback\n queryResultsRef.current = results;\n\n // Aggregate loading state\n const isLoading = results.some((q) => q.isLoading);\n\n // Get first error from any failed query\n const failedQuery = results.find((q) => q.error);\n const error =\n failedQuery?.error instanceof Error\n ? failedQuery.error\n : failedQuery?.error\n ? new Error(String(failedQuery.error))\n : null;\n\n // Resolve data from all queries\n const data = resolvePropsFromQueries<T>(\n results.map((q) => ({\n data: q.data as SourceQueryResult | undefined,\n isLoading: q.isLoading,\n error: q.error instanceof Error ? q.error : null,\n })),\n sources,\n errorConfig,\n );\n\n // Stable refetch callback using ref\n const refetch = useCallback(() => {\n queryResultsRef.current.forEach((q) => q.refetch());\n }, []);\n\n return {\n data,\n isLoading,\n error,\n refetch,\n };\n}\n"]}
|