@marktiderman/genesis-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ViewToggle-DDe_Luj2.d.ts +10 -0
- package/dist/chunk-2B3MFHBQ.js +94 -0
- package/dist/chunk-2B3MFHBQ.js.map +1 -0
- package/dist/chunk-2MQKBZBJ.js +87 -0
- package/dist/chunk-2MQKBZBJ.js.map +1 -0
- package/dist/chunk-2MXMWBDV.js +30 -0
- package/dist/chunk-2MXMWBDV.js.map +1 -0
- package/dist/chunk-2SBHHXAC.js +40 -0
- package/dist/chunk-2SBHHXAC.js.map +1 -0
- package/dist/chunk-4HUKJSKC.js +51 -0
- package/dist/chunk-4HUKJSKC.js.map +1 -0
- package/dist/chunk-4RAZJ6LL.js +27 -0
- package/dist/chunk-4RAZJ6LL.js.map +1 -0
- package/dist/chunk-4TROUCWO.js +43 -0
- package/dist/chunk-4TROUCWO.js.map +1 -0
- package/dist/chunk-4V4H2ZM7.js +170 -0
- package/dist/chunk-4V4H2ZM7.js.map +1 -0
- package/dist/chunk-5J7BP5DI.js +47 -0
- package/dist/chunk-5J7BP5DI.js.map +1 -0
- package/dist/chunk-5Q4FABZQ.js +44 -0
- package/dist/chunk-5Q4FABZQ.js.map +1 -0
- package/dist/chunk-63FW5ZUA.js +26 -0
- package/dist/chunk-63FW5ZUA.js.map +1 -0
- package/dist/chunk-6V4GJUE3.js +25 -0
- package/dist/chunk-6V4GJUE3.js.map +1 -0
- package/dist/chunk-7H3E5VOJ.js +205 -0
- package/dist/chunk-7H3E5VOJ.js.map +1 -0
- package/dist/chunk-7OBL3H5P.js +83 -0
- package/dist/chunk-7OBL3H5P.js.map +1 -0
- package/dist/chunk-A5WHNNXJ.js +22 -0
- package/dist/chunk-A5WHNNXJ.js.map +1 -0
- package/dist/chunk-AI6CCNWK.js +51 -0
- package/dist/chunk-AI6CCNWK.js.map +1 -0
- package/dist/chunk-AIODTBWP.js +23 -0
- package/dist/chunk-AIODTBWP.js.map +1 -0
- package/dist/chunk-C6H7AMO4.js +43 -0
- package/dist/chunk-C6H7AMO4.js.map +1 -0
- package/dist/chunk-CLK7JBZJ.js +288 -0
- package/dist/chunk-CLK7JBZJ.js.map +1 -0
- package/dist/chunk-EI5EGKHL.js +32 -0
- package/dist/chunk-EI5EGKHL.js.map +1 -0
- package/dist/chunk-F2JB7YFF.js +341 -0
- package/dist/chunk-F2JB7YFF.js.map +1 -0
- package/dist/chunk-FCGFG4RV.js +120 -0
- package/dist/chunk-FCGFG4RV.js.map +1 -0
- package/dist/chunk-FFSDFQQN.js +19 -0
- package/dist/chunk-FFSDFQQN.js.map +1 -0
- package/dist/chunk-FN3FZVUR.js +79 -0
- package/dist/chunk-FN3FZVUR.js.map +1 -0
- package/dist/chunk-FZYUVUXU.js +199 -0
- package/dist/chunk-FZYUVUXU.js.map +1 -0
- package/dist/chunk-GJ6XSCNF.js +64 -0
- package/dist/chunk-GJ6XSCNF.js.map +1 -0
- package/dist/chunk-HSHIZHYR.js +23 -0
- package/dist/chunk-HSHIZHYR.js.map +1 -0
- package/dist/chunk-HVQCZFJ7.js +115 -0
- package/dist/chunk-HVQCZFJ7.js.map +1 -0
- package/dist/chunk-IKIFQILN.js +124 -0
- package/dist/chunk-IKIFQILN.js.map +1 -0
- package/dist/chunk-JEECTX26.js +20 -0
- package/dist/chunk-JEECTX26.js.map +1 -0
- package/dist/chunk-JJ4NOMMI.js +73 -0
- package/dist/chunk-JJ4NOMMI.js.map +1 -0
- package/dist/chunk-JXI2MYL3.js +40 -0
- package/dist/chunk-JXI2MYL3.js.map +1 -0
- package/dist/chunk-JYPENH7T.js +95 -0
- package/dist/chunk-JYPENH7T.js.map +1 -0
- package/dist/chunk-K23AQNOM.js +51 -0
- package/dist/chunk-K23AQNOM.js.map +1 -0
- package/dist/chunk-K4YLKVMX.js +24 -0
- package/dist/chunk-K4YLKVMX.js.map +1 -0
- package/dist/chunk-KBS4BHME.js +11 -0
- package/dist/chunk-KBS4BHME.js.map +1 -0
- package/dist/chunk-LRXDZBV2.js +26 -0
- package/dist/chunk-LRXDZBV2.js.map +1 -0
- package/dist/chunk-M7AU5DDM.js +26 -0
- package/dist/chunk-M7AU5DDM.js.map +1 -0
- package/dist/chunk-MUQLZFUR.js +31 -0
- package/dist/chunk-MUQLZFUR.js.map +1 -0
- package/dist/chunk-N2ZFNOOT.js +57 -0
- package/dist/chunk-N2ZFNOOT.js.map +1 -0
- package/dist/chunk-NJMO3VPA.js +26 -0
- package/dist/chunk-NJMO3VPA.js.map +1 -0
- package/dist/chunk-NZ5WBA4R.js +18 -0
- package/dist/chunk-NZ5WBA4R.js.map +1 -0
- package/dist/chunk-OCTV3S4I.js +29 -0
- package/dist/chunk-OCTV3S4I.js.map +1 -0
- package/dist/chunk-OVU3Z2MT.js +22 -0
- package/dist/chunk-OVU3Z2MT.js.map +1 -0
- package/dist/chunk-OZ7ZAYCS.js +35 -0
- package/dist/chunk-OZ7ZAYCS.js.map +1 -0
- package/dist/chunk-OZZTPE7F.js +51 -0
- package/dist/chunk-OZZTPE7F.js.map +1 -0
- package/dist/chunk-QBZMY2AF.js +90 -0
- package/dist/chunk-QBZMY2AF.js.map +1 -0
- package/dist/chunk-QCJAASJT.js +242 -0
- package/dist/chunk-QCJAASJT.js.map +1 -0
- package/dist/chunk-QFM4Z2SS.js +19 -0
- package/dist/chunk-QFM4Z2SS.js.map +1 -0
- package/dist/chunk-SBJV3K4G.js +120 -0
- package/dist/chunk-SBJV3K4G.js.map +1 -0
- package/dist/chunk-SCUT2ZCD.js +109 -0
- package/dist/chunk-SCUT2ZCD.js.map +1 -0
- package/dist/chunk-SVXDWPLO.js +102 -0
- package/dist/chunk-SVXDWPLO.js.map +1 -0
- package/dist/chunk-SXSCHWZU.js +27 -0
- package/dist/chunk-SXSCHWZU.js.map +1 -0
- package/dist/chunk-T465NJRL.js +134 -0
- package/dist/chunk-T465NJRL.js.map +1 -0
- package/dist/chunk-TAP3PBQT.js +39 -0
- package/dist/chunk-TAP3PBQT.js.map +1 -0
- package/dist/chunk-TKA4LOMT.js +37 -0
- package/dist/chunk-TKA4LOMT.js.map +1 -0
- package/dist/chunk-UGHQFQOE.js +142 -0
- package/dist/chunk-UGHQFQOE.js.map +1 -0
- package/dist/chunk-W5Y3LG5K.js +26 -0
- package/dist/chunk-W5Y3LG5K.js.map +1 -0
- package/dist/chunk-W64GERJW.js +22 -0
- package/dist/chunk-W64GERJW.js.map +1 -0
- package/dist/chunk-WALXVR6V.js +9 -0
- package/dist/chunk-WALXVR6V.js.map +1 -0
- package/dist/chunk-WZWR2ELB.js +30 -0
- package/dist/chunk-WZWR2ELB.js.map +1 -0
- package/dist/chunk-X7KMF6NH.js +59 -0
- package/dist/chunk-X7KMF6NH.js.map +1 -0
- package/dist/chunk-XISSLIMH.js +20 -0
- package/dist/chunk-XISSLIMH.js.map +1 -0
- package/dist/chunk-YZEA5TGK.js +87 -0
- package/dist/chunk-YZEA5TGK.js.map +1 -0
- package/dist/chunk-ZD32TSOK.js +101 -0
- package/dist/chunk-ZD32TSOK.js.map +1 -0
- package/dist/chunk-ZDAT5JDH.js +82 -0
- package/dist/chunk-ZDAT5JDH.js.map +1 -0
- package/dist/components/data/index.d.ts +458 -0
- package/dist/components/data/index.js +2923 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +9 -0
- package/dist/components/ui/accordion.js +4 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +17 -0
- package/dist/components/ui/alert-dialog.js +4 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.d.ts +14 -0
- package/dist/components/ui/alert.js +4 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +6 -0
- package/dist/components/ui/aspect-ratio.js +3 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +8 -0
- package/dist/components/ui/avatar.js +4 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +13 -0
- package/dist/components/ui/badge.js +4 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +22 -0
- package/dist/components/ui/breadcrumb.js +4 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button-group.d.ts +9 -0
- package/dist/components/ui/button-group.js +4 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.d.ts +15 -0
- package/dist/components/ui/button.js +4 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +13 -0
- package/dist/components/ui/calendar.js +5 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +11 -0
- package/dist/components/ui/card.js +4 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.d.ts +24 -0
- package/dist/components/ui/carousel.js +5 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/chart.d.ts +51 -0
- package/dist/components/ui/chart.js +4 -0
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +6 -0
- package/dist/components/ui/checkbox.js +4 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +8 -0
- package/dist/components/ui/collapsible.js +3 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/command.d.ts +85 -0
- package/dist/components/ui/command.js +5 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +30 -0
- package/dist/components/ui/context-menu.js +4 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/date-picker.d.ts +12 -0
- package/dist/components/ui/date-picker.js +7 -0
- package/dist/components/ui/date-picker.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.js +4 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +27 -0
- package/dist/components/ui/drawer.js +4 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +30 -0
- package/dist/components/ui/dropdown-menu.js +4 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/empty-state.d.ts +22 -0
- package/dist/components/ui/empty-state.js +4 -0
- package/dist/components/ui/empty-state.js.map +1 -0
- package/dist/components/ui/form-field.d.ts +17 -0
- package/dist/components/ui/form-field.js +5 -0
- package/dist/components/ui/form-field.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +8 -0
- package/dist/components/ui/hover-card.js +4 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +14 -0
- package/dist/components/ui/input-group.js +4 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.d.ts +37 -0
- package/dist/components/ui/input-otp.js +4 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.d.ts +5 -0
- package/dist/components/ui/input.js +4 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +8 -0
- package/dist/components/ui/kbd.js +4 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/label.d.ts +8 -0
- package/dist/components/ui/label.js +4 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/menubar.d.ts +31 -0
- package/dist/components/ui/menubar.js +4 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +15 -0
- package/dist/components/ui/navigation-menu.js +4 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +33 -0
- package/dist/components/ui/pagination.js +5 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.js +4 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +9 -0
- package/dist/components/ui/progress.js +4 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +7 -0
- package/dist/components/ui/radio-group.js +4 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +27 -0
- package/dist/components/ui/resizable.js +4 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +9 -0
- package/dist/components/ui/scroll-area.js +4 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +13 -0
- package/dist/components/ui/select.js +4 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.d.ts +10 -0
- package/dist/components/ui/separator.js +4 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +29 -0
- package/dist/components/ui/sheet.js +4 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +6 -0
- package/dist/components/ui/skeleton.js +4 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +6 -0
- package/dist/components/ui/slider.js +4 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +9 -0
- package/dist/components/ui/sonner.js +4 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.d.ts +9 -0
- package/dist/components/ui/spinner.js +4 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/switch.d.ts +6 -0
- package/dist/components/ui/switch.js +4 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +12 -0
- package/dist/components/ui/table.js +4 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +20 -0
- package/dist/components/ui/tabs.js +4 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +5 -0
- package/dist/components/ui/textarea.js +4 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +15 -0
- package/dist/components/ui/toggle-group.js +5 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +15 -0
- package/dist/components/ui/toggle.js +4 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.js +4 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/typography.d.ts +14 -0
- package/dist/components/ui/typography.js +4 -0
- package/dist/components/ui/typography.js.map +1 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-data-filters.d.ts +32 -0
- package/dist/hooks/use-data-filters.js +4 -0
- package/dist/hooks/use-data-filters.js.map +1 -0
- package/dist/hooks/use-keyboard-navigation.d.ts +29 -0
- package/dist/hooks/use-keyboard-navigation.js +3 -0
- package/dist/hooks/use-keyboard-navigation.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +3 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-one.d.ts +18 -0
- package/dist/hooks/use-one.js +4 -0
- package/dist/hooks/use-one.js.map +1 -0
- package/dist/hooks/use-prefetch.d.ts +19 -0
- package/dist/hooks/use-prefetch.js +3 -0
- package/dist/hooks/use-prefetch.js.map +1 -0
- package/dist/hooks/use-resource-form.d.ts +37 -0
- package/dist/hooks/use-resource-form.js +7 -0
- package/dist/hooks/use-resource-form.js.map +1 -0
- package/dist/hooks/use-resource-page.d.ts +5 -0
- package/dist/hooks/use-resource-page.js +4 -0
- package/dist/hooks/use-resource-page.js.map +1 -0
- package/dist/hooks/use-resource.d.ts +46 -0
- package/dist/hooks/use-resource.js +4 -0
- package/dist/hooks/use-resource.js.map +1 -0
- package/dist/hooks/use-view-preference.d.ts +6 -0
- package/dist/hooks/use-view-preference.js +3 -0
- package/dist/hooks/use-view-preference.js.map +1 -0
- package/dist/hooks/use-view-settings.d.ts +15 -0
- package/dist/hooks/use-view-settings.js +3 -0
- package/dist/hooks/use-view-settings.js.map +1 -0
- package/dist/hooks/use-wizard.d.ts +25 -0
- package/dist/hooks/use-wizard.js +3 -0
- package/dist/hooks/use-wizard.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation-qI86Ldug.d.ts +90 -0
- package/dist/provider/index.d.ts +1 -0
- package/dist/provider/index.js +3 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/status-colors.d.ts +29 -0
- package/dist/status-colors.js +72 -0
- package/dist/status-colors.js.map +1 -0
- package/dist/types-HIZY7zxO.d.ts +61 -0
- package/dist/use-resource-page-BzvUM8de.d.ts +159 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +3 -0
- package/dist/utils.js.map +1 -0
- package/package.json +350 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Button } from './chunk-4TROUCWO.js';
|
|
3
|
+
import { cn } from './chunk-NZ5WBA4R.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import useEmblaCarousel from 'embla-carousel-react';
|
|
6
|
+
import { ArrowLeft, ArrowRight } from 'lucide-react';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var CarouselContext = React.createContext(null);
|
|
10
|
+
function useCarousel() {
|
|
11
|
+
const context = React.useContext(CarouselContext);
|
|
12
|
+
if (!context) {
|
|
13
|
+
throw new Error("useCarousel must be used within a <Carousel />");
|
|
14
|
+
}
|
|
15
|
+
return context;
|
|
16
|
+
}
|
|
17
|
+
var Carousel = React.forwardRef(
|
|
18
|
+
({
|
|
19
|
+
orientation = "horizontal",
|
|
20
|
+
opts,
|
|
21
|
+
setApi,
|
|
22
|
+
plugins,
|
|
23
|
+
className,
|
|
24
|
+
children,
|
|
25
|
+
...props
|
|
26
|
+
}, ref) => {
|
|
27
|
+
const [carouselRef, api] = useEmblaCarousel(
|
|
28
|
+
{
|
|
29
|
+
...opts,
|
|
30
|
+
axis: orientation === "horizontal" ? "x" : "y"
|
|
31
|
+
},
|
|
32
|
+
plugins
|
|
33
|
+
);
|
|
34
|
+
const [canScrollPrev, setCanScrollPrev] = React.useState(false);
|
|
35
|
+
const [canScrollNext, setCanScrollNext] = React.useState(false);
|
|
36
|
+
const onSelect = React.useCallback((api2) => {
|
|
37
|
+
if (!api2) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
setCanScrollPrev(api2.canScrollPrev());
|
|
41
|
+
setCanScrollNext(api2.canScrollNext());
|
|
42
|
+
}, []);
|
|
43
|
+
const scrollPrev = React.useCallback(() => {
|
|
44
|
+
api?.scrollPrev();
|
|
45
|
+
}, [api]);
|
|
46
|
+
const scrollNext = React.useCallback(() => {
|
|
47
|
+
api?.scrollNext();
|
|
48
|
+
}, [api]);
|
|
49
|
+
const handleKeyDown = React.useCallback(
|
|
50
|
+
(event) => {
|
|
51
|
+
if (event.key === "ArrowLeft") {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
scrollPrev();
|
|
54
|
+
} else if (event.key === "ArrowRight") {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
scrollNext();
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
[scrollPrev, scrollNext]
|
|
60
|
+
);
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
if (!api || !setApi) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
setApi(api);
|
|
66
|
+
}, [api, setApi]);
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
if (!api) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
onSelect(api);
|
|
72
|
+
api.on("reInit", onSelect);
|
|
73
|
+
api.on("select", onSelect);
|
|
74
|
+
return () => {
|
|
75
|
+
api?.off("select", onSelect);
|
|
76
|
+
};
|
|
77
|
+
}, [api, onSelect]);
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
79
|
+
CarouselContext.Provider,
|
|
80
|
+
{
|
|
81
|
+
value: {
|
|
82
|
+
carouselRef,
|
|
83
|
+
api,
|
|
84
|
+
opts,
|
|
85
|
+
orientation: orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
|
|
86
|
+
scrollPrev,
|
|
87
|
+
scrollNext,
|
|
88
|
+
canScrollPrev,
|
|
89
|
+
canScrollNext
|
|
90
|
+
},
|
|
91
|
+
children: /* @__PURE__ */ jsx(
|
|
92
|
+
"div",
|
|
93
|
+
{
|
|
94
|
+
ref,
|
|
95
|
+
onKeyDownCapture: handleKeyDown,
|
|
96
|
+
className: cn("relative", className),
|
|
97
|
+
role: "region",
|
|
98
|
+
"aria-roledescription": "carousel",
|
|
99
|
+
...props,
|
|
100
|
+
children
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
Carousel.displayName = "Carousel";
|
|
108
|
+
var CarouselContent = React.forwardRef(({ className, ...props }, ref) => {
|
|
109
|
+
const { carouselRef, orientation } = useCarousel();
|
|
110
|
+
return /* @__PURE__ */ jsx("div", { ref: carouselRef, className: "overflow-hidden", children: /* @__PURE__ */ jsx(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
ref,
|
|
114
|
+
className: cn(
|
|
115
|
+
"flex",
|
|
116
|
+
orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
|
|
117
|
+
className
|
|
118
|
+
),
|
|
119
|
+
...props
|
|
120
|
+
}
|
|
121
|
+
) });
|
|
122
|
+
});
|
|
123
|
+
CarouselContent.displayName = "CarouselContent";
|
|
124
|
+
var CarouselItem = React.forwardRef(({ className, ...props }, ref) => {
|
|
125
|
+
const { orientation } = useCarousel();
|
|
126
|
+
return /* @__PURE__ */ jsx(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
ref,
|
|
130
|
+
role: "group",
|
|
131
|
+
"aria-roledescription": "slide",
|
|
132
|
+
className: cn(
|
|
133
|
+
"min-w-0 shrink-0 grow-0 basis-full",
|
|
134
|
+
orientation === "horizontal" ? "pl-4" : "pt-4",
|
|
135
|
+
className
|
|
136
|
+
),
|
|
137
|
+
...props
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
CarouselItem.displayName = "CarouselItem";
|
|
142
|
+
function CarouselPrevious({
|
|
143
|
+
className,
|
|
144
|
+
variant = "outline",
|
|
145
|
+
size = "icon",
|
|
146
|
+
...props
|
|
147
|
+
}) {
|
|
148
|
+
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
|
|
149
|
+
return /* @__PURE__ */ jsxs(
|
|
150
|
+
Button,
|
|
151
|
+
{
|
|
152
|
+
variant,
|
|
153
|
+
size,
|
|
154
|
+
className: cn(
|
|
155
|
+
"absolute h-8 w-8 rounded-full",
|
|
156
|
+
orientation === "horizontal" ? "-left-12 top-1/2 -translate-y-1/2" : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
|
|
157
|
+
className
|
|
158
|
+
),
|
|
159
|
+
disabled: !canScrollPrev,
|
|
160
|
+
onClick: scrollPrev,
|
|
161
|
+
...props,
|
|
162
|
+
children: [
|
|
163
|
+
/* @__PURE__ */ jsx(ArrowLeft, { className: "h-4 w-4" }),
|
|
164
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Previous slide" })
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
function CarouselNext({
|
|
170
|
+
className,
|
|
171
|
+
variant = "outline",
|
|
172
|
+
size = "icon",
|
|
173
|
+
...props
|
|
174
|
+
}) {
|
|
175
|
+
const { orientation, scrollNext, canScrollNext } = useCarousel();
|
|
176
|
+
return /* @__PURE__ */ jsxs(
|
|
177
|
+
Button,
|
|
178
|
+
{
|
|
179
|
+
variant,
|
|
180
|
+
size,
|
|
181
|
+
className: cn(
|
|
182
|
+
"absolute h-8 w-8 rounded-full",
|
|
183
|
+
orientation === "horizontal" ? "-right-12 top-1/2 -translate-y-1/2" : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
|
|
184
|
+
className
|
|
185
|
+
),
|
|
186
|
+
disabled: !canScrollNext,
|
|
187
|
+
onClick: scrollNext,
|
|
188
|
+
...props,
|
|
189
|
+
children: [
|
|
190
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "h-4 w-4" }),
|
|
191
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Next slide" })
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious };
|
|
198
|
+
//# sourceMappingURL=chunk-FZYUVUXU.js.map
|
|
199
|
+
//# sourceMappingURL=chunk-FZYUVUXU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/carousel.tsx"],"names":["api"],"mappings":"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","file":"chunk-FZYUVUXU.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\nimport { Button } from \"./button\";\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: \"horizontal\" | \"vertical\";\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n\n return context;\n}\n\nconst Carousel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n (\n {\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) {\n return;\n }\n\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n },\n [scrollPrev, scrollNext]\n );\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return;\n }\n\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) {\n return;\n }\n\n onSelect(api);\n api.on(\"reInit\", onSelect);\n api.on(\"select\", onSelect);\n\n return () => {\n api?.off(\"select\", onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n }\n);\nCarousel.displayName = \"Carousel\";\n\nconst CarouselContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n );\n});\nCarouselContent.displayName = \"CarouselContent\";\n\nconst CarouselItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { orientation } = useCarousel();\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n );\n});\nCarouselItem.displayName = \"CarouselItem\";\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-left-12 top-1/2 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-right-12 top-1/2 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n};\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { cn } from './chunk-NZ5WBA4R.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var InputGroup = React.forwardRef(
|
|
6
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
ref,
|
|
10
|
+
className: cn(
|
|
11
|
+
"flex h-10 w-full items-center rounded-md border border-input bg-background text-sm ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
|
|
12
|
+
className
|
|
13
|
+
),
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
InputGroup.displayName = "InputGroup";
|
|
19
|
+
var InputGroupInput = React.forwardRef(
|
|
20
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
21
|
+
"input",
|
|
22
|
+
{
|
|
23
|
+
ref,
|
|
24
|
+
className: cn(
|
|
25
|
+
"flex h-full w-full min-w-0 bg-transparent px-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
26
|
+
className
|
|
27
|
+
),
|
|
28
|
+
...props
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
InputGroupInput.displayName = "InputGroupInput";
|
|
33
|
+
var InputGroupPrefix = React.forwardRef(
|
|
34
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
ref,
|
|
38
|
+
className: cn(
|
|
39
|
+
"flex items-center pl-3 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4",
|
|
40
|
+
className
|
|
41
|
+
),
|
|
42
|
+
...props
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
);
|
|
46
|
+
InputGroupPrefix.displayName = "InputGroupPrefix";
|
|
47
|
+
var InputGroupSuffix = React.forwardRef(
|
|
48
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
ref,
|
|
52
|
+
className: cn(
|
|
53
|
+
"flex items-center pr-3 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4",
|
|
54
|
+
className
|
|
55
|
+
),
|
|
56
|
+
...props
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
InputGroupSuffix.displayName = "InputGroupSuffix";
|
|
61
|
+
|
|
62
|
+
export { InputGroup, InputGroupInput, InputGroupPrefix, InputGroupSuffix };
|
|
63
|
+
//# sourceMappingURL=chunk-GJ6XSCNF.js.map
|
|
64
|
+
//# sourceMappingURL=chunk-GJ6XSCNF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/input-group.tsx"],"names":[],"mappings":";;;;AAMA,IAAM,UAAA,GAAmB,KAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,iLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;AAKzB,IAAM,eAAA,GAAwB,KAAA,CAAA,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,kKAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAI9B,IAAM,gBAAA,GAAyB,KAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,sEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;AAE/B,IAAM,gBAAA,GAAyB,KAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,sEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA;AAGV;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA","file":"chunk-GJ6XSCNF.js","sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\ninterface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center rounded-md border border-input bg-background text-sm ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n className\n )}\n {...props}\n />\n )\n);\nInputGroup.displayName = \"InputGroup\";\n\ninterface InputGroupInputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst InputGroupInput = React.forwardRef<HTMLInputElement, InputGroupInputProps>(\n ({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n \"flex h-full w-full min-w-0 bg-transparent px-3 py-2 text-sm placeholder:text-muted-foreground focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n);\nInputGroupInput.displayName = \"InputGroupInput\";\n\ninterface InputGroupAddonProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst InputGroupPrefix = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex items-center pl-3 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\",\n className\n )}\n {...props}\n />\n )\n);\nInputGroupPrefix.displayName = \"InputGroupPrefix\";\n\nconst InputGroupSuffix = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex items-center pr-3 text-muted-foreground [&_svg]:h-4 [&_svg]:w-4\",\n className\n )}\n {...props}\n />\n )\n);\nInputGroupSuffix.displayName = \"InputGroupSuffix\";\n\nexport {\n InputGroup,\n InputGroupInput,\n InputGroupPrefix,\n InputGroupSuffix,\n type InputGroupProps,\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/hooks/use-prefetch.ts
|
|
2
|
+
function createPrefetch(routeMap) {
|
|
3
|
+
const prefetched = /* @__PURE__ */ new Set();
|
|
4
|
+
function prefetch(path) {
|
|
5
|
+
if (prefetched.has(path)) return;
|
|
6
|
+
const loader = routeMap[path];
|
|
7
|
+
if (loader) {
|
|
8
|
+
prefetched.add(path);
|
|
9
|
+
loader();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function prefetchHandlers(path) {
|
|
13
|
+
return {
|
|
14
|
+
onMouseEnter: () => prefetch(path),
|
|
15
|
+
onFocus: () => prefetch(path)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return { prefetch, prefetchHandlers };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { createPrefetch };
|
|
22
|
+
//# sourceMappingURL=chunk-HSHIZHYR.js.map
|
|
23
|
+
//# sourceMappingURL=chunk-HSHIZHYR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-prefetch.ts"],"names":[],"mappings":";AAYO,SAAS,eAAe,QAAA,EAAoB;AACjD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,SAAS,SAAS,IAAA,EAAoB;AACpC,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AACnB,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF;AAEA,EAAA,SAAS,iBAAiB,IAAA,EAAc;AACtC,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI;AAAA,KAC9B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,gBAAA,EAAiB;AACtC","file":"chunk-HSHIZHYR.js","sourcesContent":["/**\n * Route prefetch utilities -- configurable chunk preloading for navigation.\n *\n * Use `createPrefetch` to build prefetch functions for any route map,\n * or import the Genesis-specific `prefetch` / `prefetchHandlers` directly.\n */\n\nexport type RouteMap = Record<string, () => Promise<unknown>>;\n\n/**\n * Factory: create prefetch + prefetchHandlers bound to a given route map.\n */\nexport function createPrefetch(routeMap: RouteMap) {\n const prefetched = new Set<string>();\n\n function prefetch(path: string): void {\n if (prefetched.has(path)) return;\n const loader = routeMap[path];\n if (loader) {\n prefetched.add(path);\n loader();\n }\n }\n\n function prefetchHandlers(path: string) {\n return {\n onMouseEnter: () => prefetch(path),\n onFocus: () => prefetch(path),\n };\n }\n\n return { prefetch, prefetchHandlers } as const;\n}\n\n// Each consuming app calls createPrefetch(theirRouteMap) to get their own instance.\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { cn } from './chunk-NZ5WBA4R.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function H1({ className, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"h1",
|
|
7
|
+
{
|
|
8
|
+
className: cn(
|
|
9
|
+
"scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl",
|
|
10
|
+
className
|
|
11
|
+
),
|
|
12
|
+
...props
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function H2({ className, ...props }) {
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"h2",
|
|
19
|
+
{
|
|
20
|
+
className: cn(
|
|
21
|
+
"scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0",
|
|
22
|
+
className
|
|
23
|
+
),
|
|
24
|
+
...props
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
function H3({ className, ...props }) {
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
"h3",
|
|
31
|
+
{
|
|
32
|
+
className: cn(
|
|
33
|
+
"scroll-m-20 text-2xl font-semibold tracking-tight",
|
|
34
|
+
className
|
|
35
|
+
),
|
|
36
|
+
...props
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function H4({ className, ...props }) {
|
|
41
|
+
return /* @__PURE__ */ jsx(
|
|
42
|
+
"h4",
|
|
43
|
+
{
|
|
44
|
+
className: cn(
|
|
45
|
+
"scroll-m-20 text-xl font-semibold tracking-tight",
|
|
46
|
+
className
|
|
47
|
+
),
|
|
48
|
+
...props
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
function P({
|
|
53
|
+
className,
|
|
54
|
+
...props
|
|
55
|
+
}) {
|
|
56
|
+
return /* @__PURE__ */ jsx(
|
|
57
|
+
"p",
|
|
58
|
+
{
|
|
59
|
+
className: cn("leading-7 [&:not(:first-child)]:mt-6", className),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
function Lead({
|
|
65
|
+
className,
|
|
66
|
+
...props
|
|
67
|
+
}) {
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
"p",
|
|
70
|
+
{
|
|
71
|
+
className: cn("text-xl text-muted-foreground", className),
|
|
72
|
+
...props
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
function Large({
|
|
77
|
+
className,
|
|
78
|
+
...props
|
|
79
|
+
}) {
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
81
|
+
"div",
|
|
82
|
+
{
|
|
83
|
+
className: cn("text-lg font-semibold", className),
|
|
84
|
+
...props
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
function Small({
|
|
89
|
+
className,
|
|
90
|
+
...props
|
|
91
|
+
}) {
|
|
92
|
+
return /* @__PURE__ */ jsx(
|
|
93
|
+
"small",
|
|
94
|
+
{
|
|
95
|
+
className: cn("text-sm font-medium leading-none", className),
|
|
96
|
+
...props
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
function Muted({
|
|
101
|
+
className,
|
|
102
|
+
...props
|
|
103
|
+
}) {
|
|
104
|
+
return /* @__PURE__ */ jsx(
|
|
105
|
+
"p",
|
|
106
|
+
{
|
|
107
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
108
|
+
...props
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { H1, H2, H3, H4, Large, Lead, Muted, P, Small };
|
|
114
|
+
//# sourceMappingURL=chunk-HVQCZFJ7.js.map
|
|
115
|
+
//# sourceMappingURL=chunk-HVQCZFJ7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/typography.tsx"],"names":[],"mappings":";;;AAGA,SAAS,EAAA,CAAG,EAAE,SAAA,EAAW,GAAG,OAAM,EAA6C;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,EAAA,CAAG,EAAE,SAAA,EAAW,GAAG,OAAM,EAA6C;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,EAAA,CAAG,EAAE,SAAA,EAAW,GAAG,OAAM,EAA6C;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,EAAA,CAAG,EAAE,SAAA,EAAW,GAAG,OAAM,EAA6C;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,CAAA,CAAE;AAAA,EACT,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA;AAAA,MAC9D,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,IAAA,CAAK;AAAA,EACZ,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyC;AACvC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAC/C,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsC;AACpC,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA;AAAA,MAC1D,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+C;AAC7C,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-HVQCZFJ7.js","sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils\";\n\nfunction H1({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h1\n className={cn(\n \"scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction H2({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h2\n className={cn(\n \"scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction H3({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n className={cn(\n \"scroll-m-20 text-2xl font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction H4({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h4\n className={cn(\n \"scroll-m-20 text-xl font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction P({\n className,\n ...props\n}: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n className={cn(\"leading-7 [&:not(:first-child)]:mt-6\", className)}\n {...props}\n />\n );\n}\n\nfunction Lead({\n className,\n ...props\n}: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n className={cn(\"text-xl text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction Large({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction Small({\n className,\n ...props\n}: React.HTMLAttributes<HTMLElement>) {\n return (\n <small\n className={cn(\"text-sm font-medium leading-none\", className)}\n {...props}\n />\n );\n}\n\nfunction Muted({\n className,\n ...props\n}: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { H1, H2, H3, H4, P, Lead, Large, Small, Muted };\n"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useDataProvider } from './chunk-JEECTX26.js';
|
|
3
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
4
|
+
import { useQueryClient, useQuery, useMutation } from '@tanstack/react-query';
|
|
5
|
+
|
|
6
|
+
function useResource(resource, options = {}) {
|
|
7
|
+
const {
|
|
8
|
+
defaultSort,
|
|
9
|
+
defaultFilters,
|
|
10
|
+
defaultPerPage = 25,
|
|
11
|
+
select,
|
|
12
|
+
searchFields: searchFieldsOption,
|
|
13
|
+
enabled = true,
|
|
14
|
+
onCreateSuccess,
|
|
15
|
+
onUpdateSuccess,
|
|
16
|
+
onDeleteSuccess,
|
|
17
|
+
onError
|
|
18
|
+
} = options;
|
|
19
|
+
const provider = useDataProvider();
|
|
20
|
+
const queryClient = useQueryClient();
|
|
21
|
+
const [sort, setSort] = useState(defaultSort);
|
|
22
|
+
const [filters, setFilters] = useState(defaultFilters ?? []);
|
|
23
|
+
const [page, setPage] = useState(1);
|
|
24
|
+
const [perPage, setPerPageRaw] = useState(defaultPerPage);
|
|
25
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
26
|
+
const setPerPage = useCallback((value) => {
|
|
27
|
+
setPerPageRaw(value);
|
|
28
|
+
setPage(1);
|
|
29
|
+
}, []);
|
|
30
|
+
const setSearch = useCallback((query) => {
|
|
31
|
+
setSearchQuery(query);
|
|
32
|
+
setPage(1);
|
|
33
|
+
}, []);
|
|
34
|
+
const params = useMemo(() => {
|
|
35
|
+
const p = {
|
|
36
|
+
pagination: { page, perPage },
|
|
37
|
+
sort,
|
|
38
|
+
filters: filters.length > 0 ? filters : void 0,
|
|
39
|
+
select
|
|
40
|
+
};
|
|
41
|
+
if (searchQuery && searchFieldsOption && searchFieldsOption.length > 0) {
|
|
42
|
+
p.search = { query: searchQuery, fields: searchFieldsOption };
|
|
43
|
+
}
|
|
44
|
+
return p;
|
|
45
|
+
}, [page, perPage, sort, filters, select, searchQuery, searchFieldsOption]);
|
|
46
|
+
const listQueryKey = useMemo(
|
|
47
|
+
() => [resource, "list", params],
|
|
48
|
+
[resource, params]
|
|
49
|
+
);
|
|
50
|
+
const list = useQuery({
|
|
51
|
+
queryKey: listQueryKey,
|
|
52
|
+
queryFn: () => provider.getList(resource, params),
|
|
53
|
+
enabled
|
|
54
|
+
});
|
|
55
|
+
const invalidateResource = useCallback(
|
|
56
|
+
() => queryClient.invalidateQueries({ queryKey: [resource] }),
|
|
57
|
+
[queryClient, resource]
|
|
58
|
+
);
|
|
59
|
+
const createMutation = useMutation({
|
|
60
|
+
mutationFn: async (data) => {
|
|
61
|
+
const result = await provider.create(resource, { data });
|
|
62
|
+
return result.data;
|
|
63
|
+
},
|
|
64
|
+
onSuccess: (data) => {
|
|
65
|
+
invalidateResource();
|
|
66
|
+
onCreateSuccess?.(data);
|
|
67
|
+
},
|
|
68
|
+
onError
|
|
69
|
+
});
|
|
70
|
+
const updateMutation = useMutation({
|
|
71
|
+
mutationFn: async ({ id, data }) => {
|
|
72
|
+
const result = await provider.update(resource, { id, data });
|
|
73
|
+
return result.data;
|
|
74
|
+
},
|
|
75
|
+
onSuccess: (data) => {
|
|
76
|
+
invalidateResource();
|
|
77
|
+
onUpdateSuccess?.(data);
|
|
78
|
+
},
|
|
79
|
+
onError
|
|
80
|
+
});
|
|
81
|
+
const deleteMutation = useMutation({
|
|
82
|
+
mutationFn: async (id) => {
|
|
83
|
+
await provider.deleteOne(resource, { id });
|
|
84
|
+
},
|
|
85
|
+
onSuccess: () => {
|
|
86
|
+
invalidateResource();
|
|
87
|
+
onDeleteSuccess?.();
|
|
88
|
+
},
|
|
89
|
+
onError
|
|
90
|
+
});
|
|
91
|
+
const create = useCallback(
|
|
92
|
+
(data) => createMutation.mutateAsync(data),
|
|
93
|
+
[createMutation]
|
|
94
|
+
);
|
|
95
|
+
const update = useCallback(
|
|
96
|
+
(id, data) => updateMutation.mutateAsync({ id, data }),
|
|
97
|
+
[updateMutation]
|
|
98
|
+
);
|
|
99
|
+
const remove = useCallback(
|
|
100
|
+
(id) => deleteMutation.mutateAsync(id),
|
|
101
|
+
[deleteMutation]
|
|
102
|
+
);
|
|
103
|
+
const isMutating = createMutation.isPending || updateMutation.isPending || deleteMutation.isPending;
|
|
104
|
+
return {
|
|
105
|
+
list,
|
|
106
|
+
params,
|
|
107
|
+
setSort,
|
|
108
|
+
setFilters,
|
|
109
|
+
setPage,
|
|
110
|
+
setPerPage,
|
|
111
|
+
setSearch,
|
|
112
|
+
create,
|
|
113
|
+
update,
|
|
114
|
+
remove,
|
|
115
|
+
isMutating,
|
|
116
|
+
createMutation,
|
|
117
|
+
updateMutation,
|
|
118
|
+
deleteMutation
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export { useResource };
|
|
123
|
+
//# sourceMappingURL=chunk-IKIFQILN.js.map
|
|
124
|
+
//# sourceMappingURL=chunk-IKIFQILN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-resource.ts"],"names":[],"mappings":"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","file":"chunk-IKIFQILN.js","sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport {\n useQuery,\n useMutation,\n useQueryClient,\n type UseQueryResult,\n type UseMutationResult,\n} from \"@tanstack/react-query\";\nimport { useDataProvider } from \"../provider/context\";\nimport type {\n Identifier,\n SortParam,\n FilterParam,\n ListParams,\n ListResult,\n} from \"../provider/types\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface UseResourceOptions<T> {\n defaultSort?: SortParam;\n defaultFilters?: FilterParam[];\n defaultPerPage?: number;\n /** Supabase select/join syntax, e.g. \"*, author:profiles(name)\". */\n select?: string;\n /** Fields to search across when setSearch is called. Required for server-side search. */\n searchFields?: string[];\n /** Disable auto-fetching. */\n enabled?: boolean;\n onCreateSuccess?: (data: T) => void;\n onUpdateSuccess?: (data: T) => void;\n onDeleteSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Return type\n// ---------------------------------------------------------------------------\n\nexport interface UseResourceReturn<T> {\n /** TanStack Query result for the list query. */\n list: UseQueryResult<ListResult<T>>;\n /** Current list params (pagination, sort, filters, search). */\n params: ListParams;\n setSort: (sort: SortParam) => void;\n setFilters: (filters: FilterParam[]) => void;\n setPage: (page: number) => void;\n setPerPage: (perPage: number) => void;\n setSearch: (query: string) => void;\n /** Create a new record. Returns the created item. */\n create: (data: Partial<T>) => Promise<T>;\n /** Update an existing record by id. Returns the updated item. */\n update: (id: Identifier, data: Partial<T>) => Promise<T>;\n /** Delete a record by id. */\n remove: (id: Identifier) => Promise<void>;\n /** True when any mutation is in-flight. */\n isMutating: boolean;\n createMutation: UseMutationResult<T, Error, Partial<T>>;\n updateMutation: UseMutationResult<T, Error, { id: Identifier; data: Partial<T> }>;\n deleteMutation: UseMutationResult<void, Error, Identifier>;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useResource<T = Record<string, unknown>>(\n resource: string,\n options: UseResourceOptions<T> = {},\n): UseResourceReturn<T> {\n const {\n defaultSort,\n defaultFilters,\n defaultPerPage = 25,\n select,\n searchFields: searchFieldsOption,\n enabled = true,\n onCreateSuccess,\n onUpdateSuccess,\n onDeleteSuccess,\n onError,\n } = options;\n\n const provider = useDataProvider();\n const queryClient = useQueryClient();\n\n // -------------------------------------------------------------------------\n // State\n // -------------------------------------------------------------------------\n\n const [sort, setSort] = useState<SortParam | undefined>(defaultSort);\n const [filters, setFilters] = useState<FilterParam[]>(defaultFilters ?? []);\n const [page, setPage] = useState(1);\n const [perPage, setPerPageRaw] = useState(defaultPerPage);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const setPerPage = useCallback((value: number) => {\n setPerPageRaw(value);\n setPage(1);\n }, []);\n\n const setSearch = useCallback((query: string) => {\n setSearchQuery(query);\n setPage(1);\n }, []);\n\n // -------------------------------------------------------------------------\n // Params\n // -------------------------------------------------------------------------\n\n const params = useMemo<ListParams>(() => {\n const p: ListParams = {\n pagination: { page, perPage },\n sort,\n filters: filters.length > 0 ? filters : undefined,\n select,\n };\n if (searchQuery && searchFieldsOption && searchFieldsOption.length > 0) {\n p.search = { query: searchQuery, fields: searchFieldsOption };\n }\n return p;\n }, [page, perPage, sort, filters, select, searchQuery, searchFieldsOption]);\n\n // -------------------------------------------------------------------------\n // List query\n // -------------------------------------------------------------------------\n\n const listQueryKey = useMemo(\n () => [resource, \"list\", params] as const,\n [resource, params],\n );\n\n const list = useQuery<ListResult<T>>({\n queryKey: listQueryKey,\n queryFn: () => provider.getList<T>(resource, params),\n enabled,\n });\n\n // -------------------------------------------------------------------------\n // Mutations\n // -------------------------------------------------------------------------\n\n const invalidateResource = useCallback(\n () => queryClient.invalidateQueries({ queryKey: [resource] }),\n [queryClient, resource],\n );\n\n const createMutation = useMutation<T, Error, Partial<T>>({\n mutationFn: async (data) => {\n const result = await provider.create<T>(resource, { data });\n return result.data;\n },\n onSuccess: (data) => {\n invalidateResource();\n onCreateSuccess?.(data);\n },\n onError,\n });\n\n const updateMutation = useMutation<\n T,\n Error,\n { id: Identifier; data: Partial<T> }\n >({\n mutationFn: async ({ id, data }) => {\n const result = await provider.update<T>(resource, { id, data });\n return result.data;\n },\n onSuccess: (data) => {\n invalidateResource();\n onUpdateSuccess?.(data);\n },\n onError,\n });\n\n const deleteMutation = useMutation<void, Error, Identifier>({\n mutationFn: async (id) => {\n await provider.deleteOne(resource, { id });\n },\n onSuccess: () => {\n invalidateResource();\n onDeleteSuccess?.();\n },\n onError,\n });\n\n // -------------------------------------------------------------------------\n // Convenience wrappers\n // -------------------------------------------------------------------------\n\n const create = useCallback(\n (data: Partial<T>) => createMutation.mutateAsync(data),\n [createMutation],\n );\n\n const update = useCallback(\n (id: Identifier, data: Partial<T>) =>\n updateMutation.mutateAsync({ id, data }),\n [updateMutation],\n );\n\n const remove = useCallback(\n (id: Identifier) => deleteMutation.mutateAsync(id),\n [deleteMutation],\n );\n\n const isMutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n return {\n list,\n params,\n setSort,\n setFilters,\n setPage,\n setPerPage,\n setSearch,\n create,\n update,\n remove,\n isMutating,\n createMutation,\n updateMutation,\n deleteMutation,\n };\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
import '@tanstack/react-query';
|
|
4
|
+
import 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/provider/context.tsx
|
|
7
|
+
var DataProviderContext = createContext(null);
|
|
8
|
+
function useDataProvider() {
|
|
9
|
+
const ctx = useContext(DataProviderContext);
|
|
10
|
+
if (!ctx) {
|
|
11
|
+
throw new Error(
|
|
12
|
+
"useDataProvider must be used inside <DataProviderRoot> or <GenesisProvider>. Wrap your app (or the relevant subtree) in one of these providers."
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
return ctx;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { useDataProvider };
|
|
19
|
+
//# sourceMappingURL=chunk-JEECTX26.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-JEECTX26.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider/context.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,mBAAA,GAAsB,cAAmC,IAAI,CAAA;AAuB5D,SAAS,eAAA,GAAgC;AAC9C,EAAA,MAAM,GAAA,GAAM,WAAW,mBAAmB,CAAA;AAC1C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-JEECTX26.js","sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport type { DataProvider } from \"./types\";\nimport { createMockProvider, type MockProviderOptions } from \"./mock-provider\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst DataProviderContext = createContext<DataProvider | null>(null);\n\n// ---------------------------------------------------------------------------\n// DataProviderRoot — thin context wrapper\n// ---------------------------------------------------------------------------\n\nexport interface DataProviderRootProps {\n provider: DataProvider;\n children: ReactNode;\n}\n\nexport function DataProviderRoot({ provider, children }: DataProviderRootProps) {\n return (\n <DataProviderContext.Provider value={provider}>\n {children}\n </DataProviderContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useDataProvider(): DataProvider {\n const ctx = useContext(DataProviderContext);\n if (!ctx) {\n throw new Error(\n \"useDataProvider must be used inside <DataProviderRoot> or <GenesisProvider>. \" +\n \"Wrap your app (or the relevant subtree) in one of these providers.\",\n );\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// GenesisProvider — convenience wrapper\n// ---------------------------------------------------------------------------\n\ntype Row = Record<string, unknown>;\n\nexport interface GenesisProviderProps {\n children: ReactNode;\n /** Pass a ready-made DataProvider. Mutually exclusive with `mock`. */\n provider?: DataProvider;\n /** Pass mock datasets. Creates a MockProvider internally. */\n mock?: {\n datasets: Record<string, Row[]>;\n options?: MockProviderOptions;\n };\n}\n\nexport function GenesisProvider({\n children,\n provider,\n mock,\n}: GenesisProviderProps) {\n // Build provider from mock datasets when no explicit provider is given.\n const resolvedProvider = useMemo(() => {\n if (provider) return provider;\n if (mock) return createMockProvider(mock.datasets, mock.options);\n throw new Error(\n \"<GenesisProvider> requires either a `provider` or `mock` prop.\",\n );\n }, [provider, mock]);\n\n // Internal QueryClient with sensible defaults.\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n },\n },\n }),\n [],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <DataProviderRoot provider={resolvedProvider}>\n {children}\n </DataProviderRoot>\n </QueryClientProvider>\n );\n}\n"]}
|