@notapublicfigureanymore/relay-sdk 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +9 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +82 -2
- package/dist/index.d.ts +82 -2
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 un(){let[n,c]=_react.useState.call(void 0, 1500),[f,t]=_react.useState.call(void 0, 1500),[o,s]=_react.useState.call(void 0, !1),[i,r]=_react.useState.call(void 0, "focus"),[m,g]=_react.useState.call(void 0, ""),[d,u]=_react.useState.call(void 0, "egg"),[v,h]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let e=null;if(o&&n>0)e=setInterval(()=>{c(a=>a-1)},1e3);else if(n===0&&o&&(s(!1),i==="focus")){let a=Math.random()<.01;u(a?"alien":"chick")}return()=>{e&&clearInterval(e)}},[o,n,i]),_react.useEffect.call(void 0, ()=>{if(!o&&(d==="chick"||d==="alien"||d==="ghost")||i!=="focus")return;let e=1-n/f;e<.5?u("egg"):e>=.5&&e<1&&u("cracked")},[n,f,o,d,i]);let T=()=>s(!o),y=()=>{s(!1),u("ghost")},p=e=>{s(!1),r(e),u("egg");let a=1500;e==="shortBreak"&&(a=300),e==="longBreak"&&(a=900),c(a),t(a)};return{seconds:n,initialTime:f,isActive:o,mode:i,task:m,storyState:d,soundEnabled:v,setSeconds:c,setInitialTime:t,setIsActive:s,setMode:r,setTask:g,setStoryState:u,setSoundEnabled:h,toggleTimer:T,giveUp:y,switchMode:p,resetTimer:()=>{s(!1),p(i)},setCustomTime:e=>{s(!1),c(e*60),t(e*60),u("egg")}}}function fn(){let[n,c]=_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 t=()=>{if(!window.visualViewport)return;let i=window.visualViewport,r=window.innerHeight-i.height,m=r>100;c({isOpen:m,height:m?r:0})};window.visualViewport&&(window.visualViewport.addEventListener("resize",t),window.visualViewport.addEventListener("scroll",t));let o=i=>{let r=i.target;(r.tagName==="INPUT"||r.tagName==="TEXTAREA")&&setTimeout(t,100)},s=()=>{setTimeout(()=>{c({isOpen:!1,height:0})},100)};return document.addEventListener("focusin",o),document.addEventListener("focusout",s),t(),()=>{_optionalChain([window, 'access', _2 => _2.visualViewport, 'optionalAccess', _3 => _3.removeEventListener, 'call', _4 => _4("resize",t)]),_optionalChain([window, 'access', _5 => _5.visualViewport, 'optionalAccess', _6 => _6.removeEventListener, 'call', _7 => _7("scroll",t)]),document.removeEventListener("focusin",o),document.removeEventListener("focusout",s)}},[]),n}function mn(){return _react.useCallback.call(void 0, ()=>{window.parent!==window&&window.parent.postMessage("relay:close","*"),window.opener&&window.opener.postMessage("relay:close","*"),window.close()},[])}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 = un; exports.useIsMobile = _chunk7RGKC52Kcjs.Qd; exports.useKeyboard = fn; exports.useRelayClose = mn; exports.useSidebar = _chunk7RGKC52Kcjs.Rd;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk7RGKC52Kcjs = require('./chunk-7RGKC52K.cjs');var _react = require('react');function S(){let[t,e]=_react.useState.call(void 0, {isOpen:!1,height:0});return _react.useEffect.call(void 0, ()=>{if(!/iPad|iPhone|iPod|Android/.test(navigator.userAgent))return;let o=()=>{if(!window.visualViewport)return;let i=window.visualViewport,a=window.innerHeight-i.height,l=a>100;e({isOpen:l,height:l?a:0})};window.visualViewport&&(window.visualViewport.addEventListener("resize",o),window.visualViewport.addEventListener("scroll",o));let n=i=>{let a=i.target;(a.tagName==="INPUT"||a.tagName==="TEXTAREA")&&setTimeout(o,100)},s=()=>{setTimeout(()=>{e({isOpen:!1,height:0})},100)};return document.addEventListener("focusin",n),document.addEventListener("focusout",s),o(),()=>{_optionalChain([window, 'access', _2 => _2.visualViewport, 'optionalAccess', _3 => _3.removeEventListener, 'call', _4 => _4("resize",o)]),_optionalChain([window, 'access', _5 => _5.visualViewport, 'optionalAccess', _6 => _6.removeEventListener, 'call', _7 => _7("scroll",o)]),document.removeEventListener("focusin",n),document.removeEventListener("focusout",s)}},[]),t}function Ss(){return _react.useCallback.call(void 0, ()=>{window.parent!==window&&window.parent.postMessage("relay:close","*"),window.opener&&window.opener.postMessage("relay:close","*"),window.close()},[])}var _jsxruntime = require('react/jsx-runtime');var b={top:0,bottom:0,left:0,right:0},y=_react.createContext.call(void 0, b);function As({children:t}){let[e,r]=_react.useState.call(void 0, b);return _react.useEffect.call(void 0, ()=>{let o=()=>{let s=getComputedStyle(document.documentElement),i=d=>{let u=s.getPropertyValue(`--safe-area-inset-${d}`);return parseInt(u)||0},a=i("top"),l=i("bottom"),h=i("left"),p=i("right");if(a===0&&l===0){let d=document.createElement("div");d.style.cssText=`
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: env(safe-area-inset-top, 0px);
|
|
4
|
+
bottom: env(safe-area-inset-bottom, 0px);
|
|
5
|
+
left: env(safe-area-inset-left, 0px);
|
|
6
|
+
right: env(safe-area-inset-right, 0px);
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
visibility: hidden;
|
|
9
|
+
`,document.body.appendChild(d);let u=d.getBoundingClientRect();a=u.top,l=window.innerHeight-u.bottom,h=u.left,p=window.innerWidth-u.right,document.body.removeChild(d)}r({top:a,bottom:l,left:h,right:p})},n=s=>{_optionalChain([s, 'access', _8 => _8.data, 'optionalAccess', _9 => _9.type])==="relay:safearea"&&r(s.data.insets)};return o(),window.addEventListener("message",n),window.addEventListener("resize",o),()=>{window.removeEventListener("message",n),window.removeEventListener("resize",o)}},[]),_jsxruntime.jsx.call(void 0, y.Provider,{value:e,children:t})}function E(){return _react.useContext.call(void 0, y)}function ks(){let[t,e]=_react.useState.call(void 0, ()=>window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");return _react.useEffect.call(void 0, ()=>{let r=window.matchMedia("(prefers-color-scheme: dark)"),o=n=>{e(n.matches?"dark":"light")};return r.addEventListener("change",o),()=>r.removeEventListener("change",o)},[]),t}function Ls(t){_react.useEffect.call(void 0, ()=>{let e=document.querySelector('meta[name="theme-color"]');e||(e=document.createElement("meta"),e.setAttribute("name","theme-color"),document.head.appendChild(e)),e.setAttribute("content",t),_optionalChain([window, 'access', _10 => _10.parent, 'optionalAccess', _11 => _11.postMessage, 'call', _12 => _12({type:"relay:statusbar",color:t},"*")])},[t])}function Cs(t){_react.useEffect.call(void 0, ()=>{let e=o=>{o.data==="relay:back"&&(t()||_optionalChain([window, 'access', _13 => _13.parent, 'optionalAccess', _14 => _14.postMessage, 'call', _15 => _15("relay:close","*")]))},r=o=>{t()&&window.history.pushState(null,"",window.location.href)};return window.history.pushState(null,"",window.location.href),window.addEventListener("message",e),window.addEventListener("popstate",r),()=>{window.removeEventListener("message",e),window.removeEventListener("popstate",r)}},[t])}function Ps(){let[t,e]=_react.useState.call(void 0, "active");return _react.useEffect.call(void 0, ()=>{let r=()=>{e(document.hidden?"background":"active")},o=n=>{n.data==="relay:foreground"&&e("active"),n.data==="relay:background"&&e("background")};return document.addEventListener("visibilitychange",r),window.addEventListener("message",o),()=>{document.removeEventListener("visibilitychange",r),window.removeEventListener("message",o)}},[]),t}function Bs({children:t,behavior:e="padding",keyboardVerticalOffset:r=0,style:o,className:n}){let s=S(),i=s.height+r,a={...o,transition:"all 0.2s ease-out"};if(s.isOpen)switch(e){case"padding":a.paddingBottom=i;break;case"height":a.height=`calc(100% - ${i}px)`;break;case"position":a.transform=`translateY(-${i}px)`;break}return _jsxruntime.jsx.call(void 0, "div",{style:a,className:n,children:t})}function Ns({children:t,edges:e=["top","bottom","left","right"],style:r,className:o}){let n=E(),s={...r,paddingTop:e.includes("top")?n.top:_optionalChain([r, 'optionalAccess', _16 => _16.paddingTop]),paddingBottom:e.includes("bottom")?n.bottom:_optionalChain([r, 'optionalAccess', _17 => _17.paddingBottom]),paddingLeft:e.includes("left")?n.left:_optionalChain([r, 'optionalAccess', _18 => _18.paddingLeft]),paddingRight:e.includes("right")?n.right:_optionalChain([r, 'optionalAccess', _19 => _19.paddingRight])};return _jsxruntime.jsx.call(void 0, "div",{style:s,className:o,children:t})}function Hs(){let[t,e]=_react.useState.call(void 0, 1500),[r,o]=_react.useState.call(void 0, 1500),[n,s]=_react.useState.call(void 0, !1),[i,a]=_react.useState.call(void 0, "focus"),[l,h]=_react.useState.call(void 0, ""),[p,d]=_react.useState.call(void 0, "egg"),[u,k]=_react.useState.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let c=null;if(n&&t>0)c=setInterval(()=>{e(f=>f-1)},1e3);else if(t===0&&n&&(s(!1),i==="focus")){let f=Math.random()<.01;d(f?"alien":"chick")}return()=>{c&&clearInterval(c)}},[n,t,i]),_react.useEffect.call(void 0, ()=>{if(!n&&(p==="chick"||p==="alien"||p==="ghost")||i!=="focus")return;let c=1-t/r;c<.5?d("egg"):c>=.5&&c<1&&d("cracked")},[t,r,n,p,i]);let L=()=>s(!n),C=()=>{s(!1),d("ghost")},w=c=>{s(!1),a(c),d("egg");let f=1500;c==="shortBreak"&&(f=300),c==="longBreak"&&(f=900),e(f),o(f)};return{seconds:t,initialTime:r,isActive:n,mode:i,task:l,storyState:p,soundEnabled:u,setSeconds:e,setInitialTime:o,setIsActive:s,setMode:a,setTask:h,setStoryState:d,setSoundEnabled:k,toggleTimer:L,giveUp:C,switchMode:w,resetTimer:()=>{s(!1),w(i)},setCustomTime:c=>{s(!1),e(c*60),o(c*60),d("egg")}}}exports.Accordion = _chunk7RGKC52Kcjs.b; exports.AccordionContent = _chunk7RGKC52Kcjs.e; exports.AccordionItem = _chunk7RGKC52Kcjs.c; exports.AccordionTrigger = _chunk7RGKC52Kcjs.d; exports.Alert = _chunk7RGKC52Kcjs.t; exports.AlertAction = _chunk7RGKC52Kcjs.w; exports.AlertDescription = _chunk7RGKC52Kcjs.v; exports.AlertDialog = _chunk7RGKC52Kcjs.h; exports.AlertDialogAction = _chunk7RGKC52Kcjs.r; exports.AlertDialogCancel = _chunk7RGKC52Kcjs.s; exports.AlertDialogContent = _chunk7RGKC52Kcjs.l; exports.AlertDialogDescription = _chunk7RGKC52Kcjs.q; exports.AlertDialogFooter = _chunk7RGKC52Kcjs.n; exports.AlertDialogHeader = _chunk7RGKC52Kcjs.m; exports.AlertDialogMedia = _chunk7RGKC52Kcjs.o; exports.AlertDialogOverlay = _chunk7RGKC52Kcjs.k; exports.AlertDialogPortal = _chunk7RGKC52Kcjs.j; exports.AlertDialogTitle = _chunk7RGKC52Kcjs.p; exports.AlertDialogTrigger = _chunk7RGKC52Kcjs.i; exports.AlertTitle = _chunk7RGKC52Kcjs.u; exports.AspectRatio = _chunk7RGKC52Kcjs.x; exports.Avatar = _chunk7RGKC52Kcjs.y; exports.AvatarBadge = _chunk7RGKC52Kcjs.B; exports.AvatarFallback = _chunk7RGKC52Kcjs.A; exports.AvatarGroup = _chunk7RGKC52Kcjs.C; exports.AvatarGroupCount = _chunk7RGKC52Kcjs.D; exports.AvatarImage = _chunk7RGKC52Kcjs.z; exports.Badge = _chunk7RGKC52Kcjs.F; exports.Breadcrumb = _chunk7RGKC52Kcjs.G; exports.BreadcrumbEllipsis = _chunk7RGKC52Kcjs.M; exports.BreadcrumbItem = _chunk7RGKC52Kcjs.I; exports.BreadcrumbLink = _chunk7RGKC52Kcjs.J; exports.BreadcrumbList = _chunk7RGKC52Kcjs.H; exports.BreadcrumbPage = _chunk7RGKC52Kcjs.K; exports.BreadcrumbSeparator = _chunk7RGKC52Kcjs.L; exports.Button = _chunk7RGKC52Kcjs.g; exports.ButtonGroup = _chunk7RGKC52Kcjs.P; exports.ButtonGroupSeparator = _chunk7RGKC52Kcjs.R; exports.ButtonGroupText = _chunk7RGKC52Kcjs.Q; exports.Calendar = _chunk7RGKC52Kcjs.S; exports.CalendarDayButton = _chunk7RGKC52Kcjs.T; exports.Card = _chunk7RGKC52Kcjs.U; exports.CardAction = _chunk7RGKC52Kcjs.Y; exports.CardContent = _chunk7RGKC52Kcjs.Z; exports.CardDescription = _chunk7RGKC52Kcjs.X; exports.CardFooter = _chunk7RGKC52Kcjs._; exports.CardHeader = _chunk7RGKC52Kcjs.V; exports.CardTitle = _chunk7RGKC52Kcjs.W; exports.Carousel = _chunk7RGKC52Kcjs.aa; exports.CarouselContent = _chunk7RGKC52Kcjs.ba; exports.CarouselItem = _chunk7RGKC52Kcjs.ca; exports.CarouselNext = _chunk7RGKC52Kcjs.ea; exports.CarouselPrevious = _chunk7RGKC52Kcjs.da; exports.ChartContainer = _chunk7RGKC52Kcjs.fa; exports.ChartLegend = _chunk7RGKC52Kcjs.ja; exports.ChartLegendContent = _chunk7RGKC52Kcjs.ka; exports.ChartStyle = _chunk7RGKC52Kcjs.ga; exports.ChartTooltip = _chunk7RGKC52Kcjs.ha; exports.ChartTooltipContent = _chunk7RGKC52Kcjs.ia; exports.Checkbox = _chunk7RGKC52Kcjs.la; exports.Collapsible = _chunk7RGKC52Kcjs.ma; exports.CollapsibleContent = _chunk7RGKC52Kcjs.oa; exports.CollapsibleTrigger = _chunk7RGKC52Kcjs.na; exports.Combobox = _chunk7RGKC52Kcjs.xa; exports.ComboboxChip = _chunk7RGKC52Kcjs.Ka; exports.ComboboxChips = _chunk7RGKC52Kcjs.Ja; exports.ComboboxChipsInput = _chunk7RGKC52Kcjs.La; exports.ComboboxCollection = _chunk7RGKC52Kcjs.Ga; exports.ComboboxContent = _chunk7RGKC52Kcjs.Ba; exports.ComboboxEmpty = _chunk7RGKC52Kcjs.Ha; exports.ComboboxGroup = _chunk7RGKC52Kcjs.Ea; exports.ComboboxInput = _chunk7RGKC52Kcjs.Aa; exports.ComboboxItem = _chunk7RGKC52Kcjs.Da; exports.ComboboxLabel = _chunk7RGKC52Kcjs.Fa; exports.ComboboxList = _chunk7RGKC52Kcjs.Ca; exports.ComboboxSeparator = _chunk7RGKC52Kcjs.Ia; exports.ComboboxTrigger = _chunk7RGKC52Kcjs.za; exports.ComboboxValue = _chunk7RGKC52Kcjs.ya; exports.Command = _chunk7RGKC52Kcjs.Xa; exports.CommandDialog = _chunk7RGKC52Kcjs.Ya; exports.CommandEmpty = _chunk7RGKC52Kcjs.$a; exports.CommandGroup = _chunk7RGKC52Kcjs.ab; exports.CommandInput = _chunk7RGKC52Kcjs.Za; exports.CommandItem = _chunk7RGKC52Kcjs.cb; exports.CommandList = _chunk7RGKC52Kcjs._a; exports.CommandSeparator = _chunk7RGKC52Kcjs.bb; exports.CommandShortcut = _chunk7RGKC52Kcjs.db; exports.ContextMenu = _chunk7RGKC52Kcjs.eb; exports.ContextMenuCheckboxItem = _chunk7RGKC52Kcjs.ob; exports.ContextMenuContent = _chunk7RGKC52Kcjs.kb; exports.ContextMenuGroup = _chunk7RGKC52Kcjs.gb; exports.ContextMenuItem = _chunk7RGKC52Kcjs.lb; exports.ContextMenuLabel = _chunk7RGKC52Kcjs.qb; exports.ContextMenuPortal = _chunk7RGKC52Kcjs.hb; exports.ContextMenuRadioGroup = _chunk7RGKC52Kcjs.jb; exports.ContextMenuRadioItem = _chunk7RGKC52Kcjs.pb; exports.ContextMenuSeparator = _chunk7RGKC52Kcjs.rb; exports.ContextMenuShortcut = _chunk7RGKC52Kcjs.sb; exports.ContextMenuSub = _chunk7RGKC52Kcjs.ib; exports.ContextMenuSubContent = _chunk7RGKC52Kcjs.nb; exports.ContextMenuSubTrigger = _chunk7RGKC52Kcjs.mb; exports.ContextMenuTrigger = _chunk7RGKC52Kcjs.fb; exports.Dialog = _chunk7RGKC52Kcjs.Na; exports.DialogClose = _chunk7RGKC52Kcjs.Qa; exports.DialogContent = _chunk7RGKC52Kcjs.Sa; exports.DialogDescription = _chunk7RGKC52Kcjs.Wa; exports.DialogFooter = _chunk7RGKC52Kcjs.Ua; exports.DialogHeader = _chunk7RGKC52Kcjs.Ta; exports.DialogOverlay = _chunk7RGKC52Kcjs.Ra; exports.DialogPortal = _chunk7RGKC52Kcjs.Pa; exports.DialogTitle = _chunk7RGKC52Kcjs.Va; exports.DialogTrigger = _chunk7RGKC52Kcjs.Oa; exports.Drawer = _chunk7RGKC52Kcjs.tb; exports.DrawerClose = _chunk7RGKC52Kcjs.wb; exports.DrawerContent = _chunk7RGKC52Kcjs.yb; exports.DrawerDescription = _chunk7RGKC52Kcjs.Cb; exports.DrawerFooter = _chunk7RGKC52Kcjs.Ab; exports.DrawerHeader = _chunk7RGKC52Kcjs.zb; exports.DrawerOverlay = _chunk7RGKC52Kcjs.xb; exports.DrawerPortal = _chunk7RGKC52Kcjs.vb; exports.DrawerTitle = _chunk7RGKC52Kcjs.Bb; exports.DrawerTrigger = _chunk7RGKC52Kcjs.ub; exports.DropdownMenu = _chunk7RGKC52Kcjs.Db; exports.DropdownMenuCheckboxItem = _chunk7RGKC52Kcjs.Jb; exports.DropdownMenuContent = _chunk7RGKC52Kcjs.Gb; exports.DropdownMenuGroup = _chunk7RGKC52Kcjs.Hb; exports.DropdownMenuItem = _chunk7RGKC52Kcjs.Ib; exports.DropdownMenuLabel = _chunk7RGKC52Kcjs.Mb; exports.DropdownMenuPortal = _chunk7RGKC52Kcjs.Eb; exports.DropdownMenuRadioGroup = _chunk7RGKC52Kcjs.Kb; exports.DropdownMenuRadioItem = _chunk7RGKC52Kcjs.Lb; exports.DropdownMenuSeparator = _chunk7RGKC52Kcjs.Nb; exports.DropdownMenuShortcut = _chunk7RGKC52Kcjs.Ob; exports.DropdownMenuSub = _chunk7RGKC52Kcjs.Pb; exports.DropdownMenuSubContent = _chunk7RGKC52Kcjs.Rb; exports.DropdownMenuSubTrigger = _chunk7RGKC52Kcjs.Qb; exports.DropdownMenuTrigger = _chunk7RGKC52Kcjs.Fb; exports.Empty = _chunk7RGKC52Kcjs.Sb; exports.EmptyContent = _chunk7RGKC52Kcjs.Xb; exports.EmptyDescription = _chunk7RGKC52Kcjs.Wb; exports.EmptyHeader = _chunk7RGKC52Kcjs.Tb; exports.EmptyMedia = _chunk7RGKC52Kcjs.Ub; exports.EmptyTitle = _chunk7RGKC52Kcjs.Vb; exports.Field = _chunk7RGKC52Kcjs.ac; exports.FieldContent = _chunk7RGKC52Kcjs.bc; exports.FieldDescription = _chunk7RGKC52Kcjs.ec; exports.FieldError = _chunk7RGKC52Kcjs.gc; exports.FieldGroup = _chunk7RGKC52Kcjs.$b; exports.FieldLabel = _chunk7RGKC52Kcjs.cc; exports.FieldLegend = _chunk7RGKC52Kcjs._b; exports.FieldSeparator = _chunk7RGKC52Kcjs.fc; exports.FieldSet = _chunk7RGKC52Kcjs.Zb; exports.FieldTitle = _chunk7RGKC52Kcjs.dc; exports.HoverCard = _chunk7RGKC52Kcjs.hc; exports.HoverCardContent = _chunk7RGKC52Kcjs.jc; exports.HoverCardTrigger = _chunk7RGKC52Kcjs.ic; exports.Input = _chunk7RGKC52Kcjs.pa; exports.InputGroup = _chunk7RGKC52Kcjs.ra; exports.InputGroupAddon = _chunk7RGKC52Kcjs.sa; exports.InputGroupButton = _chunk7RGKC52Kcjs.ta; exports.InputGroupInput = _chunk7RGKC52Kcjs.va; exports.InputGroupText = _chunk7RGKC52Kcjs.ua; exports.InputGroupTextarea = _chunk7RGKC52Kcjs.wa; exports.InputOTP = _chunk7RGKC52Kcjs.kc; exports.InputOTPGroup = _chunk7RGKC52Kcjs.lc; exports.InputOTPSeparator = _chunk7RGKC52Kcjs.nc; exports.InputOTPSlot = _chunk7RGKC52Kcjs.mc; exports.Item = _chunk7RGKC52Kcjs.qc; exports.ItemActions = _chunk7RGKC52Kcjs.vc; exports.ItemContent = _chunk7RGKC52Kcjs.sc; exports.ItemDescription = _chunk7RGKC52Kcjs.uc; exports.ItemFooter = _chunk7RGKC52Kcjs.xc; exports.ItemGroup = _chunk7RGKC52Kcjs.oc; exports.ItemHeader = _chunk7RGKC52Kcjs.wc; exports.ItemMedia = _chunk7RGKC52Kcjs.rc; exports.ItemSeparator = _chunk7RGKC52Kcjs.pc; exports.ItemTitle = _chunk7RGKC52Kcjs.tc; exports.Kbd = _chunk7RGKC52Kcjs.yc; exports.KbdGroup = _chunk7RGKC52Kcjs.zc; exports.KeyboardAvoidingView = Bs; exports.Label = _chunk7RGKC52Kcjs.Yb; exports.Menubar = _chunk7RGKC52Kcjs.Ac; exports.MenubarCheckboxItem = _chunk7RGKC52Kcjs.Ic; exports.MenubarContent = _chunk7RGKC52Kcjs.Gc; exports.MenubarGroup = _chunk7RGKC52Kcjs.Cc; exports.MenubarItem = _chunk7RGKC52Kcjs.Hc; exports.MenubarLabel = _chunk7RGKC52Kcjs.Kc; exports.MenubarMenu = _chunk7RGKC52Kcjs.Bc; exports.MenubarPortal = _chunk7RGKC52Kcjs.Dc; exports.MenubarRadioGroup = _chunk7RGKC52Kcjs.Ec; exports.MenubarRadioItem = _chunk7RGKC52Kcjs.Jc; exports.MenubarSeparator = _chunk7RGKC52Kcjs.Lc; exports.MenubarShortcut = _chunk7RGKC52Kcjs.Mc; exports.MenubarSub = _chunk7RGKC52Kcjs.Nc; exports.MenubarSubContent = _chunk7RGKC52Kcjs.Pc; exports.MenubarSubTrigger = _chunk7RGKC52Kcjs.Oc; exports.MenubarTrigger = _chunk7RGKC52Kcjs.Fc; exports.NavigationMenu = _chunk7RGKC52Kcjs.Qc; exports.NavigationMenuContent = _chunk7RGKC52Kcjs.Vc; exports.NavigationMenuIndicator = _chunk7RGKC52Kcjs.Yc; exports.NavigationMenuItem = _chunk7RGKC52Kcjs.Sc; exports.NavigationMenuLink = _chunk7RGKC52Kcjs.Xc; exports.NavigationMenuList = _chunk7RGKC52Kcjs.Rc; exports.NavigationMenuTrigger = _chunk7RGKC52Kcjs.Uc; exports.NavigationMenuViewport = _chunk7RGKC52Kcjs.Wc; exports.Pagination = _chunk7RGKC52Kcjs.Zc; exports.PaginationContent = _chunk7RGKC52Kcjs._c; exports.PaginationEllipsis = _chunk7RGKC52Kcjs.dd; exports.PaginationItem = _chunk7RGKC52Kcjs.$c; exports.PaginationLink = _chunk7RGKC52Kcjs.ad; exports.PaginationNext = _chunk7RGKC52Kcjs.cd; exports.PaginationPrevious = _chunk7RGKC52Kcjs.bd; exports.Popover = _chunk7RGKC52Kcjs.ed; exports.PopoverAnchor = _chunk7RGKC52Kcjs.hd; exports.PopoverContent = _chunk7RGKC52Kcjs.gd; exports.PopoverDescription = _chunk7RGKC52Kcjs.kd; exports.PopoverHeader = _chunk7RGKC52Kcjs.id; exports.PopoverTitle = _chunk7RGKC52Kcjs.jd; exports.PopoverTrigger = _chunk7RGKC52Kcjs.fd; exports.Progress = _chunk7RGKC52Kcjs.ld; exports.RadioGroup = _chunk7RGKC52Kcjs.md; exports.RadioGroupItem = _chunk7RGKC52Kcjs.nd; exports.ResizableHandle = _chunk7RGKC52Kcjs.qd; exports.ResizablePanel = _chunk7RGKC52Kcjs.pd; exports.ResizablePanelGroup = _chunk7RGKC52Kcjs.od; exports.SafeAreaProvider = As; exports.SafeAreaView = Ns; exports.ScrollArea = _chunk7RGKC52Kcjs.rd; exports.ScrollBar = _chunk7RGKC52Kcjs.sd; exports.Select = _chunk7RGKC52Kcjs.td; exports.SelectContent = _chunk7RGKC52Kcjs.xd; exports.SelectGroup = _chunk7RGKC52Kcjs.ud; exports.SelectItem = _chunk7RGKC52Kcjs.zd; exports.SelectLabel = _chunk7RGKC52Kcjs.yd; exports.SelectScrollDownButton = _chunk7RGKC52Kcjs.Cd; exports.SelectScrollUpButton = _chunk7RGKC52Kcjs.Bd; exports.SelectSeparator = _chunk7RGKC52Kcjs.Ad; exports.SelectTrigger = _chunk7RGKC52Kcjs.wd; exports.SelectValue = _chunk7RGKC52Kcjs.vd; exports.Separator = _chunk7RGKC52Kcjs.N; exports.Sheet = _chunk7RGKC52Kcjs.Dd; exports.SheetClose = _chunk7RGKC52Kcjs.Fd; exports.SheetContent = _chunk7RGKC52Kcjs.Gd; exports.SheetDescription = _chunk7RGKC52Kcjs.Kd; exports.SheetFooter = _chunk7RGKC52Kcjs.Id; exports.SheetHeader = _chunk7RGKC52Kcjs.Hd; exports.SheetTitle = _chunk7RGKC52Kcjs.Jd; exports.SheetTrigger = _chunk7RGKC52Kcjs.Ed; exports.Sidebar = _chunk7RGKC52Kcjs.Td; exports.SidebarContent = _chunk7RGKC52Kcjs.$d; exports.SidebarFooter = _chunk7RGKC52Kcjs.Zd; exports.SidebarGroup = _chunk7RGKC52Kcjs.ae; exports.SidebarGroupAction = _chunk7RGKC52Kcjs.ce; exports.SidebarGroupContent = _chunk7RGKC52Kcjs.de; exports.SidebarGroupLabel = _chunk7RGKC52Kcjs.be; exports.SidebarHeader = _chunk7RGKC52Kcjs.Yd; exports.SidebarInput = _chunk7RGKC52Kcjs.Xd; exports.SidebarInset = _chunk7RGKC52Kcjs.Wd; exports.SidebarMenu = _chunk7RGKC52Kcjs.ee; exports.SidebarMenuAction = _chunk7RGKC52Kcjs.he; exports.SidebarMenuBadge = _chunk7RGKC52Kcjs.ie; exports.SidebarMenuButton = _chunk7RGKC52Kcjs.ge; exports.SidebarMenuItem = _chunk7RGKC52Kcjs.fe; exports.SidebarMenuSkeleton = _chunk7RGKC52Kcjs.je; exports.SidebarMenuSub = _chunk7RGKC52Kcjs.ke; exports.SidebarMenuSubButton = _chunk7RGKC52Kcjs.me; exports.SidebarMenuSubItem = _chunk7RGKC52Kcjs.le; exports.SidebarProvider = _chunk7RGKC52Kcjs.Sd; exports.SidebarRail = _chunk7RGKC52Kcjs.Vd; exports.SidebarSeparator = _chunk7RGKC52Kcjs._d; exports.SidebarTrigger = _chunk7RGKC52Kcjs.Ud; exports.Skeleton = _chunk7RGKC52Kcjs.Ld; exports.Slider = _chunk7RGKC52Kcjs.ne; exports.Spinner = _chunk7RGKC52Kcjs.pe; exports.Switch = _chunk7RGKC52Kcjs.qe; exports.Table = _chunk7RGKC52Kcjs.re; exports.TableBody = _chunk7RGKC52Kcjs.te; exports.TableCaption = _chunk7RGKC52Kcjs.ye; exports.TableCell = _chunk7RGKC52Kcjs.xe; exports.TableFooter = _chunk7RGKC52Kcjs.ue; exports.TableHead = _chunk7RGKC52Kcjs.we; exports.TableHeader = _chunk7RGKC52Kcjs.se; exports.TableRow = _chunk7RGKC52Kcjs.ve; exports.Tabs = _chunk7RGKC52Kcjs.ze; exports.TabsContent = _chunk7RGKC52Kcjs.De; exports.TabsList = _chunk7RGKC52Kcjs.Be; exports.TabsTrigger = _chunk7RGKC52Kcjs.Ce; exports.Textarea = _chunk7RGKC52Kcjs.qa; exports.Toaster = _chunk7RGKC52Kcjs.oe; exports.Toggle = _chunk7RGKC52Kcjs.Fe; exports.ToggleGroup = _chunk7RGKC52Kcjs.Ge; exports.ToggleGroupItem = _chunk7RGKC52Kcjs.He; exports.Tooltip = _chunk7RGKC52Kcjs.Nd; exports.TooltipContent = _chunk7RGKC52Kcjs.Pd; exports.TooltipProvider = _chunk7RGKC52Kcjs.Md; exports.TooltipTrigger = _chunk7RGKC52Kcjs.Od; exports.badgeVariants = _chunk7RGKC52Kcjs.E; exports.buttonGroupVariants = _chunk7RGKC52Kcjs.O; exports.buttonVariants = _chunk7RGKC52Kcjs.f; exports.cn = _chunk7RGKC52Kcjs.a; exports.navigationMenuTriggerStyle = _chunk7RGKC52Kcjs.Tc; exports.tabsListVariants = _chunk7RGKC52Kcjs.Ae; exports.toggleVariants = _chunk7RGKC52Kcjs.Ee; exports.useAppState = Ps; exports.useBackHandler = Cs; exports.useCarousel = _chunk7RGKC52Kcjs.$; exports.useColorScheme = ks; exports.useComboboxAnchor = _chunk7RGKC52Kcjs.Ma; exports.useFocusTimer = Hs; exports.useIsMobile = _chunk7RGKC52Kcjs.Qd; exports.useKeyboard = S; exports.useRelayClose = Ss; exports.useSafeArea = E; exports.useSidebar = _chunk7RGKC52Kcjs.Rd; exports.useStatusBar = Ls;
|
|
2
10
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/jas/Desktop/relay/sdk/dist/index.cjs","../src/hooks/use-focus-timer.ts","../src/hooks/use-keyboard.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","useKeyboard","state","setState","updateKeyboardState","viewport","keyboardHeight","isOpen","handleFocusIn","e","target","handleFocusOut","useRelayClose","useCallback"],"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","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"]}
|
|
1
|
+
{"version":3,"sources":["/Users/jas/Desktop/relay/sdk/dist/index.cjs","../src/hooks/use-keyboard.ts","../src/hooks/use-platform.tsx","../src/hooks/use-focus-timer.ts"],"names":["useKeyboard","state","setState","useState","useEffect","updateKeyboardState","viewport","keyboardHeight","isOpen","handleFocusIn","e","target","handleFocusOut","useRelayClose","useCallback","defaultInsets","SafeAreaContext","createContext","SafeAreaProvider","children","insets","setInsets","computeInsets","style","getEnv","name","value"],"mappings":"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","file":"/Users/jas/Desktop/relay/sdk/dist/index.cjs","sourcesContent":[null,"import { useState, useEffect, useCallback } from 'react';\n\ninterface KeyboardState {\n isOpen: boolean;\n height: number;\n}\n\n/**\n * useKeyboard - Track virtual keyboard state on mobile devices\n * \n * Uses visualViewport API to detect keyboard height and provides\n * a safe area offset for positioning UI elements above the keyboard.\n * \n * @returns {KeyboardState} - { isOpen: boolean, height: number }\n */\nexport function useKeyboard(): KeyboardState {\n const [state, setState] = useState<KeyboardState>({\n isOpen: false,\n height: 0\n });\n\n useEffect(() => {\n // Check if we're on a mobile device\n const isMobile = /iPad|iPhone|iPod|Android/.test(navigator.userAgent);\n if (!isMobile) return;\n\n const updateKeyboardState = () => {\n if (!window.visualViewport) return;\n\n const viewport = window.visualViewport;\n // Calculate keyboard height: difference between window and viewport height\n const keyboardHeight = window.innerHeight - viewport.height;\n // Consider keyboard open if height is more than 100px (threshold for accessory bars)\n const isOpen = keyboardHeight > 100;\n\n setState({\n isOpen,\n height: isOpen ? keyboardHeight : 0\n });\n };\n\n // Listen to visualViewport changes\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', updateKeyboardState);\n window.visualViewport.addEventListener('scroll', updateKeyboardState);\n }\n\n // Also listen for focus/blur on inputs as fallback\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n // Small delay to let keyboard animate\n setTimeout(updateKeyboardState, 100);\n }\n };\n\n const handleFocusOut = () => {\n // Small delay to let keyboard animate closed\n setTimeout(() => {\n setState({ isOpen: false, height: 0 });\n }, 100);\n };\n\n document.addEventListener('focusin', handleFocusIn);\n document.addEventListener('focusout', handleFocusOut);\n\n // Initial check\n updateKeyboardState();\n\n return () => {\n window.visualViewport?.removeEventListener('resize', updateKeyboardState);\n window.visualViewport?.removeEventListener('scroll', updateKeyboardState);\n document.removeEventListener('focusin', handleFocusIn);\n document.removeEventListener('focusout', handleFocusOut);\n };\n }, []);\n\n return state;\n}\n\n/**\n * useRelayClose - Get the close function for closing the current app\n * \n * Works with both iframe and blob URL contexts.\n * \n * @returns {() => void} - Function to close the current app\n */\nexport function useRelayClose(): () => void {\n const close = useCallback(() => {\n // Try multiple methods to close\n // 1. PostMessage to parent (works in iframe)\n if (window.parent !== window) {\n window.parent.postMessage('relay:close', '*');\n }\n // 2. PostMessage with opener (works if opened as popup)\n if (window.opener) {\n window.opener.postMessage('relay:close', '*');\n }\n // 3. Try self-closing (may not work in all contexts)\n window.close();\n }, []);\n\n return close;\n}\n","import { useState, useEffect, useCallback, createContext, useContext, ReactNode } from 'react';\n\n// ============================================\n// SAFE AREA TYPES & CONTEXT\n// ============================================\n\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nconst defaultInsets: SafeAreaInsets = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n};\n\nconst SafeAreaContext = createContext<SafeAreaInsets>(defaultInsets);\n\n// ============================================\n// SAFE AREA PROVIDER\n// ============================================\n\ninterface SafeAreaProviderProps {\n children: ReactNode;\n}\n\n/**\n * SafeAreaProvider - Provides safe area insets to child components\n * \n * Automatically detects safe areas from:\n * 1. CSS env() values (iOS Safari)\n * 2. Parent Shell postMessage (when running in Relay Shell)\n */\nexport function SafeAreaProvider({ children }: SafeAreaProviderProps) {\n const [insets, setInsets] = useState<SafeAreaInsets>(defaultInsets);\n\n useEffect(() => {\n // Method 1: Read from CSS env() values\n const computeInsets = () => {\n const style = getComputedStyle(document.documentElement);\n const getEnv = (name: string) => {\n const value = style.getPropertyValue(`--safe-area-inset-${name}`);\n return parseInt(value) || 0;\n };\n\n // Try to get from CSS custom properties first\n let top = getEnv('top');\n let bottom = getEnv('bottom');\n let left = getEnv('left');\n let right = getEnv('right');\n\n // If CSS props not set, try to read from env() directly\n if (top === 0 && bottom === 0) {\n // Create a temp element to measure env() values\n const temp = document.createElement('div');\n temp.style.cssText = `\n position: fixed;\n top: env(safe-area-inset-top, 0px);\n bottom: env(safe-area-inset-bottom, 0px);\n left: env(safe-area-inset-left, 0px);\n right: env(safe-area-inset-right, 0px);\n pointer-events: none;\n visibility: hidden;\n `;\n document.body.appendChild(temp);\n const rect = temp.getBoundingClientRect();\n top = rect.top;\n bottom = window.innerHeight - rect.bottom;\n left = rect.left;\n right = window.innerWidth - rect.right;\n document.body.removeChild(temp);\n }\n\n setInsets({ top, bottom, left, right });\n };\n\n // Method 2: Listen for Shell messages\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === 'relay:safearea') {\n setInsets(event.data.insets);\n }\n };\n\n computeInsets();\n window.addEventListener('message', handleMessage);\n window.addEventListener('resize', computeInsets);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('resize', computeInsets);\n };\n }, []);\n\n return (\n <SafeAreaContext.Provider value={insets}>\n {children}\n </SafeAreaContext.Provider>\n );\n}\n\n// ============================================\n// SAFE AREA HOOKS\n// ============================================\n\n/**\n * useSafeArea - Get safe area insets\n * \n * @returns SafeAreaInsets with top, bottom, left, right values in pixels\n */\nexport function useSafeArea(): SafeAreaInsets {\n return useContext(SafeAreaContext);\n}\n\n// ============================================\n// COLOR SCHEME\n// ============================================\n\nexport type ColorScheme = 'light' | 'dark';\n\n/**\n * useColorScheme - Get current system color scheme\n * \n * @returns 'light' | 'dark'\n */\nexport function useColorScheme(): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(() =>\n window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n );\n\n useEffect(() => {\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n setScheme(e.matches ? 'dark' : 'light');\n };\n media.addEventListener('change', handler);\n return () => media.removeEventListener('change', handler);\n }, []);\n\n return scheme;\n}\n\n// ============================================\n// STATUS BAR\n// ============================================\n\n/**\n * useStatusBar - Control the status bar appearance\n * \n * @param color - Hex color for the status bar\n */\nexport function useStatusBar(color: string): void {\n useEffect(() => {\n // Update meta theme-color\n let meta = document.querySelector('meta[name=\"theme-color\"]');\n if (!meta) {\n meta = document.createElement('meta');\n meta.setAttribute('name', 'theme-color');\n document.head.appendChild(meta);\n }\n meta.setAttribute('content', color);\n\n // Notify parent Shell\n window.parent?.postMessage({ type: 'relay:statusbar', color }, '*');\n }, [color]);\n}\n\n// ============================================\n// BACK HANDLER\n// ============================================\n\n/**\n * useBackHandler - Handle back navigation\n * \n * @param handler - Return true to prevent default back behavior\n */\nexport function useBackHandler(handler: () => boolean): void {\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:back') {\n const handled = handler();\n if (!handled) {\n // Allow default close behavior\n window.parent?.postMessage('relay:close', '*');\n }\n }\n };\n\n // Also handle browser back button\n const handlePopState = (event: PopStateEvent) => {\n const handled = handler();\n if (handled) {\n // Push a dummy state to prevent navigation\n window.history.pushState(null, '', window.location.href);\n }\n };\n\n // Push initial state for popstate handling\n window.history.pushState(null, '', window.location.href);\n\n window.addEventListener('message', handleMessage);\n window.addEventListener('popstate', handlePopState);\n\n return () => {\n window.removeEventListener('message', handleMessage);\n window.removeEventListener('popstate', handlePopState);\n };\n }, [handler]);\n}\n\n// ============================================\n// APP STATE\n// ============================================\n\nexport type AppState = 'active' | 'background' | 'inactive';\n\n/**\n * useAppState - Track app foreground/background state\n * \n * @returns Current app state\n */\nexport function useAppState(): AppState {\n const [state, setState] = useState<AppState>('active');\n\n useEffect(() => {\n const handleVisibility = () => {\n setState(document.hidden ? 'background' : 'active');\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data === 'relay:foreground') setState('active');\n if (event.data === 'relay:background') setState('background');\n };\n\n document.addEventListener('visibilitychange', handleVisibility);\n window.addEventListener('message', handleMessage);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibility);\n window.removeEventListener('message', handleMessage);\n };\n }, []);\n\n return state;\n}\n","import { useState, useEffect } from 'react';\n\nexport type TimerMode = 'focus' | 'shortBreak' | 'longBreak';\nexport type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';\n\nexport function useFocusTimer() {\n const [seconds, setSeconds] = useState(25 * 60);\n const [initialTime, setInitialTime] = useState(25 * 60);\n const [isActive, setIsActive] = useState(false);\n const [mode, setMode] = useState<TimerMode>('focus');\n const [task, setTask] = useState('');\n const [storyState, setStoryState] = useState<StoryState>('egg');\n const [soundEnabled, setSoundEnabled] = useState(false);\n\n useEffect(() => {\n let interval: any = null;\n\n if (isActive && seconds > 0) {\n interval = setInterval(() => {\n setSeconds((s) => s - 1);\n }, 1000);\n } else if (seconds === 0 && isActive) {\n // Timer Finished\n setIsActive(false);\n if (mode === 'focus') {\n const isAbducted = Math.random() < 0.01;\n setStoryState(isAbducted ? 'alien' : 'chick');\n }\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isActive, seconds, mode]);\n\n // Update Visuals based on progress\n useEffect(() => {\n if (!isActive && (storyState === 'chick' || storyState === 'alien' || storyState === 'ghost')) return;\n\n // Don't change chick state during break\n if (mode !== 'focus') return;\n\n const progress = 1 - (seconds / initialTime);\n\n if (progress < 0.5) {\n setStoryState('egg');\n } else if (progress >= 0.5 && progress < 1) {\n setStoryState('cracked');\n }\n }, [seconds, initialTime, isActive, storyState, mode]);\n\n const toggleTimer = () => setIsActive(!isActive);\n\n const giveUp = () => {\n setIsActive(false);\n setStoryState('ghost');\n };\n\n const switchMode = (newMode: TimerMode) => {\n setIsActive(false);\n setMode(newMode);\n setStoryState('egg'); // Reset chick for new session\n\n // Set Times\n let newTime = 25 * 60;\n if (newMode === 'shortBreak') newTime = 5 * 60;\n if (newMode === 'longBreak') newTime = 15 * 60;\n\n setSeconds(newTime);\n setInitialTime(newTime);\n };\n\n const resetTimer = () => {\n setIsActive(false);\n switchMode(mode); // Re-init current mode\n };\n\n const setCustomTime = (mins: number) => {\n setIsActive(false);\n setSeconds(mins * 60);\n setInitialTime(mins * 60);\n setStoryState('egg');\n };\n\n return {\n seconds,\n initialTime,\n isActive,\n mode,\n task,\n storyState,\n soundEnabled,\n setSeconds,\n setInitialTime,\n setIsActive,\n setMode,\n setTask,\n setStoryState,\n setSoundEnabled,\n toggleTimer,\n giveUp,\n switchMode,\n resetTimer,\n setCustomTime,\n };\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClassValue } from 'clsx';
|
|
2
2
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonGroupVariants, buttonVariants, navigationMenuTriggerStyle, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useSidebar } from './components/ui/index.cjs';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
4
|
import * as React from 'react';
|
|
4
|
-
import 'react
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
5
6
|
import 'radix-ui';
|
|
6
7
|
import 'class-variance-authority/types';
|
|
7
8
|
import 'class-variance-authority';
|
|
@@ -16,6 +17,35 @@ import 'sonner';
|
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
|
18
19
|
|
|
20
|
+
type KeyboardBehavior = 'padding' | 'height' | 'position';
|
|
21
|
+
interface KeyboardAvoidingViewProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
behavior?: KeyboardBehavior;
|
|
24
|
+
keyboardVerticalOffset?: number;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* KeyboardAvoidingView - Automatically adjusts content when keyboard opens
|
|
30
|
+
*
|
|
31
|
+
* @param behavior - How to adjust: 'padding' | 'height' | 'position'
|
|
32
|
+
* @param keyboardVerticalOffset - Additional offset to add
|
|
33
|
+
*/
|
|
34
|
+
declare function KeyboardAvoidingView({ children, behavior, keyboardVerticalOffset, style, className }: KeyboardAvoidingViewProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
type SafeAreaEdge = 'top' | 'bottom' | 'left' | 'right';
|
|
36
|
+
interface SafeAreaViewProps {
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
edges?: SafeAreaEdge[];
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SafeAreaView - Container that respects safe area insets
|
|
44
|
+
*
|
|
45
|
+
* @param edges - Which edges to apply safe area to (default: all)
|
|
46
|
+
*/
|
|
47
|
+
declare function SafeAreaView({ children, edges, style, className }: SafeAreaViewProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
19
49
|
type TimerMode = 'focus' | 'shortBreak' | 'longBreak';
|
|
20
50
|
type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';
|
|
21
51
|
declare function useFocusTimer(): {
|
|
@@ -64,4 +94,54 @@ declare function useKeyboard(): KeyboardState;
|
|
|
64
94
|
*/
|
|
65
95
|
declare function useRelayClose(): () => void;
|
|
66
96
|
|
|
67
|
-
|
|
97
|
+
interface SafeAreaInsets {
|
|
98
|
+
top: number;
|
|
99
|
+
bottom: number;
|
|
100
|
+
left: number;
|
|
101
|
+
right: number;
|
|
102
|
+
}
|
|
103
|
+
interface SafeAreaProviderProps {
|
|
104
|
+
children: ReactNode;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* SafeAreaProvider - Provides safe area insets to child components
|
|
108
|
+
*
|
|
109
|
+
* Automatically detects safe areas from:
|
|
110
|
+
* 1. CSS env() values (iOS Safari)
|
|
111
|
+
* 2. Parent Shell postMessage (when running in Relay Shell)
|
|
112
|
+
*/
|
|
113
|
+
declare function SafeAreaProvider({ children }: SafeAreaProviderProps): react_jsx_runtime.JSX.Element;
|
|
114
|
+
/**
|
|
115
|
+
* useSafeArea - Get safe area insets
|
|
116
|
+
*
|
|
117
|
+
* @returns SafeAreaInsets with top, bottom, left, right values in pixels
|
|
118
|
+
*/
|
|
119
|
+
declare function useSafeArea(): SafeAreaInsets;
|
|
120
|
+
type ColorScheme = 'light' | 'dark';
|
|
121
|
+
/**
|
|
122
|
+
* useColorScheme - Get current system color scheme
|
|
123
|
+
*
|
|
124
|
+
* @returns 'light' | 'dark'
|
|
125
|
+
*/
|
|
126
|
+
declare function useColorScheme(): ColorScheme;
|
|
127
|
+
/**
|
|
128
|
+
* useStatusBar - Control the status bar appearance
|
|
129
|
+
*
|
|
130
|
+
* @param color - Hex color for the status bar
|
|
131
|
+
*/
|
|
132
|
+
declare function useStatusBar(color: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* useBackHandler - Handle back navigation
|
|
135
|
+
*
|
|
136
|
+
* @param handler - Return true to prevent default back behavior
|
|
137
|
+
*/
|
|
138
|
+
declare function useBackHandler(handler: () => boolean): void;
|
|
139
|
+
type AppState = 'active' | 'background' | 'inactive';
|
|
140
|
+
/**
|
|
141
|
+
* useAppState - Track app foreground/background state
|
|
142
|
+
*
|
|
143
|
+
* @returns Current app state
|
|
144
|
+
*/
|
|
145
|
+
declare function useAppState(): AppState;
|
|
146
|
+
|
|
147
|
+
export { type AppState, type ColorScheme, KeyboardAvoidingView, type SafeAreaInsets, SafeAreaProvider, SafeAreaView, type StoryState, type TimerMode, cn, useAppState, useBackHandler, useColorScheme, useFocusTimer, useIsMobile, useKeyboard, useRelayClose, useSafeArea, useStatusBar };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClassValue } from 'clsx';
|
|
2
2
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonGroupVariants, buttonVariants, navigationMenuTriggerStyle, tabsListVariants, toggleVariants, useCarousel, useComboboxAnchor, useSidebar } from './components/ui/index.js';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
4
|
import * as React from 'react';
|
|
4
|
-
import 'react
|
|
5
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
5
6
|
import 'radix-ui';
|
|
6
7
|
import 'class-variance-authority/types';
|
|
7
8
|
import 'class-variance-authority';
|
|
@@ -16,6 +17,35 @@ import 'sonner';
|
|
|
16
17
|
|
|
17
18
|
declare function cn(...inputs: ClassValue[]): string;
|
|
18
19
|
|
|
20
|
+
type KeyboardBehavior = 'padding' | 'height' | 'position';
|
|
21
|
+
interface KeyboardAvoidingViewProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
behavior?: KeyboardBehavior;
|
|
24
|
+
keyboardVerticalOffset?: number;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
className?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* KeyboardAvoidingView - Automatically adjusts content when keyboard opens
|
|
30
|
+
*
|
|
31
|
+
* @param behavior - How to adjust: 'padding' | 'height' | 'position'
|
|
32
|
+
* @param keyboardVerticalOffset - Additional offset to add
|
|
33
|
+
*/
|
|
34
|
+
declare function KeyboardAvoidingView({ children, behavior, keyboardVerticalOffset, style, className }: KeyboardAvoidingViewProps): react_jsx_runtime.JSX.Element;
|
|
35
|
+
type SafeAreaEdge = 'top' | 'bottom' | 'left' | 'right';
|
|
36
|
+
interface SafeAreaViewProps {
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
edges?: SafeAreaEdge[];
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* SafeAreaView - Container that respects safe area insets
|
|
44
|
+
*
|
|
45
|
+
* @param edges - Which edges to apply safe area to (default: all)
|
|
46
|
+
*/
|
|
47
|
+
declare function SafeAreaView({ children, edges, style, className }: SafeAreaViewProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
19
49
|
type TimerMode = 'focus' | 'shortBreak' | 'longBreak';
|
|
20
50
|
type StoryState = 'egg' | 'cracked' | 'chick' | 'alien' | 'ghost';
|
|
21
51
|
declare function useFocusTimer(): {
|
|
@@ -64,4 +94,54 @@ declare function useKeyboard(): KeyboardState;
|
|
|
64
94
|
*/
|
|
65
95
|
declare function useRelayClose(): () => void;
|
|
66
96
|
|
|
67
|
-
|
|
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 xe,$a as xt,$b as Lo,$c as Ls,$d as Li,A as _,Aa as _e,Ab as _t,Ac as $o,Ad as $s,Ae as $i,B as $,Ba as $e,Bb as $t,Bc as es,Bd as ei,Be as en,C as ee,Ca as et,Cb as eo,Cc as ts,Cd as ti,Ce as tn,D as te,Da as tt,Db as to,Dc as os,Dd as oi,De as on,E as oe,Ea as ot,Eb as oo,Ec as ss,Ed as si,Ee as sn,F as se,Fa as st,Fb as so,Fc as is,Fd as ii,Fe as nn,G as ie,Ga as it,Gb as io,Gc as ns,Gd as ni,Ge as rn,H as ne,Ha as nt,Hb as no,Hc as rs,Hd as ri,He as an,I as re,Ia as rt,Ib as ro,Ic as as,Id as ai,J as ae,Ja as at,Jb as ao,Jc as cs,Jd as ci,K as ce,Ka as ct,Kb as co,Kc as us,Kd as ui,L as ue,La as ut,Lb as uo,Lc as ls,Ld as li,M as le,Ma as lt,Mb as lo,Mc as ds,Md as di,N as de,Na as dt,Nb as fo,Nc as fs,Nd as fi,O as fe,Oa as ft,Ob as mo,Oc as ms,Od as mi,P as me,Pa as mt,Pb as po,Pc as ps,Pd as pi,Q as pe,Qa as pt,Qb as wo,Qc as ws,Qd as wi,R as we,Ra as wt,Rb as go,Rc as gs,Rd as gi,S as ge,Sa as gt,Sb as vo,Sc as vs,Sd as vi,T as ve,Ta as vt,Tb as ho,Tc as hs,Td as hi,U as he,Ua as ht,Ub as To,Uc as Ts,Ud as Ti,V as Te,Va as Tt,Vb as yo,Vc as ys,Vd as yi,W as ye,Wa as yt,Wb as Eo,Wc as Es,Wd as Ei,X as Ee,Xa as Et,Xb as So,Xc as Ss,Xd as Si,Y as Se,Ya as St,Yb as bo,Yc as bs,Yd as bi,Z as be,Za as bt,Zb as ko,Zc as ks,Zd as ki,_ as ke,_a as kt,_b as xo,_c as xs,_d as xi,a as L,aa as Le,ab as Lt,ac as Mo,ad as Ms,ae as Mi,b as M,ba as Me,bb as Mt,bc as Ao,bd as As,be as Ai,c as A,ca as Ae,cb as At,cc as Vo,cd as Vs,ce as Vi,d as V,da as Ve,db as Vt,dc as Io,dd as Is,de as Ii,e as I,ea as Ie,eb as It,ec as Ko,ed as Ks,ee as Ki,f as K,fa as Ke,fb as Kt,fc as Oo,fd as Os,fe as Oi,g as O,ga as Oe,gb as Ot,gc as Bo,gd as Bs,ge as Bi,h as B,ha as Be,hb as Bt,hc as Co,hd as Cs,he as Ci,i as C,ia as Ce,ib as Ct,ic as Fo,id as Fs,ie as Fi,j as F,ja as Fe,jb as Ft,jc as Po,jd as Ps,je as Pi,k as P,ka as Pe,kb as Pt,kc as Ho,kd as Hs,ke as Hi,l as H,la as He,lb as Ht,lc as No,ld as Ns,le as Ni,m as N,ma as Ne,mb as Nt,mc as zo,md as zs,me as zi,n as z,na as ze,nb as zt,nc as Ro,nd as Rs,ne as Ri,o as R,oa as Re,ob as Rt,oc as Uo,od as Us,oe as Ui,p as U,pa as Ue,pb as Ut,pc as Xo,pd as Xs,pe as Xi,q as X,qa as Xe,qb as Xt,qc as jo,qd as js,qe as ji,r as j,ra as je,rb as jt,rc as qo,rd as qs,re as qi,s as q,sa as qe,sb as qt,sc as Do,sd as Ds,se as Di,t as D,ta as De,tb as Dt,tc as Go,td as Gs,te as Gi,u as G,ua as Ge,ub as Gt,uc as Jo,ud as Js,ue as Ji,v as J,va as Je,vb as Jt,vc as Qo,vd as Qs,ve as Qi,w as Q,wa as Qe,wb as Qt,wc as Wo,wd as Ws,we as Wi,x as W,xa as We,xb as Wt,xc as Yo,xd as Ys,xe as Yi,y as Y,ya as Ye,yb as Yt,yc as Zo,yd as Zs,ye as Zi,z as Z,za as Ze,zb as Zt,zc as _o,zd as _s,ze as _i}from"./chunk-6VSTRIAD.js";import{useState as l,useEffect as w}from"react";function un(){let[n,c]=l(1500),[f,t]=l(1500),[o,s]=l(!1),[i,r]=l("focus"),[m,g]=l(""),[d,u]=l("egg"),[v,h]=l(!1);w(()=>{let e=null;if(o&&n>0)e=setInterval(()=>{c(a=>a-1)},1e3);else if(n===0&&o&&(s(!1),i==="focus")){let a=Math.random()<.01;u(a?"alien":"chick")}return()=>{e&&clearInterval(e)}},[o,n,i]),w(()=>{if(!o&&(d==="chick"||d==="alien"||d==="ghost")||i!=="focus")return;let e=1-n/f;e<.5?u("egg"):e>=.5&&e<1&&u("cracked")},[n,f,o,d,i]);let T=()=>s(!o),y=()=>{s(!1),u("ghost")},p=e=>{s(!1),r(e),u("egg");let a=1500;e==="shortBreak"&&(a=300),e==="longBreak"&&(a=900),c(a),t(a)};return{seconds:n,initialTime:f,isActive:o,mode:i,task:m,storyState:d,soundEnabled:v,setSeconds:c,setInitialTime:t,setIsActive:s,setMode:r,setTask:g,setStoryState:u,setSoundEnabled:h,toggleTimer:T,giveUp:y,switchMode:p,resetTimer:()=>{s(!1),p(i)},setCustomTime:e=>{s(!1),c(e*60),t(e*60),u("egg")}}}import{useState as E,useEffect as S,useCallback as b}from"react";function fn(){let[n,c]=E({isOpen:!1,height:0});return S(()=>{if(!/iPad|iPhone|iPod|Android/.test(navigator.userAgent))return;let t=()=>{if(!window.visualViewport)return;let i=window.visualViewport,r=window.innerHeight-i.height,m=r>100;c({isOpen:m,height:m?r:0})};window.visualViewport&&(window.visualViewport.addEventListener("resize",t),window.visualViewport.addEventListener("scroll",t));let o=i=>{let r=i.target;(r.tagName==="INPUT"||r.tagName==="TEXTAREA")&&setTimeout(t,100)},s=()=>{setTimeout(()=>{c({isOpen:!1,height:0})},100)};return document.addEventListener("focusin",o),document.addEventListener("focusout",s),t(),()=>{window.visualViewport?.removeEventListener("resize",t),window.visualViewport?.removeEventListener("scroll",t),document.removeEventListener("focusin",o),document.removeEventListener("focusout",s)}},[]),n}function mn(){return b(()=>{window.parent!==window&&window.parent.postMessage("relay:close","*"),window.opener&&window.opener.postMessage("relay:close","*"),window.close()},[])}export{M as Accordion,I as AccordionContent,A as AccordionItem,V as AccordionTrigger,D as Alert,Q as AlertAction,J as AlertDescription,B as AlertDialog,j as AlertDialogAction,q as AlertDialogCancel,H as AlertDialogContent,X as AlertDialogDescription,z as AlertDialogFooter,N as AlertDialogHeader,R as AlertDialogMedia,P as AlertDialogOverlay,F as AlertDialogPortal,U as AlertDialogTitle,C as AlertDialogTrigger,G as AlertTitle,W as AspectRatio,Y as Avatar,$ as AvatarBadge,_ as AvatarFallback,ee as AvatarGroup,te as AvatarGroupCount,Z as AvatarImage,se as Badge,ie as Breadcrumb,le as BreadcrumbEllipsis,re as BreadcrumbItem,ae as BreadcrumbLink,ne as BreadcrumbList,ce as BreadcrumbPage,ue as BreadcrumbSeparator,O as Button,me as ButtonGroup,we as ButtonGroupSeparator,pe as ButtonGroupText,ge as Calendar,ve as CalendarDayButton,he as Card,Se as CardAction,be as CardContent,Ee as CardDescription,ke as CardFooter,Te as CardHeader,ye as CardTitle,Le as Carousel,Me as CarouselContent,Ae as CarouselItem,Ie as CarouselNext,Ve as CarouselPrevious,Ke as ChartContainer,Fe as ChartLegend,Pe as ChartLegendContent,Oe as ChartStyle,Be as ChartTooltip,Ce as ChartTooltipContent,He as Checkbox,Ne as Collapsible,Re as CollapsibleContent,ze as CollapsibleTrigger,We as Combobox,ct as ComboboxChip,at as ComboboxChips,ut as ComboboxChipsInput,it as ComboboxCollection,$e as ComboboxContent,nt as ComboboxEmpty,ot as ComboboxGroup,_e as ComboboxInput,tt as ComboboxItem,st as ComboboxLabel,et as ComboboxList,rt as ComboboxSeparator,Ze as ComboboxTrigger,Ye as ComboboxValue,Et as Command,St as CommandDialog,xt as CommandEmpty,Lt as CommandGroup,bt as CommandInput,At as CommandItem,kt as CommandList,Mt as CommandSeparator,Vt as CommandShortcut,It as ContextMenu,Rt as ContextMenuCheckboxItem,Pt as ContextMenuContent,Ot as ContextMenuGroup,Ht as ContextMenuItem,Xt as ContextMenuLabel,Bt as ContextMenuPortal,Ft as ContextMenuRadioGroup,Ut as ContextMenuRadioItem,jt as ContextMenuSeparator,qt as ContextMenuShortcut,Ct as ContextMenuSub,zt as ContextMenuSubContent,Nt as ContextMenuSubTrigger,Kt as ContextMenuTrigger,dt as Dialog,pt as DialogClose,gt as DialogContent,yt as DialogDescription,ht as DialogFooter,vt as DialogHeader,wt as DialogOverlay,mt as DialogPortal,Tt as DialogTitle,ft as DialogTrigger,Dt as Drawer,Qt as DrawerClose,Yt as DrawerContent,eo as DrawerDescription,_t as DrawerFooter,Zt as DrawerHeader,Wt as DrawerOverlay,Jt as DrawerPortal,$t as DrawerTitle,Gt as DrawerTrigger,to as DropdownMenu,ao as DropdownMenuCheckboxItem,io as DropdownMenuContent,no as DropdownMenuGroup,ro as DropdownMenuItem,lo as DropdownMenuLabel,oo as DropdownMenuPortal,co as DropdownMenuRadioGroup,uo as DropdownMenuRadioItem,fo as DropdownMenuSeparator,mo as DropdownMenuShortcut,po as DropdownMenuSub,go as DropdownMenuSubContent,wo as DropdownMenuSubTrigger,so as DropdownMenuTrigger,vo as Empty,So as EmptyContent,Eo as EmptyDescription,ho as EmptyHeader,To as EmptyMedia,yo as EmptyTitle,Mo as Field,Ao as FieldContent,Ko as FieldDescription,Bo as FieldError,Lo as FieldGroup,Vo as FieldLabel,xo as FieldLegend,Oo as FieldSeparator,ko as FieldSet,Io as FieldTitle,Co as HoverCard,Po as HoverCardContent,Fo as HoverCardTrigger,Ue as Input,je as InputGroup,qe as InputGroupAddon,De as InputGroupButton,Je as InputGroupInput,Ge as InputGroupText,Qe as InputGroupTextarea,Ho as InputOTP,No as InputOTPGroup,Ro as InputOTPSeparator,zo as InputOTPSlot,jo as Item,Qo as ItemActions,Do as ItemContent,Jo as ItemDescription,Yo as ItemFooter,Uo as ItemGroup,Wo as ItemHeader,qo as ItemMedia,Xo as ItemSeparator,Go as ItemTitle,Zo as Kbd,_o as KbdGroup,bo as Label,$o as Menubar,as as MenubarCheckboxItem,ns as MenubarContent,ts as MenubarGroup,rs as MenubarItem,us as MenubarLabel,es as MenubarMenu,os as MenubarPortal,ss as MenubarRadioGroup,cs as MenubarRadioItem,ls as MenubarSeparator,ds as MenubarShortcut,fs as MenubarSub,ps as MenubarSubContent,ms as MenubarSubTrigger,is as MenubarTrigger,ws as NavigationMenu,ys as NavigationMenuContent,bs as NavigationMenuIndicator,vs as NavigationMenuItem,Ss as NavigationMenuLink,gs as NavigationMenuList,Ts as NavigationMenuTrigger,Es as NavigationMenuViewport,ks as Pagination,xs as PaginationContent,Is as PaginationEllipsis,Ls as PaginationItem,Ms as PaginationLink,Vs as PaginationNext,As as PaginationPrevious,Ks as Popover,Cs as PopoverAnchor,Bs as PopoverContent,Hs as PopoverDescription,Fs as PopoverHeader,Ps as PopoverTitle,Os as PopoverTrigger,Ns as Progress,zs as RadioGroup,Rs as RadioGroupItem,js as ResizableHandle,Xs as ResizablePanel,Us as ResizablePanelGroup,qs as ScrollArea,Ds as ScrollBar,Gs as Select,Ys as SelectContent,Js as SelectGroup,_s as SelectItem,Zs as SelectLabel,ti as SelectScrollDownButton,ei as SelectScrollUpButton,$s as SelectSeparator,Ws as SelectTrigger,Qs as SelectValue,de as Separator,oi as Sheet,ii as SheetClose,ni as SheetContent,ui as SheetDescription,ai as SheetFooter,ri as SheetHeader,ci as SheetTitle,si as SheetTrigger,hi as Sidebar,Li as SidebarContent,ki as SidebarFooter,Mi as SidebarGroup,Vi as SidebarGroupAction,Ii as SidebarGroupContent,Ai as SidebarGroupLabel,bi as SidebarHeader,Si as SidebarInput,Ei as SidebarInset,Ki as SidebarMenu,Ci as SidebarMenuAction,Fi as SidebarMenuBadge,Bi as SidebarMenuButton,Oi as SidebarMenuItem,Pi as SidebarMenuSkeleton,Hi as SidebarMenuSub,zi as SidebarMenuSubButton,Ni as SidebarMenuSubItem,vi as SidebarProvider,yi as SidebarRail,xi as SidebarSeparator,Ti as SidebarTrigger,li as Skeleton,Ri as Slider,Xi as Spinner,ji as Switch,qi as Table,Gi as TableBody,Zi as TableCaption,Yi as TableCell,Ji as TableFooter,Wi as TableHead,Di as TableHeader,Qi as TableRow,_i as Tabs,on as TabsContent,en as TabsList,tn as TabsTrigger,Xe as Textarea,Ui as Toaster,nn as Toggle,rn as ToggleGroup,an as ToggleGroupItem,fi as Tooltip,pi as TooltipContent,di as TooltipProvider,mi as TooltipTrigger,oe as badgeVariants,fe as buttonGroupVariants,K as buttonVariants,L as cn,hs as navigationMenuTriggerStyle,$i as tabsListVariants,sn as toggleVariants,xe as useCarousel,lt as useComboboxAnchor,un as useFocusTimer,wi as useIsMobile,fn as useKeyboard,mn as useRelayClose,gi 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","../src/hooks/use-keyboard.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","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"],"mappings":"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","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","useState","useEffect","useCallback","useKeyboard","state","setState","updateKeyboardState","viewport","keyboardHeight","isOpen","handleFocusIn","e","target","handleFocusOut","useRelayClose"]}
|
|
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"]}
|