xertica-ui 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +1 -1
- package/assets/xertica-logo.svg +37 -37
- package/assets/xertica-x-logo.svg +20 -20
- package/bin/cli.ts +1 -1
- package/bin/generate-tokens.ts +13 -7
- package/components/assistant/index.ts +6 -6
- package/components/assistant/xertica-assistant/index.ts +2 -0
- package/components/assistant/xertica-assistant/use-assistant.ts +564 -0
- package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +200 -0
- package/components/assistant/xertica-assistant/xertica-assistant.tsx +183 -474
- package/components/blocks/card-patterns/ActivityCard.tsx +72 -72
- package/components/blocks/card-patterns/FeatureCard.tsx +100 -100
- package/components/blocks/card-patterns/NotificationCard.tsx +127 -127
- package/components/blocks/card-patterns/ProfileCard.tsx +84 -84
- package/components/blocks/card-patterns/ProjectCard.tsx +89 -89
- package/components/blocks/card-patterns/QuickActionCard.tsx +62 -62
- package/components/blocks/card-patterns/card-patterns.stories.tsx +445 -445
- package/components/blocks/card-patterns/index.ts +17 -17
- package/components/blocks/index.ts +1 -1
- package/components/brand/index.ts +6 -6
- package/components/brand/xertica-provider/XerticaProvider.tsx +48 -48
- package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
- package/components/brand/xertica-provider/xertica-provider.test.tsx +52 -52
- package/components/examples/MapExamples.tsx +282 -282
- package/components/examples/SimpleFilterableMap.tsx +191 -191
- package/components/examples/index.ts +51 -51
- package/components/figma/ImageWithFallback.tsx +27 -27
- package/components/hooks/index.ts +7 -7
- package/components/index.ts +5 -5
- package/components/layout/header/header.test.tsx +8 -8
- package/components/layout/header/header.tsx +4 -4
- package/components/layout/index.ts +2 -2
- package/components/layout/sidebar/index.ts +2 -0
- package/components/layout/sidebar/sidebar.mdx +1 -1
- package/components/layout/sidebar/sidebar.stories.tsx +160 -8
- package/components/layout/sidebar/sidebar.test.tsx +11 -11
- package/components/layout/sidebar/sidebar.tsx +610 -471
- package/components/layout/sidebar/use-sidebar.ts +113 -0
- package/components/media/FloatingMediaWrapper.tsx +11 -11
- package/components/media/audio-player/AudioPlayer.tsx +22 -22
- package/components/media/index.ts +3 -3
- package/components/pages/home-content/HomeContent.tsx +7 -7
- package/components/pages/home-content/home-content.mdx +62 -62
- package/components/pages/home-page/HomePage.stories.tsx +39 -39
- package/components/pages/home-page/HomePage.tsx +1 -1
- package/components/pages/home-page/home-page.mdx +53 -53
- package/components/pages/index.ts +8 -8
- package/components/pages/template-content/TemplateContent.tsx +5 -5
- package/components/pages/template-content/template-content.mdx +61 -61
- package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
- package/components/pages/template-page/TemplatePage.tsx +5 -5
- package/components/pages/template-page/template-page.mdx +53 -53
- package/components/public-api-smoke.test.tsx +52 -52
- package/components/shared/assistant-utils.ts +43 -43
- package/components/shared/layout-constants.ts +1 -1
- package/components/ui/accordion/accordion.mdx +8 -8
- package/components/ui/accordion/accordion.stories.tsx +53 -53
- package/components/ui/alert/alert.mdx +8 -8
- package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
- package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
- package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
- package/components/ui/avatar/avatar.mdx +8 -8
- package/components/ui/badge/badge.mdx +8 -8
- package/components/ui/badge/badge.tsx +9 -9
- package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
- package/components/ui/button/button.mdx +8 -8
- package/components/ui/calendar/calendar.mdx +8 -8
- package/components/ui/calendar/calendar.tsx +258 -258
- package/components/ui/card/card.mdx +8 -8
- package/components/ui/card/card.stories.tsx +245 -245
- package/components/ui/carousel/carousel.mdx +8 -8
- package/components/ui/chart/chart.mdx +8 -8
- package/components/ui/chart/chart.stories.tsx +1303 -344
- package/components/ui/chart/chart.test.tsx +154 -154
- package/components/ui/chart/chart.tsx +2367 -1494
- package/components/ui/checkbox/checkbox.mdx +8 -8
- package/components/ui/checkbox/checkbox.stories.tsx +20 -20
- package/components/ui/collapsible/collapsible.mdx +8 -8
- package/components/ui/command/command.mdx +8 -8
- package/components/ui/context-menu/context-menu.mdx +8 -8
- package/components/ui/dialog/dialog.mdx +8 -8
- package/components/ui/drawer/drawer.mdx +8 -8
- package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
- package/components/ui/empty/empty.mdx +8 -8
- package/components/ui/file-upload/file-upload.mdx +8 -8
- package/components/ui/file-upload/file-upload.stories.tsx +100 -0
- package/components/ui/file-upload/file-upload.tsx +14 -74
- package/components/ui/file-upload/index.ts +1 -0
- package/components/ui/file-upload/use-file-upload.ts +181 -0
- package/components/ui/google-maps-loader/google-maps-loader.tsx +2 -2
- package/components/ui/hover-card/hover-card.mdx +8 -8
- package/components/ui/input/input.mdx +8 -8
- package/components/ui/input-otp/input-otp.mdx +8 -8
- package/components/ui/input-otp/input-otp.stories.tsx +6 -6
- package/components/ui/label/label.mdx +8 -8
- package/components/ui/map/map.mdx +8 -8
- package/components/ui/map/map.stories.tsx +51 -51
- package/components/ui/map/map.tsx +2 -2
- package/components/ui/menubar/menubar.mdx +8 -8
- package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
- package/components/ui/notification-badge/notification-badge.mdx +8 -8
- package/components/ui/pagination/index.ts +2 -0
- package/components/ui/pagination/pagination.mdx +8 -8
- package/components/ui/pagination/pagination.stories.tsx +94 -0
- package/components/ui/pagination/use-pagination.ts +194 -0
- package/components/ui/popover/popover.mdx +8 -8
- package/components/ui/progress/progress.mdx +8 -8
- package/components/ui/progress/progress.tsx +68 -68
- package/components/ui/radio-group/radio-group.mdx +8 -8
- package/components/ui/rating/rating.mdx +8 -8
- package/components/ui/resizable/resizable.mdx +8 -8
- package/components/ui/rich-text-editor/index.ts +2 -0
- package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +129 -1
- package/components/ui/rich-text-editor/rich-text-editor.tsx +86 -305
- package/components/ui/rich-text-editor/use-rich-text-editor.ts +439 -0
- package/components/ui/route-map/route-map.mdx +8 -8
- package/components/ui/route-map/route-map.stories.tsx +54 -54
- package/components/ui/route-map/route-map.tsx +2 -2
- package/components/ui/scroll-area/scroll-area.mdx +8 -8
- package/components/ui/search/search.mdx +8 -8
- package/components/ui/select/select.mdx +8 -8
- package/components/ui/select/select.stories.tsx +9 -9
- package/components/ui/separator/separator.mdx +8 -8
- package/components/ui/sheet/sheet.mdx +8 -8
- package/components/ui/sheet/sheet.stories.tsx +95 -95
- package/components/ui/simple-map/simple-map.mdx +8 -8
- package/components/ui/simple-map/simple-map.stories.tsx +48 -48
- package/components/ui/skeleton/skeleton.mdx +8 -8
- package/components/ui/slider/slider.mdx +8 -8
- package/components/ui/sonner/sonner.mdx +8 -8
- package/components/ui/stats-card/stats-card.mdx +8 -8
- package/components/ui/stepper/index.ts +3 -1
- package/components/ui/stepper/stepper.mdx +8 -8
- package/components/ui/stepper/stepper.stories.tsx +116 -0
- package/components/ui/stepper/stepper.tsx +4 -4
- package/components/ui/stepper/use-stepper.ts +137 -0
- package/components/ui/switch/switch.mdx +8 -8
- package/components/ui/switch/switch.stories.tsx +20 -20
- package/components/ui/table/table.mdx +8 -8
- package/components/ui/tabs/tabs.mdx +8 -8
- package/components/ui/tabs/tabs.stories.tsx +26 -26
- package/components/ui/textarea/textarea.mdx +8 -8
- package/components/ui/timeline/timeline.mdx +8 -8
- package/components/ui/toggle/toggle.mdx +8 -8
- package/components/ui/toggle-group/toggle-group.mdx +8 -8
- package/components/ui/tooltip/tooltip.mdx +8 -8
- package/components/ui/tree-view/index.ts +4 -1
- package/components/ui/tree-view/tree-view.mdx +8 -8
- package/components/ui/tree-view/tree-view.stories.tsx +110 -4
- package/components/ui/tree-view/tree-view.tsx +17 -125
- package/components/ui/tree-view/use-tree-view.ts +229 -0
- package/components.json +1512 -1512
- package/contexts/ApiKeyContext.tsx +72 -72
- package/contexts/BrandColorsContext.tsx +26 -26
- package/contexts/LanguageContext.tsx +13 -13
- package/contexts/LayoutContext.test.tsx +11 -11
- package/contexts/LayoutContext.tsx +29 -29
- package/contexts/ThemeContext.tsx +26 -26
- package/contexts/theme-data.ts +4 -4
- package/dist/{AssistantChart-CVzmmhx4.js → AssistantChart-C_hwFRRr.js} +4 -4
- package/dist/{AssistantChart-BAx9VQvb.cjs → AssistantChart-CldVCVDe.cjs} +311 -94
- package/dist/{AssistantChart-CVko2A1W.js → AssistantChart-Cu3m7RBo.js} +314 -97
- package/dist/{AssistantChart-9w31gdAb.cjs → AssistantChart-DoZCyS5r.cjs} +4 -4
- package/dist/AudioPlayer-B1lt5cPl.cjs +989 -0
- package/dist/AudioPlayer-BZ7bibzU.cjs +982 -0
- package/dist/AudioPlayer-C12BjQBV.cjs +997 -0
- package/dist/AudioPlayer-DMcG_c7L.js +990 -0
- package/dist/AudioPlayer-DcFKRJE_.js +998 -0
- package/dist/AudioPlayer-e8LfNoqO.js +983 -0
- package/dist/{xertica-assistant-Qp3ydksa.cjs → CodeBlock-7TTgmdGG.cjs} +263 -51
- package/dist/{xertica-assistant-gnCJdcZY.js → CodeBlock-BeSt1h5P.js} +219 -7
- package/dist/CodeBlock-BgfYL_rD.cjs +2094 -0
- package/dist/CodeBlock-BlcqlA9M.cjs +2094 -0
- package/dist/CodeBlock-Bnmeu5ez.cjs +2094 -0
- package/dist/CodeBlock-BtfPlbAI.js +2078 -0
- package/dist/CodeBlock-CIySIuYr.js +2078 -0
- package/dist/CodeBlock-CuPtUM-7.cjs +2094 -0
- package/dist/CodeBlock-D6ffWXgc.js +2078 -0
- package/dist/CodeBlock-D8dcwbit.cjs +2094 -0
- package/dist/CodeBlock-DMZrFnlw.cjs +2094 -0
- package/dist/CodeBlock-DlBehYN8.js +2078 -0
- package/dist/CodeBlock-DnYNI8rQ.js +2078 -0
- package/dist/CodeBlock-DvKWbSnE.cjs +2094 -0
- package/dist/CodeBlock-DwMCfkFY.js +2078 -0
- package/dist/CodeBlock-Dy6CNYyj.js +2078 -0
- package/dist/CodeBlock-U1pPOQI7.cjs +2094 -0
- package/dist/CodeBlock-f_GpNhEB.js +2078 -0
- package/dist/CodeBlock-oB6u8nI1.js +2078 -0
- package/dist/CodeBlock-tZC31B73.cjs +2094 -0
- package/dist/ImageWithFallback-CGtidP6B.cjs +4542 -0
- package/dist/ImageWithFallback-lsg3pdFg.js +4508 -0
- package/dist/LanguageSelector-B5YfbHra.js +231 -0
- package/dist/LanguageSelector-D6uacAIM.cjs +230 -0
- package/dist/LayoutContext-BAql6ZRY.js +97 -0
- package/dist/LayoutContext-BvK-ggDa.cjs +96 -0
- package/dist/ThemeContext-BoH4NLfN.js +734 -0
- package/dist/{ThemeContext-BbBNoFTG.js → ThemeContext-C2EwAPDt.js} +2 -2
- package/dist/ThemeContext-r69W20Xg.cjs +733 -0
- package/dist/{ThemeContext-Cmr8Ex8H.cjs → ThemeContext-vTjumZeM.cjs} +2 -2
- package/dist/{VerifyEmailPage-BE-L9mB7.js → VerifyEmailPage-C0c2e5n0.js} +7 -7
- package/dist/{VerifyEmailPage-DMBh4NM9.cjs → VerifyEmailPage-CYXtbKi3.cjs} +1 -1
- package/dist/{VerifyEmailPage-CR7kb5df.cjs → VerifyEmailPage-Cwi3kbol.cjs} +7 -7
- package/dist/{VerifyEmailPage-CdYPSJoO.js → VerifyEmailPage-DvMLZgFt.js} +1 -1
- package/dist/XerticaOrbe-KL1RBHzw.cjs +1354 -0
- package/dist/XerticaOrbe-zwS1p2a8.js +1355 -0
- package/dist/XerticaProvider-6btlAlzc.js +17 -0
- package/dist/XerticaProvider-BNoNOxQ5.cjs +16 -0
- package/dist/XerticaProvider-BlY2limY.cjs +38 -0
- package/dist/{XerticaProvider-BITjgC5p.js → XerticaProvider-CEoWMTxu.js} +2 -2
- package/dist/{XerticaProvider-By8q3Roe.cjs → XerticaProvider-CllrbMEJ.cjs} +2 -2
- package/dist/XerticaProvider-DDuiIcKo.js +39 -0
- package/dist/XerticaProvider-cI9hSs27.cjs +38 -0
- package/dist/XerticaProvider-hSwhNQex.js +39 -0
- package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-DSKByiKZ.cjs} +3 -3
- package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-s-vmNkJ_.js} +3 -3
- package/dist/assistant.cjs.js +2 -1
- package/dist/assistant.es.js +3 -2
- package/dist/brand.cjs.js +1 -1
- package/dist/brand.es.js +1 -1
- package/dist/breadcrumb-CqJ7bHY5.js +161 -0
- package/dist/breadcrumb-m9Hb2_XN.cjs +177 -0
- package/dist/cli.js +14 -8
- package/dist/components/assistant/xertica-assistant/index.d.ts +2 -0
- package/dist/components/assistant/xertica-assistant/use-assistant.d.ts +126 -0
- package/dist/components/assistant/xertica-assistant/xertica-assistant.d.ts +7 -2
- package/dist/components/blocks/audio-player/AudioPlayer.d.ts +35 -0
- package/dist/components/blocks/audio-player/index.d.ts +1 -0
- package/dist/components/blocks/document-editor/DocumentEditor.d.ts +26 -0
- package/dist/components/blocks/document-editor/index.d.ts +1 -0
- package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +41 -0
- package/dist/components/blocks/podcast-player/index.d.ts +1 -0
- package/dist/components/layout/sidebar/index.d.ts +2 -0
- package/dist/components/layout/sidebar/sidebar.d.ts +80 -0
- package/dist/components/layout/sidebar/use-sidebar.d.ts +22 -0
- package/dist/components/shared/layout-constants.d.ts +1 -1
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/chart/chart.d.ts +162 -5
- package/dist/components/ui/file-upload/file-upload.d.ts +2 -0
- package/dist/components/ui/file-upload/index.d.ts +1 -0
- package/dist/components/ui/file-upload/use-file-upload.d.ts +49 -0
- package/dist/components/ui/pagination/index.d.ts +2 -0
- package/dist/components/ui/pagination/use-pagination.d.ts +78 -0
- package/dist/components/ui/rich-text-editor/index.d.ts +2 -0
- package/dist/components/ui/rich-text-editor/use-rich-text-editor.d.ts +107 -0
- package/dist/components/ui/stepper/index.d.ts +3 -1
- package/dist/components/ui/stepper/stepper.d.ts +2 -2
- package/dist/components/ui/stepper/use-stepper.d.ts +60 -0
- package/dist/components/ui/tree-view/index.d.ts +4 -1
- package/dist/components/ui/tree-view/tree-view.d.ts +4 -6
- package/dist/components/ui/tree-view/use-tree-view.d.ts +60 -0
- package/dist/dropdown-menu-BDB5CmQs.cjs +247 -0
- package/dist/dropdown-menu-DQidbKBD.js +231 -0
- package/dist/google-maps-loader-BFWp6VPd.js +287 -0
- package/dist/{google-maps-loader-t2IlYBzw.js → google-maps-loader-CTYySAun.js} +4 -0
- package/dist/{google-maps-loader-BqsYL48U.cjs → google-maps-loader-Y-QkD-Li.cjs} +5 -0
- package/dist/google-maps-loader-eS3uQ5TA.cjs +287 -0
- package/dist/header-Cgy6vYPk.cjs +731 -0
- package/dist/header-DRlT4jgI.js +715 -0
- package/dist/header-Dux00SI4.cjs +731 -0
- package/dist/header-EkGKXPsD.js +715 -0
- package/dist/header-WfEywpyc.cjs +731 -0
- package/dist/header-tifNQn2U.js +715 -0
- package/dist/hooks.cjs.js +1 -1
- package/dist/hooks.es.js +1 -1
- package/dist/index-BhapVLVj.js +8 -0
- package/dist/{index-D3RLKRAs.cjs → index-COtD8bRW.cjs} +1 -1
- package/dist/index-D6fxYEY8.cjs +7 -0
- package/dist/index-DW5tYe26.js +8 -0
- package/dist/index.cjs.js +19 -8
- package/dist/index.es.js +39 -28
- package/dist/index.umd.js +1043 -470
- package/dist/input-2R4loU86.js +127 -0
- package/dist/input-DWANSKGb.cjs +145 -0
- package/dist/layout.cjs.js +89 -1
- package/dist/layout.es.js +90 -2
- package/dist/pages.cjs.js +1 -1
- package/dist/pages.es.js +1 -1
- package/dist/rich-text-editor-0mraWT5y.cjs +2376 -0
- package/dist/rich-text-editor-B6jMRLzk.cjs +1939 -0
- package/dist/rich-text-editor-B8_oYcIR.js +1730 -0
- package/dist/rich-text-editor-B9UbSXNb.js +1203 -0
- package/dist/rich-text-editor-BYuRBNBU.js +2373 -0
- package/dist/rich-text-editor-Bb9pySTs.cjs +2374 -0
- package/dist/rich-text-editor-BcL6L3cm.cjs +2374 -0
- package/dist/rich-text-editor-BoVZYtTs.cjs +2391 -0
- package/dist/rich-text-editor-CPV1lEPH.cjs +1748 -0
- package/dist/rich-text-editor-CoKqbCtu.cjs +1799 -0
- package/dist/rich-text-editor-Cw56T_mB.js +2356 -0
- package/dist/rich-text-editor-Cyt8qs2b.js +1921 -0
- package/dist/rich-text-editor-D6H84OcX.cjs +1220 -0
- package/dist/rich-text-editor-D76gD-QI.js +2328 -0
- package/dist/rich-text-editor-DKkokOnA.js +1781 -0
- package/dist/rich-text-editor-DNsdpN64.cjs +2359 -0
- package/dist/rich-text-editor-DfG8bCyY.js +2358 -0
- package/dist/rich-text-editor-DgF8s7xW.js +2949 -0
- package/dist/rich-text-editor-Dxjw31Z4.js +2341 -0
- package/dist/rich-text-editor-DzP0Epmb.js +2356 -0
- package/dist/rich-text-editor-mWoaSCE4.cjs +2966 -0
- package/dist/rich-text-editor-skplNlBM.cjs +2345 -0
- package/dist/select-Bkbr0f-Z.cjs +162 -0
- package/dist/select-CvIVdX2n.js +145 -0
- package/dist/sidebar-CK_0ZQHj.cjs +803 -0
- package/dist/sidebar-CUuOvYhK.js +787 -0
- package/dist/slider-Bc5Hd0y1.js +56 -0
- package/dist/slider-N7hFFj6X.cjs +73 -0
- package/dist/tooltip-Ded96neP.cjs +137 -0
- package/dist/tooltip-HDOoD2-0.js +120 -0
- package/dist/ui.cjs.js +14 -4
- package/dist/ui.es.js +26 -16
- package/dist/use-mobile-B0hNy_Y6.cjs +4303 -0
- package/dist/use-mobile-BXuYROXM.js +4202 -0
- package/dist/use-mobile-Bbd51ASU.cjs +4392 -0
- package/dist/use-mobile-Bk6CX-TC.js +4359 -0
- package/dist/use-mobile-BvYdisLP.js +4202 -0
- package/dist/use-mobile-BzuxjzNX.cjs +4392 -0
- package/dist/use-mobile-CG2-SdXV.cjs +4235 -0
- package/dist/use-mobile-CKb5pqTs.js +4269 -0
- package/dist/use-mobile-CYuAuGDl.js +4202 -0
- package/dist/use-mobile-CaENcqm-.js +4508 -0
- package/dist/use-mobile-CbrYgJGJ.js +4203 -0
- package/dist/use-mobile-DMOvImGQ.cjs +4542 -0
- package/dist/use-mobile-DRB3BQgD.cjs +4235 -0
- package/dist/use-mobile-DZvv7QMR.js +4359 -0
- package/dist/use-mobile-DdI_TXam.cjs +4235 -0
- package/dist/use-mobile-DlceKf8a.js +4359 -0
- package/dist/use-mobile-DsOnow1o.cjs +4236 -0
- package/dist/use-mobile-Kcj6jSnK.cjs +4392 -0
- package/dist/use-mobile-bnKcua_i.js +4202 -0
- package/dist/use-mobile-ncXBeE2z.cjs +4235 -0
- package/dist/{xertica-assistant-B1IaHXnB.cjs → xertica-assistant-dyP7KHM5.cjs} +533 -392
- package/dist/{xertica-assistant-DPsESB6t.js → xertica-assistant-yX1CFBBo.js} +535 -394
- package/dist/xertica-ui.css +2 -2
- package/docs/ai-usage.md +28 -10
- package/docs/architecture.md +76 -0
- package/docs/components/assistant.md +159 -0
- package/docs/components/calendar.md +154 -154
- package/docs/components/card-patterns.md +337 -337
- package/docs/components/card.md +235 -235
- package/docs/components/chart.md +354 -39
- package/docs/components/file-upload.md +119 -2
- package/docs/components/map.md +84 -84
- package/docs/components/pagination.md +187 -0
- package/docs/components/rich-text-editor.md +164 -0
- package/docs/components/sidebar.md +153 -4
- package/docs/components/stepper.md +157 -12
- package/docs/components/tree-view.md +164 -6
- package/docs/components/xertica-provider.md +24 -24
- package/docs/decision-tree.md +287 -287
- package/docs/getting-started.md +1 -1
- package/docs/guidelines.md +14 -8
- package/docs/layout.md +2 -2
- package/docs/llms.md +4 -4
- package/guidelines/Guidelines.md +252 -250
- package/hooks/useTheme.ts +3 -3
- package/imports/Podcast.tsx +388 -388
- package/imports/XerticaAi.tsx +45 -45
- package/imports/XerticaX.tsx +19 -19
- package/imports/svg-aueiaqngck.ts +11 -11
- package/imports/svg-v9krss1ozd.ts +16 -16
- package/imports/svg-vhrdofe3qe.ts +5 -5
- package/llms-compact.txt +327 -327
- package/llms.txt +160 -160
- package/package.json +203 -203
- package/styles/xertica/app-overrides/chat.css +61 -61
- package/styles/xertica/app-overrides/scrollbar.css +33 -33
- package/styles/xertica/integrations/google-maps.css +76 -76
- package/styles/xertica/integrations/sonner.css +73 -73
- package/styles/xertica/tokens.css +41 -12
- package/templates/CLAUDE.md +182 -172
- package/templates/guidelines/Guidelines.md +325 -313
- package/templates/package.json +3 -3
- package/templates/src/features/auth/index.ts +4 -4
- package/templates/src/features/auth/ui/AuthPageShell.tsx +34 -34
- package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
- package/templates/src/features/auth/ui/LoginContent.tsx +90 -90
- package/templates/src/features/auth/ui/ResetPasswordContent.tsx +151 -151
- package/templates/src/features/auth/ui/SocialLoginButtons.tsx +59 -59
- package/templates/src/features/auth/ui/VerifyEmailContent.tsx +82 -82
- package/templates/src/features/home/index.ts +1 -1
- package/templates/src/features/home/ui/HomeContent.tsx +100 -100
- package/templates/src/features/template/index.ts +5 -5
- package/templates/src/features/template/ui/CrudTemplate.tsx +3 -3
- package/templates/src/features/template/ui/DashboardTemplate.tsx +3 -3
- package/templates/src/features/template/ui/FormTemplate.tsx +120 -120
- package/templates/src/features/template/ui/LoginTemplate.tsx +3 -3
- package/templates/src/pages/AssistantPage.tsx +328 -328
- package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
- package/templates/src/pages/HomePage.tsx +57 -57
- package/templates/src/pages/LoginPage.tsx +10 -10
- package/templates/src/pages/ResetPasswordPage.tsx +6 -6
- package/templates/src/pages/TemplatePage.tsx +30 -30
- package/templates/src/pages/VerifyEmailPage.tsx +6 -6
- package/templates/src/shared/config/navigation.ts +20 -20
- package/templates/src/shared/lib/auth.ts +20 -20
- package/templates/src/shared/types/auth.ts +3 -3
- package/templates/src/styles/xertica/tokens.css +39 -10
- package/templates/tsconfig.json +5 -5
- package/utils/gemini.ts +140 -140
- package/dist/VerifyEmailPage-Bae2cBXT.cjs +0 -2827
- package/dist/VerifyEmailPage-CbgjOF0v.js +0 -2828
- package/dist/index-CkTUgOwX.js +0 -8
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Button, Input, Label } from 'xertica-ui/ui';
|
|
3
|
-
import { XerticaLogo } from 'xertica-ui/brand';
|
|
4
|
-
import { ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';
|
|
5
|
-
import { useNavigate } from 'react-router-dom';
|
|
6
|
-
import { AuthPageShell } from './AuthPageShell';
|
|
7
|
-
|
|
8
|
-
export function ResetPasswordContent() {
|
|
9
|
-
const navigate = useNavigate();
|
|
10
|
-
const [password, setPassword] = useState('');
|
|
11
|
-
const [confirmPassword, setConfirmPassword] = useState('');
|
|
12
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
13
|
-
const [error, setError] = useState('');
|
|
14
|
-
const [passwordStrength, setPasswordStrength] = useState<'weak' | 'medium' | 'strong' | null>(null);
|
|
15
|
-
|
|
16
|
-
const checkPasswordStrength = (pwd: string) => {
|
|
17
|
-
if (pwd.length === 0) { setPasswordStrength(null); return; }
|
|
18
|
-
if (pwd.length < 6) setPasswordStrength('weak');
|
|
19
|
-
else if (pwd.length < 10) setPasswordStrength('medium');
|
|
20
|
-
else setPasswordStrength('strong');
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const handlePasswordChange = (value: string) => {
|
|
24
|
-
setPassword(value);
|
|
25
|
-
checkPasswordStrength(value);
|
|
26
|
-
setError('');
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const handleSubmit = async (e: React.FormEvent) => {
|
|
30
|
-
e.preventDefault();
|
|
31
|
-
setError('');
|
|
32
|
-
if (password.length < 6) { setError('A senha deve ter no mínimo 6 caracteres'); return; }
|
|
33
|
-
if (password !== confirmPassword) { setError('As senhas não coincidem'); return; }
|
|
34
|
-
setIsLoading(true);
|
|
35
|
-
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
36
|
-
navigate('/login', { state: { resetSuccess: true } });
|
|
37
|
-
setIsLoading(false);
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const getStrengthColor = () => {
|
|
41
|
-
switch (passwordStrength) {
|
|
42
|
-
case 'weak': return 'text-destructive';
|
|
43
|
-
case 'medium': return 'text-[var(--chart-3)]';
|
|
44
|
-
case 'strong': return 'text-[var(--chart-2)]';
|
|
45
|
-
default: return 'text-muted-foreground';
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const getStrengthText = () => {
|
|
50
|
-
switch (passwordStrength) {
|
|
51
|
-
case 'weak': return 'Senha fraca';
|
|
52
|
-
case 'medium': return 'Senha média';
|
|
53
|
-
case 'strong': return 'Senha forte';
|
|
54
|
-
default: return '';
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<AuthPageShell
|
|
60
|
-
imageSrc="https://images.unsplash.com/photo-1555949963-aa79dcee981c?w=1200&h=800&fit=crop&auto=format"
|
|
61
|
-
imageAlt="Segurança e proteção"
|
|
62
|
-
>
|
|
63
|
-
<button
|
|
64
|
-
onClick={() => navigate('/login')}
|
|
65
|
-
className="flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors"
|
|
66
|
-
>
|
|
67
|
-
<ArrowLeft className="w-4 h-4" />
|
|
68
|
-
<span className="text-small">Voltar para login</span>
|
|
69
|
-
</button>
|
|
70
|
-
|
|
71
|
-
<div className="text-center">
|
|
72
|
-
<div className="flex items-center justify-center mb-4">
|
|
73
|
-
<XerticaLogo className="h-12 w-auto text-primary dark:text-foreground" variant="theme" />
|
|
74
|
-
</div>
|
|
75
|
-
<h2 className="text-sm text-muted-foreground">Redefinir senha</h2>
|
|
76
|
-
<p className="mt-2 text-muted-foreground">Crie uma nova senha segura para sua conta</p>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<form className="space-y-6" onSubmit={handleSubmit}>
|
|
80
|
-
<div className="space-y-2">
|
|
81
|
-
<Label htmlFor="password">Nova senha</Label>
|
|
82
|
-
<Input
|
|
83
|
-
id="password"
|
|
84
|
-
name="password"
|
|
85
|
-
type="password"
|
|
86
|
-
required
|
|
87
|
-
className="w-full"
|
|
88
|
-
placeholder="••••••••"
|
|
89
|
-
value={password}
|
|
90
|
-
onChange={e => handlePasswordChange(e.target.value)}
|
|
91
|
-
/>
|
|
92
|
-
{passwordStrength && (
|
|
93
|
-
<div className="flex items-center gap-2">
|
|
94
|
-
<div className="flex-1 h-1 bg-muted rounded-full overflow-hidden">
|
|
95
|
-
<div
|
|
96
|
-
className={`h-full transition-all duration-300 ${
|
|
97
|
-
passwordStrength === 'weak'
|
|
98
|
-
? 'w-1/3 bg-destructive'
|
|
99
|
-
: passwordStrength === 'medium'
|
|
100
|
-
? 'w-2/3 bg-[var(--chart-3)]'
|
|
101
|
-
: 'w-full bg-[var(--chart-2)]'
|
|
102
|
-
}`}
|
|
103
|
-
/>
|
|
104
|
-
</div>
|
|
105
|
-
<span className={`text-small ${getStrengthColor()}`}>{getStrengthText()}</span>
|
|
106
|
-
</div>
|
|
107
|
-
)}
|
|
108
|
-
</div>
|
|
109
|
-
|
|
110
|
-
<div className="space-y-2">
|
|
111
|
-
<Label htmlFor="confirmPassword">Confirmar senha</Label>
|
|
112
|
-
<Input
|
|
113
|
-
id="confirmPassword"
|
|
114
|
-
name="confirmPassword"
|
|
115
|
-
type="password"
|
|
116
|
-
required
|
|
117
|
-
className="w-full"
|
|
118
|
-
placeholder="••••••••"
|
|
119
|
-
value={confirmPassword}
|
|
120
|
-
onChange={e => { setConfirmPassword(e.target.value); setError(''); }}
|
|
121
|
-
/>
|
|
122
|
-
</div>
|
|
123
|
-
|
|
124
|
-
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-2">
|
|
125
|
-
<p className="text-sm">Requisitos da senha:</p>
|
|
126
|
-
<div className="space-y-1">
|
|
127
|
-
<div className="flex items-center gap-2">
|
|
128
|
-
<CheckCircle2 className={`w-4 h-4 ${password.length >= 6 ? 'text-[var(--chart-2)]' : 'text-muted-foreground'}`} />
|
|
129
|
-
<span className="text-sm text-muted-foreground">Mínimo de 6 caracteres</span>
|
|
130
|
-
</div>
|
|
131
|
-
<div className="flex items-center gap-2">
|
|
132
|
-
<CheckCircle2 className={`w-4 h-4 ${password === confirmPassword && password.length > 0 ? 'text-[var(--chart-2)]' : 'text-muted-foreground'}`} />
|
|
133
|
-
<span className="text-sm text-muted-foreground">Senhas coincidem</span>
|
|
134
|
-
</div>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
|
|
138
|
-
{error && (
|
|
139
|
-
<div className="flex items-center gap-2 text-destructive bg-destructive/10 rounded-[var(--radius)] p-3">
|
|
140
|
-
<AlertCircle className="w-4 h-4 flex-shrink-0" />
|
|
141
|
-
<span className="text-sm">{error}</span>
|
|
142
|
-
</div>
|
|
143
|
-
)}
|
|
144
|
-
|
|
145
|
-
<Button type="submit" className="w-full" disabled={isLoading}>
|
|
146
|
-
{isLoading ? 'Redefinindo...' : 'Redefinir senha'}
|
|
147
|
-
</Button>
|
|
148
|
-
</form>
|
|
149
|
-
</AuthPageShell>
|
|
150
|
-
);
|
|
151
|
-
}
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Button, Input, Label } from 'xertica-ui/ui';
|
|
3
|
+
import { XerticaLogo } from 'xertica-ui/brand';
|
|
4
|
+
import { ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';
|
|
5
|
+
import { useNavigate } from 'react-router-dom';
|
|
6
|
+
import { AuthPageShell } from './AuthPageShell';
|
|
7
|
+
|
|
8
|
+
export function ResetPasswordContent() {
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
const [password, setPassword] = useState('');
|
|
11
|
+
const [confirmPassword, setConfirmPassword] = useState('');
|
|
12
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
13
|
+
const [error, setError] = useState('');
|
|
14
|
+
const [passwordStrength, setPasswordStrength] = useState<'weak' | 'medium' | 'strong' | null>(null);
|
|
15
|
+
|
|
16
|
+
const checkPasswordStrength = (pwd: string) => {
|
|
17
|
+
if (pwd.length === 0) { setPasswordStrength(null); return; }
|
|
18
|
+
if (pwd.length < 6) setPasswordStrength('weak');
|
|
19
|
+
else if (pwd.length < 10) setPasswordStrength('medium');
|
|
20
|
+
else setPasswordStrength('strong');
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const handlePasswordChange = (value: string) => {
|
|
24
|
+
setPassword(value);
|
|
25
|
+
checkPasswordStrength(value);
|
|
26
|
+
setError('');
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
setError('');
|
|
32
|
+
if (password.length < 6) { setError('A senha deve ter no mínimo 6 caracteres'); return; }
|
|
33
|
+
if (password !== confirmPassword) { setError('As senhas não coincidem'); return; }
|
|
34
|
+
setIsLoading(true);
|
|
35
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
36
|
+
navigate('/login', { state: { resetSuccess: true } });
|
|
37
|
+
setIsLoading(false);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const getStrengthColor = () => {
|
|
41
|
+
switch (passwordStrength) {
|
|
42
|
+
case 'weak': return 'text-destructive';
|
|
43
|
+
case 'medium': return 'text-[var(--chart-3)]';
|
|
44
|
+
case 'strong': return 'text-[var(--chart-2)]';
|
|
45
|
+
default: return 'text-muted-foreground';
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const getStrengthText = () => {
|
|
50
|
+
switch (passwordStrength) {
|
|
51
|
+
case 'weak': return 'Senha fraca';
|
|
52
|
+
case 'medium': return 'Senha média';
|
|
53
|
+
case 'strong': return 'Senha forte';
|
|
54
|
+
default: return '';
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<AuthPageShell
|
|
60
|
+
imageSrc="https://images.unsplash.com/photo-1555949963-aa79dcee981c?w=1200&h=800&fit=crop&auto=format"
|
|
61
|
+
imageAlt="Segurança e proteção"
|
|
62
|
+
>
|
|
63
|
+
<button
|
|
64
|
+
onClick={() => navigate('/login')}
|
|
65
|
+
className="flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors"
|
|
66
|
+
>
|
|
67
|
+
<ArrowLeft className="w-4 h-4" />
|
|
68
|
+
<span className="text-small">Voltar para login</span>
|
|
69
|
+
</button>
|
|
70
|
+
|
|
71
|
+
<div className="text-center">
|
|
72
|
+
<div className="flex items-center justify-center mb-4">
|
|
73
|
+
<XerticaLogo className="h-12 w-auto text-primary dark:text-foreground" variant="theme" />
|
|
74
|
+
</div>
|
|
75
|
+
<h2 className="text-sm text-muted-foreground">Redefinir senha</h2>
|
|
76
|
+
<p className="mt-2 text-muted-foreground">Crie uma nova senha segura para sua conta</p>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<form className="space-y-6" onSubmit={handleSubmit}>
|
|
80
|
+
<div className="space-y-2">
|
|
81
|
+
<Label htmlFor="password">Nova senha</Label>
|
|
82
|
+
<Input
|
|
83
|
+
id="password"
|
|
84
|
+
name="password"
|
|
85
|
+
type="password"
|
|
86
|
+
required
|
|
87
|
+
className="w-full"
|
|
88
|
+
placeholder="••••••••"
|
|
89
|
+
value={password}
|
|
90
|
+
onChange={e => handlePasswordChange(e.target.value)}
|
|
91
|
+
/>
|
|
92
|
+
{passwordStrength && (
|
|
93
|
+
<div className="flex items-center gap-2">
|
|
94
|
+
<div className="flex-1 h-1 bg-muted rounded-full overflow-hidden">
|
|
95
|
+
<div
|
|
96
|
+
className={`h-full transition-all duration-300 ${
|
|
97
|
+
passwordStrength === 'weak'
|
|
98
|
+
? 'w-1/3 bg-destructive'
|
|
99
|
+
: passwordStrength === 'medium'
|
|
100
|
+
? 'w-2/3 bg-[var(--chart-3)]'
|
|
101
|
+
: 'w-full bg-[var(--chart-2)]'
|
|
102
|
+
}`}
|
|
103
|
+
/>
|
|
104
|
+
</div>
|
|
105
|
+
<span className={`text-small ${getStrengthColor()}`}>{getStrengthText()}</span>
|
|
106
|
+
</div>
|
|
107
|
+
)}
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div className="space-y-2">
|
|
111
|
+
<Label htmlFor="confirmPassword">Confirmar senha</Label>
|
|
112
|
+
<Input
|
|
113
|
+
id="confirmPassword"
|
|
114
|
+
name="confirmPassword"
|
|
115
|
+
type="password"
|
|
116
|
+
required
|
|
117
|
+
className="w-full"
|
|
118
|
+
placeholder="••••••••"
|
|
119
|
+
value={confirmPassword}
|
|
120
|
+
onChange={e => { setConfirmPassword(e.target.value); setError(''); }}
|
|
121
|
+
/>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-2">
|
|
125
|
+
<p className="text-sm">Requisitos da senha:</p>
|
|
126
|
+
<div className="space-y-1">
|
|
127
|
+
<div className="flex items-center gap-2">
|
|
128
|
+
<CheckCircle2 className={`w-4 h-4 ${password.length >= 6 ? 'text-[var(--chart-2)]' : 'text-muted-foreground'}`} />
|
|
129
|
+
<span className="text-sm text-muted-foreground">Mínimo de 6 caracteres</span>
|
|
130
|
+
</div>
|
|
131
|
+
<div className="flex items-center gap-2">
|
|
132
|
+
<CheckCircle2 className={`w-4 h-4 ${password === confirmPassword && password.length > 0 ? 'text-[var(--chart-2)]' : 'text-muted-foreground'}`} />
|
|
133
|
+
<span className="text-sm text-muted-foreground">Senhas coincidem</span>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
{error && (
|
|
139
|
+
<div className="flex items-center gap-2 text-destructive bg-destructive/10 rounded-[var(--radius)] p-3">
|
|
140
|
+
<AlertCircle className="w-4 h-4 flex-shrink-0" />
|
|
141
|
+
<span className="text-sm">{error}</span>
|
|
142
|
+
</div>
|
|
143
|
+
)}
|
|
144
|
+
|
|
145
|
+
<Button type="submit" className="w-full" disabled={isLoading}>
|
|
146
|
+
{isLoading ? 'Redefinindo...' : 'Redefinir senha'}
|
|
147
|
+
</Button>
|
|
148
|
+
</form>
|
|
149
|
+
</AuthPageShell>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Button } from 'xertica-ui/ui';
|
|
3
|
-
import { Lock } from 'lucide-react';
|
|
4
|
-
|
|
5
|
-
interface SocialLoginButtonsProps {
|
|
6
|
-
onSocialLogin: (provider: string) => void;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function SocialLoginButtons({ onSocialLogin }: SocialLoginButtonsProps) {
|
|
10
|
-
return (
|
|
11
|
-
<>
|
|
12
|
-
<div className="relative">
|
|
13
|
-
<div className="absolute inset-0 flex items-center">
|
|
14
|
-
<div className="w-full border-t border-border" />
|
|
15
|
-
</div>
|
|
16
|
-
<div className="relative flex justify-center text-sm">
|
|
17
|
-
<span className="bg-muted px-2 text-muted-foreground">ou continuar com</span>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
|
|
21
|
-
<div className="space-y-3">
|
|
22
|
-
<Button
|
|
23
|
-
type="button"
|
|
24
|
-
variant="outline"
|
|
25
|
-
className="w-full justify-center"
|
|
26
|
-
onClick={() => onSocialLogin('Google')}
|
|
27
|
-
>
|
|
28
|
-
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
29
|
-
<path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z" />
|
|
30
|
-
<path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z" />
|
|
31
|
-
<path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z" />
|
|
32
|
-
<path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z" />
|
|
33
|
-
<path fill="none" d="M0 0h48v48H0z" />
|
|
34
|
-
</svg>
|
|
35
|
-
<span>Entrar com Google</span>
|
|
36
|
-
</Button>
|
|
37
|
-
|
|
38
|
-
<Button
|
|
39
|
-
type="button"
|
|
40
|
-
variant="outline"
|
|
41
|
-
className="w-full justify-center"
|
|
42
|
-
onClick={() => onSocialLogin('MT Login')}
|
|
43
|
-
>
|
|
44
|
-
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
45
|
-
<span>Entrar com MT Login</span>
|
|
46
|
-
</Button>
|
|
47
|
-
|
|
48
|
-
<Button
|
|
49
|
-
type="button"
|
|
50
|
-
variant="outline"
|
|
51
|
-
className="w-full justify-center font-normal"
|
|
52
|
-
onClick={() => onSocialLogin('gov.br')}
|
|
53
|
-
>
|
|
54
|
-
<span>Entrar com <strong className="font-semibold">gov.br</strong></span>
|
|
55
|
-
</Button>
|
|
56
|
-
</div>
|
|
57
|
-
</>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Button } from 'xertica-ui/ui';
|
|
3
|
+
import { Lock } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
interface SocialLoginButtonsProps {
|
|
6
|
+
onSocialLogin: (provider: string) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function SocialLoginButtons({ onSocialLogin }: SocialLoginButtonsProps) {
|
|
10
|
+
return (
|
|
11
|
+
<>
|
|
12
|
+
<div className="relative">
|
|
13
|
+
<div className="absolute inset-0 flex items-center">
|
|
14
|
+
<div className="w-full border-t border-border" />
|
|
15
|
+
</div>
|
|
16
|
+
<div className="relative flex justify-center text-sm">
|
|
17
|
+
<span className="bg-muted px-2 text-muted-foreground">ou continuar com</span>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div className="space-y-3">
|
|
22
|
+
<Button
|
|
23
|
+
type="button"
|
|
24
|
+
variant="outline"
|
|
25
|
+
className="w-full justify-center"
|
|
26
|
+
onClick={() => onSocialLogin('Google')}
|
|
27
|
+
>
|
|
28
|
+
<svg className="w-5 h-5 mr-2" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
|
|
29
|
+
<path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z" />
|
|
30
|
+
<path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z" />
|
|
31
|
+
<path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z" />
|
|
32
|
+
<path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z" />
|
|
33
|
+
<path fill="none" d="M0 0h48v48H0z" />
|
|
34
|
+
</svg>
|
|
35
|
+
<span>Entrar com Google</span>
|
|
36
|
+
</Button>
|
|
37
|
+
|
|
38
|
+
<Button
|
|
39
|
+
type="button"
|
|
40
|
+
variant="outline"
|
|
41
|
+
className="w-full justify-center"
|
|
42
|
+
onClick={() => onSocialLogin('MT Login')}
|
|
43
|
+
>
|
|
44
|
+
<Lock className="w-5 h-5 mr-2 text-[var(--chart-4)]" />
|
|
45
|
+
<span>Entrar com MT Login</span>
|
|
46
|
+
</Button>
|
|
47
|
+
|
|
48
|
+
<Button
|
|
49
|
+
type="button"
|
|
50
|
+
variant="outline"
|
|
51
|
+
className="w-full justify-center font-normal"
|
|
52
|
+
onClick={() => onSocialLogin('gov.br')}
|
|
53
|
+
>
|
|
54
|
+
<span>Entrar com <strong className="font-semibold">gov.br</strong></span>
|
|
55
|
+
</Button>
|
|
56
|
+
</div>
|
|
57
|
+
</>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Button } from 'xertica-ui/ui';
|
|
3
|
-
import { XerticaLogo } from 'xertica-ui/brand';
|
|
4
|
-
import { ArrowLeft, Mail, CheckCircle2 } from 'lucide-react';
|
|
5
|
-
import { useNavigate, useLocation } from 'react-router-dom';
|
|
6
|
-
import { AuthPageShell } from './AuthPageShell';
|
|
7
|
-
import { SocialLoginButtons } from './SocialLoginButtons';
|
|
8
|
-
|
|
9
|
-
export function VerifyEmailContent() {
|
|
10
|
-
const navigate = useNavigate();
|
|
11
|
-
const location = useLocation();
|
|
12
|
-
const email = location.state?.email || 'seu@email.com';
|
|
13
|
-
const [isResending, setIsResending] = useState(false);
|
|
14
|
-
const [resendSuccess, setResendSuccess] = useState(false);
|
|
15
|
-
|
|
16
|
-
const handleResend = async () => {
|
|
17
|
-
setIsResending(true);
|
|
18
|
-
setResendSuccess(false);
|
|
19
|
-
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
20
|
-
setIsResending(false);
|
|
21
|
-
setResendSuccess(true);
|
|
22
|
-
setTimeout(() => setResendSuccess(false), 3000);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<AuthPageShell
|
|
27
|
-
imageSrc="https://images.unsplash.com/photo-1563986768609-322da13575f3?w=1200&h=800&fit=crop&auto=format"
|
|
28
|
-
imageAlt="Email e comunicação"
|
|
29
|
-
>
|
|
30
|
-
<div className="text-center">
|
|
31
|
-
<div className="flex items-center justify-center mb-4">
|
|
32
|
-
<XerticaLogo className="h-12 w-auto text-primary dark:text-foreground" variant="theme" />
|
|
33
|
-
</div>
|
|
34
|
-
<div className="flex items-center justify-center mb-4">
|
|
35
|
-
<div className="p-4 bg-primary/10 rounded-[var(--radius)]">
|
|
36
|
-
<Mail className="w-12 h-12 text-primary" />
|
|
37
|
-
</div>
|
|
38
|
-
</div>
|
|
39
|
-
<h2 className="text-sm text-muted-foreground">Verifique seu email</h2>
|
|
40
|
-
<p className="mt-2 text-muted-foreground">
|
|
41
|
-
Enviamos instruções para redefinir sua senha para:
|
|
42
|
-
</p>
|
|
43
|
-
<p className="mt-1 text-primary">{email}</p>
|
|
44
|
-
</div>
|
|
45
|
-
|
|
46
|
-
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-3">
|
|
47
|
-
<p className="text-muted-foreground">
|
|
48
|
-
Siga as instruções no email para redefinir sua senha. O link expira em 24 horas.
|
|
49
|
-
</p>
|
|
50
|
-
<div className="flex items-start gap-2 text-muted-foreground">
|
|
51
|
-
<CheckCircle2 className="w-4 h-4 mt-0.5 flex-shrink-0 text-[var(--chart-2)]" />
|
|
52
|
-
<span className="text-sm">Verifique a caixa de spam se não encontrar o email</span>
|
|
53
|
-
</div>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
{resendSuccess && (
|
|
57
|
-
<div className="bg-[var(--chart-2)]/10 border border-[var(--chart-2)]/20 rounded-[var(--radius)] p-3 flex items-center gap-2">
|
|
58
|
-
<CheckCircle2 className="w-5 h-5 text-[var(--chart-2)] flex-shrink-0" />
|
|
59
|
-
<span className="text-sm text-[var(--chart-2)]">Email reenviado com sucesso!</span>
|
|
60
|
-
</div>
|
|
61
|
-
)}
|
|
62
|
-
|
|
63
|
-
<div className="space-y-3">
|
|
64
|
-
<p className="text-center text-muted-foreground">Não recebeu o email?</p>
|
|
65
|
-
<Button variant="outline" className="w-full" onClick={handleResend} disabled={isResending}>
|
|
66
|
-
{isResending ? 'Reenviando...' : 'Reenviar email'}
|
|
67
|
-
</Button>
|
|
68
|
-
<Button
|
|
69
|
-
type="button"
|
|
70
|
-
onClick={() => navigate('/login')}
|
|
71
|
-
variant="outline"
|
|
72
|
-
className="w-full text-muted-foreground hover:text-foreground"
|
|
73
|
-
>
|
|
74
|
-
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
75
|
-
Voltar para login
|
|
76
|
-
</Button>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<SocialLoginButtons onSocialLogin={provider => console.log(`Login com ${provider}`)} />
|
|
80
|
-
</AuthPageShell>
|
|
81
|
-
);
|
|
82
|
-
}
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { Button } from 'xertica-ui/ui';
|
|
3
|
+
import { XerticaLogo } from 'xertica-ui/brand';
|
|
4
|
+
import { ArrowLeft, Mail, CheckCircle2 } from 'lucide-react';
|
|
5
|
+
import { useNavigate, useLocation } from 'react-router-dom';
|
|
6
|
+
import { AuthPageShell } from './AuthPageShell';
|
|
7
|
+
import { SocialLoginButtons } from './SocialLoginButtons';
|
|
8
|
+
|
|
9
|
+
export function VerifyEmailContent() {
|
|
10
|
+
const navigate = useNavigate();
|
|
11
|
+
const location = useLocation();
|
|
12
|
+
const email = location.state?.email || 'seu@email.com';
|
|
13
|
+
const [isResending, setIsResending] = useState(false);
|
|
14
|
+
const [resendSuccess, setResendSuccess] = useState(false);
|
|
15
|
+
|
|
16
|
+
const handleResend = async () => {
|
|
17
|
+
setIsResending(true);
|
|
18
|
+
setResendSuccess(false);
|
|
19
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
20
|
+
setIsResending(false);
|
|
21
|
+
setResendSuccess(true);
|
|
22
|
+
setTimeout(() => setResendSuccess(false), 3000);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<AuthPageShell
|
|
27
|
+
imageSrc="https://images.unsplash.com/photo-1563986768609-322da13575f3?w=1200&h=800&fit=crop&auto=format"
|
|
28
|
+
imageAlt="Email e comunicação"
|
|
29
|
+
>
|
|
30
|
+
<div className="text-center">
|
|
31
|
+
<div className="flex items-center justify-center mb-4">
|
|
32
|
+
<XerticaLogo className="h-12 w-auto text-primary dark:text-foreground" variant="theme" />
|
|
33
|
+
</div>
|
|
34
|
+
<div className="flex items-center justify-center mb-4">
|
|
35
|
+
<div className="p-4 bg-primary/10 rounded-[var(--radius)]">
|
|
36
|
+
<Mail className="w-12 h-12 text-primary" />
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<h2 className="text-sm text-muted-foreground">Verifique seu email</h2>
|
|
40
|
+
<p className="mt-2 text-muted-foreground">
|
|
41
|
+
Enviamos instruções para redefinir sua senha para:
|
|
42
|
+
</p>
|
|
43
|
+
<p className="mt-1 text-primary">{email}</p>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div className="bg-accent rounded-[var(--radius)] p-4 space-y-3">
|
|
47
|
+
<p className="text-muted-foreground">
|
|
48
|
+
Siga as instruções no email para redefinir sua senha. O link expira em 24 horas.
|
|
49
|
+
</p>
|
|
50
|
+
<div className="flex items-start gap-2 text-muted-foreground">
|
|
51
|
+
<CheckCircle2 className="w-4 h-4 mt-0.5 flex-shrink-0 text-[var(--chart-2)]" />
|
|
52
|
+
<span className="text-sm">Verifique a caixa de spam se não encontrar o email</span>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
{resendSuccess && (
|
|
57
|
+
<div className="bg-[var(--chart-2)]/10 border border-[var(--chart-2)]/20 rounded-[var(--radius)] p-3 flex items-center gap-2">
|
|
58
|
+
<CheckCircle2 className="w-5 h-5 text-[var(--chart-2)] flex-shrink-0" />
|
|
59
|
+
<span className="text-sm text-[var(--chart-2)]">Email reenviado com sucesso!</span>
|
|
60
|
+
</div>
|
|
61
|
+
)}
|
|
62
|
+
|
|
63
|
+
<div className="space-y-3">
|
|
64
|
+
<p className="text-center text-muted-foreground">Não recebeu o email?</p>
|
|
65
|
+
<Button variant="outline" className="w-full" onClick={handleResend} disabled={isResending}>
|
|
66
|
+
{isResending ? 'Reenviando...' : 'Reenviar email'}
|
|
67
|
+
</Button>
|
|
68
|
+
<Button
|
|
69
|
+
type="button"
|
|
70
|
+
onClick={() => navigate('/login')}
|
|
71
|
+
variant="outline"
|
|
72
|
+
className="w-full text-muted-foreground hover:text-foreground"
|
|
73
|
+
>
|
|
74
|
+
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
75
|
+
Voltar para login
|
|
76
|
+
</Button>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<SocialLoginButtons onSocialLogin={provider => console.log(`Login com ${provider}`)} />
|
|
80
|
+
</AuthPageShell>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { HomeContent } from './ui/HomeContent';
|
|
1
|
+
export { HomeContent } from './ui/HomeContent';
|