@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.js
CHANGED
|
@@ -9,7 +9,8 @@ var dayjs = require('dayjs');
|
|
|
9
9
|
var MobileTimePicker = require('@mui/x-date-pickers/MobileTimePicker');
|
|
10
10
|
var LocalizationProvider = require('@mui/x-date-pickers/LocalizationProvider');
|
|
11
11
|
var AdapterDayjs = require('@mui/x-date-pickers/AdapterDayjs');
|
|
12
|
-
var styles$
|
|
12
|
+
var styles$D = require('@mui/material/styles');
|
|
13
|
+
var rrule = require('rrule');
|
|
13
14
|
var d3 = require('d3');
|
|
14
15
|
|
|
15
16
|
function _interopNamespaceDefault(e) {
|
|
@@ -31,7 +32,7 @@ function _interopNamespaceDefault(e) {
|
|
|
31
32
|
|
|
32
33
|
var d3__namespace = /*#__PURE__*/_interopNamespaceDefault(d3);
|
|
33
34
|
|
|
34
|
-
var styles$
|
|
35
|
+
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"};
|
|
35
36
|
|
|
36
37
|
const SOUND_PACKS = {
|
|
37
38
|
digital: {
|
|
@@ -597,11 +598,11 @@ const Button = ({ variant = 'primary', size = 'medium', fullWidth = false, loadi
|
|
|
597
598
|
const { handlers } = useComponentSound(soundConfig);
|
|
598
599
|
const isIcon = variant === 'icon';
|
|
599
600
|
const buttonClasses = [
|
|
600
|
-
styles$
|
|
601
|
-
styles$
|
|
602
|
-
!isIcon && styles$
|
|
603
|
-
fullWidth && styles$
|
|
604
|
-
loading && styles$
|
|
601
|
+
styles$C.button,
|
|
602
|
+
styles$C[variant],
|
|
603
|
+
!isIcon && styles$C[size],
|
|
604
|
+
fullWidth && styles$C.fullWidth,
|
|
605
|
+
loading && styles$C.loading,
|
|
605
606
|
className
|
|
606
607
|
].filter(Boolean).join(' ');
|
|
607
608
|
const handleClick = (e) => {
|
|
@@ -612,10 +613,10 @@ const Button = ({ variant = 'primary', size = 'medium', fullWidth = false, loadi
|
|
|
612
613
|
handlers.onMouseEnter?.();
|
|
613
614
|
onMouseEnter?.(e);
|
|
614
615
|
};
|
|
615
|
-
return (jsxRuntime.jsxs(framerMotion.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 && jsxRuntime.jsx("span", { className: styles$
|
|
616
|
+
return (jsxRuntime.jsxs(framerMotion.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 && jsxRuntime.jsx("span", { className: styles$C.spinner }), iconLeft && jsxRuntime.jsx("span", { className: styles$C.iconLeft, children: iconLeft }), children, iconRight && jsxRuntime.jsx("span", { className: styles$C.iconRight, children: iconRight })] }));
|
|
616
617
|
};
|
|
617
618
|
|
|
618
|
-
var styles$
|
|
619
|
+
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"};
|
|
619
620
|
|
|
620
621
|
/**
|
|
621
622
|
* Card Component
|
|
@@ -680,28 +681,28 @@ const Card = ({ variant = 'elevated', hoverable = false, clickable = false, padd
|
|
|
680
681
|
onExpandChange?.(newExpanded);
|
|
681
682
|
};
|
|
682
683
|
const cardClasses = [
|
|
683
|
-
styles$
|
|
684
|
-
styles$
|
|
685
|
-
hoverable && styles$
|
|
686
|
-
clickable && styles$
|
|
687
|
-
!padding && styles$
|
|
688
|
-
expandable && styles$
|
|
684
|
+
styles$B.card,
|
|
685
|
+
styles$B[variant],
|
|
686
|
+
hoverable && styles$B.hoverable,
|
|
687
|
+
clickable && styles$B.clickable,
|
|
688
|
+
!padding && styles$B.noPadding,
|
|
689
|
+
expandable && styles$B.expandable,
|
|
689
690
|
className
|
|
690
691
|
].filter(Boolean).join(' ');
|
|
691
692
|
const renderHeader = () => {
|
|
692
693
|
if (header) {
|
|
693
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
694
|
+
return (jsxRuntime.jsxs("div", { className: styles$B.header, children: [jsxRuntime.jsx("div", { className: styles$B.headerContent, children: header }), expandable && (jsxRuntime.jsx("button", { className: styles$B.expandButton, onClick: handleToggleExpand, "aria-label": isExpanded ? 'Collapse card' : 'Expand card', children: jsxRuntime.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: jsxRuntime.jsx("path", { d: "M6 9l6 6 6-6" }) }) }))] }));
|
|
694
695
|
}
|
|
695
696
|
if (title || subtitle) {
|
|
696
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
697
|
+
return (jsxRuntime.jsxs("div", { className: styles$B.header, children: [jsxRuntime.jsxs("div", { className: styles$B.headerContent, children: [title && jsxRuntime.jsx("h3", { className: styles$B.title, children: title }), subtitle && jsxRuntime.jsx("p", { className: styles$B.subtitle, children: subtitle })] }), expandable && (jsxRuntime.jsx("button", { className: styles$B.expandButton, onClick: handleToggleExpand, "aria-label": isExpanded ? 'Collapse card' : 'Expand card', children: jsxRuntime.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: jsxRuntime.jsx("path", { d: "M6 9l6 6 6-6" }) }) }))] }));
|
|
697
698
|
}
|
|
698
699
|
return null;
|
|
699
700
|
};
|
|
700
|
-
const cardContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [image && (jsxRuntime.jsx("div", { className: styles$
|
|
701
|
+
const cardContent = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [image && (jsxRuntime.jsx("div", { className: styles$B.imageContainer, children: jsxRuntime.jsx("img", { src: image, alt: imageAlt, className: styles$B.image }) })), renderHeader(), jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: (!expandable || isExpanded) && (jsxRuntime.jsxs(framerMotion.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 && (jsxRuntime.jsx("div", { className: padding ? styles$B.body : undefined, children: children })), footer && jsxRuntime.jsx("div", { className: styles$B.footer, children: footer })] }, "content")) })] }));
|
|
701
702
|
return (jsxRuntime.jsx(framerMotion.motion.div, { className: cardClasses, onClick: clickable ? onClick : undefined, whileHover: hoverable ? { y: -4 } : undefined, transition: { type: "spring", stiffness: 400, damping: 17 }, ...motionProps, ...rest, children: cardContent }));
|
|
702
703
|
};
|
|
703
704
|
|
|
704
|
-
var styles$
|
|
705
|
+
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"};
|
|
705
706
|
|
|
706
707
|
/**
|
|
707
708
|
* EmptyState Component
|
|
@@ -738,11 +739,11 @@ var styles$z = {"wrapper":"EmptyState-module_wrapper__h3Y2E","compact":"EmptySta
|
|
|
738
739
|
* @returns {JSX.Element} The rendered EmptyState component
|
|
739
740
|
*/
|
|
740
741
|
const EmptyState = ({ icon, title, message, action, size = 'default', }) => {
|
|
741
|
-
const wrapperClass = [styles$
|
|
742
|
-
return (jsxRuntime.jsxs("div", { className: wrapperClass, children: [icon && jsxRuntime.jsx("div", { className: styles$
|
|
742
|
+
const wrapperClass = [styles$A.wrapper, styles$A[size]].filter(Boolean).join(' ');
|
|
743
|
+
return (jsxRuntime.jsxs("div", { className: wrapperClass, children: [icon && jsxRuntime.jsx("div", { className: styles$A.icon, children: icon }), title && jsxRuntime.jsx("h3", { className: styles$A.title, children: title }), jsxRuntime.jsx("p", { className: styles$A.message, children: message }), action && jsxRuntime.jsx("div", { className: styles$A.action, children: action })] }));
|
|
743
744
|
};
|
|
744
745
|
|
|
745
|
-
var styles$
|
|
746
|
+
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"};
|
|
746
747
|
|
|
747
748
|
const MOBILE_BREAKPOINT = '(max-width: 640px)';
|
|
748
749
|
const useIsMobile = () => {
|
|
@@ -779,14 +780,14 @@ const Modal = ({ open, title, onClose, children, size = 'default', actions, padd
|
|
|
779
780
|
return null;
|
|
780
781
|
const isSheet = mobileVariant === 'sheet' && isMobile;
|
|
781
782
|
const isDraggable = isSheet && draggable;
|
|
782
|
-
const backdropClass = [styles$
|
|
783
|
+
const backdropClass = [styles$z.backdrop, isSheet && styles$z.backdropSheet]
|
|
783
784
|
.filter(Boolean)
|
|
784
785
|
.join(' ');
|
|
785
786
|
const dialogClass = [
|
|
786
|
-
styles$
|
|
787
|
-
size === 'compact' && styles$
|
|
788
|
-
size === 'wide' && styles$
|
|
789
|
-
isSheet && styles$
|
|
787
|
+
styles$z.dialog,
|
|
788
|
+
size === 'compact' && styles$z.dialogCompact,
|
|
789
|
+
size === 'wide' && styles$z.dialogWide,
|
|
790
|
+
isSheet && styles$z.dialogSheet,
|
|
790
791
|
]
|
|
791
792
|
.filter(Boolean)
|
|
792
793
|
.join(' ');
|
|
@@ -802,16 +803,16 @@ const Modal = ({ open, title, onClose, children, size = 'default', actions, padd
|
|
|
802
803
|
: { 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) => {
|
|
803
804
|
if (info.offset.y > 80)
|
|
804
805
|
onClose();
|
|
805
|
-
}, children: [isSheet && jsxRuntime.jsx("div", { className: styles$
|
|
806
|
+
}, children: [isSheet && jsxRuntime.jsx("div", { className: styles$z.grabBar }), jsxRuntime.jsxs("div", { ref: headerRef, className: styles$z.header, onPointerDown: (e) => {
|
|
806
807
|
if (!isDraggable)
|
|
807
808
|
return;
|
|
808
809
|
if (e.target.closest('button'))
|
|
809
810
|
return;
|
|
810
811
|
dragControls.start(e);
|
|
811
|
-
}, children: [jsxRuntime.jsx("span", { className: styles$
|
|
812
|
+
}, children: [jsxRuntime.jsx("span", { className: styles$z.title, children: title }), actions && jsxRuntime.jsx("div", { className: styles$z.headerActions, children: actions }), jsxRuntime.jsx("button", { className: styles$z.closeButton, onClick: onClose, "aria-label": "Close modal", type: "button", children: jsxRuntime.jsx(lucideReact.X, { size: 16 }) })] }), jsxRuntime.jsx("div", { className: padding ? styles$z.body : styles$z.bodyFlush, children: children })] }) })) }), document.body);
|
|
812
813
|
};
|
|
813
814
|
|
|
814
|
-
var styles$
|
|
815
|
+
var styles$y = {"checkboxLabel":"Checkbox-module_checkboxLabel__4tBVg","checkbox":"Checkbox-module_checkbox__BbJul","checkboxText":"Checkbox-module_checkboxText__oJsc9"};
|
|
815
816
|
|
|
816
817
|
/**
|
|
817
818
|
* Checkbox component - Modern interactive checkbox with animations
|
|
@@ -856,13 +857,13 @@ const Checkbox = ({ checked, onChange, label, disabled = false, indeterminate =
|
|
|
856
857
|
checkboxRef.current.indeterminate = indeterminate;
|
|
857
858
|
}
|
|
858
859
|
}, [indeterminate]);
|
|
859
|
-
return (jsxRuntime.jsxs("label", { className: styles$
|
|
860
|
+
return (jsxRuntime.jsxs("label", { className: styles$y.checkboxLabel, children: [jsxRuntime.jsx("input", { ref: checkboxRef, type: "checkbox", checked: checked, onChange: (e) => {
|
|
860
861
|
const isChecked = e.target.checked;
|
|
861
862
|
onChange(isChecked);
|
|
862
863
|
if (soundConfig?.onClick !== false) {
|
|
863
864
|
playSound('toggle');
|
|
864
865
|
}
|
|
865
|
-
}, className: styles$
|
|
866
|
+
}, className: styles$y.checkbox, disabled: disabled, id: id, name: name, value: value, "aria-checked": indeterminate ? 'mixed' : checked }), label && jsxRuntime.jsx("span", { className: styles$y.checkboxText, children: label })] }));
|
|
866
867
|
};
|
|
867
868
|
|
|
868
869
|
const formatDateToEuropean = (date) => {
|
|
@@ -893,7 +894,7 @@ const parseEuropeanDate = (dateString) => {
|
|
|
893
894
|
return '';
|
|
894
895
|
};
|
|
895
896
|
|
|
896
|
-
var styles$
|
|
897
|
+
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"};
|
|
897
898
|
|
|
898
899
|
/**
|
|
899
900
|
* DateInput component - European format date picker with manual input support
|
|
@@ -953,21 +954,21 @@ function DateInput({ label, value, onChange, placeholder = "25/12/2024", onFocus
|
|
|
953
954
|
}
|
|
954
955
|
};
|
|
955
956
|
const getClassName = () => {
|
|
956
|
-
const classes = [styles$
|
|
957
|
+
const classes = [styles$x.dateInput];
|
|
957
958
|
if (error)
|
|
958
|
-
classes.push(styles$
|
|
959
|
+
classes.push(styles$x.error);
|
|
959
960
|
if (success)
|
|
960
|
-
classes.push(styles$
|
|
961
|
+
classes.push(styles$x.success);
|
|
961
962
|
if (loading)
|
|
962
|
-
classes.push(styles$
|
|
963
|
+
classes.push(styles$x.loading);
|
|
963
964
|
return classes.join(' ');
|
|
964
965
|
};
|
|
965
966
|
// Current ISO value for the native date input (or '' if empty/unparseable)
|
|
966
967
|
const isoValue = value.includes('-') ? value : (parseEuropeanDate(value) || '');
|
|
967
|
-
return (jsxRuntime.jsxs("div", { className: getClassName(), children: [jsxRuntime.jsx("label", { className: styles$
|
|
968
|
+
return (jsxRuntime.jsxs("div", { className: getClassName(), children: [jsxRuntime.jsx("label", { className: styles$x.label, children: label }), jsxRuntime.jsxs("div", { className: styles$x.inputWrapper, children: [jsxRuntime.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 }), jsxRuntime.jsxs("span", { className: styles$x.calendarButton, "aria-hidden": "true", children: [jsxRuntime.jsx(lucideReact.Calendar, {}), jsxRuntime.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 })] })] })] }));
|
|
968
969
|
}
|
|
969
970
|
|
|
970
|
-
var styles$
|
|
971
|
+
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"};
|
|
971
972
|
|
|
972
973
|
/**
|
|
973
974
|
* SearchableDropdown component - Modern filterable dropdown with animations
|
|
@@ -1072,23 +1073,23 @@ function SearchableDropdown({ label, value, onChange, options, placeholder = "Se
|
|
|
1072
1073
|
}
|
|
1073
1074
|
};
|
|
1074
1075
|
const getTriggerClassName = () => {
|
|
1075
|
-
const classes = [styles$
|
|
1076
|
+
const classes = [styles$w.dropdownTrigger];
|
|
1076
1077
|
if (isOpen)
|
|
1077
|
-
classes.push(styles$
|
|
1078
|
+
classes.push(styles$w.open);
|
|
1078
1079
|
if (loading)
|
|
1079
|
-
classes.push(styles$
|
|
1080
|
+
classes.push(styles$w.loading);
|
|
1080
1081
|
if (error)
|
|
1081
|
-
classes.push(styles$
|
|
1082
|
+
classes.push(styles$w.error);
|
|
1082
1083
|
return classes.join(' ');
|
|
1083
1084
|
};
|
|
1084
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
1085
|
+
return (jsxRuntime.jsxs("div", { className: styles$w.searchableDropdown, ref: dropdownRef, onKeyDown: handleKeyDown, children: [jsxRuntime.jsx("label", { children: label }), jsxRuntime.jsxs(framerMotion.motion.button, { type: "button", className: getTriggerClassName(), onClick: () => !disabled && !loading && setIsOpen(!isOpen), whileTap: { scale: disabled ? 1 : 0.98 }, style: { willChange: 'transform' }, disabled: disabled, children: [jsxRuntime.jsx("span", { className: `${styles$w.dropdownValue} ${!displayValue ? styles$w.placeholder : ''}`, children: displayValue || placeholder }), jsxRuntime.jsx(lucideReact.ChevronDown, { className: styles$w.dropdownArrow })] }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: isOpen && (jsxRuntime.jsxs(framerMotion.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: [jsxRuntime.jsxs("div", { className: styles$w.dropdownSearch, children: [jsxRuntime.jsx(lucideReact.Search, { className: styles$w.searchIcon }), jsxRuntime.jsx("input", { ref: inputRef, type: "text", className: styles$w.searchInput, placeholder: "Cerca...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), onClick: (e) => e.stopPropagation() })] }), jsxRuntime.jsxs("div", { className: styles$w.dropdownOptions, children: [allOptions.map((opt, index) => {
|
|
1085
1086
|
const isSelected = value === opt.value;
|
|
1086
1087
|
const isHighlighted = highlightedIndex === index;
|
|
1087
|
-
return (jsxRuntime.jsxs(framerMotion.motion.button, { type: "button", className: `${styles$
|
|
1088
|
-
}), allOptions.length === 0 && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1088
|
+
return (jsxRuntime.jsxs(framerMotion.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: [jsxRuntime.jsx("span", { children: opt.label }), isSelected && jsxRuntime.jsx(lucideReact.Check, { className: styles$w.checkIcon })] }, `${opt.value}-${index}`));
|
|
1089
|
+
}), allOptions.length === 0 && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$w.dropdownNoResults, initial: { opacity: 0 }, animate: { opacity: 1 }, children: "No results found" }))] })] })) })] }));
|
|
1089
1090
|
}
|
|
1090
1091
|
|
|
1091
|
-
var styles$
|
|
1092
|
+
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"};
|
|
1092
1093
|
|
|
1093
1094
|
/**
|
|
1094
1095
|
* SelectInput component - Styled dropdown selector with flexible option format
|
|
@@ -1126,26 +1127,26 @@ var styles$u = {"selectInput":"SelectInput-module_selectInput__s6zEg","selectWra
|
|
|
1126
1127
|
function SelectInput({ label, value, onChange, options, placeholder = "Select...", disabled = false, error = false, success = false, loading = false, required = false, soundConfig, className }) {
|
|
1127
1128
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1128
1129
|
const getClassName = () => {
|
|
1129
|
-
const classes = [styles$
|
|
1130
|
+
const classes = [styles$v.selectInput];
|
|
1130
1131
|
if (error)
|
|
1131
|
-
classes.push(styles$
|
|
1132
|
+
classes.push(styles$v.error);
|
|
1132
1133
|
if (success)
|
|
1133
|
-
classes.push(styles$
|
|
1134
|
+
classes.push(styles$v.success);
|
|
1134
1135
|
if (loading)
|
|
1135
|
-
classes.push(styles$
|
|
1136
|
+
classes.push(styles$v.loading);
|
|
1136
1137
|
return classes.join(' ');
|
|
1137
1138
|
};
|
|
1138
|
-
return (jsxRuntime.jsxs("div", { className: `${getClassName()}${className ? ` ${className}` : ''}`, children: [jsxRuntime.jsxs("label", { children: [label, required && jsxRuntime.jsx("span", { style: { color: 'var(--color-error)' }, children: " *" })] }), jsxRuntime.jsxs("div", { className: styles$
|
|
1139
|
+
return (jsxRuntime.jsxs("div", { className: `${getClassName()}${className ? ` ${className}` : ''}`, children: [jsxRuntime.jsxs("label", { children: [label, required && jsxRuntime.jsx("span", { style: { color: 'var(--color-error)' }, children: " *" })] }), jsxRuntime.jsxs("div", { className: styles$v.selectWrapper, children: [jsxRuntime.jsxs("select", { value: value, onChange: e => {
|
|
1139
1140
|
playSound('click');
|
|
1140
1141
|
onChange(e.target.value);
|
|
1141
1142
|
}, disabled: disabled || loading, required: required, ...handlers, children: [jsxRuntime.jsx("option", { value: "", children: placeholder }), options.map(opt => {
|
|
1142
1143
|
const optionValue = typeof opt === 'string' ? opt : opt.value;
|
|
1143
1144
|
const optionLabel = typeof opt === 'string' ? opt : opt.label;
|
|
1144
1145
|
return (jsxRuntime.jsx("option", { value: optionValue, children: optionLabel }, optionValue));
|
|
1145
|
-
})] }), jsxRuntime.jsx(lucideReact.ChevronDown, { className: styles$
|
|
1146
|
+
})] }), jsxRuntime.jsx(lucideReact.ChevronDown, { className: styles$v.selectIcon })] })] }));
|
|
1146
1147
|
}
|
|
1147
1148
|
|
|
1148
|
-
var styles$
|
|
1149
|
+
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-"};
|
|
1149
1150
|
|
|
1150
1151
|
/**
|
|
1151
1152
|
* TextArea component - Multi-line text input with character counting
|
|
@@ -1180,38 +1181,38 @@ var styles$t = {"textareaContainer":"TextArea-module_textareaContainer__AquFj","
|
|
|
1180
1181
|
function TextArea({ label, value, onChange, rows = 5, placeholder = "", required = false, maxLength, disabled = false, error = false, success = false, loading = false, focusMode = false, compact = false, className = "" }) {
|
|
1181
1182
|
const textareaId = `textarea-${Math.random().toString(36).substr(2, 9)}`;
|
|
1182
1183
|
const getContainerClassName = () => {
|
|
1183
|
-
const classes = [styles$
|
|
1184
|
+
const classes = [styles$u.textareaContainer];
|
|
1184
1185
|
if (error)
|
|
1185
|
-
classes.push(styles$
|
|
1186
|
+
classes.push(styles$u.error);
|
|
1186
1187
|
if (success)
|
|
1187
|
-
classes.push(styles$
|
|
1188
|
+
classes.push(styles$u.success);
|
|
1188
1189
|
if (loading)
|
|
1189
|
-
classes.push(styles$
|
|
1190
|
+
classes.push(styles$u.loading);
|
|
1190
1191
|
if (focusMode)
|
|
1191
|
-
classes.push(styles$
|
|
1192
|
+
classes.push(styles$u.focusMode);
|
|
1192
1193
|
if (compact)
|
|
1193
|
-
classes.push(styles$
|
|
1194
|
+
classes.push(styles$u.compact);
|
|
1194
1195
|
if (className)
|
|
1195
1196
|
classes.push(className);
|
|
1196
1197
|
return classes.join(' ');
|
|
1197
1198
|
};
|
|
1198
1199
|
const getCharCountClassName = () => {
|
|
1199
1200
|
if (!maxLength)
|
|
1200
|
-
return styles$
|
|
1201
|
-
const classes = [styles$
|
|
1201
|
+
return styles$u.characterCount;
|
|
1202
|
+
const classes = [styles$u.characterCount];
|
|
1202
1203
|
const percentage = (value.length / maxLength) * 100;
|
|
1203
1204
|
if (percentage >= 100) {
|
|
1204
|
-
classes.push(styles$
|
|
1205
|
+
classes.push(styles$u.atLimit);
|
|
1205
1206
|
}
|
|
1206
1207
|
else if (percentage >= 80) {
|
|
1207
|
-
classes.push(styles$
|
|
1208
|
+
classes.push(styles$u.nearLimit);
|
|
1208
1209
|
}
|
|
1209
1210
|
return classes.join(' ');
|
|
1210
1211
|
};
|
|
1211
|
-
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [label && (jsxRuntime.jsxs("label", { htmlFor: textareaId, className: styles$
|
|
1212
|
+
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [label && (jsxRuntime.jsxs("label", { htmlFor: textareaId, className: styles$u.textareaLabel, children: [label, required && jsxRuntime.jsx("span", { className: styles$u.requiredIndicator, children: "*" })] })), jsxRuntime.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 && (jsxRuntime.jsxs("div", { className: getCharCountClassName(), children: [jsxRuntime.jsx("span", { children: value.length }), jsxRuntime.jsx("span", { style: { opacity: 0.7 }, children: " / " }), jsxRuntime.jsx("span", { children: maxLength })] }))] }));
|
|
1212
1213
|
}
|
|
1213
1214
|
|
|
1214
|
-
var styles$
|
|
1215
|
+
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"};
|
|
1215
1216
|
|
|
1216
1217
|
/**
|
|
1217
1218
|
* TextInput component - A versatile text input field with label and error handling
|
|
@@ -1248,21 +1249,21 @@ function TextInput({ label, value, onChange, type = "text", onBlur, placeholder,
|
|
|
1248
1249
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1249
1250
|
const prevValueRef = React.useRef(value);
|
|
1250
1251
|
const getContainerClassName = () => {
|
|
1251
|
-
const classes = [styles$
|
|
1252
|
+
const classes = [styles$t.textInput];
|
|
1252
1253
|
if (success)
|
|
1253
|
-
classes.push(styles$
|
|
1254
|
+
classes.push(styles$t.success);
|
|
1254
1255
|
if (loading)
|
|
1255
|
-
classes.push(styles$
|
|
1256
|
+
classes.push(styles$t.loading);
|
|
1256
1257
|
if (icon)
|
|
1257
|
-
classes.push(styles$
|
|
1258
|
+
classes.push(styles$t.withIcon);
|
|
1258
1259
|
if (actionButton)
|
|
1259
|
-
classes.push(styles$
|
|
1260
|
+
classes.push(styles$t.withAction);
|
|
1260
1261
|
return classes.join(' ');
|
|
1261
1262
|
};
|
|
1262
1263
|
React.useEffect(() => {
|
|
1263
1264
|
prevValueRef.current = value;
|
|
1264
1265
|
}, [value]);
|
|
1265
|
-
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [jsxRuntime.jsxs("label", { htmlFor: inputId, children: [label, required && jsxRuntime.jsx("span", { className: styles$
|
|
1266
|
+
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [jsxRuntime.jsxs("label", { htmlFor: inputId, children: [label, required && jsxRuntime.jsx("span", { className: styles$t.required, children: "*" })] }), jsxRuntime.jsxs("div", { style: { position: 'relative' }, children: [icon && jsxRuntime.jsx("div", { className: styles$t.inputIcon, children: icon }), jsxRuntime.jsx("input", { id: inputId, type: type, value: value, onChange: (e) => {
|
|
1266
1267
|
const newValue = e.target.value;
|
|
1267
1268
|
const oldValue = prevValueRef.current;
|
|
1268
1269
|
onChange(newValue);
|
|
@@ -1278,13 +1279,13 @@ function TextInput({ label, value, onChange, type = "text", onBlur, placeholder,
|
|
|
1278
1279
|
if (error && soundConfig?.onError) {
|
|
1279
1280
|
playSound(typeof soundConfig.onError === 'string' ? soundConfig.onError : 'error');
|
|
1280
1281
|
}
|
|
1281
|
-
}, onBlur: onBlur, placeholder: placeholder, className: error ? styles$
|
|
1282
|
+
}, 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 && (jsxRuntime.jsx("button", { type: "button", className: styles$t.actionButton, onClick: () => {
|
|
1282
1283
|
handlers.onClick?.();
|
|
1283
1284
|
actionButton.onClick();
|
|
1284
|
-
}, disabled: disabled || loading, children: actionButton.label }))] }), error && (jsxRuntime.jsx("span", { id: `${inputId}-error`, className: styles$
|
|
1285
|
+
}, disabled: disabled || loading, children: actionButton.label }))] }), error && (jsxRuntime.jsx("span", { id: `${inputId}-error`, className: styles$t.errorMessage, children: error }))] }));
|
|
1285
1286
|
}
|
|
1286
1287
|
|
|
1287
|
-
var styles$
|
|
1288
|
+
var styles$s = {"toggleContainer":"Toggle-module_toggleContainer__QxqQb","toggleButton":"Toggle-module_toggleButton__WUUf-","active":"Toggle-module_active__fX6Io"};
|
|
1288
1289
|
|
|
1289
1290
|
/**
|
|
1290
1291
|
* Toggle Component
|
|
@@ -1345,7 +1346,7 @@ function Toggle(props) {
|
|
|
1345
1346
|
justifyContent: 'center',
|
|
1346
1347
|
...style
|
|
1347
1348
|
};
|
|
1348
|
-
return (jsxRuntime.jsxs("div", { className: `${styles$
|
|
1349
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$s.toggleContainer} ${className || ''}`, children: [jsxRuntime.jsxs(framerMotion.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: () => {
|
|
1349
1350
|
if (!isOn) {
|
|
1350
1351
|
// Already on left
|
|
1351
1352
|
if (enableCelebration) {
|
|
@@ -1360,7 +1361,7 @@ function Toggle(props) {
|
|
|
1360
1361
|
playSound('toggle');
|
|
1361
1362
|
}
|
|
1362
1363
|
onToggle(false);
|
|
1363
|
-
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsxRuntime.jsx(framerMotion.motion.div, { animate: { scale: !isOn ? 1.1 : 1, rotate: !isOn ? [0, -5, 5, 0] : 0 }, transition: { duration: 0.3 }, children: leftIcon }), leftLabel] }), jsxRuntime.jsxs(framerMotion.motion.button, { ref: rightButtonRef, className: `${styles$
|
|
1364
|
+
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsxRuntime.jsx(framerMotion.motion.div, { animate: { scale: !isOn ? 1.1 : 1, rotate: !isOn ? [0, -5, 5, 0] : 0 }, transition: { duration: 0.3 }, children: leftIcon }), leftLabel] }), jsxRuntime.jsxs(framerMotion.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: () => {
|
|
1364
1365
|
if (isOn) {
|
|
1365
1366
|
// Already on right
|
|
1366
1367
|
if (enableCelebration) {
|
|
@@ -1378,7 +1379,7 @@ function Toggle(props) {
|
|
|
1378
1379
|
}, onMouseEnter: () => handlers.onMouseEnter?.(), style: buttonStyle, children: [jsxRuntime.jsx(framerMotion.motion.div, { animate: { scale: isOn ? 1.1 : 1, rotate: isOn ? [0, 5, -5, 0] : 0 }, transition: { duration: 0.3 }, children: rightIcon }), rightLabel] })] }));
|
|
1379
1380
|
}
|
|
1380
1381
|
|
|
1381
|
-
var styles$
|
|
1382
|
+
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"};
|
|
1382
1383
|
|
|
1383
1384
|
/**
|
|
1384
1385
|
* NumberStepper Component
|
|
@@ -1565,33 +1566,33 @@ const NumberStepper = ({ value, onChange, min = -Infinity, max = Infinity, step
|
|
|
1565
1566
|
setDisplayValue(finalValue);
|
|
1566
1567
|
}, [displayValue, min, max, step, onChange]);
|
|
1567
1568
|
const containerClasses = [
|
|
1568
|
-
styles$
|
|
1569
|
-
styles$
|
|
1570
|
-
styles$
|
|
1571
|
-
layout === 'vertical' && styles$
|
|
1572
|
-
disabled && styles$
|
|
1569
|
+
styles$r.container,
|
|
1570
|
+
styles$r[size],
|
|
1571
|
+
styles$r[variant],
|
|
1572
|
+
layout === 'vertical' && styles$r.vertical,
|
|
1573
|
+
disabled && styles$r.disabled,
|
|
1573
1574
|
className
|
|
1574
1575
|
].filter(Boolean).join(' ');
|
|
1575
1576
|
// Merge custom styles with hover states
|
|
1576
1577
|
const [isButtonHovered, setIsButtonHovered] = React.useState(null);
|
|
1577
1578
|
const isDecrementDisabled = disabled || value <= min;
|
|
1578
1579
|
const isIncrementDisabled = disabled || value >= max;
|
|
1579
|
-
const stepperContent = (jsxRuntime.jsxs("div", { className: styles$
|
|
1580
|
+
const stepperContent = (jsxRuntime.jsxs("div", { className: styles$r.stepper, style: customStyles.stepper, onKeyDown: handleKeyDown, tabIndex: disabled ? -1 : 0, ...handlers, children: [jsxRuntime.jsx(framerMotion.motion.button, { className: styles$r.button, style: {
|
|
1580
1581
|
...customStyles.button,
|
|
1581
1582
|
...(isButtonHovered === 'decrement' && customStyles.buttonHover)
|
|
1582
|
-
}, 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 ? (jsxRuntime.jsx("span", { className: styles$
|
|
1583
|
+
}, 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 ? (jsxRuntime.jsx("span", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, children: "\u2212" })) : (jsxRuntime.jsx("svg", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, viewBox: "0 0 24 24", fill: "none", children: jsxRuntime.jsx("path", { d: "M15 18L9 12L15 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }))) }), jsxRuntime.jsx("div", { className: styles$r.valueContainer, style: customStyles.valueContainer, children: jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: jsxRuntime.jsx(framerMotion.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: jsxRuntime.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) }) }), jsxRuntime.jsx(framerMotion.motion.button, { className: styles$r.button, style: {
|
|
1583
1584
|
...customStyles.button,
|
|
1584
1585
|
...(isButtonHovered === 'increment' && customStyles.buttonHover)
|
|
1585
|
-
}, 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 ? (jsxRuntime.jsx("span", { className: styles$
|
|
1586
|
+
}, 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 ? (jsxRuntime.jsx("span", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, children: "+" })) : (jsxRuntime.jsx("svg", { className: styles$r.buttonIcon, style: customStyles.buttonIcon, viewBox: "0 0 24 24", fill: "none", children: jsxRuntime.jsx("path", { d: "M9 18L15 12L9 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }))) })] }));
|
|
1586
1587
|
// ── Tally variant: pen-stroke counter with explicit +/- buttons.
|
|
1587
1588
|
if (variant === 'tally') {
|
|
1588
1589
|
return (jsxRuntime.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 }));
|
|
1589
1590
|
}
|
|
1590
1591
|
// For custom variant with horizontal layout, render differently
|
|
1591
1592
|
if (variant === 'custom' && (label || icon)) {
|
|
1592
|
-
return (jsxRuntime.jsxs("div", { className: containerClasses, style: { ...customStyles.container, display: 'flex', alignItems: 'center' }, children: [jsxRuntime.jsxs("div", { className: styles$
|
|
1593
|
+
return (jsxRuntime.jsxs("div", { className: containerClasses, style: { ...customStyles.container, display: 'flex', alignItems: 'center' }, children: [jsxRuntime.jsxs("div", { className: styles$r.header, style: { ...customStyles.header, flex: 1, marginBottom: 0 }, children: [icon && jsxRuntime.jsx("span", { className: styles$r.icon, style: customStyles.icon, children: icon }), label && jsxRuntime.jsx("label", { className: styles$r.label, style: customStyles.label, children: label })] }), stepperContent, !hideLimits && (min !== -Infinity || max !== Infinity) && (jsxRuntime.jsxs("div", { className: styles$r.limits, style: customStyles.limits, children: [jsxRuntime.jsx("span", { className: styles$r.limit, children: min !== -Infinity && `Min: ${min}` }), jsxRuntime.jsx("span", { className: styles$r.limit, children: max !== Infinity && `Max: ${max}` })] }))] }));
|
|
1593
1594
|
}
|
|
1594
|
-
return (jsxRuntime.jsxs("div", { className: containerClasses, style: customStyles.container, children: [(label || icon) && (jsxRuntime.jsxs("div", { className: styles$
|
|
1595
|
+
return (jsxRuntime.jsxs("div", { className: containerClasses, style: customStyles.container, children: [(label || icon) && (jsxRuntime.jsxs("div", { className: styles$r.header, style: customStyles.header, children: [icon && jsxRuntime.jsx("span", { className: styles$r.icon, style: customStyles.icon, children: icon }), label && jsxRuntime.jsx("label", { className: styles$r.label, style: customStyles.label, children: label })] })), stepperContent, !hideLimits && (min !== -Infinity || max !== Infinity) && (jsxRuntime.jsxs("div", { className: styles$r.limits, style: customStyles.limits, children: [jsxRuntime.jsx("span", { className: styles$r.limit, children: min !== -Infinity && `Min: ${min}` }), jsxRuntime.jsx("span", { className: styles$r.limit, children: max !== Infinity && `Max: ${max}` })] }))] }));
|
|
1595
1596
|
};
|
|
1596
1597
|
const TallyMarks = ({ count, color }) => {
|
|
1597
1598
|
const groups = [];
|
|
@@ -1601,14 +1602,14 @@ const TallyMarks = ({ count, color }) => {
|
|
|
1601
1602
|
groups.push(n);
|
|
1602
1603
|
left -= n;
|
|
1603
1604
|
}
|
|
1604
|
-
return (jsxRuntime.jsx("div", { className: styles$
|
|
1605
|
+
return (jsxRuntime.jsx("div", { className: styles$r.tallyMarks, "aria-hidden": "true", children: groups.map((n, i) => (jsxRuntime.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) => (jsxRuntime.jsx("line", { x1: 4 + j * 6, y1: "2", x2: 4 + j * 6, y2: "20", stroke: color, strokeWidth: "2", strokeLinecap: "round" }, j))), n === 5 && (jsxRuntime.jsx("line", { x1: "1", y1: "18", x2: "27", y2: "4", stroke: color, strokeWidth: "2", strokeLinecap: "round" }))] }, i))) }));
|
|
1605
1606
|
};
|
|
1606
1607
|
const TallyRow = ({ value, label, icon, color, disabled, emptyHint, className, customStyles, onIncrement, onDecrement, ariaLabel, isDecrementDisabled, isIncrementDisabled }) => {
|
|
1607
1608
|
const resolvedColor = color || 'currentColor';
|
|
1608
|
-
return (jsxRuntime.jsxs("div", { "aria-label": ariaLabel, "aria-disabled": disabled || undefined, className: `${className} ${styles$
|
|
1609
|
+
return (jsxRuntime.jsxs("div", { "aria-label": ariaLabel, "aria-disabled": disabled || undefined, className: `${className} ${styles$r.tallyRow}`, style: customStyles.container, children: [icon && (jsxRuntime.jsx("span", { className: styles$r.tallyIcon, style: { color: resolvedColor, ...customStyles.icon }, children: icon })), label && (jsxRuntime.jsx("span", { className: styles$r.tallyLabel, style: customStyles.label, children: label })), jsxRuntime.jsx("div", { className: styles$r.tallyBody, children: value <= 0 ? (jsxRuntime.jsx("span", { className: styles$r.tallyHint, children: emptyHint })) : (jsxRuntime.jsx(TallyMarks, { count: value, color: resolvedColor })) }), jsxRuntime.jsx("button", { type: "button", className: styles$r.tallyButton, onClick: onDecrement, disabled: isDecrementDisabled, "aria-label": `Decrease ${label || 'value'}`, children: jsxRuntime.jsx("span", { className: styles$r.tallyButtonIcon, children: "\u2212" }) }), jsxRuntime.jsx("span", { className: styles$r.tallyValue, style: { color: resolvedColor, ...customStyles.value }, "aria-hidden": "true", children: value }), jsxRuntime.jsx("button", { type: "button", className: styles$r.tallyButton, onClick: onIncrement, disabled: isIncrementDisabled, "aria-label": `Increase ${label || 'value'}`, children: jsxRuntime.jsx("span", { className: styles$r.tallyButtonIcon, children: "+" }) })] }));
|
|
1609
1610
|
};
|
|
1610
1611
|
|
|
1611
|
-
var styles$
|
|
1612
|
+
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"};
|
|
1612
1613
|
|
|
1613
1614
|
/**
|
|
1614
1615
|
* ToggleButton Component
|
|
@@ -1647,18 +1648,18 @@ var styles$p = {"button":"ToggleButton-module_button__DTuyY","background":"Toggl
|
|
|
1647
1648
|
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 }) => {
|
|
1648
1649
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1649
1650
|
const buttonClasses = [
|
|
1650
|
-
styles$
|
|
1651
|
-
styles$
|
|
1652
|
-
styles$
|
|
1653
|
-
active && styles$
|
|
1654
|
-
active && styles$
|
|
1655
|
-
disabled && styles$
|
|
1656
|
-
animation !== 'none' && styles$
|
|
1651
|
+
styles$q.button,
|
|
1652
|
+
styles$q[size],
|
|
1653
|
+
styles$q[variant],
|
|
1654
|
+
active && styles$q.active,
|
|
1655
|
+
active && styles$q[`active-${activeColor}`],
|
|
1656
|
+
disabled && styles$q.disabled,
|
|
1657
|
+
animation !== 'none' && styles$q[`animation-${animation}`],
|
|
1657
1658
|
className
|
|
1658
1659
|
].filter(Boolean).join(' ');
|
|
1659
1660
|
const labelClasses = [
|
|
1660
|
-
styles$
|
|
1661
|
-
hideLabelOnMobile && styles$
|
|
1661
|
+
styles$q.label,
|
|
1662
|
+
hideLabelOnMobile && styles$q.hideMobile
|
|
1662
1663
|
].filter(Boolean).join(' ');
|
|
1663
1664
|
const iconVariants = {
|
|
1664
1665
|
scale: {
|
|
@@ -1722,10 +1723,10 @@ const ToggleButton = ({ active, onClick, icon, label, disabled = false, size = '
|
|
|
1722
1723
|
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: buttonClasses, style: dynamicStyle, onClick: () => {
|
|
1723
1724
|
playSound('toggle');
|
|
1724
1725
|
onClick();
|
|
1725
|
-
}, disabled: disabled, whileHover: !disabled ? { scale: 1.05 } : undefined, whileTap: !disabled ? { scale: 0.95 } : undefined, title: tooltip, "aria-pressed": active, "aria-label": label, ...handlers, children: [jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1726
|
+
}, disabled: disabled, whileHover: !disabled ? { scale: 1.05 } : undefined, whileTap: !disabled ? { scale: 0.95 } : undefined, title: tooltip, "aria-pressed": active, "aria-label": label, ...handlers, children: [jsxRuntime.jsx(framerMotion.motion.div, { className: styles$q.background, variants: backgroundVariants, initial: "inactive", animate: active ? "active" : "inactive" }), jsxRuntime.jsxs("div", { className: styles$q.content, children: [icon && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$q.iconWrapper, variants: iconVariants[animation], initial: "inactive", animate: active ? "active" : "inactive", transition: { duration: 0.3 }, children: typeof icon === 'string' ? (jsxRuntime.jsx("span", { className: styles$q.icon, children: icon })) : (jsxRuntime.jsx("div", { className: styles$q.icon, children: icon })) })), label && jsxRuntime.jsx("span", { className: labelClasses, children: label }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: showCheckmark && active && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$q.checkmark, variants: checkmarkVariants, initial: "hidden", animate: "visible", exit: "hidden", children: jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", children: jsxRuntime.jsx("path", { d: "M20 6L9 17L4 12", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round" }) }) })) })] }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: active && (jsxRuntime.jsx(framerMotion.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 } })) })] }));
|
|
1726
1727
|
};
|
|
1727
1728
|
|
|
1728
|
-
var styles$
|
|
1729
|
+
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"};
|
|
1729
1730
|
|
|
1730
1731
|
/**
|
|
1731
1732
|
* Slider component — responsive, accessible range input with a styled track, fill, and thumb.
|
|
@@ -1733,7 +1734,7 @@ var styles$o = {"slider":"Slider-module_slider__RD4G7","label":"Slider-module_la
|
|
|
1733
1734
|
* The thumb is inset at the track endpoints so it never overflows. Drag state is tracked
|
|
1734
1735
|
* via pointer events (works on mouse, touch, and pen).
|
|
1735
1736
|
*/
|
|
1736
|
-
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, }) {
|
|
1737
|
+
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', }) {
|
|
1737
1738
|
const { handlers, playSound } = useComponentSound(soundConfig);
|
|
1738
1739
|
const [isDragging, setIsDragging] = React.useState(false);
|
|
1739
1740
|
const { colors = {}, size = 'md' } = config;
|
|
@@ -1764,11 +1765,33 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1764
1765
|
};
|
|
1765
1766
|
const endDrag = () => setIsDragging(false);
|
|
1766
1767
|
const dynamicColor = getDynamicColor();
|
|
1767
|
-
const sizeClass = styles$
|
|
1768
|
-
const stateClass = disabled ? styles$
|
|
1769
|
-
const dragClass = isDragging ? styles$
|
|
1768
|
+
const sizeClass = styles$p[`size-${size}`];
|
|
1769
|
+
const stateClass = disabled ? styles$p.disabled : '';
|
|
1770
|
+
const dragClass = isDragging ? styles$p.dragging : '';
|
|
1770
1771
|
if (loading) {
|
|
1771
|
-
return (jsxRuntime.jsxs("div", { className: `${styles$
|
|
1772
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${styles$p.loading} ${className}`, style: style, children: [label && jsxRuntime.jsx("label", { className: styles$p.label, children: label }), jsxRuntime.jsx("div", { className: styles$p.loadingTrack, children: jsxRuntime.jsx(framerMotion.motion.div, { className: styles$p.loadingIndicator, animate: { x: ['-100%', '200%'] }, transition: { repeat: Infinity, duration: 1.5, ease: 'easeInOut' } }) })] }));
|
|
1773
|
+
}
|
|
1774
|
+
if (variant === 'dots') {
|
|
1775
|
+
const dotCount = Math.max(0, Math.floor((max - min) / step));
|
|
1776
|
+
const dotValues = Array.from({ length: dotCount }, (_, i) => min + (i + 1) * step);
|
|
1777
|
+
const handleDotClick = (dotValue) => {
|
|
1778
|
+
if (disabled || loading)
|
|
1779
|
+
return;
|
|
1780
|
+
playSound('click');
|
|
1781
|
+
const next = value === dotValue ? dotValue - step : dotValue;
|
|
1782
|
+
onChange(Math.max(min, next));
|
|
1783
|
+
};
|
|
1784
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${stateClass} ${className}`, style: style, ...handlers, children: [label && jsxRuntime.jsx("label", { className: styles$p.label, children: label }), jsxRuntime.jsx("div", { className: styles$p.dotsContainer, role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, "aria-label": label, children: dotValues.map((dotValue) => {
|
|
1785
|
+
const filled = dotValue <= value;
|
|
1786
|
+
return (jsxRuntime.jsx("button", { type: "button", className: `${styles$p.dot} ${filled ? styles$p.dotFilled : ''}`, style: filled
|
|
1787
|
+
? {
|
|
1788
|
+
backgroundColor: dynamicColor,
|
|
1789
|
+
borderColor: dynamicColor,
|
|
1790
|
+
}
|
|
1791
|
+
: undefined, onClick: () => handleDotClick(dotValue), disabled: disabled, "aria-label": valueFormatter
|
|
1792
|
+
? valueFormatter(dotValue)
|
|
1793
|
+
: `Set to ${dotValue}` }, dotValue));
|
|
1794
|
+
}) }), showValue && (jsxRuntime.jsx("div", { className: styles$p.valueDisplay, style: { color: dynamicColor }, children: formatValue(value) }))] }));
|
|
1772
1795
|
}
|
|
1773
1796
|
// Inset the thumb so its bounding box stays inside the track at 0/100%.
|
|
1774
1797
|
// At percentage=0: marginLeft=0 → thumb flush-left. At 100%: marginLeft=-thumbSize → flush-right.
|
|
@@ -1776,11 +1799,11 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1776
1799
|
left: `${percentage}%`,
|
|
1777
1800
|
marginLeft: `calc(var(--slider-thumb-size) * ${-percentage / 100})`,
|
|
1778
1801
|
};
|
|
1779
|
-
return (jsxRuntime.jsxs("div", { className: `${styles$
|
|
1802
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$p.slider} ${sizeClass} ${stateClass} ${dragClass} ${className}`, style: style, children: [label && jsxRuntime.jsx("label", { className: styles$p.label, children: label }), jsxRuntime.jsxs("div", { className: styles$p.sliderContainer, children: [jsxRuntime.jsx("div", { className: styles$p.track, children: jsxRuntime.jsx("div", { className: styles$p.fill, style: { width: `${percentage}%`, backgroundColor: dynamicColor } }) }), jsxRuntime.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 }), jsxRuntime.jsx("div", { className: styles$p.thumb, style: {
|
|
1780
1803
|
...insetStyle,
|
|
1781
1804
|
backgroundColor: dynamicColor,
|
|
1782
1805
|
borderColor: colors.thumb || dynamicColor,
|
|
1783
|
-
} }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: showTooltip && isDragging && !disabled && (jsxRuntime.jsxs(framerMotion.motion.div, { className: styles$
|
|
1806
|
+
} }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: showTooltip && isDragging && !disabled && (jsxRuntime.jsxs(framerMotion.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), jsxRuntime.jsx("div", { className: styles$p.tooltipArrow, style: { borderTopColor: dynamicColor } })] })) })] }), showValue && (jsxRuntime.jsx("div", { className: styles$p.valueDisplay, style: { color: dynamicColor }, children: formatValue(value) })), labels.length > 0 && (jsxRuntime.jsx("div", { className: styles$p.labelsContainer, children: labels.map((labelConfig, index) => {
|
|
1784
1807
|
let position = 0;
|
|
1785
1808
|
if (labelConfig.position === 'start')
|
|
1786
1809
|
position = 0;
|
|
@@ -1788,11 +1811,11 @@ function Slider({ value, onChange, min = 0, max = 100, step = 1, label, showValu
|
|
|
1788
1811
|
position = 100;
|
|
1789
1812
|
else if (typeof labelConfig.position === 'number')
|
|
1790
1813
|
position = labelConfig.position;
|
|
1791
|
-
return (jsxRuntime.jsx("div", { className: styles$
|
|
1814
|
+
return (jsxRuntime.jsx("div", { className: styles$p.labelItem, style: { left: `${position}%`, color: labelConfig.color }, children: labelConfig.label }, index));
|
|
1792
1815
|
}) }))] }));
|
|
1793
1816
|
}
|
|
1794
1817
|
|
|
1795
|
-
var styles$
|
|
1818
|
+
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"};
|
|
1796
1819
|
|
|
1797
1820
|
const defaultMessages = [
|
|
1798
1821
|
'Loading your content...',
|
|
@@ -1876,22 +1899,22 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1876
1899
|
}
|
|
1877
1900
|
}, [currentMessageIndex, message, messagesToUse, showMessage]);
|
|
1878
1901
|
const containerClasses = [
|
|
1879
|
-
styles$
|
|
1880
|
-
styles$
|
|
1881
|
-
styles$
|
|
1882
|
-
fullScreen && styles$
|
|
1883
|
-
overlay && styles$
|
|
1902
|
+
styles$o.loadingContainer,
|
|
1903
|
+
styles$o[size],
|
|
1904
|
+
styles$o[variant],
|
|
1905
|
+
fullScreen && styles$o.fullScreen,
|
|
1906
|
+
overlay && styles$o.overlay,
|
|
1884
1907
|
className
|
|
1885
1908
|
].filter(Boolean).join(' ');
|
|
1886
1909
|
const customStyle = {
|
|
1887
1910
|
...(color && { '--spinner-color': color }),
|
|
1888
1911
|
...(backgroundColor && { '--spinner-background': backgroundColor }),
|
|
1889
1912
|
};
|
|
1890
|
-
const renderDots = () => (jsxRuntime.jsxs(framerMotion.motion.div, { className: styles$
|
|
1913
|
+
const renderDots = () => (jsxRuntime.jsxs(framerMotion.motion.div, { className: styles$o.dotsSpinner, animate: { rotate: 360 }, transition: {
|
|
1891
1914
|
duration: 2,
|
|
1892
1915
|
repeat: Infinity,
|
|
1893
1916
|
ease: 'linear'
|
|
1894
|
-
}, children: [jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1917
|
+
}, children: [jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.dot1, animate: {
|
|
1895
1918
|
scale: [1, 1.3, 1],
|
|
1896
1919
|
y: [0, -6, 0]
|
|
1897
1920
|
}, transition: {
|
|
@@ -1899,7 +1922,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1899
1922
|
repeat: Infinity,
|
|
1900
1923
|
ease: 'easeInOut',
|
|
1901
1924
|
delay: 0
|
|
1902
|
-
} }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1925
|
+
} }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.dot2, animate: {
|
|
1903
1926
|
scale: [1, 1.3, 1],
|
|
1904
1927
|
y: [0, -6, 0]
|
|
1905
1928
|
}, transition: {
|
|
@@ -1907,7 +1930,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1907
1930
|
repeat: Infinity,
|
|
1908
1931
|
ease: 'easeInOut',
|
|
1909
1932
|
delay: 0.5
|
|
1910
|
-
} }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1933
|
+
} }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.dot3, animate: {
|
|
1911
1934
|
scale: [1, 1.3, 1],
|
|
1912
1935
|
y: [0, -6, 0]
|
|
1913
1936
|
}, transition: {
|
|
@@ -1916,12 +1939,12 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1916
1939
|
ease: 'easeInOut',
|
|
1917
1940
|
delay: 1
|
|
1918
1941
|
} })] }));
|
|
1919
|
-
const renderSpinner = () => (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1942
|
+
const renderSpinner = () => (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.circleSpinner, animate: { rotate: 360 }, transition: {
|
|
1920
1943
|
duration: 1,
|
|
1921
1944
|
repeat: Infinity,
|
|
1922
1945
|
ease: 'linear'
|
|
1923
1946
|
} }));
|
|
1924
|
-
const renderPulse = () => (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
1947
|
+
const renderPulse = () => (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.pulseSpinner, animate: {
|
|
1925
1948
|
scale: [1, 1.2, 1],
|
|
1926
1949
|
opacity: [1, 0.7, 1]
|
|
1927
1950
|
}, transition: {
|
|
@@ -1940,10 +1963,10 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1940
1963
|
return renderDots();
|
|
1941
1964
|
}
|
|
1942
1965
|
};
|
|
1943
|
-
return (jsxRuntime.jsxs("div", { className: containerClasses, style: customStyle, children: [renderSpinnerVariant(), showMessage && (jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: jsxRuntime.jsx(framerMotion.motion.p, { className: styles$
|
|
1966
|
+
return (jsxRuntime.jsxs("div", { className: containerClasses, style: customStyle, children: [renderSpinnerVariant(), showMessage && (jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: jsxRuntime.jsx(framerMotion.motion.p, { className: styles$o.loadingText, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: {
|
|
1944
1967
|
duration: 0.4,
|
|
1945
1968
|
ease: 'easeOut'
|
|
1946
|
-
}, children: currentMessage }, currentMessage) })), showSparkles && (jsxRuntime.jsx("div", { className: styles$
|
|
1969
|
+
}, children: currentMessage }, currentMessage) })), showSparkles && (jsxRuntime.jsx("div", { className: styles$o.sparkleContainer, children: [...Array(4)].map((_, i) => (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$o.sparkle, animate: {
|
|
1947
1970
|
opacity: [0, 1, 0],
|
|
1948
1971
|
scale: [0.5, 1, 0.5],
|
|
1949
1972
|
rotate: [0, 180, 360]
|
|
@@ -1958,7 +1981,7 @@ const LoadingSpinner = ({ message, size = 'medium', variant = 'dots', className
|
|
|
1958
1981
|
} }, i))) }))] }));
|
|
1959
1982
|
};
|
|
1960
1983
|
|
|
1961
|
-
var styles$
|
|
1984
|
+
var styles$n = {"wrapper":"DecryptedText-module_wrapper__tuLvf","srOnly":"DecryptedText-module_srOnly__A-K2T"};
|
|
1962
1985
|
|
|
1963
1986
|
/**
|
|
1964
1987
|
* DecryptedText Component
|
|
@@ -2142,13 +2165,13 @@ const DecryptedText = ({ text, speed = 50, maxIterations = 10, sequential = fals
|
|
|
2142
2165
|
onMouseLeave: () => setIsHovering(false),
|
|
2143
2166
|
}
|
|
2144
2167
|
: {};
|
|
2145
|
-
return (jsxRuntime.jsxs(framerMotion.motion.span, { className: `${styles$
|
|
2168
|
+
return (jsxRuntime.jsxs(framerMotion.motion.span, { className: `${styles$n.wrapper} ${parentClassName}`, ref: containerRef, ...hoverProps, ...props, children: [jsxRuntime.jsx("span", { className: styles$n.srOnly, children: displayText }), jsxRuntime.jsx("span", { "aria-hidden": "true", children: displayText.split('').map((char, index) => {
|
|
2146
2169
|
const isRevealedOrDone = revealedIndices.has(index) || !isScrambling || !isHovering;
|
|
2147
2170
|
return (jsxRuntime.jsx("span", { className: isRevealedOrDone ? className : encryptedClassName, children: char }, index));
|
|
2148
2171
|
}) })] }));
|
|
2149
2172
|
};
|
|
2150
2173
|
|
|
2151
|
-
var styles$
|
|
2174
|
+
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"};
|
|
2152
2175
|
|
|
2153
2176
|
/**
|
|
2154
2177
|
* ArrayInput component - Versatile dynamic list manager
|
|
@@ -2215,11 +2238,11 @@ function SimpleArrayInput({ label, values, onChange, placeholder, itemStyle, inp
|
|
|
2215
2238
|
itemIdsRef.current.splice(index, 1);
|
|
2216
2239
|
onChange(newValues);
|
|
2217
2240
|
};
|
|
2218
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
2241
|
+
return (jsxRuntime.jsxs("div", { className: styles$m.arrayInput, children: [jsxRuntime.jsx("h3", { className: styles$m.arrayInputLabel, children: label }), jsxRuntime.jsx("div", { children: jsxRuntime.jsx(framerMotion.AnimatePresence, { children: values.map((value, index) => (jsxRuntime.jsxs(framerMotion.motion.div, { className: styles$m.arrayInputItem, style: itemStyle, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: {
|
|
2219
2242
|
duration: 0.3,
|
|
2220
2243
|
ease: "easeInOut",
|
|
2221
2244
|
layout: { duration: 0.2 }
|
|
2222
|
-
}, children: [jsxRuntime.jsx("div", { className: styles$
|
|
2245
|
+
}, children: [jsxRuntime.jsx("div", { className: styles$m.inputWrapper, children: multiline ? (jsxRuntime.jsx("div", { style: inputStyle, children: jsxRuntime.jsx(TextArea, { label: "", value: value, onChange: (newValue) => handleChange(index, newValue), placeholder: placeholder, rows: rows, compact: true }) })) : (jsxRuntime.jsx("input", { type: "text", value: value, onChange: (e) => handleChange(index, e.target.value), placeholder: placeholder, className: styles$m.input, style: inputStyle })) }), jsxRuntime.jsx(Button, { variant: "ghost", size: "small", onClick: () => handleRemove(index), "aria-label": "Remove item", className: styles$m.removeButton, children: jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsxRuntime.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]))) }) }), jsxRuntime.jsx(Button, { variant: buttonVariant, size: "small", onClick: handleAdd, className: styles$m.addButton, children: label })] }));
|
|
2223
2246
|
}
|
|
2224
2247
|
// Complex object array implementation
|
|
2225
2248
|
function ComplexArrayInput({ label, values, onChange, fields, getKey, itemStyle, inputStyle, buttonVariant = 'primary' }) {
|
|
@@ -2244,14 +2267,14 @@ function ComplexArrayInput({ label, values, onChange, fields, getKey, itemStyle,
|
|
|
2244
2267
|
// Generate key from all field values
|
|
2245
2268
|
return fields.map(f => item[f.name] || '').join('-') + `-${index}`;
|
|
2246
2269
|
};
|
|
2247
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
2270
|
+
return (jsxRuntime.jsxs("div", { className: styles$m.arrayInput, children: [jsxRuntime.jsx("h3", { className: styles$m.arrayInputLabel, children: label }), jsxRuntime.jsx("div", { children: jsxRuntime.jsx(framerMotion.AnimatePresence, { children: values.map((value, index) => (jsxRuntime.jsxs(framerMotion.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: {
|
|
2248
2271
|
duration: 0.3,
|
|
2249
2272
|
ease: "easeInOut",
|
|
2250
2273
|
layout: { duration: 0.2 }
|
|
2251
|
-
}, children: [jsxRuntime.jsx("div", { className: styles$
|
|
2274
|
+
}, children: [jsxRuntime.jsx("div", { className: styles$m.fieldsWrapper, children: fields.map((field) => (jsxRuntime.jsx("div", { style: inputStyle, children: field.multiline ? (jsxRuntime.jsx(TextArea, { value: value[field.name] || '', onChange: (newValue) => handleChange(index, field.name, newValue), label: field.label, placeholder: field.placeholder, rows: field.rows, compact: true })) : (jsxRuntime.jsx(TextInput, { value: value[field.name] || '', onChange: (newValue) => handleChange(index, field.name, newValue), label: field.label, type: field.type, placeholder: field.placeholder })) }, field.name))) }), jsxRuntime.jsx(Button, { variant: "ghost", size: "small", onClick: () => handleRemove(index), "aria-label": "Remove item", className: styles$m.removeButton, children: jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: jsxRuntime.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)))) }) }), jsxRuntime.jsxs(Button, { variant: buttonVariant, size: "small", onClick: handleAdd, className: styles$m.addButton, children: ["Add ", label] })] }));
|
|
2252
2275
|
}
|
|
2253
2276
|
|
|
2254
|
-
var styles$
|
|
2277
|
+
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"};
|
|
2255
2278
|
|
|
2256
2279
|
const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = false, onEnterEditMode, onExitEditMode, position = { bottom: 32, right: 32 } }) => {
|
|
2257
2280
|
const [isMobile, setIsMobile] = React.useState(false);
|
|
@@ -2336,15 +2359,15 @@ const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = fa
|
|
|
2336
2359
|
};
|
|
2337
2360
|
const getVariantClass = () => {
|
|
2338
2361
|
if (isSaving)
|
|
2339
|
-
return styles$
|
|
2362
|
+
return styles$l.primary;
|
|
2340
2363
|
if (isEditMode) {
|
|
2341
|
-
return hasUnsavedChanges ? styles$
|
|
2364
|
+
return hasUnsavedChanges ? styles$l.success : styles$l.secondary;
|
|
2342
2365
|
}
|
|
2343
|
-
return styles$
|
|
2366
|
+
return styles$l.primary;
|
|
2344
2367
|
};
|
|
2345
2368
|
const getIcon = () => {
|
|
2346
2369
|
if (isSaving) {
|
|
2347
|
-
return jsxRuntime.jsx("div", { className: styles$
|
|
2370
|
+
return jsxRuntime.jsx("div", { className: styles$l.loader });
|
|
2348
2371
|
}
|
|
2349
2372
|
if (isEditMode) {
|
|
2350
2373
|
return hasUnsavedChanges ? jsxRuntime.jsx(lucideReact.Check, { size: 24 }) : jsxRuntime.jsx(lucideReact.X, { size: 24 });
|
|
@@ -2359,14 +2382,14 @@ const EditFAB = ({ canEdit, isEditMode, hasUnsavedChanges = false, isSaving = fa
|
|
|
2359
2382
|
}
|
|
2360
2383
|
return "Enter edit mode";
|
|
2361
2384
|
};
|
|
2362
|
-
return (jsxRuntime.jsx(framerMotion.motion.button, { ref: fabRef, className: `${styles$
|
|
2385
|
+
return (jsxRuntime.jsx(framerMotion.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: {
|
|
2363
2386
|
type: "spring",
|
|
2364
2387
|
stiffness: 260,
|
|
2365
2388
|
damping: 20
|
|
2366
2389
|
}, children: getIcon() }));
|
|
2367
2390
|
};
|
|
2368
2391
|
|
|
2369
|
-
var styles$
|
|
2392
|
+
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"};
|
|
2370
2393
|
|
|
2371
2394
|
// Default filter options for backwards compatibility
|
|
2372
2395
|
const defaultFilterOptions = [
|
|
@@ -2559,20 +2582,20 @@ const SearchBar = ({ className, placeholder = "Search (Ctrl+Space)...", onSearch
|
|
|
2559
2582
|
return text || '';
|
|
2560
2583
|
const regex = new RegExp(`(${highlight.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi');
|
|
2561
2584
|
const parts = text.split(regex);
|
|
2562
|
-
return parts.map((part, index) => regex.test(part) ? (jsxRuntime.jsx("mark", { className: styles$
|
|
2585
|
+
return parts.map((part, index) => regex.test(part) ? (jsxRuntime.jsx("mark", { className: styles$k.highlight, children: part }, index)) : (part));
|
|
2563
2586
|
};
|
|
2564
|
-
return (jsxRuntime.jsxs("div", { ref: searchRef, className: `${styles$
|
|
2587
|
+
return (jsxRuntime.jsxs("div", { ref: searchRef, className: `${styles$k.searchContainer} ${className || ''}`, children: [jsxRuntime.jsxs("div", { className: styles$k.searchInputWrapper, children: [jsxRuntime.jsx(lucideReact.Search, { className: styles$k.searchIcon }), jsxRuntime.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 && (jsxRuntime.jsx(framerMotion.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: jsxRuntime.jsx(lucideReact.X, {}) })), showFilter && (jsxRuntime.jsx("select", { value: filter, onChange: (e) => setFilter(e.target.value), className: styles$k.filterSelect, "aria-label": "Filter search results", children: filterOptions.map(option => (jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))) }))] }), jsxRuntime.jsx(framerMotion.AnimatePresence, { children: isDropdownOpen && (jsxRuntime.jsx(framerMotion.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 ? (jsxRuntime.jsxs("div", { className: styles$k.loadingState, children: [jsxRuntime.jsx("div", { className: styles$k.spinner }), jsxRuntime.jsx("span", { children: "Searching..." })] })) : results.length === 0 ? (jsxRuntime.jsxs("div", { className: styles$k.emptyState, children: ["No results found for \"", query, "\""] })) : (jsxRuntime.jsx("div", { className: styles$k.resultsGroups, children: Object.entries(groupedResults).map(([type, groupResults]) => {
|
|
2565
2588
|
const Icon = entityIcons[type];
|
|
2566
|
-
return (jsxRuntime.jsxs("div", { className: styles$
|
|
2589
|
+
return (jsxRuntime.jsxs("div", { className: styles$k.resultGroup, children: [jsxRuntime.jsxs("div", { className: styles$k.groupHeader, children: [Icon && jsxRuntime.jsx(Icon, { className: styles$k.groupIcon }), jsxRuntime.jsx("span", { className: styles$k.groupTitle, children: type.charAt(0).toUpperCase() + type.slice(1) }), jsxRuntime.jsx("span", { className: styles$k.groupCount, children: groupResults.length })] }), jsxRuntime.jsx("div", { className: styles$k.groupResults, children: groupResults.map((result) => {
|
|
2567
2590
|
const globalIndex = results.indexOf(result);
|
|
2568
|
-
return (jsxRuntime.jsxs(framerMotion.motion.button, { "data-result-index": globalIndex, className: `${styles$
|
|
2591
|
+
return (jsxRuntime.jsxs(framerMotion.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: [jsxRuntime.jsxs("div", { className: styles$k.resultContent, children: [jsxRuntime.jsx("div", { className: styles$k.resultTitle, children: highlightMatch(result.title || 'Untitled', query) }), result.subtitle && (jsxRuntime.jsx("div", { className: styles$k.resultSubtitle, children: highlightMatch(result.subtitle, query) }))] }), result.meta && (jsxRuntime.jsx("div", { className: styles$k.resultMeta, children: result.meta }))] }, `${result.type}-${result.id}`));
|
|
2569
2592
|
}) })] }, type));
|
|
2570
2593
|
}) })) })) })] }));
|
|
2571
2594
|
};
|
|
2572
2595
|
|
|
2573
|
-
var styles$
|
|
2596
|
+
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-"};
|
|
2574
2597
|
|
|
2575
|
-
const lightTheme = styles$
|
|
2598
|
+
const lightTheme = styles$D.createTheme({
|
|
2576
2599
|
palette: {
|
|
2577
2600
|
mode: 'light',
|
|
2578
2601
|
primary: { main: '#3b82f6' },
|
|
@@ -2586,7 +2609,7 @@ const lightTheme = styles$C.createTheme({
|
|
|
2586
2609
|
},
|
|
2587
2610
|
},
|
|
2588
2611
|
});
|
|
2589
|
-
const darkTheme = styles$
|
|
2612
|
+
const darkTheme = styles$D.createTheme({
|
|
2590
2613
|
palette: {
|
|
2591
2614
|
mode: 'dark',
|
|
2592
2615
|
primary: { main: '#f5b829' },
|
|
@@ -2606,26 +2629,26 @@ function TimeInput({ label, value, onChange, error = false, success = false, loa
|
|
|
2606
2629
|
!!document.documentElement.getAttribute('data-theme')?.includes('dark');
|
|
2607
2630
|
const muiTheme = React.useMemo(() => (isDark ? darkTheme : lightTheme), [isDark]);
|
|
2608
2631
|
const getContainerClassName = () => {
|
|
2609
|
-
const classes = [styles$
|
|
2632
|
+
const classes = [styles$j.timeInput];
|
|
2610
2633
|
if (error)
|
|
2611
|
-
classes.push(styles$
|
|
2634
|
+
classes.push(styles$j.error);
|
|
2612
2635
|
if (success)
|
|
2613
|
-
classes.push(styles$
|
|
2636
|
+
classes.push(styles$j.success);
|
|
2614
2637
|
if (loading)
|
|
2615
|
-
classes.push(styles$
|
|
2638
|
+
classes.push(styles$j.loading);
|
|
2616
2639
|
if (disabled)
|
|
2617
|
-
classes.push(styles$
|
|
2640
|
+
classes.push(styles$j.disabled);
|
|
2618
2641
|
if (className)
|
|
2619
2642
|
classes.push(className);
|
|
2620
2643
|
return classes.join(' ');
|
|
2621
2644
|
};
|
|
2622
|
-
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [label && (jsxRuntime.jsxs("label", { className: styles$
|
|
2645
|
+
return (jsxRuntime.jsxs("div", { className: getContainerClassName(), children: [label && (jsxRuntime.jsxs("label", { className: styles$j.label, children: [label, required && jsxRuntime.jsx("span", { className: styles$j.required, children: "*" })] })), jsxRuntime.jsx(styles$D.ThemeProvider, { theme: muiTheme, children: jsxRuntime.jsx(LocalizationProvider.LocalizationProvider, { dateAdapter: AdapterDayjs.AdapterDayjs, children: jsxRuntime.jsx(MobileTimePicker.MobileTimePicker, { value: dayjsValue, onChange: (newValue) => {
|
|
2623
2646
|
onChange(newValue ? newValue.format('HH:mm') : '');
|
|
2624
2647
|
}, ampm: false, views: ['hours', 'minutes'], disabled: disabled || loading, slotProps: {
|
|
2625
2648
|
textField: {
|
|
2626
2649
|
size: 'small',
|
|
2627
2650
|
fullWidth: true,
|
|
2628
|
-
className: styles$
|
|
2651
|
+
className: styles$j.picker,
|
|
2629
2652
|
sx: {
|
|
2630
2653
|
'& .MuiPickersOutlinedInput-root': {
|
|
2631
2654
|
fontFamily: "'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, monospace",
|
|
@@ -2713,7 +2736,7 @@ const ThemeProvider = ({ children, defaultTheme = 'light', storageKey = 'app-the
|
|
|
2713
2736
|
return (jsxRuntime.jsx(ThemeContext.Provider, { value: { theme, setTheme, toggleTheme }, children: children }));
|
|
2714
2737
|
};
|
|
2715
2738
|
|
|
2716
|
-
var styles$
|
|
2739
|
+
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"};
|
|
2717
2740
|
|
|
2718
2741
|
const ThemeSwitcher = ({ variant = 'button', showLabel = false, className = '', currentTheme, onThemeChange, themes: customThemes, }) => {
|
|
2719
2742
|
// Use safe version that returns null when outside a ThemeProvider
|
|
@@ -2734,25 +2757,25 @@ const ThemeSwitcher = ({ variant = 'button', showLabel = false, className = '',
|
|
|
2734
2757
|
if (variant === 'toggle') {
|
|
2735
2758
|
// Simple toggle between light and dark
|
|
2736
2759
|
const isDark = theme.includes('dark');
|
|
2737
|
-
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: `${styles$
|
|
2760
|
+
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: `${styles$i.toggle} ${className}`, onClick: () => setTheme(isDark ? 'light' : 'dark'), whileTap: { scale: 0.95 }, "aria-label": "Toggle theme", children: [jsxRuntime.jsx(framerMotion.motion.div, { className: styles$i.toggleTrack, animate: { backgroundColor: isDark ? 'var(--color-primary)' : 'var(--color-border)' }, children: jsxRuntime.jsx(framerMotion.motion.div, { className: styles$i.toggleThumb, animate: { x: isDark ? 24 : 0 }, transition: { type: 'spring', stiffness: 500, damping: 30 }, children: isDark ? jsxRuntime.jsx(lucideReact.Moon, { size: 14 }) : jsxRuntime.jsx(lucideReact.Sun, { size: 14 }) }) }), showLabel && jsxRuntime.jsx("span", { className: styles$i.label, children: isDark ? 'Dark' : 'Light' })] }));
|
|
2738
2761
|
}
|
|
2739
2762
|
if (variant === 'icon') {
|
|
2740
|
-
return (jsxRuntime.jsxs("button", { type: "button", className: `${styles$
|
|
2763
|
+
return (jsxRuntime.jsxs("button", { type: "button", className: `${styles$i.iconButton} ${className}`, onClick: () => {
|
|
2741
2764
|
const nextIndex = (currentThemeIndex + 1) % themes.length;
|
|
2742
2765
|
setTheme(themes[nextIndex].value);
|
|
2743
|
-
}, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, title: currentThemeData.label, children: [currentThemeData.icon, showLabel && jsxRuntime.jsx("span", { className: styles$
|
|
2766
|
+
}, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, title: currentThemeData.label, children: [currentThemeData.icon, showLabel && jsxRuntime.jsx("span", { className: styles$i.label, children: currentThemeData.label })] }));
|
|
2744
2767
|
}
|
|
2745
2768
|
if (variant === 'dropdown') {
|
|
2746
|
-
return (jsxRuntime.jsxs("div", { className: `${styles$
|
|
2769
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$i.dropdown} ${className}`, children: [jsxRuntime.jsxs(framerMotion.motion.button, { className: styles$i.dropdownTrigger, whileTap: { scale: 0.98 }, children: [currentThemeData.icon, showLabel && jsxRuntime.jsx("span", { className: styles$i.label, children: currentThemeData.label })] }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$i.dropdownMenu, initial: { opacity: 0, y: -10 }, animate: { opacity: 1, y: 0 }, children: themes.map((t) => (jsxRuntime.jsxs(framerMotion.motion.button, { className: `${styles$i.dropdownItem} ${theme === t.value ? styles$i.active : ''}`, onClick: () => setTheme(t.value), whileHover: { x: 4 }, whileTap: { scale: 0.98 }, children: [jsxRuntime.jsx("span", { className: styles$i.icon, children: t.icon }), jsxRuntime.jsx("span", { className: styles$i.text, children: t.label })] }, t.value))) })] }));
|
|
2747
2770
|
}
|
|
2748
2771
|
// Default button variant - cycles through themes
|
|
2749
|
-
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: `${styles$
|
|
2772
|
+
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: `${styles$i.button} ${className}`, onClick: () => {
|
|
2750
2773
|
const nextIndex = (currentThemeIndex + 1) % themes.length;
|
|
2751
2774
|
setTheme(themes[nextIndex].value);
|
|
2752
|
-
}, whileTap: { scale: 0.95 }, whileHover: { scale: 1.05 }, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, children: [jsxRuntime.jsx(framerMotion.motion.div, { initial: { rotate: -180, opacity: 0 }, animate: { rotate: 0, opacity: 1 }, exit: { rotate: 180, opacity: 0 }, transition: { duration: 0.3 }, className: styles$
|
|
2775
|
+
}, whileTap: { scale: 0.95 }, whileHover: { scale: 1.05 }, "aria-label": `Current theme: ${currentThemeData.label}. Click to change.`, children: [jsxRuntime.jsx(framerMotion.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 && jsxRuntime.jsx("span", { className: styles$i.label, children: currentThemeData.label })] }));
|
|
2753
2776
|
};
|
|
2754
2777
|
|
|
2755
|
-
var styles$
|
|
2778
|
+
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"};
|
|
2756
2779
|
|
|
2757
2780
|
// Default tabs for backwards compatibility
|
|
2758
2781
|
const defaultTabs = [
|
|
@@ -2763,39 +2786,39 @@ const defaultTabs = [
|
|
|
2763
2786
|
];
|
|
2764
2787
|
const Tabs = ({ activeTab, onTabChange, tabs: customTabs, className = '', fullWidth = false }) => {
|
|
2765
2788
|
const tabs = customTabs ?? defaultTabs;
|
|
2766
|
-
return (jsxRuntime.jsx("div", { className: `${styles$
|
|
2789
|
+
return (jsxRuntime.jsx("div", { className: `${styles$h.tabs} ${fullWidth ? styles$h.fullWidth : ''} ${className}`, children: tabs.map((tab) => {
|
|
2767
2790
|
const isActive = activeTab === tab.id;
|
|
2768
|
-
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: styles$
|
|
2791
|
+
return (jsxRuntime.jsxs(framerMotion.motion.button, { className: styles$h.tab, "data-active": isActive, onClick: () => onTabChange(tab.id), style: { position: 'relative' }, children: [jsxRuntime.jsx(framerMotion.motion.div, { animate: {
|
|
2769
2792
|
rotate: isActive ? [0, -10, 10, -5, 5, 0] : 0,
|
|
2770
2793
|
}, transition: {
|
|
2771
2794
|
rotate: {
|
|
2772
2795
|
duration: 0.5,
|
|
2773
2796
|
ease: 'easeInOut'
|
|
2774
2797
|
}
|
|
2775
|
-
}, children: tab.icon && (React.isValidElement(tab.icon) ? (jsxRuntime.jsx("span", { className: styles$
|
|
2798
|
+
}, children: tab.icon && (React.isValidElement(tab.icon) ? (jsxRuntime.jsx("span", { className: styles$h.tabIcon, children: tab.icon })) : (jsxRuntime.jsx("span", { className: styles$h.tabIcon, children: React.createElement(tab.icon) }))) }), jsxRuntime.jsx("span", { children: tab.label })] }, tab.id));
|
|
2776
2799
|
}) }));
|
|
2777
2800
|
};
|
|
2778
2801
|
|
|
2779
|
-
var styles$
|
|
2802
|
+
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"};
|
|
2780
2803
|
|
|
2781
2804
|
const getIcon = (type) => {
|
|
2782
2805
|
switch (type) {
|
|
2783
2806
|
case 'success':
|
|
2784
|
-
return (jsxRuntime.jsx("svg", { className: `${styles$
|
|
2807
|
+
return (jsxRuntime.jsx("svg", { className: `${styles$g.icon} ${styles$g.iconSuccess}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }));
|
|
2785
2808
|
case 'error':
|
|
2786
|
-
return (jsxRuntime.jsx("svg", { className: `${styles$
|
|
2809
|
+
return (jsxRuntime.jsx("svg", { className: `${styles$g.icon} ${styles$g.iconError}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }));
|
|
2787
2810
|
case 'warning':
|
|
2788
|
-
return (jsxRuntime.jsx("svg", { className: `${styles$
|
|
2811
|
+
return (jsxRuntime.jsx("svg", { className: `${styles$g.icon} ${styles$g.iconWarning}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.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" }) }));
|
|
2789
2812
|
case 'info':
|
|
2790
|
-
return (jsxRuntime.jsx("svg", { className: `${styles$
|
|
2813
|
+
return (jsxRuntime.jsx("svg", { className: `${styles$g.icon} ${styles$g.iconInfo}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.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" }) }));
|
|
2791
2814
|
}
|
|
2792
2815
|
};
|
|
2793
2816
|
const getToastStyle = (type) => {
|
|
2794
2817
|
switch (type) {
|
|
2795
|
-
case 'success': return styles$
|
|
2796
|
-
case 'error': return styles$
|
|
2797
|
-
case 'warning': return styles$
|
|
2798
|
-
case 'info': return styles$
|
|
2818
|
+
case 'success': return styles$g.toastSuccess;
|
|
2819
|
+
case 'error': return styles$g.toastError;
|
|
2820
|
+
case 'warning': return styles$g.toastWarning;
|
|
2821
|
+
case 'info': return styles$g.toastInfo;
|
|
2799
2822
|
default: return '';
|
|
2800
2823
|
}
|
|
2801
2824
|
};
|
|
@@ -2817,7 +2840,7 @@ const ToastItem = ({ toast, removeToast, }) => {
|
|
|
2817
2840
|
clearInterval(interval);
|
|
2818
2841
|
};
|
|
2819
2842
|
}, [toast.id, duration, removeToast]);
|
|
2820
|
-
return (jsxRuntime.jsxs(framerMotion.motion.div, { className: `${styles$
|
|
2843
|
+
return (jsxRuntime.jsxs(framerMotion.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), jsxRuntime.jsxs("div", { className: styles$g.content, children: [toast.title && jsxRuntime.jsx("p", { className: styles$g.title, children: toast.title }), jsxRuntime.jsx("p", { className: styles$g.message, children: toast.message })] }), jsxRuntime.jsx("button", { className: styles$g.closeButton, onClick: () => removeToast(toast.id), "aria-label": "Close notification", children: jsxRuntime.jsx("svg", { width: "16", height: "16", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }), jsxRuntime.jsx(framerMotion.motion.div, { className: styles$g.progressBar, initial: { width: '100%' }, animate: { width: `${progress}%` }, style: {
|
|
2821
2844
|
color: toast.type === 'success' ? '#10B981'
|
|
2822
2845
|
: toast.type === 'error' ? '#EF4444'
|
|
2823
2846
|
: toast.type === 'warning' ? '#F59E0B'
|
|
@@ -2827,10 +2850,10 @@ const ToastItem = ({ toast, removeToast, }) => {
|
|
|
2827
2850
|
const ToastContainer = ({ toasts, removeToast }) => {
|
|
2828
2851
|
if (typeof document === 'undefined')
|
|
2829
2852
|
return null;
|
|
2830
|
-
return reactDom.createPortal(jsxRuntime.jsx("div", { className: styles$
|
|
2853
|
+
return reactDom.createPortal(jsxRuntime.jsx("div", { className: styles$g.toastContainer, children: jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "sync", children: toasts.map((toast) => (jsxRuntime.jsx(ToastItem, { toast: toast, removeToast: removeToast }, toast.id))) }) }), document.body);
|
|
2831
2854
|
};
|
|
2832
2855
|
|
|
2833
|
-
var styles$
|
|
2856
|
+
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"};
|
|
2834
2857
|
|
|
2835
2858
|
/**
|
|
2836
2859
|
* Breadcrumb Component
|
|
@@ -2849,13 +2872,13 @@ var styles$e = {"breadcrumb":"Breadcrumb-module_breadcrumb__pGabz","separator":"
|
|
|
2849
2872
|
* />
|
|
2850
2873
|
*/
|
|
2851
2874
|
const Breadcrumb = ({ items, onNavigate, className = '' }) => {
|
|
2852
|
-
return (jsxRuntime.jsx("nav", { className: `${styles$
|
|
2875
|
+
return (jsxRuntime.jsx("nav", { className: `${styles$f.breadcrumb} ${className}`, "aria-label": "Breadcrumb", children: items.map((item, index) => {
|
|
2853
2876
|
const isLast = index === items.length - 1;
|
|
2854
|
-
return (jsxRuntime.jsxs(React.Fragment, { children: [index > 0 && jsxRuntime.jsx(lucideReact.ChevronRight, { size: 14, className: styles$
|
|
2877
|
+
return (jsxRuntime.jsxs(React.Fragment, { children: [index > 0 && jsxRuntime.jsx(lucideReact.ChevronRight, { size: 14, className: styles$f.separator }), isLast || !item.href ? (jsxRuntime.jsx("span", { className: `${styles$f.item} ${isLast ? styles$f.current : ''}`, children: item.label })) : (jsxRuntime.jsx("button", { className: `${styles$f.item} ${styles$f.link}`, onClick: () => onNavigate?.(item.href), children: item.label }))] }, index));
|
|
2855
2878
|
}) }));
|
|
2856
2879
|
};
|
|
2857
2880
|
|
|
2858
|
-
var styles$
|
|
2881
|
+
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"};
|
|
2859
2882
|
|
|
2860
2883
|
/**
|
|
2861
2884
|
* LiquidButton Component
|
|
@@ -2881,10 +2904,167 @@ const LiquidButton = ({ actions, icon: Icon = lucideReact.Plus, className = '',
|
|
|
2881
2904
|
setExpanded(false);
|
|
2882
2905
|
action.onClick();
|
|
2883
2906
|
}, []);
|
|
2884
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(framerMotion.AnimatePresence, { children: expanded && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$
|
|
2907
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(framerMotion.AnimatePresence, { children: expanded && (jsxRuntime.jsx(framerMotion.motion.div, { className: styles$e.overlay, initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: handleToggle })) }), jsxRuntime.jsxs("div", { className: `${styles$e.container} ${className}`, children: [jsxRuntime.jsx(framerMotion.AnimatePresence, { children: expanded && (jsxRuntime.jsx("div", { className: styles$e.actions, children: actions.map((action, index) => (jsxRuntime.jsxs(framerMotion.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: {
|
|
2885
2908
|
duration: 0.15,
|
|
2886
2909
|
delay: (actions.length - 1 - index) * 0.05,
|
|
2887
|
-
}, onClick: () => handleAction(action), children: [jsxRuntime.jsx(action.icon, { size: 18, color: action.color }), jsxRuntime.jsx("span", { className: styles$
|
|
2910
|
+
}, onClick: () => handleAction(action), children: [jsxRuntime.jsx(action.icon, { size: 18, color: action.color }), jsxRuntime.jsx("span", { className: styles$e.actionLabel, children: action.label })] }, action.key))) })) }), jsxRuntime.jsx(framerMotion.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: jsxRuntime.jsx(Icon, { size: 24, strokeWidth: 2.5 }) })] })] }));
|
|
2911
|
+
};
|
|
2912
|
+
|
|
2913
|
+
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-"};
|
|
2914
|
+
|
|
2915
|
+
const DEFAULT_STATE = {
|
|
2916
|
+
freq: 'WEEKLY',
|
|
2917
|
+
interval: 1,
|
|
2918
|
+
byDay: ['MO'],
|
|
2919
|
+
byMonthDay: 1,
|
|
2920
|
+
monthlyLast: false,
|
|
2921
|
+
byMonth: 1,
|
|
2922
|
+
yearDay: 1,
|
|
2923
|
+
};
|
|
2924
|
+
const WEEKDAYS = [
|
|
2925
|
+
{ code: 'MO', label: 'M', rrule: rrule.RRule.MO },
|
|
2926
|
+
{ code: 'TU', label: 'T', rrule: rrule.RRule.TU },
|
|
2927
|
+
{ code: 'WE', label: 'W', rrule: rrule.RRule.WE },
|
|
2928
|
+
{ code: 'TH', label: 'T', rrule: rrule.RRule.TH },
|
|
2929
|
+
{ code: 'FR', label: 'F', rrule: rrule.RRule.FR },
|
|
2930
|
+
{ code: 'SA', label: 'S', rrule: rrule.RRule.SA },
|
|
2931
|
+
{ code: 'SU', label: 'S', rrule: rrule.RRule.SU },
|
|
2932
|
+
];
|
|
2933
|
+
const MONTHS$1 = [
|
|
2934
|
+
'January',
|
|
2935
|
+
'February',
|
|
2936
|
+
'March',
|
|
2937
|
+
'April',
|
|
2938
|
+
'May',
|
|
2939
|
+
'June',
|
|
2940
|
+
'July',
|
|
2941
|
+
'August',
|
|
2942
|
+
'September',
|
|
2943
|
+
'October',
|
|
2944
|
+
'November',
|
|
2945
|
+
'December',
|
|
2946
|
+
];
|
|
2947
|
+
const FREQ_MAP = {
|
|
2948
|
+
DAILY: rrule.RRule.DAILY,
|
|
2949
|
+
WEEKLY: rrule.RRule.WEEKLY,
|
|
2950
|
+
MONTHLY: rrule.RRule.MONTHLY,
|
|
2951
|
+
YEARLY: rrule.RRule.YEARLY,
|
|
2952
|
+
};
|
|
2953
|
+
const REVERSE_FREQ = {
|
|
2954
|
+
[rrule.RRule.DAILY]: 'DAILY',
|
|
2955
|
+
[rrule.RRule.WEEKLY]: 'WEEKLY',
|
|
2956
|
+
[rrule.RRule.MONTHLY]: 'MONTHLY',
|
|
2957
|
+
[rrule.RRule.YEARLY]: 'YEARLY',
|
|
2958
|
+
};
|
|
2959
|
+
const buildRule = (s) => {
|
|
2960
|
+
const opts = { freq: FREQ_MAP[s.freq] };
|
|
2961
|
+
if (s.interval > 1)
|
|
2962
|
+
opts.interval = s.interval;
|
|
2963
|
+
if (s.freq === 'WEEKLY' && s.byDay.length > 0) {
|
|
2964
|
+
opts.byweekday = s.byDay
|
|
2965
|
+
.map(c => WEEKDAYS.find(w => w.code === c)?.rrule)
|
|
2966
|
+
.filter((w) => !!w);
|
|
2967
|
+
}
|
|
2968
|
+
if (s.freq === 'MONTHLY') {
|
|
2969
|
+
opts.bymonthday = s.monthlyLast ? -1 : s.byMonthDay;
|
|
2970
|
+
}
|
|
2971
|
+
if (s.freq === 'YEARLY') {
|
|
2972
|
+
opts.bymonth = s.byMonth;
|
|
2973
|
+
opts.bymonthday = s.yearDay;
|
|
2974
|
+
}
|
|
2975
|
+
const rule = new rrule.RRule(opts);
|
|
2976
|
+
return rule.toString().replace(/^(?:DTSTART:[^\n]*\n)?RRULE:/, '');
|
|
2977
|
+
};
|
|
2978
|
+
const parseRule = (rule) => {
|
|
2979
|
+
try {
|
|
2980
|
+
const opts = rrule.RRule.parseString(rule);
|
|
2981
|
+
const freq = REVERSE_FREQ[opts.freq];
|
|
2982
|
+
if (!freq)
|
|
2983
|
+
return null;
|
|
2984
|
+
const byweekday = opts.byweekday ?? [];
|
|
2985
|
+
const byDay = byweekday
|
|
2986
|
+
.map(w => {
|
|
2987
|
+
const n = typeof w === 'number' ? w : w.weekday;
|
|
2988
|
+
return WEEKDAYS.find(d => d.rrule.weekday === n)?.code;
|
|
2989
|
+
})
|
|
2990
|
+
.filter((c) => !!c);
|
|
2991
|
+
const bmd = opts.bymonthday;
|
|
2992
|
+
const bymonthday = Array.isArray(bmd) ? bmd[0] : bmd;
|
|
2993
|
+
const bm = opts.bymonth;
|
|
2994
|
+
const bymonth = Array.isArray(bm) ? bm[0] : bm;
|
|
2995
|
+
return {
|
|
2996
|
+
freq,
|
|
2997
|
+
interval: opts.interval || 1,
|
|
2998
|
+
byDay: byDay.length > 0 ? byDay : ['MO'],
|
|
2999
|
+
byMonthDay: freq === 'MONTHLY' && bymonthday && bymonthday > 0 ? bymonthday : 1,
|
|
3000
|
+
monthlyLast: freq === 'MONTHLY' && bymonthday === -1,
|
|
3001
|
+
byMonth: freq === 'YEARLY' ? bymonth || 1 : 1,
|
|
3002
|
+
yearDay: freq === 'YEARLY' && bymonthday ? bymonthday : 1,
|
|
3003
|
+
};
|
|
3004
|
+
}
|
|
3005
|
+
catch {
|
|
3006
|
+
return null;
|
|
3007
|
+
}
|
|
3008
|
+
};
|
|
3009
|
+
const stateFromValue = (value) => {
|
|
3010
|
+
if (!value)
|
|
3011
|
+
return DEFAULT_STATE;
|
|
3012
|
+
return parseRule(value) ?? DEFAULT_STATE;
|
|
3013
|
+
};
|
|
3014
|
+
const RecurrencePicker = ({ value, onChange, className, }) => {
|
|
3015
|
+
const [state, setState] = React.useState(() => stateFromValue(value));
|
|
3016
|
+
const built = React.useMemo(() => buildRule(state), [state]);
|
|
3017
|
+
// Re-sync internal state if the parent passes a different rule than the one
|
|
3018
|
+
// we currently render. The `built === value` guard prevents the loop where
|
|
3019
|
+
// our own emit comes back through `value` and triggers a redundant resync.
|
|
3020
|
+
React.useEffect(() => {
|
|
3021
|
+
if (value && value !== built) {
|
|
3022
|
+
const parsed = parseRule(value);
|
|
3023
|
+
if (parsed)
|
|
3024
|
+
setState(parsed);
|
|
3025
|
+
}
|
|
3026
|
+
}, [value, built]);
|
|
3027
|
+
// On mount, if the parent didn't seed a rule, push our default up so its
|
|
3028
|
+
// state matches what we visually display. Runs once.
|
|
3029
|
+
React.useEffect(() => {
|
|
3030
|
+
if (!value)
|
|
3031
|
+
onChange(built);
|
|
3032
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
3033
|
+
}, []);
|
|
3034
|
+
const update = (patch) => {
|
|
3035
|
+
const next = { ...state, ...patch };
|
|
3036
|
+
setState(next);
|
|
3037
|
+
onChange(buildRule(next));
|
|
3038
|
+
};
|
|
3039
|
+
const toggleDay = (code) => {
|
|
3040
|
+
const byDay = state.byDay.includes(code)
|
|
3041
|
+
? state.byDay.filter(c => c !== code)
|
|
3042
|
+
: [...state.byDay, code];
|
|
3043
|
+
update({ byDay });
|
|
3044
|
+
};
|
|
3045
|
+
const preview = React.useMemo(() => {
|
|
3046
|
+
try {
|
|
3047
|
+
return rrule.RRule.fromString(built).toText();
|
|
3048
|
+
}
|
|
3049
|
+
catch {
|
|
3050
|
+
return built;
|
|
3051
|
+
}
|
|
3052
|
+
}, [built]);
|
|
3053
|
+
const unitLabel = {
|
|
3054
|
+
DAILY: state.interval === 1 ? 'day' : 'days',
|
|
3055
|
+
WEEKLY: state.interval === 1 ? 'week' : 'weeks',
|
|
3056
|
+
MONTHLY: state.interval === 1 ? 'month' : 'months',
|
|
3057
|
+
YEARLY: state.interval === 1 ? 'year' : 'years',
|
|
3058
|
+
};
|
|
3059
|
+
return (jsxRuntime.jsxs("div", { className: `${styles$d.container}${className ? ` ${className}` : ''}`, children: [jsxRuntime.jsx("div", { className: styles$d.field, children: jsxRuntime.jsx(SelectInput, { label: "Frequency", value: state.freq, onChange: v => update({ freq: v }), options: [
|
|
3060
|
+
{ value: 'DAILY', label: 'Daily' },
|
|
3061
|
+
{ value: 'WEEKLY', label: 'Weekly' },
|
|
3062
|
+
{ value: 'MONTHLY', label: 'Monthly' },
|
|
3063
|
+
{ value: 'YEARLY', label: 'Yearly' },
|
|
3064
|
+
] }) }), jsxRuntime.jsxs("div", { className: styles$d.field, children: [jsxRuntime.jsx("span", { className: styles$d.fieldLabel, children: "Every" }), jsxRuntime.jsxs("div", { className: styles$d.fieldRow, children: [jsxRuntime.jsx(NumberStepper, { value: state.interval, onChange: v => update({ interval: Math.max(1, v) }), min: 1, max: 99, hideLimits: true, size: "small" }), jsxRuntime.jsx("span", { className: styles$d.fieldUnit, children: unitLabel[state.freq] })] })] }), state.freq === 'WEEKLY' && (jsxRuntime.jsxs("div", { className: `${styles$d.field} ${styles$d.fieldCentered}`, children: [jsxRuntime.jsx("span", { className: styles$d.fieldLabel, children: "On" }), jsxRuntime.jsx("div", { className: styles$d.dayPicker, children: WEEKDAYS.map(d => (jsxRuntime.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' && (jsxRuntime.jsxs("div", { className: styles$d.field, children: [jsxRuntime.jsx("span", { className: styles$d.fieldLabel, children: "Day of month" }), jsxRuntime.jsxs("div", { className: styles$d.fieldRow, children: [jsxRuntime.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" }), jsxRuntime.jsx(Checkbox, { checked: state.monthlyLast, onChange: v => update({ monthlyLast: v }), label: "Last day" })] })] })), state.freq === 'YEARLY' && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: styles$d.field, children: jsxRuntime.jsx(SelectInput, { label: "Month", value: String(state.byMonth), onChange: v => update({ byMonth: Number(v) }), options: MONTHS$1.map((m, i) => ({
|
|
3065
|
+
value: String(i + 1),
|
|
3066
|
+
label: m,
|
|
3067
|
+
})) }) }), jsxRuntime.jsxs("div", { className: styles$d.field, children: [jsxRuntime.jsx("span", { className: styles$d.fieldLabel, children: "Day" }), jsxRuntime.jsx(NumberStepper, { value: state.yearDay, onChange: v => update({ yearDay: Math.min(31, Math.max(1, v)) }), min: 1, max: 31, hideLimits: true, size: "small" })] })] })), jsxRuntime.jsx("div", { className: styles$d.preview, children: preview })] }));
|
|
2888
3068
|
};
|
|
2889
3069
|
|
|
2890
3070
|
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"};
|
|
@@ -4594,7 +4774,7 @@ const HabitTimeOfDayChart = ({ events, width = 800, height = 400, startDate, end
|
|
|
4594
4774
|
: ''] }), tooltipData.count > 1 && (jsxRuntime.jsxs("div", { className: styles$7.tooltipValue, children: [jsxRuntime.jsx("strong", { children: tooltipData.count }), jsxRuntime.jsx("span", { className: styles$7.tooltipUnits, children: "events" })] }))] })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: styles$7.tooltipHeader, children: jsxRuntime.jsx("span", { children: formatHour(tooltipData.hour) }) }), jsxRuntime.jsxs("div", { className: styles$7.tooltipInfo, children: [jsxRuntime.jsxs("div", { className: styles$7.tooltipValue, children: [jsxRuntime.jsx("strong", { children: tooltipData.count }), jsxRuntime.jsxs("span", { className: styles$7.tooltipUnits, children: ["event", tooltipData.count === 1 ? '' : 's'] })] }), tooltipData.breakdown && tooltipData.breakdown.length > 1 && (jsxRuntime.jsx("div", { className: styles$7.tooltipBreakdown, children: tooltipData.breakdown.map(({ habit, count }) => (jsxRuntime.jsxs("div", { className: styles$7.tooltipBreakdownRow, children: [jsxRuntime.jsx("span", { className: styles$7.tooltipDot, style: { backgroundColor: getColor(habit) } }), jsxRuntime.jsxs("span", { children: [customHabitEmojis[habit] || '', " ", habit] }), jsxRuntime.jsx("span", { className: styles$7.tooltipCount, children: count })] }, habit))) }))] })] })) }))] }));
|
|
4595
4775
|
};
|
|
4596
4776
|
|
|
4597
|
-
var styles$6 = {"container":"SleepChart-module_container__RjHVU","header":"SleepChart-module_header__bcoWe","
|
|
4777
|
+
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"};
|
|
4598
4778
|
|
|
4599
4779
|
const parseTimeToDecimal = (time) => {
|
|
4600
4780
|
const [hours, minutes] = time.split(':').map(Number);
|
|
@@ -4602,288 +4782,217 @@ const parseTimeToDecimal = (time) => {
|
|
|
4602
4782
|
};
|
|
4603
4783
|
const formatTime = (hour) => {
|
|
4604
4784
|
const h24 = Math.floor(hour % 24);
|
|
4605
|
-
const h12 = h24 === 0 ? 12 : h24 > 12 ? h24 - 12 : h24;
|
|
4606
|
-
const ampm = h24 >= 12 ? 'PM' : 'AM';
|
|
4607
4785
|
const minutes = Math.round((hour % 1) * 60);
|
|
4608
|
-
return `${
|
|
4786
|
+
return `${h24.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
|
4787
|
+
};
|
|
4788
|
+
const formatDuration = (decimal) => {
|
|
4789
|
+
const h = Math.floor(decimal);
|
|
4790
|
+
const m = Math.round((decimal % 1) * 60);
|
|
4791
|
+
return `${h}h ${m.toString().padStart(2, '0')}m`;
|
|
4609
4792
|
};
|
|
4610
|
-
|
|
4793
|
+
// Build an SVG sine-wave path between two x-coordinates at a given baseline y.
|
|
4794
|
+
// Two quadratic curves per cycle keep the curve smooth without needing cubic control points.
|
|
4795
|
+
const buildSquigglePath = (x1, x2, y, amplitude, wavelength) => {
|
|
4796
|
+
const distance = Math.max(0, x2 - x1);
|
|
4797
|
+
if (distance === 0)
|
|
4798
|
+
return `M ${x1} ${y}`;
|
|
4799
|
+
const cycles = Math.max(1, Math.round(distance / wavelength));
|
|
4800
|
+
const halfStep = distance / (cycles * 2);
|
|
4801
|
+
let path = `M ${x1} ${y}`;
|
|
4802
|
+
for (let i = 0; i < cycles * 2; i++) {
|
|
4803
|
+
const cx = x1 + (i + 0.5) * halfStep;
|
|
4804
|
+
const cy = y + (i % 2 === 0 ? -amplitude : amplitude);
|
|
4805
|
+
const ex = x1 + (i + 1) * halfStep;
|
|
4806
|
+
path += ` Q ${cx} ${cy} ${ex} ${y}`;
|
|
4807
|
+
}
|
|
4808
|
+
return path;
|
|
4809
|
+
};
|
|
4810
|
+
const SleepChart = ({ sleepData, width = 800, height = 400, onDateClick, }) => {
|
|
4611
4811
|
const svgRef = React.useRef(null);
|
|
4612
4812
|
const [tooltipData, setTooltipData] = React.useState(null);
|
|
4613
|
-
const margin = React.useMemo(() => ({ top:
|
|
4813
|
+
const margin = React.useMemo(() => ({ top: 12, right: 16, bottom: 32, left: 64 }), []);
|
|
4614
4814
|
const chartWidth = width - margin.left - margin.right;
|
|
4615
4815
|
const chartHeight = height - margin.top - margin.bottom;
|
|
4616
|
-
// Hide tooltip on scroll
|
|
4617
4816
|
React.useEffect(() => {
|
|
4618
|
-
const handleScroll = () =>
|
|
4619
|
-
setTooltipData(null);
|
|
4620
|
-
};
|
|
4817
|
+
const handleScroll = () => setTooltipData(null);
|
|
4621
4818
|
window.addEventListener('scroll', handleScroll, true);
|
|
4622
|
-
return () =>
|
|
4623
|
-
window.removeEventListener('scroll', handleScroll, true);
|
|
4624
|
-
};
|
|
4819
|
+
return () => window.removeEventListener('scroll', handleScroll, true);
|
|
4625
4820
|
}, []);
|
|
4626
4821
|
React.useEffect(() => {
|
|
4627
4822
|
if (!svgRef.current || sleepData.length === 0)
|
|
4628
4823
|
return;
|
|
4629
4824
|
const svg = d3__namespace.select(svgRef.current);
|
|
4630
4825
|
svg.selectAll('*').remove();
|
|
4631
|
-
// Add invisible rect to detect mouse leave events
|
|
4632
4826
|
svg.append('rect')
|
|
4633
4827
|
.attr('width', width)
|
|
4634
4828
|
.attr('height', height)
|
|
4635
4829
|
.attr('fill', 'transparent')
|
|
4636
4830
|
.style('pointer-events', 'all')
|
|
4637
|
-
.on('mouseleave', () =>
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
const g = svg.append('g')
|
|
4831
|
+
.on('mouseleave', () => setTooltipData(null));
|
|
4832
|
+
const g = svg
|
|
4833
|
+
.append('g')
|
|
4641
4834
|
.attr('transform', `translate(${margin.left},${margin.top})`);
|
|
4642
|
-
const xScale = d3__namespace.scaleLinear()
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
const yScale = d3__namespace.scaleBand()
|
|
4835
|
+
const xScale = d3__namespace.scaleLinear().domain([18, 42]).range([0, chartWidth]);
|
|
4836
|
+
const yDomain = sleepData.map((d) => d.date);
|
|
4837
|
+
const yScale = d3__namespace
|
|
4838
|
+
.scaleBand()
|
|
4647
4839
|
.domain(yDomain)
|
|
4648
4840
|
.range([0, chartHeight])
|
|
4649
|
-
.paddingInner(0.
|
|
4841
|
+
.paddingInner(0.35)
|
|
4650
4842
|
.paddingOuter(0.1);
|
|
4651
|
-
//
|
|
4843
|
+
// Dotted vertical gridlines; midnight/noon are slightly more present.
|
|
4652
4844
|
g.selectAll('.grid-line-x')
|
|
4653
|
-
.data(d3__namespace.range(18, 43,
|
|
4654
|
-
.enter()
|
|
4845
|
+
.data(d3__namespace.range(18, 43, 3))
|
|
4846
|
+
.enter()
|
|
4847
|
+
.append('line')
|
|
4655
4848
|
.attr('class', styles$6.gridLine)
|
|
4656
|
-
.attr('x1', d => xScale(d))
|
|
4849
|
+
.attr('x1', (d) => xScale(d))
|
|
4657
4850
|
.attr('y1', 0)
|
|
4658
|
-
.attr('x2', d => xScale(d))
|
|
4851
|
+
.attr('x2', (d) => xScale(d))
|
|
4659
4852
|
.attr('y2', chartHeight)
|
|
4660
|
-
.
|
|
4661
|
-
const hour = d % 24;
|
|
4662
|
-
if (hour === 0)
|
|
4663
|
-
return 'var(--color-border)'; // Midnight
|
|
4664
|
-
if (hour === 12)
|
|
4665
|
-
return 'var(--color-border)'; // Noon
|
|
4666
|
-
return 'var(--color-border)';
|
|
4667
|
-
})
|
|
4668
|
-
.style('stroke-opacity', d => {
|
|
4853
|
+
.classed(styles$6.gridLineAccent, (d) => {
|
|
4669
4854
|
const hour = d % 24;
|
|
4670
|
-
|
|
4671
|
-
return 0.3;
|
|
4672
|
-
if (hour % 3 === 0)
|
|
4673
|
-
return 0.15;
|
|
4674
|
-
return 0.05;
|
|
4675
|
-
})
|
|
4676
|
-
.style('stroke-width', d => {
|
|
4677
|
-
const hour = d % 24;
|
|
4678
|
-
if (hour === 0 || hour === 12)
|
|
4679
|
-
return 2;
|
|
4680
|
-
return 1;
|
|
4855
|
+
return hour === 0 || hour === 12;
|
|
4681
4856
|
});
|
|
4682
4857
|
sleepData.forEach((dayData) => {
|
|
4683
4858
|
const yValue = yScale(dayData.date);
|
|
4684
4859
|
if (yValue === undefined)
|
|
4685
4860
|
return;
|
|
4686
4861
|
const barHeight = yScale.bandwidth();
|
|
4687
|
-
const sleepGroup = g
|
|
4862
|
+
const sleepGroup = g
|
|
4863
|
+
.append('g')
|
|
4688
4864
|
.attr('class', styles$6.sleepBar)
|
|
4689
|
-
.style('cursor', 'pointer')
|
|
4865
|
+
.style('cursor', onDateClick ? 'pointer' : 'default')
|
|
4690
4866
|
.on('click', () => onDateClick?.(dayData.date));
|
|
4691
|
-
// Handle sleep time and wake hour separately
|
|
4692
4867
|
let sleepHour = null;
|
|
4693
4868
|
let wakeHour = null;
|
|
4694
4869
|
if (dayData.sleep_time) {
|
|
4695
4870
|
sleepHour = parseTimeToDecimal(dayData.sleep_time);
|
|
4696
|
-
|
|
4697
|
-
if (sleepHour < 18) {
|
|
4871
|
+
if (sleepHour < 18)
|
|
4698
4872
|
sleepHour += 24;
|
|
4699
|
-
}
|
|
4700
4873
|
}
|
|
4701
4874
|
if (dayData.wake_hour) {
|
|
4702
4875
|
wakeHour = parseTimeToDecimal(dayData.wake_hour);
|
|
4703
|
-
// If we have sleep time, wake time should be after sleep time
|
|
4704
4876
|
if (sleepHour !== null) {
|
|
4705
|
-
// If wake hour is before sleep hour or very early, it's next day
|
|
4706
4877
|
if (wakeHour < sleepHour || (sleepHour >= 18 && wakeHour < 18)) {
|
|
4707
4878
|
wakeHour += 24;
|
|
4708
4879
|
}
|
|
4709
4880
|
}
|
|
4710
|
-
else {
|
|
4711
|
-
|
|
4712
|
-
if (wakeHour < 12) {
|
|
4713
|
-
wakeHour += 24;
|
|
4714
|
-
}
|
|
4881
|
+
else if (wakeHour < 12) {
|
|
4882
|
+
wakeHour += 24;
|
|
4715
4883
|
}
|
|
4716
4884
|
}
|
|
4717
|
-
// Draw the bar only if both values exist
|
|
4718
4885
|
if (sleepHour !== null && wakeHour !== null) {
|
|
4719
|
-
const
|
|
4720
|
-
|
|
4721
|
-
|
|
4722
|
-
|
|
4723
|
-
|
|
4724
|
-
|
|
4725
|
-
|
|
4726
|
-
.
|
|
4727
|
-
.attr('
|
|
4728
|
-
.attr('
|
|
4729
|
-
.
|
|
4730
|
-
|
|
4731
|
-
|
|
4732
|
-
.
|
|
4733
|
-
|
|
4886
|
+
const x1 = xScale(sleepHour);
|
|
4887
|
+
const x2 = xScale(wakeHour);
|
|
4888
|
+
const y = yValue + barHeight / 2;
|
|
4889
|
+
const amplitude = Math.min(barHeight / 2.2, 7);
|
|
4890
|
+
const wavelength = 14;
|
|
4891
|
+
const d = buildSquigglePath(x1, x2, y, amplitude, wavelength);
|
|
4892
|
+
const path = sleepGroup
|
|
4893
|
+
.append('path')
|
|
4894
|
+
.attr('class', styles$6.squiggle)
|
|
4895
|
+
.attr('d', d)
|
|
4896
|
+
.attr('fill', 'none');
|
|
4897
|
+
const node = path.node();
|
|
4898
|
+
const length = typeof node.getTotalLength === 'function'
|
|
4899
|
+
? node.getTotalLength()
|
|
4900
|
+
: (x2 - x1) * 1.8;
|
|
4901
|
+
path.attr('stroke-dasharray', length)
|
|
4902
|
+
.attr('stroke-dashoffset', length)
|
|
4903
|
+
.transition()
|
|
4904
|
+
.duration(540)
|
|
4734
4905
|
.ease(d3__namespace.easeCubicOut)
|
|
4735
|
-
.attr('
|
|
4736
|
-
.attr('opacity', 0.85);
|
|
4906
|
+
.attr('stroke-dashoffset', 0);
|
|
4737
4907
|
}
|
|
4738
|
-
// Draw sleep dot if sleep time exists
|
|
4739
4908
|
if (sleepHour !== null) {
|
|
4740
|
-
|
|
4909
|
+
sleepGroup
|
|
4910
|
+
.append('circle')
|
|
4911
|
+
.attr('class', `${styles$6.endpoint} ${styles$6.endpointSleep}`)
|
|
4741
4912
|
.attr('cx', xScale(sleepHour))
|
|
4742
4913
|
.attr('cy', yValue + barHeight / 2)
|
|
4743
|
-
.attr('r', 0)
|
|
4744
|
-
.
|
|
4745
|
-
.
|
|
4746
|
-
.
|
|
4747
|
-
.
|
|
4748
|
-
.
|
|
4749
|
-
// Animate the dot
|
|
4750
|
-
sleepDot.transition()
|
|
4751
|
-
.duration(400)
|
|
4752
|
-
.delay(300 + Math.random() * 100)
|
|
4753
|
-
.ease(d3__namespace.easeBackOut)
|
|
4754
|
-
.attr('r', 6);
|
|
4914
|
+
.attr('r', 0)
|
|
4915
|
+
.transition()
|
|
4916
|
+
.duration(280)
|
|
4917
|
+
.delay(160)
|
|
4918
|
+
.ease(d3__namespace.easeCubicOut)
|
|
4919
|
+
.attr('r', 3.5);
|
|
4755
4920
|
}
|
|
4756
|
-
// Draw wake dot if wake hour exists
|
|
4757
4921
|
if (wakeHour !== null) {
|
|
4758
|
-
|
|
4922
|
+
sleepGroup
|
|
4923
|
+
.append('circle')
|
|
4924
|
+
.attr('class', `${styles$6.endpoint} ${styles$6.endpointWake}`)
|
|
4759
4925
|
.attr('cx', xScale(wakeHour))
|
|
4760
4926
|
.attr('cy', yValue + barHeight / 2)
|
|
4761
|
-
.attr('r', 0)
|
|
4762
|
-
.
|
|
4763
|
-
.
|
|
4764
|
-
.
|
|
4765
|
-
.
|
|
4766
|
-
.
|
|
4767
|
-
// Animate the dot
|
|
4768
|
-
wakeDot.transition()
|
|
4769
|
-
.duration(400)
|
|
4770
|
-
.delay(500 + Math.random() * 100)
|
|
4771
|
-
.ease(d3__namespace.easeBackOut)
|
|
4772
|
-
.attr('r', 6);
|
|
4927
|
+
.attr('r', 0)
|
|
4928
|
+
.transition()
|
|
4929
|
+
.duration(280)
|
|
4930
|
+
.delay(220)
|
|
4931
|
+
.ease(d3__namespace.easeCubicOut)
|
|
4932
|
+
.attr('r', 3.5);
|
|
4773
4933
|
}
|
|
4774
|
-
// Add hover interactions with tooltip
|
|
4775
4934
|
sleepGroup
|
|
4776
4935
|
.on('mouseenter', function (event) {
|
|
4777
|
-
|
|
4778
|
-
|
|
4779
|
-
|
|
4780
|
-
.
|
|
4781
|
-
|
|
4782
|
-
|
|
4783
|
-
|
|
4784
|
-
|
|
4785
|
-
.
|
|
4786
|
-
|
|
4787
|
-
.attr('r', 8);
|
|
4788
|
-
// Calculate tooltip data
|
|
4789
|
-
const rect = svgRef.current?.getBoundingClientRect();
|
|
4790
|
-
if (rect) {
|
|
4791
|
-
const duration = (sleepHour !== null && wakeHour !== null)
|
|
4792
|
-
? wakeHour - sleepHour
|
|
4793
|
-
: null;
|
|
4794
|
-
setTooltipData({
|
|
4795
|
-
date: dayData.date,
|
|
4796
|
-
sleepTime: sleepHour !== null ? formatTime(sleepHour) : null,
|
|
4797
|
-
wakeTime: wakeHour !== null ? formatTime(wakeHour) : null,
|
|
4798
|
-
duration: duration !== null ? Math.round(duration * 100) / 100 : null,
|
|
4799
|
-
x: event.pageX,
|
|
4800
|
-
y: event.pageY - 80
|
|
4801
|
-
});
|
|
4802
|
-
}
|
|
4936
|
+
d3__namespace.select(this).classed(styles$6.sleepBarHover, true);
|
|
4937
|
+
const duration = sleepHour !== null && wakeHour !== null ? wakeHour - sleepHour : null;
|
|
4938
|
+
setTooltipData({
|
|
4939
|
+
date: dayData.date,
|
|
4940
|
+
sleepTime: sleepHour !== null ? formatTime(sleepHour) : null,
|
|
4941
|
+
wakeTime: wakeHour !== null ? formatTime(wakeHour) : null,
|
|
4942
|
+
duration: duration !== null ? Math.round(duration * 100) / 100 : null,
|
|
4943
|
+
x: event.pageX,
|
|
4944
|
+
y: event.pageY - 12,
|
|
4945
|
+
});
|
|
4803
4946
|
})
|
|
4804
4947
|
.on('mouseleave', function () {
|
|
4805
|
-
|
|
4806
|
-
d3__namespace.select(this).select('rect')
|
|
4807
|
-
.transition()
|
|
4808
|
-
.duration(200)
|
|
4809
|
-
.attr('opacity', 0.85)
|
|
4810
|
-
.style('filter', 'drop-shadow(0 2px 8px rgba(155, 89, 182, 0.3))');
|
|
4811
|
-
// Reset dots
|
|
4812
|
-
d3__namespace.select(this).selectAll('circle')
|
|
4813
|
-
.transition()
|
|
4814
|
-
.duration(200)
|
|
4815
|
-
.attr('r', 6);
|
|
4816
|
-
// Hide tooltip
|
|
4948
|
+
d3__namespace.select(this).classed(styles$6.sleepBarHover, false);
|
|
4817
4949
|
setTooltipData(null);
|
|
4818
4950
|
})
|
|
4819
4951
|
.on('mousemove', function (event) {
|
|
4820
|
-
|
|
4821
|
-
setTooltipData(prev => prev ? {
|
|
4822
|
-
...prev,
|
|
4823
|
-
x: event.pageX,
|
|
4824
|
-
y: event.pageY - 80
|
|
4825
|
-
} : null);
|
|
4952
|
+
setTooltipData((prev) => prev ? { ...prev, x: event.pageX, y: event.pageY - 12 } : null);
|
|
4826
4953
|
});
|
|
4827
4954
|
});
|
|
4828
|
-
|
|
4829
|
-
const defs = svg.append('defs');
|
|
4830
|
-
const gradient = defs.append('linearGradient')
|
|
4831
|
-
.attr('id', 'sleepGradient')
|
|
4832
|
-
.attr('x1', '0%')
|
|
4833
|
-
.attr('x2', '100%');
|
|
4834
|
-
gradient.append('stop')
|
|
4835
|
-
.attr('offset', '0%')
|
|
4836
|
-
.attr('stop-color', '#9B59B6')
|
|
4837
|
-
.attr('stop-opacity', 1);
|
|
4838
|
-
gradient.append('stop')
|
|
4839
|
-
.attr('offset', '50%')
|
|
4840
|
-
.attr('stop-color', '#7B68A6')
|
|
4841
|
-
.attr('stop-opacity', 1);
|
|
4842
|
-
gradient.append('stop')
|
|
4843
|
-
.attr('offset', '100%')
|
|
4844
|
-
.attr('stop-color', '#3498DB')
|
|
4845
|
-
.attr('stop-opacity', 1);
|
|
4846
|
-
const xAxisTicks = d3__namespace.range(18, 43, 3).map(hour => ({
|
|
4955
|
+
const xAxisTicks = d3__namespace.range(18, 43, 3).map((hour) => ({
|
|
4847
4956
|
value: hour,
|
|
4848
|
-
label: hour
|
|
4849
|
-
(hour % 24) === 0 ? '12 AM' :
|
|
4850
|
-
(hour % 24) < 12 ? `${hour % 24} AM` :
|
|
4851
|
-
(hour % 24) === 12 ? '12 PM' : `${(hour % 24) - 12} PM`
|
|
4957
|
+
label: `${(hour % 24).toString().padStart(2, '0')}:00`,
|
|
4852
4958
|
}));
|
|
4853
|
-
const xAxis = g
|
|
4959
|
+
const xAxis = g
|
|
4960
|
+
.append('g')
|
|
4854
4961
|
.attr('class', styles$6.xAxis)
|
|
4855
4962
|
.attr('transform', `translate(0,${chartHeight})`)
|
|
4856
|
-
.call(d3__namespace
|
|
4857
|
-
.
|
|
4963
|
+
.call(d3__namespace
|
|
4964
|
+
.axisBottom(xScale)
|
|
4965
|
+
.tickValues(xAxisTicks.map((t) => t.value))
|
|
4858
4966
|
.tickFormat((d) => {
|
|
4859
|
-
const tick = xAxisTicks.find(t => t.value === d);
|
|
4967
|
+
const tick = xAxisTicks.find((t) => t.value === d);
|
|
4860
4968
|
return tick ? tick.label : '';
|
|
4861
4969
|
})
|
|
4862
|
-
.
|
|
4863
|
-
|
|
4864
|
-
xAxis.
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
const yAxisTicks = yDomain.filter((_, i) => i % Math.ceil(yDomain.length / 10) === 0);
|
|
4870
|
-
g.append('g')
|
|
4970
|
+
.tickSize(0)
|
|
4971
|
+
.tickPadding(10));
|
|
4972
|
+
xAxis.select('.domain').remove();
|
|
4973
|
+
const tickEvery = Math.max(1, Math.ceil(yDomain.length / 8));
|
|
4974
|
+
const yAxisTicks = yDomain.filter((_, i) => i % tickEvery === 0);
|
|
4975
|
+
const yAxis = g
|
|
4976
|
+
.append('g')
|
|
4871
4977
|
.attr('class', styles$6.yAxis)
|
|
4872
|
-
.call(d3__namespace
|
|
4978
|
+
.call(d3__namespace
|
|
4979
|
+
.axisLeft(yScale)
|
|
4873
4980
|
.tickValues(yAxisTicks)
|
|
4874
|
-
.tickFormat(d => {
|
|
4981
|
+
.tickFormat((d) => {
|
|
4875
4982
|
const date = new Date(d);
|
|
4876
|
-
return `${(date.getMonth() + 1)
|
|
4877
|
-
|
|
4983
|
+
return `${(date.getMonth() + 1)
|
|
4984
|
+
.toString()
|
|
4985
|
+
.padStart(2, '0')}/${date.getDate().toString().padStart(2, '0')}`;
|
|
4986
|
+
})
|
|
4987
|
+
.tickSize(0)
|
|
4988
|
+
.tickPadding(12));
|
|
4989
|
+
yAxis.select('.domain').remove();
|
|
4878
4990
|
}, [sleepData, chartWidth, chartHeight, margin, onDateClick, height, width]);
|
|
4879
|
-
return (jsxRuntime.jsxs("div", { className: styles$6.container, children: [jsxRuntime.jsxs("
|
|
4880
|
-
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
|
|
4884
|
-
month: 'short',
|
|
4885
|
-
day: 'numeric'
|
|
4886
|
-
}) })] }), jsxRuntime.jsxs("div", { className: styles$6.tooltipInfo, children: [tooltipData.sleepTime && (jsxRuntime.jsxs("div", { className: styles$6.tooltipRow, children: [jsxRuntime.jsxs("span", { className: styles$6.tooltipLabel, children: [jsxRuntime.jsx("span", { children: "\uD83C\uDF19" }), jsxRuntime.jsx("span", { children: "Sleep:" })] }), jsxRuntime.jsx("span", { className: styles$6.tooltipValue, children: tooltipData.sleepTime })] })), tooltipData.wakeTime && (jsxRuntime.jsxs("div", { className: styles$6.tooltipRow, children: [jsxRuntime.jsxs("span", { className: styles$6.tooltipLabel, children: [jsxRuntime.jsx("span", { children: "\u2600\uFE0F" }), jsxRuntime.jsx("span", { children: "Wake:" })] }), jsxRuntime.jsx("span", { className: styles$6.tooltipValue, children: tooltipData.wakeTime })] })), tooltipData.duration !== null && (jsxRuntime.jsxs("div", { className: styles$6.tooltipDuration, children: [jsxRuntime.jsx("span", { children: "\u23F1\uFE0F" }), jsxRuntime.jsxs("span", { children: [Math.floor(tooltipData.duration), "h ", Math.round((tooltipData.duration % 1) * 60), "m"] })] }))] })] }))] }));
|
|
4991
|
+
return (jsxRuntime.jsxs("div", { className: styles$6.container, children: [jsxRuntime.jsxs("header", { className: styles$6.header, children: [jsxRuntime.jsx("span", { className: styles$6.eyebrow, children: "the night" }), jsxRuntime.jsxs("h3", { className: styles$6.title, children: [jsxRuntime.jsx("em", { children: "Sleep" }), " pattern"] })] }), jsxRuntime.jsx("svg", { ref: svgRef, width: width, height: height, className: styles$6.chart }), tooltipData && (jsxRuntime.jsxs("div", { className: `${styles$6.tooltip} ${styles$6.visible}`, style: { left: `${tooltipData.x}px`, top: `${tooltipData.y}px` }, children: [jsxRuntime.jsx("div", { className: styles$6.tooltipDate, children: new Date(tooltipData.date).toLocaleDateString('en-US', {
|
|
4992
|
+
weekday: 'short',
|
|
4993
|
+
month: 'short',
|
|
4994
|
+
day: 'numeric',
|
|
4995
|
+
}) }), jsxRuntime.jsxs("div", { className: styles$6.tooltipBody, children: [tooltipData.sleepTime && (jsxRuntime.jsxs("div", { className: styles$6.tooltipRow, children: [jsxRuntime.jsx("em", { children: "sleep" }), jsxRuntime.jsx("time", { children: tooltipData.sleepTime })] })), tooltipData.wakeTime && (jsxRuntime.jsxs("div", { className: styles$6.tooltipRow, children: [jsxRuntime.jsx("em", { children: "wake" }), jsxRuntime.jsx("time", { children: tooltipData.wakeTime })] })), tooltipData.duration !== null && (jsxRuntime.jsxs("div", { className: `${styles$6.tooltipRow} ${styles$6.tooltipTotal}`, children: [jsxRuntime.jsx("em", { children: "total" }), jsxRuntime.jsx("time", { children: formatDuration(tooltipData.duration) })] }))] })] }))] }));
|
|
4887
4996
|
};
|
|
4888
4997
|
|
|
4889
4998
|
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"};
|
|
@@ -5164,7 +5273,7 @@ const SunburstChart = ({ data, width = 500, height = 500, title = 'Sunburst Char
|
|
|
5164
5273
|
}
|
|
5165
5274
|
// Calculate new positions based on the original positions
|
|
5166
5275
|
// ALWAYS scale to fill the full circle, no minimum size preservation
|
|
5167
|
-
|
|
5276
|
+
const newX0 = xScale(node.x0Original);
|
|
5168
5277
|
let newX1 = xScale(node.x1Original);
|
|
5169
5278
|
// Ensure proper scaling even for very small segments
|
|
5170
5279
|
// The clicked node's extent should always map to full circle
|
|
@@ -5265,7 +5374,7 @@ const SunburstChart = ({ data, width = 500, height = 500, title = 'Sunburst Char
|
|
|
5265
5374
|
if (focusedNodeRef.current) {
|
|
5266
5375
|
return;
|
|
5267
5376
|
}
|
|
5268
|
-
const hoveredElement =
|
|
5377
|
+
const hoveredElement = event.currentTarget;
|
|
5269
5378
|
// Show tooltip for all nodes
|
|
5270
5379
|
tooltip.transition().duration(200).style('opacity', 1);
|
|
5271
5380
|
const value = d.value || 0;
|
|
@@ -6242,6 +6351,7 @@ exports.Navbar = Navbar;
|
|
|
6242
6351
|
exports.NumberStepper = NumberStepper;
|
|
6243
6352
|
exports.PieChart = PieChart;
|
|
6244
6353
|
exports.QuantifiableHabitsChart = QuantifiableHabitsChart;
|
|
6354
|
+
exports.RecurrencePicker = RecurrencePicker;
|
|
6245
6355
|
exports.SearchBar = SearchBar;
|
|
6246
6356
|
exports.SearchableDropdown = SearchableDropdown;
|
|
6247
6357
|
exports.SelectInput = SelectInput;
|