@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 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
@@ -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/jsx-runtime';
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
- export { type StoryState, type TimerMode, cn, useFocusTimer, useIsMobile };
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/jsx-runtime';
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
- export { type StoryState, type TimerMode, cn, useFocusTimer, useIsMobile };
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 ve,$a as vt,$b as vs,$c as bo,$d as br,A as X,Aa as Xe,Ab as Xt,Ac as Xs,Ad as Yo,Ae as Yr,B as Y,Ba as Ye,Bb as Yt,Bc as Ys,Bd as Zo,Be as Zr,C as Z,Ca as Ze,Cb as Zt,Cc as Zs,Cd as _o,Ce as _r,D as _,Da as _e,Db as _t,Dc as _s,Dd as $o,De as $r,E as $,Ea as $e,Eb as $t,Ec as $s,Ed as er,Ee as ei,F as ee,Fa as et,Fb as es,Fc as eo,Fd as tr,Fe as ti,G as te,Ga as tt,Gb as ts,Gc as to,Gd as sr,Ge as si,H as se,Ha as st,Hb as ss,Hc as so,Hd as or,He as oi,I as oe,Ia as ot,Ib as os,Ic as oo,Id as rr,J as re,Ja as rt,Jb as rs,Jc as ro,Jd as ir,K as ie,Ka as it,Kb as is,Kc as io,Kd as cr,L as ce,La as ct,Lb as cs,Lc as co,Ld as nr,M as ne,Ma as nt,Mb as ns,Mc as no,Md as ar,N as ae,Na as at,Nb as as,Nc as ao,Nd as fr,O as fe,Oa as ft,Ob as fs,Oc as fo,Od as lr,P as le,Pa as lt,Pb as ls,Pc as lo,Pd as mr,Q as me,Qa as mt,Qb as ms,Qc as mo,Qd as ur,R as ue,Ra as ut,Rb as us,Rc as uo,Rd as gr,S as ge,Sa as gt,Sb as gs,Sc as go,Sd as dr,T as de,Ta as dt,Tb as ds,Tc as po,Td as pr,U as pe,Ua as pt,Ub as ps,Uc as To,Ud as Tr,V as Te,Va as Tt,Vb as Ts,Vc as ko,Vd as kr,W as ke,Wa as kt,Wb as ks,Wc as ho,Wd as hr,X as he,Xa as ht,Xb as hs,Xc as So,Xd as Sr,Y as Se,Ya as St,Yb as Ss,Yc as xo,Yd as xr,Z as xe,Za as xt,Zb as xs,Zc as yo,Zd as yr,_ as ye,_a as yt,_b as ys,_c as vo,_d as vr,a as b,aa as be,ab as bt,ac as bs,ad as Bo,ae as Br,b as B,ba as Be,bb as Bt,bc as Bs,bd as Io,be as Ir,c as I,ca as Ie,cb as It,cc as Is,cd as Mo,ce as Mr,d as M,da as Me,db as Mt,dc as Ms,dd as Ao,de as Ar,e as A,ea as Ae,eb as At,ec as As,ed as Eo,ee as Er,f as E,fa as Ee,fb as Et,fc as Es,fd as Co,fe as Cr,g as C,ga as Ce,gb as Ct,gc as Cs,gd as Fo,ge as Fr,h as F,ha as Fe,hb as Ft,hc as Fs,hd as Uo,he as Ur,i as U,ia as Ue,ib as Ut,ic as Us,id as jo,ie as jr,j,ja as je,jb as jt,jc as js,jd as qo,je as qr,k as q,ka as qe,kb as qt,kc as qs,kd as wo,ke as wr,l as w,la as we,lb as wt,lc as ws,ld as zo,le as zr,m as z,ma as ze,mb as zt,mc as zs,md as Do,me as Dr,n as D,na as De,nb as Dt,nc as Ds,nd as Go,ne as Gr,o as G,oa as Ge,ob as Gt,oc as Gs,od as Ho,oe as Hr,p as H,pa as He,pb as Ht,pc as Hs,pd as Jo,pe as Jr,q as J,qa as Je,qb as Jt,qc as Js,qd as Ko,qe as Kr,r as K,ra as Ke,rb as Kt,rc as Ks,rd as Lo,re as Lr,s as L,sa as Le,sb as Lt,sc as Ls,sd as No,se as Nr,t as N,ta as Ne,tb as Nt,tc as Ns,td as Oo,te as Or,u as O,ua as Oe,ub as Ot,uc as Os,ud as Po,ue as Pr,v as P,va as Pe,vb as Pt,vc as Ps,vd as Qo,ve as Qr,w as Q,wa as Qe,wb as Qt,wc as Qs,wd as Ro,we as Rr,x as R,xa as Re,xb as Rt,xc as Rs,xd as Vo,xe as Vr,y as V,ya as Ve,yb as Vt,yc as Vs,yd as Wo,ye as Wr,z as W,za as We,zb as Wt,zc as Ws,zd as Xo,ze as Xr}from"./chunk-6VSTRIAD.js";import{useState as i,useEffect as d}from"react";function ii(){let[c,f]=i(1500),[l,m]=i(1500),[s,o]=i(!1),[n,u]=i("focus"),[p,T]=i(""),[a,r]=i("egg"),[k,h]=i(!1);d(()=>{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]),d(()=>{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")}}}export{B as Accordion,A as AccordionContent,I as AccordionItem,M as AccordionTrigger,N as Alert,Q as AlertAction,P as AlertDescription,F as AlertDialog,K as AlertDialogAction,L as AlertDialogCancel,w as AlertDialogContent,J as AlertDialogDescription,D as AlertDialogFooter,z as AlertDialogHeader,G as AlertDialogMedia,q as AlertDialogOverlay,j as AlertDialogPortal,H as AlertDialogTitle,U as AlertDialogTrigger,O as AlertTitle,R as AspectRatio,V as Avatar,Y as AvatarBadge,X as AvatarFallback,Z as AvatarGroup,_ as AvatarGroupCount,W as AvatarImage,ee as Badge,te as Breadcrumb,ne as BreadcrumbEllipsis,oe as BreadcrumbItem,re as BreadcrumbLink,se as BreadcrumbList,ie as BreadcrumbPage,ce as BreadcrumbSeparator,C as Button,le as ButtonGroup,ue as ButtonGroupSeparator,me as ButtonGroupText,ge as Calendar,de as CalendarDayButton,pe as Card,Se as CardAction,xe as CardContent,he as CardDescription,ye as CardFooter,Te as CardHeader,ke as CardTitle,be as Carousel,Be as CarouselContent,Ie as CarouselItem,Ae as CarouselNext,Me as CarouselPrevious,Ee as ChartContainer,je as ChartLegend,qe as ChartLegendContent,Ce as ChartStyle,Fe as ChartTooltip,Ue as ChartTooltipContent,we as Checkbox,ze as Collapsible,Ge as CollapsibleContent,De as CollapsibleTrigger,Re as Combobox,it as ComboboxChip,rt as ComboboxChips,ct as ComboboxChipsInput,tt as ComboboxCollection,Ye as ComboboxContent,st as ComboboxEmpty,$e as ComboboxGroup,Xe as ComboboxInput,_e as ComboboxItem,et as ComboboxLabel,Ze as ComboboxList,ot as ComboboxSeparator,We as ComboboxTrigger,Ve as ComboboxValue,ht as Command,St as CommandDialog,vt as CommandEmpty,bt as CommandGroup,xt as CommandInput,It as CommandItem,yt as CommandList,Bt as CommandSeparator,Mt as CommandShortcut,At as ContextMenu,Gt as ContextMenuCheckboxItem,qt as ContextMenuContent,Ct as ContextMenuGroup,wt as ContextMenuItem,Jt as ContextMenuLabel,Ft as ContextMenuPortal,jt as ContextMenuRadioGroup,Ht as ContextMenuRadioItem,Kt as ContextMenuSeparator,Lt as ContextMenuShortcut,Ut as ContextMenuSub,Dt as ContextMenuSubContent,zt as ContextMenuSubTrigger,Et as ContextMenuTrigger,at as Dialog,mt as DialogClose,gt as DialogContent,kt as DialogDescription,pt as DialogFooter,dt as DialogHeader,ut as DialogOverlay,lt as DialogPortal,Tt as DialogTitle,ft as DialogTrigger,Nt as Drawer,Qt as DrawerClose,Vt as DrawerContent,Zt as DrawerDescription,Xt as DrawerFooter,Wt as DrawerHeader,Rt as DrawerOverlay,Pt as DrawerPortal,Yt as DrawerTitle,Ot as DrawerTrigger,_t as DropdownMenu,rs as DropdownMenuCheckboxItem,ts as DropdownMenuContent,ss as DropdownMenuGroup,os as DropdownMenuItem,ns as DropdownMenuLabel,$t as DropdownMenuPortal,is as DropdownMenuRadioGroup,cs as DropdownMenuRadioItem,as as DropdownMenuSeparator,fs as DropdownMenuShortcut,ls as DropdownMenuSub,us as DropdownMenuSubContent,ms as DropdownMenuSubTrigger,es as DropdownMenuTrigger,gs as Empty,hs as EmptyContent,ks as EmptyDescription,ds as EmptyHeader,ps as EmptyMedia,Ts as EmptyTitle,bs as Field,Bs as FieldContent,As as FieldDescription,Cs as FieldError,vs as FieldGroup,Is as FieldLabel,ys as FieldLegend,Es as FieldSeparator,xs as FieldSet,Ms as FieldTitle,Fs as HoverCard,js as HoverCardContent,Us as HoverCardTrigger,He as Input,Ke as InputGroup,Le as InputGroupAddon,Ne as InputGroupButton,Pe as InputGroupInput,Oe as InputGroupText,Qe as InputGroupTextarea,qs as InputOTP,ws as InputOTPGroup,Ds as InputOTPSeparator,zs as InputOTPSlot,Js as Item,Ps as ItemActions,Ls as ItemContent,Os as ItemDescription,Rs as ItemFooter,Gs as ItemGroup,Qs as ItemHeader,Ks as ItemMedia,Hs as ItemSeparator,Ns as ItemTitle,Vs as Kbd,Ws as KbdGroup,Ss as Label,Xs as Menubar,oo as MenubarCheckboxItem,to as MenubarContent,Zs as MenubarGroup,so as MenubarItem,io as MenubarLabel,Ys as MenubarMenu,_s as MenubarPortal,$s as MenubarRadioGroup,ro as MenubarRadioItem,co as MenubarSeparator,no as MenubarShortcut,ao as MenubarSub,lo as MenubarSubContent,fo as MenubarSubTrigger,eo as MenubarTrigger,mo as NavigationMenu,ko as NavigationMenuContent,xo as NavigationMenuIndicator,go as NavigationMenuItem,So as NavigationMenuLink,uo as NavigationMenuList,To as NavigationMenuTrigger,ho as NavigationMenuViewport,yo as Pagination,vo as PaginationContent,Ao as PaginationEllipsis,bo as PaginationItem,Bo as PaginationLink,Mo as PaginationNext,Io as PaginationPrevious,Eo as Popover,Uo as PopoverAnchor,Fo as PopoverContent,wo as PopoverDescription,jo as PopoverHeader,qo as PopoverTitle,Co as PopoverTrigger,zo as Progress,Do as RadioGroup,Go as RadioGroupItem,Ko as ResizableHandle,Jo as ResizablePanel,Ho as ResizablePanelGroup,Lo as ScrollArea,No as ScrollBar,Oo as Select,Vo as SelectContent,Po as SelectGroup,Xo as SelectItem,Wo as SelectLabel,_o as SelectScrollDownButton,Zo as SelectScrollUpButton,Yo as SelectSeparator,Ro as SelectTrigger,Qo as SelectValue,ae as Separator,$o as Sheet,tr as SheetClose,sr as SheetContent,cr as SheetDescription,rr as SheetFooter,or as SheetHeader,ir as SheetTitle,er as SheetTrigger,pr as Sidebar,br as SidebarContent,yr as SidebarFooter,Br as SidebarGroup,Mr as SidebarGroupAction,Ar as SidebarGroupContent,Ir as SidebarGroupLabel,xr as SidebarHeader,Sr as SidebarInput,hr as SidebarInset,Er as SidebarMenu,Ur as SidebarMenuAction,jr as SidebarMenuBadge,Fr as SidebarMenuButton,Cr as SidebarMenuItem,qr as SidebarMenuSkeleton,wr as SidebarMenuSub,Dr as SidebarMenuSubButton,zr as SidebarMenuSubItem,dr as SidebarProvider,kr as SidebarRail,vr as SidebarSeparator,Tr as SidebarTrigger,nr as Skeleton,Gr as Slider,Jr as Spinner,Kr as Switch,Lr as Table,Or as TableBody,Wr as TableCaption,Vr as TableCell,Pr as TableFooter,Rr as TableHead,Nr as TableHeader,Qr as TableRow,Xr as Tabs,$r as TabsContent,Zr as TabsList,_r as TabsTrigger,Je as Textarea,Hr as Toaster,ti as Toggle,si as ToggleGroup,oi as ToggleGroupItem,fr as Tooltip,mr as TooltipContent,ar as TooltipProvider,lr as TooltipTrigger,$ as badgeVariants,fe as buttonGroupVariants,E as buttonVariants,b as cn,po as navigationMenuTriggerStyle,Yr as tabsListVariants,ei as toggleVariants,ve as useCarousel,nt as useComboboxAnchor,ii as useFocusTimer,ur as useIsMobile,gr as useSidebar};
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notapublicfigureanymore/relay-sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "The official SDK for building Relay apps.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",