@notapublicfigureanymore/relay-sdk 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +9 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +104 -2
- package/dist/index.d.ts +104 -2
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7RGKC52Kcjs = require('./chunk-7RGKC52K.cjs');var _react = require('react');function ii(){let[c,f]=_react.useState.call(void 0, 1500),[l,m]=_react.useState.call(void 0, 1500),[s,o]=_react.useState.call(void 0, !1),[n,u]=_react.useState.call(void 0, "focus"),[p,T]=_react.useState.call(void 0, ""),[a,r]=_react.useState.call(void 0, "egg"),[k,h]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let e=null;if(s&&c>0)e=setInterval(()=>{f(t=>t-1)},1e3);else if(c===0&&s&&(o(!1),n==="focus")){let t=Math.random()<.01;r(t?"alien":"chick")}return()=>{e&&clearInterval(e)}},[s,c,n]),_react.useEffect.call(void 0, ()=>{if(!s&&(a==="chick"||a==="alien"||a==="ghost")||n!=="focus")return;let e=1-c/l;e<.5?r("egg"):e>=.5&&e<1&&r("cracked")},[c,l,s,a,n]);let S=()=>o(!s),x=()=>{o(!1),r("ghost")},g=e=>{o(!1),u(e),r("egg");let t=1500;e==="shortBreak"&&(t=300),e==="longBreak"&&(t=900),f(t),m(t)};return{seconds:c,initialTime:l,isActive:s,mode:n,task:p,storyState:a,soundEnabled:k,setSeconds:f,setInitialTime:m,setIsActive:o,setMode:u,setTask:T,setStoryState:r,setSoundEnabled:h,toggleTimer:S,giveUp:x,switchMode:g,resetTimer:()=>{o(!1),g(n)},setCustomTime:e=>{o(!1),f(e*60),m(e*60),r("egg")}}}exports.Accordion = _chunk7RGKC52Kcjs.b; exports.AccordionContent = _chunk7RGKC52Kcjs.e; exports.AccordionItem = _chunk7RGKC52Kcjs.c; exports.AccordionTrigger = _chunk7RGKC52Kcjs.d; exports.Alert = _chunk7RGKC52Kcjs.t; exports.AlertAction = _chunk7RGKC52Kcjs.w; exports.AlertDescription = _chunk7RGKC52Kcjs.v; exports.AlertDialog = _chunk7RGKC52Kcjs.h; exports.AlertDialogAction = _chunk7RGKC52Kcjs.r; exports.AlertDialogCancel = _chunk7RGKC52Kcjs.s; exports.AlertDialogContent = _chunk7RGKC52Kcjs.l; exports.AlertDialogDescription = _chunk7RGKC52Kcjs.q; exports.AlertDialogFooter = _chunk7RGKC52Kcjs.n; exports.AlertDialogHeader = _chunk7RGKC52Kcjs.m; exports.AlertDialogMedia = _chunk7RGKC52Kcjs.o; exports.AlertDialogOverlay = _chunk7RGKC52Kcjs.k; exports.AlertDialogPortal = _chunk7RGKC52Kcjs.j; exports.AlertDialogTitle = _chunk7RGKC52Kcjs.p; exports.AlertDialogTrigger = _chunk7RGKC52Kcjs.i; exports.AlertTitle = _chunk7RGKC52Kcjs.u; exports.AspectRatio = _chunk7RGKC52Kcjs.x; exports.Avatar = _chunk7RGKC52Kcjs.y; exports.AvatarBadge = _chunk7RGKC52Kcjs.B; exports.AvatarFallback = _chunk7RGKC52Kcjs.A; exports.AvatarGroup = _chunk7RGKC52Kcjs.C; exports.AvatarGroupCount = _chunk7RGKC52Kcjs.D; exports.AvatarImage = _chunk7RGKC52Kcjs.z; exports.Badge = _chunk7RGKC52Kcjs.F; exports.Breadcrumb = _chunk7RGKC52Kcjs.G; exports.BreadcrumbEllipsis = _chunk7RGKC52Kcjs.M; exports.BreadcrumbItem = _chunk7RGKC52Kcjs.I; exports.BreadcrumbLink = _chunk7RGKC52Kcjs.J; exports.BreadcrumbList = _chunk7RGKC52Kcjs.H; exports.BreadcrumbPage = _chunk7RGKC52Kcjs.K; exports.BreadcrumbSeparator = _chunk7RGKC52Kcjs.L; exports.Button = _chunk7RGKC52Kcjs.g; exports.ButtonGroup = _chunk7RGKC52Kcjs.P; exports.ButtonGroupSeparator = _chunk7RGKC52Kcjs.R; exports.ButtonGroupText = _chunk7RGKC52Kcjs.Q; exports.Calendar = _chunk7RGKC52Kcjs.S; exports.CalendarDayButton = _chunk7RGKC52Kcjs.T; exports.Card = _chunk7RGKC52Kcjs.U; exports.CardAction = _chunk7RGKC52Kcjs.Y; exports.CardContent = _chunk7RGKC52Kcjs.Z; exports.CardDescription = _chunk7RGKC52Kcjs.X; exports.CardFooter = _chunk7RGKC52Kcjs._; exports.CardHeader = _chunk7RGKC52Kcjs.V; exports.CardTitle = _chunk7RGKC52Kcjs.W; exports.Carousel = _chunk7RGKC52Kcjs.aa; exports.CarouselContent = _chunk7RGKC52Kcjs.ba; exports.CarouselItem = _chunk7RGKC52Kcjs.ca; exports.CarouselNext = _chunk7RGKC52Kcjs.ea; exports.CarouselPrevious = _chunk7RGKC52Kcjs.da; exports.ChartContainer = _chunk7RGKC52Kcjs.fa; exports.ChartLegend = _chunk7RGKC52Kcjs.ja; exports.ChartLegendContent = _chunk7RGKC52Kcjs.ka; exports.ChartStyle = _chunk7RGKC52Kcjs.ga; exports.ChartTooltip = _chunk7RGKC52Kcjs.ha; exports.ChartTooltipContent = _chunk7RGKC52Kcjs.ia; exports.Checkbox = _chunk7RGKC52Kcjs.la; exports.Collapsible = _chunk7RGKC52Kcjs.ma; exports.CollapsibleContent = _chunk7RGKC52Kcjs.oa; exports.CollapsibleTrigger = _chunk7RGKC52Kcjs.na; exports.Combobox = _chunk7RGKC52Kcjs.xa; exports.ComboboxChip = _chunk7RGKC52Kcjs.Ka; exports.ComboboxChips = _chunk7RGKC52Kcjs.Ja; exports.ComboboxChipsInput = _chunk7RGKC52Kcjs.La; exports.ComboboxCollection = _chunk7RGKC52Kcjs.Ga; exports.ComboboxContent = _chunk7RGKC52Kcjs.Ba; exports.ComboboxEmpty = _chunk7RGKC52Kcjs.Ha; exports.ComboboxGroup = _chunk7RGKC52Kcjs.Ea; exports.ComboboxInput = _chunk7RGKC52Kcjs.Aa; exports.ComboboxItem = _chunk7RGKC52Kcjs.Da; exports.ComboboxLabel = _chunk7RGKC52Kcjs.Fa; exports.ComboboxList = _chunk7RGKC52Kcjs.Ca; exports.ComboboxSeparator = _chunk7RGKC52Kcjs.Ia; exports.ComboboxTrigger = _chunk7RGKC52Kcjs.za; exports.ComboboxValue = _chunk7RGKC52Kcjs.ya; exports.Command = _chunk7RGKC52Kcjs.Xa; exports.CommandDialog = _chunk7RGKC52Kcjs.Ya; exports.CommandEmpty = _chunk7RGKC52Kcjs.$a; exports.CommandGroup = _chunk7RGKC52Kcjs.ab; exports.CommandInput = _chunk7RGKC52Kcjs.Za; exports.CommandItem = _chunk7RGKC52Kcjs.cb; exports.CommandList = _chunk7RGKC52Kcjs._a; exports.CommandSeparator = _chunk7RGKC52Kcjs.bb; exports.CommandShortcut = _chunk7RGKC52Kcjs.db; exports.ContextMenu = _chunk7RGKC52Kcjs.eb; exports.ContextMenuCheckboxItem = _chunk7RGKC52Kcjs.ob; exports.ContextMenuContent = _chunk7RGKC52Kcjs.kb; exports.ContextMenuGroup = _chunk7RGKC52Kcjs.gb; exports.ContextMenuItem = _chunk7RGKC52Kcjs.lb; exports.ContextMenuLabel = _chunk7RGKC52Kcjs.qb; exports.ContextMenuPortal = _chunk7RGKC52Kcjs.hb; exports.ContextMenuRadioGroup = _chunk7RGKC52Kcjs.jb; exports.ContextMenuRadioItem = _chunk7RGKC52Kcjs.pb; exports.ContextMenuSeparator = _chunk7RGKC52Kcjs.rb; exports.ContextMenuShortcut = _chunk7RGKC52Kcjs.sb; exports.ContextMenuSub = _chunk7RGKC52Kcjs.ib; exports.ContextMenuSubContent = _chunk7RGKC52Kcjs.nb; exports.ContextMenuSubTrigger = _chunk7RGKC52Kcjs.mb; exports.ContextMenuTrigger = _chunk7RGKC52Kcjs.fb; exports.Dialog = _chunk7RGKC52Kcjs.Na; exports.DialogClose = _chunk7RGKC52Kcjs.Qa; exports.DialogContent = _chunk7RGKC52Kcjs.Sa; exports.DialogDescription = _chunk7RGKC52Kcjs.Wa; exports.DialogFooter = _chunk7RGKC52Kcjs.Ua; exports.DialogHeader = _chunk7RGKC52Kcjs.Ta; exports.DialogOverlay = _chunk7RGKC52Kcjs.Ra; exports.DialogPortal = _chunk7RGKC52Kcjs.Pa; exports.DialogTitle = _chunk7RGKC52Kcjs.Va; exports.DialogTrigger = _chunk7RGKC52Kcjs.Oa; exports.Drawer = _chunk7RGKC52Kcjs.tb; exports.DrawerClose = _chunk7RGKC52Kcjs.wb; exports.DrawerContent = _chunk7RGKC52Kcjs.yb; exports.DrawerDescription = _chunk7RGKC52Kcjs.Cb; exports.DrawerFooter = _chunk7RGKC52Kcjs.Ab; exports.DrawerHeader = _chunk7RGKC52Kcjs.zb; exports.DrawerOverlay = _chunk7RGKC52Kcjs.xb; exports.DrawerPortal = _chunk7RGKC52Kcjs.vb; exports.DrawerTitle = _chunk7RGKC52Kcjs.Bb; exports.DrawerTrigger = _chunk7RGKC52Kcjs.ub; exports.DropdownMenu = _chunk7RGKC52Kcjs.Db; exports.DropdownMenuCheckboxItem = _chunk7RGKC52Kcjs.Jb; exports.DropdownMenuContent = _chunk7RGKC52Kcjs.Gb; exports.DropdownMenuGroup = _chunk7RGKC52Kcjs.Hb; exports.DropdownMenuItem = _chunk7RGKC52Kcjs.Ib; exports.DropdownMenuLabel = _chunk7RGKC52Kcjs.Mb; exports.DropdownMenuPortal = _chunk7RGKC52Kcjs.Eb; exports.DropdownMenuRadioGroup = _chunk7RGKC52Kcjs.Kb; exports.DropdownMenuRadioItem = _chunk7RGKC52Kcjs.Lb; exports.DropdownMenuSeparator = _chunk7RGKC52Kcjs.Nb; exports.DropdownMenuShortcut = _chunk7RGKC52Kcjs.Ob; exports.DropdownMenuSub = _chunk7RGKC52Kcjs.Pb; exports.DropdownMenuSubContent = _chunk7RGKC52Kcjs.Rb; exports.DropdownMenuSubTrigger = _chunk7RGKC52Kcjs.Qb; exports.DropdownMenuTrigger = _chunk7RGKC52Kcjs.Fb; exports.Empty = _chunk7RGKC52Kcjs.Sb; exports.EmptyContent = _chunk7RGKC52Kcjs.Xb; exports.EmptyDescription = _chunk7RGKC52Kcjs.Wb; exports.EmptyHeader = _chunk7RGKC52Kcjs.Tb; exports.EmptyMedia = _chunk7RGKC52Kcjs.Ub; exports.EmptyTitle = _chunk7RGKC52Kcjs.Vb; exports.Field = _chunk7RGKC52Kcjs.ac; exports.FieldContent = _chunk7RGKC52Kcjs.bc; exports.FieldDescription = _chunk7RGKC52Kcjs.ec; exports.FieldError = _chunk7RGKC52Kcjs.gc; exports.FieldGroup = _chunk7RGKC52Kcjs.$b; exports.FieldLabel = _chunk7RGKC52Kcjs.cc; exports.FieldLegend = _chunk7RGKC52Kcjs._b; exports.FieldSeparator = _chunk7RGKC52Kcjs.fc; exports.FieldSet = _chunk7RGKC52Kcjs.Zb; exports.FieldTitle = _chunk7RGKC52Kcjs.dc; exports.HoverCard = _chunk7RGKC52Kcjs.hc; exports.HoverCardContent = _chunk7RGKC52Kcjs.jc; exports.HoverCardTrigger = _chunk7RGKC52Kcjs.ic; exports.Input = _chunk7RGKC52Kcjs.pa; exports.InputGroup = _chunk7RGKC52Kcjs.ra; exports.InputGroupAddon = _chunk7RGKC52Kcjs.sa; exports.InputGroupButton = _chunk7RGKC52Kcjs.ta; exports.InputGroupInput = _chunk7RGKC52Kcjs.va; exports.InputGroupText = _chunk7RGKC52Kcjs.ua; exports.InputGroupTextarea = _chunk7RGKC52Kcjs.wa; exports.InputOTP = _chunk7RGKC52Kcjs.kc; exports.InputOTPGroup = _chunk7RGKC52Kcjs.lc; exports.InputOTPSeparator = _chunk7RGKC52Kcjs.nc; exports.InputOTPSlot = _chunk7RGKC52Kcjs.mc; exports.Item = _chunk7RGKC52Kcjs.qc; exports.ItemActions = _chunk7RGKC52Kcjs.vc; exports.ItemContent = _chunk7RGKC52Kcjs.sc; exports.ItemDescription = _chunk7RGKC52Kcjs.uc; exports.ItemFooter = _chunk7RGKC52Kcjs.xc; exports.ItemGroup = _chunk7RGKC52Kcjs.oc; exports.ItemHeader = _chunk7RGKC52Kcjs.wc; exports.ItemMedia = _chunk7RGKC52Kcjs.rc; exports.ItemSeparator = _chunk7RGKC52Kcjs.pc; exports.ItemTitle = _chunk7RGKC52Kcjs.tc; exports.Kbd = _chunk7RGKC52Kcjs.yc; exports.KbdGroup = _chunk7RGKC52Kcjs.zc; exports.Label = _chunk7RGKC52Kcjs.Yb; exports.Menubar = _chunk7RGKC52Kcjs.Ac; exports.MenubarCheckboxItem = _chunk7RGKC52Kcjs.Ic; exports.MenubarContent = _chunk7RGKC52Kcjs.Gc; exports.MenubarGroup = _chunk7RGKC52Kcjs.Cc; exports.MenubarItem = _chunk7RGKC52Kcjs.Hc; exports.MenubarLabel = _chunk7RGKC52Kcjs.Kc; exports.MenubarMenu = _chunk7RGKC52Kcjs.Bc; exports.MenubarPortal = _chunk7RGKC52Kcjs.Dc; exports.MenubarRadioGroup = _chunk7RGKC52Kcjs.Ec; exports.MenubarRadioItem = _chunk7RGKC52Kcjs.Jc; exports.MenubarSeparator = _chunk7RGKC52Kcjs.Lc; exports.MenubarShortcut = _chunk7RGKC52Kcjs.Mc; exports.MenubarSub = _chunk7RGKC52Kcjs.Nc; exports.MenubarSubContent = _chunk7RGKC52Kcjs.Pc; exports.MenubarSubTrigger = _chunk7RGKC52Kcjs.Oc; exports.MenubarTrigger = _chunk7RGKC52Kcjs.Fc; exports.NavigationMenu = _chunk7RGKC52Kcjs.Qc; exports.NavigationMenuContent = _chunk7RGKC52Kcjs.Vc; exports.NavigationMenuIndicator = _chunk7RGKC52Kcjs.Yc; exports.NavigationMenuItem = _chunk7RGKC52Kcjs.Sc; exports.NavigationMenuLink = _chunk7RGKC52Kcjs.Xc; exports.NavigationMenuList = _chunk7RGKC52Kcjs.Rc; exports.NavigationMenuTrigger = _chunk7RGKC52Kcjs.Uc; exports.NavigationMenuViewport = _chunk7RGKC52Kcjs.Wc; exports.Pagination = _chunk7RGKC52Kcjs.Zc; exports.PaginationContent = _chunk7RGKC52Kcjs._c; exports.PaginationEllipsis = _chunk7RGKC52Kcjs.dd; exports.PaginationItem = _chunk7RGKC52Kcjs.$c; exports.PaginationLink = _chunk7RGKC52Kcjs.ad; exports.PaginationNext = _chunk7RGKC52Kcjs.cd; exports.PaginationPrevious = _chunk7RGKC52Kcjs.bd; exports.Popover = _chunk7RGKC52Kcjs.ed; exports.PopoverAnchor = _chunk7RGKC52Kcjs.hd; exports.PopoverContent = _chunk7RGKC52Kcjs.gd; exports.PopoverDescription = _chunk7RGKC52Kcjs.kd; exports.PopoverHeader = _chunk7RGKC52Kcjs.id; exports.PopoverTitle = _chunk7RGKC52Kcjs.jd; exports.PopoverTrigger = _chunk7RGKC52Kcjs.fd; exports.Progress = _chunk7RGKC52Kcjs.ld; exports.RadioGroup = _chunk7RGKC52Kcjs.md; exports.RadioGroupItem = _chunk7RGKC52Kcjs.nd; exports.ResizableHandle = _chunk7RGKC52Kcjs.qd; exports.ResizablePanel = _chunk7RGKC52Kcjs.pd; exports.ResizablePanelGroup = _chunk7RGKC52Kcjs.od; exports.ScrollArea = _chunk7RGKC52Kcjs.rd; exports.ScrollBar = _chunk7RGKC52Kcjs.sd; exports.Select = _chunk7RGKC52Kcjs.td; exports.SelectContent = _chunk7RGKC52Kcjs.xd; exports.SelectGroup = _chunk7RGKC52Kcjs.ud; exports.SelectItem = _chunk7RGKC52Kcjs.zd; exports.SelectLabel = _chunk7RGKC52Kcjs.yd; exports.SelectScrollDownButton = _chunk7RGKC52Kcjs.Cd; exports.SelectScrollUpButton = _chunk7RGKC52Kcjs.Bd; exports.SelectSeparator = _chunk7RGKC52Kcjs.Ad; exports.SelectTrigger = _chunk7RGKC52Kcjs.wd; exports.SelectValue = _chunk7RGKC52Kcjs.vd; exports.Separator = _chunk7RGKC52Kcjs.N; exports.Sheet = _chunk7RGKC52Kcjs.Dd; exports.SheetClose = _chunk7RGKC52Kcjs.Fd; exports.SheetContent = _chunk7RGKC52Kcjs.Gd; exports.SheetDescription = _chunk7RGKC52Kcjs.Kd; exports.SheetFooter = _chunk7RGKC52Kcjs.Id; exports.SheetHeader = _chunk7RGKC52Kcjs.Hd; exports.SheetTitle = _chunk7RGKC52Kcjs.Jd; exports.SheetTrigger = _chunk7RGKC52Kcjs.Ed; exports.Sidebar = _chunk7RGKC52Kcjs.Td; exports.SidebarContent = _chunk7RGKC52Kcjs.$d; exports.SidebarFooter = _chunk7RGKC52Kcjs.Zd; exports.SidebarGroup = _chunk7RGKC52Kcjs.ae; exports.SidebarGroupAction = _chunk7RGKC52Kcjs.ce; exports.SidebarGroupContent = _chunk7RGKC52Kcjs.de; exports.SidebarGroupLabel = _chunk7RGKC52Kcjs.be; exports.SidebarHeader = _chunk7RGKC52Kcjs.Yd; exports.SidebarInput = _chunk7RGKC52Kcjs.Xd; exports.SidebarInset = _chunk7RGKC52Kcjs.Wd; exports.SidebarMenu = _chunk7RGKC52Kcjs.ee; exports.SidebarMenuAction = _chunk7RGKC52Kcjs.he; exports.SidebarMenuBadge = _chunk7RGKC52Kcjs.ie; exports.SidebarMenuButton = _chunk7RGKC52Kcjs.ge; exports.SidebarMenuItem = _chunk7RGKC52Kcjs.fe; exports.SidebarMenuSkeleton = _chunk7RGKC52Kcjs.je; exports.SidebarMenuSub = _chunk7RGKC52Kcjs.ke; exports.SidebarMenuSubButton = _chunk7RGKC52Kcjs.me; exports.SidebarMenuSubItem = _chunk7RGKC52Kcjs.le; exports.SidebarProvider = _chunk7RGKC52Kcjs.Sd; exports.SidebarRail = _chunk7RGKC52Kcjs.Vd; exports.SidebarSeparator = _chunk7RGKC52Kcjs._d; exports.SidebarTrigger = _chunk7RGKC52Kcjs.Ud; exports.Skeleton = _chunk7RGKC52Kcjs.Ld; exports.Slider = _chunk7RGKC52Kcjs.ne; exports.Spinner = _chunk7RGKC52Kcjs.pe; exports.Switch = _chunk7RGKC52Kcjs.qe; exports.Table = _chunk7RGKC52Kcjs.re; exports.TableBody = _chunk7RGKC52Kcjs.te; exports.TableCaption = _chunk7RGKC52Kcjs.ye; exports.TableCell = _chunk7RGKC52Kcjs.xe; exports.TableFooter = _chunk7RGKC52Kcjs.ue; exports.TableHead = _chunk7RGKC52Kcjs.we; exports.TableHeader = _chunk7RGKC52Kcjs.se; exports.TableRow = _chunk7RGKC52Kcjs.ve; exports.Tabs = _chunk7RGKC52Kcjs.ze; exports.TabsContent = _chunk7RGKC52Kcjs.De; exports.TabsList = _chunk7RGKC52Kcjs.Be; exports.TabsTrigger = _chunk7RGKC52Kcjs.Ce; exports.Textarea = _chunk7RGKC52Kcjs.qa; exports.Toaster = _chunk7RGKC52Kcjs.oe; exports.Toggle = _chunk7RGKC52Kcjs.Fe; exports.ToggleGroup = _chunk7RGKC52Kcjs.Ge; exports.ToggleGroupItem = _chunk7RGKC52Kcjs.He; exports.Tooltip = _chunk7RGKC52Kcjs.Nd; exports.TooltipContent = _chunk7RGKC52Kcjs.Pd; exports.TooltipProvider = _chunk7RGKC52Kcjs.Md; exports.TooltipTrigger = _chunk7RGKC52Kcjs.Od; exports.badgeVariants = _chunk7RGKC52Kcjs.E; exports.buttonGroupVariants = _chunk7RGKC52Kcjs.O; exports.buttonVariants = _chunk7RGKC52Kcjs.f; exports.cn = _chunk7RGKC52Kcjs.a; exports.navigationMenuTriggerStyle = _chunk7RGKC52Kcjs.Tc; exports.tabsListVariants = _chunk7RGKC52Kcjs.Ae; exports.toggleVariants = _chunk7RGKC52Kcjs.Ee; exports.useCarousel = _chunk7RGKC52Kcjs.$; exports.useComboboxAnchor = _chunk7RGKC52Kcjs.Ma; exports.useFocusTimer = ii; exports.useIsMobile = _chunk7RGKC52Kcjs.Qd; exports.useSidebar = _chunk7RGKC52Kcjs.Rd;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk7RGKC52Kcjs = require('./chunk-7RGKC52K.cjs');var _react = require('react');function S(){let[t,e]=_react.useState.call(void 0, {isOpen:!1,height:0});return _react.useEffect.call(void 0, ()=>{if(!/iPad|iPhone|iPod|Android/.test(navigator.userAgent))return;let o=()=>{if(!window.visualViewport)return;let i=window.visualViewport,a=window.innerHeight-i.height,l=a>100;e({isOpen:l,height:l?a:0})};window.visualViewport&&(window.visualViewport.addEventListener("resize",o),window.visualViewport.addEventListener("scroll",o));let n=i=>{let a=i.target;(a.tagName==="INPUT"||a.tagName==="TEXTAREA")&&setTimeout(o,100)},s=()=>{setTimeout(()=>{e({isOpen:!1,height:0})},100)};return document.addEventListener("focusin",n),document.addEventListener("focusout",s),o(),()=>{_optionalChain([window, 'access', _2 => _2.visualViewport, 'optionalAccess', _3 => _3.removeEventListener, 'call', _4 => _4("resize",o)]),_optionalChain([window, 'access', _5 => _5.visualViewport, 'optionalAccess', _6 => _6.removeEventListener, 'call', _7 => _7("scroll",o)]),document.removeEventListener("focusin",n),document.removeEventListener("focusout",s)}},[]),t}function Ss(){return _react.useCallback.call(void 0, ()=>{window.parent!==window&&window.parent.postMessage("relay:close","*"),window.opener&&window.opener.postMessage("relay:close","*"),window.close()},[])}var _jsxruntime = require('react/jsx-runtime');var b={top:0,bottom:0,left:0,right:0},y=_react.createContext.call(void 0, b);function As({children:t}){let[e,r]=_react.useState.call(void 0, b);return _react.useEffect.call(void 0, ()=>{let o=()=>{let s=getComputedStyle(document.documentElement),i=d=>{let u=s.getPropertyValue(`--safe-area-inset-${d}`);return parseInt(u)||0},a=i("top"),l=i("bottom"),h=i("left"),p=i("right");if(a===0&&l===0){let d=document.createElement("div");d.style.cssText=`
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: env(safe-area-inset-top, 0px);
|
|
4
|
+
bottom: env(safe-area-inset-bottom, 0px);
|
|
5
|
+
left: env(safe-area-inset-left, 0px);
|
|
6
|
+
right: env(safe-area-inset-right, 0px);
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
visibility: hidden;
|
|
9
|
+
`,document.body.appendChild(d);let u=d.getBoundingClientRect();a=u.top,l=window.innerHeight-u.bottom,h=u.left,p=window.innerWidth-u.right,document.body.removeChild(d)}r({top:a,bottom:l,left:h,right:p})},n=s=>{_optionalChain([s, 'access', _8 => _8.data, 'optionalAccess', _9 => _9.type])==="relay:safearea"&&r(s.data.insets)};return o(),window.addEventListener("message",n),window.addEventListener("resize",o),()=>{window.removeEventListener("message",n),window.removeEventListener("resize",o)}},[]),_jsxruntime.jsx.call(void 0, y.Provider,{value:e,children:t})}function E(){return _react.useContext.call(void 0, y)}function ks(){let[t,e]=_react.useState.call(void 0, ()=>window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return _react.useEffect.call(void 0, ()=>{let r=window.matchMedia("(prefers-color-scheme: dark)"),o=n=>{e(n.matches?"dark":"light")};return r.addEventListener("change",o),()=>r.removeEventListener("change",o)},[]),t}function Ls(t){_react.useEffect.call(void 0, ()=>{let e=document.querySelector('meta[name="theme-color"]');e||(e=document.createElement("meta"),e.setAttribute("name","theme-color"),document.head.appendChild(e)),e.setAttribute("content",t),_optionalChain([window, 'access', _10 => _10.parent, 'optionalAccess', _11 => _11.postMessage, 'call', _12 => _12({type:"relay:statusbar",color:t},"*")])},[t])}function Cs(t){_react.useEffect.call(void 0, ()=>{let e=o=>{o.data==="relay:back"&&(t()||_optionalChain([window, 'access', _13 => _13.parent, 'optionalAccess', _14 => _14.postMessage, 'call', _15 => _15("relay:close","*")]))},r=o=>{t()&&window.history.pushState(null,"",window.location.href)};return window.history.pushState(null,"",window.location.href),window.addEventListener("message",e),window.addEventListener("popstate",r),()=>{window.removeEventListener("message",e),window.removeEventListener("popstate",r)}},[t])}function Ps(){let[t,e]=_react.useState.call(void 0, "active");return _react.useEffect.call(void 0, ()=>{let r=()=>{e(document.hidden?"background":"active")},o=n=>{n.data==="relay:foreground"&&e("active"),n.data==="relay:background"&&e("background")};return document.addEventListener("visibilitychange",r),window.addEventListener("message",o),()=>{document.removeEventListener("visibilitychange",r),window.removeEventListener("message",o)}},[]),t}function Bs({children:t,behavior:e="padding",keyboardVerticalOffset:r=0,style:o,className:n}){let s=S(),i=s.height+r,a={...o,transition:"all 0.2s ease-out"};if(s.isOpen)switch(e){case"padding":a.paddingBottom=i;break;case"height":a.height=`calc(100% - ${i}px)`;break;case"position":a.transform=`translateY(-${i}px)`;break}return _jsxruntime.jsx.call(void 0, "div",{style:a,className:n,children:t})}function Ns({children:t,edges:e=["top","bottom","left","right"],style:r,className:o}){let n=E(),s={...r,paddingTop:e.includes("top")?n.top:_optionalChain([r, 'optionalAccess', _16 => _16.paddingTop]),paddingBottom:e.includes("bottom")?n.bottom:_optionalChain([r, 'optionalAccess', _17 => _17.paddingBottom]),paddingLeft:e.includes("left")?n.left:_optionalChain([r, 'optionalAccess', _18 => _18.paddingLeft]),paddingRight:e.includes("right")?n.right:_optionalChain([r, 'optionalAccess', _19 => _19.paddingRight])};return _jsxruntime.jsx.call(void 0, "div",{style:s,className:o,children:t})}function Hs(){let[t,e]=_react.useState.call(void 0, 1500),[r,o]=_react.useState.call(void 0, 1500),[n,s]=_react.useState.call(void 0, !1),[i,a]=_react.useState.call(void 0, "focus"),[l,h]=_react.useState.call(void 0, ""),[p,d]=_react.useState.call(void 0, "egg"),[u,k]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let c=null;if(n&&t>0)c=setInterval(()=>{e(f=>f-1)},1e3);else if(t===0&&n&&(s(!1),i==="focus")){let f=Math.random()<.01;d(f?"alien":"chick")}return()=>{c&&clearInterval(c)}},[n,t,i]),_react.useEffect.call(void 0, ()=>{if(!n&&(p==="chick"||p==="alien"||p==="ghost")||i!=="focus")return;let c=1-t/r;c<.5?d("egg"):c>=.5&&c<1&&d("cracked")},[t,r,n,p,i]);let L=()=>s(!n),C=()=>{s(!1),d("ghost")},w=c=>{s(!1),a(c),d("egg");let f=1500;c==="shortBreak"&&(f=300),c==="longBreak"&&(f=900),e(f),o(f)};return{seconds:t,initialTime:r,isActive:n,mode:i,task:l,storyState:p,soundEnabled:u,setSeconds:e,setInitialTime:o,setIsActive:s,setMode:a,setTask:h,setStoryState:d,setSoundEnabled:k,toggleTimer:L,giveUp:C,switchMode:w,resetTimer:()=>{s(!1),w(i)},setCustomTime:c=>{s(!1),e(c*60),o(c*60),d("egg")}}}exports.Accordion = _chunk7RGKC52Kcjs.b; exports.AccordionContent = _chunk7RGKC52Kcjs.e; exports.AccordionItem = _chunk7RGKC52Kcjs.c; exports.AccordionTrigger = _chunk7RGKC52Kcjs.d; exports.Alert = _chunk7RGKC52Kcjs.t; exports.AlertAction = _chunk7RGKC52Kcjs.w; exports.AlertDescription = _chunk7RGKC52Kcjs.v; exports.AlertDialog = _chunk7RGKC52Kcjs.h; exports.AlertDialogAction = _chunk7RGKC52Kcjs.r; exports.AlertDialogCancel = _chunk7RGKC52Kcjs.s; exports.AlertDialogContent = _chunk7RGKC52Kcjs.l; exports.AlertDialogDescription = _chunk7RGKC52Kcjs.q; exports.AlertDialogFooter = _chunk7RGKC52Kcjs.n; exports.AlertDialogHeader = _chunk7RGKC52Kcjs.m; exports.AlertDialogMedia = _chunk7RGKC52Kcjs.o; exports.AlertDialogOverlay = _chunk7RGKC52Kcjs.k; exports.AlertDialogPortal = _chunk7RGKC52Kcjs.j; exports.AlertDialogTitle = _chunk7RGKC52Kcjs.p; exports.AlertDialogTrigger = _chunk7RGKC52Kcjs.i; exports.AlertTitle = _chunk7RGKC52Kcjs.u; exports.AspectRatio = _chunk7RGKC52Kcjs.x; exports.Avatar = _chunk7RGKC52Kcjs.y; exports.AvatarBadge = _chunk7RGKC52Kcjs.B; exports.AvatarFallback = _chunk7RGKC52Kcjs.A; exports.AvatarGroup = _chunk7RGKC52Kcjs.C; exports.AvatarGroupCount = _chunk7RGKC52Kcjs.D; exports.AvatarImage = _chunk7RGKC52Kcjs.z; exports.Badge = _chunk7RGKC52Kcjs.F; exports.Breadcrumb = _chunk7RGKC52Kcjs.G; exports.BreadcrumbEllipsis = _chunk7RGKC52Kcjs.M; exports.BreadcrumbItem = _chunk7RGKC52Kcjs.I; exports.BreadcrumbLink = _chunk7RGKC52Kcjs.J; exports.BreadcrumbList = _chunk7RGKC52Kcjs.H; exports.BreadcrumbPage = _chunk7RGKC52Kcjs.K; exports.BreadcrumbSeparator = _chunk7RGKC52Kcjs.L; exports.Button = _chunk7RGKC52Kcjs.g; exports.ButtonGroup = _chunk7RGKC52Kcjs.P; exports.ButtonGroupSeparator = _chunk7RGKC52Kcjs.R; exports.ButtonGroupText = _chunk7RGKC52Kcjs.Q; exports.Calendar = _chunk7RGKC52Kcjs.S; exports.CalendarDayButton = _chunk7RGKC52Kcjs.T; exports.Card = _chunk7RGKC52Kcjs.U; exports.CardAction = _chunk7RGKC52Kcjs.Y; exports.CardContent = _chunk7RGKC52Kcjs.Z; exports.CardDescription = _chunk7RGKC52Kcjs.X; exports.CardFooter = _chunk7RGKC52Kcjs._; exports.CardHeader = _chunk7RGKC52Kcjs.V; exports.CardTitle = _chunk7RGKC52Kcjs.W; exports.Carousel = _chunk7RGKC52Kcjs.aa; exports.CarouselContent = _chunk7RGKC52Kcjs.ba; exports.CarouselItem = _chunk7RGKC52Kcjs.ca; exports.CarouselNext = _chunk7RGKC52Kcjs.ea; exports.CarouselPrevious = _chunk7RGKC52Kcjs.da; exports.ChartContainer = _chunk7RGKC52Kcjs.fa; exports.ChartLegend = _chunk7RGKC52Kcjs.ja; exports.ChartLegendContent = _chunk7RGKC52Kcjs.ka; exports.ChartStyle = _chunk7RGKC52Kcjs.ga; exports.ChartTooltip = _chunk7RGKC52Kcjs.ha; exports.ChartTooltipContent = _chunk7RGKC52Kcjs.ia; exports.Checkbox = _chunk7RGKC52Kcjs.la; exports.Collapsible = _chunk7RGKC52Kcjs.ma; exports.CollapsibleContent = _chunk7RGKC52Kcjs.oa; exports.CollapsibleTrigger = _chunk7RGKC52Kcjs.na; exports.Combobox = _chunk7RGKC52Kcjs.xa; exports.ComboboxChip = _chunk7RGKC52Kcjs.Ka; exports.ComboboxChips = _chunk7RGKC52Kcjs.Ja; exports.ComboboxChipsInput = _chunk7RGKC52Kcjs.La; exports.ComboboxCollection = _chunk7RGKC52Kcjs.Ga; exports.ComboboxContent = _chunk7RGKC52Kcjs.Ba; exports.ComboboxEmpty = _chunk7RGKC52Kcjs.Ha; exports.ComboboxGroup = _chunk7RGKC52Kcjs.Ea; exports.ComboboxInput = _chunk7RGKC52Kcjs.Aa; exports.ComboboxItem = _chunk7RGKC52Kcjs.Da; exports.ComboboxLabel = _chunk7RGKC52Kcjs.Fa; exports.ComboboxList = _chunk7RGKC52Kcjs.Ca; exports.ComboboxSeparator = _chunk7RGKC52Kcjs.Ia; exports.ComboboxTrigger = _chunk7RGKC52Kcjs.za; exports.ComboboxValue = _chunk7RGKC52Kcjs.ya; exports.Command = _chunk7RGKC52Kcjs.Xa; exports.CommandDialog = _chunk7RGKC52Kcjs.Ya; exports.CommandEmpty = _chunk7RGKC52Kcjs.$a; exports.CommandGroup = _chunk7RGKC52Kcjs.ab; exports.CommandInput = _chunk7RGKC52Kcjs.Za; exports.CommandItem = _chunk7RGKC52Kcjs.cb; exports.CommandList = _chunk7RGKC52Kcjs._a; exports.CommandSeparator = _chunk7RGKC52Kcjs.bb; exports.CommandShortcut = _chunk7RGKC52Kcjs.db; exports.ContextMenu = _chunk7RGKC52Kcjs.eb; exports.ContextMenuCheckboxItem = _chunk7RGKC52Kcjs.ob; exports.ContextMenuContent = _chunk7RGKC52Kcjs.kb; exports.ContextMenuGroup = _chunk7RGKC52Kcjs.gb; exports.ContextMenuItem = _chunk7RGKC52Kcjs.lb; exports.ContextMenuLabel = _chunk7RGKC52Kcjs.qb; exports.ContextMenuPortal = _chunk7RGKC52Kcjs.hb; exports.ContextMenuRadioGroup = _chunk7RGKC52Kcjs.jb; exports.ContextMenuRadioItem = _chunk7RGKC52Kcjs.pb; exports.ContextMenuSeparator = _chunk7RGKC52Kcjs.rb; exports.ContextMenuShortcut = _chunk7RGKC52Kcjs.sb; exports.ContextMenuSub = _chunk7RGKC52Kcjs.ib; exports.ContextMenuSubContent = _chunk7RGKC52Kcjs.nb; exports.ContextMenuSubTrigger = _chunk7RGKC52Kcjs.mb; exports.ContextMenuTrigger = _chunk7RGKC52Kcjs.fb; exports.Dialog = _chunk7RGKC52Kcjs.Na; exports.DialogClose = _chunk7RGKC52Kcjs.Qa; exports.DialogContent = _chunk7RGKC52Kcjs.Sa; exports.DialogDescription = _chunk7RGKC52Kcjs.Wa; exports.DialogFooter = _chunk7RGKC52Kcjs.Ua; exports.DialogHeader = _chunk7RGKC52Kcjs.Ta; exports.DialogOverlay = _chunk7RGKC52Kcjs.Ra; exports.DialogPortal = _chunk7RGKC52Kcjs.Pa; exports.DialogTitle = _chunk7RGKC52Kcjs.Va; exports.DialogTrigger = _chunk7RGKC52Kcjs.Oa; exports.Drawer = _chunk7RGKC52Kcjs.tb; exports.DrawerClose = _chunk7RGKC52Kcjs.wb; exports.DrawerContent = _chunk7RGKC52Kcjs.yb; exports.DrawerDescription = _chunk7RGKC52Kcjs.Cb; exports.DrawerFooter = _chunk7RGKC52Kcjs.Ab; exports.DrawerHeader = _chunk7RGKC52Kcjs.zb; exports.DrawerOverlay = _chunk7RGKC52Kcjs.xb; exports.DrawerPortal = _chunk7RGKC52Kcjs.vb; exports.DrawerTitle = _chunk7RGKC52Kcjs.Bb; exports.DrawerTrigger = _chunk7RGKC52Kcjs.ub; exports.DropdownMenu = _chunk7RGKC52Kcjs.Db; exports.DropdownMenuCheckboxItem = _chunk7RGKC52Kcjs.Jb; exports.DropdownMenuContent = _chunk7RGKC52Kcjs.Gb; exports.DropdownMenuGroup = _chunk7RGKC52Kcjs.Hb; exports.DropdownMenuItem = _chunk7RGKC52Kcjs.Ib; exports.DropdownMenuLabel = _chunk7RGKC52Kcjs.Mb; exports.DropdownMenuPortal = _chunk7RGKC52Kcjs.Eb; exports.DropdownMenuRadioGroup = _chunk7RGKC52Kcjs.Kb; exports.DropdownMenuRadioItem = _chunk7RGKC52Kcjs.Lb; exports.DropdownMenuSeparator = _chunk7RGKC52Kcjs.Nb; exports.DropdownMenuShortcut = _chunk7RGKC52Kcjs.Ob; exports.DropdownMenuSub = _chunk7RGKC52Kcjs.Pb; exports.DropdownMenuSubContent = _chunk7RGKC52Kcjs.Rb; exports.DropdownMenuSubTrigger = _chunk7RGKC52Kcjs.Qb; exports.DropdownMenuTrigger = _chunk7RGKC52Kcjs.Fb; exports.Empty = _chunk7RGKC52Kcjs.Sb; exports.EmptyContent = _chunk7RGKC52Kcjs.Xb; exports.EmptyDescription = _chunk7RGKC52Kcjs.Wb; exports.EmptyHeader = _chunk7RGKC52Kcjs.Tb; exports.EmptyMedia = _chunk7RGKC52Kcjs.Ub; exports.EmptyTitle = _chunk7RGKC52Kcjs.Vb; exports.Field = _chunk7RGKC52Kcjs.ac; exports.FieldContent = _chunk7RGKC52Kcjs.bc; exports.FieldDescription = _chunk7RGKC52Kcjs.ec; exports.FieldError = _chunk7RGKC52Kcjs.gc; exports.FieldGroup = _chunk7RGKC52Kcjs.$b; exports.FieldLabel = _chunk7RGKC52Kcjs.cc; exports.FieldLegend = _chunk7RGKC52Kcjs._b; exports.FieldSeparator = _chunk7RGKC52Kcjs.fc; exports.FieldSet = _chunk7RGKC52Kcjs.Zb; exports.FieldTitle = _chunk7RGKC52Kcjs.dc; exports.HoverCard = _chunk7RGKC52Kcjs.hc; exports.HoverCardContent = _chunk7RGKC52Kcjs.jc; exports.HoverCardTrigger = _chunk7RGKC52Kcjs.ic; exports.Input = _chunk7RGKC52Kcjs.pa; exports.InputGroup = _chunk7RGKC52Kcjs.ra; exports.InputGroupAddon = _chunk7RGKC52Kcjs.sa; exports.InputGroupButton = _chunk7RGKC52Kcjs.ta; exports.InputGroupInput = _chunk7RGKC52Kcjs.va; exports.InputGroupText = _chunk7RGKC52Kcjs.ua; exports.InputGroupTextarea = _chunk7RGKC52Kcjs.wa; exports.InputOTP = _chunk7RGKC52Kcjs.kc; exports.InputOTPGroup = _chunk7RGKC52Kcjs.lc; exports.InputOTPSeparator = _chunk7RGKC52Kcjs.nc; exports.InputOTPSlot = _chunk7RGKC52Kcjs.mc; exports.Item = _chunk7RGKC52Kcjs.qc; exports.ItemActions = _chunk7RGKC52Kcjs.vc; exports.ItemContent = _chunk7RGKC52Kcjs.sc; exports.ItemDescription = _chunk7RGKC52Kcjs.uc; exports.ItemFooter = _chunk7RGKC52Kcjs.xc; exports.ItemGroup = _chunk7RGKC52Kcjs.oc; exports.ItemHeader = _chunk7RGKC52Kcjs.wc; exports.ItemMedia = _chunk7RGKC52Kcjs.rc; exports.ItemSeparator = _chunk7RGKC52Kcjs.pc; exports.ItemTitle = _chunk7RGKC52Kcjs.tc; exports.Kbd = _chunk7RGKC52Kcjs.yc; exports.KbdGroup = _chunk7RGKC52Kcjs.zc; exports.KeyboardAvoidingView = Bs; exports.Label = _chunk7RGKC52Kcjs.Yb; exports.Menubar = _chunk7RGKC52Kcjs.Ac; exports.MenubarCheckboxItem = _chunk7RGKC52Kcjs.Ic; exports.MenubarContent = _chunk7RGKC52Kcjs.Gc; exports.MenubarGroup = _chunk7RGKC52Kcjs.Cc; exports.MenubarItem = _chunk7RGKC52Kcjs.Hc; exports.MenubarLabel = _chunk7RGKC52Kcjs.Kc; exports.MenubarMenu = _chunk7RGKC52Kcjs.Bc; exports.MenubarPortal = _chunk7RGKC52Kcjs.Dc; exports.MenubarRadioGroup = _chunk7RGKC52Kcjs.Ec; exports.MenubarRadioItem = _chunk7RGKC52Kcjs.Jc; exports.MenubarSeparator = _chunk7RGKC52Kcjs.Lc; exports.MenubarShortcut = _chunk7RGKC52Kcjs.Mc; exports.MenubarSub = _chunk7RGKC52Kcjs.Nc; exports.MenubarSubContent = _chunk7RGKC52Kcjs.Pc; exports.MenubarSubTrigger = _chunk7RGKC52Kcjs.Oc; exports.MenubarTrigger = _chunk7RGKC52Kcjs.Fc; exports.NavigationMenu = _chunk7RGKC52Kcjs.Qc; exports.NavigationMenuContent = _chunk7RGKC52Kcjs.Vc; exports.NavigationMenuIndicator = _chunk7RGKC52Kcjs.Yc; exports.NavigationMenuItem = _chunk7RGKC52Kcjs.Sc; exports.NavigationMenuLink = _chunk7RGKC52Kcjs.Xc; exports.NavigationMenuList = _chunk7RGKC52Kcjs.Rc; exports.NavigationMenuTrigger = _chunk7RGKC52Kcjs.Uc; exports.NavigationMenuViewport = _chunk7RGKC52Kcjs.Wc; exports.Pagination = _chunk7RGKC52Kcjs.Zc; exports.PaginationContent = _chunk7RGKC52Kcjs._c; exports.PaginationEllipsis = _chunk7RGKC52Kcjs.dd; exports.PaginationItem = _chunk7RGKC52Kcjs.$c; exports.PaginationLink = _chunk7RGKC52Kcjs.ad; exports.PaginationNext = _chunk7RGKC52Kcjs.cd; exports.PaginationPrevious = _chunk7RGKC52Kcjs.bd; exports.Popover = _chunk7RGKC52Kcjs.ed; exports.PopoverAnchor = _chunk7RGKC52Kcjs.hd; exports.PopoverContent = _chunk7RGKC52Kcjs.gd; exports.PopoverDescription = _chunk7RGKC52Kcjs.kd; exports.PopoverHeader = _chunk7RGKC52Kcjs.id; exports.PopoverTitle = _chunk7RGKC52Kcjs.jd; exports.PopoverTrigger = _chunk7RGKC52Kcjs.fd; exports.Progress = _chunk7RGKC52Kcjs.ld; exports.RadioGroup = _chunk7RGKC52Kcjs.md; exports.RadioGroupItem = _chunk7RGKC52Kcjs.nd; exports.ResizableHandle = _chunk7RGKC52Kcjs.qd; exports.ResizablePanel = _chunk7RGKC52Kcjs.pd; exports.ResizablePanelGroup = _chunk7RGKC52Kcjs.od; exports.SafeAreaProvider = As; exports.SafeAreaView = Ns; exports.ScrollArea = _chunk7RGKC52Kcjs.rd; exports.ScrollBar = _chunk7RGKC52Kcjs.sd; exports.Select = _chunk7RGKC52Kcjs.td; exports.SelectContent = _chunk7RGKC52Kcjs.xd; exports.SelectGroup = _chunk7RGKC52Kcjs.ud; exports.SelectItem = _chunk7RGKC52Kcjs.zd; exports.SelectLabel = _chunk7RGKC52Kcjs.yd; exports.SelectScrollDownButton = _chunk7RGKC52Kcjs.Cd; exports.SelectScrollUpButton = _chunk7RGKC52Kcjs.Bd; exports.SelectSeparator = _chunk7RGKC52Kcjs.Ad; exports.SelectTrigger = _chunk7RGKC52Kcjs.wd; exports.SelectValue = _chunk7RGKC52Kcjs.vd; exports.Separator = _chunk7RGKC52Kcjs.N; exports.Sheet = _chunk7RGKC52Kcjs.Dd; exports.SheetClose = _chunk7RGKC52Kcjs.Fd; exports.SheetContent = _chunk7RGKC52Kcjs.Gd; exports.SheetDescription = _chunk7RGKC52Kcjs.Kd; exports.SheetFooter = _chunk7RGKC52Kcjs.Id; exports.SheetHeader = _chunk7RGKC52Kcjs.Hd; exports.SheetTitle = _chunk7RGKC52Kcjs.Jd; exports.SheetTrigger = _chunk7RGKC52Kcjs.Ed; exports.Sidebar = _chunk7RGKC52Kcjs.Td; exports.SidebarContent = _chunk7RGKC52Kcjs.$d; exports.SidebarFooter = _chunk7RGKC52Kcjs.Zd; exports.SidebarGroup = _chunk7RGKC52Kcjs.ae; exports.SidebarGroupAction = _chunk7RGKC52Kcjs.ce; exports.SidebarGroupContent = _chunk7RGKC52Kcjs.de; exports.SidebarGroupLabel = _chunk7RGKC52Kcjs.be; exports.SidebarHeader = _chunk7RGKC52Kcjs.Yd; exports.SidebarInput = _chunk7RGKC52Kcjs.Xd; exports.SidebarInset = _chunk7RGKC52Kcjs.Wd; exports.SidebarMenu = _chunk7RGKC52Kcjs.ee; exports.SidebarMenuAction = _chunk7RGKC52Kcjs.he; exports.SidebarMenuBadge = _chunk7RGKC52Kcjs.ie; exports.SidebarMenuButton = _chunk7RGKC52Kcjs.ge; exports.SidebarMenuItem = _chunk7RGKC52Kcjs.fe; exports.SidebarMenuSkeleton = _chunk7RGKC52Kcjs.je; exports.SidebarMenuSub = _chunk7RGKC52Kcjs.ke; exports.SidebarMenuSubButton = _chunk7RGKC52Kcjs.me; exports.SidebarMenuSubItem = _chunk7RGKC52Kcjs.le; exports.SidebarProvider = _chunk7RGKC52Kcjs.Sd; exports.SidebarRail = _chunk7RGKC52Kcjs.Vd; exports.SidebarSeparator = _chunk7RGKC52Kcjs._d; exports.SidebarTrigger = _chunk7RGKC52Kcjs.Ud; exports.Skeleton = _chunk7RGKC52Kcjs.Ld; exports.Slider = _chunk7RGKC52Kcjs.ne; exports.Spinner = _chunk7RGKC52Kcjs.pe; exports.Switch = _chunk7RGKC52Kcjs.qe; exports.Table = _chunk7RGKC52Kcjs.re; exports.TableBody = _chunk7RGKC52Kcjs.te; exports.TableCaption = _chunk7RGKC52Kcjs.ye; exports.TableCell = _chunk7RGKC52Kcjs.xe; exports.TableFooter = _chunk7RGKC52Kcjs.ue; exports.TableHead = _chunk7RGKC52Kcjs.we; exports.TableHeader = _chunk7RGKC52Kcjs.se; exports.TableRow = _chunk7RGKC52Kcjs.ve; exports.Tabs = _chunk7RGKC52Kcjs.ze; exports.TabsContent = _chunk7RGKC52Kcjs.De; exports.TabsList = _chunk7RGKC52Kcjs.Be; exports.TabsTrigger = _chunk7RGKC52Kcjs.Ce; exports.Textarea = _chunk7RGKC52Kcjs.qa; exports.Toaster = _chunk7RGKC52Kcjs.oe; exports.Toggle = _chunk7RGKC52Kcjs.Fe; exports.ToggleGroup = _chunk7RGKC52Kcjs.Ge; exports.ToggleGroupItem = _chunk7RGKC52Kcjs.He; exports.Tooltip = _chunk7RGKC52Kcjs.Nd; exports.TooltipContent = _chunk7RGKC52Kcjs.Pd; exports.TooltipProvider = _chunk7RGKC52Kcjs.Md; exports.TooltipTrigger = _chunk7RGKC52Kcjs.Od; exports.badgeVariants = _chunk7RGKC52Kcjs.E; exports.buttonGroupVariants = _chunk7RGKC52Kcjs.O; exports.buttonVariants = _chunk7RGKC52Kcjs.f; exports.cn = _chunk7RGKC52Kcjs.a; exports.navigationMenuTriggerStyle = _chunk7RGKC52Kcjs.Tc; exports.tabsListVariants = _chunk7RGKC52Kcjs.Ae; exports.toggleVariants = _chunk7RGKC52Kcjs.Ee; exports.useAppState = Ps; exports.useBackHandler = Cs; exports.useCarousel = _chunk7RGKC52Kcjs.$; exports.useColorScheme = ks; exports.useComboboxAnchor = _chunk7RGKC52Kcjs.Ma; exports.useFocusTimer = Hs; exports.useIsMobile = _chunk7RGKC52Kcjs.Qd; exports.useKeyboard = S; exports.useRelayClose = Ss; exports.useSafeArea = E; exports.useSidebar = _chunk7RGKC52Kcjs.Rd; exports.useStatusBar = Ls;
|
|
2
10
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/jas/Desktop/relay/sdk/dist/index.cjs","../src/hooks/use-focus-timer.ts"],"names":["useFocusTimer","seconds","setSeconds","useState","initialTime","setInitialTime","isActive","setIsActive","mode","setMode","task","setTask","storyState","setStoryState","soundEnabled","setSoundEnabled","useEffect","interval","s","isAbducted","progress","toggleTimer","giveUp","switchMode","newMode","newTime","mins"],"mappings":"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","file":"/Users/jas/Desktop/relay/sdk/dist/index.cjs","sourcesContent":[null,"import { useState, useEffect } from 'react';\n\nexport type TimerMode = 'focus' | 'shortBreak' | 'longBreak';\nexport type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';\n\nexport function useFocusTimer() {\n const [seconds, setSeconds] = useState(25 * 60);\n const [initialTime, setInitialTime] = useState(25 * 60);\n const [isActive, setIsActive] = useState(false);\n const [mode, setMode] = useState<TimerMode>('focus');\n const [task, setTask] = useState('');\n const [storyState, setStoryState] = useState<StoryState>('egg');\n const [soundEnabled, setSoundEnabled] = useState(false);\n\n useEffect(() => {\n let interval: any = null;\n\n if (isActive && seconds > 0) {\n interval = setInterval(() => {\n setSeconds((s) => s - 1);\n }, 1000);\n } else if (seconds === 0 && isActive) {\n // Timer Finished\n setIsActive(false);\n if (mode === 'focus') {\n const isAbducted = Math.random() < 0.01;\n setStoryState(isAbducted ? 'alien' : 'chick');\n }\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isActive, seconds, mode]);\n\n // Update Visuals based on progress\n useEffect(() => {\n if (!isActive && (storyState === 'chick' || storyState === 'alien' || storyState === 'ghost')) return;\n\n // Don't change chick state during break\n if (mode !== 'focus') return;\n\n const progress = 1 - (seconds / initialTime);\n\n if (progress < 0.5) {\n setStoryState('egg');\n } else if (progress >= 0.5 && progress < 1) {\n setStoryState('cracked');\n }\n }, [seconds, initialTime, isActive, storyState, mode]);\n\n const toggleTimer = () => setIsActive(!isActive);\n\n const giveUp = () => {\n setIsActive(false);\n setStoryState('ghost');\n };\n\n const switchMode = (newMode: TimerMode) => {\n setIsActive(false);\n setMode(newMode);\n setStoryState('egg'); // Reset chick for new session\n\n // Set Times\n let newTime = 25 * 60;\n if (newMode === 'shortBreak') newTime = 5 * 60;\n if (newMode === 'longBreak') newTime = 15 * 60;\n\n setSeconds(newTime);\n setInitialTime(newTime);\n };\n\n const resetTimer = () => {\n setIsActive(false);\n switchMode(mode); // Re-init current mode\n };\n\n const setCustomTime = (mins: number) => {\n setIsActive(false);\n setSeconds(mins * 60);\n setInitialTime(mins * 60);\n setStoryState('egg');\n };\n\n return {\n seconds,\n initialTime,\n isActive,\n mode,\n task,\n storyState,\n soundEnabled,\n setSeconds,\n setInitialTime,\n setIsActive,\n setMode,\n setTask,\n setStoryState,\n setSoundEnabled,\n toggleTimer,\n giveUp,\n switchMode,\n resetTimer,\n setCustomTime,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/jas/Desktop/relay/sdk/dist/index.cjs","../src/hooks/use-keyboard.ts","../src/hooks/use-platform.tsx","../src/hooks/use-focus-timer.ts"],"names":["useKeyboard","state","setState","useState","useEffect","updateKeyboardState","viewport","keyboardHeight","isOpen","handleFocusIn","e","target","handleFocusOut","useRelayClose","useCallback","defaultInsets","SafeAreaContext","createContext","SafeAreaProvider","children","insets","setInsets","computeInsets","style","getEnv","name","value"],"mappings":"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","file":"/Users/jas/Desktop/relay/sdk/dist/index.cjs","sourcesContent":[null,"import { useState, useEffect, useCallback } from 'react';\n\ninterface KeyboardState {\n isOpen: boolean;\n height: number;\n}\n\n/**\n * useKeyboard - Track virtual keyboard state on mobile devices\n * \n * Uses visualViewport API to detect keyboard height and provides\n * a safe area offset for positioning UI elements above the keyboard.\n * \n * @returns {KeyboardState} - { isOpen: boolean, height: number }\n */\nexport function useKeyboard(): KeyboardState {\n const [state, setState] = useState<KeyboardState>({\n isOpen: false,\n height: 0\n });\n\n useEffect(() => {\n // Check if we're on a mobile device\n const isMobile = /iPad|iPhone|iPod|Android/.test(navigator.userAgent);\n if (!isMobile) return;\n\n const updateKeyboardState = () => {\n if (!window.visualViewport) return;\n\n const viewport = window.visualViewport;\n // Calculate keyboard height: difference between window and viewport height\n const keyboardHeight = window.innerHeight - viewport.height;\n // Consider keyboard open if height is more than 100px (threshold for accessory bars)\n const isOpen = keyboardHeight > 100;\n\n setState({\n isOpen,\n height: isOpen ? keyboardHeight : 0\n });\n };\n\n // Listen to visualViewport changes\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', updateKeyboardState);\n window.visualViewport.addEventListener('scroll', updateKeyboardState);\n }\n\n // Also listen for focus/blur on inputs as fallback\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n // Small delay to let keyboard animate\n setTimeout(updateKeyboardState, 100);\n }\n };\n\n const handleFocusOut = () => {\n // Small delay to let keyboard animate closed\n setTimeout(() => {\n setState({ isOpen: false, height: 0 });\n }, 100);\n };\n\n document.addEventListener('focusin', handleFocusIn);\n document.addEventListener('focusout', handleFocusOut);\n\n // Initial check\n updateKeyboardState();\n\n return () => {\n window.visualViewport?.removeEventListener('resize', updateKeyboardState);\n window.visualViewport?.removeEventListener('scroll', updateKeyboardState);\n document.removeEventListener('focusin', handleFocusIn);\n document.removeEventListener('focusout', handleFocusOut);\n };\n }, []);\n\n return state;\n}\n\n/**\n * useRelayClose - Get the close function for closing the current app\n * \n * Works with both iframe and blob URL contexts.\n * \n * @returns {() => void} - Function to close the current app\n */\nexport function useRelayClose(): () => void {\n const close = useCallback(() => {\n // Try multiple methods to close\n // 1. PostMessage to parent (works in iframe)\n if (window.parent !== window) {\n window.parent.postMessage('relay:close', '*');\n }\n // 2. PostMessage with opener (works if opened as popup)\n if (window.opener) {\n window.opener.postMessage('relay:close', '*');\n }\n // 3. Try self-closing (may not work in all contexts)\n window.close();\n }, []);\n\n return close;\n}\n","import { useState, useEffect, useCallback, createContext, useContext, ReactNode } from 'react';\n\n// ============================================\n// SAFE AREA TYPES & CONTEXT\n// ============================================\n\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nconst defaultInsets: SafeAreaInsets = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n};\n\nconst SafeAreaContext = createContext<SafeAreaInsets>(defaultInsets);\n\n// ============================================\n// SAFE AREA PROVIDER\n// ============================================\n\ninterface SafeAreaProviderProps {\n children: ReactNode;\n}\n\n/**\n * SafeAreaProvider - Provides safe area insets to child components\n * \n * Automatically detects safe areas from:\n * 1. CSS env() values (iOS Safari)\n * 2. Parent Shell postMessage (when running in Relay Shell)\n */\nexport function SafeAreaProvider({ children }: SafeAreaProviderProps) {\n const [insets, setInsets] = useState<SafeAreaInsets>(defaultInsets);\n\n useEffect(() => {\n // Method 1: Read from CSS env() values\n const computeInsets = () => {\n const style = getComputedStyle(document.documentElement);\n const getEnv = (name: string) => {\n const value = style.getPropertyValue(`--safe-area-inset-${name}`);\n return parseInt(value) || 0;\n };\n\n // Try to get from CSS custom properties first\n let top = getEnv('top');\n let bottom = getEnv('bottom');\n let left = getEnv('left');\n let right = getEnv('right');\n\n // If CSS props not set, try to read from env() directly\n if (top === 0 && bottom === 0) {\n // Create a temp element to measure env() values\n const temp = document.createElement('div');\n temp.style.cssText = `\n position: fixed;\n top: env(safe-area-inset-top, 0px);\n bottom: env(safe-area-inset-bottom, 0px);\n left: env(safe-area-inset-left, 0px);\n right: env(safe-area-inset-right, 0px);\n pointer-events: none;\n visibility: hidden;\n `;\n document.body.appendChild(temp);\n const rect = temp.getBoundingClientRect();\n top = rect.top;\n bottom = window.innerHeight - rect.bottom;\n left = rect.left;\n right = window.innerWidth - rect.right;\n document.body.removeChild(temp);\n }\n\n setInsets({ top, bottom, left, right });\n };\n\n // Method 2: Listen for Shell messages\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === 'relay:safearea') {\n setInsets(event.data.insets);\n }\n };\n\n computeInsets();\n window.addEventListener('message', handleMessage);\n window.addEventListener('resize', computeInsets);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('resize', computeInsets);\n };\n }, []);\n\n return (\n <SafeAreaContext.Provider value={insets}>\n {children}\n </SafeAreaContext.Provider>\n );\n}\n\n// ============================================\n// SAFE AREA HOOKS\n// ============================================\n\n/**\n * useSafeArea - Get safe area insets\n * \n * @returns SafeAreaInsets with top, bottom, left, right values in pixels\n */\nexport function useSafeArea(): SafeAreaInsets {\n return useContext(SafeAreaContext);\n}\n\n// ============================================\n// COLOR SCHEME\n// ============================================\n\nexport type ColorScheme = 'light' | 'dark';\n\n/**\n * useColorScheme - Get current system color scheme\n * \n * @returns 'light' | 'dark'\n */\nexport function useColorScheme(): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(() =>\n window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n );\n\n useEffect(() => {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n setScheme(e.matches ? 'dark' : 'light');\n };\n media.addEventListener('change', handler);\n return () => media.removeEventListener('change', handler);\n }, []);\n\n return scheme;\n}\n\n// ============================================\n// STATUS BAR\n// ============================================\n\n/**\n * useStatusBar - Control the status bar appearance\n * \n * @param color - Hex color for the status bar\n */\nexport function useStatusBar(color: string): void {\n useEffect(() => {\n // Update meta theme-color\n let meta = document.querySelector('meta[name=\"theme-color\"]');\n if (!meta) {\n meta = document.createElement('meta');\n meta.setAttribute('name', 'theme-color');\n document.head.appendChild(meta);\n }\n meta.setAttribute('content', color);\n\n // Notify parent Shell\n window.parent?.postMessage({ type: 'relay:statusbar', color }, '*');\n }, [color]);\n}\n\n// ============================================\n// BACK HANDLER\n// ============================================\n\n/**\n * useBackHandler - Handle back navigation\n * \n * @param handler - Return true to prevent default back behavior\n */\nexport function useBackHandler(handler: () => boolean): void {\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:back') {\n const handled = handler();\n if (!handled) {\n // Allow default close behavior\n window.parent?.postMessage('relay:close', '*');\n }\n }\n };\n\n // Also handle browser back button\n const handlePopState = (event: PopStateEvent) => {\n const handled = handler();\n if (handled) {\n // Push a dummy state to prevent navigation\n window.history.pushState(null, '', window.location.href);\n }\n };\n\n // Push initial state for popstate handling\n window.history.pushState(null, '', window.location.href);\n\n window.addEventListener('message', handleMessage);\n window.addEventListener('popstate', handlePopState);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('popstate', handlePopState);\n };\n }, [handler]);\n}\n\n// ============================================\n// APP STATE\n// ============================================\n\nexport type AppState = 'active' | 'background' | 'inactive';\n\n/**\n * useAppState - Track app foreground/background state\n * \n * @returns Current app state\n */\nexport function useAppState(): AppState {\n const [state, setState] = useState<AppState>('active');\n\n useEffect(() => {\n const handleVisibility = () => {\n setState(document.hidden ? 'background' : 'active');\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:foreground') setState('active');\n if (event.data === 'relay:background') setState('background');\n };\n\n document.addEventListener('visibilitychange', handleVisibility);\n window.addEventListener('message', handleMessage);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibility);\n window.removeEventListener('message', handleMessage);\n };\n }, []);\n\n return state;\n}\n","import { useState, useEffect } from 'react';\n\nexport type TimerMode = 'focus' | 'shortBreak' | 'longBreak';\nexport type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';\n\nexport function useFocusTimer() {\n const [seconds, setSeconds] = useState(25 * 60);\n const [initialTime, setInitialTime] = useState(25 * 60);\n const [isActive, setIsActive] = useState(false);\n const [mode, setMode] = useState<TimerMode>('focus');\n const [task, setTask] = useState('');\n const [storyState, setStoryState] = useState<StoryState>('egg');\n const [soundEnabled, setSoundEnabled] = useState(false);\n\n useEffect(() => {\n let interval: any = null;\n\n if (isActive && seconds > 0) {\n interval = setInterval(() => {\n setSeconds((s) => s - 1);\n }, 1000);\n } else if (seconds === 0 && isActive) {\n // Timer Finished\n setIsActive(false);\n if (mode === 'focus') {\n const isAbducted = Math.random() < 0.01;\n setStoryState(isAbducted ? 'alien' : 'chick');\n }\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isActive, seconds, mode]);\n\n // Update Visuals based on progress\n useEffect(() => {\n if (!isActive && (storyState === 'chick' || storyState === 'alien' || storyState === 'ghost')) return;\n\n // Don't change chick state during break\n if (mode !== 'focus') return;\n\n const progress = 1 - (seconds / initialTime);\n\n if (progress < 0.5) {\n setStoryState('egg');\n } else if (progress >= 0.5 && progress < 1) {\n setStoryState('cracked');\n }\n }, [seconds, initialTime, isActive, storyState, mode]);\n\n const toggleTimer = () => setIsActive(!isActive);\n\n const giveUp = () => {\n setIsActive(false);\n setStoryState('ghost');\n };\n\n const switchMode = (newMode: TimerMode) => {\n setIsActive(false);\n setMode(newMode);\n setStoryState('egg'); // Reset chick for new session\n\n // Set Times\n let newTime = 25 * 60;\n if (newMode === 'shortBreak') newTime = 5 * 60;\n if (newMode === 'longBreak') newTime = 15 * 60;\n\n setSeconds(newTime);\n setInitialTime(newTime);\n };\n\n const resetTimer = () => {\n setIsActive(false);\n switchMode(mode); // Re-init current mode\n };\n\n const setCustomTime = (mins: number) => {\n setIsActive(false);\n setSeconds(mins * 60);\n setInitialTime(mins * 60);\n setStoryState('egg');\n };\n\n return {\n seconds,\n initialTime,\n isActive,\n mode,\n task,\n storyState,\n soundEnabled,\n setSeconds,\n setInitialTime,\n setIsActive,\n setMode,\n setTask,\n setStoryState,\n setSoundEnabled,\n toggleTimer,\n giveUp,\n switchMode,\n resetTimer,\n setCustomTime,\n };\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClassValue } from 'clsx';
|
|
2
2
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonGroupVariants, buttonVariants, navigationMenuTriggerStyle, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useSidebar } from './components/ui/index.cjs';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
4
|
import * as React from 'react';
|
|
4
|
-
import 'react
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
5
6
|
import 'radix-ui';
|
|
6
7
|
import 'class-variance-authority/types';
|
|
7
8
|
import 'class-variance-authority';
|
|
@@ -16,6 +17,35 @@ import 'sonner';
|
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
|
18
19
|
|
|
20
|
+
type KeyboardBehavior = 'padding' | 'height' | 'position';
|
|
21
|
+
interface KeyboardAvoidingViewProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
behavior?: KeyboardBehavior;
|
|
24
|
+
keyboardVerticalOffset?: number;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* KeyboardAvoidingView - Automatically adjusts content when keyboard opens
|
|
30
|
+
*
|
|
31
|
+
* @param behavior - How to adjust: 'padding' | 'height' | 'position'
|
|
32
|
+
* @param keyboardVerticalOffset - Additional offset to add
|
|
33
|
+
*/
|
|
34
|
+
declare function KeyboardAvoidingView({ children, behavior, keyboardVerticalOffset, style, className }: KeyboardAvoidingViewProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
type SafeAreaEdge = 'top' | 'bottom' | 'left' | 'right';
|
|
36
|
+
interface SafeAreaViewProps {
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
edges?: SafeAreaEdge[];
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SafeAreaView - Container that respects safe area insets
|
|
44
|
+
*
|
|
45
|
+
* @param edges - Which edges to apply safe area to (default: all)
|
|
46
|
+
*/
|
|
47
|
+
declare function SafeAreaView({ children, edges, style, className }: SafeAreaViewProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
19
49
|
type TimerMode = 'focus' | 'shortBreak' | 'longBreak';
|
|
20
50
|
type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';
|
|
21
51
|
declare function useFocusTimer(): {
|
|
@@ -42,4 +72,76 @@ declare function useFocusTimer(): {
|
|
|
42
72
|
|
|
43
73
|
declare function useIsMobile(): boolean;
|
|
44
74
|
|
|
45
|
-
|
|
75
|
+
interface KeyboardState {
|
|
76
|
+
isOpen: boolean;
|
|
77
|
+
height: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* useKeyboard - Track virtual keyboard state on mobile devices
|
|
81
|
+
*
|
|
82
|
+
* Uses visualViewport API to detect keyboard height and provides
|
|
83
|
+
* a safe area offset for positioning UI elements above the keyboard.
|
|
84
|
+
*
|
|
85
|
+
* @returns {KeyboardState} - { isOpen: boolean, height: number }
|
|
86
|
+
*/
|
|
87
|
+
declare function useKeyboard(): KeyboardState;
|
|
88
|
+
/**
|
|
89
|
+
* useRelayClose - Get the close function for closing the current app
|
|
90
|
+
*
|
|
91
|
+
* Works with both iframe and blob URL contexts.
|
|
92
|
+
*
|
|
93
|
+
* @returns {() => void} - Function to close the current app
|
|
94
|
+
*/
|
|
95
|
+
declare function useRelayClose(): () => void;
|
|
96
|
+
|
|
97
|
+
interface SafeAreaInsets {
|
|
98
|
+
top: number;
|
|
99
|
+
bottom: number;
|
|
100
|
+
left: number;
|
|
101
|
+
right: number;
|
|
102
|
+
}
|
|
103
|
+
interface SafeAreaProviderProps {
|
|
104
|
+
children: ReactNode;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* SafeAreaProvider - Provides safe area insets to child components
|
|
108
|
+
*
|
|
109
|
+
* Automatically detects safe areas from:
|
|
110
|
+
* 1. CSS env() values (iOS Safari)
|
|
111
|
+
* 2. Parent Shell postMessage (when running in Relay Shell)
|
|
112
|
+
*/
|
|
113
|
+
declare function SafeAreaProvider({ children }: SafeAreaProviderProps): react_jsx_runtime.JSX.Element;
|
|
114
|
+
/**
|
|
115
|
+
* useSafeArea - Get safe area insets
|
|
116
|
+
*
|
|
117
|
+
* @returns SafeAreaInsets with top, bottom, left, right values in pixels
|
|
118
|
+
*/
|
|
119
|
+
declare function useSafeArea(): SafeAreaInsets;
|
|
120
|
+
type ColorScheme = 'light' | 'dark';
|
|
121
|
+
/**
|
|
122
|
+
* useColorScheme - Get current system color scheme
|
|
123
|
+
*
|
|
124
|
+
* @returns 'light' | 'dark'
|
|
125
|
+
*/
|
|
126
|
+
declare function useColorScheme(): ColorScheme;
|
|
127
|
+
/**
|
|
128
|
+
* useStatusBar - Control the status bar appearance
|
|
129
|
+
*
|
|
130
|
+
* @param color - Hex color for the status bar
|
|
131
|
+
*/
|
|
132
|
+
declare function useStatusBar(color: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* useBackHandler - Handle back navigation
|
|
135
|
+
*
|
|
136
|
+
* @param handler - Return true to prevent default back behavior
|
|
137
|
+
*/
|
|
138
|
+
declare function useBackHandler(handler: () => boolean): void;
|
|
139
|
+
type AppState = 'active' | 'background' | 'inactive';
|
|
140
|
+
/**
|
|
141
|
+
* useAppState - Track app foreground/background state
|
|
142
|
+
*
|
|
143
|
+
* @returns Current app state
|
|
144
|
+
*/
|
|
145
|
+
declare function useAppState(): AppState;
|
|
146
|
+
|
|
147
|
+
export { type AppState, type ColorScheme, KeyboardAvoidingView, type SafeAreaInsets, SafeAreaProvider, SafeAreaView, type StoryState, type TimerMode, cn, useAppState, useBackHandler, useColorScheme, useFocusTimer, useIsMobile, useKeyboard, useRelayClose, useSafeArea, useStatusBar };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClassValue } from 'clsx';
|
|
2
2
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonGroupVariants, buttonVariants, navigationMenuTriggerStyle, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useSidebar } from './components/ui/index.js';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
4
|
import * as React from 'react';
|
|
4
|
-
import 'react
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
5
6
|
import 'radix-ui';
|
|
6
7
|
import 'class-variance-authority/types';
|
|
7
8
|
import 'class-variance-authority';
|
|
@@ -16,6 +17,35 @@ import 'sonner';
|
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
|
18
19
|
|
|
20
|
+
type KeyboardBehavior = 'padding' | 'height' | 'position';
|
|
21
|
+
interface KeyboardAvoidingViewProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
behavior?: KeyboardBehavior;
|
|
24
|
+
keyboardVerticalOffset?: number;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* KeyboardAvoidingView - Automatically adjusts content when keyboard opens
|
|
30
|
+
*
|
|
31
|
+
* @param behavior - How to adjust: 'padding' | 'height' | 'position'
|
|
32
|
+
* @param keyboardVerticalOffset - Additional offset to add
|
|
33
|
+
*/
|
|
34
|
+
declare function KeyboardAvoidingView({ children, behavior, keyboardVerticalOffset, style, className }: KeyboardAvoidingViewProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
type SafeAreaEdge = 'top' | 'bottom' | 'left' | 'right';
|
|
36
|
+
interface SafeAreaViewProps {
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
edges?: SafeAreaEdge[];
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SafeAreaView - Container that respects safe area insets
|
|
44
|
+
*
|
|
45
|
+
* @param edges - Which edges to apply safe area to (default: all)
|
|
46
|
+
*/
|
|
47
|
+
declare function SafeAreaView({ children, edges, style, className }: SafeAreaViewProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
19
49
|
type TimerMode = 'focus' | 'shortBreak' | 'longBreak';
|
|
20
50
|
type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';
|
|
21
51
|
declare function useFocusTimer(): {
|
|
@@ -42,4 +72,76 @@ declare function useFocusTimer(): {
|
|
|
42
72
|
|
|
43
73
|
declare function useIsMobile(): boolean;
|
|
44
74
|
|
|
45
|
-
|
|
75
|
+
interface KeyboardState {
|
|
76
|
+
isOpen: boolean;
|
|
77
|
+
height: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* useKeyboard - Track virtual keyboard state on mobile devices
|
|
81
|
+
*
|
|
82
|
+
* Uses visualViewport API to detect keyboard height and provides
|
|
83
|
+
* a safe area offset for positioning UI elements above the keyboard.
|
|
84
|
+
*
|
|
85
|
+
* @returns {KeyboardState} - { isOpen: boolean, height: number }
|
|
86
|
+
*/
|
|
87
|
+
declare function useKeyboard(): KeyboardState;
|
|
88
|
+
/**
|
|
89
|
+
* useRelayClose - Get the close function for closing the current app
|
|
90
|
+
*
|
|
91
|
+
* Works with both iframe and blob URL contexts.
|
|
92
|
+
*
|
|
93
|
+
* @returns {() => void} - Function to close the current app
|
|
94
|
+
*/
|
|
95
|
+
declare function useRelayClose(): () => void;
|
|
96
|
+
|
|
97
|
+
interface SafeAreaInsets {
|
|
98
|
+
top: number;
|
|
99
|
+
bottom: number;
|
|
100
|
+
left: number;
|
|
101
|
+
right: number;
|
|
102
|
+
}
|
|
103
|
+
interface SafeAreaProviderProps {
|
|
104
|
+
children: ReactNode;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* SafeAreaProvider - Provides safe area insets to child components
|
|
108
|
+
*
|
|
109
|
+
* Automatically detects safe areas from:
|
|
110
|
+
* 1. CSS env() values (iOS Safari)
|
|
111
|
+
* 2. Parent Shell postMessage (when running in Relay Shell)
|
|
112
|
+
*/
|
|
113
|
+
declare function SafeAreaProvider({ children }: SafeAreaProviderProps): react_jsx_runtime.JSX.Element;
|
|
114
|
+
/**
|
|
115
|
+
* useSafeArea - Get safe area insets
|
|
116
|
+
*
|
|
117
|
+
* @returns SafeAreaInsets with top, bottom, left, right values in pixels
|
|
118
|
+
*/
|
|
119
|
+
declare function useSafeArea(): SafeAreaInsets;
|
|
120
|
+
type ColorScheme = 'light' | 'dark';
|
|
121
|
+
/**
|
|
122
|
+
* useColorScheme - Get current system color scheme
|
|
123
|
+
*
|
|
124
|
+
* @returns 'light' | 'dark'
|
|
125
|
+
*/
|
|
126
|
+
declare function useColorScheme(): ColorScheme;
|
|
127
|
+
/**
|
|
128
|
+
* useStatusBar - Control the status bar appearance
|
|
129
|
+
*
|
|
130
|
+
* @param color - Hex color for the status bar
|
|
131
|
+
*/
|
|
132
|
+
declare function useStatusBar(color: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* useBackHandler - Handle back navigation
|
|
135
|
+
*
|
|
136
|
+
* @param handler - Return true to prevent default back behavior
|
|
137
|
+
*/
|
|
138
|
+
declare function useBackHandler(handler: () => boolean): void;
|
|
139
|
+
type AppState = 'active' | 'background' | 'inactive';
|
|
140
|
+
/**
|
|
141
|
+
* useAppState - Track app foreground/background state
|
|
142
|
+
*
|
|
143
|
+
* @returns Current app state
|
|
144
|
+
*/
|
|
145
|
+
declare function useAppState(): AppState;
|
|
146
|
+
|
|
147
|
+
export { type AppState, type ColorScheme, KeyboardAvoidingView, type SafeAreaInsets, SafeAreaProvider, SafeAreaView, type StoryState, type TimerMode, cn, useAppState, useBackHandler, useColorScheme, useFocusTimer, useIsMobile, useKeyboard, useRelayClose, useSafeArea, useStatusBar };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
import{$ as
|
|
1
|
+
import{$ as Ke,$a as Kt,$b as Ro,$c as On,$d as Or,A as de,Aa as dt,Ab as co,Ac as ln,Ad as lr,Ae as ls,B as ce,Ba as ct,Bb as lo,Bc as pn,Bd as pr,Be as ps,C as le,Ca as lt,Cb as po,Cc as un,Cd as ur,Ce as us,D as pe,Da as pt,Db as uo,Dc as fn,Dd as fr,De as fs,E as ue,Ea as ut,Eb as fo,Ec as mn,Ed as mr,Ee as ms,F as fe,Fa as ft,Fb as mo,Fc as gn,Fd as gr,Fe as gs,G as me,Ga as mt,Gb as go,Gc as hn,Gd as hr,Ge as hs,H as ge,Ha as gt,Hb as ho,Hc as vn,Hd as vr,He as vs,I as he,Ia as ht,Ib as vo,Ic as wn,Id as wr,J as ve,Ja as vt,Jb as wo,Jc as Sn,Jd as Sr,K as we,Ka as wt,Kb as So,Kc as bn,Kd as br,L as Se,La as St,Lb as bo,Lc as yn,Ld as yr,M as be,Ma as bt,Mb as yo,Mc as En,Md as Er,N as ye,Na as yt,Nb as Eo,Nc as xn,Nd as xr,O as Ee,Oa as Et,Ob as xo,Oc as An,Od as Ar,P as xe,Pa as xt,Pb as Ao,Pc as kn,Pd as kr,Q as Ae,Qa as At,Qb as ko,Qc as Ln,Qd as Lr,R as ke,Ra as kt,Rb as Lo,Rc as Cn,Rd as Cr,S as Le,Sa as Lt,Sb as Co,Sc as Pn,Sd as Pr,T as Ce,Ta as Ct,Tb as Po,Tc as Tn,Td as Tr,U as Pe,Ua as Pt,Ub as To,Uc as Mn,Ud as Mr,V as Te,Va as Tt,Vb as Mo,Vc as Vn,Vd as Vr,W as Me,Wa as Mt,Wb as Vo,Wc as In,Wd as Ir,X as Ve,Xa as Vt,Xb as Io,Xc as Bn,Xd as Br,Y as Ie,Ya as It,Yb as Bo,Yc as Nn,Yd as Nr,Z as Be,Za as Bt,Zb as No,Zc as Kn,Zd as Kr,_ as Ne,_a as Nt,_b as Ko,_c as Rn,_d as Rr,a as R,aa as Re,ab as Rt,ac as Oo,ad as Hn,ae as Hr,b as O,ba as Oe,bb as Ot,bc as Ho,bd as zn,be as zr,c as H,ca as He,cb as Ht,cc as zo,cd as Fn,ce as Fr,d as z,da as ze,db as zt,dc as Fo,dd as $n,de as $r,e as F,ea as Fe,eb as Ft,ec as $o,ed as Un,ee as Ur,f as $,fa as $e,fb as $t,fc as Uo,fd as qn,fe as qr,g as U,ga as Ue,gb as Ut,gc as qo,gd as Qn,ge as Qr,h as q,ha as qe,hb as qt,hc as Qo,hd as Wn,he as Wr,i as Q,ia as Qe,ib as Qt,ic as Wo,id as Xn,ie as Xr,j as W,ja as We,jb as Wt,jc as Xo,jd as Yn,je as Yr,k as X,ka as Xe,kb as Xt,kc as Yo,kd as Dn,ke as Dr,l as Y,la as Ye,lb as Yt,lc as Do,ld as Gn,le as Gr,m as D,ma as De,mb as Dt,mc as Go,md as Jn,me as Jr,n as G,na as Ge,nb as Gt,nc as Jo,nd as Zn,ne as Zr,o as J,oa as Je,ob as Jt,oc as Zo,od as _n,oe as _r,p as Z,pa as Ze,pb as Zt,pc as _o,pd as jn,pe as jr,q as _,qa as _e,qb as _t,qc as jo,qd as er,qe as es,r as j,ra as je,rb as jt,rc as en,rd as tr,re as ts,s as ee,sa as et,sb as eo,sc as tn,sd as or,se as os,t as te,ta as tt,tb as to,tc as on,td as nr,te as ns,u as oe,ua as ot,ub as oo,uc as nn,ud as rr,ue as rs,v as ne,va as nt,vb as no,vc as rn,vd as sr,ve as ss,w as re,wa as rt,wb as ro,wc as sn,wd as ir,we as is,x as se,xa as st,xb as so,xc as an,xd as ar,xe as as,y as ie,ya as it,yb as io,yc as dn,yd as dr,ye as ds,z as ae,za as at,zb as ao,zc as cn,zd as cr,ze as cs}from"./chunk-6VSTRIAD.js";import{useState as P,useEffect as T,useCallback as M}from"react";function S(){let[t,e]=P({isOpen:!1,height:0});return T(()=>{if(!/iPad|iPhone|iPod|Android/.test(navigator.userAgent))return;let o=()=>{if(!window.visualViewport)return;let i=window.visualViewport,a=window.innerHeight-i.height,l=a>100;e({isOpen:l,height:l?a:0})};window.visualViewport&&(window.visualViewport.addEventListener("resize",o),window.visualViewport.addEventListener("scroll",o));let n=i=>{let a=i.target;(a.tagName==="INPUT"||a.tagName==="TEXTAREA")&&setTimeout(o,100)},s=()=>{setTimeout(()=>{e({isOpen:!1,height:0})},100)};return document.addEventListener("focusin",n),document.addEventListener("focusout",s),o(),()=>{window.visualViewport?.removeEventListener("resize",o),window.visualViewport?.removeEventListener("scroll",o),document.removeEventListener("focusin",n),document.removeEventListener("focusout",s)}},[]),t}function Ss(){return M(()=>{window.parent!==window&&window.parent.postMessage("relay:close","*"),window.opener&&window.opener.postMessage("relay:close","*"),window.close()},[])}import{useState as v,useEffect as g,createContext as V,useContext as I}from"react";import{jsx as B}from"react/jsx-runtime";var b={top:0,bottom:0,left:0,right:0},y=V(b);function As({children:t}){let[e,r]=v(b);return g(()=>{let o=()=>{let s=getComputedStyle(document.documentElement),i=d=>{let u=s.getPropertyValue(`--safe-area-inset-${d}`);return parseInt(u)||0},a=i("top"),l=i("bottom"),h=i("left"),p=i("right");if(a===0&&l===0){let d=document.createElement("div");d.style.cssText=`
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: env(safe-area-inset-top, 0px);
|
|
4
|
+
bottom: env(safe-area-inset-bottom, 0px);
|
|
5
|
+
left: env(safe-area-inset-left, 0px);
|
|
6
|
+
right: env(safe-area-inset-right, 0px);
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
visibility: hidden;
|
|
9
|
+
`,document.body.appendChild(d);let u=d.getBoundingClientRect();a=u.top,l=window.innerHeight-u.bottom,h=u.left,p=window.innerWidth-u.right,document.body.removeChild(d)}r({top:a,bottom:l,left:h,right:p})},n=s=>{s.data?.type==="relay:safearea"&&r(s.data.insets)};return o(),window.addEventListener("message",n),window.addEventListener("resize",o),()=>{window.removeEventListener("message",n),window.removeEventListener("resize",o)}},[]),B(y.Provider,{value:e,children:t})}function E(){return I(y)}function ks(){let[t,e]=v(()=>window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return g(()=>{let r=window.matchMedia("(prefers-color-scheme: dark)"),o=n=>{e(n.matches?"dark":"light")};return r.addEventListener("change",o),()=>r.removeEventListener("change",o)},[]),t}function Ls(t){g(()=>{let e=document.querySelector('meta[name="theme-color"]');e||(e=document.createElement("meta"),e.setAttribute("name","theme-color"),document.head.appendChild(e)),e.setAttribute("content",t),window.parent?.postMessage({type:"relay:statusbar",color:t},"*")},[t])}function Cs(t){g(()=>{let e=o=>{o.data==="relay:back"&&(t()||window.parent?.postMessage("relay:close","*"))},r=o=>{t()&&window.history.pushState(null,"",window.location.href)};return window.history.pushState(null,"",window.location.href),window.addEventListener("message",e),window.addEventListener("popstate",r),()=>{window.removeEventListener("message",e),window.removeEventListener("popstate",r)}},[t])}function Ps(){let[t,e]=v("active");return g(()=>{let r=()=>{e(document.hidden?"background":"active")},o=n=>{n.data==="relay:foreground"&&e("active"),n.data==="relay:background"&&e("background")};return document.addEventListener("visibilitychange",r),window.addEventListener("message",o),()=>{document.removeEventListener("visibilitychange",r),window.removeEventListener("message",o)}},[]),t}import{jsx as x}from"react/jsx-runtime";function Bs({children:t,behavior:e="padding",keyboardVerticalOffset:r=0,style:o,className:n}){let s=S(),i=s.height+r,a={...o,transition:"all 0.2s ease-out"};if(s.isOpen)switch(e){case"padding":a.paddingBottom=i;break;case"height":a.height=`calc(100% - ${i}px)`;break;case"position":a.transform=`translateY(-${i}px)`;break}return x("div",{style:a,className:n,children:t})}function Ns({children:t,edges:e=["top","bottom","left","right"],style:r,className:o}){let n=E(),s={...r,paddingTop:e.includes("top")?n.top:r?.paddingTop,paddingBottom:e.includes("bottom")?n.bottom:r?.paddingBottom,paddingLeft:e.includes("left")?n.left:r?.paddingLeft,paddingRight:e.includes("right")?n.right:r?.paddingRight};return x("div",{style:s,className:o,children:t})}import{useState as m,useEffect as A}from"react";function Hs(){let[t,e]=m(1500),[r,o]=m(1500),[n,s]=m(!1),[i,a]=m("focus"),[l,h]=m(""),[p,d]=m("egg"),[u,k]=m(!1);A(()=>{let c=null;if(n&&t>0)c=setInterval(()=>{e(f=>f-1)},1e3);else if(t===0&&n&&(s(!1),i==="focus")){let f=Math.random()<.01;d(f?"alien":"chick")}return()=>{c&&clearInterval(c)}},[n,t,i]),A(()=>{if(!n&&(p==="chick"||p==="alien"||p==="ghost")||i!=="focus")return;let c=1-t/r;c<.5?d("egg"):c>=.5&&c<1&&d("cracked")},[t,r,n,p,i]);let L=()=>s(!n),C=()=>{s(!1),d("ghost")},w=c=>{s(!1),a(c),d("egg");let f=1500;c==="shortBreak"&&(f=300),c==="longBreak"&&(f=900),e(f),o(f)};return{seconds:t,initialTime:r,isActive:n,mode:i,task:l,storyState:p,soundEnabled:u,setSeconds:e,setInitialTime:o,setIsActive:s,setMode:a,setTask:h,setStoryState:d,setSoundEnabled:k,toggleTimer:L,giveUp:C,switchMode:w,resetTimer:()=>{s(!1),w(i)},setCustomTime:c=>{s(!1),e(c*60),o(c*60),d("egg")}}}export{O as Accordion,F as AccordionContent,H as AccordionItem,z as AccordionTrigger,te as Alert,re as AlertAction,ne as AlertDescription,q as AlertDialog,j as AlertDialogAction,ee as AlertDialogCancel,Y as AlertDialogContent,_ as AlertDialogDescription,G as AlertDialogFooter,D as AlertDialogHeader,J as AlertDialogMedia,X as AlertDialogOverlay,W as AlertDialogPortal,Z as AlertDialogTitle,Q as AlertDialogTrigger,oe as AlertTitle,se as AspectRatio,ie as Avatar,ce as AvatarBadge,de as AvatarFallback,le as AvatarGroup,pe as AvatarGroupCount,ae as AvatarImage,fe as Badge,me as Breadcrumb,be as BreadcrumbEllipsis,he as BreadcrumbItem,ve as BreadcrumbLink,ge as BreadcrumbList,we as BreadcrumbPage,Se as BreadcrumbSeparator,U as Button,xe as ButtonGroup,ke as ButtonGroupSeparator,Ae as ButtonGroupText,Le as Calendar,Ce as CalendarDayButton,Pe as Card,Ie as CardAction,Be as CardContent,Ve as CardDescription,Ne as CardFooter,Te as CardHeader,Me as CardTitle,Re as Carousel,Oe as CarouselContent,He as CarouselItem,Fe as CarouselNext,ze as CarouselPrevious,$e as ChartContainer,We as ChartLegend,Xe as ChartLegendContent,Ue as ChartStyle,qe as ChartTooltip,Qe as ChartTooltipContent,Ye as Checkbox,De as Collapsible,Je as CollapsibleContent,Ge as CollapsibleTrigger,st as Combobox,wt as ComboboxChip,vt as ComboboxChips,St as ComboboxChipsInput,mt as ComboboxCollection,ct as ComboboxContent,gt as ComboboxEmpty,ut as ComboboxGroup,dt as ComboboxInput,pt as ComboboxItem,ft as ComboboxLabel,lt as ComboboxList,ht as ComboboxSeparator,at as ComboboxTrigger,it as ComboboxValue,Vt as Command,It as CommandDialog,Kt as CommandEmpty,Rt as CommandGroup,Bt as CommandInput,Ht as CommandItem,Nt as CommandList,Ot as CommandSeparator,zt as CommandShortcut,Ft as ContextMenu,Jt as ContextMenuCheckboxItem,Xt as ContextMenuContent,Ut as ContextMenuGroup,Yt as ContextMenuItem,_t as ContextMenuLabel,qt as ContextMenuPortal,Wt as ContextMenuRadioGroup,Zt as ContextMenuRadioItem,jt as ContextMenuSeparator,eo as ContextMenuShortcut,Qt as ContextMenuSub,Gt as ContextMenuSubContent,Dt as ContextMenuSubTrigger,$t as ContextMenuTrigger,yt as Dialog,At as DialogClose,Lt as DialogContent,Mt as DialogDescription,Pt as DialogFooter,Ct as DialogHeader,kt as DialogOverlay,xt as DialogPortal,Tt as DialogTitle,Et as DialogTrigger,to as Drawer,ro as DrawerClose,io as DrawerContent,po as DrawerDescription,co as DrawerFooter,ao as DrawerHeader,so as DrawerOverlay,no as DrawerPortal,lo as DrawerTitle,oo as DrawerTrigger,uo as DropdownMenu,wo as DropdownMenuCheckboxItem,go as DropdownMenuContent,ho as DropdownMenuGroup,vo as DropdownMenuItem,yo as DropdownMenuLabel,fo as DropdownMenuPortal,So as DropdownMenuRadioGroup,bo as DropdownMenuRadioItem,Eo as DropdownMenuSeparator,xo as DropdownMenuShortcut,Ao as DropdownMenuSub,Lo as DropdownMenuSubContent,ko as DropdownMenuSubTrigger,mo as DropdownMenuTrigger,Co as Empty,Io as EmptyContent,Vo as EmptyDescription,Po as EmptyHeader,To as EmptyMedia,Mo as EmptyTitle,Oo as Field,Ho as FieldContent,$o as FieldDescription,qo as FieldError,Ro as FieldGroup,zo as FieldLabel,Ko as FieldLegend,Uo as FieldSeparator,No as FieldSet,Fo as FieldTitle,Qo as HoverCard,Xo as HoverCardContent,Wo as HoverCardTrigger,Ze as Input,je as InputGroup,et as InputGroupAddon,tt as InputGroupButton,nt as InputGroupInput,ot as InputGroupText,rt as InputGroupTextarea,Yo as InputOTP,Do as InputOTPGroup,Jo as InputOTPSeparator,Go as InputOTPSlot,jo as Item,rn as ItemActions,tn as ItemContent,nn as ItemDescription,an as ItemFooter,Zo as ItemGroup,sn as ItemHeader,en as ItemMedia,_o as ItemSeparator,on as ItemTitle,dn as Kbd,cn as KbdGroup,Bs as KeyboardAvoidingView,Bo as Label,ln as Menubar,wn as MenubarCheckboxItem,hn as MenubarContent,un as MenubarGroup,vn as MenubarItem,bn as MenubarLabel,pn as MenubarMenu,fn as MenubarPortal,mn as MenubarRadioGroup,Sn as MenubarRadioItem,yn as MenubarSeparator,En as MenubarShortcut,xn as MenubarSub,kn as MenubarSubContent,An as MenubarSubTrigger,gn as MenubarTrigger,Ln as NavigationMenu,Vn as NavigationMenuContent,Nn as NavigationMenuIndicator,Pn as NavigationMenuItem,Bn as NavigationMenuLink,Cn as NavigationMenuList,Mn as NavigationMenuTrigger,In as NavigationMenuViewport,Kn as Pagination,Rn as PaginationContent,$n as PaginationEllipsis,On as PaginationItem,Hn as PaginationLink,Fn as PaginationNext,zn as PaginationPrevious,Un as Popover,Wn as PopoverAnchor,Qn as PopoverContent,Dn as PopoverDescription,Xn as PopoverHeader,Yn as PopoverTitle,qn as PopoverTrigger,Gn as Progress,Jn as RadioGroup,Zn as RadioGroupItem,er as ResizableHandle,jn as ResizablePanel,_n as ResizablePanelGroup,As as SafeAreaProvider,Ns as SafeAreaView,tr as ScrollArea,or as ScrollBar,nr as Select,ar as SelectContent,rr as SelectGroup,cr as SelectItem,dr as SelectLabel,ur as SelectScrollDownButton,pr as SelectScrollUpButton,lr as SelectSeparator,ir as SelectTrigger,sr as SelectValue,ye as Separator,fr as Sheet,gr as SheetClose,hr as SheetContent,br as SheetDescription,wr as SheetFooter,vr as SheetHeader,Sr as SheetTitle,mr as SheetTrigger,Tr as Sidebar,Or as SidebarContent,Kr as SidebarFooter,Hr as SidebarGroup,Fr as SidebarGroupAction,$r as SidebarGroupContent,zr as SidebarGroupLabel,Nr as SidebarHeader,Br as SidebarInput,Ir as SidebarInset,Ur as SidebarMenu,Wr as SidebarMenuAction,Xr as SidebarMenuBadge,Qr as SidebarMenuButton,qr as SidebarMenuItem,Yr as SidebarMenuSkeleton,Dr as SidebarMenuSub,Jr as SidebarMenuSubButton,Gr as SidebarMenuSubItem,Pr as SidebarProvider,Vr as SidebarRail,Rr as SidebarSeparator,Mr as SidebarTrigger,yr as Skeleton,Zr as Slider,jr as Spinner,es as Switch,ts as Table,ns as TableBody,ds as TableCaption,as as TableCell,rs as TableFooter,is as TableHead,os as TableHeader,ss as TableRow,cs as Tabs,fs as TabsContent,ps as TabsList,us as TabsTrigger,_e as Textarea,_r as Toaster,gs as Toggle,hs as ToggleGroup,vs as ToggleGroupItem,xr as Tooltip,kr as TooltipContent,Er as TooltipProvider,Ar as TooltipTrigger,ue as badgeVariants,Ee as buttonGroupVariants,$ as buttonVariants,R as cn,Tn as navigationMenuTriggerStyle,ls as tabsListVariants,ms as toggleVariants,Ps as useAppState,Cs as useBackHandler,Ke as useCarousel,ks as useColorScheme,bt as useComboboxAnchor,Hs as useFocusTimer,Lr as useIsMobile,S as useKeyboard,Ss as useRelayClose,E as useSafeArea,Cr as useSidebar,Ls as useStatusBar};
|
|
2
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-focus-timer.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nexport type TimerMode = 'focus' | 'shortBreak' | 'longBreak';\nexport type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';\n\nexport function useFocusTimer() {\n const [seconds, setSeconds] = useState(25 * 60);\n const [initialTime, setInitialTime] = useState(25 * 60);\n const [isActive, setIsActive] = useState(false);\n const [mode, setMode] = useState<TimerMode>('focus');\n const [task, setTask] = useState('');\n const [storyState, setStoryState] = useState<StoryState>('egg');\n const [soundEnabled, setSoundEnabled] = useState(false);\n\n useEffect(() => {\n let interval: any = null;\n\n if (isActive && seconds > 0) {\n interval = setInterval(() => {\n setSeconds((s) => s - 1);\n }, 1000);\n } else if (seconds === 0 && isActive) {\n // Timer Finished\n setIsActive(false);\n if (mode === 'focus') {\n const isAbducted = Math.random() < 0.01;\n setStoryState(isAbducted ? 'alien' : 'chick');\n }\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isActive, seconds, mode]);\n\n // Update Visuals based on progress\n useEffect(() => {\n if (!isActive && (storyState === 'chick' || storyState === 'alien' || storyState === 'ghost')) return;\n\n // Don't change chick state during break\n if (mode !== 'focus') return;\n\n const progress = 1 - (seconds / initialTime);\n\n if (progress < 0.5) {\n setStoryState('egg');\n } else if (progress >= 0.5 && progress < 1) {\n setStoryState('cracked');\n }\n }, [seconds, initialTime, isActive, storyState, mode]);\n\n const toggleTimer = () => setIsActive(!isActive);\n\n const giveUp = () => {\n setIsActive(false);\n setStoryState('ghost');\n };\n\n const switchMode = (newMode: TimerMode) => {\n setIsActive(false);\n setMode(newMode);\n setStoryState('egg'); // Reset chick for new session\n\n // Set Times\n let newTime = 25 * 60;\n if (newMode === 'shortBreak') newTime = 5 * 60;\n if (newMode === 'longBreak') newTime = 15 * 60;\n\n setSeconds(newTime);\n setInitialTime(newTime);\n };\n\n const resetTimer = () => {\n setIsActive(false);\n switchMode(mode); // Re-init current mode\n };\n\n const setCustomTime = (mins: number) => {\n setIsActive(false);\n setSeconds(mins * 60);\n setInitialTime(mins * 60);\n setStoryState('egg');\n };\n\n return {\n seconds,\n initialTime,\n isActive,\n mode,\n task,\n storyState,\n soundEnabled,\n setSeconds,\n setInitialTime,\n setIsActive,\n setMode,\n setTask,\n setStoryState,\n setSoundEnabled,\n toggleTimer,\n giveUp,\n switchMode,\n resetTimer,\n setCustomTime,\n };\n}\n"],"mappings":"unFAAA,OAAS,YAAAA,EAAU,aAAAC,MAAiB,QAK7B,SAASC,IAAgB,CAC5B,GAAM,CAACC,EAASC,CAAU,EAAIJ,EAAS,IAAO,EACxC,CAACK,EAAaC,CAAc,EAAIN,EAAS,IAAO,EAChD,CAACO,EAAUC,CAAW,EAAIR,EAAS,EAAK,EACxC,CAACS,EAAMC,CAAO,EAAIV,EAAoB,OAAO,EAC7C,CAACW,EAAMC,CAAO,EAAIZ,EAAS,EAAE,EAC7B,CAACa,EAAYC,CAAa,EAAId,EAAqB,KAAK,EACxD,CAACe,EAAcC,CAAe,EAAIhB,EAAS,EAAK,EAEtDC,EAAU,IAAM,CACZ,IAAIgB,EAAgB,KAEpB,GAAIV,GAAYJ,EAAU,EACtBc,EAAW,YAAY,IAAM,CACzBb,EAAYc,GAAMA,EAAI,CAAC,CAC3B,EAAG,GAAI,UACAf,IAAY,GAAKI,IAExBC,EAAY,EAAK,EACbC,IAAS,SAAS,CAClB,IAAMU,EAAa,KAAK,OAAO,EAAI,IACnCL,EAAcK,EAAa,QAAU,OAAO,CAChD,CAGJ,MAAO,IAAM,CACLF,GAAU,cAAcA,CAAQ,CACxC,CACJ,EAAG,CAACV,EAAUJ,EAASM,CAAI,CAAC,EAG5BR,EAAU,IAAM,CAIZ,GAHI,CAACM,IAAaM,IAAe,SAAWA,IAAe,SAAWA,IAAe,UAGjFJ,IAAS,QAAS,OAEtB,IAAMW,EAAW,EAAKjB,EAAUE,EAE5Be,EAAW,GACXN,EAAc,KAAK,EACZM,GAAY,IAAOA,EAAW,GACrCN,EAAc,SAAS,CAE/B,EAAG,CAACX,EAASE,EAAaE,EAAUM,EAAYJ,CAAI,CAAC,EAErD,IAAMY,EAAc,IAAMb,EAAY,CAACD,CAAQ,EAEzCe,EAAS,IAAM,CACjBd,EAAY,EAAK,EACjBM,EAAc,OAAO,CACzB,EAEMS,EAAcC,GAAuB,CACvChB,EAAY,EAAK,EACjBE,EAAQc,CAAO,EACfV,EAAc,KAAK,EAGnB,IAAIW,EAAU,KACVD,IAAY,eAAcC,EAAU,KACpCD,IAAY,cAAaC,EAAU,KAEvCrB,EAAWqB,CAAO,EAClBnB,EAAemB,CAAO,CAC1B,EAcA,MAAO,CACH,QAAAtB,EACA,YAAAE,EACA,SAAAE,EACA,KAAAE,EACA,KAAAE,EACA,WAAAE,EACA,aAAAE,EACA,WAAAX,EACA,eAAAE,EACA,YAAAE,EACA,QAAAE,EACA,QAAAE,EACA,cAAAE,EACA,gBAAAE,EACA,YAAAK,EACA,OAAAC,EACA,WAAAC,EACA,WA9Be,IAAM,CACrBf,EAAY,EAAK,EACjBe,EAAWd,CAAI,CACnB,EA4BI,cA1BmBiB,GAAiB,CACpClB,EAAY,EAAK,EACjBJ,EAAWsB,EAAO,EAAE,EACpBpB,EAAeoB,EAAO,EAAE,EACxBZ,EAAc,KAAK,CACvB,CAsBA,CACJ","names":["useState","useEffect","useFocusTimer","seconds","setSeconds","initialTime","setInitialTime","isActive","setIsActive","mode","setMode","task","setTask","storyState","setStoryState","soundEnabled","setSoundEnabled","interval","s","isAbducted","progress","toggleTimer","giveUp","switchMode","newMode","newTime","mins"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-keyboard.ts","../src/hooks/use-platform.tsx","../src/components/platform.tsx","../src/hooks/use-focus-timer.ts"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\n\ninterface KeyboardState {\n isOpen: boolean;\n height: number;\n}\n\n/**\n * useKeyboard - Track virtual keyboard state on mobile devices\n * \n * Uses visualViewport API to detect keyboard height and provides\n * a safe area offset for positioning UI elements above the keyboard.\n * \n * @returns {KeyboardState} - { isOpen: boolean, height: number }\n */\nexport function useKeyboard(): KeyboardState {\n const [state, setState] = useState<KeyboardState>({\n isOpen: false,\n height: 0\n });\n\n useEffect(() => {\n // Check if we're on a mobile device\n const isMobile = /iPad|iPhone|iPod|Android/.test(navigator.userAgent);\n if (!isMobile) return;\n\n const updateKeyboardState = () => {\n if (!window.visualViewport) return;\n\n const viewport = window.visualViewport;\n // Calculate keyboard height: difference between window and viewport height\n const keyboardHeight = window.innerHeight - viewport.height;\n // Consider keyboard open if height is more than 100px (threshold for accessory bars)\n const isOpen = keyboardHeight > 100;\n\n setState({\n isOpen,\n height: isOpen ? keyboardHeight : 0\n });\n };\n\n // Listen to visualViewport changes\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', updateKeyboardState);\n window.visualViewport.addEventListener('scroll', updateKeyboardState);\n }\n\n // Also listen for focus/blur on inputs as fallback\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n // Small delay to let keyboard animate\n setTimeout(updateKeyboardState, 100);\n }\n };\n\n const handleFocusOut = () => {\n // Small delay to let keyboard animate closed\n setTimeout(() => {\n setState({ isOpen: false, height: 0 });\n }, 100);\n };\n\n document.addEventListener('focusin', handleFocusIn);\n document.addEventListener('focusout', handleFocusOut);\n\n // Initial check\n updateKeyboardState();\n\n return () => {\n window.visualViewport?.removeEventListener('resize', updateKeyboardState);\n window.visualViewport?.removeEventListener('scroll', updateKeyboardState);\n document.removeEventListener('focusin', handleFocusIn);\n document.removeEventListener('focusout', handleFocusOut);\n };\n }, []);\n\n return state;\n}\n\n/**\n * useRelayClose - Get the close function for closing the current app\n * \n * Works with both iframe and blob URL contexts.\n * \n * @returns {() => void} - Function to close the current app\n */\nexport function useRelayClose(): () => void {\n const close = useCallback(() => {\n // Try multiple methods to close\n // 1. PostMessage to parent (works in iframe)\n if (window.parent !== window) {\n window.parent.postMessage('relay:close', '*');\n }\n // 2. PostMessage with opener (works if opened as popup)\n if (window.opener) {\n window.opener.postMessage('relay:close', '*');\n }\n // 3. Try self-closing (may not work in all contexts)\n window.close();\n }, []);\n\n return close;\n}\n","import { useState, useEffect, useCallback, createContext, useContext, ReactNode } from 'react';\n\n// ============================================\n// SAFE AREA TYPES & CONTEXT\n// ============================================\n\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nconst defaultInsets: SafeAreaInsets = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n};\n\nconst SafeAreaContext = createContext<SafeAreaInsets>(defaultInsets);\n\n// ============================================\n// SAFE AREA PROVIDER\n// ============================================\n\ninterface SafeAreaProviderProps {\n children: ReactNode;\n}\n\n/**\n * SafeAreaProvider - Provides safe area insets to child components\n * \n * Automatically detects safe areas from:\n * 1. CSS env() values (iOS Safari)\n * 2. Parent Shell postMessage (when running in Relay Shell)\n */\nexport function SafeAreaProvider({ children }: SafeAreaProviderProps) {\n const [insets, setInsets] = useState<SafeAreaInsets>(defaultInsets);\n\n useEffect(() => {\n // Method 1: Read from CSS env() values\n const computeInsets = () => {\n const style = getComputedStyle(document.documentElement);\n const getEnv = (name: string) => {\n const value = style.getPropertyValue(`--safe-area-inset-${name}`);\n return parseInt(value) || 0;\n };\n\n // Try to get from CSS custom properties first\n let top = getEnv('top');\n let bottom = getEnv('bottom');\n let left = getEnv('left');\n let right = getEnv('right');\n\n // If CSS props not set, try to read from env() directly\n if (top === 0 && bottom === 0) {\n // Create a temp element to measure env() values\n const temp = document.createElement('div');\n temp.style.cssText = `\n position: fixed;\n top: env(safe-area-inset-top, 0px);\n bottom: env(safe-area-inset-bottom, 0px);\n left: env(safe-area-inset-left, 0px);\n right: env(safe-area-inset-right, 0px);\n pointer-events: none;\n visibility: hidden;\n `;\n document.body.appendChild(temp);\n const rect = temp.getBoundingClientRect();\n top = rect.top;\n bottom = window.innerHeight - rect.bottom;\n left = rect.left;\n right = window.innerWidth - rect.right;\n document.body.removeChild(temp);\n }\n\n setInsets({ top, bottom, left, right });\n };\n\n // Method 2: Listen for Shell messages\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === 'relay:safearea') {\n setInsets(event.data.insets);\n }\n };\n\n computeInsets();\n window.addEventListener('message', handleMessage);\n window.addEventListener('resize', computeInsets);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('resize', computeInsets);\n };\n }, []);\n\n return (\n <SafeAreaContext.Provider value={insets}>\n {children}\n </SafeAreaContext.Provider>\n );\n}\n\n// ============================================\n// SAFE AREA HOOKS\n// ============================================\n\n/**\n * useSafeArea - Get safe area insets\n * \n * @returns SafeAreaInsets with top, bottom, left, right values in pixels\n */\nexport function useSafeArea(): SafeAreaInsets {\n return useContext(SafeAreaContext);\n}\n\n// ============================================\n// COLOR SCHEME\n// ============================================\n\nexport type ColorScheme = 'light' | 'dark';\n\n/**\n * useColorScheme - Get current system color scheme\n * \n * @returns 'light' | 'dark'\n */\nexport function useColorScheme(): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(() =>\n window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n );\n\n useEffect(() => {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n setScheme(e.matches ? 'dark' : 'light');\n };\n media.addEventListener('change', handler);\n return () => media.removeEventListener('change', handler);\n }, []);\n\n return scheme;\n}\n\n// ============================================\n// STATUS BAR\n// ============================================\n\n/**\n * useStatusBar - Control the status bar appearance\n * \n * @param color - Hex color for the status bar\n */\nexport function useStatusBar(color: string): void {\n useEffect(() => {\n // Update meta theme-color\n let meta = document.querySelector('meta[name=\"theme-color\"]');\n if (!meta) {\n meta = document.createElement('meta');\n meta.setAttribute('name', 'theme-color');\n document.head.appendChild(meta);\n }\n meta.setAttribute('content', color);\n\n // Notify parent Shell\n window.parent?.postMessage({ type: 'relay:statusbar', color }, '*');\n }, [color]);\n}\n\n// ============================================\n// BACK HANDLER\n// ============================================\n\n/**\n * useBackHandler - Handle back navigation\n * \n * @param handler - Return true to prevent default back behavior\n */\nexport function useBackHandler(handler: () => boolean): void {\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:back') {\n const handled = handler();\n if (!handled) {\n // Allow default close behavior\n window.parent?.postMessage('relay:close', '*');\n }\n }\n };\n\n // Also handle browser back button\n const handlePopState = (event: PopStateEvent) => {\n const handled = handler();\n if (handled) {\n // Push a dummy state to prevent navigation\n window.history.pushState(null, '', window.location.href);\n }\n };\n\n // Push initial state for popstate handling\n window.history.pushState(null, '', window.location.href);\n\n window.addEventListener('message', handleMessage);\n window.addEventListener('popstate', handlePopState);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('popstate', handlePopState);\n };\n }, [handler]);\n}\n\n// ============================================\n// APP STATE\n// ============================================\n\nexport type AppState = 'active' | 'background' | 'inactive';\n\n/**\n * useAppState - Track app foreground/background state\n * \n * @returns Current app state\n */\nexport function useAppState(): AppState {\n const [state, setState] = useState<AppState>('active');\n\n useEffect(() => {\n const handleVisibility = () => {\n setState(document.hidden ? 'background' : 'active');\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:foreground') setState('active');\n if (event.data === 'relay:background') setState('background');\n };\n\n document.addEventListener('visibilitychange', handleVisibility);\n window.addEventListener('message', handleMessage);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibility);\n window.removeEventListener('message', handleMessage);\n };\n }, []);\n\n return state;\n}\n","import React, { ReactNode, CSSProperties } from 'react';\nimport { useKeyboard } from '../hooks/use-keyboard';\nimport { useSafeArea } from '../hooks/use-platform';\n\n// ============================================\n// KEYBOARD AVOIDING VIEW\n// ============================================\n\ntype KeyboardBehavior = 'padding' | 'height' | 'position';\n\ninterface KeyboardAvoidingViewProps {\n children: ReactNode;\n behavior?: KeyboardBehavior;\n keyboardVerticalOffset?: number;\n style?: CSSProperties;\n className?: string;\n}\n\n/**\n * KeyboardAvoidingView - Automatically adjusts content when keyboard opens\n * \n * @param behavior - How to adjust: 'padding' | 'height' | 'position'\n * @param keyboardVerticalOffset - Additional offset to add\n */\nexport function KeyboardAvoidingView({\n children,\n behavior = 'padding',\n keyboardVerticalOffset = 0,\n style,\n className\n}: KeyboardAvoidingViewProps) {\n const keyboard = useKeyboard();\n const offset = keyboard.height + keyboardVerticalOffset;\n\n const computedStyle: CSSProperties = {\n ...style,\n transition: 'all 0.2s ease-out',\n };\n\n if (keyboard.isOpen) {\n switch (behavior) {\n case 'padding':\n computedStyle.paddingBottom = offset;\n break;\n case 'height':\n computedStyle.height = `calc(100% - ${offset}px)`;\n break;\n case 'position':\n computedStyle.transform = `translateY(-${offset}px)`;\n break;\n }\n }\n\n return (\n <div style={computedStyle} className={className}>\n {children}\n </div>\n );\n}\n\n// ============================================\n// SAFE AREA VIEW\n// ============================================\n\ntype SafeAreaEdge = 'top' | 'bottom' | 'left' | 'right';\n\ninterface SafeAreaViewProps {\n children: ReactNode;\n edges?: SafeAreaEdge[];\n style?: CSSProperties;\n className?: string;\n}\n\n/**\n * SafeAreaView - Container that respects safe area insets\n * \n * @param edges - Which edges to apply safe area to (default: all)\n */\nexport function SafeAreaView({\n children,\n edges = ['top', 'bottom', 'left', 'right'],\n style,\n className\n}: SafeAreaViewProps) {\n const insets = useSafeArea();\n\n const computedStyle: CSSProperties = {\n ...style,\n paddingTop: edges.includes('top') ? insets.top : style?.paddingTop,\n paddingBottom: edges.includes('bottom') ? insets.bottom : style?.paddingBottom,\n paddingLeft: edges.includes('left') ? insets.left : style?.paddingLeft,\n paddingRight: edges.includes('right') ? insets.right : style?.paddingRight,\n };\n\n return (\n <div style={computedStyle} className={className}>\n {children}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\n\nexport type TimerMode = 'focus' | 'shortBreak' | 'longBreak';\nexport type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';\n\nexport function useFocusTimer() {\n const [seconds, setSeconds] = useState(25 * 60);\n const [initialTime, setInitialTime] = useState(25 * 60);\n const [isActive, setIsActive] = useState(false);\n const [mode, setMode] = useState<TimerMode>('focus');\n const [task, setTask] = useState('');\n const [storyState, setStoryState] = useState<StoryState>('egg');\n const [soundEnabled, setSoundEnabled] = useState(false);\n\n useEffect(() => {\n let interval: any = null;\n\n if (isActive && seconds > 0) {\n interval = setInterval(() => {\n setSeconds((s) => s - 1);\n }, 1000);\n } else if (seconds === 0 && isActive) {\n // Timer Finished\n setIsActive(false);\n if (mode === 'focus') {\n const isAbducted = Math.random() < 0.01;\n setStoryState(isAbducted ? 'alien' : 'chick');\n }\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isActive, seconds, mode]);\n\n // Update Visuals based on progress\n useEffect(() => {\n if (!isActive && (storyState === 'chick' || storyState === 'alien' || storyState === 'ghost')) return;\n\n // Don't change chick state during break\n if (mode !== 'focus') return;\n\n const progress = 1 - (seconds / initialTime);\n\n if (progress < 0.5) {\n setStoryState('egg');\n } else if (progress >= 0.5 && progress < 1) {\n setStoryState('cracked');\n }\n }, [seconds, initialTime, isActive, storyState, mode]);\n\n const toggleTimer = () => setIsActive(!isActive);\n\n const giveUp = () => {\n setIsActive(false);\n setStoryState('ghost');\n };\n\n const switchMode = (newMode: TimerMode) => {\n setIsActive(false);\n setMode(newMode);\n setStoryState('egg'); // Reset chick for new session\n\n // Set Times\n let newTime = 25 * 60;\n if (newMode === 'shortBreak') newTime = 5 * 60;\n if (newMode === 'longBreak') newTime = 15 * 60;\n\n setSeconds(newTime);\n setInitialTime(newTime);\n };\n\n const resetTimer = () => {\n setIsActive(false);\n switchMode(mode); // Re-init current mode\n };\n\n const setCustomTime = (mins: number) => {\n setIsActive(false);\n setSeconds(mins * 60);\n setInitialTime(mins * 60);\n setStoryState('egg');\n };\n\n return {\n seconds,\n initialTime,\n isActive,\n mode,\n task,\n storyState,\n soundEnabled,\n setSeconds,\n setInitialTime,\n setIsActive,\n setMode,\n setTask,\n setStoryState,\n setSoundEnabled,\n toggleTimer,\n giveUp,\n switchMode,\n resetTimer,\n setCustomTime,\n };\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useKeyboard","state","setState","updateKeyboardState","viewport","keyboardHeight","isOpen","handleFocusIn","e","target","handleFocusOut","useRelayClose","useState","useEffect","createContext","useContext","jsx","defaultInsets","SafeAreaContext","SafeAreaProvider","children","insets","setInsets","computeInsets","style","getEnv","name","value","top","bottom","left","right","temp","rect","handleMessage","event","useSafeArea","useColorScheme","scheme","setScheme","media","handler","e","useStatusBar","color","meta","useBackHandler","handlePopState","useAppState","state","setState","handleVisibility","jsx","KeyboardAvoidingView","children","behavior","keyboardVerticalOffset","style","className","keyboard","useKeyboard","offset","computedStyle","SafeAreaView","edges","insets","useSafeArea","useState","useEffect","useFocusTimer","seconds","setSeconds","initialTime","setInitialTime","isActive","setIsActive","mode","setMode","task","setTask","storyState","setStoryState","soundEnabled","setSoundEnabled","interval","s","isAbducted","progress","toggleTimer","giveUp","switchMode","newMode","newTime","mins"]}
|