@ahrowe/ui 0.37.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/cjs-types/common/commandPalette/commandPalette.d.ts +4 -0
- package/dist/cjs-types/common/commandPalette/commandPalette.types.d.ts +42 -0
- package/dist/cjs-types/common/commandPalette/filterCommands.d.ts +15 -0
- package/dist/cjs-types/common/commandPalette/index.d.ts +2 -0
- package/dist/cjs-types/common/configProvider/configProvider.types.d.ts +6 -0
- package/dist/cjs-types/common/copyButton/copyButton.d.ts +4 -0
- package/dist/cjs-types/common/copyButton/copyButton.types.d.ts +36 -0
- package/dist/cjs-types/common/copyButton/index.d.ts +2 -0
- package/dist/cjs-types/common/datePicker/components/datePickerMonth/datePickerMonth.types.d.ts +6 -6
- package/dist/cjs-types/common/datePicker/dateFunctions.d.ts +10 -19
- package/dist/cjs-types/common/datePicker/datePicker.types.d.ts +20 -14
- package/dist/cjs-types/common/datePicker/index.d.ts +1 -0
- package/dist/cjs-types/common/errorBoundary/errorBoundary.d.ts +0 -3
- package/dist/cjs-types/common/errorBoundary/errorBoundary.types.d.ts +2 -3
- package/dist/cjs-types/common/hooks/index.d.ts +2 -0
- package/dist/cjs-types/common/hooks/useClipboard.d.ts +16 -0
- package/dist/cjs-types/common/inputDropdown/inputDropdown.types.d.ts +7 -1
- package/dist/cjs-types/common/menu/menu.types.d.ts +2 -0
- package/dist/cjs-types/common/popover/popover.types.d.ts +5 -0
- package/dist/cjs-types/common/themeProvider/themeProvider.d.ts +8 -7
- package/dist/cjs-types/common/utils/day.d.ts +16 -0
- package/dist/cjs-types/common/weatherIcon/index.d.ts +3 -0
- package/dist/cjs-types/common/weatherIcon/parts.d.ts +26 -0
- package/dist/cjs-types/common/weatherIcon/weatherIcon.d.ts +4 -0
- package/dist/cjs-types/common/weatherIcon/weatherIcon.types.d.ts +44 -0
- package/dist/cjs-types/index.d.ts +7 -1
- package/dist/esm/common/buttonGroup/buttonGroup.module.mjs.map +1 -1
- package/dist/esm/common/commandPalette/commandPalette.mjs +2 -0
- package/dist/esm/common/commandPalette/commandPalette.mjs.map +1 -0
- package/dist/esm/common/commandPalette/commandPalette.module.mjs +2 -0
- package/dist/esm/common/commandPalette/commandPalette.module.mjs.map +1 -0
- package/dist/esm/common/commandPalette/filterCommands.mjs +2 -0
- package/dist/esm/common/commandPalette/filterCommands.mjs.map +1 -0
- package/dist/esm/common/copyButton/copyButton.mjs +2 -0
- package/dist/esm/common/copyButton/copyButton.mjs.map +1 -0
- package/dist/esm/common/copyButton/copyButton.module.mjs +2 -0
- package/dist/esm/common/copyButton/copyButton.module.mjs.map +1 -0
- package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs +1 -1
- package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs.map +1 -1
- package/dist/esm/common/datePicker/dateFunctions.mjs +1 -1
- package/dist/esm/common/datePicker/dateFunctions.mjs.map +1 -1
- package/dist/esm/common/datePicker/datePicker.mjs +1 -1
- package/dist/esm/common/datePicker/datePicker.mjs.map +1 -1
- package/dist/esm/common/dropdown/dropdown.mjs +1 -1
- package/dist/esm/common/dropdown/dropdown.module.mjs.map +1 -1
- package/dist/esm/common/errorBoundary/errorBoundary.mjs +2 -2
- package/dist/esm/common/errorBoundary/errorBoundary.mjs.map +1 -1
- package/dist/esm/common/errorBoundary/errorBoundary.module.mjs +1 -1
- package/dist/esm/common/errorBoundary/errorBoundary.module.mjs.map +1 -1
- package/dist/esm/common/hooks/useClipboard.mjs +2 -0
- package/dist/esm/common/hooks/useClipboard.mjs.map +1 -0
- package/dist/esm/common/hooks/useFocusBoundary.mjs +1 -1
- package/dist/esm/common/hooks/useFocusBoundary.mjs.map +1 -1
- package/dist/esm/common/inputDropdown/inputDropdown.mjs +1 -1
- package/dist/esm/common/inputDropdown/inputDropdown.mjs.map +1 -1
- package/dist/esm/common/inputDropdown/inputDropdown.module.mjs +1 -1
- package/dist/esm/common/inputDropdown/inputDropdown.module.mjs.map +1 -1
- package/dist/esm/common/menu/menu.mjs +1 -1
- package/dist/esm/common/menu/menu.mjs.map +1 -1
- package/dist/esm/common/menu/menu.types.mjs.map +1 -1
- package/dist/esm/common/popover/popover.mjs +1 -1
- package/dist/esm/common/popover/popover.mjs.map +1 -1
- package/dist/esm/common/popover/popover.types.mjs.map +1 -1
- package/dist/esm/common/themeProvider/themeProvider.mjs +1 -1
- package/dist/esm/common/themeProvider/themeProvider.mjs.map +1 -1
- package/dist/esm/common/timer/timer.mjs +1 -1
- package/dist/esm/common/timer/timer.mjs.map +1 -1
- package/dist/esm/common/utils/day.mjs +2 -0
- package/dist/esm/common/utils/day.mjs.map +1 -0
- package/dist/esm/common/weatherIcon/parts.mjs +2 -0
- package/dist/esm/common/weatherIcon/parts.mjs.map +1 -0
- package/dist/esm/common/weatherIcon/weatherIcon.mjs +2 -0
- package/dist/esm/common/weatherIcon/weatherIcon.mjs.map +1 -0
- package/dist/esm/common/weatherIcon/weatherIcon.module.mjs +2 -0
- package/dist/esm/common/weatherIcon/weatherIcon.module.mjs.map +1 -0
- package/dist/esm/common/weatherIcon/weatherIcon.types.mjs +2 -0
- package/dist/esm/common/weatherIcon/weatherIcon.types.mjs.map +1 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/common/commandPalette/commandPalette.d.ts +4 -0
- package/dist/types/common/commandPalette/commandPalette.types.d.ts +42 -0
- package/dist/types/common/commandPalette/filterCommands.d.ts +15 -0
- package/dist/types/common/commandPalette/index.d.ts +2 -0
- package/dist/types/common/configProvider/configProvider.types.d.ts +6 -0
- package/dist/types/common/copyButton/copyButton.d.ts +4 -0
- package/dist/types/common/copyButton/copyButton.types.d.ts +36 -0
- package/dist/types/common/copyButton/index.d.ts +2 -0
- package/dist/types/common/datePicker/components/datePickerMonth/datePickerMonth.types.d.ts +6 -6
- package/dist/types/common/datePicker/dateFunctions.d.ts +10 -19
- package/dist/types/common/datePicker/datePicker.types.d.ts +20 -14
- package/dist/types/common/datePicker/index.d.ts +1 -0
- package/dist/types/common/errorBoundary/errorBoundary.d.ts +0 -3
- package/dist/types/common/errorBoundary/errorBoundary.types.d.ts +2 -3
- package/dist/types/common/hooks/index.d.ts +2 -0
- package/dist/types/common/hooks/useClipboard.d.ts +16 -0
- package/dist/types/common/inputDropdown/inputDropdown.types.d.ts +7 -1
- package/dist/types/common/menu/menu.types.d.ts +2 -0
- package/dist/types/common/popover/popover.types.d.ts +5 -0
- package/dist/types/common/themeProvider/themeProvider.d.ts +8 -7
- package/dist/types/common/utils/day.d.ts +16 -0
- package/dist/types/common/weatherIcon/index.d.ts +3 -0
- package/dist/types/common/weatherIcon/parts.d.ts +26 -0
- package/dist/types/common/weatherIcon/weatherIcon.d.ts +4 -0
- package/dist/types/common/weatherIcon/weatherIcon.types.d.ts +44 -0
- package/dist/types/index.d.ts +7 -1
- package/docs/ButtonGroup.md +2 -0
- package/docs/CLAUDE.md +9 -2
- package/docs/CommandPalette.md +84 -0
- package/docs/ConfigProvider.md +2 -2
- package/docs/CopyButton.md +45 -0
- package/docs/DatePicker.md +72 -45
- package/docs/ErrorBoundary.md +4 -4
- package/docs/Fab.md +1 -2
- package/docs/FormValidator.md +3 -3
- package/docs/Hooks.md +39 -3
- package/docs/InputDropdown.md +9 -4
- package/docs/Menu.md +5 -3
- package/docs/Popover.md +15 -0
- package/docs/WeatherIcon.md +49 -0
- package/package.json +2 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{useComponentDefaults as e}from"../configProvider/useComponentDefaults.mjs";import{useLabels as t}from"../configProvider/useLabels.mjs";import{ButtonSize as n}from"../button/button.types.mjs";import r from"../button/button.mjs";import i from"../actionIcon/actionIcon.mjs";import"./timer.chime.mjs";import a from"./timer.module.mjs";import{useEffect as o,useImperativeHandle as ee,useMemo as te,useRef as s,useState as c}from"react";import l from"classnames";import{faMinus as ne,faPause as re,faPlay as ie,faPlus as ae,faXmark as oe}from"@fortawesome/free-solid-svg-icons";import{jsx as u,jsxs as d}from"react/jsx-runtime";var se=200,ce=1e3,le={cancel:`Cancel timer`};function ue(){return typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches===!0}function de(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=String(r).padStart(2,`0`),o=String(i).padStart(2,`0`);return n>0?`${n}:${a}:${o}`:`${a}:${o}`}function f(f){let{ref:fe,durationSeconds:p,autoStart:m=!0,resetOnDurationChange:pe=!0,onTick:h,onComplete:me,onStart:he,onPause:ge,onResume:_e,onCancel:ve,onAddTime:ye,onRemoveTime:be,showControls:g=!0,hideAddButton:xe=!1,hideRemoveButton:Se=!1,hidePauseButton:Ce=!1,hideCancelButton:we=!1,adjustSeconds:_=30,maxSeconds:v,label:y,formatTime:Te=de,size:b,strokeWidth:x=10,counterClockwise:Ee=!1,urgentThreshold:De=.1,urgentMinSeconds:Oe=3,pulseOnUrgent:ke=!0,showRunningRipples:S=!1,playSoundOnComplete:C=!1,soundUrl:w,soundVolume:Ae=.5,notifyOnComplete:T=!1,notificationTitle:je,notificationBody:Me,className:Ne,style:Pe,classNames:E,styles:D,labels:Fe,...Ie}=e(`Timer`,f),Le=t(`Timer`,Fe,le),O=p*1e3,[k,Re]=c(m?`running`:`idle`),[A,ze]=c(O),[Be,Ve]=c(0),[j,M]=c([]),N=s(A),P=s(k),F=s(O),I=s(!1),L=s(!1),R=s(!1),z=s(0);function B(e){N.current=e,ze(e)}function V(e){P.current=e,Re(e)}function H(){Ve(e=>e+1)}o(()=>{if(k!==`running`)return;let e=Date.now(),t=N.current,n=setInterval(()=>{let n=Math.max(0,t-(Date.now()-e));B(n),h?.(n),n<=0&&V(`completed`)},se);return()=>clearInterval(n)},[k,Be]),o(()=>{if(k===`completed`&&!I.current){if(I.current=!0,me?.(),C)try{let e=new Audio(w||`data:audio/wav;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANACUAKwAKAMr/kv+R/9n/TwCxALwAVwCs/xb/8/5p/0YAFgFfAeYA3f/N/lP+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`);e.volume=Ae,e.play()?.catch(()=>{})}catch{}if(T&&typeof Notification<`u`&&Notification.permission===`granted`)try{new Notification(je??`Timer done`,{body:Me??(typeof y==`string`?y:void 0)})}catch{}}k!==`completed`&&(I.current=!1)},[k]),o(()=>{if(!R.current){R.current=!0;return}let e=p*1e3;F.current=e,B(e),I.current=!1,H(),pe&&V(m?`running`:`idle`)},[p]),o(()=>{if(!S||k!==`running`||ue())return;function e(){z.current+=1,M(e=>[...e,z.current])}e();let t=setInterval(e,ce);return()=>clearInterval(t)},[S,k]);function He(e){M(t=>t.filter(t=>t!==e))}function Ue(){T&&!L.current&&typeof Notification<`u`&&Notification.permission==="default"&&(L.current=!0,Notification.requestPermission().catch(()=>{}))}function U(){Ue(),(P.current===`completed`||P.current===`cancelled`)&&(B(F.current),I.current=!1),H(),V(`running`),he?.()}function W(){P.current===`running`&&(V(`paused`),ge?.())}function G(){P.current===`paused`&&(H(),V(`running`),_e?.())}function K(e){let t=v==null?1/0:v*1e3,n=Math.min(N.current+e*1e3,t);B(n),H(),ye?.(e,Math.round(n/1e3)),P.current===`completed`&&n>0&&(I.current=!1,V(`running`))}function q(e){let t=Math.max(0,N.current-e*1e3);B(t),H(),be?.(e,Math.round(t/1e3)),t<=0&&P.current===`running`&&V(`completed`)}function J(){B(F.current),V(`cancelled`),ve?.()}function We(){B(F.current),I.current=!1,V(`idle`)}ee(fe,()=>({start:U,pause:W,resume:G,addTime:K,removeTime:q,cancel:J,reset:We,getStatus:()=>P.current,getRemainingMs:()=>N.current}));let Y=50-x/2,X=te(()=>2*Math.PI*Y,[Y]),Ge=X*(1-(F.current>0?Math.min(1,A/F.current):0)),Z=Math.max(F.current*De,Oe*1e3),Q=k===`running`&&A<=Z,Ke=Q&&A<=Math.min(5e3,Z),$=k===`paused`,qe=g&&!xe,Je=g&&!Se,Ye=g&&!Ce,Xe=k===`running`?re:ie,Ze=k===`running`?`Pause`:$?`Resume`:k===`idle`?`Start`:`Restart`,Qe=k===`running`?W:$?G:U,$e=g&&!we;return d(`div`,{...Ie,className:l(a.timer,ke&&Q&&a.timerPulsing,Ke&&a.timerCritical,Ne,E?.root),style:{...b?{"--timer-size":b}:null,"--timer-stroke-width":`${x}px`,...Pe,...D?.root},children:[d(`div`,{className:l(a.timerRingWrapper,E?.ringWrapper),style:D?.ringWrapper,children:[j.length>0&&u(`div`,{className:l(a.timerRipples,E?.ripples),style:D?.ripples,children:j.map(e=>u(`span`,{className:l(a.timerRipple,E?.ripple),style:D?.ripple,onAnimationEnd:()=>He(e)},e))}),d(`svg`,{className:l(a.timerRingSvg,E?.ringSvg),viewBox:`0 0 100 100`,style:D?.ringSvg,children:[u(`circle`,{className:l(a.timerRingTrack,E?.ringTrack),cx:`50`,cy:`50`,r:Y,style:D?.ringTrack}),u(`circle`,{className:l(a.timerRingProgress,Q&&a.timerRingProgressUrgent,E?.ringProgress),cx:`50`,cy:`50`,r:Y,strokeDasharray:X,strokeDashoffset:Ge,style:{transition:$?`none`:void 0,transform:Ee?`rotate(-90deg)`:void 0,...D?.ringProgress}})]}),d(`div`,{className:l(a.timerDisplay,E?.display),style:D?.display,children:[u(`span`,{className:l(a.timerTime,E?.time),style:D?.time,children:Te(A)}),y&&u(`span`,{className:l(a.timerLabel,E?.label),style:D?.label,children:y})]})]}),g&&d(`div`,{className:l(a.timerControls,E?.controls),style:D?.controls,children:[d(`div`,{className:a.timerControlsRow,children:[Je&&u(i,{icon:ne,title:`Remove ${_}s`,onClick:()=>q(_),className:l(a.timerAdjustButton,E?.removeButton),style:D?.removeButton}),Ye&&u(r,{size:n.Small,icon:Xe,title:Ze,onClick:Qe,className:E?.pauseButton,style:D?.pauseButton}),qe&&u(i,{icon:ae,title:`Add ${_}s`,onClick:()=>K(_),className:l(a.timerAdjustButton,E?.addButton),style:D?.addButton})]}),$e&&u(i,{icon:oe,title:Le.cancel,onClick:J,className:l(a.timerCancelButton,E?.cancelButton),style:D?.cancelButton})]})]})}export{f as default};
|
|
1
|
+
"use client";import{useComponentDefaults as e}from"../configProvider/useComponentDefaults.mjs";import{useLabels as t}from"../configProvider/useLabels.mjs";import{ButtonSize as n}from"../button/button.types.mjs";import r from"../button/button.mjs";import i from"../actionIcon/actionIcon.mjs";import"./timer.chime.mjs";import a from"./timer.module.mjs";import{useEffect as o,useImperativeHandle as ee,useMemo as te,useRef as s,useState as c}from"react";import l from"classnames";import{faMinus as ne,faPause as re,faPlay as ie,faPlus as ae,faXmark as oe}from"@fortawesome/free-solid-svg-icons";import{jsx as u,jsxs as d}from"react/jsx-runtime";var se=200,ce=1e3,le={cancel:`Cancel timer`};function ue(){return typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches===!0}function de(e){let t=Math.ceil(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=String(r).padStart(2,`0`),o=String(i).padStart(2,`0`);return n>0?`${n}:${a}:${o}`:`${a}:${o}`}function f(f){let{ref:fe,durationSeconds:p,autoStart:m=!0,resetOnDurationChange:pe=!0,onTick:h,onComplete:me,onStart:he,onPause:ge,onResume:_e,onCancel:ve,onAddTime:g,onRemoveTime:ye,showControls:_=!0,hideAddButton:be=!1,hideRemoveButton:xe=!1,hidePauseButton:Se=!1,hideCancelButton:Ce=!1,adjustSeconds:v=30,maxSeconds:y,label:b,formatTime:we=de,size:x,strokeWidth:S=10,counterClockwise:Te=!1,urgentThreshold:Ee=.1,urgentMinSeconds:De=3,pulseOnUrgent:Oe=!0,showRunningRipples:C=!1,playSoundOnComplete:w=!1,soundUrl:T,soundVolume:ke=.5,notifyOnComplete:E=!1,notificationTitle:Ae,notificationBody:je,className:Me,style:Ne,classNames:D,styles:O,labels:Pe,...Fe}=e(`Timer`,f),Ie=t(`Timer`,Pe,le),k=p*1e3,[A,Le]=c(m?`running`:`idle`),[j,Re]=c(k),[ze,Be]=c(0),[M,N]=c([]),P=s(j),F=s(A),I=s(k),L=s(!1),R=s(!1),z=s(!1),Ve=s(0);function B(e){P.current=e,Re(e)}function V(e){F.current=e,Le(e)}function H(){Be(e=>e+1)}o(()=>{if(A!==`running`)return;let e=Date.now(),t=P.current,n=setInterval(()=>{let n=Math.max(0,t-(Date.now()-e));B(n),h?.(n),n<=0&&V(`completed`)},se);return()=>clearInterval(n)},[A,ze]),o(()=>{if(A===`completed`&&!L.current){if(L.current=!0,me?.(),w)try{let e=new Audio(T||`data:audio/wav;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANACUAKwAKAMr/kv+R/9n/TwCxALwAVwCs/xb/8/5p/0YAFgFfAeYA3f/N/lP+wP7s/zwB9QGiAV4Azv7O/ff9Rf8RAWACcQImASb/g/0s/WH+jACEAjADIALY/4v9gfxZ/bD/TAK/AzAD2gD2/Rb8S/yN/q4B/wMyBBkCyP4H/F77Ov2qANgDAgV3A/r/aPyz+tr7Tf87A34F0AR7AUH9bfqS+rD9JQKJBfsFLAOQ/qP6jPn1+6EADgXSBucERQBk++74RvrE/gYEMQeABkECs/zW+M74svx1AvwGygdeBIH+Wvm795b6bwAmBpwIbQa2AIP6NPeg+BX+rATSCD0IKgNK/FX3A/eU+50CVQibCawFmv4w+O71HvkWABwHXAoHCE0Bx/mJ9ez2Q/0sBWAKAgo0BAr87PU19Vj6nQKRCWkLFAfa/ib3KfSR95f/7gcQDLEJCQIv+fDzLfVO/IUF1wvNC1wF8fuf9GbzAPl2Aq8KMg2TCEH/PvZv8vL18v6cCLMNaAvoAr/4bPJn8zn7tgUzDZoNogYA/HDznPGR9ycCqwvxDiUKzv979cTwRfQq/iQJQg8oDegDdvgB8ZzxBvq/BXQOZg8BCDf8YfLY7wz2sQGDDKQQyAuBANz0Ku+M8j79hAm6EO4OCAVU+LDv0u+4+KEFlQ8rEXgJlfx08SDudfQWATgNRxJ5DVYBZfSm7cvwM/y+CRkStxBEBlv4fu4L7lH3WgWWEOgSAgsZ/avwduzO8lYAxg3WEzIPTQIU9DnsBu8J+88JXBN9EpsHifhr7Uvs1PXuBHMRmRSdDML9B/Dd6hzxdP8tDk8V8hBkA+zz5+pB7cT5uAmAFD8UCQnf+HrslepF9FsELBI6FkYOjv6J71npYu9y/mwOrha1EpcE6/Oz6X/rZfh6CYQV+RWLClv5revu6KbypAO/EsgX+Q99/zPv7eek7VH9hA7yF3cU5QUS9J7ow+nx9hUJZBamFx8M/PkF61fn/PDKAisTQBmzEYsABe+b5uTrE/x0DhcZNBZLB2H0q+cR6Gn1iQggF0QZwA3A+oTq1eVI79ABbxOeGm8TtgH/7mblJ+q9+jwOGxroF8YI1vTc5m3m0vPaB7YXzxpsD6f7Kupq5JDttwCME+EbKxX9AiDvUeRw6FD53Q39GpEZUgpw9TLm2uQv8gcHJRhEHB8Rrvz36Rrj1+uB/4ETBh3iFlsEae9e48Pm0PdYDbsbLBvsCy72ruVb44LwFAZtGKEd1RLS/e3p5+Ef6jL+TRMKHpIYzgXZ747iJOVA9q4MUhyzHJEND/dR5fPh0O4BBY0Y4h6LFBL/CurT4G7ozPzzEuweNxpTB27w4+GV46P04QvDHCUePQ8P+BzlpeAd7dIDhRgFID0WagBP6uDfxuZS+3MSqR/MG+cIJ/Fe4Rni/fLzCg0dfx/uEC75EOV032vriQJVGAgh5xfXAbvqEd8r5cj5zRFBIFAdhgoD8gHhteBR8eYJLh29IJ4SaPor5WLev+koAf4X6SGHGVYDTetm3qDjMfgFEbMgvh4tDP/yy+Bq36PvuwgoHd4hSxS6+23lcd0c6LT/gBelIhgb5QQC7OLdKeKR9hoQ/CAUINgNGfS94Dze9+13B/oc3yLwFSP91+Wj3IXmL/7dFjwjlxx/BtvshN3I4Or0EA8eIVAhgw9P9dfgLN1P7BsGpBy9I4sXnv5m5vrb/+Sd/BcWrCMCHiEI1O1P3YHfQPPpDRghbSIrEZ72GeE+3LHqqwQoHHgkGBkoABrnd9uL4wD7LxX1I1Ufxwnr7kHdVd6Y8agM6iBrI80SA/iC4XLbHukpA4YbDSWUGr4B8ecb2y7iXfknFBYkjSBvCx/wXN1J3fTvTwuUIEckZBR7+RHiy9qb55oBwRp8JfsbXQPp6Ofa6uC39wITDySoIRQNbPGe3V3cWe7hCRggACXuFQP7xOJK2ivmAADaGcMlSx0BBf/p2trB3xL2whHgI6Misg7P8gfelNvK7GEIdx+TJWcXl/yb4/DZ0ORf/tMY4iWAHqYGMuv22rfecfRqEIojfCNHEEb0l97v2knr0waxHv8lyxg0/pLkvdmP47v8rhfaJZgfSQh+7Drbzt3Y8v0ODSMyJM4RzfVL33Da2+k7BckdRSYZGtb/qeWz2WniGPttFqklkSDlCeHtpdsH3Urxfg1qIsMkRRNg9yPgGNqD6JsDwRxiJkwbegHc5tDZYeF4+RUVUSVpIXkLWO823GTcy+/wC6MhLiWoFP34HOHn2UPn9wGbG1gmYhwcAyroFtp54N/3pxPSJB0i/wzg8Ozc59te7lcKuSBxJfQVn/o04t/ZHuZUAFoaJSZaHbkEjumD2rTfUvYnEi0krCJ2DnTyxd2R2wbttgivH40lJhdE/Gnj/9kX5bP+/xjLJTAeTAYH6xbbE9/T9JgQZCMVI9gPEvTA3mLbx+sSB4cegCU8GOf9uORG2jHkGv2PF0kl4x7UB5DsztuX3mbz/Q54IlcjJRG29dvfXNui6mwFQx1MJTMZhf8f5rXabOOM+w0WoiRxH0sJJ+6q3ELeDfJaDWwhcSNXEl33E+F925vpygPmG+8kCRobAZvnStvL4gv6exTXI9kfrwrI76jdFN7N8LILQSBjI24TA/ll4sbbtOguAnMabCS8GqQCJ+kF3FDinPjdEugiGyD9C2/xxd4P3qfvCgr6Hi0jZhSk+s/jN9zv550A7RjDI0sbHgTB6uTc++FB9zYR2SE0IDINGfMA4DHenu5kCJkdzyI9FT38TuXO3E3nGf9YF/UitBuFBWbs5N3N4f71iw+rICYgSw7D9Fbhe9617cUGIxxLIvIVyv3e5ovd0eam/bUVBCL1G9YGEu4E38jh1fTeDWEf7x9FD2j2xOLt3u3sLwWZGqAhghZI/33obN575kj8ChTyIBAcDwjB70Pg6uHJ8zQM/R2RHx8QBvhH5IbfSeynA/4Y0CDtFrMAJupv30zmAPtaEsEfAhwrCW/xnOE04tzyjwqCHAsf1xCY+dzlRODL6y8CVxfdHzAXCQLX65LgRebT+agQdB7MGyoKGvMO46biEfL0CPMaYB5rERv7f+cm4XLrywCnFckeTBdHA4zt0+Fm5sL4+A4MHW4bCQu+9JXkP+Np8WYHVRmPHdgRjfwu6SriQOt+//ETlR1BF2kEQO8v46/m0PdNDY0b6RrFC1b2Lub94+bw5wWpF5scIBLp/eTqT+M260r+ORJFHA0XbgXx8KTkH+cA96sL+xk+Gl0M4PfW59/kifB9BPMVhhs/Ei3/nuyS5FXrM/2DENsasRZSBpvyL+a351L2FgpYGG4Z0AxY+Yrp5OVT8CkDNxRRGjcSVgBZ7vHlm+s7/NEOWRkuFhUHO/TM53ToyvWRCKcWehgdDbz6ResK50Xw7gF5Ev8YBxJiARHwaecI7GT7KQ3DF4UVswfM9XnpVeln9R8H7BRlF0INCPwG7U7oXvDPALwQkxevEU4CwvH26J3sr/qMCxwWtxQtCEz3MetZ6iv1wwUrEzAWPw05/cfurumg8M//BA8PFjARGANp85fqV+0f+v8JZxTFE4AIuPjy7H7rFvWABGcR3RQUDUz+hfAn6wnx8P5UDXYUihC+AwL1R+w27rX5hQioErESrAgM+rjuwuwq9VkDpA9wE8IMQf898rfsmfEz/rALzBLAD0AEivYD7jjvcvkgB+IQfRGwCEb7f/Ai7mX1UALlDesRSAwUAOzzWe5P8pv9GwoUEdEOmwT+98jvW/BW+dQFGA8sEIwIYvxD8pvvyfVoAS4MUhCnC8MAjPUM8CrzKP2YCFEPwA3PBFv5k/Gc8WL5pARPDcAOQAhg/QL0K/FT9qIAggqmDuEKTQEd98vxKPTc/CsHhw2PDNsEnvpf8/rylvmSA4oLPA3NBzz+t/XO8gP3AADlCOwM+AmxAZn4k/NH9bf81gW6C0ELvwTE+yj1cvTx+aACzQmiCzMH9f5f94H02PeE/1sHJwvsCO4B//lh9YX2u/ydBOwJ1wl8BMv87fYA9nT60QEbCPYJdAaJ//f4QvbQ+C7/5QVaCb8HBAJK+zH33/fm/IIDIghVCBEEsf2o+KP3HPslAXcGPAiRBff/e/oM+On5AP+IBIoHdQbyAXr8//hU+Tj9hgJgBr0GfwN0/lb6Vvnq+58A5QR2BosEPgDp+9z5Ivv5/kYDuQUQBbcBiv3H+t/6sv2tAagEEwXIAhL/9fsW+9v8PwBoA6kEZQNeAD39rvt3/Bv/IQLsA5EDVgF6/of8f/xS/vcA/gJaA+0Biv+A/eD87f0HAAMC1wIhAlUAdf5+/ef9ZP8cASUC/QHNAEb/O/4w/hf/ZwBlAZUB7wDb//X+sP4f//b/uAAEAcEAJQCO/0r/bv/U/zkAaQBXAB8A7v/f/+7/`);e.volume=ke,e.play()?.catch(()=>{})}catch{}if(E&&typeof Notification<`u`&&Notification.permission===`granted`)try{new Notification(Ae??`Timer done`,{body:je??(typeof b==`string`?b:void 0)})}catch{}}A!==`completed`&&(L.current=!1)},[A]),o(()=>{if(!z.current){z.current=!0;return}let e=p*1e3;I.current=e,B(e),L.current=!1,H(),pe&&V(m?`running`:`idle`)},[p]),o(()=>{if(!C||A!==`running`||ue())return;function e(){let e=++Ve.current;N(t=>[...t,e])}e();let t=setInterval(e,ce);return()=>clearInterval(t)},[C,A]);function He(e){N(t=>t.filter(t=>t!==e))}function Ue(){E&&!R.current&&typeof Notification<`u`&&Notification.permission==="default"&&(R.current=!0,Notification.requestPermission().catch(()=>{}))}function U(){Ue(),(F.current===`completed`||F.current===`cancelled`)&&(B(I.current),L.current=!1),H(),V(`running`),he?.()}function W(){F.current===`running`&&(V(`paused`),ge?.())}function G(){F.current===`paused`&&(H(),V(`running`),_e?.())}function K(e){let t=y==null?1/0:y*1e3,n=Math.min(P.current+e*1e3,t);B(n),H(),g?.(e,Math.round(n/1e3)),F.current===`completed`&&n>0&&(L.current=!1,V(`running`))}function q(e){let t=Math.max(0,P.current-e*1e3);B(t),H(),ye?.(e,Math.round(t/1e3)),t<=0&&F.current===`running`&&V(`completed`)}function J(){B(I.current),V(`cancelled`),ve?.()}function We(){B(I.current),L.current=!1,V(`idle`)}ee(fe,()=>({start:U,pause:W,resume:G,addTime:K,removeTime:q,cancel:J,reset:We,getStatus:()=>F.current,getRemainingMs:()=>P.current}));let Y=50-S/2,X=te(()=>2*Math.PI*Y,[Y]),Ge=X*(1-(I.current>0?Math.min(1,j/I.current):0)),Z=Math.max(I.current*Ee,De*1e3),Q=A===`running`&&j<=Z,Ke=Q&&j<=Math.min(5e3,Z),$=A===`paused`,qe=_&&!be,Je=_&&!xe,Ye=_&&!Se,Xe=A===`running`?re:ie,Ze=A===`running`?`Pause`:$?`Resume`:A===`idle`?`Start`:`Restart`,Qe=A===`running`?W:$?G:U,$e=_&&!Ce;return d(`div`,{...Fe,className:l(a.timer,Oe&&Q&&a.timerPulsing,Ke&&a.timerCritical,Me,D?.root),style:{...x?{"--timer-size":x}:null,"--timer-stroke-width":`${S}px`,...Ne,...O?.root},children:[d(`div`,{className:l(a.timerRingWrapper,D?.ringWrapper),style:O?.ringWrapper,children:[M.length>0&&u(`div`,{className:l(a.timerRipples,D?.ripples),style:O?.ripples,children:M.map(e=>u(`span`,{className:l(a.timerRipple,D?.ripple),style:O?.ripple,onAnimationEnd:()=>He(e)},e))}),d(`svg`,{className:l(a.timerRingSvg,D?.ringSvg),viewBox:`0 0 100 100`,style:O?.ringSvg,children:[u(`circle`,{className:l(a.timerRingTrack,D?.ringTrack),cx:`50`,cy:`50`,r:Y,style:O?.ringTrack}),u(`circle`,{className:l(a.timerRingProgress,Q&&a.timerRingProgressUrgent,D?.ringProgress),cx:`50`,cy:`50`,r:Y,strokeDasharray:X,strokeDashoffset:Ge,style:{transition:$?`none`:void 0,transform:Te?`rotate(-90deg)`:void 0,...O?.ringProgress}})]}),d(`div`,{className:l(a.timerDisplay,D?.display),style:O?.display,children:[u(`span`,{className:l(a.timerTime,D?.time),style:O?.time,children:we(j)}),b&&u(`span`,{className:l(a.timerLabel,D?.label),style:O?.label,children:b})]})]}),_&&d(`div`,{className:l(a.timerControls,D?.controls),style:O?.controls,children:[d(`div`,{className:a.timerControlsRow,children:[Je&&u(i,{icon:ne,title:`Remove ${v}s`,onClick:()=>q(v),className:l(a.timerAdjustButton,D?.removeButton),style:O?.removeButton}),Ye&&u(r,{size:n.Small,icon:Xe,title:Ze,onClick:Qe,className:D?.pauseButton,style:O?.pauseButton}),qe&&u(i,{icon:ae,title:`Add ${v}s`,onClick:()=>K(v),className:l(a.timerAdjustButton,D?.addButton),style:O?.addButton})]}),$e&&u(i,{icon:oe,title:Ie.cancel,onClick:J,className:l(a.timerCancelButton,D?.cancelButton),style:O?.cancelButton})]})]})}export{f as default};
|
|
2
2
|
//# sourceMappingURL=timer.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.mjs","names":[],"sources":["../../../../package/common/timer/timer.tsx"],"sourcesContent":["import { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport { faPlus, faMinus, faPause, faPlay, faXmark } from '@fortawesome/free-solid-svg-icons';\n\nimport ActionIcon from '../actionIcon';\nimport Button from '../button';\nimport { ButtonSize } from '../button/button.types';\nimport { useComponentDefaults, useLabels } from '../configProvider';\nimport { DEFAULT_CHIME_DATA_URI } from './timer.chime';\nimport type { TimerLabels, TimerProps, TimerStatus } from './timer.types';\nimport styles from './timer.module.pcss';\n\nconst TICK_MS = 200;\nconst RIPPLE_SPAWN_INTERVAL_MS = 1000;\n\nconst DEFAULT_LABELS: Required<TimerLabels> = {\n cancel: 'Cancel timer',\n};\n\nfunction prefersReducedMotion(): boolean {\n return typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true;\n}\n\nfunction formatTimeDefault(remainingMs: number) {\n const totalSeconds = Math.ceil(remainingMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n return hours > 0 ? `${hours}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nfunction Timer(props: TimerProps) {\n const {\n ref,\n durationSeconds,\n autoStart = true,\n resetOnDurationChange = true,\n\n onTick,\n onComplete,\n onStart,\n onPause,\n onResume,\n onCancel,\n onAddTime,\n onRemoveTime,\n\n showControls = true,\n hideAddButton = false,\n hideRemoveButton = false,\n hidePauseButton = false,\n hideCancelButton = false,\n adjustSeconds = 30,\n maxSeconds,\n\n label,\n formatTime = formatTimeDefault,\n size,\n strokeWidth = 10,\n counterClockwise = false,\n\n urgentThreshold = 0.1,\n urgentMinSeconds = 3,\n pulseOnUrgent = true,\n showRunningRipples = false,\n\n playSoundOnComplete = false,\n soundUrl,\n soundVolume = 0.5,\n notifyOnComplete = false,\n notificationTitle,\n notificationBody,\n\n className,\n style,\n classNames,\n styles: slotStyles,\n labels,\n ...rest\n } = useComponentDefaults('Timer', props);\n const text = useLabels('Timer', labels, DEFAULT_LABELS);\n\n const initialMs = durationSeconds * 1000;\n const [status, setStatusState] = useState<TimerStatus>(autoStart ? 'running' : 'idle');\n const [remainingMs, setRemainingMsState] = useState(initialMs);\n const [epoch, setEpoch] = useState(0);\n const [ripples, setRipples] = useState<number[]>([]);\n\n const remainingRef = useRef(remainingMs);\n const statusRef = useRef(status);\n const totalMsRef = useRef(initialMs);\n const completedFiredRef = useRef(false);\n const notifyPermissionRequestedRef = useRef(false);\n const mountedRef = useRef(false);\n const rippleIdRef = useRef(0);\n\n function setRemaining(next: number) {\n remainingRef.current = next;\n setRemainingMsState(next);\n }\n\n function setStatus(next: TimerStatus) {\n statusRef.current = next;\n setStatusState(next);\n }\n\n function bumpEpoch() {\n setEpoch((e) => e + 1);\n }\n\n // Ticking effect. Re-derives the remaining time from Date.now() every tick (rather than\n // accumulating setInterval's own drift), so it stays accurate over long countdowns. Any\n // external mutation of remainingRef (addTime/removeTime while already running, or a resume)\n // must bump `epoch` so this effect re-arms and re-captures a fresh start/startRemaining —\n // without that, a stale `startRemaining` captured before the mutation would silently\n // overwrite it on the next tick.\n useEffect(() => {\n if (status !== 'running') return undefined;\n const start = Date.now();\n const startRemaining = remainingRef.current;\n const id = setInterval(() => {\n const next = Math.max(0, startRemaining - (Date.now() - start));\n setRemaining(next);\n onTick?.(next);\n if (next <= 0) setStatus('completed');\n }, TICK_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status, epoch]);\n\n // Fires onComplete exactly once per completion, plus the opt-in sound/notification.\n useEffect(() => {\n if (status === 'completed' && !completedFiredRef.current) {\n completedFiredRef.current = true;\n onComplete?.();\n if (playSoundOnComplete) {\n try {\n const audio = new Audio(soundUrl || DEFAULT_CHIME_DATA_URI);\n audio.volume = soundVolume;\n // play() can reject (autoplay policy) or, in some environments, return undefined\n // instead of a Promise — never let a blocked/unsupported playback surface as an error.\n audio.play()?.catch(() => {});\n } catch {\n // Audio unavailable/unsupported — fail silently.\n }\n }\n if (notifyOnComplete && typeof Notification !== 'undefined' && Notification.permission === 'granted') {\n try {\n new Notification(notificationTitle ?? 'Timer done', {\n body: notificationBody ?? (typeof label === 'string' ? label : undefined),\n });\n } catch {\n // Some browsers (e.g. certain mobile Safari versions) throw constructing\n // Notification outside specific contexts — fail silently, as documented.\n }\n }\n }\n if (status !== 'completed') completedFiredRef.current = false;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status]);\n\n // durationSeconds prop change: reset (and optionally restart) at the new duration. Skips\n // the initial mount, since autoStart/initial state already cover that.\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n const nextMs = durationSeconds * 1000;\n totalMsRef.current = nextMs;\n setRemaining(nextMs);\n completedFiredRef.current = false;\n bumpEpoch();\n if (resetOnDurationChange) {\n setStatus(autoStart ? 'running' : 'idle');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [durationSeconds]);\n\n // Running-ripple spawner: spawns a new ripple roughly every RIPPLE_SPAWN_INTERVAL_MS while\n // running, each animating once (via CSS, `forwards`) and removing itself on `onAnimationEnd`.\n // Pausing (or otherwise leaving `running`) only stops new spawns here — it doesn't touch\n // `ripples` — so whichever ripples are already mid-flight keep animating to completion\n // instead of vanishing mid-cycle.\n useEffect(() => {\n if (!showRunningRipples || status !== 'running' || prefersReducedMotion()) return undefined;\n function spawnRipple() {\n rippleIdRef.current += 1;\n setRipples((prev) => [...prev, rippleIdRef.current]);\n }\n spawnRipple();\n const id = setInterval(spawnRipple, RIPPLE_SPAWN_INTERVAL_MS);\n return () => clearInterval(id);\n }, [showRunningRipples, status]);\n\n function handleRippleAnimationEnd(id: number) {\n setRipples((prev) => prev.filter((existingId) => existingId !== id));\n }\n\n function requestNotificationPermissionIfNeeded() {\n if (!notifyOnComplete || notifyPermissionRequestedRef.current) return;\n if (typeof Notification === 'undefined' || Notification.permission !== 'default') return;\n notifyPermissionRequestedRef.current = true;\n Notification.requestPermission().catch(() => {});\n }\n\n function start() {\n requestNotificationPermissionIfNeeded();\n if (statusRef.current === 'completed' || statusRef.current === 'cancelled') {\n setRemaining(totalMsRef.current);\n completedFiredRef.current = false;\n }\n bumpEpoch();\n setStatus('running');\n onStart?.();\n }\n\n function pause() {\n if (statusRef.current !== 'running') return;\n setStatus('paused');\n onPause?.();\n }\n\n function resume() {\n if (statusRef.current !== 'paused') return;\n bumpEpoch();\n setStatus('running');\n onResume?.();\n }\n\n function addTime(seconds: number) {\n const capped = maxSeconds != null ? maxSeconds * 1000 : Infinity;\n const next = Math.min(remainingRef.current + seconds * 1000, capped);\n setRemaining(next);\n bumpEpoch();\n onAddTime?.(seconds, Math.round(next / 1000));\n if (statusRef.current === 'completed' && next > 0) {\n completedFiredRef.current = false;\n setStatus('running');\n }\n }\n\n function removeTime(seconds: number) {\n const next = Math.max(0, remainingRef.current - seconds * 1000);\n setRemaining(next);\n bumpEpoch();\n onRemoveTime?.(seconds, Math.round(next / 1000));\n if (next <= 0 && statusRef.current === 'running') setStatus('completed');\n }\n\n function cancel() {\n setRemaining(totalMsRef.current);\n setStatus('cancelled');\n onCancel?.();\n }\n\n function reset() {\n setRemaining(totalMsRef.current);\n completedFiredRef.current = false;\n setStatus('idle');\n }\n\n useImperativeHandle(ref, () => ({\n start,\n pause,\n resume,\n addTime,\n removeTime,\n cancel,\n reset,\n getStatus: () => statusRef.current,\n getRemainingMs: () => remainingRef.current,\n }));\n\n const radius = 50 - strokeWidth / 2;\n const circumference = useMemo(() => 2 * Math.PI * radius, [radius]);\n const clampedFraction = totalMsRef.current > 0 ? Math.min(1, remainingMs / totalMsRef.current) : 0;\n const dashOffset = circumference * (1 - clampedFraction);\n const urgentMs = Math.max(totalMsRef.current * urgentThreshold, urgentMinSeconds * 1000);\n const isUrgent = status === 'running' && remainingMs <= urgentMs;\n const isCritical = isUrgent && remainingMs <= Math.min(5000, urgentMs);\n const isPaused = status === 'paused';\n\n // The pause button doubles as a play/restart button whenever there's nothing to pause —\n // idle (autoStart={false}), completed, or cancelled — rather than hiding itself, so there's\n // always a way to (re)start the countdown from the built-in controls alone.\n const showAddButton = showControls && !hideAddButton;\n const showRemoveButton = showControls && !hideRemoveButton;\n const showPauseButton = showControls && !hidePauseButton;\n const pauseButtonIcon = status === 'running' ? faPause : faPlay;\n const pauseButtonTitle =\n status === 'running' ? 'Pause' : isPaused ? 'Resume' : status === 'idle' ? 'Start' : 'Restart';\n const handlePauseButtonClick = status === 'running' ? pause : isPaused ? resume : start;\n const showCancelButton = showControls && !hideCancelButton;\n\n return (\n <div\n {...rest}\n className={cx(\n styles.timer,\n pulseOnUrgent && isUrgent && styles.timerPulsing,\n isCritical && styles.timerCritical,\n className,\n classNames?.root,\n )}\n style={\n {\n ...(size ? { '--timer-size': size } : null),\n '--timer-stroke-width': `${strokeWidth}px`,\n ...style,\n ...slotStyles?.root,\n } as React.CSSProperties\n }\n >\n <div className={cx(styles.timerRingWrapper, classNames?.ringWrapper)} style={slotStyles?.ringWrapper}>\n {ripples.length > 0 && (\n <div className={cx(styles.timerRipples, classNames?.ripples)} style={slotStyles?.ripples}>\n {ripples.map((id) => (\n <span\n key={id}\n className={cx(styles.timerRipple, classNames?.ripple)}\n style={slotStyles?.ripple}\n onAnimationEnd={() => handleRippleAnimationEnd(id)}\n />\n ))}\n </div>\n )}\n <svg className={cx(styles.timerRingSvg, classNames?.ringSvg)} viewBox='0 0 100 100' style={slotStyles?.ringSvg}>\n <circle\n className={cx(styles.timerRingTrack, classNames?.ringTrack)}\n cx='50'\n cy='50'\n r={radius}\n style={slotStyles?.ringTrack}\n />\n <circle\n className={cx(\n styles.timerRingProgress,\n isUrgent && styles.timerRingProgressUrgent,\n classNames?.ringProgress,\n )}\n cx='50'\n cy='50'\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n style={{\n transition: isPaused ? 'none' : undefined,\n transform: counterClockwise ? 'rotate(-90deg)' : undefined,\n ...slotStyles?.ringProgress,\n }}\n />\n </svg>\n <div className={cx(styles.timerDisplay, classNames?.display)} style={slotStyles?.display}>\n <span className={cx(styles.timerTime, classNames?.time)} style={slotStyles?.time}>\n {formatTime(remainingMs)}\n </span>\n {label && (\n <span className={cx(styles.timerLabel, classNames?.label)} style={slotStyles?.label}>\n {label}\n </span>\n )}\n </div>\n </div>\n\n {showControls && (\n <div className={cx(styles.timerControls, classNames?.controls)} style={slotStyles?.controls}>\n <div className={styles.timerControlsRow}>\n {showRemoveButton && (\n <ActionIcon\n icon={faMinus}\n title={`Remove ${adjustSeconds}s`}\n onClick={() => removeTime(adjustSeconds)}\n className={cx(styles.timerAdjustButton, classNames?.removeButton)}\n style={slotStyles?.removeButton}\n />\n )}\n {showPauseButton && (\n <Button\n size={ButtonSize.Small}\n icon={pauseButtonIcon}\n title={pauseButtonTitle}\n onClick={handlePauseButtonClick}\n className={classNames?.pauseButton}\n style={slotStyles?.pauseButton}\n />\n )}\n {showAddButton && (\n <ActionIcon\n icon={faPlus}\n title={`Add ${adjustSeconds}s`}\n onClick={() => addTime(adjustSeconds)}\n className={cx(styles.timerAdjustButton, classNames?.addButton)}\n style={slotStyles?.addButton}\n />\n )}\n </div>\n {showCancelButton && (\n <ActionIcon\n icon={faXmark}\n title={text.cancel}\n onClick={cancel}\n className={cx(styles.timerCancelButton, classNames?.cancelButton)}\n style={slotStyles?.cancelButton}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default Timer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timer.mjs","names":[],"sources":["../../../../package/common/timer/timer.tsx"],"sourcesContent":["import { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport { faPlus, faMinus, faPause, faPlay, faXmark } from '@fortawesome/free-solid-svg-icons';\n\nimport ActionIcon from '../actionIcon';\nimport Button from '../button';\nimport { ButtonSize } from '../button/button.types';\nimport { useComponentDefaults, useLabels } from '../configProvider';\nimport { DEFAULT_CHIME_DATA_URI } from './timer.chime';\nimport type { TimerLabels, TimerProps, TimerStatus } from './timer.types';\nimport styles from './timer.module.pcss';\n\nconst TICK_MS = 200;\nconst RIPPLE_SPAWN_INTERVAL_MS = 1000;\n\nconst DEFAULT_LABELS: Required<TimerLabels> = {\n cancel: 'Cancel timer',\n};\n\nfunction prefersReducedMotion(): boolean {\n return typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true;\n}\n\nfunction formatTimeDefault(remainingMs: number) {\n const totalSeconds = Math.ceil(remainingMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n return hours > 0 ? `${hours}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nfunction Timer(props: TimerProps) {\n const {\n ref,\n durationSeconds,\n autoStart = true,\n resetOnDurationChange = true,\n\n onTick,\n onComplete,\n onStart,\n onPause,\n onResume,\n onCancel,\n onAddTime,\n onRemoveTime,\n\n showControls = true,\n hideAddButton = false,\n hideRemoveButton = false,\n hidePauseButton = false,\n hideCancelButton = false,\n adjustSeconds = 30,\n maxSeconds,\n\n label,\n formatTime = formatTimeDefault,\n size,\n strokeWidth = 10,\n counterClockwise = false,\n\n urgentThreshold = 0.1,\n urgentMinSeconds = 3,\n pulseOnUrgent = true,\n showRunningRipples = false,\n\n playSoundOnComplete = false,\n soundUrl,\n soundVolume = 0.5,\n notifyOnComplete = false,\n notificationTitle,\n notificationBody,\n\n className,\n style,\n classNames,\n styles: slotStyles,\n labels,\n ...rest\n } = useComponentDefaults('Timer', props);\n const text = useLabels('Timer', labels, DEFAULT_LABELS);\n\n const initialMs = durationSeconds * 1000;\n const [status, setStatusState] = useState<TimerStatus>(autoStart ? 'running' : 'idle');\n const [remainingMs, setRemainingMsState] = useState(initialMs);\n const [epoch, setEpoch] = useState(0);\n const [ripples, setRipples] = useState<number[]>([]);\n\n const remainingRef = useRef(remainingMs);\n const statusRef = useRef(status);\n const totalMsRef = useRef(initialMs);\n const completedFiredRef = useRef(false);\n const notifyPermissionRequestedRef = useRef(false);\n const mountedRef = useRef(false);\n const rippleIdRef = useRef(0);\n\n function setRemaining(next: number) {\n remainingRef.current = next;\n setRemainingMsState(next);\n }\n\n function setStatus(next: TimerStatus) {\n statusRef.current = next;\n setStatusState(next);\n }\n\n function bumpEpoch() {\n setEpoch((e) => e + 1);\n }\n\n // Ticking effect. Re-derives the remaining time from Date.now() every tick (rather than\n // accumulating setInterval's own drift), so it stays accurate over long countdowns. Any\n // external mutation of remainingRef (addTime/removeTime while already running, or a resume)\n // must bump `epoch` so this effect re-arms and re-captures a fresh start/startRemaining —\n // without that, a stale `startRemaining` captured before the mutation would silently\n // overwrite it on the next tick.\n useEffect(() => {\n if (status !== 'running') return undefined;\n const start = Date.now();\n const startRemaining = remainingRef.current;\n const id = setInterval(() => {\n const next = Math.max(0, startRemaining - (Date.now() - start));\n setRemaining(next);\n onTick?.(next);\n if (next <= 0) setStatus('completed');\n }, TICK_MS);\n return () => clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status, epoch]);\n\n // Fires onComplete exactly once per completion, plus the opt-in sound/notification.\n useEffect(() => {\n if (status === 'completed' && !completedFiredRef.current) {\n completedFiredRef.current = true;\n onComplete?.();\n if (playSoundOnComplete) {\n try {\n const audio = new Audio(soundUrl || DEFAULT_CHIME_DATA_URI);\n audio.volume = soundVolume;\n // play() can reject (autoplay policy) or, in some environments, return undefined\n // instead of a Promise — never let a blocked/unsupported playback surface as an error.\n audio.play()?.catch(() => {});\n } catch {\n // Audio unavailable/unsupported — fail silently.\n }\n }\n if (notifyOnComplete && typeof Notification !== 'undefined' && Notification.permission === 'granted') {\n try {\n new Notification(notificationTitle ?? 'Timer done', {\n body: notificationBody ?? (typeof label === 'string' ? label : undefined),\n });\n } catch {\n // Some browsers (e.g. certain mobile Safari versions) throw constructing\n // Notification outside specific contexts — fail silently, as documented.\n }\n }\n }\n if (status !== 'completed') completedFiredRef.current = false;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [status]);\n\n // durationSeconds prop change: reset (and optionally restart) at the new duration. Skips\n // the initial mount, since autoStart/initial state already cover that.\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n const nextMs = durationSeconds * 1000;\n totalMsRef.current = nextMs;\n setRemaining(nextMs);\n completedFiredRef.current = false;\n bumpEpoch();\n if (resetOnDurationChange) {\n setStatus(autoStart ? 'running' : 'idle');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [durationSeconds]);\n\n // Running-ripple spawner: spawns a new ripple roughly every RIPPLE_SPAWN_INTERVAL_MS while\n // running, each animating once (via CSS, `forwards`) and removing itself on `onAnimationEnd`.\n // Pausing (or otherwise leaving `running`) only stops new spawns here — it doesn't touch\n // `ripples` — so whichever ripples are already mid-flight keep animating to completion\n // instead of vanishing mid-cycle.\n useEffect(() => {\n if (!showRunningRipples || status !== 'running' || prefersReducedMotion()) return undefined;\n function spawnRipple() {\n // Read now, not in the updater: two spawns before a render would both see the later id.\n const rippleId = ++rippleIdRef.current;\n setRipples((prev) => [...prev, rippleId]);\n }\n spawnRipple();\n const id = setInterval(spawnRipple, RIPPLE_SPAWN_INTERVAL_MS);\n return () => clearInterval(id);\n }, [showRunningRipples, status]);\n\n function handleRippleAnimationEnd(id: number) {\n setRipples((prev) => prev.filter((existingId) => existingId !== id));\n }\n\n function requestNotificationPermissionIfNeeded() {\n if (!notifyOnComplete || notifyPermissionRequestedRef.current) return;\n if (typeof Notification === 'undefined' || Notification.permission !== 'default') return;\n notifyPermissionRequestedRef.current = true;\n Notification.requestPermission().catch(() => {});\n }\n\n function start() {\n requestNotificationPermissionIfNeeded();\n if (statusRef.current === 'completed' || statusRef.current === 'cancelled') {\n setRemaining(totalMsRef.current);\n completedFiredRef.current = false;\n }\n bumpEpoch();\n setStatus('running');\n onStart?.();\n }\n\n function pause() {\n if (statusRef.current !== 'running') return;\n setStatus('paused');\n onPause?.();\n }\n\n function resume() {\n if (statusRef.current !== 'paused') return;\n bumpEpoch();\n setStatus('running');\n onResume?.();\n }\n\n function addTime(seconds: number) {\n const capped = maxSeconds != null ? maxSeconds * 1000 : Infinity;\n const next = Math.min(remainingRef.current + seconds * 1000, capped);\n setRemaining(next);\n bumpEpoch();\n onAddTime?.(seconds, Math.round(next / 1000));\n if (statusRef.current === 'completed' && next > 0) {\n completedFiredRef.current = false;\n setStatus('running');\n }\n }\n\n function removeTime(seconds: number) {\n const next = Math.max(0, remainingRef.current - seconds * 1000);\n setRemaining(next);\n bumpEpoch();\n onRemoveTime?.(seconds, Math.round(next / 1000));\n if (next <= 0 && statusRef.current === 'running') setStatus('completed');\n }\n\n function cancel() {\n setRemaining(totalMsRef.current);\n setStatus('cancelled');\n onCancel?.();\n }\n\n function reset() {\n setRemaining(totalMsRef.current);\n completedFiredRef.current = false;\n setStatus('idle');\n }\n\n useImperativeHandle(ref, () => ({\n start,\n pause,\n resume,\n addTime,\n removeTime,\n cancel,\n reset,\n getStatus: () => statusRef.current,\n getRemainingMs: () => remainingRef.current,\n }));\n\n const radius = 50 - strokeWidth / 2;\n const circumference = useMemo(() => 2 * Math.PI * radius, [radius]);\n const clampedFraction = totalMsRef.current > 0 ? Math.min(1, remainingMs / totalMsRef.current) : 0;\n const dashOffset = circumference * (1 - clampedFraction);\n const urgentMs = Math.max(totalMsRef.current * urgentThreshold, urgentMinSeconds * 1000);\n const isUrgent = status === 'running' && remainingMs <= urgentMs;\n const isCritical = isUrgent && remainingMs <= Math.min(5000, urgentMs);\n const isPaused = status === 'paused';\n\n // The pause button doubles as a play/restart button whenever there's nothing to pause —\n // idle (autoStart={false}), completed, or cancelled — rather than hiding itself, so there's\n // always a way to (re)start the countdown from the built-in controls alone.\n const showAddButton = showControls && !hideAddButton;\n const showRemoveButton = showControls && !hideRemoveButton;\n const showPauseButton = showControls && !hidePauseButton;\n const pauseButtonIcon = status === 'running' ? faPause : faPlay;\n const pauseButtonTitle =\n status === 'running' ? 'Pause' : isPaused ? 'Resume' : status === 'idle' ? 'Start' : 'Restart';\n const handlePauseButtonClick = status === 'running' ? pause : isPaused ? resume : start;\n const showCancelButton = showControls && !hideCancelButton;\n\n return (\n <div\n {...rest}\n className={cx(\n styles.timer,\n pulseOnUrgent && isUrgent && styles.timerPulsing,\n isCritical && styles.timerCritical,\n className,\n classNames?.root,\n )}\n style={\n {\n ...(size ? { '--timer-size': size } : null),\n '--timer-stroke-width': `${strokeWidth}px`,\n ...style,\n ...slotStyles?.root,\n } as React.CSSProperties\n }\n >\n <div className={cx(styles.timerRingWrapper, classNames?.ringWrapper)} style={slotStyles?.ringWrapper}>\n {ripples.length > 0 && (\n <div className={cx(styles.timerRipples, classNames?.ripples)} style={slotStyles?.ripples}>\n {ripples.map((id) => (\n <span\n key={id}\n className={cx(styles.timerRipple, classNames?.ripple)}\n style={slotStyles?.ripple}\n onAnimationEnd={() => handleRippleAnimationEnd(id)}\n />\n ))}\n </div>\n )}\n <svg className={cx(styles.timerRingSvg, classNames?.ringSvg)} viewBox='0 0 100 100' style={slotStyles?.ringSvg}>\n <circle\n className={cx(styles.timerRingTrack, classNames?.ringTrack)}\n cx='50'\n cy='50'\n r={radius}\n style={slotStyles?.ringTrack}\n />\n <circle\n className={cx(\n styles.timerRingProgress,\n isUrgent && styles.timerRingProgressUrgent,\n classNames?.ringProgress,\n )}\n cx='50'\n cy='50'\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n style={{\n transition: isPaused ? 'none' : undefined,\n transform: counterClockwise ? 'rotate(-90deg)' : undefined,\n ...slotStyles?.ringProgress,\n }}\n />\n </svg>\n <div className={cx(styles.timerDisplay, classNames?.display)} style={slotStyles?.display}>\n <span className={cx(styles.timerTime, classNames?.time)} style={slotStyles?.time}>\n {formatTime(remainingMs)}\n </span>\n {label && (\n <span className={cx(styles.timerLabel, classNames?.label)} style={slotStyles?.label}>\n {label}\n </span>\n )}\n </div>\n </div>\n\n {showControls && (\n <div className={cx(styles.timerControls, classNames?.controls)} style={slotStyles?.controls}>\n <div className={styles.timerControlsRow}>\n {showRemoveButton && (\n <ActionIcon\n icon={faMinus}\n title={`Remove ${adjustSeconds}s`}\n onClick={() => removeTime(adjustSeconds)}\n className={cx(styles.timerAdjustButton, classNames?.removeButton)}\n style={slotStyles?.removeButton}\n />\n )}\n {showPauseButton && (\n <Button\n size={ButtonSize.Small}\n icon={pauseButtonIcon}\n title={pauseButtonTitle}\n onClick={handlePauseButtonClick}\n className={classNames?.pauseButton}\n style={slotStyles?.pauseButton}\n />\n )}\n {showAddButton && (\n <ActionIcon\n icon={faPlus}\n title={`Add ${adjustSeconds}s`}\n onClick={() => addTime(adjustSeconds)}\n className={cx(styles.timerAdjustButton, classNames?.addButton)}\n style={slotStyles?.addButton}\n />\n )}\n </div>\n {showCancelButton && (\n <ActionIcon\n icon={faXmark}\n title={text.cancel}\n onClick={cancel}\n className={cx(styles.timerCancelButton, classNames?.cancelButton)}\n style={slotStyles?.cancelButton}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default Timer;\n"],"mappings":"koBAYA,IAAM,GAAU,IACV,GAA2B,IAE3B,GAAwC,CAC5C,OAAQ,cACV,EAEA,SAAS,IAAgC,CACvC,OAAO,OAAO,OAAW,KAAe,OAAO,aAAa,kCAAkC,CAAC,CAAC,UAAY,EAC9G,CAEA,SAAS,GAAkB,EAAqB,CAC9C,IAAM,EAAe,KAAK,KAAK,EAAc,GAAI,EAC3C,EAAQ,KAAK,MAAM,EAAe,IAAI,EACtC,EAAU,KAAK,MAAO,EAAe,KAAQ,EAAE,EAC/C,EAAU,EAAe,GACzB,EAAK,OAAO,CAAO,CAAC,CAAC,SAAS,EAAG,GAAG,EACpC,EAAK,OAAO,CAAO,CAAC,CAAC,SAAS,EAAG,GAAG,EAC1C,OAAO,EAAQ,EAAI,GAAG,EAAM,GAAG,EAAG,GAAG,IAAO,GAAG,EAAG,GAAG,GACvD,CAEA,SAAS,EAAM,EAAmB,CAChC,GAAM,CACJ,OACA,kBACA,YAAY,GACZ,yBAAwB,GAExB,SACA,cACA,WACA,WACA,YACA,YACA,YACA,gBAEA,eAAe,GACf,iBAAgB,GAChB,oBAAmB,GACnB,mBAAkB,GAClB,oBAAmB,GACnB,gBAAgB,GAChB,aAEA,QACA,cAAa,GACb,OACA,cAAc,GACd,oBAAmB,GAEnB,mBAAkB,GAClB,oBAAmB,EACnB,iBAAgB,GAChB,qBAAqB,GAErB,sBAAsB,GACtB,WACA,eAAc,GACd,mBAAmB,GACnB,qBACA,oBAEA,aACA,SACA,aACA,OAAQ,EACR,UACA,GAAG,IACD,EAAqB,QAAS,CAAK,EACjC,GAAO,EAAU,QAAS,GAAQ,EAAc,EAEhD,EAAY,EAAkB,IAC9B,CAAC,EAAQ,IAAkB,EAAsB,EAAY,UAAY,MAAM,EAC/E,CAAC,EAAa,IAAuB,EAAS,CAAS,EACvD,CAAC,GAAO,IAAY,EAAS,CAAC,EAC9B,CAAC,EAAS,GAAc,EAAmB,CAAC,CAAC,EAE7C,EAAe,EAAO,CAAW,EACjC,EAAY,EAAO,CAAM,EACzB,EAAa,EAAO,CAAS,EAC7B,EAAoB,EAAO,EAAK,EAChC,EAA+B,EAAO,EAAK,EAC3C,EAAa,EAAO,EAAK,EACzB,GAAc,EAAO,CAAC,EAE5B,SAAS,EAAa,EAAc,CAClC,EAAa,QAAU,EACvB,GAAoB,CAAI,CAC1B,CAEA,SAAS,EAAU,EAAmB,CACpC,EAAU,QAAU,EACpB,GAAe,CAAI,CACrB,CAEA,SAAS,GAAY,CACnB,GAAU,GAAM,EAAI,CAAC,CACvB,CAQA,MAAgB,CACd,GAAI,IAAW,UAAW,OAC1B,IAAM,EAAQ,KAAK,IAAI,EACjB,EAAiB,EAAa,QAC9B,EAAK,gBAAkB,CAC3B,IAAM,EAAO,KAAK,IAAI,EAAG,GAAkB,KAAK,IAAI,EAAI,EAAM,EAC9D,EAAa,CAAI,EACjB,IAAS,CAAI,EACT,GAAQ,GAAG,EAAU,WAAW,CACtC,EAAG,EAAO,EACV,UAAa,cAAc,CAAE,CAE/B,EAAG,CAAC,EAAQ,EAAK,CAAC,EAGlB,MAAgB,CACd,GAAI,IAAW,aAAe,CAAC,EAAkB,QAAS,CAGxD,GAFA,EAAkB,QAAU,GAC5B,KAAa,EACT,EACF,GAAI,CACF,IAAM,EAAQ,IAAI,MAAM,GAAA,goUAAkC,EAC1D,EAAM,OAAS,GAGf,EAAM,KAAK,CAAC,EAAE,UAAY,CAAC,CAAC,CAC9B,MAAQ,CAER,CAEF,GAAI,GAAoB,OAAO,aAAiB,KAAe,aAAa,aAAe,UACzF,GAAI,CACF,IAAI,aAAa,IAAqB,aAAc,CAClD,KAAM,KAAqB,OAAO,GAAU,SAAW,EAAQ,IAAA,GACjE,CAAC,CACH,MAAQ,CAGR,CAEJ,CACI,IAAW,cAAa,EAAkB,QAAU,GAE1D,EAAG,CAAC,CAAM,CAAC,EAIX,MAAgB,CACd,GAAI,CAAC,EAAW,QAAS,CACvB,EAAW,QAAU,GACrB,MACF,CACA,IAAM,EAAS,EAAkB,IACjC,EAAW,QAAU,EACrB,EAAa,CAAM,EACnB,EAAkB,QAAU,GAC5B,EAAU,EACN,IACF,EAAU,EAAY,UAAY,MAAM,CAG5C,EAAG,CAAC,CAAe,CAAC,EAOpB,MAAgB,CACd,GAAI,CAAC,GAAsB,IAAW,WAAa,GAAqB,EAAG,OAC3E,SAAS,GAAc,CAErB,IAAM,EAAW,EAAE,GAAY,QAC/B,EAAY,GAAS,CAAC,GAAG,EAAM,CAAQ,CAAC,CAC1C,CACA,EAAY,EACZ,IAAM,EAAK,YAAY,EAAa,EAAwB,EAC5D,UAAa,cAAc,CAAE,CAC/B,EAAG,CAAC,EAAoB,CAAM,CAAC,EAE/B,SAAS,GAAyB,EAAY,CAC5C,EAAY,GAAS,EAAK,OAAQ,GAAe,IAAe,CAAE,CAAC,CACrE,CAEA,SAAS,IAAwC,CAC1C,GAAoB,GAA6B,SAClD,OAAO,aAAiB,KAAe,aAAa,aAAe,YACvE,EAA6B,QAAU,GACvC,aAAa,kBAAkB,CAAC,CAAC,UAAY,CAAC,CAAC,EACjD,CAEA,SAAS,GAAQ,CACf,GAAsC,GAClC,EAAU,UAAY,aAAe,EAAU,UAAY,eAC7D,EAAa,EAAW,OAAO,EAC/B,EAAkB,QAAU,IAE9B,EAAU,EACV,EAAU,SAAS,EACnB,KAAU,CACZ,CAEA,SAAS,GAAQ,CACX,EAAU,UAAY,YAC1B,EAAU,QAAQ,EAClB,KAAU,EACZ,CAEA,SAAS,GAAS,CACZ,EAAU,UAAY,WAC1B,EAAU,EACV,EAAU,SAAS,EACnB,KAAW,EACb,CAEA,SAAS,EAAQ,EAAiB,CAChC,IAAM,EAAS,GAAc,KAA2B,IAApB,EAAa,IAC3C,EAAO,KAAK,IAAI,EAAa,QAAU,EAAU,IAAM,CAAM,EACnE,EAAa,CAAI,EACjB,EAAU,EACV,IAAY,EAAS,KAAK,MAAM,EAAO,GAAI,CAAC,EACxC,EAAU,UAAY,aAAe,EAAO,IAC9C,EAAkB,QAAU,GAC5B,EAAU,SAAS,EAEvB,CAEA,SAAS,EAAW,EAAiB,CACnC,IAAM,EAAO,KAAK,IAAI,EAAG,EAAa,QAAU,EAAU,GAAI,EAC9D,EAAa,CAAI,EACjB,EAAU,EACV,KAAe,EAAS,KAAK,MAAM,EAAO,GAAI,CAAC,EAC3C,GAAQ,GAAK,EAAU,UAAY,WAAW,EAAU,WAAW,CACzE,CAEA,SAAS,GAAS,CAChB,EAAa,EAAW,OAAO,EAC/B,EAAU,WAAW,EACrB,KAAW,CACb,CAEA,SAAS,IAAQ,CACf,EAAa,EAAW,OAAO,EAC/B,EAAkB,QAAU,GAC5B,EAAU,MAAM,CAClB,CAEA,GAAoB,QAAY,CAC9B,QACA,QACA,SACA,UACA,aACA,SACA,SACA,cAAiB,EAAU,QAC3B,mBAAsB,EAAa,OACrC,EAAE,EAEF,IAAM,EAAS,GAAK,EAAc,EAC5B,EAAgB,OAAc,EAAI,KAAK,GAAK,EAAQ,CAAC,CAAM,CAAC,EAE5D,GAAa,GAAiB,GADZ,EAAW,QAAU,EAAI,KAAK,IAAI,EAAG,EAAc,EAAW,OAAO,EAAI,IAE3F,EAAW,KAAK,IAAI,EAAW,QAAU,GAAiB,GAAmB,GAAI,EACjF,EAAW,IAAW,WAAa,GAAe,EAClD,GAAa,GAAY,GAAe,KAAK,IAAI,IAAM,CAAQ,EAC/D,EAAW,IAAW,SAKtB,GAAgB,GAAgB,CAAC,GACjC,GAAmB,GAAgB,CAAC,GACpC,GAAkB,GAAgB,CAAC,GACnC,GAAkB,IAAW,UAAY,GAAU,GACnD,GACJ,IAAW,UAAY,QAAU,EAAW,SAAW,IAAW,OAAS,QAAU,UACjF,GAAyB,IAAW,UAAY,EAAQ,EAAW,EAAS,EAC5E,GAAmB,GAAgB,CAAC,GAE1C,OACE,EAAC,MAAD,CACE,GAAI,GACJ,UAAW,EACT,EAAO,MACP,IAAiB,GAAY,EAAO,aACpC,IAAc,EAAO,cACrB,GACA,GAAY,IACd,EACA,MACE,CACE,GAAI,EAAO,CAAE,eAAgB,CAAK,EAAI,KACtC,uBAAwB,GAAG,EAAY,IACvC,GAAG,GACH,GAAG,GAAY,IACjB,EAfJ,SAAA,CAkBE,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,iBAAkB,GAAY,WAAW,EAAG,MAAO,GAAY,YAAzF,SAAA,CACG,EAAQ,OAAS,GAChB,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,aAAc,GAAY,OAAO,EAAG,MAAO,GAAY,QAC9E,SAAA,EAAQ,IAAK,GACZ,EAAC,OAAD,CAEE,UAAW,EAAG,EAAO,YAAa,GAAY,MAAM,EACpD,MAAO,GAAY,OACnB,mBAAsB,GAAyB,CAAE,CAClD,EAJM,CAIN,CACF,CACE,CAAA,EAEP,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,aAAc,GAAY,OAAO,EAAG,QAAQ,cAAc,MAAO,GAAY,QAAvG,SAAA,CACE,EAAC,SAAD,CACE,UAAW,EAAG,EAAO,eAAgB,GAAY,SAAS,EAC1D,GAAG,KACH,GAAG,KACH,EAAG,EACH,MAAO,GAAY,SACpB,CAAA,EACD,EAAC,SAAD,CACE,UAAW,EACT,EAAO,kBACP,GAAY,EAAO,wBACnB,GAAY,YACd,EACA,GAAG,KACH,GAAG,KACH,EAAG,EACH,gBAAiB,EACjB,iBAAkB,GAClB,MAAO,CACL,WAAY,EAAW,OAAS,IAAA,GAChC,UAAW,GAAmB,iBAAmB,IAAA,GACjD,GAAG,GAAY,YACjB,CACD,CAAA,CACE,IACL,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,aAAc,GAAY,OAAO,EAAG,MAAO,GAAY,QAAjF,SAAA,CACE,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,UAAW,GAAY,IAAI,EAAG,MAAO,GAAY,KACzE,SAAA,GAAW,CAAW,CACnB,CAAA,EACL,GACC,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,WAAY,GAAY,KAAK,EAAG,MAAO,GAAY,MAC3E,SAAA,CACG,CAAA,CAEL,GACF,CAEJ,CAAA,EAAA,GACC,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,cAAe,GAAY,QAAQ,EAAG,MAAO,GAAY,SAAnF,SAAA,CACE,EAAC,MAAD,CAAK,UAAW,EAAO,iBAAvB,SAAA,CACG,IACC,EAAC,EAAD,CACE,KAAM,GACN,MAAO,UAAU,EAAc,GAC/B,YAAe,EAAW,CAAa,EACvC,UAAW,EAAG,EAAO,kBAAmB,GAAY,YAAY,EAChE,MAAO,GAAY,YACpB,CAAA,EAEF,IACC,EAAC,EAAD,CACE,KAAM,EAAW,MACjB,KAAM,GACN,MAAO,GACP,QAAS,GACT,UAAW,GAAY,YACvB,MAAO,GAAY,WACpB,CAAA,EAEF,IACC,EAAC,EAAD,CACE,KAAM,GACN,MAAO,OAAO,EAAc,GAC5B,YAAe,EAAQ,CAAa,EACpC,UAAW,EAAG,EAAO,kBAAmB,GAAY,SAAS,EAC7D,MAAO,GAAY,SACpB,CAAA,CAEA,CACJ,CAAA,EAAA,IACC,EAAC,EAAD,CACE,KAAM,GACN,MAAO,GAAK,OACZ,QAAS,EACT,UAAW,EAAG,EAAO,kBAAmB,GAAY,YAAY,EAChE,MAAO,GAAY,YACpB,CAAA,CAEA,CAEJ,CAAA,CAAA,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";var e=/^(\d{4})-(\d{2})-(\d{2})$/;function t({year:e,month:t}){let n=new Date(0);return n.setUTCFullYear(e,t,0),n.getUTCDate()}function n(n){if(typeof n!=`string`)return null;let r=e.exec(n);if(!r)return null;let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return a<1||a>12||o<1||o>t({year:i,month:a})?null:{year:i,month:a,day:o}}function r(e){return n(e)?e:null}function i({year:e,month:t,day:n}){return`${String(e).padStart(4,`0`)}-${String(t).padStart(2,`0`)}-${String(n).padStart(2,`0`)}`}function a(e){return Number.isNaN(e.getTime())?``:i({year:e.getFullYear(),month:e.getMonth()+1,day:e.getDate()})}function o(e){let t=n(e);if(!t)return new Date(NaN);let r=new Date(2e3,0,1);return r.setFullYear(t.year,t.month-1,t.day),r}export{r as asDay,a as dateToDay,o as dayToDate,t as daysInMonth,i as formatDay,n as parseDay};
|
|
2
|
+
//# sourceMappingURL=day.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"day.mjs","names":[],"sources":["../../../../package/common/utils/day.ts"],"sourcesContent":["// A day is a `'YYYY-MM-DD'` string, the value of `<input type=\"date\">`: no time and no time zone,\n// so it is the same day for everyone. A `Date` is a moment and cannot be one.\n//\n// Dates are built with `setFullYear` rather than the `Date` constructor or `Date.UTC`, which read\n// the years 0 to 99 as 1900 to 1999.\n\nexport interface DayParts {\n year: number;\n /** 1 to 12. */\n month: number;\n day: number;\n}\n\nconst DAY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function daysInMonth({ year, month }: Pick<DayParts, 'year' | 'month'>): number {\n const date = new Date(0);\n date.setUTCFullYear(year, month, 0);\n return date.getUTCDate();\n}\n\n/** The parts of a `'YYYY-MM-DD'` string, or `null` for anything else, 31 February included. */\nexport function parseDay(value: unknown): DayParts | null {\n if (typeof value !== 'string') return null;\n const match = DAY.exec(value);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth({ year, month })) return null;\n return { year, month, day };\n}\n\n/** `value` itself when it is a `'YYYY-MM-DD'` day that exists, otherwise `null`. */\nexport function asDay(value: unknown): string | null {\n return parseDay(value) ? (value as string) : null;\n}\n\nexport function formatDay({ year, month, day }: DayParts): string {\n return `${String(year).padStart(4, '0')}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n}\n\n/** The day `date` falls on in the browser's time zone, as `'YYYY-MM-DD'`; `''` for an Invalid Date. */\nexport function dateToDay(date: Date): string {\n if (Number.isNaN(date.getTime())) return '';\n return formatDay({ year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate() });\n}\n\n/** The first moment of a `'YYYY-MM-DD'` day in the browser's time zone. An Invalid Date for anything else. */\nexport function dayToDate(day: string): Date {\n const parts = parseDay(day);\n if (!parts) return new Date(NaN);\n const date = new Date(2000, 0, 1);\n date.setFullYear(parts.year, parts.month - 1, parts.day);\n return date;\n}\n"],"mappings":"aAaA,IAAM,EAAM,4BAEZ,SAAgB,EAAY,CAAE,OAAM,SAAmD,CACrF,IAAM,EAAO,IAAI,KAAK,CAAC,EAEvB,OADA,EAAK,eAAe,EAAM,EAAO,CAAC,EAC3B,EAAK,WAAW,CACzB,CAGA,SAAgB,EAAS,EAAiC,CACxD,GAAI,OAAO,GAAU,SAAU,OAAO,KACtC,IAAM,EAAQ,EAAI,KAAK,CAAK,EAC5B,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAO,OAAO,EAAM,EAAE,EACtB,EAAQ,OAAO,EAAM,EAAE,EACvB,EAAM,OAAO,EAAM,EAAE,EAE3B,OADI,EAAQ,GAAK,EAAQ,IAAM,EAAM,GAAK,EAAM,EAAY,CAAE,OAAM,OAAM,CAAC,EAAU,KAC9E,CAAE,OAAM,QAAO,KAAI,CAC5B,CAGA,SAAgB,EAAM,EAA+B,CACnD,OAAO,EAAS,CAAK,EAAK,EAAmB,IAC/C,CAEA,SAAgB,EAAU,CAAE,OAAM,QAAO,OAAyB,CAChE,MAAO,GAAG,OAAO,CAAI,CAAC,CAAC,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAK,CAAC,CAAC,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAG,CAAC,CAAC,SAAS,EAAG,GAAG,GAC1G,CAGA,SAAgB,EAAU,EAAoB,CAE5C,OADI,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAU,GAClC,EAAU,CAAE,KAAM,EAAK,YAAY,EAAG,MAAO,EAAK,SAAS,EAAI,EAAG,IAAK,EAAK,QAAQ,CAAE,CAAC,CAChG,CAGA,SAAgB,EAAU,EAAmB,CAC3C,IAAM,EAAQ,EAAS,CAAG,EAC1B,GAAI,CAAC,EAAO,OAAO,IAAI,KAAK,GAAG,EAC/B,IAAM,EAAO,IAAI,KAAK,IAAM,EAAG,CAAC,EAEhC,OADA,EAAK,YAAY,EAAM,KAAM,EAAM,MAAQ,EAAG,EAAM,GAAG,EAChD,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import e from"./weatherIcon.module.mjs";import t from"classnames";import{jsx as n,jsxs as r}from"react/jsx-runtime";var i=`M 26.3 62.9 C 15.4 65.0 15.0 48.5 27.8 49.8 C 23.9 43.9 34.2 34.0 43.0 39.6 C 46.0 26.2 73.9 32.0 68.9 46.3 C 85.0 44.3 84.6 64.2 72.4 62.5 Z`;function a(e,t,n,r){return{animationDuration:`${t}s`,animationDelay:`${e?n:-r*t}s`}}function o({className:r,delayed:a=!1}){return n(`path`,{className:t(e.weatherIconCloud,a&&e.weatherIconCloudDelayed,r),d:i})}var s=12;function c({className:t}){return r(`g`,{className:t,children:[n(`g`,{className:e.weatherIconSunRays,children:Array.from({length:s},(t,r)=>n(`g`,{transform:`rotate(${r/s*360} 50 50)`,children:n(`line`,{className:e.weatherIconSunRay,x1:50,y1:23,x2:50,y2:r%2==0?16:11})},r))}),n(`circle`,{className:e.weatherIconSunCore,cx:50,cy:50,r:18})]})}var l=[{x:74,y:32,size:2.2,duration:2.4,delay:0},{x:28,y:30,size:2.6,duration:3.1,delay:.4},{x:80,y:60,size:1.8,duration:2.7,delay:.9},{x:22,y:66,size:2.4,duration:3.6,delay:.2},{x:58,y:82,size:2,duration:2.9,delay:1.3},{x:34,y:80,size:2.5,duration:3.3,delay:.6}];function u({className:t}){return r(`g`,{className:t,children:[l.map(t=>n(`g`,{transform:`translate(${t.x}, ${t.y})`,children:n(`g`,{className:e.weatherIconStar,style:{animationDuration:`${t.duration}s`,animationDelay:`${t.delay}s`},children:n(`path`,{d:`M 0 ${-t.size} L 0 ${t.size} M ${-t.size} 0 L ${t.size} 0`})})},`${t.x}-${t.y}`)),n(`circle`,{className:e.weatherIconMoonCore,cx:50,cy:50,r:18})]})}var d=function(e){return e.Light=`light`,e.Medium=`medium`,e.Heavy=`heavy`,e}({}),f={light:{lanes:4,duration:1.5},medium:{lanes:6,duration:.95},heavy:{lanes:10,duration:.55}},p=[.85,1.1,.95,1.2,.9,1.05,1.15,.8,1,1.08],m=[.05,.62,.31,.85,.18,.5,.74,.1,.43,.95],h=2,g=.65;function _(e,t=m,n=.8){return .1+n*t[e%t.length]}function v({animated:t,intensity:i=`medium`}){let{lanes:o,duration:s}=f[i];return n(`g`,{className:e.weatherIconRain,children:Array.from({length:o},(i,c)=>{let l=26+50*c/(o-1),u=s*p[c],d=u*m[c];return Array.from({length:h},(i,o)=>{let s=a(t,u,d+o*u/h,_(c*h+o,m,g));return r(`g`,{children:[n(`line`,{className:e.weatherIconDrop,style:s,x1:l,y1:68,x2:l-2.4,y2:92}),n(`ellipse`,{className:e.weatherIconSplash,style:s,cx:l-2.4,cy:92,rx:`1.4`,ry:`0.7`})]},`${c}-${o}`)})})})}var y=[.65,1.5,.85,1.25,1.65,.75,1.1],b=[.15,.7,.35,.9,.05,.55,.8],x=7;function S({animated:t}){return n(`g`,{className:e.weatherIconSnow,children:Array.from({length:x},(r,i)=>{let o=24+54*i/6,s=7*y[i],c=s*b[i];return Array.from({length:h},(r,l)=>n(`g`,{transform:`translate(${o}, 68)`,children:n(`g`,{className:e.weatherIconFlake,style:a(t,s,c+l*s*.7,_(i*h+l,b)),children:n(`path`,{d:`M 0 -2 L 0 2 M -1.7 -1 L 1.7 1 M -1.7 1 L 1.7 -1`})})},`${i}-${l}`))})})}var C=[{x:34,y:66,dx:-1,dy:18,duration:.6,delay:.05},{x:47,y:68,dx:-2,dy:17,duration:.7,delay:.3},{x:58,y:65,dx:1,dy:18,duration:.55,delay:.15},{x:40,y:70,dx:-1,dy:16,duration:.75,delay:.45},{x:65,y:67,dx:-2,dy:17,duration:.65,delay:0},{x:52,y:71,dx:1,dy:16,duration:.7,delay:.35}];function w({animated:t}){let i=C.length*h;return n(`g`,{className:e.weatherIconHail,children:C.flatMap((o,s)=>Array.from({length:h},(c,l)=>{let u=s*h+l,d=a(t,o.duration,o.delay+l*o.duration/h,.1+.8*(u+.5)/i);return r(`g`,{children:[n(`g`,{transform:`translate(${o.x}, ${o.y})`,children:n(`g`,{className:e.weatherIconStone,style:{...d,"--weather-icon-dx":o.dx,"--weather-icon-dy":o.dy},children:n(`circle`,{r:`2`})})}),n(`ellipse`,{className:e.weatherIconImpact,style:d,cx:o.x+o.dx,cy:o.y+o.dy,rx:`1.8`,ry:`0.9`})]},u)}))})}function T(){return r(`g`,{className:e.weatherIconFog,children:[n(`line`,{x1:`32`,y1:`40`,x2:`68`,y2:`40`}),n(`line`,{x1:`20`,y1:`52`,x2:`80`,y2:`52`}),n(`line`,{x1:`26`,y1:`64`,x2:`74`,y2:`64`}),n(`line`,{x1:`34`,y1:`76`,x2:`66`,y2:`76`})]})}function E(){return n(`path`,{className:e.weatherIconBolt,d:`M 54 52 L 44 72 H 52 L 46 90 L 62 66 H 54 L 60 52 Z`})}export{i as CLOUD_PATH,o as Cloud,T as Fog,w as Hail,E as Lightning,u as Moon,v as Rain,d as RainIntensity,S as Snow,c as Sun};
|
|
2
|
+
//# sourceMappingURL=parts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.mjs","names":[],"sources":["../../../../package/common/weatherIcon/parts.tsx"],"sourcesContent":["import type { CSSProperties, ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport type { WeatherPartProps } from './weatherIcon.types';\nimport styles from './weatherIcon.module.pcss';\n\n/** Exported so a scene can clip what sits behind the cloud to this same silhouette. */\nexport const CLOUD_PATH =\n 'M 26.3 62.9 C 15.4 65.0 15.0 48.5 27.8 49.8 C 23.9 43.9 34.2 34.0 43.0 39.6 C 46.0 26.2 73.9 32.0 68.9 46.3 C 85.0 44.3 84.6 64.2 72.4 62.5 Z';\n\n/**\n * A still frame of a falling part must not be its first one, which bunches every drop right under\n * the cloud. A negative delay on a paused animation freezes it that far into its cycle. The\n * fractions come from a jitter table rather than a ramp: lanes run left to right, so a ramp would\n * freeze them along one diagonal line.\n */\nfunction fallStyle(animated: boolean, duration: number, delay: number, freezeFraction: number): CSSProperties {\n return {\n animationDuration: `${duration}s`,\n animationDelay: `${animated ? delay : -freezeFraction * duration}s`,\n };\n}\n\nexport function Cloud({ className, delayed = false }: { className?: string; delayed?: boolean }): ReactElement {\n return (\n <path\n className={cx(styles.weatherIconCloud, delayed && styles.weatherIconCloudDelayed, className)}\n d={CLOUD_PATH}\n />\n );\n}\n\nconst RAY_COUNT = 12;\n\nexport function Sun({ className }: { className?: string }): ReactElement {\n return (\n <g className={className}>\n <g className={styles.weatherIconSunRays}>\n {Array.from({ length: RAY_COUNT }, (_, index) => (\n <g key={index} transform={`rotate(${(index / RAY_COUNT) * 360} 50 50)`}>\n {/* Every second ray reaches further. */}\n <line className={styles.weatherIconSunRay} x1={50} y1={23} x2={50} y2={index % 2 === 0 ? 16 : 11} />\n </g>\n ))}\n </g>\n <circle className={styles.weatherIconSunCore} cx={50} cy={50} r={18} />\n </g>\n );\n}\n\n// Scattered at uneven distances as well as angles: at one distance they read as a ring.\nconst STARS = [\n { x: 74, y: 32, size: 2.2, duration: 2.4, delay: 0 },\n { x: 28, y: 30, size: 2.6, duration: 3.1, delay: 0.4 },\n { x: 80, y: 60, size: 1.8, duration: 2.7, delay: 0.9 },\n { x: 22, y: 66, size: 2.4, duration: 3.6, delay: 0.2 },\n { x: 58, y: 82, size: 2, duration: 2.9, delay: 1.3 },\n { x: 34, y: 80, size: 2.5, duration: 3.3, delay: 0.6 },\n];\n\nexport function Moon({ className }: { className?: string }): ReactElement {\n return (\n <g className={className}>\n {STARS.map((star) => (\n // The position sits on its own group: an animated `transform` would replace a static one.\n <g key={`${star.x}-${star.y}`} transform={`translate(${star.x}, ${star.y})`}>\n <g\n className={styles.weatherIconStar}\n style={{ animationDuration: `${star.duration}s`, animationDelay: `${star.delay}s` }}\n >\n <path d={`M 0 ${-star.size} L 0 ${star.size} M ${-star.size} 0 L ${star.size} 0`} />\n </g>\n </g>\n ))}\n <circle className={styles.weatherIconMoonCore} cx={50} cy={50} r={18} />\n </g>\n );\n}\n\nexport enum RainIntensity {\n Light = 'light',\n Medium = 'medium',\n Heavy = 'heavy',\n}\n\n// Density and speed rise together: speed alone reads as light rain on fast-forward.\nconst RAIN = {\n [RainIntensity.Light]: { lanes: 4, duration: 1.5 },\n [RainIntensity.Medium]: { lanes: 6, duration: 0.95 },\n [RainIntensity.Heavy]: { lanes: 10, duration: 0.55 },\n};\n\nconst DURATION_JITTER = [0.85, 1.1, 0.95, 1.2, 0.9, 1.05, 1.15, 0.8, 1, 1.08];\nconst DELAY_JITTER = [0.05, 0.62, 0.31, 0.85, 0.18, 0.5, 0.74, 0.1, 0.43, 0.95];\nconst PER_LANE = 2;\n// A drop fades out from 80% of its fall, so a still frame keeps every drop short of that.\nconst RAIN_FREEZE_SPAN = 0.65;\n\nfunction freezeAt(index: number, jitter: number[] = DELAY_JITTER, span = 0.8): number {\n return 0.1 + span * jitter[index % jitter.length];\n}\n\nexport function Rain({\n animated,\n intensity = RainIntensity.Medium,\n}: WeatherPartProps & { intensity?: RainIntensity }): ReactElement {\n const { lanes, duration: base } = RAIN[intensity];\n return (\n <g className={styles.weatherIconRain}>\n {Array.from({ length: lanes }, (_, lane) => {\n const x1 = 26 + (50 * lane) / (lanes - 1);\n const duration = base * DURATION_JITTER[lane];\n const delay = duration * DELAY_JITTER[lane];\n return Array.from({ length: PER_LANE }, (_, drop) => {\n const style = fallStyle(\n animated,\n duration,\n delay + (drop * duration) / PER_LANE,\n freezeAt(lane * PER_LANE + drop, DELAY_JITTER, RAIN_FREEZE_SPAN),\n );\n return (\n <g key={`${lane}-${drop}`}>\n <line className={styles.weatherIconDrop} style={style} x1={x1} y1={68} x2={x1 - 2.4} y2={92} />\n <ellipse className={styles.weatherIconSplash} style={style} cx={x1 - 2.4} cy={92} rx='1.4' ry='0.7' />\n </g>\n );\n });\n })}\n </g>\n );\n}\n\n// A wide spread of speeds: with similar ones, flakes drift out of step so slowly that they spend\n// long stretches falling in a line.\nconst FLAKE_DURATION_JITTER = [0.65, 1.5, 0.85, 1.25, 1.65, 0.75, 1.1];\nconst FLAKE_DELAY_JITTER = [0.15, 0.7, 0.35, 0.9, 0.05, 0.55, 0.8];\nconst FLAKE_LANES = 7;\n\nexport function Snow({ animated }: WeatherPartProps): ReactElement {\n return (\n <g className={styles.weatherIconSnow}>\n {Array.from({ length: FLAKE_LANES }, (_, lane) => {\n const x = 24 + (54 * lane) / (FLAKE_LANES - 1);\n const duration = 7 * FLAKE_DURATION_JITTER[lane];\n const delay = duration * FLAKE_DELAY_JITTER[lane];\n return Array.from({ length: PER_LANE }, (_, flake) => (\n <g key={`${lane}-${flake}`} transform={`translate(${x}, 68)`}>\n <g\n className={styles.weatherIconFlake}\n style={fallStyle(\n animated,\n duration,\n delay + flake * duration * 0.7,\n freezeAt(lane * PER_LANE + flake, FLAKE_DELAY_JITTER),\n )}\n >\n <path d='M 0 -2 L 0 2 M -1.7 -1 L 1.7 1 M -1.7 1 L 1.7 -1' />\n </g>\n </g>\n ));\n })}\n </g>\n );\n}\n\n// `dx`/`dy` is where the stone first lands. The keyframe bounces it on from there, so every lane\n// shares one keyframe instead of having its own.\nconst HAIL_LANES = [\n { x: 34, y: 66, dx: -1, dy: 18, duration: 0.6, delay: 0.05 },\n { x: 47, y: 68, dx: -2, dy: 17, duration: 0.7, delay: 0.3 },\n { x: 58, y: 65, dx: 1, dy: 18, duration: 0.55, delay: 0.15 },\n { x: 40, y: 70, dx: -1, dy: 16, duration: 0.75, delay: 0.45 },\n { x: 65, y: 67, dx: -2, dy: 17, duration: 0.65, delay: 0 },\n { x: 52, y: 71, dx: 1, dy: 16, duration: 0.7, delay: 0.35 },\n];\n\nexport function Hail({ animated }: WeatherPartProps): ReactElement {\n const total = HAIL_LANES.length * PER_LANE;\n return (\n <g className={styles.weatherIconHail}>\n {HAIL_LANES.flatMap((lane, laneIndex) =>\n Array.from({ length: PER_LANE }, (_, stone) => {\n const index = laneIndex * PER_LANE + stone;\n const style = fallStyle(\n animated,\n lane.duration,\n lane.delay + (stone * lane.duration) / PER_LANE,\n 0.1 + (0.8 * (index + 0.5)) / total,\n );\n return (\n <g key={index}>\n <g transform={`translate(${lane.x}, ${lane.y})`}>\n <g\n className={styles.weatherIconStone}\n style={{ ...style, '--weather-icon-dx': lane.dx, '--weather-icon-dy': lane.dy } as CSSProperties}\n >\n <circle r='2' />\n </g>\n </g>\n <ellipse\n className={styles.weatherIconImpact}\n style={style}\n cx={lane.x + lane.dx}\n cy={lane.y + lane.dy}\n rx='1.8'\n ry='0.9'\n />\n </g>\n );\n }),\n )}\n </g>\n );\n}\n\nexport function Fog(): ReactElement {\n return (\n <g className={styles.weatherIconFog}>\n <line x1='32' y1='40' x2='68' y2='40' />\n <line x1='20' y1='52' x2='80' y2='52' />\n <line x1='26' y1='64' x2='74' y2='64' />\n <line x1='34' y1='76' x2='66' y2='76' />\n </g>\n );\n}\n\nexport function Lightning(): ReactElement {\n return <path className={styles.weatherIconBolt} d='M 54 52 L 44 72 H 52 L 46 90 L 62 66 H 54 L 60 52 Z' />;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{useComponentDefaults as e}from"../configProvider/useComponentDefaults.mjs";import{useLabels as t}from"../configProvider/useLabels.mjs";import n from"../hooks/useMediaQuery.mjs";import{WeatherType as r}from"./weatherIcon.types.mjs";import i from"./weatherIcon.module.mjs";import{CLOUD_PATH as a,Cloud as o,Fog as s,Hail as c,Lightning as l,Moon as u,Rain as d,RainIntensity as f,Snow as p,Sun as m}from"./parts.mjs";import{useId as h}from"react";import g from"classnames";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";var b={[r.Sunny]:`Sunny`,[r.ClearNight]:`Clear night`,[r.Cloudy]:`Cloudy`,[r.PartlyCloudy]:`Partly cloudy`,[r.PartlyCloudyNight]:`Partly cloudy night`,[r.RainyLight]:`Light rain`,[r.Rainy]:`Rain`,[r.RainyHeavy]:`Heavy rain`,[r.Snowy]:`Snow`,[r.Hail]:`Hail`,[r.Foggy]:`Fog`,[r.Thunderstorm]:`Thunderstorm`};function x(x){let{type:S,size:C=64,animated:w=!0,labels:T,className:E,style:D,...O}=e(`WeatherIcon`,x),k=t(`WeatherIcon`,T,b),A=w&&!n(`(prefers-reduced-motion: reduce)`),j=`weather-icon-clip-${h().replace(/[^\w-]/g,``)}`,M=e=>v(`g`,{clipPath:`url(#${j})`,children:e});function N(){switch(S){case r.ClearNight:return v(u,{});case r.Cloudy:return y(_,{children:[M(v(`g`,{className:i.weatherIconCloudBehind,children:v(o,{delayed:!0})})),v(o,{})]});case r.PartlyCloudy:return y(_,{children:[M(v(m,{className:i.weatherIconBehind})),v(o,{})]});case r.PartlyCloudyNight:return y(_,{children:[M(v(u,{className:i.weatherIconBehind})),v(o,{})]});case r.RainyLight:case r.Rainy:case r.RainyHeavy:return y(_,{children:[v(o,{}),v(d,{animated:A,intensity:S===r.RainyLight?f.Light:S===r.RainyHeavy?f.Heavy:f.Medium})]});case r.Snowy:return y(_,{children:[v(o,{}),v(p,{animated:A})]});case r.Hail:return y(_,{children:[v(o,{}),v(c,{animated:A})]});case r.Foggy:return v(s,{});case r.Thunderstorm:return y(_,{children:[v(o,{}),M(v(l,{}))]});default:return v(m,{})}}return y(`svg`,{...O,role:`img`,"aria-label":k[S]??k[r.Sunny],className:g(i.weatherIcon,!A&&i.weatherIconStill,E),style:{width:C,height:C,...D},viewBox:`0 0 100 100`,children:[v(`defs`,{children:v(`clipPath`,{id:j,clipRule:`evenodd`,children:v(`path`,{d:`M -20 -20 H 120 V 120 H -20 Z ${a}`})})}),N()]})}export{x as default};
|
|
2
|
+
//# sourceMappingURL=weatherIcon.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weatherIcon.mjs","names":[],"sources":["../../../../package/common/weatherIcon/weatherIcon.tsx"],"sourcesContent":["import { useId, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport { useComponentDefaults, useLabels } from '../configProvider';\nimport { useMediaQuery } from '../hooks/useMediaQuery';\nimport { WeatherType, type WeatherIconLabels, type WeatherIconProps } from './weatherIcon.types';\nimport { CLOUD_PATH, Cloud, Fog, Hail, Lightning, Moon, Rain, RainIntensity, Snow, Sun } from './parts';\nimport styles from './weatherIcon.module.pcss';\n\nconst DEFAULT_LABELS: Required<WeatherIconLabels> = {\n [WeatherType.Sunny]: 'Sunny',\n [WeatherType.ClearNight]: 'Clear night',\n [WeatherType.Cloudy]: 'Cloudy',\n [WeatherType.PartlyCloudy]: 'Partly cloudy',\n [WeatherType.PartlyCloudyNight]: 'Partly cloudy night',\n [WeatherType.RainyLight]: 'Light rain',\n [WeatherType.Rainy]: 'Rain',\n [WeatherType.RainyHeavy]: 'Heavy rain',\n [WeatherType.Snowy]: 'Snow',\n [WeatherType.Hail]: 'Hail',\n [WeatherType.Foggy]: 'Fog',\n [WeatherType.Thunderstorm]: 'Thunderstorm',\n};\n\nfunction WeatherIcon(props: WeatherIconProps): ReactElement {\n const {\n type,\n size = 64,\n animated = true,\n labels,\n className,\n style,\n ...rest\n } = useComponentDefaults('WeatherIcon', props);\n const text = useLabels('WeatherIcon', labels, DEFAULT_LABELS);\n const isAnimated = animated && !useMediaQuery('(prefers-reduced-motion: reduce)');\n // useId's characters are not all safe inside `url(#…)`, and they changed between React 19 minors.\n const clipId = `weather-icon-clip-${useId().replace(/[^\\w-]/g, '')}`;\n\n // The cloud is only an outline, so what sits behind it would show through without this.\n const behindCloud = (content: ReactElement) => <g clipPath={`url(#${clipId})`}>{content}</g>;\n\n function scene(): ReactElement {\n switch (type) {\n case WeatherType.ClearNight:\n return <Moon />;\n case WeatherType.Cloudy:\n return (\n <>\n {/* The offset sits on a wrapper: the cloud's own `transform` is animated and would replace it. */}\n {behindCloud(\n <g className={styles.weatherIconCloudBehind}>\n <Cloud delayed />\n </g>,\n )}\n <Cloud />\n </>\n );\n case WeatherType.PartlyCloudy:\n return (\n <>\n {behindCloud(<Sun className={styles.weatherIconBehind} />)}\n <Cloud />\n </>\n );\n case WeatherType.PartlyCloudyNight:\n return (\n <>\n {behindCloud(<Moon className={styles.weatherIconBehind} />)}\n <Cloud />\n </>\n );\n case WeatherType.RainyLight:\n case WeatherType.Rainy:\n case WeatherType.RainyHeavy:\n return (\n <>\n <Cloud />\n <Rain\n animated={isAnimated}\n intensity={\n type === WeatherType.RainyLight\n ? RainIntensity.Light\n : type === WeatherType.RainyHeavy\n ? RainIntensity.Heavy\n : RainIntensity.Medium\n }\n />\n </>\n );\n case WeatherType.Snowy:\n return (\n <>\n <Cloud />\n <Snow animated={isAnimated} />\n </>\n );\n case WeatherType.Hail:\n return (\n <>\n <Cloud />\n <Hail animated={isAnimated} />\n </>\n );\n case WeatherType.Foggy:\n return <Fog />;\n case WeatherType.Thunderstorm:\n return (\n <>\n <Cloud />\n {behindCloud(<Lightning />)}\n </>\n );\n default:\n return <Sun />;\n }\n }\n\n return (\n <svg\n {...rest}\n role='img'\n aria-label={text[type] ?? text[WeatherType.Sunny]}\n className={cx(styles.weatherIcon, !isAnimated && styles.weatherIconStill, className)}\n style={{ width: size, height: size, ...style }}\n viewBox='0 0 100 100'\n >\n <defs>\n {/* One path, both contours: two separate paths in a clipPath union instead of cutting a hole. */}\n <clipPath id={clipId} clipRule='evenodd'>\n <path d={`M -20 -20 H 120 V 120 H -20 Z ${CLOUD_PATH}`} />\n </clipPath>\n </defs>\n {scene()}\n </svg>\n );\n}\n\nexport default WeatherIcon;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";var e=`weatherIcon_FrcJF`,t=`weatherIcon-behind_e2VOz`,n=`weatherIcon-cloudBehind_MZlmZ`,r=`weatherIcon-cloud_KW-i7`,i=`weatherIconCloudDrift_0thIg`,a=`weatherIcon-cloudDelayed_bI1iH`,o=`weatherIcon-sunRays_PBW93`,s=`weatherIconRotate_Hp9YK`,c=`weatherIcon-sunRay_ODCJR`,l=`weatherIconRayPulse_57eG4`,u=`weatherIcon-sunCore_Ucxlh`,d=`weatherIcon-moonCore_USwOg`,f=`weatherIconGlow_W2Qxf`,p=`weatherIcon-star_3CMD1`,m=`weatherIconTwinkle_8DkMV`,h=`weatherIcon-rain_A9qFe`,g=`weatherIcon-drop_SdkW9`,_=`weatherIconFall_NlqDE`,v=`weatherIcon-splash_DF4Wc`,y=`weatherIconRing_kr1SP`,b=`weatherIcon-snow_95z-c`,x=`weatherIcon-flake_LGzkw`,S=`weatherIconSnowFall_I2EGa`,C=`weatherIcon-stone_U0daF`,w=`weatherIconHailFall_U-AE4`,T=`weatherIcon-impact_kCHtC`,E=`weatherIcon-fog_GC8wj`,D=`weatherIconSway_-CD1q`,O=`weatherIcon-bolt_S9sie`,k=`weatherIconFlash_GIecz`,A=`weatherIcon-still_lr-Nl`,j={weatherIcon:e,"weatherIcon-behind":`weatherIcon-behind_e2VOz`,weatherIconBehind:t,"weatherIcon-cloudBehind":`weatherIcon-cloudBehind_MZlmZ`,weatherIconCloudBehind:n,"weatherIcon-cloud":`weatherIcon-cloud_KW-i7`,weatherIconCloud:r,weatherIconCloudDrift:i,"weatherIcon-cloudDelayed":`weatherIcon-cloudDelayed_bI1iH`,weatherIconCloudDelayed:a,"weatherIcon-sunRays":`weatherIcon-sunRays_PBW93`,weatherIconSunRays:o,weatherIconRotate:s,"weatherIcon-sunRay":`weatherIcon-sunRay_ODCJR`,weatherIconSunRay:c,weatherIconRayPulse:l,"weatherIcon-sunCore":`weatherIcon-sunCore_Ucxlh`,weatherIconSunCore:u,"weatherIcon-moonCore":`weatherIcon-moonCore_USwOg`,weatherIconMoonCore:d,weatherIconGlow:f,"weatherIcon-star":`weatherIcon-star_3CMD1`,weatherIconStar:p,weatherIconTwinkle:m,"weatherIcon-rain":`weatherIcon-rain_A9qFe`,weatherIconRain:h,"weatherIcon-drop":`weatherIcon-drop_SdkW9`,weatherIconDrop:g,weatherIconFall:_,"weatherIcon-splash":`weatherIcon-splash_DF4Wc`,weatherIconSplash:v,weatherIconRing:y,"weatherIcon-snow":`weatherIcon-snow_95z-c`,weatherIconSnow:b,"weatherIcon-flake":`weatherIcon-flake_LGzkw`,weatherIconFlake:x,weatherIconSnowFall:S,"weatherIcon-stone":`weatherIcon-stone_U0daF`,weatherIconStone:C,weatherIconHailFall:w,"weatherIcon-impact":`weatherIcon-impact_kCHtC`,weatherIconImpact:T,"weatherIcon-fog":`weatherIcon-fog_GC8wj`,weatherIconFog:E,weatherIconSway:D,"weatherIcon-bolt":`weatherIcon-bolt_S9sie`,weatherIconBolt:O,weatherIconFlash:k,"weatherIcon-still":`weatherIcon-still_lr-Nl`,weatherIconStill:A};export{j as default,e as weatherIcon,t as weatherIconBehind,O as weatherIconBolt,r as weatherIconCloud,n as weatherIconCloudBehind,a as weatherIconCloudDelayed,i as weatherIconCloudDrift,g as weatherIconDrop,_ as weatherIconFall,x as weatherIconFlake,k as weatherIconFlash,E as weatherIconFog,f as weatherIconGlow,w as weatherIconHailFall,T as weatherIconImpact,d as weatherIconMoonCore,h as weatherIconRain,l as weatherIconRayPulse,y as weatherIconRing,s as weatherIconRotate,b as weatherIconSnow,S as weatherIconSnowFall,v as weatherIconSplash,p as weatherIconStar,A as weatherIconStill,C as weatherIconStone,u as weatherIconSunCore,c as weatherIconSunRay,o as weatherIconSunRays,D as weatherIconSway,m as weatherIconTwinkle};
|
|
2
|
+
//# sourceMappingURL=weatherIcon.module.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weatherIcon.module.mjs","names":[],"sources":["../../../../package/common/weatherIcon/weatherIcon.module.pcss"],"sourcesContent":["/* Line art in `currentColor`, like every other icon: it takes the text colour it sits in. */\n.weatherIcon {\n display: inline-block;\n flex-shrink: 0;\n fill: none;\n stroke: currentcolor;\n stroke-linecap: round;\n stroke-linejoin: round;\n\n &-behind {\n transform-origin: 50px 50px;\n transform: translate(14px, -16px) scale(0.62);\n }\n\n &-cloudBehind {\n transform-origin: 50px 50px;\n transform: translate(16px, -14px) scale(0.8);\n opacity: 0.55;\n }\n\n /* Wandering and breathing share one keyframe: a running animation replaces the whole\n `transform`, so two of them on one element would clobber each other. */\n &-cloud {\n stroke-width: 3;\n transform-box: fill-box;\n transform-origin: center;\n animation: weatherIconCloudDrift 20s ease-in-out infinite;\n }\n\n /* Negative, so the second cloud starts partway through its cycle instead of easing in. */\n &-cloudDelayed {\n animation-delay: -9s;\n }\n\n &-sunRays {\n transform-box: fill-box;\n transform-origin: center;\n animation: weatherIconRotate 150s linear infinite;\n }\n\n /* Anchored at the ray's inner end (y1 in parts.tsx), so it grows outwards whichever way it points. */\n &-sunRay {\n stroke-width: 3;\n transform-origin: 50px 23px;\n animation: weatherIconRayPulse 5s ease-in-out infinite;\n }\n\n &-sunRays > g:nth-child(3n + 2) &-sunRay {\n animation-delay: 0.8s;\n }\n\n &-sunRays > g:nth-child(3n) &-sunRay {\n animation-delay: 1.6s;\n }\n\n &-sunCore,\n &-moonCore {\n stroke-width: 3;\n transform-box: fill-box;\n transform-origin: center;\n animation: weatherIconGlow 4s ease-in-out infinite;\n }\n\n &-star {\n stroke-width: 1.4;\n transform-box: fill-box;\n transform-origin: center;\n animation-name: weatherIconTwinkle;\n animation-timing-function: ease-in-out;\n animation-iteration-count: infinite;\n }\n\n &-rain {\n stroke-width: 2;\n }\n\n /* A dash of 6 slides along a path of 24.12 with a gap of exactly that length: it grows out of\n the cloud, falls, and shrinks into the ground. With any other gap the loop does not close.\n `backwards` keeps it hidden through its delay instead of showing the unanimated frame. */\n &-drop {\n stroke-dasharray: 6 24.12;\n animation-name: weatherIconFall;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n animation-fill-mode: backwards;\n }\n\n /* The drop's leading edge reaches the ground 24.12 into a cycle of 30.12, at 80%. The drop\n fades out as it hits and the splash is at its fullest by 82%: on a slow lane, a splash that\n peaked later came a visible moment after its drop. Left to sink into the ground, the drop's\n tail also arrived after the splash and ended as a round-capped dot. */\n &-splash {\n stroke-width: 1;\n opacity: 0;\n transform-box: fill-box;\n transform-origin: center;\n animation-name: weatherIconRing;\n animation-timing-function: ease-out;\n animation-iteration-count: infinite;\n }\n\n &-snow {\n stroke-width: 1.3;\n }\n\n /* Linear: easing would stop the flake in mid-air at every sway waypoint. */\n &-flake {\n animation-name: weatherIconSnowFall;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n animation-fill-mode: backwards;\n }\n\n &-stone {\n fill: currentcolor;\n stroke: none;\n animation-name: weatherIconHailFall;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n animation-fill-mode: backwards;\n }\n\n &-impact {\n stroke-width: 1;\n opacity: 0;\n transform-box: fill-box;\n transform-origin: center;\n animation-name: weatherIconRing;\n animation-timing-function: ease-out;\n animation-iteration-count: infinite;\n }\n\n /* Straight bars of different lengths: a wavy fog reads as an odd shape, not as fog. */\n &-fog {\n stroke-width: 4;\n\n & line:nth-child(1) {\n opacity: 0.55;\n animation: weatherIconSway 6.5s ease-in-out infinite;\n }\n\n & line:nth-child(2) {\n opacity: 0.85;\n animation: weatherIconSway 8s ease-in-out -1.2s infinite reverse;\n }\n\n & line:nth-child(3) {\n opacity: 0.7;\n animation: weatherIconSway 7s ease-in-out -0.6s infinite;\n }\n\n & line:nth-child(4) {\n opacity: 0.5;\n animation: weatherIconSway 9s ease-in-out -2s infinite reverse;\n }\n }\n\n /* Two quick flashes and a long dark stretch, well under the three flashes a second that\n WCAG 2.3.1 sets as the limit. */\n &-bolt {\n stroke-width: 2.5;\n animation: weatherIconFlash 4s linear infinite;\n }\n}\n\n@keyframes weatherIconCloudDrift {\n 0%,\n 100% {\n transform: translate(0, 0) scale(1);\n }\n\n 22% {\n transform: translate(1.2px, -1.6px) scale(1.015);\n }\n\n 48% {\n transform: translate(-0.9px, 1.4px) scale(1.03);\n }\n\n 74% {\n transform: translate(0.8px, -1.2px) scale(1.015);\n }\n\n 90% {\n transform: translate(-1.1px, 1px) scale(1.005);\n }\n}\n\n@keyframes weatherIconRotate {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes weatherIconRayPulse {\n 50% {\n transform: scaleY(1.3);\n }\n}\n\n@keyframes weatherIconGlow {\n 0%,\n 100% {\n opacity: 0.92;\n transform: scale(1);\n }\n\n 50% {\n opacity: 1;\n transform: scale(1.04);\n }\n}\n\n@keyframes weatherIconTwinkle {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.7);\n }\n\n 50% {\n opacity: 1;\n transform: scale(1.1);\n }\n}\n\n@keyframes weatherIconFall {\n 0% {\n stroke-dashoffset: 6;\n opacity: 1;\n }\n\n 80% {\n opacity: 1;\n }\n\n 84% {\n opacity: 0;\n }\n\n 100% {\n stroke-dashoffset: -24.12;\n opacity: 0;\n }\n}\n\n@keyframes weatherIconRing {\n 0%,\n 80% {\n opacity: 0;\n transform: scale(0.6);\n }\n\n 82% {\n opacity: 0.85;\n transform: scale(1);\n }\n\n 100% {\n opacity: 0;\n transform: scale(1.4);\n }\n}\n\n@keyframes weatherIconSnowFall {\n 0% {\n transform: translate(0, 0);\n opacity: 0;\n }\n\n 6% {\n opacity: 1;\n }\n\n 25% {\n transform: translate(3px, 8px);\n }\n\n 50% {\n transform: translate(-3px, 16px);\n }\n\n 75% {\n transform: translate(2px, 24px);\n }\n\n 92% {\n transform: translate(-1px, 29px);\n opacity: 1;\n }\n\n 100% {\n transform: translate(0, 30px);\n opacity: 0;\n }\n}\n\n/* Lands at 80%, then bounces on along the way it was already drifting (sideways as well as up),\n which reads as a bounce rather than a pop. Each stone sets its own landing spot. */\n@keyframes weatherIconHailFall {\n 0% {\n transform: translate(0, 0);\n opacity: 0;\n }\n\n 10% {\n opacity: 1;\n }\n\n 80% {\n transform: translate(calc(var(--weather-icon-dx) * 1px), calc(var(--weather-icon-dy) * 1px));\n opacity: 1;\n animation-timing-function: ease-out;\n }\n\n 88% {\n transform: translate(calc(var(--weather-icon-dx) * 2px), calc((var(--weather-icon-dy) - 2.5) * 1px));\n opacity: 1;\n animation-timing-function: ease-in;\n }\n\n 100% {\n transform: translate(calc(var(--weather-icon-dx) * 2.6px), calc(var(--weather-icon-dy) * 1px));\n opacity: 0;\n }\n}\n\n@keyframes weatherIconSway {\n 50% {\n transform: translateX(3px);\n }\n}\n\n@keyframes weatherIconFlash {\n 0%,\n 8%,\n 14%,\n 100% {\n opacity: 0.35;\n }\n\n 4%,\n 11% {\n opacity: 1;\n }\n}\n\n/* Falling parts pause rather than stop: parts.tsx gives each a negative delay that freezes it\n partway down. The rest stop, and an impact frozen mid-pulse would be a stray mark, so it hides. */\n.weatherIcon-still {\n & .weatherIcon-drop,\n & .weatherIcon-flake,\n & .weatherIcon-stone {\n animation-play-state: paused;\n }\n\n & .weatherIcon-cloud,\n & .weatherIcon-sunRays,\n & .weatherIcon-sunRay,\n & .weatherIcon-sunCore,\n & .weatherIcon-moonCore,\n & .weatherIcon-star,\n & .weatherIcon-fog line,\n & .weatherIcon-bolt {\n animation: none;\n }\n\n & .weatherIcon-splash,\n & .weatherIcon-impact {\n animation: none;\n opacity: 0;\n }\n\n & .weatherIcon-bolt {\n opacity: 1;\n }\n}\n\n/* The component switches to its still frame by itself; this covers where it cannot read the\n setting, such as a server render. */\n@media (prefers-reduced-motion: reduce) {\n .weatherIcon * {\n animation-play-state: paused;\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";var e=function(e){return e.Sunny=`sunny`,e.ClearNight=`clearNight`,e.Cloudy=`cloudy`,e.PartlyCloudy=`partlyCloudy`,e.PartlyCloudyNight=`partlyCloudyNight`,e.RainyLight=`rainyLight`,e.Rainy=`rainy`,e.RainyHeavy=`rainyHeavy`,e.Snowy=`snowy`,e.Hail=`hail`,e.Foggy=`foggy`,e.Thunderstorm=`thunderstorm`,e}({});export{e as WeatherType};
|
|
2
|
+
//# sourceMappingURL=weatherIcon.types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weatherIcon.types.mjs","names":[],"sources":["../../../../package/common/weatherIcon/weatherIcon.types.ts"],"sourcesContent":["import type { CSSProperties, SVGAttributes } from 'react';\nimport type { DataProps } from '../types/slots.types';\n\nexport enum WeatherType {\n Sunny = 'sunny',\n ClearNight = 'clearNight',\n Cloudy = 'cloudy',\n PartlyCloudy = 'partlyCloudy',\n PartlyCloudyNight = 'partlyCloudyNight',\n RainyLight = 'rainyLight',\n Rainy = 'rainy',\n RainyHeavy = 'rainyHeavy',\n Snowy = 'snowy',\n Hail = 'hail',\n Foggy = 'foggy',\n Thunderstorm = 'thunderstorm',\n}\n\n/** The accessible name of each weather, read out by screen readers. */\nexport type WeatherIconLabels = Partial<Record<`${WeatherType}`, string>>;\n\n/**\n * The root is an `<svg>`, so the native attributes come from `SVGAttributes` rather than\n * `HtmlProps`. Its `type` is the attribute of `<script>` and `<style>`, not of an `<svg>`.\n */\nexport interface WeatherIconProps extends DataProps, Omit<SVGAttributes<SVGSVGElement>, 'type'> {\n /**\n * The weather to draw. Takes the enum or its string value, so an API's own enum with the same\n * values passes as it is.\n */\n type: WeatherType | `${WeatherType}`;\n /** Width and height, any CSS size. Default `64`. */\n size?: number | string;\n /**\n * Default `true`. `false` draws a still frame, for small or repeated icons where the motion is\n * too small to see but costs the same. Always still under `prefers-reduced-motion`.\n */\n animated?: boolean;\n /** Text this component renders of its own. */\n labels?: WeatherIconLabels;\n className?: string;\n style?: CSSProperties;\n}\n\n/** What a falling part needs to know to pick its still frame. */\nexport interface WeatherPartProps {\n animated: boolean;\n}\n"],"mappings":"aAGA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,MAAA,QACA,EAAA,WAAA,aACA,EAAA,OAAA,SACA,EAAA,aAAA,eACA,EAAA,kBAAA,oBACA,EAAA,WAAA,aACA,EAAA,MAAA,QACA,EAAA,WAAA,aACA,EAAA,MAAA,QACA,EAAA,KAAA,OACA,EAAA,MAAA,QACA,EAAA,aAAA,gBACF,EAAA,CAAA,CAAA"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{AccordionStyleType as e}from"./common/accordion/accordion.types.mjs";import t from"./common/configProvider/configProvider.mjs";import{useComponentDefaults as n}from"./common/configProvider/useComponentDefaults.mjs";import{useLabels as r}from"./common/configProvider/useLabels.mjs";import{usePresentationDefault as i}from"./common/configProvider/usePresentationDefault.mjs";import{Presentation as a}from"./common/configProvider/presentation.types.mjs";import o from"./common/accordion/accordion.mjs";import s from"./common/loading/spinnerLoading/index.mjs";import{ButtonSize as c,ButtonStyleType as l,ButtonType as u}from"./common/button/button.types.mjs";import d from"./common/ripple/ripple.mjs";import f from"./common/button/button.mjs";import p from"./common/actionButtons/actionButtons.mjs";import m from"./common/interactableDiv/index.mjs";import h from"./common/actionIcon/actionIcon.mjs";import{AlertStyleType as g}from"./common/alert/alert.types.mjs";import _ from"./common/alert/alert.mjs";import v from"./common/animatedLogo/animatedLogo.mjs";import{AnimatedTextUnit as y,AnimatedTextVariant as b}from"./common/animatedText/animatedText.types.mjs";import x from"./common/animatedText/animatedText.mjs";import{BadgePosition as S,BadgeStyleType as C}from"./common/badge/badge.types.mjs";import w from"./common/badge/badge.mjs";import T from"./common/avatar/avatar.mjs";import E from"./common/avatar/avatarGroup.mjs";import D from"./common/bodyEnd/bodyEnd.mjs";import{PopoverAlign as O,PopoverPlacement as k,PopoverTrigger as A}from"./common/popover/popover.types.mjs";import{tabbablesIn as j}from"./common/hooks/useFocusBoundary.mjs";import M from"./common/hooks/useMediaQuery.mjs";import N from"./common/hooks/useCoarsePointer.mjs";import{useVisualViewportSize as P}from"./common/hooks/useVisualViewportSize.mjs";import{useOverlay as F}from"./common/hooks/useOverlay.mjs";import I from"./common/popover/popover.mjs";import L from"./common/breadcrumb/breadcrumb.mjs";import{ButtonGroupOrientation as R}from"./common/buttonGroup/buttonGroup.types.mjs";import z from"./common/buttonGroup/buttonGroup.mjs";import{CardStyleType as B}from"./common/card/card.types.mjs";import V from"./common/card/Card.mjs";import H from"./common/card/CardHeader.mjs";import U from"./common/card/CardMedia.mjs";import W from"./common/card/CardContent.mjs";import G from"./common/card/CardActions.mjs";import K from"./common/carousel/carousel.mjs";import q from"./common/checkbox/checkbox.mjs";import{ChipStyleType as J}from"./common/chip/chip.types.mjs";import Y from"./common/chip/chip.mjs";import X from"./common/chip/chipContainer.mjs";import Z from"./common/tooltip/tooltip.mjs";import{InputIconPosition as Q,InputType as $}from"./common/input/input.types.mjs";import ee from"./common/input/input.mjs";import te from"./common/colorPicker/colorPicker.mjs";import{useScrollEdges as ne}from"./common/hooks/useScrollEdges.mjs";import re from"./common/modal/modal.mjs";import ie from"./common/confirmModal/confirmModal.mjs";import{getLocale as ae,mapLocale as oe,setLocale as se}from"./services/localization.mjs";import ce from"./common/dropdown/dropdown.mjs";import le from"./common/datePicker/datePicker.mjs";import{DividerOrientation as ue,DividerTextPosition as de}from"./common/divider/divider.types.mjs";import fe from"./common/divider/divider.mjs";import pe from"./common/drawer/drawer.mjs";import{DropZoneReturnType as me,DropZoneStatus as he}from"./common/dropZone/dropZone.types.mjs";import ge from"./common/dropZone/dropZone.mjs";import _e from"./common/emptyState/emptyState.mjs";import{useSwipeDismiss as ve}from"./common/hooks/useSwipeDismiss.mjs";import{showToast as ye}from"./common/toast/toastService.mjs";import be from"./common/toast/toastProvider.mjs";import xe from"./common/errorBoundary/errorBoundary.mjs";import Se from"./common/fab/fab.mjs";import Ce from"./common/flip/flip.mjs";import{DoorSwing as we,OpeningKind as Te,PlanIssueKind as Ee,PlanUnitSystem as De,WallType as Oe}from"./common/floorPlan/floorPlan.types.mjs";import{MIN_OPENING_WIDTH as ke,MIN_WALL_LENGTH as Ae}from"./common/floorPlan/floorPlan.geometry.mjs";import{DEFAULT_WALL_ATTRS as je,addOpening as Me,addRect as Ne,addWall as Pe,cleanupPlan as Fe,detachWall as Ie,dissolveNode as Le,mergeNodes as Re,moveNode as ze,removeOpening as Be,removeWall as Ve,scalePlan as He,splitWall as Ue,transformPlan as We,updateOpening as Ge,validatePlan as Ke,wallLength as qe,weldShortWalls as Je}from"./common/floorPlan/floorPlan.graph.mjs";import{MIN_FLOOR_HEIGHT as Ye,addFloor as Xe,duplicateFloor as Ze,emptyFloor as Qe,emptyFloorPlan as $e,floorBelow as et,floorBounds as tt,floorIndex as nt,getFloor as rt,moveFloor as it,removeFloor as at,renameFloor as ot,setFloor as st,setFloorHeight as ct,updateFloor as lt}from"./common/floorPlan/floorPlan.plan.mjs";import{deriveFaces as ut,nodeDegrees as dt}from"./common/floorPlan/floorPlan.faces.mjs";import{commitDerivation as ft,derivePlan as pt,pruneUnmatchedRooms as mt,roomAtPoint as ht}from"./common/floorPlan/floorPlan.rooms.mjs";import{buildWallPaths as gt,openingGeometry as _t,wallCentrelineSpans as vt}from"./common/floorPlan/floorPlan.path.mjs";import{HIT_PX as yt,HIT_PX_COARSE as bt,hitTest as xt,selectionsEqual as St,worldTolerances as Ct}from"./common/floorPlan/floorPlan.hit.mjs";import{DEFAULT_SNAP_OPTIONS as wt,SnapKind as Tt,clientToWorld as Et,resolveSnap as Dt,screenScale as Ot}from"./common/floorPlan/floorPlan.snap.mjs";import{PLAN_FORMAT_VERSION as kt,planFromJson as At,planToJson as jt}from"./common/floorPlan/floorPlan.json.mjs";import{buildPlanMesh as Mt}from"./common/floorPlan/floorPlan.mesh.mjs";import{planFromLegacySvg as Nt}from"./common/floorPlan/legacySvg.mjs";import Pt from"./common/iconPicker/iconPicker.mjs";import Ft from"./common/idleManager/idleManager.mjs";import It from"./common/inputDropdown/inputDropdown.mjs";import Lt from"./common/kanbanBoard/KanbanColumn.mjs";import Rt from"./common/kanbanBoard/KanbanBoard.mjs";import zt from"./common/searchInput/searchInput.mjs";import Bt from"./common/klipyPicker/klipyPicker.mjs";import Vt,{formatHotkey as Ht}from"./common/hooks/useHotkeys.mjs";import{isMenuAction as Ut,isMenuHeading as Wt,isMenuSeparator as Gt}from"./common/menu/menu.types.mjs";import Kt from"./common/menu/menu.mjs";import{menuHotkeys as qt}from"./common/menu/menuHotkeys.mjs";import Jt from"./common/multiSelect/multiSelect.mjs";import Yt from"./common/numberInput/index.mjs";import Xt from"./common/optionPicker/optionPicker.mjs";import{OtpInputCharset as Zt}from"./common/otpInput/otpInput.types.mjs";import Qt from"./common/otpInput/otpInput.mjs";import $t from"./common/overscroll/overscroll.mjs";import en from"./common/pagination/pagination.mjs";import tn from"./common/progressBar/progressBar.mjs";import{RadioGroupOrientation as nn}from"./common/radioGroup/radioGroup.types.mjs";import rn from"./common/radioGroup/radioGroup.mjs";import an from"./common/rating/rating.mjs";import on from"./common/revealLens/revealLens.mjs";import sn from"./common/roomDrawer/roomDrawer.mjs";import cn from"./common/roomViewer/roomViewer.mjs";import{ScrollFadeAxis as ln}from"./common/scrollFade/scrollFade.types.mjs";import un from"./common/scrollFade/scrollFade.mjs";import dn from"./common/scrollbarProvider/index.mjs";import{SectionHeaderSize as fn}from"./common/sectionHeader/sectionHeader.types.mjs";import pn from"./common/sectionHeader/sectionHeader.mjs";import{SkeletonAnimation as mn,SkeletonVariant as hn}from"./common/skeleton/skeleton.types.mjs";import gn from"./common/skeleton/skeleton.mjs";import _n from"./common/slider/slider.mjs";import vn from"./common/splitButton/splitButton.mjs";import{StepperAlignment as yn,StepperCollapse as bn,StepperLabelPlacement as xn,StepperStyleType as Sn}from"./common/stepper/stepper.types.mjs";import Cn from"./common/stepper/stepper.mjs";import wn from"./common/sticky/sticky.mjs";import Tn from"./common/switch/switch.mjs";import En from"./common/tabHeader/tabHeader.mjs";import Dn from"./common/textarea/textarea.mjs";import{defaultTheme as On}from"./common/themeProvider/defaultTheme.mjs";import kn from"./common/themeProvider/themeProvider.mjs";import{lightTheme as An}from"./common/themeProvider/lightTheme.mjs";import{useTheme as jn}from"./common/themeProvider/useTheme.mjs";import Mn,{TiltGroupContext as Nn,useTiltGroup as Pn}from"./common/tiltGroup/tiltGroup.mjs";import{defaultTiltEasing as Fn}from"./common/tilt/tiltMath.mjs";import In from"./common/tilt/tilt.mjs";import Ln from"./common/timeInput/timeInput.mjs";import{TimelineAlignment as Rn,TimelineItemStatus as zn}from"./common/timeline/timeline.types.mjs";import Bn from"./common/timeline/timeline.mjs";import Vn from"./common/timer/timer.mjs";import Hn from"./common/virtualList/virtualList.mjs";import{flattenTree as Un}from"./common/tree/flattenTree.mjs";import Wn from"./common/tree/tree.mjs";import Gn from"./common/wizard/wizard.mjs";import Kn from"./services/formValidation/FormValidatorGroupWithForm.mjs";import qn from"./services/formValidation/validatableComponent.mjs";import{useFormValidatorGroup as Jn}from"./services/formValidation/useFormValidatorGroup.mjs";import{FormValidator as Yn,Validators as Xn,useFormValidator as Zn}from"./services/formValidation/index.mjs";import{hasEightPasswordChars as Qn,hasOnePasswordDigit as $n,hasOnePasswordLetter as er,isBic as tr,isDate as nr,isEmail as rr,isISODate as ir,isNumber as ar,isPassword as or,isURL as sr}from"@ahrowe/form-validation";export{o as Accordion,e as AccordionStyleType,p as ActionButtons,h as ActionIcon,_ as Alert,g as AlertStyleType,v as AnimatedLogo,x as AnimatedText,y as AnimatedTextUnit,b as AnimatedTextVariant,T as Avatar,E as AvatarGroup,w as Badge,S as BadgePosition,C as BadgeStyleType,D as BodyEnd,L as Breadcrumb,f as Button,z as ButtonGroup,R as ButtonGroupOrientation,c as ButtonSize,l as ButtonStyleType,u as ButtonType,V as Card,G as CardActions,W as CardContent,H as CardHeader,U as CardMedia,B as CardStyleType,K as Carousel,q as Checkbox,Y as Chip,X as ChipContainer,J as ChipStyleType,te as ColorPicker,t as ConfigProvider,ie as ConfirmModal,wt as DEFAULT_SNAP_OPTIONS,je as DEFAULT_WALL_ATTRS,le as DatePicker,fe as Divider,ue as DividerOrientation,de as DividerTextPosition,we as DoorSwing,pe as Drawer,ge as DropZone,me as DropZoneReturnType,he as DropZoneStatus,ce as Dropdown,_e as EmptyState,xe as ErrorBoundary,Se as Fab,Ce as Flip,Yn as FormValidator,Kn as FormValidatorGroup,yt as HIT_PX,bt as HIT_PX_COARSE,Pt as IconPicker,Ft as IdleManager,ee as Input,It as InputDropdown,Q as InputIconPosition,$ as InputType,m as InteractableDiv,Rt as KanbanBoard,Lt as KanbanColumn,Bt as KlipyPicker,Ye as MIN_FLOOR_HEIGHT,ke as MIN_OPENING_WIDTH,Ae as MIN_WALL_LENGTH,Kt as Menu,re as Modal,Jt as MultiSelect,Yt as NumberInput,Te as OpeningKind,Xt as OptionPicker,Qt as OtpInput,Zt as OtpInputCharset,$t as Overscroll,kt as PLAN_FORMAT_VERSION,en as Pagination,Ee as PlanIssueKind,De as PlanUnitSystem,I as Popover,O as PopoverAlign,k as PopoverPlacement,A as PopoverTrigger,a as Presentation,tn as ProgressBar,rn as RadioGroup,nn as RadioGroupOrientation,an as Rating,on as RevealLens,d as Ripple,sn as RoomDrawer,cn as RoomViewer,un as ScrollFade,ln as ScrollFadeAxis,dn as ScrollbarProvider,zt as SearchInput,pn as SectionHeader,fn as SectionHeaderSize,gn as Skeleton,mn as SkeletonAnimation,hn as SkeletonVariant,_n as Slider,Tt as SnapKind,s as SpinnerLoading,vn as SplitButton,Cn as Stepper,yn as StepperAlignment,bn as StepperCollapse,xn as StepperLabelPlacement,Sn as StepperStyleType,wn as Sticky,Tn as Switch,En as TabHeader,Dn as Textarea,kn as ThemeProvider,In as Tilt,Mn as TiltGroup,Nn as TiltGroupContext,Ln as TimeInput,Bn as Timeline,Rn as TimelineAlignment,zn as TimelineItemStatus,Vn as Timer,be as ToastProvider,Z as Tooltip,Wn as Tree,qn as ValidatableComponent,Xn as Validators,Hn as VirtualList,Oe as WallType,Gn as Wizard,Xe as addFloor,Me as addOpening,Ne as addRect,Pe as addWall,Mt as buildPlanMesh,gt as buildWallPaths,Fe as cleanupPlan,Et as clientToWorld,ft as commitDerivation,On as defaultTheme,Fn as defaultTiltEasing,ut as deriveFaces,pt as derivePlan,Ie as detachWall,Le as dissolveNode,Ze as duplicateFloor,Qe as emptyFloor,$e as emptyFloorPlan,Un as flattenTree,et as floorBelow,tt as floorBounds,nt as floorIndex,Ht as formatHotkey,rt as getFloor,ae as getLocale,Qn as hasEightPasswordChars,$n as hasOnePasswordDigit,er as hasOnePasswordLetter,xt as hitTest,tr as isBic,nr as isDate,rr as isEmail,ir as isISODate,Ut as isMenuAction,Wt as isMenuHeading,Gt as isMenuSeparator,ar as isNumber,or as isPassword,sr as isURL,An as lightTheme,oe as mapLocale,qt as menuHotkeys,Re as mergeNodes,it as moveFloor,ze as moveNode,dt as nodeDegrees,_t as openingGeometry,At as planFromJson,Nt as planFromLegacySvg,jt as planToJson,mt as pruneUnmatchedRooms,at as removeFloor,Be as removeOpening,Ve as removeWall,ot as renameFloor,Dt as resolveSnap,ht as roomAtPoint,He as scalePlan,Ot as screenScale,St as selectionsEqual,st as setFloor,ct as setFloorHeight,se as setLocale,ye as showToast,Ue as splitWall,j as tabbablesIn,We as transformPlan,lt as updateFloor,Ge as updateOpening,N as useCoarsePointer,n as useComponentDefaults,Zn as useFormValidator,Jn as useFormValidatorGroup,Vt as useHotkeys,r as useLabels,M as useMediaQuery,F as useOverlay,i as usePresentationDefault,ne as useScrollEdges,ve as useSwipeDismiss,jn as useTheme,Pn as useTiltGroup,P as useVisualViewportSize,Ke as validatePlan,vt as wallCentrelineSpans,qe as wallLength,Je as weldShortWalls,Ct as worldTolerances};
|
|
1
|
+
"use client";import{AccordionStyleType as e}from"./common/accordion/accordion.types.mjs";import t from"./common/configProvider/configProvider.mjs";import{useComponentDefaults as n}from"./common/configProvider/useComponentDefaults.mjs";import{useLabels as r}from"./common/configProvider/useLabels.mjs";import{usePresentationDefault as i}from"./common/configProvider/usePresentationDefault.mjs";import{Presentation as a}from"./common/configProvider/presentation.types.mjs";import o from"./common/accordion/accordion.mjs";import s from"./common/loading/spinnerLoading/index.mjs";import{ButtonSize as c,ButtonStyleType as l,ButtonType as u}from"./common/button/button.types.mjs";import d from"./common/ripple/ripple.mjs";import f from"./common/button/button.mjs";import p from"./common/actionButtons/actionButtons.mjs";import m from"./common/interactableDiv/index.mjs";import h from"./common/actionIcon/actionIcon.mjs";import{AlertStyleType as g}from"./common/alert/alert.types.mjs";import _ from"./common/alert/alert.mjs";import v from"./common/animatedLogo/animatedLogo.mjs";import{AnimatedTextUnit as y,AnimatedTextVariant as b}from"./common/animatedText/animatedText.types.mjs";import x from"./common/animatedText/animatedText.mjs";import{BadgePosition as S,BadgeStyleType as C}from"./common/badge/badge.types.mjs";import w from"./common/badge/badge.mjs";import T from"./common/avatar/avatar.mjs";import E from"./common/avatar/avatarGroup.mjs";import D from"./common/bodyEnd/bodyEnd.mjs";import{PopoverAlign as O,PopoverPlacement as k,PopoverTrigger as A}from"./common/popover/popover.types.mjs";import{tabbablesIn as j}from"./common/hooks/useFocusBoundary.mjs";import M from"./common/hooks/useMediaQuery.mjs";import N from"./common/hooks/useCoarsePointer.mjs";import{useVisualViewportSize as P}from"./common/hooks/useVisualViewportSize.mjs";import{useOverlay as F}from"./common/hooks/useOverlay.mjs";import I from"./common/popover/popover.mjs";import L from"./common/breadcrumb/breadcrumb.mjs";import{ButtonGroupOrientation as R}from"./common/buttonGroup/buttonGroup.types.mjs";import z from"./common/buttonGroup/buttonGroup.mjs";import{CardStyleType as B}from"./common/card/card.types.mjs";import V from"./common/card/Card.mjs";import H from"./common/card/CardHeader.mjs";import U from"./common/card/CardMedia.mjs";import W from"./common/card/CardContent.mjs";import G from"./common/card/CardActions.mjs";import K from"./common/carousel/carousel.mjs";import q from"./common/checkbox/checkbox.mjs";import{ChipStyleType as J}from"./common/chip/chip.types.mjs";import Y from"./common/chip/chip.mjs";import X from"./common/chip/chipContainer.mjs";import Z from"./common/tooltip/tooltip.mjs";import{InputIconPosition as Q,InputType as $}from"./common/input/input.types.mjs";import ee from"./common/input/input.mjs";import te from"./common/colorPicker/colorPicker.mjs";import{useScrollEdges as ne}from"./common/hooks/useScrollEdges.mjs";import re from"./common/modal/modal.mjs";import ie,{formatHotkey as ae}from"./common/hooks/useHotkeys.mjs";import{isMenuAction as oe,isMenuHeading as se,isMenuSeparator as ce}from"./common/menu/menu.types.mjs";import le from"./common/commandPalette/commandPalette.mjs";import ue from"./common/confirmModal/confirmModal.mjs";import de from"./common/hooks/useClipboard.mjs";import fe from"./common/copyButton/copyButton.mjs";import{getLocale as pe,mapLocale as me,setLocale as he}from"./services/localization.mjs";import{dateToDay as ge,dayToDate as _e}from"./common/utils/day.mjs";import ve from"./common/dropdown/dropdown.mjs";import ye from"./common/datePicker/datePicker.mjs";import{DividerOrientation as be,DividerTextPosition as xe}from"./common/divider/divider.types.mjs";import Se from"./common/divider/divider.mjs";import Ce from"./common/drawer/drawer.mjs";import{DropZoneReturnType as we,DropZoneStatus as Te}from"./common/dropZone/dropZone.types.mjs";import Ee from"./common/dropZone/dropZone.mjs";import De from"./common/emptyState/emptyState.mjs";import{useSwipeDismiss as Oe}from"./common/hooks/useSwipeDismiss.mjs";import{showToast as ke}from"./common/toast/toastService.mjs";import Ae from"./common/toast/toastProvider.mjs";import je from"./common/errorBoundary/errorBoundary.mjs";import Me from"./common/fab/fab.mjs";import Ne from"./common/flip/flip.mjs";import{DoorSwing as Pe,OpeningKind as Fe,PlanIssueKind as Ie,PlanUnitSystem as Le,WallType as Re}from"./common/floorPlan/floorPlan.types.mjs";import{MIN_OPENING_WIDTH as ze,MIN_WALL_LENGTH as Be}from"./common/floorPlan/floorPlan.geometry.mjs";import{DEFAULT_WALL_ATTRS as Ve,addOpening as He,addRect as Ue,addWall as We,cleanupPlan as Ge,detachWall as Ke,dissolveNode as qe,mergeNodes as Je,moveNode as Ye,removeOpening as Xe,removeWall as Ze,scalePlan as Qe,splitWall as $e,transformPlan as et,updateOpening as tt,validatePlan as nt,wallLength as rt,weldShortWalls as it}from"./common/floorPlan/floorPlan.graph.mjs";import{MIN_FLOOR_HEIGHT as at,addFloor as ot,duplicateFloor as st,emptyFloor as ct,emptyFloorPlan as lt,floorBelow as ut,floorBounds as dt,floorIndex as ft,getFloor as pt,moveFloor as mt,removeFloor as ht,renameFloor as gt,setFloor as _t,setFloorHeight as vt,updateFloor as yt}from"./common/floorPlan/floorPlan.plan.mjs";import{deriveFaces as bt,nodeDegrees as xt}from"./common/floorPlan/floorPlan.faces.mjs";import{commitDerivation as St,derivePlan as Ct,pruneUnmatchedRooms as wt,roomAtPoint as Tt}from"./common/floorPlan/floorPlan.rooms.mjs";import{buildWallPaths as Et,openingGeometry as Dt,wallCentrelineSpans as Ot}from"./common/floorPlan/floorPlan.path.mjs";import{HIT_PX as kt,HIT_PX_COARSE as At,hitTest as jt,selectionsEqual as Mt,worldTolerances as Nt}from"./common/floorPlan/floorPlan.hit.mjs";import{DEFAULT_SNAP_OPTIONS as Pt,SnapKind as Ft,clientToWorld as It,resolveSnap as Lt,screenScale as Rt}from"./common/floorPlan/floorPlan.snap.mjs";import{PLAN_FORMAT_VERSION as zt,planFromJson as Bt,planToJson as Vt}from"./common/floorPlan/floorPlan.json.mjs";import{buildPlanMesh as Ht}from"./common/floorPlan/floorPlan.mesh.mjs";import{planFromLegacySvg as Ut}from"./common/floorPlan/legacySvg.mjs";import Wt from"./common/iconPicker/iconPicker.mjs";import Gt from"./common/idleManager/idleManager.mjs";import Kt from"./common/inputDropdown/inputDropdown.mjs";import qt from"./common/kanbanBoard/KanbanColumn.mjs";import Jt from"./common/kanbanBoard/KanbanBoard.mjs";import Yt from"./common/searchInput/searchInput.mjs";import Xt from"./common/klipyPicker/klipyPicker.mjs";import Zt from"./common/menu/menu.mjs";import{menuHotkeys as Qt}from"./common/menu/menuHotkeys.mjs";import $t from"./common/multiSelect/multiSelect.mjs";import en from"./common/numberInput/index.mjs";import tn from"./common/optionPicker/optionPicker.mjs";import{OtpInputCharset as nn}from"./common/otpInput/otpInput.types.mjs";import rn from"./common/otpInput/otpInput.mjs";import an from"./common/overscroll/overscroll.mjs";import on from"./common/pagination/pagination.mjs";import sn from"./common/progressBar/progressBar.mjs";import{RadioGroupOrientation as cn}from"./common/radioGroup/radioGroup.types.mjs";import ln from"./common/radioGroup/radioGroup.mjs";import un from"./common/rating/rating.mjs";import dn from"./common/revealLens/revealLens.mjs";import fn from"./common/roomDrawer/roomDrawer.mjs";import pn from"./common/roomViewer/roomViewer.mjs";import{ScrollFadeAxis as mn}from"./common/scrollFade/scrollFade.types.mjs";import hn from"./common/scrollFade/scrollFade.mjs";import gn from"./common/scrollbarProvider/index.mjs";import{SectionHeaderSize as _n}from"./common/sectionHeader/sectionHeader.types.mjs";import vn from"./common/sectionHeader/sectionHeader.mjs";import{SkeletonAnimation as yn,SkeletonVariant as bn}from"./common/skeleton/skeleton.types.mjs";import xn from"./common/skeleton/skeleton.mjs";import Sn from"./common/slider/slider.mjs";import Cn from"./common/splitButton/splitButton.mjs";import{StepperAlignment as wn,StepperCollapse as Tn,StepperLabelPlacement as En,StepperStyleType as Dn}from"./common/stepper/stepper.types.mjs";import On from"./common/stepper/stepper.mjs";import kn from"./common/sticky/sticky.mjs";import An from"./common/switch/switch.mjs";import jn from"./common/tabHeader/tabHeader.mjs";import Mn from"./common/textarea/textarea.mjs";import{defaultTheme as Nn}from"./common/themeProvider/defaultTheme.mjs";import Pn from"./common/themeProvider/themeProvider.mjs";import{lightTheme as Fn}from"./common/themeProvider/lightTheme.mjs";import{useTheme as In}from"./common/themeProvider/useTheme.mjs";import Ln,{TiltGroupContext as Rn,useTiltGroup as zn}from"./common/tiltGroup/tiltGroup.mjs";import{defaultTiltEasing as Bn}from"./common/tilt/tiltMath.mjs";import Vn from"./common/tilt/tilt.mjs";import Hn from"./common/timeInput/timeInput.mjs";import{TimelineAlignment as Un,TimelineItemStatus as Wn}from"./common/timeline/timeline.types.mjs";import Gn from"./common/timeline/timeline.mjs";import Kn from"./common/timer/timer.mjs";import qn from"./common/virtualList/virtualList.mjs";import{flattenTree as Jn}from"./common/tree/flattenTree.mjs";import Yn from"./common/tree/tree.mjs";import{WeatherType as Xn}from"./common/weatherIcon/weatherIcon.types.mjs";import Zn from"./common/weatherIcon/weatherIcon.mjs";import Qn from"./common/wizard/wizard.mjs";import $n from"./services/formValidation/FormValidatorGroupWithForm.mjs";import er from"./services/formValidation/validatableComponent.mjs";import{useFormValidatorGroup as tr}from"./services/formValidation/useFormValidatorGroup.mjs";import{FormValidator as nr,Validators as rr,useFormValidator as ir}from"./services/formValidation/index.mjs";import{hasEightPasswordChars as ar,hasOnePasswordDigit as or,hasOnePasswordLetter as sr,isBic as cr,isDate as lr,isDay as ur,isEmail as dr,isISODate as fr,isNumber as pr,isPassword as mr,isURL as hr}from"@ahrowe/form-validation";export{o as Accordion,e as AccordionStyleType,p as ActionButtons,h as ActionIcon,_ as Alert,g as AlertStyleType,v as AnimatedLogo,x as AnimatedText,y as AnimatedTextUnit,b as AnimatedTextVariant,T as Avatar,E as AvatarGroup,w as Badge,S as BadgePosition,C as BadgeStyleType,D as BodyEnd,L as Breadcrumb,f as Button,z as ButtonGroup,R as ButtonGroupOrientation,c as ButtonSize,l as ButtonStyleType,u as ButtonType,V as Card,G as CardActions,W as CardContent,H as CardHeader,U as CardMedia,B as CardStyleType,K as Carousel,q as Checkbox,Y as Chip,X as ChipContainer,J as ChipStyleType,te as ColorPicker,le as CommandPalette,t as ConfigProvider,ue as ConfirmModal,fe as CopyButton,Pt as DEFAULT_SNAP_OPTIONS,Ve as DEFAULT_WALL_ATTRS,ye as DatePicker,Se as Divider,be as DividerOrientation,xe as DividerTextPosition,Pe as DoorSwing,Ce as Drawer,Ee as DropZone,we as DropZoneReturnType,Te as DropZoneStatus,ve as Dropdown,De as EmptyState,je as ErrorBoundary,Me as Fab,Ne as Flip,nr as FormValidator,$n as FormValidatorGroup,kt as HIT_PX,At as HIT_PX_COARSE,Wt as IconPicker,Gt as IdleManager,ee as Input,Kt as InputDropdown,Q as InputIconPosition,$ as InputType,m as InteractableDiv,Jt as KanbanBoard,qt as KanbanColumn,Xt as KlipyPicker,at as MIN_FLOOR_HEIGHT,ze as MIN_OPENING_WIDTH,Be as MIN_WALL_LENGTH,Zt as Menu,re as Modal,$t as MultiSelect,en as NumberInput,Fe as OpeningKind,tn as OptionPicker,rn as OtpInput,nn as OtpInputCharset,an as Overscroll,zt as PLAN_FORMAT_VERSION,on as Pagination,Ie as PlanIssueKind,Le as PlanUnitSystem,I as Popover,O as PopoverAlign,k as PopoverPlacement,A as PopoverTrigger,a as Presentation,sn as ProgressBar,ln as RadioGroup,cn as RadioGroupOrientation,un as Rating,dn as RevealLens,d as Ripple,fn as RoomDrawer,pn as RoomViewer,hn as ScrollFade,mn as ScrollFadeAxis,gn as ScrollbarProvider,Yt as SearchInput,vn as SectionHeader,_n as SectionHeaderSize,xn as Skeleton,yn as SkeletonAnimation,bn as SkeletonVariant,Sn as Slider,Ft as SnapKind,s as SpinnerLoading,Cn as SplitButton,On as Stepper,wn as StepperAlignment,Tn as StepperCollapse,En as StepperLabelPlacement,Dn as StepperStyleType,kn as Sticky,An as Switch,jn as TabHeader,Mn as Textarea,Pn as ThemeProvider,Vn as Tilt,Ln as TiltGroup,Rn as TiltGroupContext,Hn as TimeInput,Gn as Timeline,Un as TimelineAlignment,Wn as TimelineItemStatus,Kn as Timer,Ae as ToastProvider,Z as Tooltip,Yn as Tree,er as ValidatableComponent,rr as Validators,qn as VirtualList,Re as WallType,Zn as WeatherIcon,Xn as WeatherType,Qn as Wizard,ot as addFloor,He as addOpening,Ue as addRect,We as addWall,Ht as buildPlanMesh,Et as buildWallPaths,Ge as cleanupPlan,It as clientToWorld,St as commitDerivation,ge as dateToDay,_e as dayToDate,Nn as defaultTheme,Bn as defaultTiltEasing,bt as deriveFaces,Ct as derivePlan,Ke as detachWall,qe as dissolveNode,st as duplicateFloor,ct as emptyFloor,lt as emptyFloorPlan,Jn as flattenTree,ut as floorBelow,dt as floorBounds,ft as floorIndex,ae as formatHotkey,pt as getFloor,pe as getLocale,ar as hasEightPasswordChars,or as hasOnePasswordDigit,sr as hasOnePasswordLetter,jt as hitTest,cr as isBic,lr as isDate,ur as isDay,dr as isEmail,fr as isISODate,oe as isMenuAction,se as isMenuHeading,ce as isMenuSeparator,pr as isNumber,mr as isPassword,hr as isURL,Fn as lightTheme,me as mapLocale,Qt as menuHotkeys,Je as mergeNodes,mt as moveFloor,Ye as moveNode,xt as nodeDegrees,Dt as openingGeometry,Bt as planFromJson,Ut as planFromLegacySvg,Vt as planToJson,wt as pruneUnmatchedRooms,ht as removeFloor,Xe as removeOpening,Ze as removeWall,gt as renameFloor,Lt as resolveSnap,Tt as roomAtPoint,Qe as scalePlan,Rt as screenScale,Mt as selectionsEqual,_t as setFloor,vt as setFloorHeight,he as setLocale,ke as showToast,$e as splitWall,j as tabbablesIn,et as transformPlan,yt as updateFloor,tt as updateOpening,de as useClipboard,N as useCoarsePointer,n as useComponentDefaults,ir as useFormValidator,tr as useFormValidatorGroup,ie as useHotkeys,r as useLabels,M as useMediaQuery,F as useOverlay,i as usePresentationDefault,ne as useScrollEdges,Oe as useSwipeDismiss,In as useTheme,zn as useTiltGroup,P as useVisualViewportSize,nt as validatePlan,Ot as wallCentrelineSpans,rt as wallLength,it as weldShortWalls,Nt as worldTolerances};
|