@stfrigerio/sito-template 0.1.94 → 0.1.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/atoms/Slider/Slider.d.ts +3 -1
- package/dist/components/atoms/Slider/Slider.d.ts.map +1 -1
- package/dist/components/atoms/Slider/Slider.stories.d.ts +1 -1
- package/dist/components/atoms/Slider/Slider.stories.d.ts.map +1 -1
- package/dist/components/molecules/RecurrencePicker/RecurrencePicker.d.ts +13 -0
- package/dist/components/molecules/RecurrencePicker/RecurrencePicker.d.ts.map +1 -0
- package/dist/components/molecules/RecurrencePicker/RecurrencePicker.stories.d.ts +12 -0
- package/dist/components/molecules/RecurrencePicker/RecurrencePicker.stories.d.ts.map +1 -0
- package/dist/components/molecules/RecurrencePicker/index.d.ts +3 -0
- package/dist/components/molecules/RecurrencePicker/index.d.ts.map +1 -0
- package/dist/components/molecules/index.d.ts +2 -0
- package/dist/components/molecules/index.d.ts.map +1 -1
- package/dist/components/organisms/charts/SleepChart/SleepChart.d.ts.map +1 -1
- package/dist/index.esm.js +490 -381
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +493 -383
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/dist/themes/lossito.css +243 -49
- package/package.json +2 -1
- package/storybook-static/assets/{ASCIIText.stories-BcJjdQeF.js → ASCIIText.stories-BNQcc9gv.js} +1 -1
- package/storybook-static/assets/{AllAtoms.stories-gLnakQIy.js → AllAtoms.stories-DBpk-rB8.js} +1 -1
- package/storybook-static/assets/{AnimatedContent.stories-BqG8Ujwo.js → AnimatedContent.stories-CCnlHD5Y.js} +1 -1
- package/storybook-static/assets/{AnimatedList.stories-BHUu3vbs.js → AnimatedList.stories-DNI1W5-A.js} +1 -1
- package/storybook-static/assets/{Antigravity.stories-Dvy48Mca.js → Antigravity.stories-BQw1Zvk9.js} +1 -1
- package/storybook-static/assets/{ArrayInput.stories-BaYz4AcS.js → ArrayInput.stories-HQd6ODME.js} +1 -1
- package/storybook-static/assets/{Aurora.stories-Cj0WEobX.js → Aurora.stories-xI4i4wH4.js} +1 -1
- package/storybook-static/assets/{Beams.stories-DdjXl2Ud.js → Beams.stories-DxSqefhF.js} +1 -1
- package/storybook-static/assets/{BlobCursor.stories-BoQFvL-r.js → BlobCursor.stories-DNk0BeNz.js} +1 -1
- package/storybook-static/assets/{BlurText.stories-DxpW9DDe.js → BlurText.stories-DBsRktVj.js} +1 -1
- package/storybook-static/assets/{BooleansHeatmap.stories-BHhNYd6b.js → BooleansHeatmap.stories-dsUQfyWg.js} +1 -1
- package/storybook-static/assets/{BorderGlow.stories-CuZoWDWv.js → BorderGlow.stories-lgvEGRVA.js} +1 -1
- package/storybook-static/assets/{BubbleMenu.stories-DEd7nU7K.js → BubbleMenu.stories-CXvB9JdY.js} +1 -1
- package/storybook-static/assets/{Button-pZnuxGoU.js → Button-6nmyMGc3.js} +1 -1
- package/storybook-static/assets/{Button.stories-ClGPyfoQ.js → Button.stories-DD3HQBXg.js} +1 -1
- package/storybook-static/assets/{Calendar.stories-CZ__yULj.js → Calendar.stories-_ZDa4YfS.js} +1 -1
- package/storybook-static/assets/{Card-qiSwFj5T.js → Card-B7F8cu_z.js} +1 -1
- package/storybook-static/assets/{Card.stories-QS7XsWA5.js → Card.stories-BLbuUq_5.js} +1 -1
- package/storybook-static/assets/{CardNav.stories-yaYQBXBL.js → CardNav.stories-CiJ_bFt8.js} +1 -1
- package/storybook-static/assets/{Carousel.stories-CN1saeqv.js → Carousel.stories-BYGW6P4X.js} +1 -1
- package/storybook-static/assets/{Checkbox-C5cfmgV9.js → Checkbox-xrie0yDX.js} +1 -1
- package/storybook-static/assets/{Checkbox.stories-DRcZy09T.js → Checkbox.stories-D-NYqhCG.js} +1 -1
- package/storybook-static/assets/{ChromaGrid.stories-BMv_eSkq.js → ChromaGrid.stories-yYkbcq2a.js} +1 -1
- package/storybook-static/assets/{CircularGallery.stories-CM7yqhd9.js → CircularGallery.stories-Ci3GTUgX.js} +1 -1
- package/storybook-static/assets/{CircularText.stories-TPKZYXaf.js → CircularText.stories-7QMPmTLn.js} +1 -1
- package/storybook-static/assets/{ClickSpark.stories-BzYMb5jU.js → ClickSpark.stories-Dz9M-gEC.js} +1 -1
- package/storybook-static/assets/{ColorBends.stories-DXg_57qe.js → ColorBends.stories-Dfa0YMsf.js} +1 -1
- package/storybook-static/assets/{CountUp.stories-B3YWVUaV.js → CountUp.stories-DrdYM8-J.js} +1 -1
- package/storybook-static/assets/{Counter.stories-PJzaHt_U.js → Counter.stories-3m6ldyes.js} +1 -1
- package/storybook-static/assets/{Crosshair.stories-CuTI-wK9.js → Crosshair.stories-DfRqBfZC.js} +1 -1
- package/storybook-static/assets/{Cubes.stories-BNTbOIDN.js → Cubes.stories-D1sZRgvG.js} +1 -1
- package/storybook-static/assets/{CurvedLoop.stories-R4Z6U8gl.js → CurvedLoop.stories-D6jowEDF.js} +1 -1
- package/storybook-static/assets/{DarkVeil.stories-BlRCjGvH.js → DarkVeil.stories-DLCrll-I.js} +1 -1
- package/storybook-static/assets/{DateInput-BHD9FDFh.js → DateInput-D4MHyeLk.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-CHkZcDfi.js → DateInput.stories-BRfVBcf6.js} +1 -1
- package/storybook-static/assets/{DecayCard.stories-BBARttiL.js → DecayCard.stories-DX1ak6pd.js} +1 -1
- package/storybook-static/assets/{DecryptedText.stories--j-BrW-d.js → DecryptedText.stories-BcCQ2Tby.js} +1 -1
- package/storybook-static/assets/{Dither.stories-CBVHTbq6.js → Dither.stories-BPqBpmFI.js} +1 -1
- package/storybook-static/assets/{Dock.stories-DkcSxUnP.js → Dock.stories-CKD_TOGP.js} +1 -1
- package/storybook-static/assets/{EditFAB.stories-CnO5gbbx.js → EditFAB.stories-DGVMpMOL.js} +1 -1
- package/storybook-static/assets/{EvilEye.stories-1AQhELsp.js → EvilEye.stories-DNoB6FG0.js} +1 -1
- package/storybook-static/assets/{FadeContent.stories-albedBaX.js → FadeContent.stories-C8ppDaXi.js} +1 -1
- package/storybook-static/assets/{FaultyTerminal.stories-BFGmMtSB.js → FaultyTerminal.stories-Y8ME_yze.js} +1 -1
- package/storybook-static/assets/{Fbo-CtK0ycna.js → Fbo-Bkb1mqiu.js} +1 -1
- package/storybook-static/assets/{FloatingLines.stories-2TQYxxp1.js → FloatingLines.stories-ZByyesqH.js} +1 -1
- package/storybook-static/assets/{FlowingMenu.stories-CZ5tXywl.js → FlowingMenu.stories-CTWLtqhL.js} +1 -1
- package/storybook-static/assets/{FluidGlass.stories-Df2us36M.js → FluidGlass.stories--PsLBBhn.js} +1 -1
- package/storybook-static/assets/{Folder.stories-BrFzcjvz.js → Folder.stories-JNXotEML.js} +1 -1
- package/storybook-static/assets/{FuzzyText.stories-C1RHobMi.js → FuzzyText.stories-o6wySpRq.js} +1 -1
- package/storybook-static/assets/{Galaxy.stories-Cok_44zn.js → Galaxy.stories-DTZantrp.js} +1 -1
- package/storybook-static/assets/{GhostCursor.stories-DWaGKV-v.js → GhostCursor.stories-DXF-m9YM.js} +1 -1
- package/storybook-static/assets/{GlareHover.stories-CYve6zsX.js → GlareHover.stories-Bb4_dcLV.js} +1 -1
- package/storybook-static/assets/{GlassSurface.stories-BvktN5x5.js → GlassSurface.stories-yZ4K521K.js} +1 -1
- package/storybook-static/assets/{GlitchText.stories-DLg3Stoq.js → GlitchText.stories-B4Eqkyri.js} +1 -1
- package/storybook-static/assets/{GooeyNav.stories-Do5CtYVN.js → GooeyNav.stories-CqUOrJR-.js} +1 -1
- package/storybook-static/assets/{GradientBlinds.stories-D3SC67DZ.js → GradientBlinds.stories-DZ6bTCGp.js} +1 -1
- package/storybook-static/assets/{GradientText.stories-54uAxgz7.js → GradientText.stories-DyDht-TI.js} +1 -1
- package/storybook-static/assets/{Grainient.stories-CghGq35C.js → Grainient.stories-C1PtR90_.js} +1 -1
- package/storybook-static/assets/{GridMotion.stories-dOv18eyR.js → GridMotion.stories-BRbD6MZr.js} +1 -1
- package/storybook-static/assets/{HabitTimeOfDayChart.stories-BMoAR2U6.js → HabitTimeOfDayChart.stories-D3gqeKpl.js} +1 -1
- package/storybook-static/assets/{ImageSlideshow.stories-DFosgVkj.js → ImageSlideshow.stories-BileVQYy.js} +1 -1
- package/storybook-static/assets/{Iridescence.stories-BESMZhKG.js → Iridescence.stories-BIhFVHOn.js} +1 -1
- package/storybook-static/assets/{LaserFlow.stories-afCaPMTi.js → LaserFlow.stories-BSnwH5Mv.js} +1 -1
- package/storybook-static/assets/{LetterGlitch.stories-i9gr8ufw.js → LetterGlitch.stories-CfGaNSmi.js} +1 -1
- package/storybook-static/assets/{LightPillar.stories-Bd0CFE1p.js → LightPillar.stories-CNtpoF6N.js} +1 -1
- package/storybook-static/assets/{LightRays.stories-B_SogOnY.js → LightRays.stories-DRKVWqXb.js} +1 -1
- package/storybook-static/assets/{Lightning.stories-CK3jA29T.js → Lightning.stories-DJOW6kK7.js} +1 -1
- package/storybook-static/assets/{LineWaves.stories-LnRI4l13.js → LineWaves.stories-17nqJpH2.js} +1 -1
- package/storybook-static/assets/{LiquidChrome.stories-BoS4SUHe.js → LiquidChrome.stories-CgmsyPLg.js} +1 -1
- package/storybook-static/assets/{LiquidEther.stories-UCodzAEW.js → LiquidEther.stories-CKvaP6zm.js} +1 -1
- package/storybook-static/assets/{LoadingSpinner-BMpWXUFz.js → LoadingSpinner-LXRJXAO4.js} +1 -1
- package/storybook-static/assets/{LoadingSpinner.stories-CLXNFf4a.js → LoadingSpinner.stories-C0tbgfV3.js} +1 -1
- package/storybook-static/assets/{MagicRings.stories-Ca5ZNeFQ.js → MagicRings.stories-qzHi78-J.js} +1 -1
- package/storybook-static/assets/{Magnet.stories-BmgRTPng.js → Magnet.stories-QWTKtI1e.js} +1 -1
- package/storybook-static/assets/{MagnetLines.stories-B_HC2JfR.js → MagnetLines.stories-BOaR4PZi.js} +1 -1
- package/storybook-static/assets/{Masonry.stories-CNVeDREe.js → Masonry.stories-DLz9dA8U.js} +1 -1
- package/storybook-static/assets/{MetaBalls.stories-BI_m0HKO.js → MetaBalls.stories-DcleGPI8.js} +1 -1
- package/storybook-static/assets/{MetallicPaint.stories-DJHsg4pJ.js → MetallicPaint.stories-Dqit7nFj.js} +1 -1
- package/storybook-static/assets/{MoodChart.stories-C-XEjygQ.js → MoodChart.stories-1otFXWFu.js} +1 -1
- package/storybook-static/assets/{MotionConfigContext-r05VNYP5.js → MotionConfigContext-HXxMOMJo.js} +1 -1
- package/storybook-static/assets/{Navbar.stories-c2BFGGgH.js → Navbar.stories-BPE4RMdc.js} +1 -1
- package/storybook-static/assets/{Noise.stories-DmNPaVB9.js → Noise.stories-BktPkK5a.js} +1 -1
- package/storybook-static/assets/{NumberStepper-eg4OI2J9.js → NumberStepper-D1to6bpi.js} +1 -1
- package/storybook-static/assets/{NumberStepper.stories-DdaimTPt.js → NumberStepper.stories-WnrisOam.js} +1 -1
- package/storybook-static/assets/{Orb.stories-DYbtXka5.js → Orb.stories-BtZmx5Sy.js} +1 -1
- package/storybook-static/assets/{OrbitImages.stories-C3I2W6Jq.js → OrbitImages.stories-DSTSVc16.js} +1 -1
- package/storybook-static/assets/{PieChart.stories-W3H_ypdq.js → PieChart.stories-L1NRhd_j.js} +1 -1
- package/storybook-static/assets/{PixelBlast.stories-BAGTaJo2.js → PixelBlast.stories-CfT09XYZ.js} +1 -1
- package/storybook-static/assets/{PixelCard.stories-nBZJmNRX.js → PixelCard.stories-B2LTanjI.js} +1 -1
- package/storybook-static/assets/{PixelSnow.stories-DzM9AnhK.js → PixelSnow.stories-Kg0VE4Bc.js} +1 -1
- package/storybook-static/assets/{PixelTransition.stories-B18uEo9_.js → PixelTransition.stories-CeanWE2-.js} +1 -1
- package/storybook-static/assets/{Plasma.stories-FTIEGEjM.js → Plasma.stories-DujATB5Q.js} +1 -1
- package/storybook-static/assets/{Prism.stories-CzsTNjnE.js → Prism.stories-Dxke5JPk.js} +1 -1
- package/storybook-static/assets/{PrismaticBurst.stories-_WZRfTMv.js → PrismaticBurst.stories-xc5NSeNp.js} +1 -1
- package/storybook-static/assets/{ProfileCard.stories-D51iEq3Z.js → ProfileCard.stories-Cnb3pxki.js} +1 -1
- package/storybook-static/assets/{QuantifiableHabitsChart.stories-DYvNt6Sy.js → QuantifiableHabitsChart.stories-BMxWoQO4.js} +1 -1
- package/storybook-static/assets/{Radar.stories-DDRZ17su.js → Radar.stories-CrJcMxjq.js} +1 -1
- package/storybook-static/assets/RecurrencePicker-Bjafom-j.css +1 -0
- package/storybook-static/assets/RecurrencePicker.stories-vkallG9D.js +19 -0
- package/storybook-static/assets/{Ribbons.stories-Cq-wi-5t.js → Ribbons.stories-LT5RgvPo.js} +1 -1
- package/storybook-static/assets/{RippleGrid.stories-DH7NbksB.js → RippleGrid.stories-Bwsl-Ueq.js} +1 -1
- package/storybook-static/assets/{RotatingText.stories-CYXYLq6D.js → RotatingText.stories-CNDJn3v6.js} +1 -1
- package/storybook-static/assets/{ScrollFloat.stories-ByENHbNI.js → ScrollFloat.stories-B0qUJggd.js} +1 -1
- package/storybook-static/assets/{ScrollReveal.stories-C9ML5Vus.js → ScrollReveal.stories-BBVRW0fh.js} +1 -1
- package/storybook-static/assets/{ScrollVelocity.stories-I83W7pTs.js → ScrollVelocity.stories-DfKnOsGa.js} +1 -1
- package/storybook-static/assets/{SearchBar.stories-BGekDZxb.js → SearchBar.stories-Coshf_t6.js} +1 -1
- package/storybook-static/assets/{SearchableDropdown-Dzdyi2XK.js → SearchableDropdown-CC1-QlKh.js} +1 -1
- package/storybook-static/assets/{SearchableDropdown.stories-BpdIXlc0.js → SearchableDropdown.stories-DydVUjWf.js} +1 -1
- package/storybook-static/assets/{SelectInput-BpW7Dnep.js → SelectInput-BqVWIQmb.js} +1 -1
- package/storybook-static/assets/{SelectInput.stories-BSb6s-9V.js → SelectInput.stories-I0azAt7k.js} +1 -1
- package/storybook-static/assets/{ShapeBlur.stories-CTwpIXJ5.js → ShapeBlur.stories-BWBp8nEd.js} +1 -1
- package/storybook-static/assets/{ShapeGrid.stories-D--GPfwE.js → ShapeGrid.stories-DJmnW7fN.js} +1 -1
- package/storybook-static/assets/{ShinyText.stories-BmAOXMEC.js → ShinyText.stories-7vHIqa03.js} +1 -1
- package/storybook-static/assets/{Silk.stories-BYAWqU8r.js → Silk.stories-CXiaINFD.js} +1 -1
- package/storybook-static/assets/SleepChart-DtIKf_2P.css +1 -0
- package/storybook-static/assets/SleepChart.stories-BmAtNTJP.js +58 -0
- package/storybook-static/assets/Slider-BmG0iCoC.js +4 -0
- package/storybook-static/assets/Slider-DrZJBbk1.css +1 -0
- package/storybook-static/assets/Slider.stories-DZciYzwU.js +95 -0
- package/storybook-static/assets/{SoftAurora.stories-Dlak_U90.js → SoftAurora.stories-BubrO6U4.js} +1 -1
- package/storybook-static/assets/{SoundDemo.stories-CMmdiHNZ.js → SoundDemo.stories-CDXr3mFW.js} +1 -1
- package/storybook-static/assets/{SplashCursor.stories-DzWOpCeX.js → SplashCursor.stories-DgMm9xv3.js} +1 -1
- package/storybook-static/assets/{SpotlightCard.stories-CAAJsrlz.js → SpotlightCard.stories-ChPn0jeh.js} +1 -1
- package/storybook-static/assets/{Stack.stories-DVFREV7Y.js → Stack.stories-DzzqOEhy.js} +1 -1
- package/storybook-static/assets/{StaggeredMenu.stories-B7s5XkvQ.js → StaggeredMenu.stories-BNHc0PM6.js} +1 -1
- package/storybook-static/assets/{StarBorder.stories-CQXUiLOv.js → StarBorder.stories-DBGelRYw.js} +1 -1
- package/storybook-static/assets/{SunburstChart.stories-CPxlzoad.js → SunburstChart.stories-KPCIjiOk.js} +1 -1
- package/storybook-static/assets/{Table.stories-BMC7yWxi.js → Table.stories-Bz2NsPvR.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-CdJ6_mbA.js → Tabs.stories-DH8uIATQ.js} +1 -1
- package/storybook-static/assets/{TargetCursor.stories-qa2q01Ir.js → TargetCursor.stories-BUrQiofc.js} +1 -1
- package/storybook-static/assets/{TextArea-DpPHbAJ1.js → TextArea-DVqzGhY3.js} +1 -1
- package/storybook-static/assets/{TextArea.stories-DO6h1f86.js → TextArea.stories-A0YRdcwk.js} +1 -1
- package/storybook-static/assets/{TextCursor.stories-B_P4iCXO.js → TextCursor.stories-B_UinRXa.js} +1 -1
- package/storybook-static/assets/{TextInput-BQKvX1rm.js → TextInput-46C4j_hq.js} +1 -1
- package/storybook-static/assets/{TextInput.stories-CuCM1ZoW.js → TextInput.stories-C7ZC_8wE.js} +1 -1
- package/storybook-static/assets/{TextPressure.stories-3FdKqak4.js → TextPressure.stories-Wwlb-VgV.js} +1 -1
- package/storybook-static/assets/{TextType.stories-B9zMgVXA.js → TextType.stories-DYLMktJi.js} +1 -1
- package/storybook-static/assets/{ThemeSwitcher.stories-MgR7bPEf.js → ThemeSwitcher.stories-8FTV9MJW.js} +1 -1
- package/storybook-static/assets/{Threads.stories-D_AvMoiV.js → Threads.stories-BDwauY1I.js} +1 -1
- package/storybook-static/assets/{TimeInput.stories-DgWeWVJu.js → TimeInput.stories-Bk2lwEyd.js} +1 -1
- package/storybook-static/assets/{Toggle-CM8QfiSr.js → Toggle-BbWuVStR.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-uX1tCiAw.js → Toggle.stories-Bb7-wtRn.js} +1 -1
- package/storybook-static/assets/{ToggleButton-BvyhCvtl.js → ToggleButton-BaLN5DsF.js} +1 -1
- package/storybook-static/assets/{ToggleButton.stories-CL9uYRpB.js → ToggleButton.stories-Cdx8eTPI.js} +1 -1
- package/storybook-static/assets/{TrueFocus.stories-BVd4m_-Q.js → TrueFocus.stories-B_pN3J3c.js} +1 -1
- package/storybook-static/assets/{VariableProximity.stories-ZweoWxGv.js → VariableProximity.stories-BTLVRXWD.js} +1 -1
- package/storybook-static/assets/{Waves.stories-DnXloqCT.js → Waves.stories-_NtAqm6K.js} +1 -1
- package/storybook-static/assets/{calendar--DXe40Mf.js → calendar-jGMMZsgE.js} +1 -1
- package/storybook-static/assets/{chart-column-PgrGrNon.js → chart-column-jT4jlZWv.js} +1 -1
- package/storybook-static/assets/{check-ChmUvqWd.js → check-D_NpTUYB.js} +1 -1
- package/storybook-static/assets/{chevron-down-C6C4ZvBB.js → chevron-down-C40D1TRM.js} +1 -1
- package/storybook-static/assets/{chevron-right-C5SR-lRy.js → chevron-right-pJjQoHt-.js} +1 -1
- package/storybook-static/assets/client-BAyDOFGI.js +1 -0
- package/storybook-static/assets/{createLucideIcon-BG15kzB-.js → createLucideIcon-DhNY7W9i.js} +1 -1
- package/storybook-static/assets/{download-BfgQY4fA.js → download-DDadr76l.js} +1 -1
- package/storybook-static/assets/{folder-Cbvm9nXv.js → folder-Dt06LOrp.js} +1 -1
- package/storybook-static/assets/{iconBase-CeXzlF39.js → iconBase-HFPlWF3A.js} +1 -1
- package/storybook-static/assets/iframe-1P7UMs1C.css +1 -0
- package/storybook-static/assets/{iframe-Cm_EiDwn.js → iframe-rPhsLpUF.js} +3 -3
- package/storybook-static/assets/{index-ULNWitGi.js → index-B9UM6a_o.js} +1 -1
- package/storybook-static/assets/{index-BZSKMuzd.js → index-Ctb6PtgV.js} +1 -1
- package/storybook-static/assets/{index-CsT8MqWO.js → index-DVywRwbF.js} +1 -1
- package/storybook-static/assets/{proxy-Bwjbw6nW.js → proxy-uJ8evSzT.js} +1 -1
- package/storybook-static/assets/{react-18-DgqofcN2.js → react-18-CYoR46z3.js} +1 -1
- package/storybook-static/assets/{react-three-fiber.esm-hrjadSN9.js → react-three-fiber.esm-A61ChP7H.js} +1 -1
- package/storybook-static/assets/{search-BgmZvQ4N.js → search-CIAI1CyG.js} +1 -1
- package/storybook-static/assets/{settings-Byy70ga8.js → settings-en9EIxHx.js} +1 -1
- package/storybook-static/assets/{sun-BqaDfLy6.js → sun-D_CSzOJ1.js} +1 -1
- package/storybook-static/assets/{trash-2-Ceo1MVF-.js → trash-2-C2s-nRjQ.js} +1 -1
- package/storybook-static/assets/{use-animation-frame-XhXswEVQ.js → use-animation-frame-B62vi9Ct.js} +1 -1
- package/storybook-static/assets/{use-in-view-BQr3dSLY.js → use-in-view-BHudJAGG.js} +1 -1
- package/storybook-static/assets/{use-motion-value-C2FYEM9k.js → use-motion-value-jBEsDEvG.js} +1 -1
- package/storybook-static/assets/{use-spring-Nj8eugaF.js → use-spring-Bf02nu3H.js} +1 -1
- package/storybook-static/assets/{use-transform-D5FUFr4K.js → use-transform-Cfp6qWZw.js} +1 -1
- package/storybook-static/assets/{useSound-CZL3WSRL.js → useSound-CISJumm6.js} +1 -1
- package/storybook-static/assets/{users-Copg4Dyi.js → users-Bm-CUW6N.js} +1 -1
- package/storybook-static/assets/{x-CFWk6cjo.js → x-Bb1g_3HM.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/sb-addons/storybook-2/manager-bundle.js +1 -1
- package/storybook-static/assets/SleepChart-CjpdWR_T.css +0 -1
- package/storybook-static/assets/SleepChart.stories-D4Ye-7Q_.js +0 -58
- package/storybook-static/assets/Slider-BfT1m14M.css +0 -1
- package/storybook-static/assets/Slider-Cj9hW0Us.js +0 -4
- package/storybook-static/assets/Slider.stories-BSSPlalx.js +0 -99
- package/storybook-static/assets/client-BtMMXwNO.js +0 -1
- package/storybook-static/assets/iframe-CU5nRRrn.css +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -8,9 +8,10 @@ import { MobileTimePicker } from '@mui/x-date-pickers/MobileTimePicker';
|
|
|
8
8
|
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
|
|
9
9
|
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
|
10
10
|
import { createTheme, ThemeProvider as ThemeProvider$1 } from '@mui/material/styles';
|
|
11
|
+
import { RRule } from 'rrule';
|
|
11
12
|
import * as d3 from 'd3';
|
|
12
13
|
|
|
13
|
-
var styles$
|
|
14
|
+
var styles$C = {"button":"Button-module_button__c6nkW","primary":"Button-module_primary__pMqAs","secondary":"Button-module_secondary__mBWx9","outline":"Button-module_outline__NGGGN","ghost":"Button-module_ghost__u2QBF","danger":"Button-module_danger__2ewhr","icon":"Button-module_icon__JNzlJ","iconLeft":"Button-module_iconLeft__Fpz-y","iconRight":"Button-module_iconRight__kTfjS","small":"Button-module_small__ZI9RX","medium":"Button-module_medium__Wnf9t","large":"Button-module_large__cQCpA","fullWidth":"Button-module_fullWidth__N8vYg","loading":"Button-module_loading__hcSI4","spinner":"Button-module_spinner__HtM96","spin":"Button-module_spin__jblrj"};
|
|
14
15
|
|
|
15
16
|
const SOUND_PACKS = {
|
|
16
17
|
digital: {
|
|
@@ -576,11 +577,11 @@ const Button = ({ variant = 'primary', size = 'medium', fullWidth = false, loadi
|
|
|
576
577
|
const { handlers } = useComponentSound(soundConfig);
|
|
577
578
|
const isIcon = variant === 'icon';
|
|
578
579
|
const buttonClasses = [
|
|
579
|
-
styles$
|
|
580
|
-
styles$
|
|
581
|
-
!isIcon && styles$
|
|
582
|
-
fullWidth && styles$
|
|
583
|
-
loading && styles$
|
|
580
|
+
styles$C.button,
|
|
581
|
+
styles$C[variant],
|
|
582
|
+
!isIcon && styles$C[size],
|
|
583
|
+
fullWidth && styles$C.fullWidth,
|
|
584
|
+
loading && styles$C.loading,
|
|
584
585
|
className
|
|
585
586
|
].filter(Boolean).join(' ');
|
|
586
587
|
const handleClick = (e) => {
|
|
@@ -591,10 +592,10 @@ const Button = ({ variant = 'primary', size = 'medium', fullWidth = false, loadi
|
|
|
591
592
|
handlers.onMouseEnter?.();
|
|
592
593
|
onMouseEnter?.(e);
|
|
593
594
|
};
|
|
594
|
-
return (jsxs(motion.button, { className: buttonClasses, disabled: disabled || loading, whileHover: isIcon ? undefined : { scale: disabled || loading ? 1 : 1.02 }, whileTap: { scale: disabled || loading ? 1 : (isIcon ? 0.9 : 0.98) }, transition: { type: "spring", stiffness: 400, damping: 17 }, onClick: handleClick, onMouseEnter: handleMouseEnter, onFocus: onFocus, ...motionProps, ...rest, children: [loading && jsx("span", { className: styles$
|
|
595
|
+
return (jsxs(motion.button, { className: buttonClasses, disabled: disabled || loading, whileHover: isIcon ? undefined : { scale: disabled || loading ? 1 : 1.02 }, whileTap: { scale: disabled || loading ? 1 : (isIcon ? 0.9 : 0.98) }, transition: { type: "spring", stiffness: 400, damping: 17 }, onClick: handleClick, onMouseEnter: handleMouseEnter, onFocus: onFocus, ...motionProps, ...rest, children: [loading && jsx("span", { className: styles$C.spinner }), iconLeft && jsx("span", { className: styles$C.iconLeft, children: iconLeft }), children, iconRight && jsx("span", { className: styles$C.iconRight, children: iconRight })] }));
|
|
595
596
|
};
|
|
596
597
|
|
|
597
|
-
var styles$
|
|
598
|
+
var styles$B = {"card":"Card-module_card__r2DB2","hoverable":"Card-module_hoverable__X3OpS","elevated":"Card-module_elevated__hGV6-","outlined":"Card-module_outlined__ngRag","flat":"Card-module_flat__xy-xt","glass":"Card-module_glass__Sv-Vs","imageContainer":"Card-module_imageContainer__L4ma6","image":"Card-module_image__bQBt6","header":"Card-module_header__0dtj3","headerContent":"Card-module_headerContent__W7-jD","expandButton":"Card-module_expandButton__I7f49","expandIcon":"Card-module_expandIcon__Lu-OY","expandableContent":"Card-module_expandableContent__BFgO5","expandable":"Card-module_expandable__GMXzo","body":"Card-module_body__K7eL3","footer":"Card-module_footer__L5wO-","title":"Card-module_title__pW9g8","subtitle":"Card-module_subtitle__gejH4","clickable":"Card-module_clickable__Y6fm8","padding":"Card-module_padding__wtyDo","noPadding":"Card-module_noPadding__r5Qq0","loading":"Card-module_loading__S4Wng","loadingShimmer":"Card-module_loadingShimmer__Q1Osr","loadingPulse":"Card-module_loadingPulse__bXQmC"};
|
|
598
599
|
|
|
599
600
|
/**
|
|
600
601
|
* Card Component
|
|
@@ -659,28 +660,28 @@ const Card = ({ variant = 'elevated', hoverable = false, clickable = false, padd
|
|
|
659
660
|
onExpandChange?.(newExpanded);
|
|
660
661
|
};
|
|
661
662
|
const cardClasses = [
|
|
662
|
-
styles$
|
|
663
|
-
styles$
|
|
664
|
-
hoverable && styles$
|
|
665
|
-
clickable && styles$
|
|
666
|
-
!padding && styles$
|
|
667
|
-
expandable && styles$
|
|
663
|
+
styles$B.card,
|
|
664
|
+
styles$B[variant],
|
|
665
|
+
hoverable && styles$B.hoverable,
|
|
666
|
+
clickable && styles$B.clickable,
|
|
667
|
+
!padding && styles$B.noPadding,
|
|
668
|
+
expandable && styles$B.expandable,
|
|
668
669
|
className
|
|
669
670
|
].filter(Boolean).join(' ');
|
|
670
671
|
const renderHeader = () => {
|
|
671
672
|
if (header) {
|
|
672
|
-
return (jsxs("div", { className: styles$
|
|
673
|
+
return (jsxs("div", { className: styles$B.header, children: [jsx("div", { className: styles$B.headerContent, children: header }), expandable && (jsx("button", { className: styles$B.expandButton, onClick: handleToggleExpand, "aria-label": isExpanded ? 'Collapse card' : 'Expand card', children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: styles$B.expandIcon, style: { transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)' }, children: jsx("path", { d: "M6 9l6 6 6-6" }) }) }))] }));
|
|
673
674
|
}
|
|
674
675
|
if (title || subtitle) {
|
|
675
|
-
return (jsxs("div", { className: styles$
|
|
676
|
+
return (jsxs("div", { className: styles$B.header, children: [jsxs("div", { className: styles$B.headerContent, children: [title && jsx("h3", { className: styles$B.title, children: title }), subtitle && jsx("p", { className: styles$B.subtitle, children: subtitle })] }), expandable && (jsx("button", { className: styles$B.expandButton, onClick: handleToggleExpand, "aria-label": isExpanded ? 'Collapse card' : 'Expand card', children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: styles$B.expandIcon, style: { transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)' }, children: jsx("path", { d: "M6 9l6 6 6-6" }) }) }))] }));
|
|
676
677
|
}
|
|
677
678
|
return null;
|
|
678
679
|
};
|
|
679
|
-
const cardContent = (jsxs(Fragment, { children: [image && (jsx("div", { className: styles$
|
|
680
|
+
const cardContent = (jsxs(Fragment, { children: [image && (jsx("div", { className: styles$B.imageContainer, children: jsx("img", { src: image, alt: imageAlt, className: styles$B.image }) })), renderHeader(), jsx(AnimatePresence, { initial: false, children: (!expandable || isExpanded) && (jsxs(motion.div, { initial: expandable ? { height: 0, opacity: 0 } : undefined, animate: expandable ? { height: 'auto', opacity: 1 } : undefined, exit: expandable ? { height: 0, opacity: 0 } : undefined, transition: { duration: 0.3, ease: "easeInOut" }, className: styles$B.expandableContent, children: [children && (jsx("div", { className: padding ? styles$B.body : undefined, children: children })), footer && jsx("div", { className: styles$B.footer, children: footer })] }, "content")) })] }));
|
|
680
681
|
return (jsx(motion.div, { className: cardClasses, onClick: clickable ? onClick : undefined, whileHover: hoverable ? { y: -4 } : undefined, transition: { type: "spring", stiffness: 400, damping: 17 }, ...motionProps, ...rest, children: cardContent }));
|
|
681
682
|
};
|
|
682
683
|
|
|
683
|
-
var styles$
|
|
684
|
+
var styles$A = {"wrapper":"EmptyState-module_wrapper__h3Y2E","compact":"EmptyState-module_compact__HdYu1","default":"EmptyState-module_default__ACAbn","large":"EmptyState-module_large__H3ELo","icon":"EmptyState-module_icon__i7-3M","title":"EmptyState-module_title__xCyfH","message":"EmptyState-module_message__Bc5xK","action":"EmptyState-module_action__UpnvZ"};
|
|
684
685
|
|
|
685
686
|
/**
|
|
686
687
|
* EmptyState Component
|
|
@@ -717,11 +718,11 @@ var styles$z = {"wrapper":"EmptyState-module_wrapper__h3Y2E","compact":"EmptySta
|
|
|
717
718
|
* @returns {JSX.Element} The rendered EmptyState component
|
|
718
719
|
*/
|
|
719
720
|
const EmptyState = ({ icon, title, message, action, size = 'default', }) => {
|
|
720
|
-
const wrapperClass = [styles$
|
|
721
|
-
return (jsxs("div", { className: wrapperClass, children: [icon && jsx("div", { className: styles$
|
|
721
|
+
const wrapperClass = [styles$A.wrapper, styles$A[size]].filter(Boolean).join(' ');
|
|
722
|
+
return (jsxs("div", { className: wrapperClass, children: [icon && jsx("div", { className: styles$A.icon, children: icon }), title && jsx("h3", { className: styles$A.title, children: title }), jsx("p", { className: styles$A.message, children: message }), action && jsx("div", { className: styles$A.action, children: action })] }));
|
|
722
723
|
};
|
|
723
724
|
|
|
724
|
-
var styles$
|
|
725
|
+
var styles$z = {"backdrop":"Modal-module_backdrop__yOx-a","dialog":"Modal-module_dialog__yEXTq","dialogCompact":"Modal-module_dialogCompact__z1Wxp","dialogWide":"Modal-module_dialogWide__9PTXK","header":"Modal-module_header__NHHKd","title":"Modal-module_title__i3R0x","headerActions":"Modal-module_headerActions__g28UN","closeButton":"Modal-module_closeButton__siC-1","body":"Modal-module_body__U7jvM","bodyFlush":"Modal-module_bodyFlush__wtk3q","backdropSheet":"Modal-module_backdropSheet__o9kW3","dialogSheet":"Modal-module_dialogSheet__EjpwP","grabBar":"Modal-module_grabBar__qhl9f"};
|
|
725
726
|
|
|
726
727
|
const MOBILE_BREAKPOINT = '(max-width: 640px)';
|
|
727
728
|
const useIsMobile = () => {
|
|
@@ -758,14 +759,14 @@ const Modal = ({ open, title, onClose, children, size = 'default', actions, padd
|
|
|
758
759
|
return null;
|
|
759
760
|
const isSheet = mobileVariant === 'sheet' && isMobile;
|
|
760
761
|
const isDraggable = isSheet && draggable;
|
|
761
|
-
const backdropClass = [styles$
|
|
762
|
+
const backdropClass = [styles$z.backdrop, isSheet && styles$z.backdropSheet]
|
|
762
763
|
.filter(Boolean)
|
|
763
764
|
.join(' ');
|
|
764
765
|
const dialogClass = [
|
|
765
|
-
styles$
|
|
766
|
-
size === 'compact' && styles$
|
|
767
|
-
size === 'wide' && styles$
|
|
768
|
-
isSheet && styles$
|
|
766
|
+
styles$z.dialog,
|
|
767
|
+
size === 'compact' && styles$z.dialogCompact,
|
|
768
|
+
size === 'wide' && styles$z.dialogWide,
|
|
769
|
+
isSheet && styles$z.dialogSheet,
|
|
769
770
|
]
|
|
770
771
|
.filter(Boolean)
|
|
771
772
|
.join(' ');
|
|
@@ -781,16 +782,16 @@ const Modal = ({ open, title, onClose, children, size = 'default', actions, padd
|
|
|
781
782
|
: { duration: 0.15, ease: 'easeOut' }, onClick: (e) => e.stopPropagation(), drag: isDraggable ? 'y' : false, dragControls: isDraggable ? dragControls : undefined, dragConstraints: { top: 0 }, dragElastic: { top: 0, bottom: 0.3 }, dragListener: false, onDragEnd: (_, info) => {
|
|
782
783
|
if (info.offset.y > 80)
|
|
783
784
|
onClose();
|
|
784
|
-
}, children: [isSheet && jsx("div", { className: styles$
|
|
785
|
+
}, children: [isSheet && jsx("div", { className: styles$z.grabBar }), jsxs("div", { ref: headerRef, className: styles$z.header, onPointerDown: (e) => {
|
|
785
786
|
if (!isDraggable)
|
|
786
787
|
return;
|
|
787
788
|
if (e.target.closest('button'))
|
|
788
789
|
return;
|
|
789
790
|
dragControls.start(e);
|
|
790
|
-
}, children: [jsx("span", { className: styles$
|
|
791
|
+
}, children: [jsx("span", { className: styles$z.title, children: title }), actions && jsx("div", { className: styles$z.headerActions, children: actions }), jsx("button", { className: styles$z.closeButton, onClick: onClose, "aria-label": "Close modal", type: "button", children: jsx(X, { size: 16 }) })] }), jsx("div", { className: padding ? styles$z.body : styles$z.bodyFlush, children: children })] }) })) }), document.body);
|
|
791
792
|
};
|
|
792
793
|
|
|
793
|
-
var styles$
|
|
794
|
+
var styles$y = {"checkboxLabel":"Checkbox-module_checkboxLabel__4tBVg","checkbox":"Checkbox-module_checkbox__BbJul","checkboxText":"Checkbox-module_checkboxText__oJsc9"};
|
|
794
795
|
|
|
795
796
|
/**
|
|
796
797
|
* Checkbox component - Modern interactive checkbox with animations
|
|
@@ -835,13 +836,13 @@ const Checkbox = ({ checked, onChange, label, disabled = false, indeterminate =
|
|
|
835
836
|
checkboxRef.current.indeterminate = indeterminate;
|
|
836
837
|
}
|
|
837
838
|
}, [indeterminate]);
|
|
838
|
-
return (jsxs("label", { className: styles$
|
|
839
|
+
return (jsxs("label", { className: styles$y.checkboxLabel, children: [jsx("input", { ref: checkboxRef, type: "checkbox", checked: checked, onChange: (e) => {
|
|
839
840
|
const isChecked = e.target.checked;
|
|
840
841
|
onChange(isChecked);
|
|
841
842
|
if (soundConfig?.onClick !== false) {
|
|
842
843
|
playSound('toggle');
|
|
843
844
|
}
|
|
844
|
-
}, className: styles$
|
|
845
|
+
}, className: styles$y.checkbox, disabled: disabled, id: id, name: name, value: value, "aria-checked": indeterminate ? 'mixed' : checked }), label && jsx("span", { className: styles$y.checkboxText, children: label })] }));
|
|
845
846
|
};
|
|
846
847
|
|
|
847
848
|
const formatDateToEuropean = (date) => {
|
|
@@ -872,7 +873,7 @@ const parseEuropeanDate = (dateString) => {
|
|
|
872
873
|
return '';
|
|
873
874
|
};
|
|
874
875
|
|
|
875
|
-
var styles$
|
|
876
|
+
var styles$x = {"dateInput":"DateInput-module_dateInput__54VPD","label":"DateInput-module_label__yDdUw","inputWrapper":"DateInput-module_inputWrapper__x-r1d","textInput":"DateInput-module_textInput__ToOSX","calendarButton":"DateInput-module_calendarButton__JzDGD","nativeDateInput":"DateInput-module_nativeDateInput__tbi68","error":"DateInput-module_error__ieuPO","success":"DateInput-module_success__rPA93","loading":"DateInput-module_loading__1DAmD"};
|
|
876
877
|
|
|
877
878
|
/**
|
|
878
879
|
* DateInput component - European format date picker with manual input support
|
|
@@ -932,21 +933,21 @@ function DateInput({ label, value, onChange, placeholder = "25/12/2024", onFocus
|
|
|
932
933
|
}
|
|
933
934
|
};
|
|
934
935
|
const getClassName = () => {
|
|
935
|
-
const classes = [styles$
|
|
936
|
+
const classes = [styles$x.dateInput];
|
|
936
937
|
if (error)
|
|
937
|
-
classes.push(styles$
|
|
938
|
+
classes.push(styles$x.error);
|
|
938
939
|
if (success)
|
|
939
|
-
classes.push(styles$
|
|
940
|
+
classes.push(styles$x.success);
|
|
940
941
|
if (loading)
|
|
941
|
-
classes.push(styles$
|
|
942
|
+
classes.push(styles$x.loading);
|
|
942
943
|
return classes.join(' ');
|
|
943
944
|
};
|
|
944
945
|
// Current ISO value for the native date input (or '' if empty/unparseable)
|
|
945
946
|
const isoValue = value.includes('-') ? value : (parseEuropeanDate(value) || '');
|
|
946
|
-
return (jsxs("div", { className: getClassName(), children: [jsx("label", { className: styles$
|
|
947
|
+
return (jsxs("div", { className: getClassName(), children: [jsx("label", { className: styles$x.label, children: label }), jsxs("div", { className: styles$x.inputWrapper, children: [jsx("input", { type: "text", value: value.includes('-') ? formatDateToEuropean(value) : value, onChange: (e) => handleTextChange(e.target.value), onFocus: onFocus, onBlur: onBlur, placeholder: placeholder, className: styles$x.textInput, disabled: disabled || loading, ...handlers }), jsxs("span", { className: styles$x.calendarButton, "aria-hidden": "true", children: [jsx(Calendar$1, {}), jsx("input", { type: "date", value: isoValue, onChange: handleCalendarChange, className: styles$x.nativeDateInput, title: "Select date from calendar", "aria-label": label ? `${label} calendar picker` : 'Calendar picker', disabled: disabled || loading })] })] })] }));
|
|
947
948
|
}
|
|
948
949
|
|
|
949
|
-
var styles$
|
|
950
|
+
var styles$w = {"searchableDropdown":"SearchableDropdown-module_searchableDropdown__S2Nh5","dropdownTrigger":"SearchableDropdown-module_dropdownTrigger__dihdr","open":"SearchableDropdown-module_open__P7mRt","dropdownValue":"SearchableDropdown-module_dropdownValue__ydrc2","placeholder":"SearchableDropdown-module_placeholder__BwM2W","dropdownArrow":"SearchableDropdown-module_dropdownArrow__yd5fp","dropdownMenu":"SearchableDropdown-module_dropdownMenu__2Z5cc","dropdownSearch":"SearchableDropdown-module_dropdownSearch__NRk7j","searchInput":"SearchableDropdown-module_searchInput__VS2Hw","searchIcon":"SearchableDropdown-module_searchIcon__2vKFF","dropdownOptions":"SearchableDropdown-module_dropdownOptions__6YXqF","dropdownOption":"SearchableDropdown-module_dropdownOption__YwDr-","selected":"SearchableDropdown-module_selected__31JeB","highlighted":"SearchableDropdown-module_highlighted__P0bBq","checkIcon":"SearchableDropdown-module_checkIcon__YxowK","dropdownNoResults":"SearchableDropdown-module_dropdownNoResults__WW-Da","loading":"SearchableDropdown-module_loading__xlYf0"};
|
|
950
951
|
|
|
951
952
|
/**
|
|
952
953
|
* SearchableDropdown component - Modern filterable dropdown with animations
|
|
@@ -1051,23 +1052,23 @@ function SearchableDropdown({ label, value, onChange, options, placeholder = "Se
|
|
|
1051
1052
|
}
|
|
1052
1053
|
};
|
|
1053
1054
|
const getTriggerClassName = () => {
|
|
1054
|
-
const classes = [styles$
|
|
1055
|
+
const classes = [styles$w.dropdownTrigger];
|
|
1055
1056
|
if (isOpen)
|
|
1056
|
-
classes.push(styles$
|
|
1057
|
+
classes.push(styles$w.open);
|
|
1057
1058
|
if (loading)
|
|
1058
|
-
classes.push(styles$
|
|
1059
|
+
classes.push(styles$w.loading);
|
|
1059
1060
|
if (error)
|
|
1060
|
-
classes.push(styles$
|
|
1061
|
+
classes.push(styles$w.error);
|
|
1061
1062
|
return classes.join(' ');
|
|
1062
1063
|
};
|
|
1063
|
-
return (jsxs("div", { className: styles$
|
|
1064
|
+
return (jsxs("div", { className: styles$w.searchableDropdown, ref: dropdownRef, onKeyDown: handleKeyDown, children: [jsx("label", { children: label }), jsxs(motion.button, { type: "button", className: getTriggerClassName(), onClick: () => !disabled && !loading && setIsOpen(!isOpen), whileTap: { scale: disabled ? 1 : 0.98 }, style: { willChange: 'transform' }, disabled: disabled, children: [jsx("span", { className: `${styles$w.dropdownValue} ${!displayValue ? styles$w.placeholder : ''}`, children: displayValue || placeholder }), jsx(ChevronDown, { className: styles$w.dropdownArrow })] }), jsx(AnimatePresence, { children: isOpen && (jsxs(motion.div, { className: styles$w.dropdownMenu, initial: { opacity: 0, y: -10, scale: 0.95 }, animate: { opacity: 1, y: 0, scale: 1 }, exit: { opacity: 0, y: -10, scale: 0.95 }, transition: { duration: 0.2, ease: "easeOut" }, children: [jsxs("div", { className: styles$w.dropdownSearch, children: [jsx(Search, { className: styles$w.searchIcon }), jsx("input", { ref: inputRef, type: "text", className: styles$w.searchInput, placeholder: "Cerca...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), onClick: (e) => e.stopPropagation() })] }), jsxs("div", { className: styles$w.dropdownOptions, children: [allOptions.map((opt, index) => {
|
|
1064
1065
|
const isSelected = value === opt.value;
|
|
1065
1066
|
const isHighlighted = highlightedIndex === index;
|
|
1066
|
-
return (jsxs(motion.button, { type: "button", className: `${styles$
|
|
1067
|
-
}), allOptions.length === 0 && (jsx(motion.div, { className: styles$
|
|
1067
|
+
return (jsxs(motion.button, { type: "button", className: `${styles$w.dropdownOption} ${isSelected ? styles$w.selected : ''} ${isHighlighted ? styles$w.highlighted : ''}`, onClick: () => handleSelect(opt.value), onMouseEnter: () => setHighlightedIndex(index), initial: { opacity: 0, x: -20 }, animate: { opacity: 1, x: 0 }, transition: { delay: index * 0.02 }, whileTap: { scale: 0.98 }, style: { willChange: 'transform' }, children: [jsx("span", { children: opt.label }), isSelected && jsx(Check, { className: styles$w.checkIcon })] }, `${opt.value}-${index}`));
|
|
1068
|
+
}), allOptions.length === 0 && (jsx(motion.div, { className: styles$w.dropdownNoResults, initial: { opacity: 0 }, animate: { opacity: 1 }, children: "No results found" }))] })] })) })] }));
|
|
1068
1069
|
}
|
|
1069
1070
|
|
|
1070
|
-
var styles$
|
|
1071
|
+
var styles$v = {"selectInput":"SelectInput-module_selectInput__s6zEg","selectWrapper":"SelectInput-module_selectWrapper__Qr4pl","selectIcon":"SelectInput-module_selectIcon__9pjhf","error":"SelectInput-module_error__3WNJc","success":"SelectInput-module_success__WJ5ga","loading":"SelectInput-module_loading__n35N9"};
|
|
1071
1072
|
|
|
1072
1073
|
/**
|
|
1073
1074
|
* SelectInput component - Styled dropdown selector with flexible option format
|
|
@@ -1105,26 +1106,26 @@ var styles$u = {"selectInput":"SelectInput-module_selectInput__s6zEg","selectWra
|
|
|
1105
1106
|
function SelectInput({ label, value, onChange, options, placeholder = "Select...", disabled = false, error = false, success = false, loading = false, required = false, soundConfig, className }) {
|
|
1106
1107
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1107
1108
|
const getClassName = () => {
|
|
1108
|
-
const classes = [styles$
|
|
1109
|
+
const classes = [styles$v.selectInput];
|
|
1109
1110
|
if (error)
|
|
1110
|
-
classes.push(styles$
|
|
1111
|
+
classes.push(styles$v.error);
|
|
1111
1112
|
if (success)
|
|
1112
|
-
classes.push(styles$
|
|
1113
|
+
classes.push(styles$v.success);
|
|
1113
1114
|
if (loading)
|
|
1114
|
-
classes.push(styles$
|
|
1115
|
+
classes.push(styles$v.loading);
|
|
1115
1116
|
return classes.join(' ');
|
|
1116
1117
|
};
|
|
1117
|
-
return (jsxs("div", { className: `${getClassName()}${className ? ` ${className}` : ''}`, children: [jsxs("label", { children: [label, required && jsx("span", { style: { color: 'var(--color-error)' }, children: " *" })] }), jsxs("div", { className: styles$
|
|
1118
|
+
return (jsxs("div", { className: `${getClassName()}${className ? ` ${className}` : ''}`, children: [jsxs("label", { children: [label, required && jsx("span", { style: { color: 'var(--color-error)' }, children: " *" })] }), jsxs("div", { className: styles$v.selectWrapper, children: [jsxs("select", { value: value, onChange: e => {
|
|
1118
1119
|
playSound('click');
|
|
1119
1120
|
onChange(e.target.value);
|
|
1120
1121
|
}, disabled: disabled || loading, required: required, ...handlers, children: [jsx("option", { value: "", children: placeholder }), options.map(opt => {
|
|
1121
1122
|
const optionValue = typeof opt === 'string' ? opt : opt.value;
|
|
1122
1123
|
const optionLabel = typeof opt === 'string' ? opt : opt.label;
|
|
1123
1124
|
return (jsx("option", { value: optionValue, children: optionLabel }, optionValue));
|
|
1124
|
-
})] }), jsx(ChevronDown, { className: styles$
|
|
1125
|
+
})] }), jsx(ChevronDown, { className: styles$v.selectIcon })] })] }));
|
|
1125
1126
|
}
|
|
1126
1127
|
|
|
1127
|
-
var styles$
|
|
1128
|
+
var styles$u = {"textareaContainer":"TextArea-module_textareaContainer__AquFj","compact":"TextArea-module_compact__U5lPn","textareaLabel":"TextArea-module_textareaLabel__7Vmyx","requiredIndicator":"TextArea-module_requiredIndicator__3Fxyy","textareaInput":"TextArea-module_textareaInput__VCDZA","characterCount":"TextArea-module_characterCount__9FO5N","nearLimit":"TextArea-module_nearLimit__cUdnw","atLimit":"TextArea-module_atLimit__GoWCC","error":"TextArea-module_error__ciHgb","success":"TextArea-module_success__a0-xD","loading":"TextArea-module_loading__CSFBR","focusMode":"TextArea-module_focusMode__9A8U-"};
|
|
1128
1129
|
|
|
1129
1130
|
/**
|
|
1130
1131
|
* TextArea component - Multi-line text input with character counting
|
|
@@ -1159,38 +1160,38 @@ var styles$t = {"textareaContainer":"TextArea-module_textareaContainer__AquFj","
|
|
|
1159
1160
|
function TextArea({ label, value, onChange, rows = 5, placeholder = "", required = false, maxLength, disabled = false, error = false, success = false, loading = false, focusMode = false, compact = false, className = "" }) {
|
|
1160
1161
|
const textareaId = `textarea-${Math.random().toString(36).substr(2, 9)}`;
|
|
1161
1162
|
const getContainerClassName = () => {
|
|
1162
|
-
const classes = [styles$
|
|
1163
|
+
const classes = [styles$u.textareaContainer];
|
|
1163
1164
|
if (error)
|
|
1164
|
-
classes.push(styles$
|
|
1165
|
+
classes.push(styles$u.error);
|
|
1165
1166
|
if (success)
|
|
1166
|
-
classes.push(styles$
|
|
1167
|
+
classes.push(styles$u.success);
|
|
1167
1168
|
if (loading)
|
|
1168
|
-
classes.push(styles$
|
|
1169
|
+
classes.push(styles$u.loading);
|
|
1169
1170
|
if (focusMode)
|
|
1170
|
-
classes.push(styles$
|
|
1171
|
+
classes.push(styles$u.focusMode);
|
|
1171
1172
|
if (compact)
|
|
1172
|
-
classes.push(styles$
|
|
1173
|
+
classes.push(styles$u.compact);
|
|
1173
1174
|
if (className)
|
|
1174
1175
|
classes.push(className);
|
|
1175
1176
|
return classes.join(' ');
|
|
1176
1177
|
};
|
|
1177
1178
|
const getCharCountClassName = () => {
|
|
1178
1179
|
if (!maxLength)
|
|
1179
|
-
return styles$
|
|
1180
|
-
const classes = [styles$
|
|
1180
|
+
return styles$u.characterCount;
|
|
1181
|
+
const classes = [styles$u.characterCount];
|
|
1181
1182
|
const percentage = (value.length / maxLength) * 100;
|
|
1182
1183
|
if (percentage >= 100) {
|
|
1183
|
-
classes.push(styles$
|
|
1184
|
+
classes.push(styles$u.atLimit);
|
|
1184
1185
|
}
|
|
1185
1186
|
else if (percentage >= 80) {
|
|
1186
|
-
classes.push(styles$
|
|
1187
|
+
classes.push(styles$u.nearLimit);
|
|
1187
1188
|
}
|
|
1188
1189
|
return classes.join(' ');
|
|
1189
1190
|
};
|
|
1190
|
-
return (jsxs("div", { className: getContainerClassName(), children: [label && (jsxs("label", { htmlFor: textareaId, className: styles$
|
|
1191
|
+
return (jsxs("div", { className: getContainerClassName(), children: [label && (jsxs("label", { htmlFor: textareaId, className: styles$u.textareaLabel, children: [label, required && jsx("span", { className: styles$u.requiredIndicator, children: "*" })] })), jsx("textarea", { id: textareaId, value: value, onChange: (e) => onChange(e.target.value), rows: rows, placeholder: placeholder, maxLength: maxLength, className: styles$u.textareaInput, "aria-required": required, disabled: disabled || loading, "aria-invalid": error }), maxLength && (jsxs("div", { className: getCharCountClassName(), children: [jsx("span", { children: value.length }), jsx("span", { style: { opacity: 0.7 }, children: " / " }), jsx("span", { children: maxLength })] }))] }));
|
|
1191
1192
|
}
|
|
1192
1193
|
|
|
1193
|
-
var styles$
|
|
1194
|
+
var styles$t = {"textInput":"TextInput-module_textInput__b2LVM","required":"TextInput-module_required__7uLiM","inputError":"TextInput-module_inputError__QD0a-","errorMessage":"TextInput-module_errorMessage__nIDoQ","success":"TextInput-module_success__KbSS3","loading":"TextInput-module_loading__qXaca","withIcon":"TextInput-module_withIcon__-8swm","inputIcon":"TextInput-module_inputIcon__B4czN","withAction":"TextInput-module_withAction__JD3ku","actionButton":"TextInput-module_actionButton__zFJel"};
|
|
1194
1195
|
|
|
1195
1196
|
/**
|
|
1196
1197
|
* TextInput component - A versatile text input field with label and error handling
|
|
@@ -1227,21 +1228,21 @@ function TextInput({ label, value, onChange, type = "text", onBlur, placeholder,
|
|
|
1227
1228
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1228
1229
|
const prevValueRef = React.useRef(value);
|
|
1229
1230
|
const getContainerClassName = () => {
|
|
1230
|
-
const classes = [styles$
|
|
1231
|
+
const classes = [styles$t.textInput];
|
|
1231
1232
|
if (success)
|
|
1232
|
-
classes.push(styles$
|
|
1233
|
+
classes.push(styles$t.success);
|
|
1233
1234
|
if (loading)
|
|
1234
|
-
classes.push(styles$
|
|
1235
|
+
classes.push(styles$t.loading);
|
|
1235
1236
|
if (icon)
|
|
1236
|
-
classes.push(styles$
|
|
1237
|
+
classes.push(styles$t.withIcon);
|
|
1237
1238
|
if (actionButton)
|
|
1238
|
-
classes.push(styles$
|
|
1239
|
+
classes.push(styles$t.withAction);
|
|
1239
1240
|
return classes.join(' ');
|
|
1240
1241
|
};
|
|
1241
1242
|
React.useEffect(() => {
|
|
1242
1243
|
prevValueRef.current = value;
|
|
1243
1244
|
}, [value]);
|
|
1244
|
-
return (jsxs("div", { className: getContainerClassName(), children: [jsxs("label", { htmlFor: inputId, children: [label, required && jsx("span", { className: styles$
|
|
1245
|
+
return (jsxs("div", { className: getContainerClassName(), children: [jsxs("label", { htmlFor: inputId, children: [label, required && jsx("span", { className: styles$t.required, children: "*" })] }), jsxs("div", { style: { position: 'relative' }, children: [icon && jsx("div", { className: styles$t.inputIcon, children: icon }), jsx("input", { id: inputId, type: type, value: value, onChange: (e) => {
|
|
1245
1246
|
const newValue = e.target.value;
|
|
1246
1247
|
const oldValue = prevValueRef.current;
|
|
1247
1248
|
onChange(newValue);
|
|
@@ -1257,13 +1258,13 @@ function TextInput({ label, value, onChange, type = "text", onBlur, placeholder,
|
|
|
1257
1258
|
if (error && soundConfig?.onError) {
|
|
1258
1259
|
playSound(typeof soundConfig.onError === 'string' ? soundConfig.onError : 'error');
|
|
1259
1260
|
}
|
|
1260
|
-
}, onBlur: onBlur, placeholder: placeholder, className: error ? styles$
|
|
1261
|
+
}, onBlur: onBlur, placeholder: placeholder, className: error ? styles$t.inputError : '', "aria-invalid": !!error, "aria-describedby": error ? `${inputId}-error` : undefined, disabled: disabled || loading, maxLength: maxLength, autoComplete: autoComplete }), actionButton && (jsx("button", { type: "button", className: styles$t.actionButton, onClick: () => {
|
|
1261
1262
|
handlers.onClick?.();
|
|
1262
1263
|
actionButton.onClick();
|
|
1263
|
-
}, disabled: disabled || loading, children: actionButton.label }))] }), error && (jsx("span", { id: `${inputId}-error`, className: styles$
|
|
1264
|
+
}, disabled: disabled || loading, children: actionButton.label }))] }), error && (jsx("span", { id: `${inputId}-error`, className: styles$t.errorMessage, children: error }))] }));
|
|
1264
1265
|
}
|
|
1265
1266
|
|
|
1266
|
-
var styles$
|
|
1267
|
+
var styles$s = {"toggleContainer":"Toggle-module_toggleContainer__QxqQb","toggleButton":"Toggle-module_toggleButton__WUUf-","active":"Toggle-module_active__fX6Io"};
|
|
1267
1268
|
|
|
1268
1269
|
/**
|
|
1269
1270
|
* Toggle Component
|
|
@@ -1324,7 +1325,7 @@ function Toggle(props) {
|
|
|
1324
1325
|
justifyContent: 'center',
|
|
1325
1326
|
...style
|
|
1326
1327
|
};
|
|
1327
|
-
return (jsxs("div", { className: `${styles$
|
|
1328
|
+
return (jsxs("div", { className: `${styles$s.toggleContainer} ${className || ''}`, children: [jsxs(motion.button, { ref: leftButtonRef, className: `${styles$s.toggleButton} ${!isOn ? styles$s.active : ''}`, whileHover: { scale: 1.05 }, whileTap: { scale: 0.95 }, transition: { type: "spring", stiffness: 400, damping: 17 }, onClick: () => {
|
|
1328
1329
|
if (!isOn) {
|
|
1329
1330
|
// Already on left
|
|
1330
1331
|
if (enableCelebration) {
|
|
@@ -1339,7 +1340,7 @@ function Toggle(props) {
|
|
|
1339
1340
|
playSound('toggle');
|
|
1340
1341
|
}
|
|
1341
1342
|
onToggle(false);
|
|
1342
|
-
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsx(motion.div, { animate: { scale: !isOn ? 1.1 : 1, rotate: !isOn ? [0, -5, 5, 0] : 0 }, transition: { duration: 0.3 }, children: leftIcon }), leftLabel] }), jsxs(motion.button, { ref: rightButtonRef, className: `${styles$
|
|
1343
|
+
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsx(motion.div, { animate: { scale: !isOn ? 1.1 : 1, rotate: !isOn ? [0, -5, 5, 0] : 0 }, transition: { duration: 0.3 }, children: leftIcon }), leftLabel] }), jsxs(motion.button, { ref: rightButtonRef, className: `${styles$s.toggleButton} ${isOn ? styles$s.active : ''}`, whileHover: { scale: 1.05 }, whileTap: { scale: 0.95 }, transition: { type: "spring", stiffness: 400, damping: 17 }, onClick: () => {
|
|
1343
1344
|
if (isOn) {
|
|
1344
1345
|
// Already on right
|
|
1345
1346
|
if (enableCelebration) {
|
|
@@ -1357,7 +1358,7 @@ function Toggle(props) {
|
|
|
1357
1358
|
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsx(motion.div, { animate: { scale: isOn ? 1.1 : 1, rotate: isOn ? [0, 5, -5, 0] : 0 }, transition: { duration: 0.3 }, children: rightIcon }), rightLabel] })] }));
|
|
1358
1359
|
}
|
|
1359
1360
|
|
|
1360
|
-
var styles$
|
|
1361
|
+
var styles$r = {"container":"NumberStepper-module_container__WSGlU","header":"NumberStepper-module_header__qXI1Y","icon":"NumberStepper-module_icon__vHgsw","label":"NumberStepper-module_label__AYr3g","stepper":"NumberStepper-module_stepper__oQhTp","disabled":"NumberStepper-module_disabled__kGB-g","button":"NumberStepper-module_button__YcjRt","buttonIcon":"NumberStepper-module_buttonIcon__odXec","valueContainer":"NumberStepper-module_valueContainer__87w2D","valueWrapper":"NumberStepper-module_valueWrapper__TH65N","value":"NumberStepper-module_value__BxJeD","limits":"NumberStepper-module_limits__-UrRE","limit":"NumberStepper-module_limit__7nbIP","small":"NumberStepper-module_small__P-k96","large":"NumberStepper-module_large__Lz6lk","outlined":"NumberStepper-module_outlined__CIXv7","filled":"NumberStepper-module_filled__IxOg-","minimal":"NumberStepper-module_minimal__y47-W","custom":"NumberStepper-module_custom__XGSVg","vertical":"NumberStepper-module_vertical__nBcL7","tally":"NumberStepper-module_tally__aO2zq","tallyRow":"NumberStepper-module_tallyRow__wcrtj","tallyButton":"NumberStepper-module_tallyButton__EUTXY","tallyButtonIcon":"NumberStepper-module_tallyButtonIcon__A3fDQ","tallyIcon":"NumberStepper-module_tallyIcon__ynB4C","tallyLabel":"NumberStepper-module_tallyLabel__kjXos","tallyBody":"NumberStepper-module_tallyBody__wDBsU","tallyMarks":"NumberStepper-module_tallyMarks__RU5qJ","tallyGroup":"NumberStepper-module_tallyGroup__0qUNo","tallyHint":"NumberStepper-module_tallyHint__zi-GM","tallyValue":"NumberStepper-module_tallyValue__CFJDk","pulse":"NumberStepper-module_pulse__51oUo"};
|
|
1361
1362
|
|
|
1362
1363
|
/**
|
|
1363
1364
|
* NumberStepper Component
|
|
@@ -1544,33 +1545,33 @@ const NumberStepper = ({ value, onChange, min = -Infinity, max = Infinity, step
|
|
|
1544
1545
|
setDisplayValue(finalValue);
|
|
1545
1546
|
}, [displayValue, min, max, step, onChange]);
|
|
1546
1547
|
const containerClasses = [
|
|
1547
|
-
styles$
|
|
1548
|
-
styles$
|
|
1549
|
-
styles$
|
|
1550
|
-
layout === 'vertical' && styles$
|
|
1551
|
-
disabled && styles$
|
|
1548
|
+
styles$r.container,
|
|
1549
|
+
styles$r[size],
|
|
1550
|
+
styles$r[variant],
|
|
1551
|
+
layout === 'vertical' && styles$r.vertical,
|
|
1552
|
+
disabled && styles$r.disabled,
|
|
1552
1553
|
className
|
|
1553
1554
|
].filter(Boolean).join(' ');
|
|
1554
1555
|
// Merge custom styles with hover states
|
|
1555
1556
|
const [isButtonHovered, setIsButtonHovered] = useState(null);
|
|
1556
1557
|
const isDecrementDisabled = disabled || value <= min;
|
|
1557
1558
|
const isIncrementDisabled = disabled || value >= max;
|
|
1558
|
-
const stepperContent = (jsxs("div", { className: styles$
|
|
1559
|
+
const stepperContent = (jsxs("div", { className: styles$r.stepper, style: customStyles.stepper, onKeyDown: handleKeyDown, tabIndex: disabled ? -1 : 0, ...handlers, children: [jsx(motion.button, { className: styles$r.button, style: {
|
|
1559
1560
|
...customStyles.button,
|
|
1560
1561
|
...(isButtonHovered === 'decrement' && customStyles.buttonHover)
|
|
1561
|
-
}, onMouseEnter: () => setIsButtonHovered('decrement'), onMouseLeave: () => setIsButtonHovered(null), onClick: handleDecrement, disabled: isDecrementDisabled, whileTap: !isDecrementDisabled ? { scale: 0.9 } : undefined, animate: isDecrementing ? { scale: [1, 1.2, 1] } : undefined, transition: { duration: 0.2 }, "aria-label": "Decrease value", children: customButtons.decrement || (showPlusMinus ? (jsx("span", { className: styles$
|
|
1562
|
+
}, onMouseEnter: () => setIsButtonHovered('decrement'), onMouseLeave: () => setIsButtonHovered(null), onClick: handleDecrement, disabled: isDecrementDisabled, whileTap: !isDecrementDisabled ? { scale: 0.9 } : undefined, animate: isDecrementing ? { scale: [1, 1.2, 1] } : undefined, transition: { duration: 0.2 }, "aria-label": "Decrease value", children: customButtons.decrement || (showPlusMinus ? (jsx("span", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, children: "\u2212" })) : (jsx("svg", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, viewBox: "0 0 24 24", fill: "none", children: jsx("path", { d: "M15 18L9 12L15 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }))) }), jsx("div", { className: styles$r.valueContainer, style: customStyles.valueContainer, children: jsx(AnimatePresence, { mode: "wait", children: jsx(motion.div, { initial: { y: isIncrementing ? 10 : isDecrementing ? -10 : 0, opacity: 0 }, animate: { y: 0, opacity: 1 }, exit: { y: isIncrementing ? -10 : isDecrementing ? 10 : 0, opacity: 0 }, transition: { duration: 0.15 }, className: styles$r.valueWrapper, children: jsx("input", { type: "text", className: styles$r.value, style: customStyles.value, value: displayValue, onChange: handleInputChange, onBlur: handleInputBlur, disabled: disabled, "aria-label": label || "Number input", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value }) }, value) }) }), jsx(motion.button, { className: styles$r.button, style: {
|
|
1562
1563
|
...customStyles.button,
|
|
1563
1564
|
...(isButtonHovered === 'increment' && customStyles.buttonHover)
|
|
1564
|
-
}, onMouseEnter: () => setIsButtonHovered('increment'), onMouseLeave: () => setIsButtonHovered(null), onClick: handleIncrement, disabled: isIncrementDisabled, whileTap: !isIncrementDisabled ? { scale: 0.9 } : undefined, animate: isIncrementing ? { scale: [1, 1.2, 1] } : undefined, transition: { duration: 0.2 }, "aria-label": "Increase value", children: customButtons.increment || (showPlusMinus ? (jsx("span", { className: styles$
|
|
1565
|
+
}, onMouseEnter: () => setIsButtonHovered('increment'), onMouseLeave: () => setIsButtonHovered(null), onClick: handleIncrement, disabled: isIncrementDisabled, whileTap: !isIncrementDisabled ? { scale: 0.9 } : undefined, animate: isIncrementing ? { scale: [1, 1.2, 1] } : undefined, transition: { duration: 0.2 }, "aria-label": "Increase value", children: customButtons.increment || (showPlusMinus ? (jsx("span", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, children: "+" })) : (jsx("svg", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, viewBox: "0 0 24 24", fill: "none", children: jsx("path", { d: "M9 18L15 12L9 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }))) })] }));
|
|
1565
1566
|
// ── Tally variant: pen-stroke counter with explicit +/- buttons.
|
|
1566
1567
|
if (variant === 'tally') {
|
|
1567
1568
|
return (jsx(TallyRow, { value: value, label: label, icon: icon, color: color, disabled: disabled, emptyHint: tallyEmptyHint, className: containerClasses, customStyles: customStyles, onIncrement: handleIncrement, onDecrement: handleDecrement, ariaLabel: label || 'Tally counter', isDecrementDisabled: isDecrementDisabled, isIncrementDisabled: isIncrementDisabled }));
|
|
1568
1569
|
}
|
|
1569
1570
|
// For custom variant with horizontal layout, render differently
|
|
1570
1571
|
if (variant === 'custom' && (label || icon)) {
|
|
1571
|
-
return (jsxs("div", { className: containerClasses, style: { ...customStyles.container, display: 'flex', alignItems: 'center' }, children: [jsxs("div", { className: styles$
|
|
1572
|
+
return (jsxs("div", { className: containerClasses, style: { ...customStyles.container, display: 'flex', alignItems: 'center' }, children: [jsxs("div", { className: styles$r.header, style: { ...customStyles.header, flex: 1, marginBottom: 0 }, children: [icon && jsx("span", { className: styles$r.icon, style: customStyles.icon, children: icon }), label && jsx("label", { className: styles$r.label, style: customStyles.label, children: label })] }), stepperContent, !hideLimits && (min !== -Infinity || max !== Infinity) && (jsxs("div", { className: styles$r.limits, style: customStyles.limits, children: [jsx("span", { className: styles$r.limit, children: min !== -Infinity && `Min: ${min}` }), jsx("span", { className: styles$r.limit, children: max !== Infinity && `Max: ${max}` })] }))] }));
|
|
1572
1573
|
}
|
|
1573
|
-
return (jsxs("div", { className: containerClasses, style: customStyles.container, children: [(label || icon) && (jsxs("div", { className: styles$
|
|
1574
|
+
return (jsxs("div", { className: containerClasses, style: customStyles.container, children: [(label || icon) && (jsxs("div", { className: styles$r.header, style: customStyles.header, children: [icon && jsx("span", { className: styles$r.icon, style: customStyles.icon, children: icon }), label && jsx("label", { className: styles$r.label, style: customStyles.label, children: label })] })), stepperContent, !hideLimits && (min !== -Infinity || max !== Infinity) && (jsxs("div", { className: styles$r.limits, style: customStyles.limits, children: [jsx("span", { className: styles$r.limit, children: min !== -Infinity && `Min: ${min}` }), jsx("span", { className: styles$r.limit, children: max !== Infinity && `Max: ${max}` })] }))] }));
|
|
1574
1575
|
};
|
|
1575
1576
|
const TallyMarks = ({ count, color }) => {
|
|
1576
1577
|
const groups = [];
|
|
@@ -1580,14 +1581,14 @@ const TallyMarks = ({ count, color }) => {
|
|
|
1580
1581
|
groups.push(n);
|
|
1581
1582
|
left -= n;
|
|
1582
1583
|
}
|
|
1583
|
-
return (jsx("div", { className: styles$
|
|
1584
|
+
return (jsx("div", { className: styles$r.tallyMarks, "aria-hidden": "true", children: groups.map((n, i) => (jsxs("svg", { className: styles$r.tallyGroup, width: "38", height: "22", viewBox: "0 0 38 22", children: [[0, 1, 2, 3].slice(0, Math.min(4, n)).map((j) => (jsx("line", { x1: 4 + j * 6, y1: "2", x2: 4 + j * 6, y2: "20", stroke: color, strokeWidth: "2", strokeLinecap: "round" }, j))), n === 5 && (jsx("line", { x1: "1", y1: "18", x2: "27", y2: "4", stroke: color, strokeWidth: "2", strokeLinecap: "round" }))] }, i))) }));
|
|
1584
1585
|
};
|
|
1585
1586
|
const TallyRow = ({ value, label, icon, color, disabled, emptyHint, className, customStyles, onIncrement, onDecrement, ariaLabel, isDecrementDisabled, isIncrementDisabled }) => {
|
|
1586
1587
|
const resolvedColor = color || 'currentColor';
|
|
1587
|
-
return (jsxs("div", { "aria-label": ariaLabel, "aria-disabled": disabled || undefined, className: `${className} ${styles$
|
|
1588
|
+
return (jsxs("div", { "aria-label": ariaLabel, "aria-disabled": disabled || undefined, className: `${className} ${styles$r.tallyRow}`, style: customStyles.container, children: [icon && (jsx("span", { className: styles$r.tallyIcon, style: { color: resolvedColor, ...customStyles.icon }, children: icon })), label && (jsx("span", { className: styles$r.tallyLabel, style: customStyles.label, children: label })), jsx("div", { className: styles$r.tallyBody, children: value <= 0 ? (jsx("span", { className: styles$r.tallyHint, children: emptyHint })) : (jsx(TallyMarks, { count: value, color: resolvedColor })) }), jsx("button", { type: "button", className: styles$r.tallyButton, onClick: onDecrement, disabled: isDecrementDisabled, "aria-label": `Decrease ${label || 'value'}`, children: jsx("span", { className: styles$r.tallyButtonIcon, children: "\u2212" }) }), jsx("span", { className: styles$r.tallyValue, style: { color: resolvedColor, ...customStyles.value }, "aria-hidden": "true", children: value }), jsx("button", { type: "button", className: styles$r.tallyButton, onClick: onIncrement, disabled: isIncrementDisabled, "aria-label": `Increase ${label || 'value'}`, children: jsx("span", { className: styles$r.tallyButtonIcon, children: "+" }) })] }));
|
|
1588
1589
|
};
|
|
1589
1590
|
|
|
1590
|
-
var styles$
|
|
1591
|
+
var styles$q = {"button":"ToggleButton-module_button__DTuyY","background":"ToggleButton-module_background__NwfTp","content":"ToggleButton-module_content__NHqIN","iconWrapper":"ToggleButton-module_iconWrapper__yN4sP","icon":"ToggleButton-module_icon__r8juX","label":"ToggleButton-module_label__4mPJP","hideMobile":"ToggleButton-module_hideMobile__GFAc3","checkmark":"ToggleButton-module_checkmark__ZJwf-","ripple":"ToggleButton-module_ripple__2-faB","small":"ToggleButton-module_small__MhfoN","large":"ToggleButton-module_large__A3naL","default":"ToggleButton-module_default__q8QaZ","active":"ToggleButton-module_active__4DjlR","outlined":"ToggleButton-module_outlined__OtqJB","filled":"ToggleButton-module_filled__LySNn","ghost":"ToggleButton-module_ghost__9KXcb","active-primary":"ToggleButton-module_active-primary__vXMP7","active-secondary":"ToggleButton-module_active-secondary__9Ttdx","active-success":"ToggleButton-module_active-success__oi0rr","active-danger":"ToggleButton-module_active-danger__VUdxr","active-warning":"ToggleButton-module_active-warning__77nSu","animation-scale":"ToggleButton-module_animation-scale__j-3mJ","scaleAnimation":"ToggleButton-module_scaleAnimation__Ms1j2","animation-rotate":"ToggleButton-module_animation-rotate__pBmfc","rotateAnimation":"ToggleButton-module_rotateAnimation__xWZJ5","animation-flip":"ToggleButton-module_animation-flip__ErAbm","flipAnimation":"ToggleButton-module_flipAnimation__qwDTb","disabled":"ToggleButton-module_disabled__Gv5ji"};
|
|
1591
1592
|
|
|
1592
1593
|
/**
|
|
1593
1594
|
* ToggleButton Component
|
|
@@ -1626,18 +1627,18 @@ var styles$p = {"button":"ToggleButton-module_button__DTuyY","background":"Toggl
|
|
|
1626
1627
|
const ToggleButton = ({ active, onClick, icon, label, disabled = false, size = 'medium', variant = 'default', activeColor = 'primary', showCheckmark = false, animation = 'scale', className = '', style = {}, color, tooltip, hideLabelOnMobile = false, soundConfig }) => {
|
|
1627
1628
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1628
1629
|
const buttonClasses = [
|
|
1629
|
-
styles$
|
|
1630
|
-
styles$
|
|
1631
|
-
styles$
|
|
1632
|
-
active && styles$
|
|
1633
|
-
active && styles$
|
|
1634
|
-
disabled && styles$
|
|
1635
|
-
animation !== 'none' && styles$
|
|
1630
|
+
styles$q.button,
|
|
1631
|
+
styles$q[size],
|
|
1632
|
+
styles$q[variant],
|
|
1633
|
+
active && styles$q.active,
|
|
1634
|
+
active && styles$q[`active-${activeColor}`],
|
|
1635
|
+
disabled && styles$q.disabled,
|
|
1636
|
+
animation !== 'none' && styles$q[`animation-${animation}`],
|
|
1636
1637
|
className
|
|
1637
1638
|
].filter(Boolean).join(' ');
|
|
1638
1639
|
const labelClasses = [
|
|
1639
|
-
styles$
|
|
1640
|
-
hideLabelOnMobile && styles$
|
|
1640
|
+
styles$q.label,
|
|
1641
|
+
hideLabelOnMobile && styles$q.hideMobile
|
|
1641
1642
|
].filter(Boolean).join(' ');
|
|
1642
1643
|
const iconVariants = {
|
|
1643
1644
|
scale: {
|
|
@@ -1701,10 +1702,10 @@ const ToggleButton = ({ active, onClick, icon, label, disabled = false, size = '
|
|
|
1701
1702
|
return (jsxs(motion.button, { className: buttonClasses, style: dynamicStyle, onClick: () => {
|
|
1702
1703
|
playSound('toggle');
|
|
1703
1704
|
onClick();
|
|
1704
|
-
}, disabled: disabled, whileHover: !disabled ? { scale: 1.05 } : undefined, whileTap: !disabled ? { scale: 0.95 } : undefined, title: tooltip, "aria-pressed": active, "aria-label": label, ...handlers, children: [jsx(motion.div, { className: styles$
|
|
1705
|
+
}, disabled: disabled, whileHover: !disabled ? { scale: 1.05 } : undefined, whileTap: !disabled ? { scale: 0.95 } : undefined, title: tooltip, "aria-pressed": active, "aria-label": label, ...handlers, children: [jsx(motion.div, { className: styles$q.background, variants: backgroundVariants, initial: "inactive", animate: active ? "active" : "inactive" }), jsxs("div", { className: styles$q.content, children: [icon && (jsx(motion.div, { className: styles$q.iconWrapper, variants: iconVariants[animation], initial: "inactive", animate: active ? "active" : "inactive", transition: { duration: 0.3 }, children: typeof icon === 'string' ? (jsx("span", { className: styles$q.icon, children: icon })) : (jsx("div", { className: styles$q.icon, children: icon })) })), label && jsx("span", { className: labelClasses, children: label }), jsx(AnimatePresence, { children: showCheckmark && active && (jsx(motion.div, { className: styles$q.checkmark, variants: checkmarkVariants, initial: "hidden", animate: "visible", exit: "hidden", children: jsx("svg", { viewBox: "0 0 24 24", fill: "none", children: jsx("path", { d: "M20 6L9 17L4 12", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round" }) }) })) })] }), jsx(AnimatePresence, { children: active && (jsx(motion.div, { className: styles$q.ripple, initial: { scale: 0, opacity: 0.5 }, animate: { scale: 2, opacity: 0 }, exit: { scale: 0, opacity: 0 }, transition: { duration: 0.6 } })) })] }));
|
|
1705
1706
|
};
|
|
1706
1707
|
|
|
1707
|
-
var styles$
|
|
1708
|
+
var styles$p = {"slider":"Slider-module_slider__RD4G7","label":"Slider-module_label__j4H8M","sliderContainer":"Slider-module_sliderContainer__kQICC","track":"Slider-module_track__fQ-oP","dragging":"Slider-module_dragging__rynPv","fill":"Slider-module_fill__AYR4-","input":"Slider-module_input__fqY-G","thumb":"Slider-module_thumb__yQJho","tooltip":"Slider-module_tooltip__ZubHR","tooltipArrow":"Slider-module_tooltipArrow__1aV9s","valueDisplay":"Slider-module_valueDisplay__V6caL","labelsContainer":"Slider-module_labelsContainer__F6ojF","labelItem":"Slider-module_labelItem__FuEaY","dotsContainer":"Slider-module_dotsContainer__zpcZe","dot":"Slider-module_dot__TkGh5","dotFilled":"Slider-module_dotFilled__n779E","size-sm":"Slider-module_size-sm__Y2bmS","size-lg":"Slider-module_size-lg__RSnPf","disabled":"Slider-module_disabled__gxYoH","loading":"Slider-module_loading__6FkKb","loadingTrack":"Slider-module_loadingTrack__8ItT2","loadingIndicator":"Slider-module_loadingIndicator__Elydq"};
|
|
1708
1709
|
|
|
1709
1710
|
/**
|
|
1710
1711
|
* Slider component — responsive, accessible range input with a styled track, fill, and thumb.
|
|
@@ -1712,7 +1713,7 @@ var styles$o = {"slider":"Slider-module_slider__RD4G7","label":"Slider-module_la
|
|
|
1712
1713
|
* The thumb is inset at the track endpoints so it never overflows. Drag state is tracked
|
|
1713
1714
|
* via pointer events (works on mouse, touch, and pen).
|
|
1714
1715
|
*/
|
|
1715
|
-
function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValue = false, valueFormatter, labels = [], config = {}, disabled = false, className = '', style = {}, loading = false, colorFunction, showTooltip = false, tooltipContent, soundConfig, }) {
|
|
1716
|
+
function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValue = false, valueFormatter, labels = [], config = {}, disabled = false, className = '', style = {}, loading = false, colorFunction, showTooltip = false, tooltipContent, soundConfig, variant = 'track', }) {
|
|
1716
1717
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1717
1718
|
const [isDragging, setIsDragging] = useState(false);
|
|
1718
1719
|
const { colors = {}, size = 'md' } = config;
|
|
@@ -1743,11 +1744,33 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1743
1744
|
};
|
|
1744
1745
|
const endDrag = () => setIsDragging(false);
|
|
1745
1746
|
const dynamicColor = getDynamicColor();
|
|
1746
|
-
const sizeClass = styles$
|
|
1747
|
-
const stateClass = disabled ? styles$
|
|
1748
|
-
const dragClass = isDragging ? styles$
|
|
1747
|
+
const sizeClass = styles$p[`size-${size}`];
|
|
1748
|
+
const stateClass = disabled ? styles$p.disabled : '';
|
|
1749
|
+
const dragClass = isDragging ? styles$p.dragging : '';
|
|
1749
1750
|
if (loading) {
|
|
1750
|
-
return (jsxs("div", { className: `${styles$
|
|
1751
|
+
return (jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${styles$p.loading} ${className}`, style: style, children: [label && jsx("label", { className: styles$p.label, children: label }), jsx("div", { className: styles$p.loadingTrack, children: jsx(motion.div, { className: styles$p.loadingIndicator, animate: { x: ['-100%', '200%'] }, transition: { repeat: Infinity, duration: 1.5, ease: 'easeInOut' } }) })] }));
|
|
1752
|
+
}
|
|
1753
|
+
if (variant === 'dots') {
|
|
1754
|
+
const dotCount = Math.max(0, Math.floor((max - min) / step));
|
|
1755
|
+
const dotValues = Array.from({ length: dotCount }, (_, i) => min + (i + 1) * step);
|
|
1756
|
+
const handleDotClick = (dotValue) => {
|
|
1757
|
+
if (disabled || loading)
|
|
1758
|
+
return;
|
|
1759
|
+
playSound('click');
|
|
1760
|
+
const next = value === dotValue ? dotValue - step : dotValue;
|
|
1761
|
+
onChange(Math.max(min, next));
|
|
1762
|
+
};
|
|
1763
|
+
return (jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${stateClass} ${className}`, style: style, ...handlers, children: [label && jsx("label", { className: styles$p.label, children: label }), jsx("div", { className: styles$p.dotsContainer, role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, "aria-label": label, children: dotValues.map((dotValue) => {
|
|
1764
|
+
const filled = dotValue <= value;
|
|
1765
|
+
return (jsx("button", { type: "button", className: `${styles$p.dot} ${filled ? styles$p.dotFilled : ''}`, style: filled
|
|
1766
|
+
? {
|
|
1767
|
+
backgroundColor: dynamicColor,
|
|
1768
|
+
borderColor: dynamicColor,
|
|
1769
|
+
}
|
|
1770
|
+
: undefined, onClick: () => handleDotClick(dotValue), disabled: disabled, "aria-label": valueFormatter
|
|
1771
|
+
? valueFormatter(dotValue)
|
|
1772
|
+
: `Set to ${dotValue}` }, dotValue));
|
|
1773
|
+
}) }), showValue && (jsx("div", { className: styles$p.valueDisplay, style: { color: dynamicColor }, children: formatValue(value) }))] }));
|
|
1751
1774
|
}
|
|
1752
1775
|
// Inset the thumb so its bounding box stays inside the track at 0/100%.
|
|
1753
1776
|
// At percentage=0: marginLeft=0 → thumb flush-left. At 100%: marginLeft=-thumbSize → flush-right.
|
|
@@ -1755,11 +1778,11 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1755
1778
|
left: `${percentage}%`,
|
|
1756
1779
|
marginLeft: `calc(var(--slider-thumb-size) * ${-percentage / 100})`,
|
|
1757
1780
|
};
|
|
1758
|
-
return (jsxs("div", { className: `${styles$
|
|
1781
|
+
return (jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${stateClass} ${dragClass} ${className}`, style: style, children: [label && jsx("label", { className: styles$p.label, children: label }), jsxs("div", { className: styles$p.sliderContainer, children: [jsx("div", { className: styles$p.track, children: jsx("div", { className: styles$p.fill, style: { width: `${percentage}%`, backgroundColor: dynamicColor } }) }), jsx("input", { type: "range", min: min, max: max, step: step, value: value, onChange: handleChange, onPointerDown: startDrag, onPointerUp: endDrag, onPointerCancel: endDrag, onBlur: endDrag, ...handlers, className: styles$p.input, disabled: disabled, "aria-label": label }), jsx("div", { className: styles$p.thumb, style: {
|
|
1759
1782
|
...insetStyle,
|
|
1760
1783
|
backgroundColor: dynamicColor,
|
|
1761
1784
|
borderColor: colors.thumb || dynamicColor,
|
|
1762
|
-
} }), jsx(AnimatePresence, { children: showTooltip && isDragging && !disabled && (jsxs(motion.div, { className: styles$
|
|
1785
|
+
} }), jsx(AnimatePresence, { children: showTooltip && isDragging && !disabled && (jsxs(motion.div, { className: styles$p.tooltip, style: { ...insetStyle, backgroundColor: dynamicColor }, initial: { opacity: 0, y: 6, scale: 0.9 }, animate: { opacity: 1, y: 0, scale: 1 }, exit: { opacity: 0, y: 6, scale: 0.9 }, transition: { duration: 0.15 }, children: [tooltipContent ? tooltipContent(value) : formatValue(value), jsx("div", { className: styles$p.tooltipArrow, style: { borderTopColor: dynamicColor } })] })) })] }), showValue && (jsx("div", { className: styles$p.valueDisplay, style: { color: dynamicColor }, children: formatValue(value) })), labels.length > 0 && (jsx("div", { className: styles$p.labelsContainer, children: labels.map((labelConfig, index) => {
|
|
1763
1786
|
let position = 0;
|
|
1764
1787
|
if (labelConfig.position === 'start')
|
|
1765
1788
|
position = 0;
|
|
@@ -1767,11 +1790,11 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1767
1790
|
position = 100;
|
|
1768
1791
|
else if (typeof labelConfig.position === 'number')
|
|
1769
1792
|
position = labelConfig.position;
|
|
1770
|
-
return (jsx("div", { className: styles$
|
|
1793
|
+
return (jsx("div", { className: styles$p.labelItem, style: { left: `${position}%`, color: labelConfig.color }, children: labelConfig.label }, index));
|
|
1771
1794
|
}) }))] }));
|
|
1772
1795
|
}
|
|
1773
1796
|
|
|
1774
|
-
var styles$
|
|
1797
|
+
var styles$o = {"loadingContainer":"LoadingSpinner-module_loadingContainer__m5u51","fullScreen":"LoadingSpinner-module_fullScreen__TuAem","overlay":"LoadingSpinner-module_overlay__X7FTa","shimmer":"LoadingSpinner-module_shimmer__xw4AH","small":"LoadingSpinner-module_small__nq8A3","loadingText":"LoadingSpinner-module_loadingText__wWwna","medium":"LoadingSpinner-module_medium__3JC1S","large":"LoadingSpinner-module_large__4MvAc","dotsSpinner":"LoadingSpinner-module_dotsSpinner__PXtfs","dot1":"LoadingSpinner-module_dot1__5YKSi","dot2":"LoadingSpinner-module_dot2__l6Rbu","dot3":"LoadingSpinner-module_dot3__b9YPW","circleSpinner":"LoadingSpinner-module_circleSpinner__ZmmWs","pulseSpinner":"LoadingSpinner-module_pulseSpinner__wTtDJ","textGradient":"LoadingSpinner-module_textGradient__QDrTY","sparkleContainer":"LoadingSpinner-module_sparkleContainer__9XLJG","sparkle":"LoadingSpinner-module_sparkle__LtFFf"};
|
|
1775
1798
|
|
|
1776
1799
|
const defaultMessages = [
|
|
1777
1800
|
'Loading your content...',
|
|
@@ -1855,22 +1878,22 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1855
1878
|
}
|
|
1856
1879
|
}, [currentMessageIndex, message, messagesToUse, showMessage]);
|
|
1857
1880
|
const containerClasses = [
|
|
1858
|
-
styles$
|
|
1859
|
-
styles$
|
|
1860
|
-
styles$
|
|
1861
|
-
fullScreen && styles$
|
|
1862
|
-
overlay && styles$
|
|
1881
|
+
styles$o.loadingContainer,
|
|
1882
|
+
styles$o[size],
|
|
1883
|
+
styles$o[variant],
|
|
1884
|
+
fullScreen && styles$o.fullScreen,
|
|
1885
|
+
overlay && styles$o.overlay,
|
|
1863
1886
|
className
|
|
1864
1887
|
].filter(Boolean).join(' ');
|
|
1865
1888
|
const customStyle = {
|
|
1866
1889
|
...(color && { '--spinner-color': color }),
|
|
1867
1890
|
...(backgroundColor && { '--spinner-background': backgroundColor }),
|
|
1868
1891
|
};
|
|
1869
|
-
const renderDots = () => (jsxs(motion.div, { className: styles$
|
|
1892
|
+
const renderDots = () => (jsxs(motion.div, { className: styles$o.dotsSpinner, animate: { rotate: 360 }, transition: {
|
|
1870
1893
|
duration: 2,
|
|
1871
1894
|
repeat: Infinity,
|
|
1872
1895
|
ease: 'linear'
|
|
1873
|
-
}, children: [jsx(motion.div, { className: styles$
|
|
1896
|
+
}, children: [jsx(motion.div, { className: styles$o.dot1, animate: {
|
|
1874
1897
|
scale: [1, 1.3, 1],
|
|
1875
1898
|
y: [0, -6, 0]
|
|
1876
1899
|
}, transition: {
|
|
@@ -1878,7 +1901,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1878
1901
|
repeat: Infinity,
|
|
1879
1902
|
ease: 'easeInOut',
|
|
1880
1903
|
delay: 0
|
|
1881
|
-
} }), jsx(motion.div, { className: styles$
|
|
1904
|
+
} }), jsx(motion.div, { className: styles$o.dot2, animate: {
|
|
1882
1905
|
scale: [1, 1.3, 1],
|
|
1883
1906
|
y: [0, -6, 0]
|
|
1884
1907
|
}, transition: {
|
|
@@ -1886,7 +1909,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1886
1909
|
repeat: Infinity,
|
|
1887
1910
|
ease: 'easeInOut',
|
|
1888
1911
|
delay: 0.5
|
|
1889
|
-
} }), jsx(motion.div, { className: styles$
|
|
1912
|
+
} }), jsx(motion.div, { className: styles$o.dot3, animate: {
|
|
1890
1913
|
scale: [1, 1.3, 1],
|
|
1891
1914
|
y: [0, -6, 0]
|
|
1892
1915
|
}, transition: {
|
|
@@ -1895,12 +1918,12 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1895
1918
|
ease: 'easeInOut',
|
|
1896
1919
|
delay: 1
|
|
1897
1920
|
} })] }));
|
|
1898
|
-
const renderSpinner = () => (jsx(motion.div, { className: styles$
|
|
1921
|
+
const renderSpinner = () => (jsx(motion.div, { className: styles$o.circleSpinner, animate: { rotate: 360 }, transition: {
|
|
1899
1922
|
duration: 1,
|
|
1900
1923
|
repeat: Infinity,
|
|
1901
1924
|
ease: 'linear'
|
|
1902
1925
|
} }));
|
|
1903
|
-
const renderPulse = () => (jsx(motion.div, { className: styles$
|
|
1926
|
+
const renderPulse = () => (jsx(motion.div, { className: styles$o.pulseSpinner, animate: {
|
|
1904
1927
|
scale: [1, 1.2, 1],
|
|
1905
1928
|
opacity: [1, 0.7, 1]
|
|
1906
1929
|
}, transition: {
|
|
@@ -1919,10 +1942,10 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1919
1942
|
return renderDots();
|
|
1920
1943
|
}
|
|
1921
1944
|
};
|
|
1922
|
-
return (jsxs("div", { className: containerClasses, style: customStyle, children: [renderSpinnerVariant(), showMessage && (jsx(AnimatePresence, { mode: "wait", children: jsx(motion.p, { className: styles$
|
|
1945
|
+
return (jsxs("div", { className: containerClasses, style: customStyle, children: [renderSpinnerVariant(), showMessage && (jsx(AnimatePresence, { mode: "wait", children: jsx(motion.p, { className: styles$o.loadingText, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: {
|
|
1923
1946
|
duration: 0.4,
|
|
1924
1947
|
ease: 'easeOut'
|
|
1925
|
-
}, children: currentMessage }, currentMessage) })), showSparkles && (jsx("div", { className: styles$
|
|
1948
|
+
}, children: currentMessage }, currentMessage) })), showSparkles && (jsx("div", { className: styles$o.sparkleContainer, children: [...Array(4)].map((_, i) => (jsx(motion.div, { className: styles$o.sparkle, animate: {
|
|
1926
1949
|
opacity: [0, 1, 0],
|
|
1927
1950
|
scale: [0.5, 1, 0.5],
|
|
1928
1951
|
rotate: [0, 180, 360]
|
|
@@ -1937,7 +1960,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1937
1960
|
} }, i))) }))] }));
|
|
1938
1961
|
};
|
|
1939
1962
|
|
|
1940
|
-
var styles$
|
|
1963
|
+
var styles$n = {"wrapper":"DecryptedText-module_wrapper__tuLvf","srOnly":"DecryptedText-module_srOnly__A-K2T"};
|
|
1941
1964
|
|
|
1942
1965
|
/**
|
|
1943
1966
|
* DecryptedText Component
|
|
@@ -2121,13 +2144,13 @@ const DecryptedText = ({ text, speed = 50, maxIterations = 10, sequential = fals
|
|
|
2121
2144
|
onMouseLeave: () => setIsHovering(false),
|
|
2122
2145
|
}
|
|
2123
2146
|
: {};
|
|
2124
|
-
return (jsxs(motion.span, { className: `${styles$
|
|
2147
|
+
return (jsxs(motion.span, { className: `${styles$n.wrapper} ${parentClassName}`, ref: containerRef, ...hoverProps, ...props, children: [jsx("span", { className: styles$n.srOnly, children: displayText }), jsx("span", { "aria-hidden": "true", children: displayText.split('').map((char, index) => {
|
|
2125
2148
|
const isRevealedOrDone = revealedIndices.has(index) || !isScrambling || !isHovering;
|
|
2126
2149
|
return (jsx("span", { className: isRevealedOrDone ? className : encryptedClassName, children: char }, index));
|
|
2127
2150
|
}) })] }));
|
|
2128
2151
|
};
|
|
2129
2152
|
|
|
2130
|
-
var styles$
|
|
2153
|
+
var styles$m = {"arrayInput":"ArrayInput-module_arrayInput__q1x7A","arrayInputLabel":"ArrayInput-module_arrayInputLabel__HyUC7","arrayInputItem":"ArrayInput-module_arrayInputItem__bFtgl","inputWrapper":"ArrayInput-module_inputWrapper__ajhbW","input":"ArrayInput-module_input__1uywi","complexItem":"ArrayInput-module_complexItem__zr-Q-","fieldsWrapper":"ArrayInput-module_fieldsWrapper__7BVPa","removeButton":"ArrayInput-module_removeButton__gYf8Y","addButton":"ArrayInput-module_addButton__mia29"};
|
|
2131
2154
|
|
|
2132
2155
|
/**
|
|
2133
2156
|
* ArrayInput component - Versatile dynamic list manager
|
|
@@ -2194,11 +2217,11 @@ function SimpleArrayInput({ label, values, onChange, placeholder, itemStyle, inp
|
|
|
2194
2217
|
itemIdsRef.current.splice(index, 1);
|
|
2195
2218
|
onChange(newValues);
|
|
2196
2219
|
};
|
|
2197
|
-
return (jsxs("div", { className: styles$
|
|
2220
|
+
return (jsxs("div", { className: styles$m.arrayInput, children: [jsx("h3", { className: styles$m.arrayInputLabel, children: label }), jsx("div", { children: jsx(AnimatePresence, { children: values.map((value, index) => (jsxs(motion.div, { className: styles$m.arrayInputItem, style: itemStyle, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: {
|
|
2198
2221
|
duration: 0.3,
|
|
2199
2222
|
ease: "easeInOut",
|
|
2200
2223
|
layout: { duration: 0.2 }
|
|
2201
|
-
}, children: [jsx("div", { className: styles$
|
|
2224
|
+
}, children: [jsx("div", { className: styles$m.inputWrapper, children: multiline ? (jsx("div", { style: inputStyle, children: jsx(TextArea, { label: "", value: value, onChange: (newValue) => handleChange(index, newValue), placeholder: placeholder, rows: rows, compact: true }) })) : (jsx("input", { type: "text", value: value, onChange: (e) => handleChange(index, e.target.value), placeholder: placeholder, className: styles$m.input, style: inputStyle })) }), jsx(Button, { variant: "ghost", size: "small", onClick: () => handleRemove(index), "aria-label": "Remove item", className: styles$m.removeButton, children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })] }, itemIdsRef.current[index]))) }) }), jsx(Button, { variant: buttonVariant, size: "small", onClick: handleAdd, className: styles$m.addButton, children: label })] }));
|
|
2202
2225
|
}
|
|
2203
2226
|
// Complex object array implementation
|
|
2204
2227
|
function ComplexArrayInput({ label, values, onChange, fields, getKey, itemStyle, inputStyle, buttonVariant = 'primary' }) {
|
|
@@ -2223,14 +2246,14 @@ function ComplexArrayInput({ label, values, onChange, fields, getKey, itemStyle,
|
|
|
2223
2246
|
// Generate key from all field values
|
|
2224
2247
|
return fields.map(f => item[f.name] || '').join('-') + `-${index}`;
|
|
2225
2248
|
};
|
|
2226
|
-
return (jsxs("div", { className: styles$
|
|
2249
|
+
return (jsxs("div", { className: styles$m.arrayInput, children: [jsx("h3", { className: styles$m.arrayInputLabel, children: label }), jsx("div", { children: jsx(AnimatePresence, { children: values.map((value, index) => (jsxs(motion.div, { className: `${styles$m.arrayInputItem} ${fields.length > 1 ? styles$m.complexItem : ''}`, style: itemStyle, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: {
|
|
2227
2250
|
duration: 0.3,
|
|
2228
2251
|
ease: "easeInOut",
|
|
2229
2252
|
layout: { duration: 0.2 }
|
|
2230
|
-
}, children: [jsx("div", { className: styles$
|
|
2253
|
+
}, children: [jsx("div", { className: styles$m.fieldsWrapper, children: fields.map((field) => (jsx("div", { style: inputStyle, children: field.multiline ? (jsx(TextArea, { value: value[field.name] || '', onChange: (newValue) => handleChange(index, field.name, newValue), label: field.label, placeholder: field.placeholder, rows: field.rows, compact: true })) : (jsx(TextInput, { value: value[field.name] || '', onChange: (newValue) => handleChange(index, field.name, newValue), label: field.label, type: field.type, placeholder: field.placeholder })) }, field.name))) }), jsx(Button, { variant: "ghost", size: "small", onClick: () => handleRemove(index), "aria-label": "Remove item", className: styles$m.removeButton, children: jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) })] }, generateKey(value, index)))) }) }), jsxs(Button, { variant: buttonVariant, size: "small", onClick: handleAdd, className: styles$m.addButton, children: ["Add ", label] })] }));
|
|
2231
2254
|
}
|
|
2232
2255
|
|
|
2233
|
-
var styles$
|
|
2256
|
+
var styles$l = {"fab":"EditFAB-module_fab__nSrTJ","primary":"EditFAB-module_primary__zbA9n","secondary":"EditFAB-module_secondary__BnXs0","success":"EditFAB-module_success__kcLg3","loader":"EditFAB-module_loader__TaJOm","draggable":"EditFAB-module_draggable__eE2vE","dragging":"EditFAB-module_dragging__btRJe"};
|
|
2234
2257
|
|
|
2235
2258
|
const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = false, onEnterEditMode, onExitEditMode, position = { bottom: 32, right: 32 } }) => {
|
|
2236
2259
|
const [isMobile, setIsMobile] = useState(false);
|
|
@@ -2315,15 +2338,15 @@ const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = fa
|
|
|
2315
2338
|
};
|
|
2316
2339
|
const getVariantClass = () => {
|
|
2317
2340
|
if (isSaving)
|
|
2318
|
-
return styles$
|
|
2341
|
+
return styles$l.primary;
|
|
2319
2342
|
if (isEditMode) {
|
|
2320
|
-
return hasUnsavedChanges ? styles$
|
|
2343
|
+
return hasUnsavedChanges ? styles$l.success : styles$l.secondary;
|
|
2321
2344
|
}
|
|
2322
|
-
return styles$
|
|
2345
|
+
return styles$l.primary;
|
|
2323
2346
|
};
|
|
2324
2347
|
const getIcon = () => {
|
|
2325
2348
|
if (isSaving) {
|
|
2326
|
-
return jsx("div", { className: styles$
|
|
2349
|
+
return jsx("div", { className: styles$l.loader });
|
|
2327
2350
|
}
|
|
2328
2351
|
if (isEditMode) {
|
|
2329
2352
|
return hasUnsavedChanges ? jsx(Check, { size: 24 }) : jsx(X, { size: 24 });
|
|
@@ -2338,14 +2361,14 @@ const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = fa
|
|
|
2338
2361
|
}
|
|
2339
2362
|
return "Enter edit mode";
|
|
2340
2363
|
};
|
|
2341
|
-
return (jsx(motion.button, { ref: fabRef, className: `${styles$
|
|
2364
|
+
return (jsx(motion.button, { ref: fabRef, className: `${styles$l.fab} ${getVariantClass()} ${isMobile ? styles$l.draggable : ''} ${isDragging ? styles$l.dragging : ''}`, style: getPositionStyles(), onClick: handleClick, onTouchStart: handleTouchStart, onTouchMove: handleTouchMove, onTouchEnd: handleTouchEnd, disabled: isSaving, "aria-label": getAriaLabel(), initial: { scale: 0, opacity: 0 }, animate: { scale: 1, opacity: 1 }, exit: { scale: 0, opacity: 0 }, whileHover: !isSaving && !isDragging ? { scale: 1.1 } : {}, whileTap: !isSaving && !isDragging ? { scale: 0.9 } : {}, transition: {
|
|
2342
2365
|
type: "spring",
|
|
2343
2366
|
stiffness: 260,
|
|
2344
2367
|
damping: 20
|
|
2345
2368
|
}, children: getIcon() }));
|
|
2346
2369
|
};
|
|
2347
2370
|
|
|
2348
|
-
var styles$
|
|
2371
|
+
var styles$k = {"searchContainer":"SearchBar-module_searchContainer__TdM1w","searchInputWrapper":"SearchBar-module_searchInputWrapper__kCZLU","searchIcon":"SearchBar-module_searchIcon__IIxEu","searchInput":"SearchBar-module_searchInput__V4gkE","clearButton":"SearchBar-module_clearButton__7fNIY","filterSelect":"SearchBar-module_filterSelect__xIVE4","resultsDropdown":"SearchBar-module_resultsDropdown__yh6NF","loadingState":"SearchBar-module_loadingState__4gidK","emptyState":"SearchBar-module_emptyState__RbI4s","spinner":"SearchBar-module_spinner__PMc6-","resultsGroups":"SearchBar-module_resultsGroups__U24DC","resultGroup":"SearchBar-module_resultGroup__SoTQH","groupHeader":"SearchBar-module_groupHeader__bFRHA","groupIcon":"SearchBar-module_groupIcon__9ENM-","groupTitle":"SearchBar-module_groupTitle__ZekZs","groupCount":"SearchBar-module_groupCount__PQIqw","groupResults":"SearchBar-module_groupResults__xTF52","resultItem":"SearchBar-module_resultItem__VaKKy","highlighted":"SearchBar-module_highlighted__Q-3sH","resultTitle":"SearchBar-module_resultTitle__i1uqL","resultSubtitle":"SearchBar-module_resultSubtitle__LQOJ1","resultMeta":"SearchBar-module_resultMeta__Kmkrn","resultContent":"SearchBar-module_resultContent__TzVzL","highlight":"SearchBar-module_highlight__Q3PSP"};
|
|
2349
2372
|
|
|
2350
2373
|
// Default filter options for backwards compatibility
|
|
2351
2374
|
const defaultFilterOptions = [
|
|
@@ -2538,18 +2561,18 @@ const SearchBar = ({ className, placeholder = "Search (Ctrl+Space)...", onSearch
|
|
|
2538
2561
|
return text || '';
|
|
2539
2562
|
const regex = new RegExp(`(${highlight.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi');
|
|
2540
2563
|
const parts = text.split(regex);
|
|
2541
|
-
return parts.map((part, index) => regex.test(part) ? (jsx("mark", { className: styles$
|
|
2564
|
+
return parts.map((part, index) => regex.test(part) ? (jsx("mark", { className: styles$k.highlight, children: part }, index)) : (part));
|
|
2542
2565
|
};
|
|
2543
|
-
return (jsxs("div", { ref: searchRef, className: `${styles$
|
|
2566
|
+
return (jsxs("div", { ref: searchRef, className: `${styles$k.searchContainer} ${className || ''}`, children: [jsxs("div", { className: styles$k.searchInputWrapper, children: [jsx(Search, { className: styles$k.searchIcon }), jsx("input", { ref: inputRef, type: "text", value: query, onChange: (e) => setQuery(e.target.value), onKeyDown: handleKeyDown, onFocus: () => query.trim() && results.length > 0 && setIsDropdownOpen(true), placeholder: placeholder, className: styles$k.searchInput, "aria-label": "Search", "aria-expanded": isDropdownOpen, "aria-controls": "search-results", "aria-autocomplete": "list" }), query && (jsx(motion.button, { className: styles$k.clearButton, onClick: handleClear, whileHover: { scale: 1.1 }, whileTap: { scale: 0.9 }, initial: { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, children: jsx(X, {}) })), showFilter && (jsx("select", { value: filter, onChange: (e) => setFilter(e.target.value), className: styles$k.filterSelect, "aria-label": "Filter search results", children: filterOptions.map(option => (jsx("option", { value: option.value, children: option.label }, option.value))) }))] }), jsx(AnimatePresence, { children: isDropdownOpen && (jsx(motion.div, { ref: resultsRef, id: "search-results", className: styles$k.resultsDropdown, initial: { opacity: 0, y: -10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: { duration: 0.2 }, children: isLoading ? (jsxs("div", { className: styles$k.loadingState, children: [jsx("div", { className: styles$k.spinner }), jsx("span", { children: "Searching..." })] })) : results.length === 0 ? (jsxs("div", { className: styles$k.emptyState, children: ["No results found for \"", query, "\""] })) : (jsx("div", { className: styles$k.resultsGroups, children: Object.entries(groupedResults).map(([type, groupResults]) => {
|
|
2544
2567
|
const Icon = entityIcons[type];
|
|
2545
|
-
return (jsxs("div", { className: styles$
|
|
2568
|
+
return (jsxs("div", { className: styles$k.resultGroup, children: [jsxs("div", { className: styles$k.groupHeader, children: [Icon && jsx(Icon, { className: styles$k.groupIcon }), jsx("span", { className: styles$k.groupTitle, children: type.charAt(0).toUpperCase() + type.slice(1) }), jsx("span", { className: styles$k.groupCount, children: groupResults.length })] }), jsx("div", { className: styles$k.groupResults, children: groupResults.map((result) => {
|
|
2546
2569
|
const globalIndex = results.indexOf(result);
|
|
2547
|
-
return (jsxs(motion.button, { "data-result-index": globalIndex, className: `${styles$
|
|
2570
|
+
return (jsxs(motion.button, { "data-result-index": globalIndex, className: `${styles$k.resultItem} ${highlightedIndex === globalIndex ? styles$k.highlighted : ''}`, onClick: () => handleResultClick(result), whileHover: { x: 4 }, onMouseEnter: () => setHighlightedIndex(globalIndex), children: [jsxs("div", { className: styles$k.resultContent, children: [jsx("div", { className: styles$k.resultTitle, children: highlightMatch(result.title || 'Untitled', query) }), result.subtitle && (jsx("div", { className: styles$k.resultSubtitle, children: highlightMatch(result.subtitle, query) }))] }), result.meta && (jsx("div", { className: styles$k.resultMeta, children: result.meta }))] }, `${result.type}-${result.id}`));
|
|
2548
2571
|
}) })] }, type));
|
|
2549
2572
|
}) })) })) })] }));
|
|
2550
2573
|
};
|
|
2551
2574
|
|
|
2552
|
-
var styles$
|
|
2575
|
+
var styles$j = {"timeInput":"TimeInput-module_timeInput__h1DpT","label":"TimeInput-module_label__d4rZw","required":"TimeInput-module_required__rc1vq","picker":"TimeInput-module_picker__9c6EI","error":"TimeInput-module_error__gJnpk","disabled":"TimeInput-module_disabled__wxiZ-"};
|
|
2553
2576
|
|
|
2554
2577
|
const lightTheme = createTheme({
|
|
2555
2578
|
palette: {
|
|
@@ -2585,26 +2608,26 @@ function TimeInput({ label, value, onChange, error = false, success = false, loa
|
|
|
2585
2608
|
!!document.documentElement.getAttribute('data-theme')?.includes('dark');
|
|
2586
2609
|
const muiTheme = useMemo(() => (isDark ? darkTheme : lightTheme), [isDark]);
|
|
2587
2610
|
const getContainerClassName = () => {
|
|
2588
|
-
const classes = [styles$
|
|
2611
|
+
const classes = [styles$j.timeInput];
|
|
2589
2612
|
if (error)
|
|
2590
|
-
classes.push(styles$
|
|
2613
|
+
classes.push(styles$j.error);
|
|
2591
2614
|
if (success)
|
|
2592
|
-
classes.push(styles$
|
|
2615
|
+
classes.push(styles$j.success);
|
|
2593
2616
|
if (loading)
|
|
2594
|
-
classes.push(styles$
|
|
2617
|
+
classes.push(styles$j.loading);
|
|
2595
2618
|
if (disabled)
|
|
2596
|
-
classes.push(styles$
|
|
2619
|
+
classes.push(styles$j.disabled);
|
|
2597
2620
|
if (className)
|
|
2598
2621
|
classes.push(className);
|
|
2599
2622
|
return classes.join(' ');
|
|
2600
2623
|
};
|
|
2601
|
-
return (jsxs("div", { className: getContainerClassName(), children: [label && (jsxs("label", { className: styles$
|
|
2624
|
+
return (jsxs("div", { className: getContainerClassName(), children: [label && (jsxs("label", { className: styles$j.label, children: [label, required && jsx("span", { className: styles$j.required, children: "*" })] })), jsx(ThemeProvider$1, { theme: muiTheme, children: jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: jsx(MobileTimePicker, { value: dayjsValue, onChange: (newValue) => {
|
|
2602
2625
|
onChange(newValue ? newValue.format('HH:mm') : '');
|
|
2603
2626
|
}, ampm: false, views: ['hours', 'minutes'], disabled: disabled || loading, slotProps: {
|
|
2604
2627
|
textField: {
|
|
2605
2628
|
size: 'small',
|
|
2606
2629
|
fullWidth: true,
|
|
2607
|
-
className: styles$
|
|
2630
|
+
className: styles$j.picker,
|
|
2608
2631
|
sx: {
|
|
2609
2632
|
'& .MuiPickersOutlinedInput-root': {
|
|
2610
2633
|
fontFamily: "'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace",
|
|
@@ -2692,7 +2715,7 @@ const ThemeProvider = ({ children, defaultTheme = 'light', storageKey = 'app-the
|
|
|
2692
2715
|
return (jsx(ThemeContext.Provider, { value: { theme, setTheme, toggleTheme }, children: children }));
|
|
2693
2716
|
};
|
|
2694
2717
|
|
|
2695
|
-
var styles$
|
|
2718
|
+
var styles$i = {"button":"ThemeSwitcher-module_button__VfRjU","iconButton":"ThemeSwitcher-module_iconButton__NKYBc","iconWrapper":"ThemeSwitcher-module_iconWrapper__FpHo8","label":"ThemeSwitcher-module_label__2Hfkp","toggle":"ThemeSwitcher-module_toggle__ATXx4","toggleTrack":"ThemeSwitcher-module_toggleTrack__x28Rv","toggleThumb":"ThemeSwitcher-module_toggleThumb__V8QeN","dropdown":"ThemeSwitcher-module_dropdown__3qLdt","dropdownTrigger":"ThemeSwitcher-module_dropdownTrigger__UzYV5","dropdownMenu":"ThemeSwitcher-module_dropdownMenu__3L5hT","dropdownItem":"ThemeSwitcher-module_dropdownItem__inw-K","active":"ThemeSwitcher-module_active__OHP19","icon":"ThemeSwitcher-module_icon__iRZiJ","text":"ThemeSwitcher-module_text__OCOoA"};
|
|
2696
2719
|
|
|
2697
2720
|
const ThemeSwitcher = ({ variant = 'button', showLabel = false, className = '', currentTheme, onThemeChange, themes: customThemes, }) => {
|
|
2698
2721
|
// Use safe version that returns null when outside a ThemeProvider
|
|
@@ -2713,25 +2736,25 @@ const ThemeSwitcher = ({ variant = 'button', showLabel = false, className = '',
|
|
|
2713
2736
|
if (variant === 'toggle') {
|
|
2714
2737
|
// Simple toggle between light and dark
|
|
2715
2738
|
const isDark = theme.includes('dark');
|
|
2716
|
-
return (jsxs(motion.button, { className: `${styles$
|
|
2739
|
+
return (jsxs(motion.button, { className: `${styles$i.toggle} ${className}`, onClick: () => setTheme(isDark ? 'light' : 'dark'), whileTap: { scale: 0.95 }, "aria-label": "Toggle theme", children: [jsx(motion.div, { className: styles$i.toggleTrack, animate: { backgroundColor: isDark ? 'var(--color-primary)' : 'var(--color-border)' }, children: jsx(motion.div, { className: styles$i.toggleThumb, animate: { x: isDark ? 24 : 0 }, transition: { type: 'spring', stiffness: 500, damping: 30 }, children: isDark ? jsx(Moon, { size: 14 }) : jsx(Sun, { size: 14 }) }) }), showLabel && jsx("span", { className: styles$i.label, children: isDark ? 'Dark' : 'Light' })] }));
|
|
2717
2740
|
}
|
|
2718
2741
|
if (variant === 'icon') {
|
|
2719
|
-
return (jsxs("button", { type: "button", className: `${styles$
|
|
2742
|
+
return (jsxs("button", { type: "button", className: `${styles$i.iconButton} ${className}`, onClick: () => {
|
|
2720
2743
|
const nextIndex = (currentThemeIndex + 1) % themes.length;
|
|
2721
2744
|
setTheme(themes[nextIndex].value);
|
|
2722
|
-
}, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, title: currentThemeData.label, children: [currentThemeData.icon, showLabel && jsx("span", { className: styles$
|
|
2745
|
+
}, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, title: currentThemeData.label, children: [currentThemeData.icon, showLabel && jsx("span", { className: styles$i.label, children: currentThemeData.label })] }));
|
|
2723
2746
|
}
|
|
2724
2747
|
if (variant === 'dropdown') {
|
|
2725
|
-
return (jsxs("div", { className: `${styles$
|
|
2748
|
+
return (jsxs("div", { className: `${styles$i.dropdown} ${className}`, children: [jsxs(motion.button, { className: styles$i.dropdownTrigger, whileTap: { scale: 0.98 }, children: [currentThemeData.icon, showLabel && jsx("span", { className: styles$i.label, children: currentThemeData.label })] }), jsx(motion.div, { className: styles$i.dropdownMenu, initial: { opacity: 0, y: -10 }, animate: { opacity: 1, y: 0 }, children: themes.map((t) => (jsxs(motion.button, { className: `${styles$i.dropdownItem} ${theme === t.value ? styles$i.active : ''}`, onClick: () => setTheme(t.value), whileHover: { x: 4 }, whileTap: { scale: 0.98 }, children: [jsx("span", { className: styles$i.icon, children: t.icon }), jsx("span", { className: styles$i.text, children: t.label })] }, t.value))) })] }));
|
|
2726
2749
|
}
|
|
2727
2750
|
// Default button variant - cycles through themes
|
|
2728
|
-
return (jsxs(motion.button, { className: `${styles$
|
|
2751
|
+
return (jsxs(motion.button, { className: `${styles$i.button} ${className}`, onClick: () => {
|
|
2729
2752
|
const nextIndex = (currentThemeIndex + 1) % themes.length;
|
|
2730
2753
|
setTheme(themes[nextIndex].value);
|
|
2731
|
-
}, whileTap: { scale: 0.95 }, whileHover: { scale: 1.05 }, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, children: [jsx(motion.div, { initial: { rotate: -180, opacity: 0 }, animate: { rotate: 0, opacity: 1 }, exit: { rotate: 180, opacity: 0 }, transition: { duration: 0.3 }, className: styles$
|
|
2754
|
+
}, whileTap: { scale: 0.95 }, whileHover: { scale: 1.05 }, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, children: [jsx(motion.div, { initial: { rotate: -180, opacity: 0 }, animate: { rotate: 0, opacity: 1 }, exit: { rotate: 180, opacity: 0 }, transition: { duration: 0.3 }, className: styles$i.iconWrapper, children: currentThemeData.icon }, theme), showLabel && jsx("span", { className: styles$i.label, children: currentThemeData.label })] }));
|
|
2732
2755
|
};
|
|
2733
2756
|
|
|
2734
|
-
var styles$
|
|
2757
|
+
var styles$h = {"tabs":"Tabs-module_tabs__Vlvn7","tab":"Tabs-module_tab__uQKim","tabIcon":"Tabs-module_tabIcon__AgN-O","fullWidth":"Tabs-module_fullWidth__X-GHP"};
|
|
2735
2758
|
|
|
2736
2759
|
// Default tabs for backwards compatibility
|
|
2737
2760
|
const defaultTabs = [
|
|
@@ -2742,39 +2765,39 @@ const defaultTabs = [
|
|
|
2742
2765
|
];
|
|
2743
2766
|
const Tabs = ({ activeTab, onTabChange, tabs: customTabs, className = '', fullWidth = false }) => {
|
|
2744
2767
|
const tabs = customTabs ?? defaultTabs;
|
|
2745
|
-
return (jsx("div", { className: `${styles$
|
|
2768
|
+
return (jsx("div", { className: `${styles$h.tabs} ${fullWidth ? styles$h.fullWidth : ''} ${className}`, children: tabs.map((tab) => {
|
|
2746
2769
|
const isActive = activeTab === tab.id;
|
|
2747
|
-
return (jsxs(motion.button, { className: styles$
|
|
2770
|
+
return (jsxs(motion.button, { className: styles$h.tab, "data-active": isActive, onClick: () => onTabChange(tab.id), style: { position: 'relative' }, children: [jsx(motion.div, { animate: {
|
|
2748
2771
|
rotate: isActive ? [0, -10, 10, -5, 5, 0] : 0,
|
|
2749
2772
|
}, transition: {
|
|
2750
2773
|
rotate: {
|
|
2751
2774
|
duration: 0.5,
|
|
2752
2775
|
ease: 'easeInOut'
|
|
2753
2776
|
}
|
|
2754
|
-
}, children: tab.icon && (React.isValidElement(tab.icon) ? (jsx("span", { className: styles$
|
|
2777
|
+
}, children: tab.icon && (React.isValidElement(tab.icon) ? (jsx("span", { className: styles$h.tabIcon, children: tab.icon })) : (jsx("span", { className: styles$h.tabIcon, children: React.createElement(tab.icon) }))) }), jsx("span", { children: tab.label })] }, tab.id));
|
|
2755
2778
|
}) }));
|
|
2756
2779
|
};
|
|
2757
2780
|
|
|
2758
|
-
var styles$
|
|
2781
|
+
var styles$g = {"toastContainer":"Toast-module_toastContainer__gp5C0","toast":"Toast-module_toast__eenNR","toastSuccess":"Toast-module_toastSuccess__e-cSx","toastError":"Toast-module_toastError__6JO9w","toastWarning":"Toast-module_toastWarning__pJoF1","toastInfo":"Toast-module_toastInfo__y33kR","icon":"Toast-module_icon__Z-D6i","iconSuccess":"Toast-module_iconSuccess__ehY27","iconError":"Toast-module_iconError__nXhZz","iconWarning":"Toast-module_iconWarning__Ie8oD","iconInfo":"Toast-module_iconInfo__8vOf5","content":"Toast-module_content__eBhK8","title":"Toast-module_title__EfUfZ","message":"Toast-module_message__l4pyr","closeButton":"Toast-module_closeButton__UWOVG","progressBar":"Toast-module_progressBar__fGwBU"};
|
|
2759
2782
|
|
|
2760
2783
|
const getIcon = (type) => {
|
|
2761
2784
|
switch (type) {
|
|
2762
2785
|
case 'success':
|
|
2763
|
-
return (jsx("svg", { className: `${styles$
|
|
2786
|
+
return (jsx("svg", { className: `${styles$g.icon} ${styles$g.iconSuccess}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }));
|
|
2764
2787
|
case 'error':
|
|
2765
|
-
return (jsx("svg", { className: `${styles$
|
|
2788
|
+
return (jsx("svg", { className: `${styles$g.icon} ${styles$g.iconError}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }));
|
|
2766
2789
|
case 'warning':
|
|
2767
|
-
return (jsx("svg", { className: `${styles$
|
|
2790
|
+
return (jsx("svg", { className: `${styles$g.icon} ${styles$g.iconWarning}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }));
|
|
2768
2791
|
case 'info':
|
|
2769
|
-
return (jsx("svg", { className: `${styles$
|
|
2792
|
+
return (jsx("svg", { className: `${styles$g.icon} ${styles$g.iconInfo}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }));
|
|
2770
2793
|
}
|
|
2771
2794
|
};
|
|
2772
2795
|
const getToastStyle = (type) => {
|
|
2773
2796
|
switch (type) {
|
|
2774
|
-
case 'success': return styles$
|
|
2775
|
-
case 'error': return styles$
|
|
2776
|
-
case 'warning': return styles$
|
|
2777
|
-
case 'info': return styles$
|
|
2797
|
+
case 'success': return styles$g.toastSuccess;
|
|
2798
|
+
case 'error': return styles$g.toastError;
|
|
2799
|
+
case 'warning': return styles$g.toastWarning;
|
|
2800
|
+
case 'info': return styles$g.toastInfo;
|
|
2778
2801
|
default: return '';
|
|
2779
2802
|
}
|
|
2780
2803
|
};
|
|
@@ -2796,7 +2819,7 @@ const ToastItem = ({ toast, removeToast, }) => {
|
|
|
2796
2819
|
clearInterval(interval);
|
|
2797
2820
|
};
|
|
2798
2821
|
}, [toast.id, duration, removeToast]);
|
|
2799
|
-
return (jsxs(motion.div, { className: `${styles$
|
|
2822
|
+
return (jsxs(motion.div, { className: `${styles$g.toast} ${getToastStyle(toast.type)}`, initial: { opacity: 0, x: 100, scale: 0.9 }, animate: { opacity: 1, x: 0, scale: 1 }, exit: { opacity: 0, x: 100, scale: 0.9 }, transition: { type: 'spring', stiffness: 500, damping: 40 }, layout: true, children: [getIcon(toast.type), jsxs("div", { className: styles$g.content, children: [toast.title && jsx("p", { className: styles$g.title, children: toast.title }), jsx("p", { className: styles$g.message, children: toast.message })] }), jsx("button", { className: styles$g.closeButton, onClick: () => removeToast(toast.id), "aria-label": "Close notification", children: jsx("svg", { width: "16", height: "16", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }), jsx(motion.div, { className: styles$g.progressBar, initial: { width: '100%' }, animate: { width: `${progress}%` }, style: {
|
|
2800
2823
|
color: toast.type === 'success' ? '#10B981'
|
|
2801
2824
|
: toast.type === 'error' ? '#EF4444'
|
|
2802
2825
|
: toast.type === 'warning' ? '#F59E0B'
|
|
@@ -2806,10 +2829,10 @@ const ToastItem = ({ toast, removeToast, }) => {
|
|
|
2806
2829
|
const ToastContainer = ({ toasts, removeToast }) => {
|
|
2807
2830
|
if (typeof document === 'undefined')
|
|
2808
2831
|
return null;
|
|
2809
|
-
return createPortal(jsx("div", { className: styles$
|
|
2832
|
+
return createPortal(jsx("div", { className: styles$g.toastContainer, children: jsx(AnimatePresence, { mode: "sync", children: toasts.map((toast) => (jsx(ToastItem, { toast: toast, removeToast: removeToast }, toast.id))) }) }), document.body);
|
|
2810
2833
|
};
|
|
2811
2834
|
|
|
2812
|
-
var styles$
|
|
2835
|
+
var styles$f = {"breadcrumb":"Breadcrumb-module_breadcrumb__pGabz","separator":"Breadcrumb-module_separator__UCmyy","item":"Breadcrumb-module_item__0cLOg","link":"Breadcrumb-module_link__udp8M","current":"Breadcrumb-module_current__3DpQc"};
|
|
2813
2836
|
|
|
2814
2837
|
/**
|
|
2815
2838
|
* Breadcrumb Component
|
|
@@ -2828,13 +2851,13 @@ var styles$e = {"breadcrumb":"Breadcrumb-module_breadcrumb__pGabz","separator":"
|
|
|
2828
2851
|
* />
|
|
2829
2852
|
*/
|
|
2830
2853
|
const Breadcrumb = ({ items, onNavigate, className = '' }) => {
|
|
2831
|
-
return (jsx("nav", { className: `${styles$
|
|
2854
|
+
return (jsx("nav", { className: `${styles$f.breadcrumb} ${className}`, "aria-label": "Breadcrumb", children: items.map((item, index) => {
|
|
2832
2855
|
const isLast = index === items.length - 1;
|
|
2833
|
-
return (jsxs(React.Fragment, { children: [index > 0 && jsx(ChevronRight, { size: 14, className: styles$
|
|
2856
|
+
return (jsxs(React.Fragment, { children: [index > 0 && jsx(ChevronRight, { size: 14, className: styles$f.separator }), isLast || !item.href ? (jsx("span", { className: `${styles$f.item} ${isLast ? styles$f.current : ''}`, children: item.label })) : (jsx("button", { className: `${styles$f.item} ${styles$f.link}`, onClick: () => onNavigate?.(item.href), children: item.label }))] }, index));
|
|
2834
2857
|
}) }));
|
|
2835
2858
|
};
|
|
2836
2859
|
|
|
2837
|
-
var styles$
|
|
2860
|
+
var styles$e = {"overlay":"LiquidButton-module_overlay__-P-xm","container":"LiquidButton-module_container__f1COS","actions":"LiquidButton-module_actions__XBz7p","actionButton":"LiquidButton-module_actionButton__PlEOk","actionLabel":"LiquidButton-module_actionLabel__tIGHE","button":"LiquidButton-module_button__znjyS"};
|
|
2838
2861
|
|
|
2839
2862
|
/**
|
|
2840
2863
|
* LiquidButton Component
|
|
@@ -2860,10 +2883,167 @@ const LiquidButton = ({ actions, icon: Icon = Plus, className = '', }) => {
|
|
|
2860
2883
|
setExpanded(false);
|
|
2861
2884
|
action.onClick();
|
|
2862
2885
|
}, []);
|
|
2863
|
-
return (jsxs(Fragment, { children: [jsx(AnimatePresence, { children: expanded && (jsx(motion.div, { className: styles$
|
|
2886
|
+
return (jsxs(Fragment, { children: [jsx(AnimatePresence, { children: expanded && (jsx(motion.div, { className: styles$e.overlay, initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: handleToggle })) }), jsxs("div", { className: `${styles$e.container} ${className}`, children: [jsx(AnimatePresence, { children: expanded && (jsx("div", { className: styles$e.actions, children: actions.map((action, index) => (jsxs(motion.button, { type: "button", className: styles$e.actionButton, initial: { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, transition: {
|
|
2864
2887
|
duration: 0.15,
|
|
2865
2888
|
delay: (actions.length - 1 - index) * 0.05,
|
|
2866
|
-
}, onClick: () => handleAction(action), children: [jsx(action.icon, { size: 18, color: action.color }), jsx("span", { className: styles$
|
|
2889
|
+
}, onClick: () => handleAction(action), children: [jsx(action.icon, { size: 18, color: action.color }), jsx("span", { className: styles$e.actionLabel, children: action.label })] }, action.key))) })) }), jsx(motion.button, { type: "button", className: styles$e.button, onClick: handleToggle, animate: { rotate: expanded ? 45 : 0 }, transition: { duration: 0.2 }, "aria-label": expanded ? 'Close actions' : 'Open actions', children: jsx(Icon, { size: 24, strokeWidth: 2.5 }) })] })] }));
|
|
2890
|
+
};
|
|
2891
|
+
|
|
2892
|
+
var styles$d = {"container":"RecurrencePicker-module_container__2Ewc4","field":"RecurrencePicker-module_field__3rsnB","fieldCentered":"RecurrencePicker-module_fieldCentered__wP27Q","fieldLabel":"RecurrencePicker-module_fieldLabel__HCMBQ","fieldRow":"RecurrencePicker-module_fieldRow__AQ4k7","fieldUnit":"RecurrencePicker-module_fieldUnit__WHbVN","dayPicker":"RecurrencePicker-module_dayPicker__a5ue6","dayBtn":"RecurrencePicker-module_dayBtn__WIxNY","dayBtnActive":"RecurrencePicker-module_dayBtnActive__mX7FB","preview":"RecurrencePicker-module_preview__tfAQ-"};
|
|
2893
|
+
|
|
2894
|
+
const DEFAULT_STATE = {
|
|
2895
|
+
freq: 'WEEKLY',
|
|
2896
|
+
interval: 1,
|
|
2897
|
+
byDay: ['MO'],
|
|
2898
|
+
byMonthDay: 1,
|
|
2899
|
+
monthlyLast: false,
|
|
2900
|
+
byMonth: 1,
|
|
2901
|
+
yearDay: 1,
|
|
2902
|
+
};
|
|
2903
|
+
const WEEKDAYS = [
|
|
2904
|
+
{ code: 'MO', label: 'M', rrule: RRule.MO },
|
|
2905
|
+
{ code: 'TU', label: 'T', rrule: RRule.TU },
|
|
2906
|
+
{ code: 'WE', label: 'W', rrule: RRule.WE },
|
|
2907
|
+
{ code: 'TH', label: 'T', rrule: RRule.TH },
|
|
2908
|
+
{ code: 'FR', label: 'F', rrule: RRule.FR },
|
|
2909
|
+
{ code: 'SA', label: 'S', rrule: RRule.SA },
|
|
2910
|
+
{ code: 'SU', label: 'S', rrule: RRule.SU },
|
|
2911
|
+
];
|
|
2912
|
+
const MONTHS$1 = [
|
|
2913
|
+
'January',
|
|
2914
|
+
'February',
|
|
2915
|
+
'March',
|
|
2916
|
+
'April',
|
|
2917
|
+
'May',
|
|
2918
|
+
'June',
|
|
2919
|
+
'July',
|
|
2920
|
+
'August',
|
|
2921
|
+
'September',
|
|
2922
|
+
'October',
|
|
2923
|
+
'November',
|
|
2924
|
+
'December',
|
|
2925
|
+
];
|
|
2926
|
+
const FREQ_MAP = {
|
|
2927
|
+
DAILY: RRule.DAILY,
|
|
2928
|
+
WEEKLY: RRule.WEEKLY,
|
|
2929
|
+
MONTHLY: RRule.MONTHLY,
|
|
2930
|
+
YEARLY: RRule.YEARLY,
|
|
2931
|
+
};
|
|
2932
|
+
const REVERSE_FREQ = {
|
|
2933
|
+
[RRule.DAILY]: 'DAILY',
|
|
2934
|
+
[RRule.WEEKLY]: 'WEEKLY',
|
|
2935
|
+
[RRule.MONTHLY]: 'MONTHLY',
|
|
2936
|
+
[RRule.YEARLY]: 'YEARLY',
|
|
2937
|
+
};
|
|
2938
|
+
const buildRule = (s) => {
|
|
2939
|
+
const opts = { freq: FREQ_MAP[s.freq] };
|
|
2940
|
+
if (s.interval > 1)
|
|
2941
|
+
opts.interval = s.interval;
|
|
2942
|
+
if (s.freq === 'WEEKLY' && s.byDay.length > 0) {
|
|
2943
|
+
opts.byweekday = s.byDay
|
|
2944
|
+
.map(c => WEEKDAYS.find(w => w.code === c)?.rrule)
|
|
2945
|
+
.filter((w) => !!w);
|
|
2946
|
+
}
|
|
2947
|
+
if (s.freq === 'MONTHLY') {
|
|
2948
|
+
opts.bymonthday = s.monthlyLast ? -1 : s.byMonthDay;
|
|
2949
|
+
}
|
|
2950
|
+
if (s.freq === 'YEARLY') {
|
|
2951
|
+
opts.bymonth = s.byMonth;
|
|
2952
|
+
opts.bymonthday = s.yearDay;
|
|
2953
|
+
}
|
|
2954
|
+
const rule = new RRule(opts);
|
|
2955
|
+
return rule.toString().replace(/^(?:DTSTART:[^\n]*\n)?RRULE:/, '');
|
|
2956
|
+
};
|
|
2957
|
+
const parseRule = (rule) => {
|
|
2958
|
+
try {
|
|
2959
|
+
const opts = RRule.parseString(rule);
|
|
2960
|
+
const freq = REVERSE_FREQ[opts.freq];
|
|
2961
|
+
if (!freq)
|
|
2962
|
+
return null;
|
|
2963
|
+
const byweekday = opts.byweekday ?? [];
|
|
2964
|
+
const byDay = byweekday
|
|
2965
|
+
.map(w => {
|
|
2966
|
+
const n = typeof w === 'number' ? w : w.weekday;
|
|
2967
|
+
return WEEKDAYS.find(d => d.rrule.weekday === n)?.code;
|
|
2968
|
+
})
|
|
2969
|
+
.filter((c) => !!c);
|
|
2970
|
+
const bmd = opts.bymonthday;
|
|
2971
|
+
const bymonthday = Array.isArray(bmd) ? bmd[0] : bmd;
|
|
2972
|
+
const bm = opts.bymonth;
|
|
2973
|
+
const bymonth = Array.isArray(bm) ? bm[0] : bm;
|
|
2974
|
+
return {
|
|
2975
|
+
freq,
|
|
2976
|
+
interval: opts.interval || 1,
|
|
2977
|
+
byDay: byDay.length > 0 ? byDay : ['MO'],
|
|
2978
|
+
byMonthDay: freq === 'MONTHLY' && bymonthday && bymonthday > 0 ? bymonthday : 1,
|
|
2979
|
+
monthlyLast: freq === 'MONTHLY' && bymonthday === -1,
|
|
2980
|
+
byMonth: freq === 'YEARLY' ? bymonth || 1 : 1,
|
|
2981
|
+
yearDay: freq === 'YEARLY' && bymonthday ? bymonthday : 1,
|
|
2982
|
+
};
|
|
2983
|
+
}
|
|
2984
|
+
catch {
|
|
2985
|
+
return null;
|
|
2986
|
+
}
|
|
2987
|
+
};
|
|
2988
|
+
const stateFromValue = (value) => {
|
|
2989
|
+
if (!value)
|
|
2990
|
+
return DEFAULT_STATE;
|
|
2991
|
+
return parseRule(value) ?? DEFAULT_STATE;
|
|
2992
|
+
};
|
|
2993
|
+
const RecurrencePicker = ({ value, onChange, className, }) => {
|
|
2994
|
+
const [state, setState] = useState(() => stateFromValue(value));
|
|
2995
|
+
const built = useMemo(() => buildRule(state), [state]);
|
|
2996
|
+
// Re-sync internal state if the parent passes a different rule than the one
|
|
2997
|
+
// we currently render. The `built === value` guard prevents the loop where
|
|
2998
|
+
// our own emit comes back through `value` and triggers a redundant resync.
|
|
2999
|
+
useEffect(() => {
|
|
3000
|
+
if (value && value !== built) {
|
|
3001
|
+
const parsed = parseRule(value);
|
|
3002
|
+
if (parsed)
|
|
3003
|
+
setState(parsed);
|
|
3004
|
+
}
|
|
3005
|
+
}, [value, built]);
|
|
3006
|
+
// On mount, if the parent didn't seed a rule, push our default up so its
|
|
3007
|
+
// state matches what we visually display. Runs once.
|
|
3008
|
+
useEffect(() => {
|
|
3009
|
+
if (!value)
|
|
3010
|
+
onChange(built);
|
|
3011
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3012
|
+
}, []);
|
|
3013
|
+
const update = (patch) => {
|
|
3014
|
+
const next = { ...state, ...patch };
|
|
3015
|
+
setState(next);
|
|
3016
|
+
onChange(buildRule(next));
|
|
3017
|
+
};
|
|
3018
|
+
const toggleDay = (code) => {
|
|
3019
|
+
const byDay = state.byDay.includes(code)
|
|
3020
|
+
? state.byDay.filter(c => c !== code)
|
|
3021
|
+
: [...state.byDay, code];
|
|
3022
|
+
update({ byDay });
|
|
3023
|
+
};
|
|
3024
|
+
const preview = useMemo(() => {
|
|
3025
|
+
try {
|
|
3026
|
+
return RRule.fromString(built).toText();
|
|
3027
|
+
}
|
|
3028
|
+
catch {
|
|
3029
|
+
return built;
|
|
3030
|
+
}
|
|
3031
|
+
}, [built]);
|
|
3032
|
+
const unitLabel = {
|
|
3033
|
+
DAILY: state.interval === 1 ? 'day' : 'days',
|
|
3034
|
+
WEEKLY: state.interval === 1 ? 'week' : 'weeks',
|
|
3035
|
+
MONTHLY: state.interval === 1 ? 'month' : 'months',
|
|
3036
|
+
YEARLY: state.interval === 1 ? 'year' : 'years',
|
|
3037
|
+
};
|
|
3038
|
+
return (jsxs("div", { className: `${styles$d.container}${className ? ` ${className}` : ''}`, children: [jsx("div", { className: styles$d.field, children: jsx(SelectInput, { label: "Frequency", value: state.freq, onChange: v => update({ freq: v }), options: [
|
|
3039
|
+
{ value: 'DAILY', label: 'Daily' },
|
|
3040
|
+
{ value: 'WEEKLY', label: 'Weekly' },
|
|
3041
|
+
{ value: 'MONTHLY', label: 'Monthly' },
|
|
3042
|
+
{ value: 'YEARLY', label: 'Yearly' },
|
|
3043
|
+
] }) }), jsxs("div", { className: styles$d.field, children: [jsx("span", { className: styles$d.fieldLabel, children: "Every" }), jsxs("div", { className: styles$d.fieldRow, children: [jsx(NumberStepper, { value: state.interval, onChange: v => update({ interval: Math.max(1, v) }), min: 1, max: 99, hideLimits: true, size: "small" }), jsx("span", { className: styles$d.fieldUnit, children: unitLabel[state.freq] })] })] }), state.freq === 'WEEKLY' && (jsxs("div", { className: `${styles$d.field} ${styles$d.fieldCentered}`, children: [jsx("span", { className: styles$d.fieldLabel, children: "On" }), jsx("div", { className: styles$d.dayPicker, children: WEEKDAYS.map(d => (jsx("button", { type: "button", className: `${styles$d.dayBtn} ${state.byDay.includes(d.code) ? styles$d.dayBtnActive : ''}`, onClick: () => toggleDay(d.code), "aria-label": d.code, children: d.label }, d.code))) })] })), state.freq === 'MONTHLY' && (jsxs("div", { className: styles$d.field, children: [jsx("span", { className: styles$d.fieldLabel, children: "Day of month" }), jsxs("div", { className: styles$d.fieldRow, children: [jsx(NumberStepper, { value: state.byMonthDay, onChange: v => update({ byMonthDay: Math.min(31, Math.max(1, v)) }), min: 1, max: 31, disabled: state.monthlyLast, hideLimits: true, size: "small" }), jsx(Checkbox, { checked: state.monthlyLast, onChange: v => update({ monthlyLast: v }), label: "Last day" })] })] })), state.freq === 'YEARLY' && (jsxs(Fragment, { children: [jsx("div", { className: styles$d.field, children: jsx(SelectInput, { label: "Month", value: String(state.byMonth), onChange: v => update({ byMonth: Number(v) }), options: MONTHS$1.map((m, i) => ({
|
|
3044
|
+
value: String(i + 1),
|
|
3045
|
+
label: m,
|
|
3046
|
+
})) }) }), jsxs("div", { className: styles$d.field, children: [jsx("span", { className: styles$d.fieldLabel, children: "Day" }), jsx(NumberStepper, { value: state.yearDay, onChange: v => update({ yearDay: Math.min(31, Math.max(1, v)) }), min: 1, max: 31, hideLimits: true, size: "small" })] })] })), jsx("div", { className: styles$d.preview, children: preview })] }));
|
|
2867
3047
|
};
|
|
2868
3048
|
|
|
2869
3049
|
var styles$c = {"wrap":"StreamConsole-module_wrap__MnVWw","header":"StreamConsole-module_header__FjnRM","headerLeft":"StreamConsole-module_headerLeft__gNDyh","statusDot":"StreamConsole-module_statusDot__xQ254","spin":"StreamConsole-module_spin__OrOeL","label":"StreamConsole-module_label__rJIDm","statusText":"StreamConsole-module_statusText__oG-ej","dismiss":"StreamConsole-module_dismiss__WH3Kv","body":"StreamConsole-module_body__-HIK-","hint":"StreamConsole-module_hint__BA4SI","line":"StreamConsole-module_line__5hMY2","linePrefix":"StreamConsole-module_linePrefix__xR-Oj","lineText":"StreamConsole-module_lineText__IyRSF","lineLabel":"StreamConsole-module_lineLabel__z-qj4"};
|
|
@@ -4573,7 +4753,7 @@ const HabitTimeOfDayChart = ({ events, width = 800, height = 400, startDate, end
|
|
|
4573
4753
|
: ''] }), tooltipData.count > 1 && (jsxs("div", { className: styles$7.tooltipValue, children: [jsx("strong", { children: tooltipData.count }), jsx("span", { className: styles$7.tooltipUnits, children: "events" })] }))] })] })) : (jsxs(Fragment, { children: [jsx("div", { className: styles$7.tooltipHeader, children: jsx("span", { children: formatHour(tooltipData.hour) }) }), jsxs("div", { className: styles$7.tooltipInfo, children: [jsxs("div", { className: styles$7.tooltipValue, children: [jsx("strong", { children: tooltipData.count }), jsxs("span", { className: styles$7.tooltipUnits, children: ["event", tooltipData.count === 1 ? '' : 's'] })] }), tooltipData.breakdown && tooltipData.breakdown.length > 1 && (jsx("div", { className: styles$7.tooltipBreakdown, children: tooltipData.breakdown.map(({ habit, count }) => (jsxs("div", { className: styles$7.tooltipBreakdownRow, children: [jsx("span", { className: styles$7.tooltipDot, style: { backgroundColor: getColor(habit) } }), jsxs("span", { children: [customHabitEmojis[habit] || '', " ", habit] }), jsx("span", { className: styles$7.tooltipCount, children: count })] }, habit))) }))] })] })) }))] }));
|
|
4574
4754
|
};
|
|
4575
4755
|
|
|
4576
|
-
var styles$6 = {"container":"SleepChart-module_container__RjHVU","header":"SleepChart-module_header__bcoWe","
|
|
4756
|
+
var styles$6 = {"container":"SleepChart-module_container__RjHVU","header":"SleepChart-module_header__bcoWe","eyebrow":"SleepChart-module_eyebrow__KH0ox","title":"SleepChart-module_title__6-QII","chart":"SleepChart-module_chart__jC1nL","gridLine":"SleepChart-module_gridLine__hi715","gridLineAccent":"SleepChart-module_gridLineAccent__Sk-l6","sleepBar":"SleepChart-module_sleepBar__Hk76f","sleepBarHover":"SleepChart-module_sleepBarHover__cBTca","squiggle":"SleepChart-module_squiggle__Hxfjx","endpoint":"SleepChart-module_endpoint__vB4WD","endpointSleep":"SleepChart-module_endpointSleep__FA1vK","endpointWake":"SleepChart-module_endpointWake__CWEOB","xAxis":"SleepChart-module_xAxis__xzXyM","yAxis":"SleepChart-module_yAxis__7N-LA","tooltip":"SleepChart-module_tooltip__jQBv1","visible":"SleepChart-module_visible__wy0ck","tooltipDate":"SleepChart-module_tooltipDate__g2kOA","tooltipBody":"SleepChart-module_tooltipBody__RamWJ","tooltipRow":"SleepChart-module_tooltipRow__CuDaE","tooltipTotal":"SleepChart-module_tooltipTotal__5v3dE"};
|
|
4577
4757
|
|
|
4578
4758
|
const parseTimeToDecimal = (time) => {
|
|
4579
4759
|
const [hours, minutes] = time.split(':').map(Number);
|
|
@@ -4581,288 +4761,217 @@ const parseTimeToDecimal = (time) => {
|
|
|
4581
4761
|
};
|
|
4582
4762
|
const formatTime = (hour) => {
|
|
4583
4763
|
const h24 = Math.floor(hour % 24);
|
|
4584
|
-
const h12 = h24 === 0 ? 12 : h24 > 12 ? h24 - 12 : h24;
|
|
4585
|
-
const ampm = h24 >= 12 ? 'PM' : 'AM';
|
|
4586
4764
|
const minutes = Math.round((hour % 1) * 60);
|
|
4587
|
-
return `${
|
|
4765
|
+
return `${h24.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
|
4766
|
+
};
|
|
4767
|
+
const formatDuration = (decimal) => {
|
|
4768
|
+
const h = Math.floor(decimal);
|
|
4769
|
+
const m = Math.round((decimal % 1) * 60);
|
|
4770
|
+
return `${h}h ${m.toString().padStart(2, '0')}m`;
|
|
4588
4771
|
};
|
|
4589
|
-
|
|
4772
|
+
// Build an SVG sine-wave path between two x-coordinates at a given baseline y.
|
|
4773
|
+
// Two quadratic curves per cycle keep the curve smooth without needing cubic control points.
|
|
4774
|
+
const buildSquigglePath = (x1, x2, y, amplitude, wavelength) => {
|
|
4775
|
+
const distance = Math.max(0, x2 - x1);
|
|
4776
|
+
if (distance === 0)
|
|
4777
|
+
return `M ${x1} ${y}`;
|
|
4778
|
+
const cycles = Math.max(1, Math.round(distance / wavelength));
|
|
4779
|
+
const halfStep = distance / (cycles * 2);
|
|
4780
|
+
let path = `M ${x1} ${y}`;
|
|
4781
|
+
for (let i = 0; i < cycles * 2; i++) {
|
|
4782
|
+
const cx = x1 + (i + 0.5) * halfStep;
|
|
4783
|
+
const cy = y + (i % 2 === 0 ? -amplitude : amplitude);
|
|
4784
|
+
const ex = x1 + (i + 1) * halfStep;
|
|
4785
|
+
path += ` Q ${cx} ${cy} ${ex} ${y}`;
|
|
4786
|
+
}
|
|
4787
|
+
return path;
|
|
4788
|
+
};
|
|
4789
|
+
const SleepChart = ({ sleepData, width = 800, height = 400, onDateClick, }) => {
|
|
4590
4790
|
const svgRef = useRef(null);
|
|
4591
4791
|
const [tooltipData, setTooltipData] = useState(null);
|
|
4592
|
-
const margin = useMemo(() => ({ top:
|
|
4792
|
+
const margin = useMemo(() => ({ top: 12, right: 16, bottom: 32, left: 64 }), []);
|
|
4593
4793
|
const chartWidth = width - margin.left - margin.right;
|
|
4594
4794
|
const chartHeight = height - margin.top - margin.bottom;
|
|
4595
|
-
// Hide tooltip on scroll
|
|
4596
4795
|
useEffect(() => {
|
|
4597
|
-
const handleScroll = () =>
|
|
4598
|
-
setTooltipData(null);
|
|
4599
|
-
};
|
|
4796
|
+
const handleScroll = () => setTooltipData(null);
|
|
4600
4797
|
window.addEventListener('scroll', handleScroll, true);
|
|
4601
|
-
return () =>
|
|
4602
|
-
window.removeEventListener('scroll', handleScroll, true);
|
|
4603
|
-
};
|
|
4798
|
+
return () => window.removeEventListener('scroll', handleScroll, true);
|
|
4604
4799
|
}, []);
|
|
4605
4800
|
useEffect(() => {
|
|
4606
4801
|
if (!svgRef.current || sleepData.length === 0)
|
|
4607
4802
|
return;
|
|
4608
4803
|
const svg = d3.select(svgRef.current);
|
|
4609
4804
|
svg.selectAll('*').remove();
|
|
4610
|
-
// Add invisible rect to detect mouse leave events
|
|
4611
4805
|
svg.append('rect')
|
|
4612
4806
|
.attr('width', width)
|
|
4613
4807
|
.attr('height', height)
|
|
4614
4808
|
.attr('fill', 'transparent')
|
|
4615
4809
|
.style('pointer-events', 'all')
|
|
4616
|
-
.on('mouseleave', () =>
|
|
4617
|
-
|
|
4618
|
-
|
|
4619
|
-
const g = svg.append('g')
|
|
4810
|
+
.on('mouseleave', () => setTooltipData(null));
|
|
4811
|
+
const g = svg
|
|
4812
|
+
.append('g')
|
|
4620
4813
|
.attr('transform', `translate(${margin.left},${margin.top})`);
|
|
4621
|
-
const xScale = d3.scaleLinear()
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
const yScale = d3.scaleBand()
|
|
4814
|
+
const xScale = d3.scaleLinear().domain([18, 42]).range([0, chartWidth]);
|
|
4815
|
+
const yDomain = sleepData.map((d) => d.date);
|
|
4816
|
+
const yScale = d3
|
|
4817
|
+
.scaleBand()
|
|
4626
4818
|
.domain(yDomain)
|
|
4627
4819
|
.range([0, chartHeight])
|
|
4628
|
-
.paddingInner(0.
|
|
4820
|
+
.paddingInner(0.35)
|
|
4629
4821
|
.paddingOuter(0.1);
|
|
4630
|
-
//
|
|
4822
|
+
// Dotted vertical gridlines; midnight/noon are slightly more present.
|
|
4631
4823
|
g.selectAll('.grid-line-x')
|
|
4632
|
-
.data(d3.range(18, 43,
|
|
4633
|
-
.enter()
|
|
4824
|
+
.data(d3.range(18, 43, 3))
|
|
4825
|
+
.enter()
|
|
4826
|
+
.append('line')
|
|
4634
4827
|
.attr('class', styles$6.gridLine)
|
|
4635
|
-
.attr('x1', d => xScale(d))
|
|
4828
|
+
.attr('x1', (d) => xScale(d))
|
|
4636
4829
|
.attr('y1', 0)
|
|
4637
|
-
.attr('x2', d => xScale(d))
|
|
4830
|
+
.attr('x2', (d) => xScale(d))
|
|
4638
4831
|
.attr('y2', chartHeight)
|
|
4639
|
-
.
|
|
4640
|
-
const hour = d % 24;
|
|
4641
|
-
if (hour === 0)
|
|
4642
|
-
return 'var(--color-border)'; // Midnight
|
|
4643
|
-
if (hour === 12)
|
|
4644
|
-
return 'var(--color-border)'; // Noon
|
|
4645
|
-
return 'var(--color-border)';
|
|
4646
|
-
})
|
|
4647
|
-
.style('stroke-opacity', d => {
|
|
4832
|
+
.classed(styles$6.gridLineAccent, (d) => {
|
|
4648
4833
|
const hour = d % 24;
|
|
4649
|
-
|
|
4650
|
-
return 0.3;
|
|
4651
|
-
if (hour % 3 === 0)
|
|
4652
|
-
return 0.15;
|
|
4653
|
-
return 0.05;
|
|
4654
|
-
})
|
|
4655
|
-
.style('stroke-width', d => {
|
|
4656
|
-
const hour = d % 24;
|
|
4657
|
-
if (hour === 0 || hour === 12)
|
|
4658
|
-
return 2;
|
|
4659
|
-
return 1;
|
|
4834
|
+
return hour === 0 || hour === 12;
|
|
4660
4835
|
});
|
|
4661
4836
|
sleepData.forEach((dayData) => {
|
|
4662
4837
|
const yValue = yScale(dayData.date);
|
|
4663
4838
|
if (yValue === undefined)
|
|
4664
4839
|
return;
|
|
4665
4840
|
const barHeight = yScale.bandwidth();
|
|
4666
|
-
const sleepGroup = g
|
|
4841
|
+
const sleepGroup = g
|
|
4842
|
+
.append('g')
|
|
4667
4843
|
.attr('class', styles$6.sleepBar)
|
|
4668
|
-
.style('cursor', 'pointer')
|
|
4844
|
+
.style('cursor', onDateClick ? 'pointer' : 'default')
|
|
4669
4845
|
.on('click', () => onDateClick?.(dayData.date));
|
|
4670
|
-
// Handle sleep time and wake hour separately
|
|
4671
4846
|
let sleepHour = null;
|
|
4672
4847
|
let wakeHour = null;
|
|
4673
4848
|
if (dayData.sleep_time) {
|
|
4674
4849
|
sleepHour = parseTimeToDecimal(dayData.sleep_time);
|
|
4675
|
-
|
|
4676
|
-
if (sleepHour < 18) {
|
|
4850
|
+
if (sleepHour < 18)
|
|
4677
4851
|
sleepHour += 24;
|
|
4678
|
-
}
|
|
4679
4852
|
}
|
|
4680
4853
|
if (dayData.wake_hour) {
|
|
4681
4854
|
wakeHour = parseTimeToDecimal(dayData.wake_hour);
|
|
4682
|
-
// If we have sleep time, wake time should be after sleep time
|
|
4683
4855
|
if (sleepHour !== null) {
|
|
4684
|
-
// If wake hour is before sleep hour or very early, it's next day
|
|
4685
4856
|
if (wakeHour < sleepHour || (sleepHour >= 18 && wakeHour < 18)) {
|
|
4686
4857
|
wakeHour += 24;
|
|
4687
4858
|
}
|
|
4688
4859
|
}
|
|
4689
|
-
else {
|
|
4690
|
-
|
|
4691
|
-
if (wakeHour < 12) {
|
|
4692
|
-
wakeHour += 24;
|
|
4693
|
-
}
|
|
4860
|
+
else if (wakeHour < 12) {
|
|
4861
|
+
wakeHour += 24;
|
|
4694
4862
|
}
|
|
4695
4863
|
}
|
|
4696
|
-
// Draw the bar only if both values exist
|
|
4697
4864
|
if (sleepHour !== null && wakeHour !== null) {
|
|
4698
|
-
const
|
|
4699
|
-
|
|
4700
|
-
|
|
4701
|
-
|
|
4702
|
-
|
|
4703
|
-
|
|
4704
|
-
|
|
4705
|
-
.
|
|
4706
|
-
.attr('
|
|
4707
|
-
.attr('
|
|
4708
|
-
.
|
|
4709
|
-
|
|
4710
|
-
|
|
4711
|
-
.
|
|
4712
|
-
|
|
4865
|
+
const x1 = xScale(sleepHour);
|
|
4866
|
+
const x2 = xScale(wakeHour);
|
|
4867
|
+
const y = yValue + barHeight / 2;
|
|
4868
|
+
const amplitude = Math.min(barHeight / 2.2, 7);
|
|
4869
|
+
const wavelength = 14;
|
|
4870
|
+
const d = buildSquigglePath(x1, x2, y, amplitude, wavelength);
|
|
4871
|
+
const path = sleepGroup
|
|
4872
|
+
.append('path')
|
|
4873
|
+
.attr('class', styles$6.squiggle)
|
|
4874
|
+
.attr('d', d)
|
|
4875
|
+
.attr('fill', 'none');
|
|
4876
|
+
const node = path.node();
|
|
4877
|
+
const length = typeof node.getTotalLength === 'function'
|
|
4878
|
+
? node.getTotalLength()
|
|
4879
|
+
: (x2 - x1) * 1.8;
|
|
4880
|
+
path.attr('stroke-dasharray', length)
|
|
4881
|
+
.attr('stroke-dashoffset', length)
|
|
4882
|
+
.transition()
|
|
4883
|
+
.duration(540)
|
|
4713
4884
|
.ease(d3.easeCubicOut)
|
|
4714
|
-
.attr('
|
|
4715
|
-
.attr('opacity', 0.85);
|
|
4885
|
+
.attr('stroke-dashoffset', 0);
|
|
4716
4886
|
}
|
|
4717
|
-
// Draw sleep dot if sleep time exists
|
|
4718
4887
|
if (sleepHour !== null) {
|
|
4719
|
-
|
|
4888
|
+
sleepGroup
|
|
4889
|
+
.append('circle')
|
|
4890
|
+
.attr('class', `${styles$6.endpoint} ${styles$6.endpointSleep}`)
|
|
4720
4891
|
.attr('cx', xScale(sleepHour))
|
|
4721
4892
|
.attr('cy', yValue + barHeight / 2)
|
|
4722
|
-
.attr('r', 0)
|
|
4723
|
-
.
|
|
4724
|
-
.
|
|
4725
|
-
.
|
|
4726
|
-
.
|
|
4727
|
-
.
|
|
4728
|
-
// Animate the dot
|
|
4729
|
-
sleepDot.transition()
|
|
4730
|
-
.duration(400)
|
|
4731
|
-
.delay(300 + Math.random() * 100)
|
|
4732
|
-
.ease(d3.easeBackOut)
|
|
4733
|
-
.attr('r', 6);
|
|
4893
|
+
.attr('r', 0)
|
|
4894
|
+
.transition()
|
|
4895
|
+
.duration(280)
|
|
4896
|
+
.delay(160)
|
|
4897
|
+
.ease(d3.easeCubicOut)
|
|
4898
|
+
.attr('r', 3.5);
|
|
4734
4899
|
}
|
|
4735
|
-
// Draw wake dot if wake hour exists
|
|
4736
4900
|
if (wakeHour !== null) {
|
|
4737
|
-
|
|
4901
|
+
sleepGroup
|
|
4902
|
+
.append('circle')
|
|
4903
|
+
.attr('class', `${styles$6.endpoint} ${styles$6.endpointWake}`)
|
|
4738
4904
|
.attr('cx', xScale(wakeHour))
|
|
4739
4905
|
.attr('cy', yValue + barHeight / 2)
|
|
4740
|
-
.attr('r', 0)
|
|
4741
|
-
.
|
|
4742
|
-
.
|
|
4743
|
-
.
|
|
4744
|
-
.
|
|
4745
|
-
.
|
|
4746
|
-
// Animate the dot
|
|
4747
|
-
wakeDot.transition()
|
|
4748
|
-
.duration(400)
|
|
4749
|
-
.delay(500 + Math.random() * 100)
|
|
4750
|
-
.ease(d3.easeBackOut)
|
|
4751
|
-
.attr('r', 6);
|
|
4906
|
+
.attr('r', 0)
|
|
4907
|
+
.transition()
|
|
4908
|
+
.duration(280)
|
|
4909
|
+
.delay(220)
|
|
4910
|
+
.ease(d3.easeCubicOut)
|
|
4911
|
+
.attr('r', 3.5);
|
|
4752
4912
|
}
|
|
4753
|
-
// Add hover interactions with tooltip
|
|
4754
4913
|
sleepGroup
|
|
4755
4914
|
.on('mouseenter', function (event) {
|
|
4756
|
-
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
.
|
|
4760
|
-
|
|
4761
|
-
|
|
4762
|
-
|
|
4763
|
-
|
|
4764
|
-
.
|
|
4765
|
-
|
|
4766
|
-
.attr('r', 8);
|
|
4767
|
-
// Calculate tooltip data
|
|
4768
|
-
const rect = svgRef.current?.getBoundingClientRect();
|
|
4769
|
-
if (rect) {
|
|
4770
|
-
const duration = (sleepHour !== null && wakeHour !== null)
|
|
4771
|
-
? wakeHour - sleepHour
|
|
4772
|
-
: null;
|
|
4773
|
-
setTooltipData({
|
|
4774
|
-
date: dayData.date,
|
|
4775
|
-
sleepTime: sleepHour !== null ? formatTime(sleepHour) : null,
|
|
4776
|
-
wakeTime: wakeHour !== null ? formatTime(wakeHour) : null,
|
|
4777
|
-
duration: duration !== null ? Math.round(duration * 100) / 100 : null,
|
|
4778
|
-
x: event.pageX,
|
|
4779
|
-
y: event.pageY - 80
|
|
4780
|
-
});
|
|
4781
|
-
}
|
|
4915
|
+
d3.select(this).classed(styles$6.sleepBarHover, true);
|
|
4916
|
+
const duration = sleepHour !== null && wakeHour !== null ? wakeHour - sleepHour : null;
|
|
4917
|
+
setTooltipData({
|
|
4918
|
+
date: dayData.date,
|
|
4919
|
+
sleepTime: sleepHour !== null ? formatTime(sleepHour) : null,
|
|
4920
|
+
wakeTime: wakeHour !== null ? formatTime(wakeHour) : null,
|
|
4921
|
+
duration: duration !== null ? Math.round(duration * 100) / 100 : null,
|
|
4922
|
+
x: event.pageX,
|
|
4923
|
+
y: event.pageY - 12,
|
|
4924
|
+
});
|
|
4782
4925
|
})
|
|
4783
4926
|
.on('mouseleave', function () {
|
|
4784
|
-
|
|
4785
|
-
d3.select(this).select('rect')
|
|
4786
|
-
.transition()
|
|
4787
|
-
.duration(200)
|
|
4788
|
-
.attr('opacity', 0.85)
|
|
4789
|
-
.style('filter', 'drop-shadow(0 2px 8px rgba(155, 89, 182, 0.3))');
|
|
4790
|
-
// Reset dots
|
|
4791
|
-
d3.select(this).selectAll('circle')
|
|
4792
|
-
.transition()
|
|
4793
|
-
.duration(200)
|
|
4794
|
-
.attr('r', 6);
|
|
4795
|
-
// Hide tooltip
|
|
4927
|
+
d3.select(this).classed(styles$6.sleepBarHover, false);
|
|
4796
4928
|
setTooltipData(null);
|
|
4797
4929
|
})
|
|
4798
4930
|
.on('mousemove', function (event) {
|
|
4799
|
-
|
|
4800
|
-
setTooltipData(prev => prev ? {
|
|
4801
|
-
...prev,
|
|
4802
|
-
x: event.pageX,
|
|
4803
|
-
y: event.pageY - 80
|
|
4804
|
-
} : null);
|
|
4931
|
+
setTooltipData((prev) => prev ? { ...prev, x: event.pageX, y: event.pageY - 12 } : null);
|
|
4805
4932
|
});
|
|
4806
4933
|
});
|
|
4807
|
-
|
|
4808
|
-
const defs = svg.append('defs');
|
|
4809
|
-
const gradient = defs.append('linearGradient')
|
|
4810
|
-
.attr('id', 'sleepGradient')
|
|
4811
|
-
.attr('x1', '0%')
|
|
4812
|
-
.attr('x2', '100%');
|
|
4813
|
-
gradient.append('stop')
|
|
4814
|
-
.attr('offset', '0%')
|
|
4815
|
-
.attr('stop-color', '#9B59B6')
|
|
4816
|
-
.attr('stop-opacity', 1);
|
|
4817
|
-
gradient.append('stop')
|
|
4818
|
-
.attr('offset', '50%')
|
|
4819
|
-
.attr('stop-color', '#7B68A6')
|
|
4820
|
-
.attr('stop-opacity', 1);
|
|
4821
|
-
gradient.append('stop')
|
|
4822
|
-
.attr('offset', '100%')
|
|
4823
|
-
.attr('stop-color', '#3498DB')
|
|
4824
|
-
.attr('stop-opacity', 1);
|
|
4825
|
-
const xAxisTicks = d3.range(18, 43, 3).map(hour => ({
|
|
4934
|
+
const xAxisTicks = d3.range(18, 43, 3).map((hour) => ({
|
|
4826
4935
|
value: hour,
|
|
4827
|
-
label: hour
|
|
4828
|
-
(hour % 24) === 0 ? '12 AM' :
|
|
4829
|
-
(hour % 24) < 12 ? `${hour % 24} AM` :
|
|
4830
|
-
(hour % 24) === 12 ? '12 PM' : `${(hour % 24) - 12} PM`
|
|
4936
|
+
label: `${(hour % 24).toString().padStart(2, '0')}:00`,
|
|
4831
4937
|
}));
|
|
4832
|
-
const xAxis = g
|
|
4938
|
+
const xAxis = g
|
|
4939
|
+
.append('g')
|
|
4833
4940
|
.attr('class', styles$6.xAxis)
|
|
4834
4941
|
.attr('transform', `translate(0,${chartHeight})`)
|
|
4835
|
-
.call(d3
|
|
4836
|
-
.
|
|
4942
|
+
.call(d3
|
|
4943
|
+
.axisBottom(xScale)
|
|
4944
|
+
.tickValues(xAxisTicks.map((t) => t.value))
|
|
4837
4945
|
.tickFormat((d) => {
|
|
4838
|
-
const tick = xAxisTicks.find(t => t.value === d);
|
|
4946
|
+
const tick = xAxisTicks.find((t) => t.value === d);
|
|
4839
4947
|
return tick ? tick.label : '';
|
|
4840
4948
|
})
|
|
4841
|
-
.
|
|
4842
|
-
|
|
4843
|
-
xAxis.
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
const yAxisTicks = yDomain.filter((_, i) => i % Math.ceil(yDomain.length / 10) === 0);
|
|
4849
|
-
g.append('g')
|
|
4949
|
+
.tickSize(0)
|
|
4950
|
+
.tickPadding(10));
|
|
4951
|
+
xAxis.select('.domain').remove();
|
|
4952
|
+
const tickEvery = Math.max(1, Math.ceil(yDomain.length / 8));
|
|
4953
|
+
const yAxisTicks = yDomain.filter((_, i) => i % tickEvery === 0);
|
|
4954
|
+
const yAxis = g
|
|
4955
|
+
.append('g')
|
|
4850
4956
|
.attr('class', styles$6.yAxis)
|
|
4851
|
-
.call(d3
|
|
4957
|
+
.call(d3
|
|
4958
|
+
.axisLeft(yScale)
|
|
4852
4959
|
.tickValues(yAxisTicks)
|
|
4853
|
-
.tickFormat(d => {
|
|
4960
|
+
.tickFormat((d) => {
|
|
4854
4961
|
const date = new Date(d);
|
|
4855
|
-
return `${(date.getMonth() + 1)
|
|
4856
|
-
|
|
4962
|
+
return `${(date.getMonth() + 1)
|
|
4963
|
+
.toString()
|
|
4964
|
+
.padStart(2, '0')}/${date.getDate().toString().padStart(2, '0')}`;
|
|
4965
|
+
})
|
|
4966
|
+
.tickSize(0)
|
|
4967
|
+
.tickPadding(12));
|
|
4968
|
+
yAxis.select('.domain').remove();
|
|
4857
4969
|
}, [sleepData, chartWidth, chartHeight, margin, onDateClick, height, width]);
|
|
4858
|
-
return (jsxs("div", { className: styles$6.container, children: [jsxs("
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
month: 'short',
|
|
4864
|
-
day: 'numeric'
|
|
4865
|
-
}) })] }), jsxs("div", { className: styles$6.tooltipInfo, children: [tooltipData.sleepTime && (jsxs("div", { className: styles$6.tooltipRow, children: [jsxs("span", { className: styles$6.tooltipLabel, children: [jsx("span", { children: "\uD83C\uDF19" }), jsx("span", { children: "Sleep:" })] }), jsx("span", { className: styles$6.tooltipValue, children: tooltipData.sleepTime })] })), tooltipData.wakeTime && (jsxs("div", { className: styles$6.tooltipRow, children: [jsxs("span", { className: styles$6.tooltipLabel, children: [jsx("span", { children: "\u2600\uFE0F" }), jsx("span", { children: "Wake:" })] }), jsx("span", { className: styles$6.tooltipValue, children: tooltipData.wakeTime })] })), tooltipData.duration !== null && (jsxs("div", { className: styles$6.tooltipDuration, children: [jsx("span", { children: "\u23F1\uFE0F" }), jsxs("span", { children: [Math.floor(tooltipData.duration), "h ", Math.round((tooltipData.duration % 1) * 60), "m"] })] }))] })] }))] }));
|
|
4970
|
+
return (jsxs("div", { className: styles$6.container, children: [jsxs("header", { className: styles$6.header, children: [jsx("span", { className: styles$6.eyebrow, children: "the night" }), jsxs("h3", { className: styles$6.title, children: [jsx("em", { children: "Sleep" }), " pattern"] })] }), jsx("svg", { ref: svgRef, width: width, height: height, className: styles$6.chart }), tooltipData && (jsxs("div", { className: `${styles$6.tooltip} ${styles$6.visible}`, style: { left: `${tooltipData.x}px`, top: `${tooltipData.y}px` }, children: [jsx("div", { className: styles$6.tooltipDate, children: new Date(tooltipData.date).toLocaleDateString('en-US', {
|
|
4971
|
+
weekday: 'short',
|
|
4972
|
+
month: 'short',
|
|
4973
|
+
day: 'numeric',
|
|
4974
|
+
}) }), jsxs("div", { className: styles$6.tooltipBody, children: [tooltipData.sleepTime && (jsxs("div", { className: styles$6.tooltipRow, children: [jsx("em", { children: "sleep" }), jsx("time", { children: tooltipData.sleepTime })] })), tooltipData.wakeTime && (jsxs("div", { className: styles$6.tooltipRow, children: [jsx("em", { children: "wake" }), jsx("time", { children: tooltipData.wakeTime })] })), tooltipData.duration !== null && (jsxs("div", { className: `${styles$6.tooltipRow} ${styles$6.tooltipTotal}`, children: [jsx("em", { children: "total" }), jsx("time", { children: formatDuration(tooltipData.duration) })] }))] })] }))] }));
|
|
4866
4975
|
};
|
|
4867
4976
|
|
|
4868
4977
|
var styles$5 = {"container":"BooleansHeatmap-module_container__IOyeU","title":"BooleansHeatmap-module_title__8DRRQ","habitEmoji":"BooleansHeatmap-module_habitEmoji__Mawv-","chart":"BooleansHeatmap-module_chart__-q0Pc","monthLabel":"BooleansHeatmap-module_monthLabel__MXbIg","dayLabel":"BooleansHeatmap-module_dayLabel__2RRtm","cell":"BooleansHeatmap-module_cell__WADVB","legend":"BooleansHeatmap-module_legend__WqGF8","legendItem":"BooleansHeatmap-module_legendItem__rDE2g","legendColor":"BooleansHeatmap-module_legendColor__Z34-d","tooltip":"BooleansHeatmap-module_tooltip__-fHl7"};
|
|
@@ -5143,7 +5252,7 @@ const SunburstChart = ({ data, width = 500, height = 500, title = 'Sunburst Char
|
|
|
5143
5252
|
}
|
|
5144
5253
|
// Calculate new positions based on the original positions
|
|
5145
5254
|
// ALWAYS scale to fill the full circle, no minimum size preservation
|
|
5146
|
-
|
|
5255
|
+
const newX0 = xScale(node.x0Original);
|
|
5147
5256
|
let newX1 = xScale(node.x1Original);
|
|
5148
5257
|
// Ensure proper scaling even for very small segments
|
|
5149
5258
|
// The clicked node's extent should always map to full circle
|
|
@@ -5244,7 +5353,7 @@ const SunburstChart = ({ data, width = 500, height = 500, title = 'Sunburst Char
|
|
|
5244
5353
|
if (focusedNodeRef.current) {
|
|
5245
5354
|
return;
|
|
5246
5355
|
}
|
|
5247
|
-
const hoveredElement =
|
|
5356
|
+
const hoveredElement = event.currentTarget;
|
|
5248
5357
|
// Show tooltip for all nodes
|
|
5249
5358
|
tooltip.transition().duration(200).style('opacity', 1);
|
|
5250
5359
|
const value = d.value || 0;
|
|
@@ -6199,5 +6308,5 @@ const ConfirmationModal = ({ isOpen, onClose, onConfirm, title, message, confirm
|
|
|
6199
6308
|
return (jsx(AnimatePresence, { children: isOpen && (jsxs(Fragment, { children: [jsx(motion.div, { className: styles.overlay, initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: !isLoading ? onClose : undefined }), jsx("div", { className: styles.positioner, children: jsxs(motion.div, { className: styles.modal, initial: { opacity: 0, scale: 0.9, y: 20 }, animate: { opacity: 1, scale: 1, y: 0 }, exit: { opacity: 0, scale: 0.9, y: 20 }, transition: { type: 'spring', stiffness: 300, damping: 30 }, children: [jsxs("div", { className: `${styles.header} ${styles[variant]}`, children: [jsx("h2", { className: styles.title, children: title }), !isLoading && (jsx("button", { className: styles.closeButton, onClick: onClose, type: "button", "aria-label": "Close", children: "\u2715" }))] }), jsx("div", { className: styles.content, children: jsx("p", { className: styles.message, children: message }) }), jsxs("div", { className: styles.footer, children: [jsx(Button, { type: "button", variant: "ghost", onClick: onClose, disabled: isLoading, children: cancelText }), jsx(Button, { type: "button", variant: variant === 'danger' ? 'danger' : 'primary', onClick: handleConfirm, disabled: isLoading, loading: isLoading, children: confirmText })] })] }) })] })) }));
|
|
6200
6309
|
};
|
|
6201
6310
|
|
|
6202
|
-
export { ArrayInput, BooleansHeatmap, Breadcrumb, Button, Calendar, Card, Checkbox, ConfirmationModal, DateInput, DecryptedText, EditFAB, EmptyState, HabitTimeOfDayChart, ImageSlideshow, LiquidButton, LoadingSpinner, Modal, MoodChart, Navbar, NumberStepper, PieChart, QuantifiableHabitsChart, SearchBar, SearchableDropdown, SelectInput, SleepChart, Slider, StreamConsole, SunburstChart, Table, Tabs, TextArea, TextInput, ThemeProvider, ThemeSwitcher, TimeInput, ToastContainer, Toggle, ToggleButton, soundManager, useComponentSound, useSound, useTheme, useThemeSafe };
|
|
6311
|
+
export { ArrayInput, BooleansHeatmap, Breadcrumb, Button, Calendar, Card, Checkbox, ConfirmationModal, DateInput, DecryptedText, EditFAB, EmptyState, HabitTimeOfDayChart, ImageSlideshow, LiquidButton, LoadingSpinner, Modal, MoodChart, Navbar, NumberStepper, PieChart, QuantifiableHabitsChart, RecurrencePicker, SearchBar, SearchableDropdown, SelectInput, SleepChart, Slider, StreamConsole, SunburstChart, Table, Tabs, TextArea, TextInput, ThemeProvider, ThemeSwitcher, TimeInput, ToastContainer, Toggle, ToggleButton, soundManager, useComponentSound, useSound, useTheme, useThemeSafe };
|
|
6203
6312
|
//# sourceMappingURL=index.esm.js.map
|