From 56108ad9c9abd52a4c51f7e456cbcb6f6010d6d7 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Tue, 17 Oct 2023 12:15:13 +0530 Subject: [PATCH 01/30] PRESS2-1233 | creating structure from newfold-skeleton --- .../components/AdminBarSiteGen/index.js | 25 ++ .../AdminBarSiteGen/stylesheet.scss | 30 ++ .../components/AppSiteGen/index.js | 331 ++++++++++++++++++ .../components/NavigationBarSiteGen/index.js | 15 + .../NavigationBarSiteGen/stylesheet.scss | 2 + .../components/ProgressBarSiteGen/index.js | 21 ++ .../ProgressBarSiteGen/stylesheet.scss | 19 + .../SiteGenInterfaceSkeleton/index.js | 157 +++++++++ .../SiteGenInterfaceSkeleton/style.scss | 186 ++++++++++ src/OnboardingSPA/index.js | 5 +- 10 files changed, 789 insertions(+), 2 deletions(-) create mode 100644 src/OnboardingSPA/components/AdminBarSiteGen/index.js create mode 100644 src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss create mode 100644 src/OnboardingSPA/components/AppSiteGen/index.js create mode 100644 src/OnboardingSPA/components/NavigationBarSiteGen/index.js create mode 100644 src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss create mode 100644 src/OnboardingSPA/components/ProgressBarSiteGen/index.js create mode 100644 src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss create mode 100644 src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js create mode 100644 src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js new file mode 100644 index 000000000..7d11940e6 --- /dev/null +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -0,0 +1,25 @@ + +import { __ } from '@wordpress/i18n'; +import './stylesheet.scss'; + +const AdminBarSiteGen = ( {} ) => { + + return ( + ( +
+
+
+
+ WordPress +
+
+ Howdy, Maya Jiménez +
+
+
+
+ ) + ); +}; + +export default AdminBarSiteGen; diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss new file mode 100644 index 000000000..508775119 --- /dev/null +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -0,0 +1,30 @@ +.nfd-interface-interface-skeleton__adminbar{ + height: 60px; + +} + +.nfd-admin-bar-site-gen{ + position:fixed; + top:0; + height:40px; + width: 100%; + + + .nfd-admin-top-bar { + background-color: #23282d; // Dark grayish background + padding: 10px 20px; + display: flex; + align-items: center; + } + + .nfd-admin-bar-logo { + color: #a0a5aa; // Logo color + font-size: 20px; + font-weight: bold; + } + + .nfd-admin-bar-greeting { + color: #a0a5aa; // Text color + font-size: 16px; + } +} diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/OnboardingSPA/components/AppSiteGen/index.js new file mode 100644 index 000000000..0d7340dc8 --- /dev/null +++ b/src/OnboardingSPA/components/AppSiteGen/index.js @@ -0,0 +1,331 @@ +import Content from '../Content'; +import Drawer from '../Drawer'; +import AdminBarSiteGen from '../AdminBarSiteGen'; +import ProgressBarSiteGen from '../ProgressBarSiteGen'; +import NavigationBarSiteGen from '../NavigationBarSiteGen'; +import classNames from 'classnames'; +import { useLocation } from 'react-router-dom'; +import { setFlow } from '../../utils/api/flow'; +import { design as designChapter } from '../../chapters/design'; +import { getSettings, setSettings } from '../../utils/api/settings'; +import { isEmpty, updateWPSettings } from '../../utils/api/ecommerce'; +import { store as nfdOnboardingStore } from '../../store'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import { kebabCase } from 'lodash'; +import { useViewportMatch } from '@wordpress/compose'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { SlotFillProvider } from '@wordpress/components'; +import { useEffect, Fragment, useState } from '@wordpress/element'; +import { FullscreenMode } from '@wordpress/interface'; +import { API_REQUEST } from '../../../constants'; +import SiteGenInterfaceSkeleton from '../SiteGenInterfaceSkeleton'; +import { HiiveAnalytics } from '@newfold-labs/js-utility-ui-analytics'; +import { + OnboardingEvent, + trackOnboardingEvent, +} from '../../utils/analytics/hiive'; +import { injectInAllSteps } from '../../data/flows/utils'; +import { + ACTION_FEATURE_ADDED, + ACTION_LOGO_ADDED, + ACTION_SITE_TITLE_SET, + ACTION_SOCIAL_ADDED, + ACTION_STARTER_PAGES_SELECTED, + ACTION_TAGLINE_SET, + CATEGORY, +} from '../../utils/analytics/hiive/constants'; +import { socialMediaStoreToState } from '../SocialMediaForm/utils'; + +/** + * Primary app that renders the . + * + * Is a child of the hash router and error boundary. + * + * @return {WPComponent} App Component + */ +const AppSiteGen = () => { + const location = useLocation(); + const isLargeViewport = useViewportMatch( 'medium' ); + const pathname = kebabCase( location.pathname ); + + const { + isDrawerOpen, + newfoldBrand, + onboardingFlow, + currentData, + socialData, + firstStep, + allSteps, + } = useSelect( + ( select ) => { + return { + isDrawerOpen: select( nfdOnboardingStore ).isDrawerOpened(), + newfoldBrand: select( nfdOnboardingStore ).getNewfoldBrand(), + onboardingFlow: + select( nfdOnboardingStore ).getOnboardingFlow(), + currentData: + select( nfdOnboardingStore ).getCurrentOnboardingData(), + socialData: + select( nfdOnboardingStore ).getOnboardingSocialData(), + firstStep: select( nfdOnboardingStore ).getFirstStep(), + allSteps: select( nfdOnboardingStore ).getAllSteps(), + }; + }, + [ location.pathname ] + ); + + const [ isRequestPlaced, setIsRequestPlaced ] = useState( false ); + const [ didVisitBasicInfo, setDidVisitBasicInfo ] = useState( false ); + const [ didVisitEcommerce, setDidVisitEcommerce ] = useState( false ); + const { + setActiveStep, + setActiveFlow, + updateAllSteps, + flushQueue, + enqueueRequest, + setOnboardingSocialData, + setCurrentOnboardingData, + } = useDispatch( nfdOnboardingStore ); + + async function syncSocialSettings() { + const initialData = await getSettings(); + const result = await setSettings( socialData ); + setDidVisitBasicInfo( false ); + if ( result?.error !== null ) { + return initialData?.body; + } + return result?.body; + } + + async function syncStoreDetails() { + const { address } = currentData.storeDetails; + let payload = {}; + if ( address !== undefined ) { + delete address.country; + delete address.state; + payload = address; + } + // if ( tax !== undefined ) { + // delete tax.option; + // delete tax.isStoreDetailsFilled; + // payload = { ...payload, ...tax }; + // } + if ( ! isEmpty( payload ) ) { + await updateWPSettings( payload ); + } + delete currentData.storeDetails.address; + delete currentData.storeDetails.tax; + setDidVisitEcommerce( false ); + } + + async function syncStoreToDB() { + // The First Welcome Step doesn't have any Store changes + const isFirstStep = location?.pathname === firstStep?.path; + if ( currentData && ! isFirstStep ) { + if ( ! isRequestPlaced ) { + setIsRequestPlaced( true ); + + if ( didVisitEcommerce ) { + await syncStoreDetails(); + } + + // If Social Data is changed then sync it + if ( didVisitBasicInfo ) { + const socialDataResp = await syncSocialSettings(); + + // If Social Data is changed then Sync that also to the store + if ( socialDataResp ) { + setOnboardingSocialData( socialDataResp ); + } + } + flushQueue(); + enqueueRequest( API_REQUEST.SET_FLOW, () => + setFlow( currentData ) + ); + setIsRequestPlaced( false ); + } + } + + // Check if the Basic Info page was visited + if ( location?.pathname.includes( 'basic-info' ) ) { + setDidVisitBasicInfo( true ); + } + if ( location?.pathname.includes( 'ecommerce' ) ) { + setDidVisitEcommerce( true ); + } + } + + function handleConditionalDesignStepsRoutes() { + if ( + location?.pathname.includes( 'colors' ) || + location?.pathname.includes( 'fonts' ) + ) { + const updates = injectInAllSteps( + allSteps, + designChapter.conditionalSteps + ); + updateAllSteps( updates.allSteps ); + if ( ! currentData.data.customDesign ) { + currentData.data.customDesign = true; + setCurrentOnboardingData( currentData ); + } + } + } + + const handlePreviousStepTracking = () => { + const previousStep = window.nfdOnboarding?.previousStep; + if ( typeof previousStep !== 'object' ) { + window.nfdOnboarding.previousStep = { + path: location.pathname, + url: window.location.href, + }; + HiiveAnalytics.dispatchEvents( CATEGORY ); + return; + } + + const previousStepPath = previousStep.path; + const previousStepURL = previousStep.url; + + if ( previousStepPath.includes( 'basic-info' ) ) { + const siteTitle = currentData.data.blogName; + const siteDescription = currentData.data.blogDescription; + const siteLogo = currentData.data.siteLogo.url; + if ( siteTitle ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_SITE_TITLE_SET, + siteTitle, + {}, + previousStepURL + ) + ); + } + + if ( siteDescription ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_TAGLINE_SET, + siteDescription, + {}, + previousStepURL + ) + ); + } + + if ( siteLogo ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_LOGO_ADDED, + undefined, + {}, + previousStepURL + ) + ); + } + + const platforms = Object.keys( + socialMediaStoreToState( socialData ) + ).join( ',' ); + if ( platforms ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_SOCIAL_ADDED, + platforms, + {}, + previousStepURL + ) + ); + } + } + + if ( previousStepPath.includes( 'site-pages' ) ) { + const sitePages = currentData.data.sitePages?.other; + if ( ! sitePages || false === sitePages ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_STARTER_PAGES_SELECTED, + [], + { + count: 0, + }, + previousStepURL + ) + ); + } else { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_STARTER_PAGES_SELECTED, + sitePages.map( ( sitePage ) => sitePage.title ), + { + count: sitePages.length, + }, + previousStepURL + ) + ); + } + } + + if ( previousStepPath.includes( 'site-features' ) ) { + const siteFeatures = currentData.data.siteFeatures; + for ( const siteFeature in siteFeatures ) { + if ( false !== siteFeatures[ siteFeature ] ) { + trackOnboardingEvent( + new OnboardingEvent( + ACTION_FEATURE_ADDED, + siteFeature, + {}, + previousStepURL + ) + ); + } + } + } + + window.nfdOnboarding.previousStep = { + path: location.pathname, + url: window.location.href, + }; + + HiiveAnalytics.dispatchEvents( CATEGORY ); + }; + + useEffect( () => { + document.body.classList.add( `nfd-brand-${ newfoldBrand }` ); + }, [ newfoldBrand ] ); + + useEffect( () => { + syncStoreToDB(); + handlePreviousStepTracking(); + handleConditionalDesignStepsRoutes(); + if ( location.pathname.includes( '/step' ) ) { + setActiveFlow( onboardingFlow ); + setActiveStep( location.pathname ); + } + }, [ location.pathname, onboardingFlow ] ); + + return ( + + + + } + progressbar={ } + navigationbar={ } + content={ } + /> + + + ); +}; + +export default AppSiteGen; diff --git a/src/OnboardingSPA/components/NavigationBarSiteGen/index.js b/src/OnboardingSPA/components/NavigationBarSiteGen/index.js new file mode 100644 index 000000000..899f4bfef --- /dev/null +++ b/src/OnboardingSPA/components/NavigationBarSiteGen/index.js @@ -0,0 +1,15 @@ + +import { __ } from '@wordpress/i18n'; + +const NavigationBarSiteGen = ( {} ) => { + + return ( + ( +
+

Navigation Bar area

+
+ ) + ); +}; + +export default NavigationBarSiteGen; diff --git a/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss new file mode 100644 index 000000000..766711eee --- /dev/null +++ b/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss @@ -0,0 +1,2 @@ +.nfd-admin-bar-site-gen{ +} diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js new file mode 100644 index 000000000..71cea7267 --- /dev/null +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js @@ -0,0 +1,21 @@ + +import { __ } from '@wordpress/i18n'; +import './stylesheet.scss'; + +const ProgressBarSiteGen = ( { current, total } ) => { + const percentage = (current / total) * 100; + return ( + ( +
+
+
+
+
+ ) + ); +}; + +export default ProgressBarSiteGen; diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss new file mode 100644 index 000000000..6e22360c7 --- /dev/null +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -0,0 +1,19 @@ +.nfd-progress-bar-site-gen{ + position:fixed; + top:40px; + width: 100%; + height: 20px; + + .nfd-progress-bar-container { + background-color: #837c7c; + height: 20px; + width: 100%; + border-radius: 0px; + overflow: hidden; + } + + .nfd-progress-bar-fill { + background-color: #0073aa; /* WordPress blue */ + height: 100%; + } +} diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js new file mode 100644 index 000000000..e65d4178b --- /dev/null +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -0,0 +1,157 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +/** + * WordPress dependencies + */ +import { forwardRef, useEffect } from '@wordpress/element'; +// eslint-disable-next-line @wordpress/no-unsafe-wp-apis +import { __unstableUseNavigateRegions as useNavigateRegions } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { useMergeRefs } from '@wordpress/compose'; + +function useHTMLClass( className ) { + useEffect( () => { + const element = + document && document.querySelector( `html:not(.${ className })` ); + if ( ! element ) { + return; + } + element.classList.toggle( className ); + return () => { + element.classList.toggle( className ); + }; + }, [ className ] ); +} + +function SiteGenInterfaceSkeleton( + { + footer, + adminbar, + progressbar, + navigationbar, + notices, + content, + drawer, + actions, + labels, + className, + shortcuts, + }, + ref +) { + const navigateRegionsProps = useNavigateRegions( shortcuts ); + + useHTMLClass( 'nfd-interface-interface-skeleton__html-container' ); + + const defaultLabels = { + /* translators: accessibility text for the nav bar landmark region. */ + drawer: __( 'Drawer', 'wp-module-onboarding' ), + /* translators: accessibility text for the top bar landmark region. */ + body: __( 'Content', 'wp-module-onboarding' ), + /* translators: accessibility text for the publish landmark region. */ + actions: __( 'Publish', 'wp-module-onboarding' ), + /* translators: accessibility text for the footer landmark region. */ + footer: __( 'Footer', 'wp-module-onboarding' ), + }; + + const mergedLabels = { ...defaultLabels, ...labels }; + + return ( +
+ { !! drawer && ( +
+ { drawer } +
+ ) } +
+ { !! adminbar && ( +
+ { adminbar } +
+ ) } +
+ { !! progressbar && ( +
+ { progressbar } +
+ ) } + { !! navigationbar && ( +
+ { navigationbar } +
+ ) } + { !! notices && ( +
+ { notices } +
+ ) } +
+ { content } +
+ { !! actions && ( +
+ { actions } +
+ ) } +
+
+ { !! footer && ( +
+ { footer } +
+ ) } +
+ ); +} + +export default forwardRef( SiteGenInterfaceSkeleton ); diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss new file mode 100644 index 000000000..b805ea042 --- /dev/null +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -0,0 +1,186 @@ +// On Mobile devices, swiping the HTML element should not scroll. +// By making it fixed, we prevent that. +html.nfd-interface-interface-skeleton__html-container { + position: fixed; + width: 100%; + + @media (max-width: #{($break-medium)}) { + position: initial; + width: initial; + } +} + +.nfd-interface-interface-skeleton { + display: flex; + flex-direction: row; + height: auto; + max-height: 100%; + + // Fill the available space on Mobile. + position: fixed; + top: 46px; + left: 0; + right: 0; + bottom: 0; + + // Adjust to admin-bar going small. + @media (min-width: #{ ($break-medium + 1) }) { + top: 32px; + + .is-fullscreen-mode & { + top: 0; + } + } +} + +.nfd-interface-interface-skeleton__editor { + display: flex; + flex-direction: column; + flex: 0 1 100%; + overflow: hidden; +} + +@include editor-left(".nfd-interface-interface-skeleton"); + +.nfd-interface-interface-skeleton__body { + flex-grow: 1; + display: flex; + + // Even on Mobile, we choose to scroll this element on its own. + // This helps enable a fixed-to-top toolbar that makes the editing experience + // on Mobile Safari usable. + // Unfortunately an issue still exists where if you swipe the top toolbar + // or beyond the bottom of the page when the soft keyboard is showing, + // you scroll the body element and can scroll the toolbar out of view. + // This is still preferable, though, as it allows the editor + // to function at all. + overflow: auto; + + // In future versions of Mobile Safari, hopefully overscroll-behavior + // to be supported. + // This allows us to disallow the scroll-chaining and rubber-banding + // that is currently is the cause of the issue outlined above. + // In other words, the following behavior doesn't yet work in Safari, + // but if/when it is added, it should take care of the issue. + // See also: https://drafts.csswg.org/css-overscroll/ + overscroll-behavior-y: none; + + // Footer overlap prevention + .has-footer & { + + @media (max-width: #{($break-medium)}) { + padding-bottom: 24px + 1px; + } + } +} + +.nfd-interface-interface-skeleton__content { + flex-grow: 1; + + // Treat as flex container to allow children to grow to occupy full + // available height of the content area. + display: flex; + flex-direction: column; + + // On Mobile the header is fixed to keep HTML as scrollable. + // Beyond the medium breakpoint, we allow the sidebar. + // The sidebar should scroll independently, so enable scroll here also. + overflow: auto; + + // On Safari iOS on smaller viewports lack of a z-index causes the background + // to "bleed" through the header. + // See https://github.com/WordPress/gutenberg/issues/32631 + z-index: 20; + +} + +.nfd-interface-interface-skeleton__secondary-sidebar, +.nfd-interface-interface-skeleton__sidebar { + display: block; + flex-shrink: 0; + position: relative; + z-index: 100000; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: var(--nfd-onboarding-light); + color: #1e1e1e; + + // On Mobile the header is fixed to keep HTML as scrollable. + @media (max-width: #{($break-medium)}) { + position: relative !important; + z-index: 90; + width: auto; // Keep the sidebar width flexible. + } +} + +.nfd-interface-interface-skeleton__sidebar { + overflow: auto; + border-left: 1px solid #e0e0e0; + + @media (max-width: #{($break-medium)}) { + border-left: 1px solid #e0e0e0; + } +} + +.nfd-interface-interface-skeleton__secondary-sidebar { + + @media (max-width: #{($break-medium)}) { + border-right: 1px solid #e0e0e0; + } +} + +.nfd-interface-interface-skeleton__header { + flex-shrink: 0; + height: auto; // Keep the height flexible. + border-bottom: 1px solid #e0e0e0; + z-index: 30; + color: #1e1e1e; +} + +.nfd-interface-interface-skeleton__footer { + height: auto; // Keep the height flexible. + flex-shrink: 0; + border-top: 1px solid #e0e0e0; + color: #1e1e1e; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: var(--nfd-onboarding-light); + z-index: 90; + + // On Mobile the footer is hidden + display: none; + + @media (max-width: #{($break-medium)}) { + display: flex; + } + + .block-editor-block-breadcrumb { + z-index: 30; + display: flex; + background: var(--nfd-onboarding-light); + height: 24px; + align-items: center; + font-size: 13px; + padding: 0 (12px + 6px); + } +} + +.nfd-interface-interface-skeleton__actions { + z-index: 100000; + position: fixed !important; // Need to override the default relative positioning + top: -9999em; + bottom: auto; + left: auto; + right: 0; + width: 280px; + color: #1e1e1e; + + &:focus { + top: auto; + bottom: 0; + } +} diff --git a/src/OnboardingSPA/index.js b/src/OnboardingSPA/index.js index 1348ab20f..75413f80f 100644 --- a/src/OnboardingSPA/index.js +++ b/src/OnboardingSPA/index.js @@ -7,7 +7,8 @@ import { trigger as cronTrigger } from './utils/api/cronTrigger'; import { initialize as initializeSettings } from './utils/api/settings'; import { DESIGN_STEPS_THEME } from '../constants'; -import App from './components/App'; +//import App from './components/App'; +import AppSiteGen from './components/AppSiteGen'; import { HashRouter } from 'react-router-dom'; import { dispatch } from '@wordpress/data'; import { render } from '@wordpress/element'; @@ -21,7 +22,7 @@ import { stateToStore } from './chapters/utils'; */ const NFDOnboarding = () => ( - + ); From fcf7faabbf5a5c997c95e3086536532928203b70 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Tue, 17 Oct 2023 18:18:49 +0530 Subject: [PATCH 02/30] PRESS2-1233 | updated progress bar --- .../components/AdminBarSiteGen/index.js | 33 ++++++------- .../AdminBarSiteGen/stylesheet.scss | 48 ++++++++----------- .../components/ProgressBarSiteGen/index.js | 17 ++++--- .../ProgressBarSiteGen/stylesheet.scss | 31 ++++++------ .../SiteGenInterfaceSkeleton/index.js | 20 ++++---- .../SiteGenInterfaceSkeleton/style.scss | 1 + 6 files changed, 67 insertions(+), 83 deletions(-) diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js index 7d11940e6..78cdfd960 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -1,25 +1,20 @@ - import { __ } from '@wordpress/i18n'; import './stylesheet.scss'; -const AdminBarSiteGen = ( {} ) => { +const AdminBarSiteGen = ({ }) => { - return ( - ( -
-
-
-
- WordPress -
-
- Howdy, Maya Jiménez -
-
-
-
- ) - ); + return ( + ( +
+
+ WordPress +
+
+ Howdy, Maya Jiménez +
+
+ ) + ); }; -export default AdminBarSiteGen; +export default AdminBarSiteGen; \ No newline at end of file diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss index 508775119..876b2f3d6 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -1,30 +1,22 @@ -.nfd-interface-interface-skeleton__adminbar{ - height: 60px; - -} - -.nfd-admin-bar-site-gen{ - position:fixed; - top:0; - height:40px; - width: 100%; +.nfd-interface-interface-skeleton__adminbar{ - .nfd-admin-top-bar { - background-color: #23282d; // Dark grayish background - padding: 10px 20px; - display: flex; - align-items: center; - } - - .nfd-admin-bar-logo { - color: #a0a5aa; // Logo color - font-size: 20px; - font-weight: bold; - } - - .nfd-admin-bar-greeting { - color: #a0a5aa; // Text color - font-size: 16px; - } -} + .nfd-admin-bar-sitegen{ + padding: 5px; + background-color: #23282d; // Dark grayish background + display: flex; + justify-content: space-between; + + + .nfd-admin-bar-logo { + color: #a0a5aa; // Logo color + font-size: 20px; + font-weight: bold; + } + + .nfd-admin-bar-greeting { + color: #a0a5aa; // Text color + font-size: 16px; + } + } +} \ No newline at end of file diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js index 71cea7267..848cf4d88 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js @@ -1,21 +1,20 @@ - import { __ } from '@wordpress/i18n'; import './stylesheet.scss'; const ProgressBarSiteGen = ( { current, total } ) => { - const percentage = (current / total) * 100; - return ( - ( -
-
+ const percentage = (current / total) * 100; + return ( + ( +
+
-
- ) - ); +
+ ) + ); }; export default ProgressBarSiteGen; diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss index 6e22360c7..f5ea73cec 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -1,19 +1,16 @@ .nfd-progress-bar-site-gen{ - position:fixed; - top:40px; - width: 100%; - height: 20px; + width: 100%; - .nfd-progress-bar-container { - background-color: #837c7c; - height: 20px; - width: 100%; - border-radius: 0px; - overflow: hidden; - } - - .nfd-progress-bar-fill { - background-color: #0073aa; /* WordPress blue */ - height: 100%; - } -} + .nfd-progress-bar-container { + background-color: #32373e; + height: 15px; + width: 100%; + border-radius: 0px; + overflow: hidden; + } + + .nfd-progress-bar-fill { + background-color: #3620f8; /* WordPress blue */ + height: 100%; + } +} \ No newline at end of file diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js index e65d4178b..a48ce695e 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -94,17 +94,17 @@ function SiteGenInterfaceSkeleton( { adminbar }
) } + { !! progressbar && ( +
+ { progressbar } +
+ ) }
- { !! progressbar && ( -
- { progressbar } -
- ) } { !! navigationbar && (
Date: Wed, 18 Oct 2023 11:05:20 +0530 Subject: [PATCH 03/30] PRESS2-1233 | added toggle --- .../components/AdminBarSiteGen/index.js | 1 - .../components/AppSiteGen/index.js | 6 ++- .../components/ProgressBarSiteGen/index.js | 1 - .../SiteGenInterfaceSkeleton/index.js | 41 ++++++++++++------- .../components/ToggleDarkMode/index.js | 23 +++++++++++ .../components/ToggleDarkMode/stylesheet.scss | 7 ++++ src/OnboardingSPA/index.js | 2 +- src/OnboardingSPA/styles/app.scss | 4 ++ 8 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 src/OnboardingSPA/components/ToggleDarkMode/index.js create mode 100644 src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js index 78cdfd960..1f3c89479 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -1,5 +1,4 @@ import { __ } from '@wordpress/i18n'; -import './stylesheet.scss'; const AdminBarSiteGen = ({ }) => { diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/OnboardingSPA/components/AppSiteGen/index.js index 0d7340dc8..d16c96722 100644 --- a/src/OnboardingSPA/components/AppSiteGen/index.js +++ b/src/OnboardingSPA/components/AppSiteGen/index.js @@ -1,8 +1,9 @@ import Content from '../Content'; +import Header from '../Header'; import Drawer from '../Drawer'; +import ToggleDarkMode from '../ToggleDarkMode'; import AdminBarSiteGen from '../AdminBarSiteGen'; import ProgressBarSiteGen from '../ProgressBarSiteGen'; -import NavigationBarSiteGen from '../NavigationBarSiteGen'; import classNames from 'classnames'; import { useLocation } from 'react-router-dom'; import { setFlow } from '../../utils/api/flow'; @@ -318,10 +319,11 @@ const AppSiteGen = () => { { 'is-large-viewport': isLargeViewport }, { 'is-small-viewport': ! isLargeViewport } ) } + header={
} adminbar={ } progressbar={ } - navigationbar={ } content={ } + darkModeToggle = { } /> diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js index 848cf4d88..2da8a9320 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js @@ -1,5 +1,4 @@ import { __ } from '@wordpress/i18n'; -import './stylesheet.scss'; const ProgressBarSiteGen = ( { current, total } ) => { const percentage = (current / total) * 100; diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js index a48ce695e..d9beed47f 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -31,10 +31,10 @@ function useHTMLClass( className ) { function SiteGenInterfaceSkeleton( { + header, footer, adminbar, progressbar, - navigationbar, notices, content, drawer, @@ -42,6 +42,7 @@ function SiteGenInterfaceSkeleton( labels, className, shortcuts, + darkModeToggle, }, ref ) { @@ -105,39 +106,49 @@ function SiteGenInterfaceSkeleton(
) }
- { !! navigationbar && ( + {!!header && (
- { navigationbar } + {header}
- ) } - { !! notices && ( + )} + {!!notices && (
- { notices } + {notices}
- ) } + )}
- { content } + {content}
- { !! actions && ( + {!!actions && (
- { actions } + {actions}
- ) } + )} + {!!darkModeToggle && ( +
+ {darkModeToggle} +
+ )}
{ !! footer && ( diff --git a/src/OnboardingSPA/components/ToggleDarkMode/index.js b/src/OnboardingSPA/components/ToggleDarkMode/index.js new file mode 100644 index 000000000..8610afa30 --- /dev/null +++ b/src/OnboardingSPA/components/ToggleDarkMode/index.js @@ -0,0 +1,23 @@ +import { ToggleControl } from '@wordpress/components'; +import { useState } from '@wordpress/element'; + +const ToggleDarkMode = () => { + const [ isChecked, setChecked ] = useState( false ); + + const onChange = ( value ) => { + setChecked( value ); + // Handle the toggle action here + }; + + return ( +
+ +
+ ); +}; + +export default ToggleDarkMode; diff --git a/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss b/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss new file mode 100644 index 000000000..f9b27d23e --- /dev/null +++ b/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss @@ -0,0 +1,7 @@ +.nfd-sitegen-darkmode-wrapper{ + position: absolute; + bottom: 15px; + left: 50%; + transform: translateX(-50%); + z-index: 999; +} \ No newline at end of file diff --git a/src/OnboardingSPA/index.js b/src/OnboardingSPA/index.js index 75413f80f..dec086098 100644 --- a/src/OnboardingSPA/index.js +++ b/src/OnboardingSPA/index.js @@ -7,7 +7,7 @@ import { trigger as cronTrigger } from './utils/api/cronTrigger'; import { initialize as initializeSettings } from './utils/api/settings'; import { DESIGN_STEPS_THEME } from '../constants'; -//import App from './components/App'; +import App from './components/App'; import AppSiteGen from './components/AppSiteGen'; import { HashRouter } from 'react-router-dom'; import { dispatch } from '@wordpress/data'; diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index b92bb1b7f..caf1c7384 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -40,9 +40,13 @@ @import "../components/Sidebar/components/LearnMore/Skeleton/stylesheet"; @import "../components/Animate/stylesheet"; @import "../components/NewfoldInterfaceSkeleton/style"; +@import "../components/SiteGenInterfaceSkeleton/style"; @import "../components/Loaders/Chapter/Interstitial/stylesheet"; @import "../components/Grid/stylesheet"; @import "../components/ComingSoon/stylesheet"; +@import "../components/AdminBarSiteGen/stylesheet"; +@import "../components/ProgressBarSiteGen/stylesheet"; +@import "../components/ToggleDarkMode/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; From c491ebba6dac0715fa6e4d1464c69c3d4f846709 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Wed, 18 Oct 2023 12:30:45 +0530 Subject: [PATCH 04/30] PRESS2-1233 | added a step --- src/OnboardingSPA/chapters/demographic.js | 2 + src/OnboardingSPA/components/Content/index.js | 1 + .../SiteGenInterfaceSkeleton/style.scss | 6 +++ .../components/ToggleDarkMode/stylesheet.scss | 1 + .../steps/SiteGenGetStarted/contents.js | 13 +++++++ .../steps/SiteGenGetStarted/index.js | 39 +++++++++++++++++++ .../steps/SiteGenGetStarted/step.js | 14 +++++++ .../steps/SiteGenGetStarted/stylesheet.scss | 1 + 8 files changed, 77 insertions(+) create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/contents.js create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/index.js create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/step.js create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss diff --git a/src/OnboardingSPA/chapters/demographic.js b/src/OnboardingSPA/chapters/demographic.js index e1f226ef1..8869797a3 100644 --- a/src/OnboardingSPA/chapters/demographic.js +++ b/src/OnboardingSPA/chapters/demographic.js @@ -6,6 +6,7 @@ import { stepExperience } from '../steps/GetStarted/GetStartedExperience/step'; import { stepPrimarySetup } from '../steps/GetStarted/SiteTypeSetup/PrimarySite/step'; import { stepSecondarySetup } from '../steps/GetStarted/SiteTypeSetup/SecondarySite/step'; import { stepTopPriority } from '../steps/TopPriority/step'; +import { stepSiteGenGetStarted } from '../steps/SiteGenGetStarted/step'; import { Chapter } from '../data/models/Chapter'; import { Step } from '../data/models/Step'; import ChapterInterstitialLoader from '../components/Loaders/Chapter/Interstitial'; @@ -22,6 +23,7 @@ const steps = [ stepSecondarySetup, stepBasicInfo, stepTopPriority, + stepSiteGenGetStarted, ]; export const demographic = new Chapter( { diff --git a/src/OnboardingSPA/components/Content/index.js b/src/OnboardingSPA/components/Content/index.js index 46a050b79..818d59c42 100644 --- a/src/OnboardingSPA/components/Content/index.js +++ b/src/OnboardingSPA/components/Content/index.js @@ -19,6 +19,7 @@ const Content = () => { } ); const getMappedPages = useCallback( () => { + debugger; return routes?.map( ( route ) => ( { + return { + heading: __( 'AI Website Creator for wordpress', 'wp-module-onboarding' ), + subheading: __( + "Tell our engine what kind of site to make", + 'wp-module-onboarding' + ) + }; +}; + +export default getContents; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js new file mode 100644 index 000000000..bc4570556 --- /dev/null +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js @@ -0,0 +1,39 @@ +import { __ } from '@wordpress/i18n'; +import { useViewportMatch } from '@wordpress/compose'; +import { useEffect } from '@wordpress/element'; +import { useDispatch } from '@wordpress/data'; + +import { store as nfdOnboardingStore } from '../../store'; +import CommonLayout from '../../components/Layouts/Common'; +import HeadingWithSubHeading from '../../components/HeadingWithSubHeading'; +import getContents from './contents'; + +const StepSiteGenGetStarted = () => { + + const isLargeViewport = useViewportMatch( 'medium' ); + + const { + setIsDrawerOpened, + setIsHeaderNavigationEnabled, + } = useDispatch( nfdOnboardingStore ); + + useEffect( () => { + if ( isLargeViewport ) { + setIsDrawerOpened( true ); + } + setIsHeaderNavigationEnabled( true ); + }, [] ); + + const content = getContents(); + + return ( + + + + ); +}; + +export default StepSiteGenGetStarted; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/step.js b/src/OnboardingSPA/steps/SiteGenGetStarted/step.js new file mode 100644 index 000000000..a08100af3 --- /dev/null +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/step.js @@ -0,0 +1,14 @@ +import { lazy } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Step } from '../../data/models/Step'; +import { navigation } from '@wordpress/icons'; + +const StepSiteGenGetStarted = lazy( () => import( './index' ) ); + +export const stepSiteGenGetStarted = new Step( { + path: '/wp-setup/step/sitegen-get-started', + title: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), + tooltipText: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), + Component: StepSiteGenGetStarted, + icon: navigation, +} ); diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss @@ -0,0 +1 @@ + From 7203e70f26210c223a1f13d26b484ff3615baded Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Thu, 19 Oct 2023 03:05:30 +0530 Subject: [PATCH 05/30] PRESS2-1233 --- .../components/AdminBarSiteGen/index.js | 27 +- .../AdminBarSiteGen/stylesheet.scss | 38 ++- .../components/AppSiteGen/index.js | 255 +----------------- .../components/HeaderSiteGen/index.js | 17 ++ .../HeaderSiteGen/step-navigation.js | 151 +++++++++++ .../components/HeaderSiteGen/stylesheet.scss | 112 ++++++++ src/OnboardingSPA/styles/app.scss | 1 + 7 files changed, 329 insertions(+), 272 deletions(-) create mode 100644 src/OnboardingSPA/components/HeaderSiteGen/index.js create mode 100644 src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js create mode 100644 src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js index 1f3c89479..d17843e8a 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -1,19 +1,22 @@ import { __ } from '@wordpress/i18n'; +import { Icon, wordpress } from '@wordpress/icons'; const AdminBarSiteGen = ({ }) => { - return ( - ( -
-
- WordPress -
-
- Howdy, Maya Jiménez -
-
- ) - ); + return ( + ( +
+
+ + WordPress +
+
+ Howdy, Maya Jiménez + +
+
+ ) + ); }; export default AdminBarSiteGen; \ No newline at end of file diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss index 876b2f3d6..795a7a164 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -1,22 +1,38 @@ .nfd-interface-interface-skeleton__adminbar{ - .nfd-admin-bar-sitegen{ + .nfd-sitegen-admin-bar{ padding: 5px; background-color: #23282d; // Dark grayish background display: flex; justify-content: space-between; + align-items: center; - .nfd-admin-bar-logo { - color: #a0a5aa; // Logo color - font-size: 20px; - font-weight: bold; - } - - .nfd-admin-bar-greeting { - color: #a0a5aa; // Text color - font-size: 16px; - } + .nfd-admin-bar-wplogo { + color: white; // Logo color + font-size: 16px; + display: flex; + align-items: center; + + svg { + color: #a0a5aa; + fill: #a0a5aa; + } + + span { + margin-left: 15px; + } + } + .nfd-sitegen-admin-bar-profile{ + display: flex; + align-items: center; + + .nfd-admin-bar-greeting { + color: #a0a5aa; // Text color + font-size: 16px; + margin-right: 5px; + } + } } } \ No newline at end of file diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/OnboardingSPA/components/AppSiteGen/index.js index d16c96722..a9fb04a9f 100644 --- a/src/OnboardingSPA/components/AppSiteGen/index.js +++ b/src/OnboardingSPA/components/AppSiteGen/index.js @@ -1,45 +1,23 @@ import Content from '../Content'; -import Header from '../Header'; -import Drawer from '../Drawer'; +import Header from '../HeaderSiteGen'; import ToggleDarkMode from '../ToggleDarkMode'; import AdminBarSiteGen from '../AdminBarSiteGen'; import ProgressBarSiteGen from '../ProgressBarSiteGen'; import classNames from 'classnames'; import { useLocation } from 'react-router-dom'; -import { setFlow } from '../../utils/api/flow'; -import { design as designChapter } from '../../chapters/design'; -import { getSettings, setSettings } from '../../utils/api/settings'; -import { isEmpty, updateWPSettings } from '../../utils/api/ecommerce'; -import { store as nfdOnboardingStore } from '../../store'; +import { store as nfdOnboardingStore } from '../../store'; // eslint-disable-next-line import/no-extraneous-dependencies import { kebabCase } from 'lodash'; import { useViewportMatch } from '@wordpress/compose'; import { useDispatch, useSelect } from '@wordpress/data'; import { SlotFillProvider } from '@wordpress/components'; -import { useEffect, Fragment, useState } from '@wordpress/element'; +import { useEffect, Fragment } from '@wordpress/element'; import { FullscreenMode } from '@wordpress/interface'; -import { API_REQUEST } from '../../../constants'; import SiteGenInterfaceSkeleton from '../SiteGenInterfaceSkeleton'; -import { HiiveAnalytics } from '@newfold-labs/js-utility-ui-analytics'; -import { - OnboardingEvent, - trackOnboardingEvent, -} from '../../utils/analytics/hiive'; -import { injectInAllSteps } from '../../data/flows/utils'; -import { - ACTION_FEATURE_ADDED, - ACTION_LOGO_ADDED, - ACTION_SITE_TITLE_SET, - ACTION_SOCIAL_ADDED, - ACTION_STARTER_PAGES_SELECTED, - ACTION_TAGLINE_SET, - CATEGORY, -} from '../../utils/analytics/hiive/constants'; -import { socialMediaStoreToState } from '../SocialMediaForm/utils'; /** - * Primary app that renders the . + * Primary app that renders the . * * Is a child of the hash router and error boundary. * @@ -54,251 +32,30 @@ const AppSiteGen = () => { isDrawerOpen, newfoldBrand, onboardingFlow, - currentData, - socialData, - firstStep, - allSteps, } = useSelect( ( select ) => { return { - isDrawerOpen: select( nfdOnboardingStore ).isDrawerOpened(), newfoldBrand: select( nfdOnboardingStore ).getNewfoldBrand(), onboardingFlow: select( nfdOnboardingStore ).getOnboardingFlow(), currentData: select( nfdOnboardingStore ).getCurrentOnboardingData(), - socialData: - select( nfdOnboardingStore ).getOnboardingSocialData(), - firstStep: select( nfdOnboardingStore ).getFirstStep(), allSteps: select( nfdOnboardingStore ).getAllSteps(), }; }, [ location.pathname ] ); - const [ isRequestPlaced, setIsRequestPlaced ] = useState( false ); - const [ didVisitBasicInfo, setDidVisitBasicInfo ] = useState( false ); - const [ didVisitEcommerce, setDidVisitEcommerce ] = useState( false ); const { setActiveStep, setActiveFlow, - updateAllSteps, - flushQueue, - enqueueRequest, - setOnboardingSocialData, - setCurrentOnboardingData, } = useDispatch( nfdOnboardingStore ); - async function syncSocialSettings() { - const initialData = await getSettings(); - const result = await setSettings( socialData ); - setDidVisitBasicInfo( false ); - if ( result?.error !== null ) { - return initialData?.body; - } - return result?.body; - } - - async function syncStoreDetails() { - const { address } = currentData.storeDetails; - let payload = {}; - if ( address !== undefined ) { - delete address.country; - delete address.state; - payload = address; - } - // if ( tax !== undefined ) { - // delete tax.option; - // delete tax.isStoreDetailsFilled; - // payload = { ...payload, ...tax }; - // } - if ( ! isEmpty( payload ) ) { - await updateWPSettings( payload ); - } - delete currentData.storeDetails.address; - delete currentData.storeDetails.tax; - setDidVisitEcommerce( false ); - } - - async function syncStoreToDB() { - // The First Welcome Step doesn't have any Store changes - const isFirstStep = location?.pathname === firstStep?.path; - if ( currentData && ! isFirstStep ) { - if ( ! isRequestPlaced ) { - setIsRequestPlaced( true ); - - if ( didVisitEcommerce ) { - await syncStoreDetails(); - } - - // If Social Data is changed then sync it - if ( didVisitBasicInfo ) { - const socialDataResp = await syncSocialSettings(); - - // If Social Data is changed then Sync that also to the store - if ( socialDataResp ) { - setOnboardingSocialData( socialDataResp ); - } - } - flushQueue(); - enqueueRequest( API_REQUEST.SET_FLOW, () => - setFlow( currentData ) - ); - setIsRequestPlaced( false ); - } - } - - // Check if the Basic Info page was visited - if ( location?.pathname.includes( 'basic-info' ) ) { - setDidVisitBasicInfo( true ); - } - if ( location?.pathname.includes( 'ecommerce' ) ) { - setDidVisitEcommerce( true ); - } - } - - function handleConditionalDesignStepsRoutes() { - if ( - location?.pathname.includes( 'colors' ) || - location?.pathname.includes( 'fonts' ) - ) { - const updates = injectInAllSteps( - allSteps, - designChapter.conditionalSteps - ); - updateAllSteps( updates.allSteps ); - if ( ! currentData.data.customDesign ) { - currentData.data.customDesign = true; - setCurrentOnboardingData( currentData ); - } - } - } - - const handlePreviousStepTracking = () => { - const previousStep = window.nfdOnboarding?.previousStep; - if ( typeof previousStep !== 'object' ) { - window.nfdOnboarding.previousStep = { - path: location.pathname, - url: window.location.href, - }; - HiiveAnalytics.dispatchEvents( CATEGORY ); - return; - } - - const previousStepPath = previousStep.path; - const previousStepURL = previousStep.url; - - if ( previousStepPath.includes( 'basic-info' ) ) { - const siteTitle = currentData.data.blogName; - const siteDescription = currentData.data.blogDescription; - const siteLogo = currentData.data.siteLogo.url; - if ( siteTitle ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_SITE_TITLE_SET, - siteTitle, - {}, - previousStepURL - ) - ); - } - - if ( siteDescription ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_TAGLINE_SET, - siteDescription, - {}, - previousStepURL - ) - ); - } - - if ( siteLogo ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_LOGO_ADDED, - undefined, - {}, - previousStepURL - ) - ); - } - - const platforms = Object.keys( - socialMediaStoreToState( socialData ) - ).join( ',' ); - if ( platforms ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_SOCIAL_ADDED, - platforms, - {}, - previousStepURL - ) - ); - } - } - - if ( previousStepPath.includes( 'site-pages' ) ) { - const sitePages = currentData.data.sitePages?.other; - if ( ! sitePages || false === sitePages ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_STARTER_PAGES_SELECTED, - [], - { - count: 0, - }, - previousStepURL - ) - ); - } else { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_STARTER_PAGES_SELECTED, - sitePages.map( ( sitePage ) => sitePage.title ), - { - count: sitePages.length, - }, - previousStepURL - ) - ); - } - } - - if ( previousStepPath.includes( 'site-features' ) ) { - const siteFeatures = currentData.data.siteFeatures; - for ( const siteFeature in siteFeatures ) { - if ( false !== siteFeatures[ siteFeature ] ) { - trackOnboardingEvent( - new OnboardingEvent( - ACTION_FEATURE_ADDED, - siteFeature, - {}, - previousStepURL - ) - ); - } - } - } - - window.nfdOnboarding.previousStep = { - path: location.pathname, - url: window.location.href, - }; - - HiiveAnalytics.dispatchEvents( CATEGORY ); - }; - useEffect( () => { document.body.classList.add( `nfd-brand-${ newfoldBrand }` ); }, [ newfoldBrand ] ); useEffect( () => { - syncStoreToDB(); - handlePreviousStepTracking(); - handleConditionalDesignStepsRoutes(); if ( location.pathname.includes( '/step' ) ) { setActiveFlow( onboardingFlow ); setActiveStep( location.pathname ); @@ -319,9 +76,9 @@ const AppSiteGen = () => { { 'is-large-viewport': isLargeViewport }, { 'is-small-viewport': ! isLargeViewport } ) } - header={
} adminbar={ } - progressbar={ } + progressbar={ } + header={
} content={ } darkModeToggle = { } /> diff --git a/src/OnboardingSPA/components/HeaderSiteGen/index.js b/src/OnboardingSPA/components/HeaderSiteGen/index.js new file mode 100644 index 000000000..a4fe14994 --- /dev/null +++ b/src/OnboardingSPA/components/HeaderSiteGen/index.js @@ -0,0 +1,17 @@ +import { memo } from '@wordpress/element'; + +import StepNavigation from './step-navigation'; +/** + * Interface header rendered into header render prop in . + * + * @return {WPComponent} Header + */ +const Header = () => { + return ( +
+ +
+ ); +}; + +export default memo( Header ); diff --git a/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js b/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js new file mode 100644 index 000000000..9e8371a23 --- /dev/null +++ b/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js @@ -0,0 +1,151 @@ +import { useSelect, useDispatch } from '@wordpress/data'; +import { useNavigate } from 'react-router-dom'; +import { Button, ButtonGroup } from '@wordpress/components'; +import { Icon, chevronLeft, chevronRight } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; + +import { setFlow } from '../../utils/api/flow'; +import { store as nfdOnboardingStore } from '../../store'; +import { pluginDashboardPage } from '../../../constants'; +import { activateInitialPlugins } from '../../utils/api/plugins'; +import { + OnboardingEvent, + sendOnboardingEvent, +} from '../../utils/analytics/hiive'; +import { ACTION_ONBOARDING_COMPLETE } from '../../utils/analytics/hiive/constants'; + +/** + * Back step Navigation button. + * + * @param {*} param0 + * + * @return {WPComponent} Back Component + */ +const Back = ( { path, showErrorDialog } ) => { + const { setNavErrorContinuePath } = useDispatch( nfdOnboardingStore ); + const navigate = useNavigate(); + const navigateBack = () => { + if ( showErrorDialog !== false ) { + setNavErrorContinuePath( path ); + } else { + navigate( path, { state: { origin: 'header' } } ); + } + }; + return ( + + ); +}; + +/** + * Next step naigation button + * + * @param {*} param0 + * + * @return {WPComponent} Next Component + */ +const Next = ( { path, showErrorDialog } ) => { + const { setNavErrorContinuePath } = useDispatch( nfdOnboardingStore ); + /* [TODO]: some sense of isStepComplete to enable/disable */ + const navigate = useNavigate(); + const navigateNext = () => { + if ( showErrorDialog !== false ) { + setNavErrorContinuePath( path ); + } else { + navigate( path, { state: { origin: 'header' } } ); + } + }; + return ( + + ); +}; + +async function saveDataAndExit( currentData ) { + if ( currentData ) { + currentData.isComplete = new Date().getTime(); + setFlow( currentData ); + } + + activateInitialPlugins(); + sendOnboardingEvent( new OnboardingEvent( ACTION_ONBOARDING_COMPLETE ) ); + window.location.replace( pluginDashboardPage ); +} + +/** + * Finish step navigation button. + * + * @param {*} param0 + * + * @return {WPComponent} Finish Component + */ +const Finish = ( { currentData, saveDataAndExitFunc } ) => ( + +); + +/** + * Step buttons presented in Header. + * + * @return {WPComponent} StepNavigation Component + */ +const StepNavigation = () => { + const { previousStep, nextStep, currentData, showErrorDialog } = useSelect( + ( select ) => { + return { + nextStep: select( nfdOnboardingStore ).getNextStep(), + previousStep: select( nfdOnboardingStore ).getPreviousStep(), + currentData: + select( nfdOnboardingStore ).getCurrentOnboardingData(), + showErrorDialog: + select( nfdOnboardingStore ).getShowErrorDialog(), + }; + }, + [] + ); + const isFirstStep = null === previousStep || false === previousStep; + const isLastStep = null === nextStep || false === nextStep; + return ( +
+ + { isFirstStep || isLastStep ? null : ( + + ) } + { isLastStep ? ( + + ) : ( + + ) } + +
+ ); +}; + +export default StepNavigation; diff --git a/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss b/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss new file mode 100644 index 000000000..380bd3d66 --- /dev/null +++ b/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss @@ -0,0 +1,112 @@ +.nfd-onboarding-header { + align-items: center; + background-color: var(--nfd-onboarding-header-base); + color: var(--nfd-onboarding-header-contrast); + + h2, + h3, + h4 { + color: var(--nfd-onboarding-header-contrast); + } + display: flex; + height: 60px; + box-sizing: border-box; + width: 100%; + justify-content: space-between; + + padding-right: $grid-unit-20; + + body.is-fullscreen-mode & { + padding-left: 25px; + transition: padding-left 20ms linear; + transition-delay: 80ms; + + @include reduce-motion("transition"); + } + + &__start, + &__end { + display: flex; + } + + &__start { + align-items: center; + margin-left: $grid-unit-20; + } + + &__center { + display: flex; + align-items: center; + height: 100%; + flex-grow: 1; + justify-content: center; + min-width: 5px; + font-weight: 600; + font-size: 20px; + line-height: $grid-unit-30; + + svg { + margin-right: $grid-unit-10; + } + } + + &__end { + justify-content: flex-end; + } + + &__step-navigation { + display: flex; + column-gap: $grid-unit-10; + } + + &__step-progress { + + &:-webkit-progress-inner-element { + background-color: #999; + } + + &:-moz-progress-bar, + &:-webkit-progress-bar { + background-color: var(--nfd-onboarding-primary); + } + } +} + +.nfd-onboarding-skeleton.is-drawer-open { + + .nfd-onboarding-header { + padding-left: 0; + transition: padding-left 20ms linear; + transition-delay: 0ms; + + @include reduce-motion("transition"); + } +} + +.navigation-buttons { + font-size: 14px; + line-height: 40px; + align-items: center; + letter-spacing: 0.8px; + display: flex !important; + justify-content: space-evenly; + border-radius: 2px !important; + padding: 20px 14px !important; + + &_back { + padding-right: 22px !important; + } + + &_next { + padding-left: 22px !important; + } + + &_finish { + padding-left: 22px !important; + } + + @media screen and (max-width: #{ ($break-medium) }) { + font-size: 13px; + padding: 15px 10px !important; + } +} diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index caf1c7384..ce2760165 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -47,6 +47,7 @@ @import "../components/AdminBarSiteGen/stylesheet"; @import "../components/ProgressBarSiteGen/stylesheet"; @import "../components/ToggleDarkMode/stylesheet"; +@import "../components/HeaderSiteGen/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; From f5c16db35f974456165c0215cdc9455ba28cfef5 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Thu, 19 Oct 2023 03:12:33 +0530 Subject: [PATCH 06/30] PRESS2-1233 --- .../SiteGenInterfaceSkeleton/index.js | 1 + .../SiteGenInterfaceSkeleton/style.scss | 264 +++++++++--------- 2 files changed, 133 insertions(+), 132 deletions(-) diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js index d9beed47f..d1a35d3b7 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -70,6 +70,7 @@ function SiteGenInterfaceSkeleton( className={ classnames( className, 'nfd-interface-interface-skeleton', + 'nfd-sitegen-interface-skeleton', navigateRegionsProps.className, !! footer && 'has-footer' ) } diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss index b7be9bbec..affa3f8f9 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -33,161 +33,161 @@ html.nfd-interface-interface-skeleton__html-container { } } -.nfd-interface-interface-skeleton__editor { - display: flex; - flex-direction: column; - flex: 0 1 100%; - overflow: hidden; -} - -@include editor-left(".nfd-interface-interface-skeleton"); +.nfd-sitegen-interface-skeleton { + .nfd-interface-interface-skeleton__editor { + display: flex; + flex-direction: column; + flex: 0 1 100%; + overflow: hidden; + } -.nfd-interface-interface-skeleton__body { - flex-grow: 1; - display: flex; - flex-direction: column; - - // Even on Mobile, we choose to scroll this element on its own. - // This helps enable a fixed-to-top toolbar that makes the editing experience - // on Mobile Safari usable. - // Unfortunately an issue still exists where if you swipe the top toolbar - // or beyond the bottom of the page when the soft keyboard is showing, - // you scroll the body element and can scroll the toolbar out of view. - // This is still preferable, though, as it allows the editor - // to function at all. - overflow: auto; - - // In future versions of Mobile Safari, hopefully overscroll-behavior - // to be supported. - // This allows us to disallow the scroll-chaining and rubber-banding - // that is currently is the cause of the issue outlined above. - // In other words, the following behavior doesn't yet work in Safari, - // but if/when it is added, it should take care of the issue. - // See also: https://drafts.csswg.org/css-overscroll/ - overscroll-behavior-y: none; - background: linear-gradient( - to bottom left, - #110c2d, - #39122a, - #060918 - ); - - // Footer overlap prevention - .has-footer & { + @include editor-left(".nfd-interface-interface-skeleton"); - @media (max-width: #{($break-medium)}) { - padding-bottom: 24px + 1px; + .nfd-interface-interface-skeleton__body { + flex-grow: 1; + display: flex; + flex-direction: column; + + // Even on Mobile, we choose to scroll this element on its own. + // This helps enable a fixed-to-top toolbar that makes the editing experience + // on Mobile Safari usable. + // Unfortunately an issue still exists where if you swipe the top toolbar + // or beyond the bottom of the page when the soft keyboard is showing, + // you scroll the body element and can scroll the toolbar out of view. + // This is still preferable, though, as it allows the editor + // to function at all. + overflow: auto; + + // In future versions of Mobile Safari, hopefully overscroll-behavior + // to be supported. + // This allows us to disallow the scroll-chaining and rubber-banding + // that is currently is the cause of the issue outlined above. + // In other words, the following behavior doesn't yet work in Safari, + // but if/when it is added, it should take care of the issue. + // See also: https://drafts.csswg.org/css-overscroll/ + overscroll-behavior-y: none; + background: linear-gradient(to bottom left, + #110c2d, + #39122a, + #060918); + + // Footer overlap prevention + .has-footer & { + + @media (max-width: #{($break-medium)}) { + padding-bottom: 24px + 1px; + } } } -} -.nfd-interface-interface-skeleton__content { - flex-grow: 1; + .nfd-interface-interface-skeleton__content { + flex-grow: 1; - // Treat as flex container to allow children to grow to occupy full - // available height of the content area. - display: flex; - flex-direction: column; + // Treat as flex container to allow children to grow to occupy full + // available height of the content area. + display: flex; + flex-direction: column; - // On Mobile the header is fixed to keep HTML as scrollable. - // Beyond the medium breakpoint, we allow the sidebar. - // The sidebar should scroll independently, so enable scroll here also. - overflow: auto; + // On Mobile the header is fixed to keep HTML as scrollable. + // Beyond the medium breakpoint, we allow the sidebar. + // The sidebar should scroll independently, so enable scroll here also. + overflow: auto; - // On Safari iOS on smaller viewports lack of a z-index causes the background - // to "bleed" through the header. - // See https://github.com/WordPress/gutenberg/issues/32631 - z-index: 20; + // On Safari iOS on smaller viewports lack of a z-index causes the background + // to "bleed" through the header. + // See https://github.com/WordPress/gutenberg/issues/32631 + z-index: 20; -} + } -.nfd-interface-interface-skeleton__secondary-sidebar, -.nfd-interface-interface-skeleton__sidebar { - display: block; - flex-shrink: 0; - position: relative; - z-index: 100000; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: var(--nfd-onboarding-light); - color: #1e1e1e; + .nfd-interface-interface-skeleton__secondary-sidebar, + .nfd-interface-interface-skeleton__sidebar { + display: block; + flex-shrink: 0; + position: relative; + z-index: 100000; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: var(--nfd-onboarding-light); + color: #1e1e1e; - // On Mobile the header is fixed to keep HTML as scrollable. - @media (max-width: #{($break-medium)}) { - position: relative !important; - z-index: 90; - width: auto; // Keep the sidebar width flexible. + // On Mobile the header is fixed to keep HTML as scrollable. + @media (max-width: #{($break-medium)}) { + position: relative !important; + z-index: 90; + width: auto; // Keep the sidebar width flexible. + } } -} -.nfd-interface-interface-skeleton__sidebar { - overflow: auto; - border-left: 1px solid #e0e0e0; - - @media (max-width: #{($break-medium)}) { + .nfd-interface-interface-skeleton__sidebar { + overflow: auto; border-left: 1px solid #e0e0e0; + + @media (max-width: #{($break-medium)}) { + border-left: 1px solid #e0e0e0; + } } -} -.nfd-interface-interface-skeleton__secondary-sidebar { + .nfd-interface-interface-skeleton__secondary-sidebar { - @media (max-width: #{($break-medium)}) { - border-right: 1px solid #e0e0e0; + @media (max-width: #{($break-medium)}) { + border-right: 1px solid #e0e0e0; + } } -} -.nfd-interface-interface-skeleton__header { - flex-shrink: 0; - height: auto; // Keep the height flexible. - border-bottom: 1px solid #e0e0e0; - z-index: 30; - color: #1e1e1e; -} + .nfd-interface-interface-skeleton__header { + flex-shrink: 0; + height: auto; // Keep the height flexible. + border-bottom: 1px solid #e0e0e0; + z-index: 30; + color: #1e1e1e; + } -.nfd-interface-interface-skeleton__footer { - height: auto; // Keep the height flexible. - flex-shrink: 0; - border-top: 1px solid #e0e0e0; - color: #1e1e1e; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - background-color: var(--nfd-onboarding-light); - z-index: 90; + .nfd-interface-interface-skeleton__footer { + height: auto; // Keep the height flexible. + flex-shrink: 0; + border-top: 1px solid #e0e0e0; + color: #1e1e1e; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background-color: var(--nfd-onboarding-light); + z-index: 90; - // On Mobile the footer is hidden - display: none; + // On Mobile the footer is hidden + display: none; - @media (max-width: #{($break-medium)}) { - display: flex; - } + @media (max-width: #{($break-medium)}) { + display: flex; + } - .block-editor-block-breadcrumb { - z-index: 30; - display: flex; - background: var(--nfd-onboarding-light); - height: 24px; - align-items: center; - font-size: 13px; - padding: 0 (12px + 6px); + .block-editor-block-breadcrumb { + z-index: 30; + display: flex; + background: var(--nfd-onboarding-light); + height: 24px; + align-items: center; + font-size: 13px; + padding: 0 (12px + 6px); + } } -} - -.nfd-interface-interface-skeleton__actions { - z-index: 100000; - position: fixed !important; // Need to override the default relative positioning - top: -9999em; - bottom: auto; - left: auto; - right: 0; - width: 280px; - color: #1e1e1e; - &:focus { - top: auto; - bottom: 0; + .nfd-interface-interface-skeleton__actions { + z-index: 100000; + position: fixed !important; // Need to override the default relative positioning + top: -9999em; + bottom: auto; + left: auto; + right: 0; + width: 280px; + color: #1e1e1e; + + &:focus { + top: auto; + bottom: 0; + } } -} +} \ No newline at end of file From b13edd53f73ed769ab39abdec96760bac4e80e41 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 20 Oct 2023 10:31:32 +0530 Subject: [PATCH 07/30] PRESS2-1233 fixed linting issues --- .../components/AdminBarSiteGen/index.js | 36 ++++++----- .../AdminBarSiteGen/stylesheet.scss | 63 +++++++++---------- .../components/AppSiteGen/index.js | 24 ++----- src/OnboardingSPA/components/Content/index.js | 1 - .../components/HeaderSiteGen/index.js | 8 +-- .../components/NavigationBarSiteGen/index.js | 15 ----- .../NavigationBarSiteGen/stylesheet.scss | 2 - .../components/ProgressBarSiteGen/index.js | 28 ++++----- .../ProgressBarSiteGen/stylesheet.scss | 30 ++++----- .../SiteGenInterfaceSkeleton/index.js | 34 +++++----- .../SiteGenInterfaceSkeleton/style.scss | 8 +-- .../components/ToggleDarkMode/index.js | 28 ++++----- .../components/ToggleDarkMode/stylesheet.scss | 6 +- src/OnboardingSPA/index.js | 2 +- .../steps/SiteGenGetStarted/contents.js | 9 ++- .../steps/SiteGenGetStarted/index.js | 8 +-- .../steps/SiteGenGetStarted/stylesheet.scss | 1 - 17 files changed, 134 insertions(+), 169 deletions(-) delete mode 100644 src/OnboardingSPA/components/NavigationBarSiteGen/index.js delete mode 100644 src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js index d17843e8a..8f2da8296 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -1,22 +1,30 @@ import { __ } from '@wordpress/i18n'; import { Icon, wordpress } from '@wordpress/icons'; -const AdminBarSiteGen = ({ }) => { - +const AdminBarSiteGen = ( {} ) => { return ( - ( -
-
- - WordPress -
-
- Howdy, Maya Jiménez - -
+
+
+ + { __( 'WordPress', 'wp-module-onboarding' ) } +
+
+ + Howdy, Maya Jiménez + +
- ) +
); }; -export default AdminBarSiteGen; \ No newline at end of file +export default AdminBarSiteGen; diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss index 795a7a164..575b6176e 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -1,38 +1,37 @@ +.nfd-interface-interface-skeleton__adminbar { -.nfd-interface-interface-skeleton__adminbar{ - - .nfd-sitegen-admin-bar{ - padding: 5px; - background-color: #23282d; // Dark grayish background - display: flex; - justify-content: space-between; + .nfd-sitegen-admin-bar { + padding: 5px; + background-color: #23282d; // Dark grayish background + display: flex; + justify-content: space-between; align-items: center; - - + .nfd-admin-bar-wplogo { - color: white; // Logo color - font-size: 16px; - display: flex; - align-items: center; - - svg { - color: #a0a5aa; - fill: #a0a5aa; - } - - span { - margin-left: 15px; - } + color: #fff; // Logo color + font-size: 16px; + display: flex; + align-items: center; + + svg { + color: #a0a5aa; + fill: #a0a5aa; } - .nfd-sitegen-admin-bar-profile{ - display: flex; - align-items: center; - .nfd-admin-bar-greeting { - color: #a0a5aa; // Text color - font-size: 16px; - margin-right: 5px; - } + span { + margin-left: 15px; + } + } + + .nfd-sitegen-admin-bar-profile { + display: flex; + align-items: center; + + .nfd-admin-bar-greeting { + color: #a0a5aa; // Text color + font-size: 16px; + margin-right: 5px; } - } -} \ No newline at end of file + } + } +} diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/OnboardingSPA/components/AppSiteGen/index.js index a9fb04a9f..00341e529 100644 --- a/src/OnboardingSPA/components/AppSiteGen/index.js +++ b/src/OnboardingSPA/components/AppSiteGen/index.js @@ -16,23 +16,12 @@ import { useEffect, Fragment } from '@wordpress/element'; import { FullscreenMode } from '@wordpress/interface'; import SiteGenInterfaceSkeleton from '../SiteGenInterfaceSkeleton'; -/** - * Primary app that renders the . - * - * Is a child of the hash router and error boundary. - * - * @return {WPComponent} App Component - */ const AppSiteGen = () => { const location = useLocation(); const isLargeViewport = useViewportMatch( 'medium' ); const pathname = kebabCase( location.pathname ); - const { - isDrawerOpen, - newfoldBrand, - onboardingFlow, - } = useSelect( + const { isDrawerOpen, newfoldBrand, onboardingFlow } = useSelect( ( select ) => { return { newfoldBrand: select( nfdOnboardingStore ).getNewfoldBrand(), @@ -46,10 +35,7 @@ const AppSiteGen = () => { [ location.pathname ] ); - const { - setActiveStep, - setActiveFlow, - } = useDispatch( nfdOnboardingStore ); + const { setActiveStep, setActiveFlow } = useDispatch( nfdOnboardingStore ); useEffect( () => { document.body.classList.add( `nfd-brand-${ newfoldBrand }` ); @@ -77,10 +63,12 @@ const AppSiteGen = () => { { 'is-small-viewport': ! isLargeViewport } ) } adminbar={ } - progressbar={ } + progressbar={ + + } header={
} content={ } - darkModeToggle = { } + darkModeToggle={ } /> diff --git a/src/OnboardingSPA/components/Content/index.js b/src/OnboardingSPA/components/Content/index.js index 818d59c42..46a050b79 100644 --- a/src/OnboardingSPA/components/Content/index.js +++ b/src/OnboardingSPA/components/Content/index.js @@ -19,7 +19,6 @@ const Content = () => { } ); const getMappedPages = useCallback( () => { - debugger; return routes?.map( ( route ) => ( . - * - * @return {WPComponent} Header - */ + const Header = () => { return (
- +
); }; diff --git a/src/OnboardingSPA/components/NavigationBarSiteGen/index.js b/src/OnboardingSPA/components/NavigationBarSiteGen/index.js deleted file mode 100644 index 899f4bfef..000000000 --- a/src/OnboardingSPA/components/NavigationBarSiteGen/index.js +++ /dev/null @@ -1,15 +0,0 @@ - -import { __ } from '@wordpress/i18n'; - -const NavigationBarSiteGen = ( {} ) => { - - return ( - ( -
-

Navigation Bar area

-
- ) - ); -}; - -export default NavigationBarSiteGen; diff --git a/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss deleted file mode 100644 index 766711eee..000000000 --- a/src/OnboardingSPA/components/NavigationBarSiteGen/stylesheet.scss +++ /dev/null @@ -1,2 +0,0 @@ -.nfd-admin-bar-site-gen{ -} diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js index 2da8a9320..c769113dd 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/index.js @@ -1,19 +1,15 @@ -import { __ } from '@wordpress/i18n'; - -const ProgressBarSiteGen = ( { current, total } ) => { - const percentage = (current / total) * 100; - return ( - ( -
-
-
-
-
- ) - ); +const ProgressBarSiteGen = ( { current, total } ) => { + const percentage = ( current / total ) * 100; + return ( +
+
+
+
+
+ ); }; export default ProgressBarSiteGen; diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss index f5ea73cec..888d1c536 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -1,16 +1,16 @@ -.nfd-progress-bar-site-gen{ - width: 100%; +.nfd-progress-bar-site-gen { + width: 100%; - .nfd-progress-bar-container { - background-color: #32373e; - height: 15px; - width: 100%; - border-radius: 0px; - overflow: hidden; - } - - .nfd-progress-bar-fill { - background-color: #3620f8; /* WordPress blue */ - height: 100%; - } -} \ No newline at end of file + .nfd-progress-bar-container { + background-color: #32373e; + height: 15px; + width: 100%; + border-radius: 0; + overflow: hidden; + } + + .nfd-progress-bar-fill { + background-color: #3620f8; + height: 100%; + } +} diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js index d1a35d3b7..d05d09438 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -107,49 +107,49 @@ function SiteGenInterfaceSkeleton(
) }
- {!!header && ( + { !! header && (
- {header} + { header }
- )} - {!!notices && ( + ) } + { !! notices && (
- {notices} + { notices }
- )} + ) }
- {content} + { content }
- {!!actions && ( + { !! actions && (
- {actions} + { actions }
- )} - {!!darkModeToggle && ( + ) } + { !! darkModeToggle && (
- {darkModeToggle} + { darkModeToggle }
- )} + ) }
{ !! footer && ( diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss index affa3f8f9..42c91b7b9 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -34,6 +34,7 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-sitegen-interface-skeleton { + .nfd-interface-interface-skeleton__editor { display: flex; flex-direction: column; @@ -66,10 +67,7 @@ html.nfd-interface-interface-skeleton__html-container { // but if/when it is added, it should take care of the issue. // See also: https://drafts.csswg.org/css-overscroll/ overscroll-behavior-y: none; - background: linear-gradient(to bottom left, - #110c2d, - #39122a, - #060918); + background: linear-gradient(to bottom left, #110c2d, #39122a, #060918); // Footer overlap prevention .has-footer & { @@ -190,4 +188,4 @@ html.nfd-interface-interface-skeleton__html-container { bottom: 0; } } -} \ No newline at end of file +} diff --git a/src/OnboardingSPA/components/ToggleDarkMode/index.js b/src/OnboardingSPA/components/ToggleDarkMode/index.js index 8610afa30..66d022380 100644 --- a/src/OnboardingSPA/components/ToggleDarkMode/index.js +++ b/src/OnboardingSPA/components/ToggleDarkMode/index.js @@ -2,22 +2,22 @@ import { ToggleControl } from '@wordpress/components'; import { useState } from '@wordpress/element'; const ToggleDarkMode = () => { - const [ isChecked, setChecked ] = useState( false ); + const [ isChecked, setChecked ] = useState( false ); - const onChange = ( value ) => { - setChecked( value ); - // Handle the toggle action here - }; + const onChange = ( value ) => { + setChecked( value ); + // Handle the toggle action here + }; - return ( -
- -
- ); + return ( +
+ +
+ ); }; export default ToggleDarkMode; diff --git a/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss b/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss index 44a928faa..9dae275e1 100644 --- a/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss +++ b/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss @@ -1,8 +1,8 @@ -.nfd-sitegen-darkmode-wrapper{ +.nfd-sitegen-darkmode-wrapper { position: absolute; bottom: 15px; left: 50%; transform: translateX(-50%); z-index: 999; - color:white; -} \ No newline at end of file + color: #fff; +} diff --git a/src/OnboardingSPA/index.js b/src/OnboardingSPA/index.js index dec086098..d050b969d 100644 --- a/src/OnboardingSPA/index.js +++ b/src/OnboardingSPA/index.js @@ -7,7 +7,7 @@ import { trigger as cronTrigger } from './utils/api/cronTrigger'; import { initialize as initializeSettings } from './utils/api/settings'; import { DESIGN_STEPS_THEME } from '../constants'; -import App from './components/App'; +// import App from './components/App'; import AppSiteGen from './components/AppSiteGen'; import { HashRouter } from 'react-router-dom'; import { dispatch } from '@wordpress/data'; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js b/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js index 6832f8faa..b6ca5d457 100644 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js @@ -2,11 +2,14 @@ import { __ } from '@wordpress/i18n'; const getContents = () => { return { - heading: __( 'AI Website Creator for wordpress', 'wp-module-onboarding' ), + heading: __( + 'AI Website Creator for wordpress', + 'wp-module-onboarding' + ), subheading: __( - "Tell our engine what kind of site to make", + 'Tell our engine what kind of site to make', 'wp-module-onboarding' - ) + ), }; }; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js index bc4570556..5c4741032 100644 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js @@ -1,4 +1,3 @@ -import { __ } from '@wordpress/i18n'; import { useViewportMatch } from '@wordpress/compose'; import { useEffect } from '@wordpress/element'; import { useDispatch } from '@wordpress/data'; @@ -9,13 +8,10 @@ import HeadingWithSubHeading from '../../components/HeadingWithSubHeading'; import getContents from './contents'; const StepSiteGenGetStarted = () => { - const isLargeViewport = useViewportMatch( 'medium' ); - const { - setIsDrawerOpened, - setIsHeaderNavigationEnabled, - } = useDispatch( nfdOnboardingStore ); + const { setIsDrawerOpened, setIsHeaderNavigationEnabled } = + useDispatch( nfdOnboardingStore ); useEffect( () => { if ( isLargeViewport ) { diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss deleted file mode 100644 index 8b1378917..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss +++ /dev/null @@ -1 +0,0 @@ - From 11ad03a5d4eea1affce550856584e60fc63ae980 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Mon, 23 Oct 2023 12:09:58 +0530 Subject: [PATCH 08/30] PRESS2-1233 | fixed PR comments --- .../components/AdminBarSiteGen/index.js | 13 +- .../AdminBarSiteGen/stylesheet.scss | 16 +- .../components/AppSiteGen/index.js | 38 +---- .../components/HeaderSiteGen/index.js | 21 ++- .../HeaderSiteGen/step-navigation.js | 151 ------------------ .../components/HeaderSiteGen/stylesheet.scss | 33 +--- .../ProgressBarSiteGen/stylesheet.scss | 9 +- .../SiteGenInterfaceSkeleton/index.js | 17 -- .../static/images/user-avatar.png | Bin 0 -> 901 bytes .../headingwithsubheading.js | 21 +++ .../steps/SiteGenGetStarted/index.js | 2 +- .../steps/SiteGenGetStarted/stylesheet.scss | 21 +++ src/OnboardingSPA/styles/_icons.scss | 1 + src/OnboardingSPA/styles/app.scss | 2 + 14 files changed, 86 insertions(+), 259 deletions(-) delete mode 100644 src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js create mode 100644 src/OnboardingSPA/static/images/user-avatar.png create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/headingwithsubheading.js create mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/OnboardingSPA/components/AdminBarSiteGen/index.js index 8f2da8296..5235c7616 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/OnboardingSPA/components/AdminBarSiteGen/index.js @@ -1,7 +1,7 @@ import { __ } from '@wordpress/i18n'; import { Icon, wordpress } from '@wordpress/icons'; -const AdminBarSiteGen = ( {} ) => { +const AdminBarSiteGen = () => { return (
@@ -12,16 +12,7 @@ const AdminBarSiteGen = ( {} ) => { Howdy, Maya Jiménez - +
); diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss index 575b6176e..535ce4b45 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -1,3 +1,4 @@ +$light-grey : #a0a5aa; .nfd-interface-interface-skeleton__adminbar { .nfd-sitegen-admin-bar { @@ -8,14 +9,14 @@ align-items: center; .nfd-admin-bar-wplogo { - color: #fff; // Logo color + color: var(--nfd-onboarding-white); font-size: 16px; display: flex; align-items: center; svg { - color: #a0a5aa; - fill: #a0a5aa; + color: $light-grey; + fill: $light-grey; } span { @@ -28,10 +29,17 @@ align-items: center; .nfd-admin-bar-greeting { - color: #a0a5aa; // Text color + color: $light-grey; font-size: 16px; margin-right: 5px; } + .nfd-admin-bar-avatar{ + height: 20px; + width:20px; + display: inline-block; + background-image: var(--adminbar-avatar-img); + background-size: contain; + } } } } diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/OnboardingSPA/components/AppSiteGen/index.js index 00341e529..b770f324b 100644 --- a/src/OnboardingSPA/components/AppSiteGen/index.js +++ b/src/OnboardingSPA/components/AppSiteGen/index.js @@ -1,18 +1,16 @@ import Content from '../Content'; -import Header from '../HeaderSiteGen'; +import HeaderSiteGen from '../HeaderSiteGen'; import ToggleDarkMode from '../ToggleDarkMode'; import AdminBarSiteGen from '../AdminBarSiteGen'; import ProgressBarSiteGen from '../ProgressBarSiteGen'; import classNames from 'classnames'; import { useLocation } from 'react-router-dom'; -import { store as nfdOnboardingStore } from '../../store'; // eslint-disable-next-line import/no-extraneous-dependencies import { kebabCase } from 'lodash'; import { useViewportMatch } from '@wordpress/compose'; -import { useDispatch, useSelect } from '@wordpress/data'; import { SlotFillProvider } from '@wordpress/components'; -import { useEffect, Fragment } from '@wordpress/element'; +import { Fragment } from '@wordpress/element'; import { FullscreenMode } from '@wordpress/interface'; import SiteGenInterfaceSkeleton from '../SiteGenInterfaceSkeleton'; @@ -21,33 +19,6 @@ const AppSiteGen = () => { const isLargeViewport = useViewportMatch( 'medium' ); const pathname = kebabCase( location.pathname ); - const { isDrawerOpen, newfoldBrand, onboardingFlow } = useSelect( - ( select ) => { - return { - newfoldBrand: select( nfdOnboardingStore ).getNewfoldBrand(), - onboardingFlow: - select( nfdOnboardingStore ).getOnboardingFlow(), - currentData: - select( nfdOnboardingStore ).getCurrentOnboardingData(), - allSteps: select( nfdOnboardingStore ).getAllSteps(), - }; - }, - [ location.pathname ] - ); - - const { setActiveStep, setActiveFlow } = useDispatch( nfdOnboardingStore ); - - useEffect( () => { - document.body.classList.add( `nfd-brand-${ newfoldBrand }` ); - }, [ newfoldBrand ] ); - - useEffect( () => { - if ( location.pathname.includes( '/step' ) ) { - setActiveFlow( onboardingFlow ); - setActiveStep( location.pathname ); - } - }, [ location.pathname, onboardingFlow ] ); - return ( @@ -56,9 +27,8 @@ const AppSiteGen = () => { className={ classNames( 'nfd-onboarding-skeleton', 'nfd-sitegen-skeleton', - `brand-${ newfoldBrand }`, + `brand-sitegen`, `path-${ pathname }`, - { 'is-drawer-open': isDrawerOpen }, { 'is-large-viewport': isLargeViewport }, { 'is-small-viewport': ! isLargeViewport } ) } @@ -66,7 +36,7 @@ const AppSiteGen = () => { progressbar={ } - header={
} + header={ } content={ } darkModeToggle={ } /> diff --git a/src/OnboardingSPA/components/HeaderSiteGen/index.js b/src/OnboardingSPA/components/HeaderSiteGen/index.js index c1903803d..cf686b879 100644 --- a/src/OnboardingSPA/components/HeaderSiteGen/index.js +++ b/src/OnboardingSPA/components/HeaderSiteGen/index.js @@ -1,13 +1,22 @@ import { memo } from '@wordpress/element'; +import { Button } from '@wordpress/components'; +import { Icon, chevronLeft } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; -import StepNavigation from './step-navigation'; - -const Header = () => { +const HeaderSiteGen = () => { return ( -
- +
+
+ +
); }; -export default memo( Header ); +export default memo( HeaderSiteGen ); diff --git a/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js b/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js deleted file mode 100644 index 9e8371a23..000000000 --- a/src/OnboardingSPA/components/HeaderSiteGen/step-navigation.js +++ /dev/null @@ -1,151 +0,0 @@ -import { useSelect, useDispatch } from '@wordpress/data'; -import { useNavigate } from 'react-router-dom'; -import { Button, ButtonGroup } from '@wordpress/components'; -import { Icon, chevronLeft, chevronRight } from '@wordpress/icons'; -import { __ } from '@wordpress/i18n'; - -import { setFlow } from '../../utils/api/flow'; -import { store as nfdOnboardingStore } from '../../store'; -import { pluginDashboardPage } from '../../../constants'; -import { activateInitialPlugins } from '../../utils/api/plugins'; -import { - OnboardingEvent, - sendOnboardingEvent, -} from '../../utils/analytics/hiive'; -import { ACTION_ONBOARDING_COMPLETE } from '../../utils/analytics/hiive/constants'; - -/** - * Back step Navigation button. - * - * @param {*} param0 - * - * @return {WPComponent} Back Component - */ -const Back = ( { path, showErrorDialog } ) => { - const { setNavErrorContinuePath } = useDispatch( nfdOnboardingStore ); - const navigate = useNavigate(); - const navigateBack = () => { - if ( showErrorDialog !== false ) { - setNavErrorContinuePath( path ); - } else { - navigate( path, { state: { origin: 'header' } } ); - } - }; - return ( - - ); -}; - -/** - * Next step naigation button - * - * @param {*} param0 - * - * @return {WPComponent} Next Component - */ -const Next = ( { path, showErrorDialog } ) => { - const { setNavErrorContinuePath } = useDispatch( nfdOnboardingStore ); - /* [TODO]: some sense of isStepComplete to enable/disable */ - const navigate = useNavigate(); - const navigateNext = () => { - if ( showErrorDialog !== false ) { - setNavErrorContinuePath( path ); - } else { - navigate( path, { state: { origin: 'header' } } ); - } - }; - return ( - - ); -}; - -async function saveDataAndExit( currentData ) { - if ( currentData ) { - currentData.isComplete = new Date().getTime(); - setFlow( currentData ); - } - - activateInitialPlugins(); - sendOnboardingEvent( new OnboardingEvent( ACTION_ONBOARDING_COMPLETE ) ); - window.location.replace( pluginDashboardPage ); -} - -/** - * Finish step navigation button. - * - * @param {*} param0 - * - * @return {WPComponent} Finish Component - */ -const Finish = ( { currentData, saveDataAndExitFunc } ) => ( - -); - -/** - * Step buttons presented in Header. - * - * @return {WPComponent} StepNavigation Component - */ -const StepNavigation = () => { - const { previousStep, nextStep, currentData, showErrorDialog } = useSelect( - ( select ) => { - return { - nextStep: select( nfdOnboardingStore ).getNextStep(), - previousStep: select( nfdOnboardingStore ).getPreviousStep(), - currentData: - select( nfdOnboardingStore ).getCurrentOnboardingData(), - showErrorDialog: - select( nfdOnboardingStore ).getShowErrorDialog(), - }; - }, - [] - ); - const isFirstStep = null === previousStep || false === previousStep; - const isLastStep = null === nextStep || false === nextStep; - return ( -
- - { isFirstStep || isLastStep ? null : ( - - ) } - { isLastStep ? ( - - ) : ( - - ) } - -
- ); -}; - -export default StepNavigation; diff --git a/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss b/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss index 380bd3d66..21a247ec3 100644 --- a/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss @@ -1,4 +1,4 @@ -.nfd-onboarding-header { +.nfd-sitegen-header { align-items: center; background-color: var(--nfd-onboarding-header-base); color: var(--nfd-onboarding-header-contrast); @@ -58,29 +58,6 @@ display: flex; column-gap: $grid-unit-10; } - - &__step-progress { - - &:-webkit-progress-inner-element { - background-color: #999; - } - - &:-moz-progress-bar, - &:-webkit-progress-bar { - background-color: var(--nfd-onboarding-primary); - } - } -} - -.nfd-onboarding-skeleton.is-drawer-open { - - .nfd-onboarding-header { - padding-left: 0; - transition: padding-left 20ms linear; - transition-delay: 0ms; - - @include reduce-motion("transition"); - } } .navigation-buttons { @@ -97,14 +74,6 @@ padding-right: 22px !important; } - &_next { - padding-left: 22px !important; - } - - &_finish { - padding-left: 22px !important; - } - @media screen and (max-width: #{ ($break-medium) }) { font-size: 13px; padding: 15px 10px !important; diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss index 888d1c536..cdf19f8b4 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -1,8 +1,11 @@ +$sitegen-progress-blue: #3620f8; +$sitegen-progress-grey: #32373e; + .nfd-progress-bar-site-gen { width: 100%; .nfd-progress-bar-container { - background-color: #32373e; + background-color: $sitegen-progress-grey; height: 15px; width: 100%; border-radius: 0; @@ -10,7 +13,7 @@ } .nfd-progress-bar-fill { - background-color: #3620f8; + background-color: $sitegen-progress-blue; height: 100%; } -} +} \ No newline at end of file diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js index d05d09438..59f765856 100644 --- a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js @@ -35,10 +35,8 @@ function SiteGenInterfaceSkeleton( footer, adminbar, progressbar, - notices, content, drawer, - actions, labels, className, shortcuts, @@ -117,11 +115,6 @@ function SiteGenInterfaceSkeleton( { header }
) } - { !! notices && ( -
- { notices } -
- ) }
{ content }
- { !! actions && ( -
- { actions } -
- ) } { !! darkModeToggle && (
_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%ib0B*QHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^8GhXsy?Nu0=C%Bsum>}AZ%!{dtS#{4`vHY; z%|xrH`_aBi@B1u8Z`L{}OpJHCdGFwgsH4UCN~c-6cgFg&1hAhA|5fuV_Q|&Gfiu!O z9!~hS>c_g(kNj5VuKKYkd~51N<=!MC&4)A6)$gyf=X$z=dE<}lhY>Z-D^J?q`Z=v^ zfl&M6jW77Ov&=uVccF5`#Xu1yjRT<%7-RSkZv4+66#e-ATju`^j-vO!i7-B|7ulnn z_ld{S}`*|I$kT$MFt7F3;!6+WGvi?0<%-HUAkL { + return ( +
+

{ title }

+ { subtitle && ( +

{ subtitle }

+ ) } + { children } +
+ ); +}; + +export default HeadingWithSubHeading; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js index 5c4741032..cb139856d 100644 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js @@ -4,7 +4,7 @@ import { useDispatch } from '@wordpress/data'; import { store as nfdOnboardingStore } from '../../store'; import CommonLayout from '../../components/Layouts/Common'; -import HeadingWithSubHeading from '../../components/HeadingWithSubHeading'; +import HeadingWithSubHeading from './headingwithsubheading'; import getContents from './contents'; const StepSiteGenGetStarted = () => { diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss new file mode 100644 index 000000000..2d72a04f0 --- /dev/null +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss @@ -0,0 +1,21 @@ + +.nfd-sitegen-heading { + width: 96%; + margin: 50px 0 50px; + line-height: 1; + + &__title { + font-weight: 700; + text-align: center; + color: var(--nfd-onboarding-white); + margin: 35px !important; + font-size: clamp(1.6rem, 4vw, 3.6rem); + } + + &__subtitle { + color: var(--nfd-onboarding-white); + font-weight: 400; + text-align: center; + font-size: clamp(0.85rem, 3.2vw, 1.7rem); + } +} diff --git a/src/OnboardingSPA/styles/_icons.scss b/src/OnboardingSPA/styles/_icons.scss index 31501c2a6..9284b60fa 100644 --- a/src/OnboardingSPA/styles/_icons.scss +++ b/src/OnboardingSPA/styles/_icons.scss @@ -20,6 +20,7 @@ body { --get-started-content-img: url(../static/images/content.png); --get-started-design-img: url(../static/images/design.png); --get-started-features-img: url(../static/images/features.png); + --adminbar-avatar-img: url(../static/images/user-avatar.png); --chevron-left-icon: url(../static/icons/chevron-left.svg); diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index ce2760165..6b6be81cd 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -48,6 +48,7 @@ @import "../components/ProgressBarSiteGen/stylesheet"; @import "../components/ToggleDarkMode/stylesheet"; @import "../components/HeaderSiteGen/stylesheet"; +@import "../components/HeadingWithSubHeading/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; @@ -62,6 +63,7 @@ @import "../steps/DesignFonts/stylesheet"; @import "../steps/DesignHeaderMenu/stylesheet"; @import "../steps/SiteFeatures/stylesheet"; +@import "../steps/SiteGenGetStarted/stylesheet"; .nfd-onboarding-container { display: flex; From 0c4f25a2c0f120e67f1ec315a50b79dbbf82fbf8 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Mon, 23 Oct 2023 12:27:15 +0530 Subject: [PATCH 09/30] PRESS2-1233 | fixed linting changes --- .../steps/SiteGenGetStarted/index.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js index cb139856d..20c5cee6d 100644 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js +++ b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js @@ -1,25 +1,8 @@ -import { useViewportMatch } from '@wordpress/compose'; -import { useEffect } from '@wordpress/element'; -import { useDispatch } from '@wordpress/data'; - -import { store as nfdOnboardingStore } from '../../store'; import CommonLayout from '../../components/Layouts/Common'; import HeadingWithSubHeading from './headingwithsubheading'; import getContents from './contents'; const StepSiteGenGetStarted = () => { - const isLargeViewport = useViewportMatch( 'medium' ); - - const { setIsDrawerOpened, setIsHeaderNavigationEnabled } = - useDispatch( nfdOnboardingStore ); - - useEffect( () => { - if ( isLargeViewport ) { - setIsDrawerOpened( true ); - } - setIsHeaderNavigationEnabled( true ); - }, [] ); - const content = getContents(); return ( From 00be88dc79b1c80be5e7cc59bd634a45cf5cbb52 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Mon, 23 Oct 2023 12:32:06 +0530 Subject: [PATCH 10/30] PRESS2-1233 | fixed style lint --- .../components/AdminBarSiteGen/stylesheet.scss | 8 +++++--- .../components/ProgressBarSiteGen/stylesheet.scss | 2 +- src/OnboardingSPA/styles/app.scss | 1 - 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss index 535ce4b45..6e79aa2c1 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss @@ -1,4 +1,5 @@ $light-grey : #a0a5aa; + .nfd-interface-interface-skeleton__adminbar { .nfd-sitegen-admin-bar { @@ -29,13 +30,14 @@ $light-grey : #a0a5aa; align-items: center; .nfd-admin-bar-greeting { - color: $light-grey; + color: $light-grey; font-size: 16px; margin-right: 5px; } - .nfd-admin-bar-avatar{ + + .nfd-admin-bar-avatar { height: 20px; - width:20px; + width: 20px; display: inline-block; background-image: var(--adminbar-avatar-img); background-size: contain; diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss index cdf19f8b4..f6a527efc 100644 --- a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -16,4 +16,4 @@ $sitegen-progress-grey: #32373e; background-color: $sitegen-progress-blue; height: 100%; } -} \ No newline at end of file +} diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index 6b6be81cd..8e26fb762 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -48,7 +48,6 @@ @import "../components/ProgressBarSiteGen/stylesheet"; @import "../components/ToggleDarkMode/stylesheet"; @import "../components/HeaderSiteGen/stylesheet"; -@import "../components/HeadingWithSubHeading/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; From 92c2b3f415d4cafdd1eefd133f76a81220fc8805 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Wed, 25 Oct 2023 19:39:01 +0530 Subject: [PATCH 11/30] PRESS-1233 | added sitegen to directory --- src/OnboardingSPA/index.js | 2 +- src/OnboardingSPA/styles/app.scss | 12 +++++------ .../components/AdminBarSiteGen/index.js | 4 +++- .../AdminBarSiteGen/stylesheet.scss | 0 .../components/AppSiteGen/index.js | 2 +- .../components/HeaderSiteGen/index.js | 0 .../components/HeaderSiteGen/stylesheet.scss | 0 .../components/ProgressBarSiteGen/index.js | 0 .../ProgressBarSiteGen/stylesheet.scss | 0 .../SiteGenInterfaceSkeleton/index.js | 0 .../SiteGenInterfaceSkeleton/style.scss | 0 .../components/ToggleDarkMode/index.js | 0 .../components/ToggleDarkMode/stylesheet.scss | 0 .../steps/SiteGenGetStarted/contents.js | 16 ++++++++++++++ .../headingwithsubheading.js | 21 +++++++++++++++++++ .../steps/SiteGenGetStarted/index.js | 18 ++++++++++++++++ .../steps/SiteGenGetStarted/step.js | 14 +++++++++++++ .../steps/SiteGenGetStarted/stylesheet.scss | 21 +++++++++++++++++++ 18 files changed, 101 insertions(+), 9 deletions(-) rename src/{OnboardingSPA => SiteGenSPA}/components/AdminBarSiteGen/index.js (85%) rename src/{OnboardingSPA => SiteGenSPA}/components/AdminBarSiteGen/stylesheet.scss (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/AppSiteGen/index.js (95%) rename src/{OnboardingSPA => SiteGenSPA}/components/HeaderSiteGen/index.js (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/HeaderSiteGen/stylesheet.scss (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/ProgressBarSiteGen/index.js (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/ProgressBarSiteGen/stylesheet.scss (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/SiteGenInterfaceSkeleton/index.js (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/SiteGenInterfaceSkeleton/style.scss (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/ToggleDarkMode/index.js (100%) rename src/{OnboardingSPA => SiteGenSPA}/components/ToggleDarkMode/stylesheet.scss (100%) create mode 100644 src/SiteGenSPA/steps/SiteGenGetStarted/contents.js create mode 100644 src/SiteGenSPA/steps/SiteGenGetStarted/headingwithsubheading.js create mode 100644 src/SiteGenSPA/steps/SiteGenGetStarted/index.js create mode 100644 src/SiteGenSPA/steps/SiteGenGetStarted/step.js create mode 100644 src/SiteGenSPA/steps/SiteGenGetStarted/stylesheet.scss diff --git a/src/OnboardingSPA/index.js b/src/OnboardingSPA/index.js index d050b969d..71eeb9640 100644 --- a/src/OnboardingSPA/index.js +++ b/src/OnboardingSPA/index.js @@ -8,7 +8,7 @@ import { initialize as initializeSettings } from './utils/api/settings'; import { DESIGN_STEPS_THEME } from '../constants'; // import App from './components/App'; -import AppSiteGen from './components/AppSiteGen'; +import AppSiteGen from '../SiteGenSPA/components/AppSiteGen'; import { HashRouter } from 'react-router-dom'; import { dispatch } from '@wordpress/data'; import { render } from '@wordpress/element'; diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index 8e26fb762..c2305f844 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -40,14 +40,14 @@ @import "../components/Sidebar/components/LearnMore/Skeleton/stylesheet"; @import "../components/Animate/stylesheet"; @import "../components/NewfoldInterfaceSkeleton/style"; -@import "../components/SiteGenInterfaceSkeleton/style"; @import "../components/Loaders/Chapter/Interstitial/stylesheet"; @import "../components/Grid/stylesheet"; @import "../components/ComingSoon/stylesheet"; -@import "../components/AdminBarSiteGen/stylesheet"; -@import "../components/ProgressBarSiteGen/stylesheet"; -@import "../components/ToggleDarkMode/stylesheet"; -@import "../components/HeaderSiteGen/stylesheet"; +@import "../../SiteGenSPA/components/SiteGenInterfaceSkeleton/style"; +@import "../../SiteGenSPA/components/AdminBarSiteGen/stylesheet"; +@import "../../SiteGenSPA/components/ProgressBarSiteGen/stylesheet"; +@import "../../SiteGenSPA/components/ToggleDarkMode/stylesheet"; +@import "../../SiteGenSPA/components/HeaderSiteGen/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; @@ -62,7 +62,7 @@ @import "../steps/DesignFonts/stylesheet"; @import "../steps/DesignHeaderMenu/stylesheet"; @import "../steps/SiteFeatures/stylesheet"; -@import "../steps/SiteGenGetStarted/stylesheet"; +@import "../../SiteGenSPA/steps/SiteGenGetStarted/stylesheet"; .nfd-onboarding-container { display: flex; diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/index.js b/src/SiteGenSPA/components/AdminBarSiteGen/index.js similarity index 85% rename from src/OnboardingSPA/components/AdminBarSiteGen/index.js rename to src/SiteGenSPA/components/AdminBarSiteGen/index.js index 5235c7616..174b34fc2 100644 --- a/src/OnboardingSPA/components/AdminBarSiteGen/index.js +++ b/src/SiteGenSPA/components/AdminBarSiteGen/index.js @@ -10,7 +10,9 @@ const AdminBarSiteGen = () => {
- Howdy, Maya Jiménez + + { __( 'Howdy!', 'wp-module-onboarding' ) }, Maya Jiménez +
diff --git a/src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/AdminBarSiteGen/stylesheet.scss similarity index 100% rename from src/OnboardingSPA/components/AdminBarSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/AdminBarSiteGen/stylesheet.scss diff --git a/src/OnboardingSPA/components/AppSiteGen/index.js b/src/SiteGenSPA/components/AppSiteGen/index.js similarity index 95% rename from src/OnboardingSPA/components/AppSiteGen/index.js rename to src/SiteGenSPA/components/AppSiteGen/index.js index b770f324b..38059560f 100644 --- a/src/OnboardingSPA/components/AppSiteGen/index.js +++ b/src/SiteGenSPA/components/AppSiteGen/index.js @@ -1,4 +1,4 @@ -import Content from '../Content'; +import Content from '../../../OnboardingSPA/components/Content'; import HeaderSiteGen from '../HeaderSiteGen'; import ToggleDarkMode from '../ToggleDarkMode'; import AdminBarSiteGen from '../AdminBarSiteGen'; diff --git a/src/OnboardingSPA/components/HeaderSiteGen/index.js b/src/SiteGenSPA/components/HeaderSiteGen/index.js similarity index 100% rename from src/OnboardingSPA/components/HeaderSiteGen/index.js rename to src/SiteGenSPA/components/HeaderSiteGen/index.js diff --git a/src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss b/src/SiteGenSPA/components/HeaderSiteGen/stylesheet.scss similarity index 100% rename from src/OnboardingSPA/components/HeaderSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/HeaderSiteGen/stylesheet.scss diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/index.js b/src/SiteGenSPA/components/ProgressBarSiteGen/index.js similarity index 100% rename from src/OnboardingSPA/components/ProgressBarSiteGen/index.js rename to src/SiteGenSPA/components/ProgressBarSiteGen/index.js diff --git a/src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss similarity index 100% rename from src/OnboardingSPA/components/ProgressBarSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js similarity index 100% rename from src/OnboardingSPA/components/SiteGenInterfaceSkeleton/index.js rename to src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js diff --git a/src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss similarity index 100% rename from src/OnboardingSPA/components/SiteGenInterfaceSkeleton/style.scss rename to src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss diff --git a/src/OnboardingSPA/components/ToggleDarkMode/index.js b/src/SiteGenSPA/components/ToggleDarkMode/index.js similarity index 100% rename from src/OnboardingSPA/components/ToggleDarkMode/index.js rename to src/SiteGenSPA/components/ToggleDarkMode/index.js diff --git a/src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss b/src/SiteGenSPA/components/ToggleDarkMode/stylesheet.scss similarity index 100% rename from src/OnboardingSPA/components/ToggleDarkMode/stylesheet.scss rename to src/SiteGenSPA/components/ToggleDarkMode/stylesheet.scss diff --git a/src/SiteGenSPA/steps/SiteGenGetStarted/contents.js b/src/SiteGenSPA/steps/SiteGenGetStarted/contents.js new file mode 100644 index 000000000..b6ca5d457 --- /dev/null +++ b/src/SiteGenSPA/steps/SiteGenGetStarted/contents.js @@ -0,0 +1,16 @@ +import { __ } from '@wordpress/i18n'; + +const getContents = () => { + return { + heading: __( + 'AI Website Creator for wordpress', + 'wp-module-onboarding' + ), + subheading: __( + 'Tell our engine what kind of site to make', + 'wp-module-onboarding' + ), + }; +}; + +export default getContents; diff --git a/src/SiteGenSPA/steps/SiteGenGetStarted/headingwithsubheading.js b/src/SiteGenSPA/steps/SiteGenGetStarted/headingwithsubheading.js new file mode 100644 index 000000000..6766d809c --- /dev/null +++ b/src/SiteGenSPA/steps/SiteGenGetStarted/headingwithsubheading.js @@ -0,0 +1,21 @@ +/** + * Interface Cards with standard design. + * + * @param {Object} root0 + * @param {string} root0.title + * @param {string} root0.subtitle + * @param {Object} root0.children + */ +const HeadingWithSubHeading = ( { title, subtitle, children } ) => { + return ( +
+

{ title }

+ { subtitle && ( +

{ subtitle }

+ ) } + { children } +
+ ); +}; + +export default HeadingWithSubHeading; diff --git a/src/SiteGenSPA/steps/SiteGenGetStarted/index.js b/src/SiteGenSPA/steps/SiteGenGetStarted/index.js new file mode 100644 index 000000000..54c2f4b89 --- /dev/null +++ b/src/SiteGenSPA/steps/SiteGenGetStarted/index.js @@ -0,0 +1,18 @@ +import CommonLayout from '../../../OnboardingSPA/components/Layouts/Common'; +import HeadingWithSubHeading from './headingwithsubheading'; +import getContents from './contents'; + +const StepSiteGenGetStarted = () => { + const content = getContents(); + + return ( + + + + ); +}; + +export default StepSiteGenGetStarted; diff --git a/src/SiteGenSPA/steps/SiteGenGetStarted/step.js b/src/SiteGenSPA/steps/SiteGenGetStarted/step.js new file mode 100644 index 000000000..5439d4758 --- /dev/null +++ b/src/SiteGenSPA/steps/SiteGenGetStarted/step.js @@ -0,0 +1,14 @@ +import { lazy } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Step } from '../../../OnboardingSPA/data/models/Step'; +import { navigation } from '@wordpress/icons'; + +const StepSiteGenGetStarted = lazy( () => import( './index' ) ); + +export const stepSiteGenGetStarted = new Step( { + path: '/wp-setup/step/sitegen-get-started', + title: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), + tooltipText: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), + Component: StepSiteGenGetStarted, + icon: navigation, +} ); diff --git a/src/SiteGenSPA/steps/SiteGenGetStarted/stylesheet.scss b/src/SiteGenSPA/steps/SiteGenGetStarted/stylesheet.scss new file mode 100644 index 000000000..2d72a04f0 --- /dev/null +++ b/src/SiteGenSPA/steps/SiteGenGetStarted/stylesheet.scss @@ -0,0 +1,21 @@ + +.nfd-sitegen-heading { + width: 96%; + margin: 50px 0 50px; + line-height: 1; + + &__title { + font-weight: 700; + text-align: center; + color: var(--nfd-onboarding-white); + margin: 35px !important; + font-size: clamp(1.6rem, 4vw, 3.6rem); + } + + &__subtitle { + color: var(--nfd-onboarding-white); + font-weight: 400; + text-align: center; + font-size: clamp(0.85rem, 3.2vw, 1.7rem); + } +} From 04cb644758f19436deb5b062a0ec13a5133a6fd7 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Wed, 25 Oct 2023 21:59:15 +0530 Subject: [PATCH 12/30] PRESS2-1233 | fixed comments --- src/SiteGenSPA/components/AppSiteGen/index.js | 1 - .../components/HeaderSiteGen/stylesheet.scss | 30 ---------------- .../components/ProgressBarSiteGen/index.js | 6 ++-- .../ProgressBarSiteGen/stylesheet.scss | 6 ++-- .../SiteGenInterfaceSkeleton/style.scss | 36 +++++++++---------- .../components/ToggleDarkMode/contents.js | 9 +++++ .../components/ToggleDarkMode/index.js | 5 +-- 7 files changed, 35 insertions(+), 58 deletions(-) create mode 100644 src/SiteGenSPA/components/ToggleDarkMode/contents.js diff --git a/src/SiteGenSPA/components/AppSiteGen/index.js b/src/SiteGenSPA/components/AppSiteGen/index.js index 38059560f..acb5f28a0 100644 --- a/src/SiteGenSPA/components/AppSiteGen/index.js +++ b/src/SiteGenSPA/components/AppSiteGen/index.js @@ -25,7 +25,6 @@ const AppSiteGen = () => { { const percentage = ( current / total ) * 100; return ( -
-
+
+
diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss index f6a527efc..0ac06a03a 100644 --- a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -1,10 +1,10 @@ $sitegen-progress-blue: #3620f8; $sitegen-progress-grey: #32373e; -.nfd-progress-bar-site-gen { +.nfd-sitegen-progressbar { width: 100%; - .nfd-progress-bar-container { + .nfd-sitegen-progressbar-container{ background-color: $sitegen-progress-grey; height: 15px; width: 100%; @@ -12,7 +12,7 @@ $sitegen-progress-grey: #32373e; overflow: hidden; } - .nfd-progress-bar-fill { + .nfd-sitegen-progressbar-fill { background-color: $sitegen-progress-blue; height: 100%; } diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss index 42c91b7b9..6499da5a7 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -11,30 +11,31 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-interface-interface-skeleton { - display: flex; - flex-direction: row; - height: auto; - max-height: 100%; + &.nfd-sitegen-interface-skeleton { + display: flex; + flex-direction: row; + height: auto; + max-height: 100%; - // Fill the available space on Mobile. - position: fixed; - top: 46px; - left: 0; - right: 0; - bottom: 0; + // Fill the available space on Mobile. + position: fixed; + top: 46px; + left: 0; + right: 0; + bottom: 0; - // Adjust to admin-bar going small. - @media (min-width: #{ ($break-medium + 1) }) { - top: 32px; + // Adjust to admin-bar going small. + @media (min-width: #{ ($break-medium + 1) }) { + top: 32px; - .is-fullscreen-mode & { - top: 0; + .is-fullscreen-mode & { + top: 0; + } } } } .nfd-sitegen-interface-skeleton { - .nfd-interface-interface-skeleton__editor { display: flex; flex-direction: column; @@ -71,7 +72,6 @@ html.nfd-interface-interface-skeleton__html-container { // Footer overlap prevention .has-footer & { - @media (max-width: #{($break-medium)}) { padding-bottom: 24px + 1px; } @@ -95,7 +95,6 @@ html.nfd-interface-interface-skeleton__html-container { // to "bleed" through the header. // See https://github.com/WordPress/gutenberg/issues/32631 z-index: 20; - } .nfd-interface-interface-skeleton__secondary-sidebar, @@ -129,7 +128,6 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-interface-interface-skeleton__secondary-sidebar { - @media (max-width: #{($break-medium)}) { border-right: 1px solid #e0e0e0; } diff --git a/src/SiteGenSPA/components/ToggleDarkMode/contents.js b/src/SiteGenSPA/components/ToggleDarkMode/contents.js new file mode 100644 index 000000000..7049e53c2 --- /dev/null +++ b/src/SiteGenSPA/components/ToggleDarkMode/contents.js @@ -0,0 +1,9 @@ +import { __ } from '@wordpress/i18n'; + +const getContents = () => { + return { + label: __( 'Dark Mode', 'wp-module-onboarding' ), + }; +}; + +export default getContents; diff --git a/src/SiteGenSPA/components/ToggleDarkMode/index.js b/src/SiteGenSPA/components/ToggleDarkMode/index.js index 66d022380..98aef5fc0 100644 --- a/src/SiteGenSPA/components/ToggleDarkMode/index.js +++ b/src/SiteGenSPA/components/ToggleDarkMode/index.js @@ -1,9 +1,10 @@ import { ToggleControl } from '@wordpress/components'; import { useState } from '@wordpress/element'; +import getContents from './contents'; const ToggleDarkMode = () => { const [ isChecked, setChecked ] = useState( false ); - + const content = getContents(); const onChange = ( value ) => { setChecked( value ); // Handle the toggle action here @@ -12,7 +13,7 @@ const ToggleDarkMode = () => { return (
From f1d893e003e03277c0132dde21f25c5adea766ba Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Wed, 25 Oct 2023 22:14:57 +0530 Subject: [PATCH 13/30] PRESS2-1233 | fixed styling --- src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss | 4 ++-- src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss index 0ac06a03a..f3bd216c1 100644 --- a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -4,7 +4,7 @@ $sitegen-progress-grey: #32373e; .nfd-sitegen-progressbar { width: 100%; - .nfd-sitegen-progressbar-container{ + .nfd-sitegen-progressbar-container { background-color: $sitegen-progress-grey; height: 15px; width: 100%; @@ -16,4 +16,4 @@ $sitegen-progress-grey: #32373e; background-color: $sitegen-progress-blue; height: 100%; } -} +} \ No newline at end of file diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss index 6499da5a7..d2133abab 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -11,6 +11,7 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-interface-interface-skeleton { + &.nfd-sitegen-interface-skeleton { display: flex; flex-direction: row; @@ -36,6 +37,7 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-sitegen-interface-skeleton { + .nfd-interface-interface-skeleton__editor { display: flex; flex-direction: column; @@ -72,6 +74,7 @@ html.nfd-interface-interface-skeleton__html-container { // Footer overlap prevention .has-footer & { + @media (max-width: #{($break-medium)}) { padding-bottom: 24px + 1px; } @@ -128,6 +131,7 @@ html.nfd-interface-interface-skeleton__html-container { } .nfd-interface-interface-skeleton__secondary-sidebar { + @media (max-width: #{($break-medium)}) { border-right: 1px solid #e0e0e0; } From ecb1d0d9d94fdeadd3b6e162ec506695788ea128 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Wed, 25 Oct 2023 22:33:54 +0530 Subject: [PATCH 14/30] PRESS2-1233 | linting issues --- src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss index f3bd216c1..705dca99c 100644 --- a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -16,4 +16,4 @@ $sitegen-progress-grey: #32373e; background-color: $sitegen-progress-blue; height: 100%; } -} \ No newline at end of file +} From c41ea1fa5f0793ec7f7ed00fe5e9ce1dea1b9a32 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Thu, 26 Oct 2023 19:32:08 +0530 Subject: [PATCH 15/30] PRESS2-1233 | WIP adding styles and static iamges --- src/OnboardingSPA/chapters/demographic.js | 2 +- .../steps/SiteGenGetStarted/contents.js | 16 - .../headingwithsubheading.js | 21 -- .../steps/SiteGenGetStarted/index.js | 18 -- .../steps/SiteGenGetStarted/step.js | 14 - .../steps/SiteGenGetStarted/stylesheet.scss | 21 -- src/SiteGenSPA/components/Animate/index.js | 77 +++++ .../components/Animate/stylesheet.scss | 170 ++++++++++ src/SiteGenSPA/components/Layouts/Base.js | 27 ++ src/SiteGenSPA/components/Layouts/Common.js | 62 ++++ .../components/Layouts/stylesheet.scss | 17 + .../SiteGenInterfaceSkeleton/index.js | 7 - .../SiteGenInterfaceSkeleton/style.scss | 2 +- src/SiteGenSPA/index.js | 78 +++++ src/SiteGenSPA/static/icons/back.svg | 3 + src/SiteGenSPA/static/icons/chevron-down.svg | 1 + src/SiteGenSPA/static/icons/chevron-left.svg | 1 + src/SiteGenSPA/static/icons/chevron-right.svg | 1 + src/SiteGenSPA/static/icons/chevron-up.svg | 3 + src/SiteGenSPA/static/icons/default-logo.svg | 1 + src/SiteGenSPA/static/icons/design.svg | 1 + src/SiteGenSPA/static/icons/forward.svg | 1 + src/SiteGenSPA/static/icons/more.svg | 1 + src/SiteGenSPA/static/icons/publish.svg | 1 + src/SiteGenSPA/static/icons/reload.svg | 1 + src/SiteGenSPA/static/icons/sell.svg | 1 + .../static/icons/site-features/analytics.svg | 1 + .../icons/site-features/bookingcalendar.svg | 1 + .../static/icons/site-features/comingsoon.svg | 3 + .../static/icons/site-features/email.svg | 1 + .../static/icons/site-features/filter.svg | 1 + .../static/icons/site-features/form.svg | 1 + .../static/icons/site-features/lead.svg | 1 + .../static/icons/site-features/search.svg | 1 + .../static/icons/site-features/security.svg | 1 + .../static/icons/site-features/share.svg | 1 + .../static/icons/site-features/wishlist.svg | 1 + .../static/icons/social/facebook.svg | 3 + .../static/icons/social/instagram.svg | 1 + .../static/icons/social/linkedin.svg | 1 + src/SiteGenSPA/static/icons/social/tiktok.svg | 1 + .../static/icons/social/twitter.svg | 1 + src/SiteGenSPA/static/icons/social/yelp.svg | 1 + .../static/icons/social/youtube.svg | 1 + src/SiteGenSPA/static/images/content.png | Bin 0 -> 33928 bytes src/SiteGenSPA/static/images/content.svg | 1 + src/SiteGenSPA/static/images/design.png | Bin 0 -> 6597 bytes src/SiteGenSPA/static/images/design.svg | 1 + src/SiteGenSPA/static/images/features.png | Bin 0 -> 7189 bytes src/SiteGenSPA/static/images/features.svg | 1 + src/SiteGenSPA/static/images/help.png | Bin 0 -> 35219 bytes src/SiteGenSPA/static/images/user-avatar.png | Bin 0 -> 901 bytes .../steps/SiteGenGetStarted/index.js | 4 +- src/SiteGenSPA/styles/_branding.scss | 297 ++++++++++++++++++ src/SiteGenSPA/styles/_icons.scss | 40 +++ src/SiteGenSPA/styles/_interface.scss | 38 +++ src/SiteGenSPA/styles/_utilities.scss | 26 ++ src/SiteGenSPA/styles/_wordpress.scss | 14 + src/SiteGenSPA/styles/app.scss | 83 +++++ 59 files changed, 974 insertions(+), 101 deletions(-) delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/contents.js delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/headingwithsubheading.js delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/index.js delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/step.js delete mode 100644 src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss create mode 100644 src/SiteGenSPA/components/Animate/index.js create mode 100644 src/SiteGenSPA/components/Animate/stylesheet.scss create mode 100644 src/SiteGenSPA/components/Layouts/Base.js create mode 100644 src/SiteGenSPA/components/Layouts/Common.js create mode 100644 src/SiteGenSPA/components/Layouts/stylesheet.scss create mode 100644 src/SiteGenSPA/index.js create mode 100644 src/SiteGenSPA/static/icons/back.svg create mode 100644 src/SiteGenSPA/static/icons/chevron-down.svg create mode 100644 src/SiteGenSPA/static/icons/chevron-left.svg create mode 100644 src/SiteGenSPA/static/icons/chevron-right.svg create mode 100644 src/SiteGenSPA/static/icons/chevron-up.svg create mode 100644 src/SiteGenSPA/static/icons/default-logo.svg create mode 100644 src/SiteGenSPA/static/icons/design.svg create mode 100644 src/SiteGenSPA/static/icons/forward.svg create mode 100644 src/SiteGenSPA/static/icons/more.svg create mode 100644 src/SiteGenSPA/static/icons/publish.svg create mode 100644 src/SiteGenSPA/static/icons/reload.svg create mode 100644 src/SiteGenSPA/static/icons/sell.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/analytics.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/comingsoon.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/email.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/filter.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/form.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/lead.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/search.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/security.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/share.svg create mode 100644 src/SiteGenSPA/static/icons/site-features/wishlist.svg create mode 100644 src/SiteGenSPA/static/icons/social/facebook.svg create mode 100644 src/SiteGenSPA/static/icons/social/instagram.svg create mode 100644 src/SiteGenSPA/static/icons/social/linkedin.svg create mode 100644 src/SiteGenSPA/static/icons/social/tiktok.svg create mode 100644 src/SiteGenSPA/static/icons/social/twitter.svg create mode 100644 src/SiteGenSPA/static/icons/social/yelp.svg create mode 100644 src/SiteGenSPA/static/icons/social/youtube.svg create mode 100644 src/SiteGenSPA/static/images/content.png create mode 100644 src/SiteGenSPA/static/images/content.svg create mode 100644 src/SiteGenSPA/static/images/design.png create mode 100644 src/SiteGenSPA/static/images/design.svg create mode 100644 src/SiteGenSPA/static/images/features.png create mode 100644 src/SiteGenSPA/static/images/features.svg create mode 100644 src/SiteGenSPA/static/images/help.png create mode 100644 src/SiteGenSPA/static/images/user-avatar.png create mode 100644 src/SiteGenSPA/styles/_branding.scss create mode 100644 src/SiteGenSPA/styles/_icons.scss create mode 100644 src/SiteGenSPA/styles/_interface.scss create mode 100644 src/SiteGenSPA/styles/_utilities.scss create mode 100644 src/SiteGenSPA/styles/_wordpress.scss create mode 100644 src/SiteGenSPA/styles/app.scss diff --git a/src/OnboardingSPA/chapters/demographic.js b/src/OnboardingSPA/chapters/demographic.js index 8869797a3..193bac23e 100644 --- a/src/OnboardingSPA/chapters/demographic.js +++ b/src/OnboardingSPA/chapters/demographic.js @@ -6,7 +6,7 @@ import { stepExperience } from '../steps/GetStarted/GetStartedExperience/step'; import { stepPrimarySetup } from '../steps/GetStarted/SiteTypeSetup/PrimarySite/step'; import { stepSecondarySetup } from '../steps/GetStarted/SiteTypeSetup/SecondarySite/step'; import { stepTopPriority } from '../steps/TopPriority/step'; -import { stepSiteGenGetStarted } from '../steps/SiteGenGetStarted/step'; +import { stepSiteGenGetStarted } from '../../SiteGenSPA/steps/SiteGenGetStarted/step'; import { Chapter } from '../data/models/Chapter'; import { Step } from '../data/models/Step'; import ChapterInterstitialLoader from '../components/Loaders/Chapter/Interstitial'; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js b/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js deleted file mode 100644 index b6ca5d457..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/contents.js +++ /dev/null @@ -1,16 +0,0 @@ -import { __ } from '@wordpress/i18n'; - -const getContents = () => { - return { - heading: __( - 'AI Website Creator for wordpress', - 'wp-module-onboarding' - ), - subheading: __( - 'Tell our engine what kind of site to make', - 'wp-module-onboarding' - ), - }; -}; - -export default getContents; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/headingwithsubheading.js b/src/OnboardingSPA/steps/SiteGenGetStarted/headingwithsubheading.js deleted file mode 100644 index 6766d809c..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/headingwithsubheading.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Interface Cards with standard design. - * - * @param {Object} root0 - * @param {string} root0.title - * @param {string} root0.subtitle - * @param {Object} root0.children - */ -const HeadingWithSubHeading = ( { title, subtitle, children } ) => { - return ( -
-

{ title }

- { subtitle && ( -

{ subtitle }

- ) } - { children } -
- ); -}; - -export default HeadingWithSubHeading; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js b/src/OnboardingSPA/steps/SiteGenGetStarted/index.js deleted file mode 100644 index 20c5cee6d..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import CommonLayout from '../../components/Layouts/Common'; -import HeadingWithSubHeading from './headingwithsubheading'; -import getContents from './contents'; - -const StepSiteGenGetStarted = () => { - const content = getContents(); - - return ( - - - - ); -}; - -export default StepSiteGenGetStarted; diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/step.js b/src/OnboardingSPA/steps/SiteGenGetStarted/step.js deleted file mode 100644 index a08100af3..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/step.js +++ /dev/null @@ -1,14 +0,0 @@ -import { lazy } from '@wordpress/element'; -import { __ } from '@wordpress/i18n'; -import { Step } from '../../data/models/Step'; -import { navigation } from '@wordpress/icons'; - -const StepSiteGenGetStarted = lazy( () => import( './index' ) ); - -export const stepSiteGenGetStarted = new Step( { - path: '/wp-setup/step/sitegen-get-started', - title: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), - tooltipText: __( 'AI Site Generate Get Started', 'wp-module-onboarding' ), - Component: StepSiteGenGetStarted, - icon: navigation, -} ); diff --git a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss b/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss deleted file mode 100644 index 2d72a04f0..000000000 --- a/src/OnboardingSPA/steps/SiteGenGetStarted/stylesheet.scss +++ /dev/null @@ -1,21 +0,0 @@ - -.nfd-sitegen-heading { - width: 96%; - margin: 50px 0 50px; - line-height: 1; - - &__title { - font-weight: 700; - text-align: center; - color: var(--nfd-onboarding-white); - margin: 35px !important; - font-size: clamp(1.6rem, 4vw, 3.6rem); - } - - &__subtitle { - color: var(--nfd-onboarding-white); - font-weight: 400; - text-align: center; - font-size: clamp(0.85rem, 3.2vw, 1.7rem); - } -} diff --git a/src/SiteGenSPA/components/Animate/index.js b/src/SiteGenSPA/components/Animate/index.js new file mode 100644 index 000000000..d78559fb0 --- /dev/null +++ b/src/SiteGenSPA/components/Animate/index.js @@ -0,0 +1,77 @@ +import classNames from 'classnames'; + +/** + * A Animator to show animation + * + * @param {string} type The name of Animation to be shown. + * @param { object | boolean } after The variable to look after for before showing the animation, by default true to show the children right away. + * + */ +const Animate = ( { + type, + after = true, + children, + className = '', + duration = false, + timingFunction = false, +} ) => { + const prefix = 'animate'; + + /** + * Returns the appropriate className + * + * @return {string | void} ClassName that applies the animations + */ + function getAnimateClassName() { + if ( type ) { + let classname = ''; + switch ( type ) { + // Add animation types and appropriate CSS + case 'fade-in': + classname = prefix.concat( '__fade-in' ); + break; + case 'fade-in-disabled': + classname = prefix.concat( '__fade-in--disabled' ); + break; + case 'fade-in-right': + classname = prefix.concat( '__fade-in--right' ); + break; + case 'fade-in-left': + classname = prefix.concat( '__fade-in--left' ); + break; + case 'fade-in-up': + classname = prefix.concat( '__fade-in--up' ); + break; + case 'shine': + classname = prefix.concat( '__shine' ); + break; + case 'shine-placeholder': + classname = prefix.concat( '__shine--placeholder' ); + break; + case 'dropdown': + classname = prefix.concat( '__dropdown' ); + break; + case 'load': + classname = prefix.concat( '__load' ); + break; + } + return classname; + } + } + + return ! after ? ( +
{ children }
+ ) : ( +
+ { children } +
+ ); +}; + +export default Animate; diff --git a/src/SiteGenSPA/components/Animate/stylesheet.scss b/src/SiteGenSPA/components/Animate/stylesheet.scss new file mode 100644 index 000000000..2f187e862 --- /dev/null +++ b/src/SiteGenSPA/components/Animate/stylesheet.scss @@ -0,0 +1,170 @@ +@keyframes fadeIn { + + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + + +@keyframes fadeInRight { + + from { + opacity: 0; + transform: translate3d(33%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeft { + + from { + opacity: 0; + transform: translate3d(-33%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUp { + + from { + opacity: 0; + transform: translate3d(0, 33%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInWithDisabledClicks { + + from { + opacity: 0; + pointer-events: none; + } + + to { + opacity: 1; + } +} + +@keyframes shine { + + 0% { + transform: translateX(-100%); + } + + 100% { + transform: translateX(100%); + } +} + +@keyframes shine-placeholder { + + 0% { + background-position: -468px 0; + } + + 100% { + background-position: 468px 0; + } +} + +@keyframes dropdown { + + 0% { + transform: rotateX(-90deg); + } + + 70% { + transform: rotateX(20deg); + } + + 100% { + transform: rotateX(0deg); + } +} + +@keyframes load { + + 0% { + left: -100%; + } + + 100% { + left: 100%; + } +} + +.animate { + + &__blank { + opacity: 0; + pointer-events: none; + } + + &__shine { + animation: shine 1.5s linear infinite; + + &--placeholder { + animation: shine-placeholder 1.5s linear infinite; + } + } + + &__dropdown { + animation: dropdown 400ms ease-in-out forwards; + } + + &__fade-in { + + animation: fadeIn 100ms ease-in-out; + + &--disabled { + animation: fadeInWithDisabledClicks 500ms ease-in; + } + + &--right { + animation: fadeInRight 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translation: none !important; + } + } + + &--left { + animation: fadeInLeft 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translation: none !important; + } + } + + &--up { + animation: fadeInUp 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translation: none !important; + } + } + } + + &__load { + animation: load 3s linear infinite; + } +} diff --git a/src/SiteGenSPA/components/Layouts/Base.js b/src/SiteGenSPA/components/Layouts/Base.js new file mode 100644 index 000000000..287580eda --- /dev/null +++ b/src/SiteGenSPA/components/Layouts/Base.js @@ -0,0 +1,27 @@ +import classNames from 'classnames'; +import { speak } from '@wordpress/a11y'; +import { useEffect } from '@wordpress/element'; +import { useLocation } from 'react-router-dom'; + +const BaseLayout = ( { className = 'nfd-sitegen-layout__base', children } ) => { + const location = useLocation(); + const mainContainer = document.querySelector( '.nfd-sitegen-content' ); + + const speakRouteTitle = ( title = 'Showing new Onboarding Page' ) => { + // [TODO]: Determine if some routes should not speak the title + speak( title, 'assertive' ); + }; + + useEffect( () => { + mainContainer?.focus( { preventScroll: true } ); + speakRouteTitle( 'Override' ); + }, [ location.pathname ] ); + + return ( +
+ { children } +
+ ); +}; + +export default BaseLayout; diff --git a/src/SiteGenSPA/components/Layouts/Common.js b/src/SiteGenSPA/components/Layouts/Common.js new file mode 100644 index 000000000..238581b0b --- /dev/null +++ b/src/SiteGenSPA/components/Layouts/Common.js @@ -0,0 +1,62 @@ +import BaseLayout from './Base'; +import { Fragment } from '@wordpress/element'; +import classNames from 'classnames'; +import Animate from '../Animate'; + +/** + * + * @param {*} param0 + * @return + */ +const InnerContainer = ( { children } ) => { + return
{ children }
; +}; + +/** + * The Common Layout extends the Base Layout and applies structural styles and animations. + * + * @param {Object} props + * @param props.className + * @param props.children + * @param props.isBgPrimary + * @param props.isCentered + * @param props.isVerticallyCentered + * @param props.isContained + * @param props.isPadded + * @param props.isFadeIn + * @return + */ +const CommonLayout = ( { + className = '', + children, + isBgPrimary = false, + isCentered = false, + isVerticallyCentered = false, + isContained = false, + isPadded = false, + isFadeIn = true, +} ) => { + const Container = isContained ? InnerContainer : Fragment; + return ( + + + { children } + + + ); +}; + +export default CommonLayout; diff --git a/src/SiteGenSPA/components/Layouts/stylesheet.scss b/src/SiteGenSPA/components/Layouts/stylesheet.scss new file mode 100644 index 000000000..9346a7fe8 --- /dev/null +++ b/src/SiteGenSPA/components/Layouts/stylesheet.scss @@ -0,0 +1,17 @@ +.nfd-sitegen-layout__common { + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$admin-bar-height-big}); + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width}); + } + &.is-padded { + min-height: calc(100vw - #{$header-height} - #{$border-width} - #{$grid-unit * 18} - #{$admin-bar-height-big}); + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$grid-unit * 18}); + } + padding: #{$grid-unit * 9}; + } + > .is-contained { + width: 100%; + max-width: $break-huge; + } +} \ No newline at end of file diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js index 59f765856..3f1060207 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js @@ -2,13 +2,6 @@ * External dependencies */ import classnames from 'classnames'; - -/** - * WordPress dependencies - */ -/** - * WordPress dependencies - */ import { forwardRef, useEffect } from '@wordpress/element'; // eslint-disable-next-line @wordpress/no-unsafe-wp-apis import { __unstableUseNavigateRegions as useNavigateRegions } from '@wordpress/components'; diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss index d2133abab..ecd422163 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/style.scss @@ -18,7 +18,7 @@ html.nfd-interface-interface-skeleton__html-container { height: auto; max-height: 100%; - // Fill the available space on Mobile. + /* Fill the available space on Mobile. */ position: fixed; top: 46px; left: 0; diff --git a/src/SiteGenSPA/index.js b/src/SiteGenSPA/index.js new file mode 100644 index 000000000..71eeb9640 --- /dev/null +++ b/src/SiteGenSPA/index.js @@ -0,0 +1,78 @@ +import './styles/app.scss'; +import { store as nfdOnboardingStore } from './store'; /* must import prior to App! */ +import { getFlow } from './utils/api/flow'; +import { init as initializePlugins } from './utils/api/plugins'; +import { init as initializeThemes } from './utils/api/themes'; +import { trigger as cronTrigger } from './utils/api/cronTrigger'; +import { initialize as initializeSettings } from './utils/api/settings'; +import { DESIGN_STEPS_THEME } from '../constants'; + +// import App from './components/App'; +import AppSiteGen from '../SiteGenSPA/components/AppSiteGen'; +import { HashRouter } from 'react-router-dom'; +import { dispatch } from '@wordpress/data'; +import { render } from '@wordpress/element'; +import { getInitialChapters } from './data/flows'; +import { stateToStore } from './chapters/utils'; + +/** + * Component passed to wp.element.render(). + * + * @return {WPComponent} NFDOnboarding Component + */ +const NFDOnboarding = () => ( + + + +); + +const initializeFlowData = ( currentData ) => { + currentData.hasExited = 0; + currentData.isComplete = 0; + const currentFlow = window.nfdOnboarding.currentFlow; + currentData.data.chapters = stateToStore( + getInitialChapters( currentFlow ), + currentData.data.chapters + ); + return currentData; +}; + +/** + * Method to initialize Onboarding interface inside WordPress Admin. + * + * @param {string} id - Element ID to render into. + * @param {Object} runtime - Expects runtime data from window.nfdOnboarding. + */ +export async function initializeNFDOnboarding( id, runtime ) { + initializePlugins(); + initializeThemes(); + setInterval( cronTrigger, 45000 ); + + const DOM_TARGET = document.getElementById( id ); + dispatch( nfdOnboardingStore ).setRuntime( runtime ); + if ( runtime.previewSettings.settings.preRequisites?.themes ) { + dispatch( nfdOnboardingStore ).updateThemeStatus( + runtime.previewSettings.settings.preRequisites?.themes[ + DESIGN_STEPS_THEME + ] + ); + } + + const currentData = await getFlow(); + if ( currentData.error === null ) { + currentData.body = initializeFlowData( currentData.body ); + dispatch( nfdOnboardingStore ).setCurrentOnboardingData( + currentData.body + ); + } + + if ( null !== DOM_TARGET && 'undefined' !== typeof render ) { + render( , DOM_TARGET ); + initializeSettings(); + } else { + // eslint-disable-next-line no-console + console.log( 'Could not find mount element or wp.element.render().' ); + } +} + +export default initializeNFDOnboarding; diff --git a/src/SiteGenSPA/static/icons/back.svg b/src/SiteGenSPA/static/icons/back.svg new file mode 100644 index 000000000..679d81434 --- /dev/null +++ b/src/SiteGenSPA/static/icons/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/SiteGenSPA/static/icons/chevron-down.svg b/src/SiteGenSPA/static/icons/chevron-down.svg new file mode 100644 index 000000000..d6ad34472 --- /dev/null +++ b/src/SiteGenSPA/static/icons/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-left.svg b/src/SiteGenSPA/static/icons/chevron-left.svg new file mode 100644 index 000000000..25cf48803 --- /dev/null +++ b/src/SiteGenSPA/static/icons/chevron-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-right.svg b/src/SiteGenSPA/static/icons/chevron-right.svg new file mode 100644 index 000000000..3834a5d5b --- /dev/null +++ b/src/SiteGenSPA/static/icons/chevron-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-up.svg b/src/SiteGenSPA/static/icons/chevron-up.svg new file mode 100644 index 000000000..10270765a --- /dev/null +++ b/src/SiteGenSPA/static/icons/chevron-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/SiteGenSPA/static/icons/default-logo.svg b/src/SiteGenSPA/static/icons/default-logo.svg new file mode 100644 index 000000000..70354233f --- /dev/null +++ b/src/SiteGenSPA/static/icons/default-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/design.svg b/src/SiteGenSPA/static/icons/design.svg new file mode 100644 index 000000000..d815df627 --- /dev/null +++ b/src/SiteGenSPA/static/icons/design.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/forward.svg b/src/SiteGenSPA/static/icons/forward.svg new file mode 100644 index 000000000..9a46f450f --- /dev/null +++ b/src/SiteGenSPA/static/icons/forward.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/more.svg b/src/SiteGenSPA/static/icons/more.svg new file mode 100644 index 000000000..c10b6be42 --- /dev/null +++ b/src/SiteGenSPA/static/icons/more.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/publish.svg b/src/SiteGenSPA/static/icons/publish.svg new file mode 100644 index 000000000..e09a2982f --- /dev/null +++ b/src/SiteGenSPA/static/icons/publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/reload.svg b/src/SiteGenSPA/static/icons/reload.svg new file mode 100644 index 000000000..d292377de --- /dev/null +++ b/src/SiteGenSPA/static/icons/reload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/sell.svg b/src/SiteGenSPA/static/icons/sell.svg new file mode 100644 index 000000000..8f016e275 --- /dev/null +++ b/src/SiteGenSPA/static/icons/sell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/analytics.svg b/src/SiteGenSPA/static/icons/site-features/analytics.svg new file mode 100644 index 000000000..c9b31f9b5 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/analytics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg b/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg new file mode 100644 index 000000000..ac25b4674 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/comingsoon.svg b/src/SiteGenSPA/static/icons/site-features/comingsoon.svg new file mode 100644 index 000000000..9fb2dd985 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/comingsoon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/SiteGenSPA/static/icons/site-features/email.svg b/src/SiteGenSPA/static/icons/site-features/email.svg new file mode 100644 index 000000000..525ff6652 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/filter.svg b/src/SiteGenSPA/static/icons/site-features/filter.svg new file mode 100644 index 000000000..dbf81a17d --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/form.svg b/src/SiteGenSPA/static/icons/site-features/form.svg new file mode 100644 index 000000000..6a4ba90f4 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/lead.svg b/src/SiteGenSPA/static/icons/site-features/lead.svg new file mode 100644 index 000000000..1971dabca --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/lead.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/search.svg b/src/SiteGenSPA/static/icons/site-features/search.svg new file mode 100644 index 000000000..1c20b2039 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/security.svg b/src/SiteGenSPA/static/icons/site-features/security.svg new file mode 100644 index 000000000..091d81af8 --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/security.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/share.svg b/src/SiteGenSPA/static/icons/site-features/share.svg new file mode 100644 index 000000000..cfb00667c --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/wishlist.svg b/src/SiteGenSPA/static/icons/site-features/wishlist.svg new file mode 100644 index 000000000..f735d200b --- /dev/null +++ b/src/SiteGenSPA/static/icons/site-features/wishlist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/facebook.svg b/src/SiteGenSPA/static/icons/social/facebook.svg new file mode 100644 index 000000000..8137a9265 --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/SiteGenSPA/static/icons/social/instagram.svg b/src/SiteGenSPA/static/icons/social/instagram.svg new file mode 100644 index 000000000..64d983066 --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/linkedin.svg b/src/SiteGenSPA/static/icons/social/linkedin.svg new file mode 100644 index 000000000..09273772b --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/tiktok.svg b/src/SiteGenSPA/static/icons/social/tiktok.svg new file mode 100644 index 000000000..a822fdc4f --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/tiktok.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/twitter.svg b/src/SiteGenSPA/static/icons/social/twitter.svg new file mode 100644 index 000000000..901299e4e --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/yelp.svg b/src/SiteGenSPA/static/icons/social/yelp.svg new file mode 100644 index 000000000..33ab4d4ee --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/yelp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/youtube.svg b/src/SiteGenSPA/static/icons/social/youtube.svg new file mode 100644 index 000000000..315a1a609 --- /dev/null +++ b/src/SiteGenSPA/static/icons/social/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/content.png b/src/SiteGenSPA/static/images/content.png new file mode 100644 index 0000000000000000000000000000000000000000..51d599a9153d6fcbd5b8da10aa8c9f95a8b1f6e1 GIT binary patch literal 33928 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 \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/design.png b/src/SiteGenSPA/static/images/design.png new file mode 100644 index 0000000000000000000000000000000000000000..fe25f3e2bb458d2f41a9cb1fa7078595f1da2707 GIT binary patch literal 6597 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 literal 0 HcmV?d00001 diff --git a/src/SiteGenSPA/static/images/design.svg b/src/SiteGenSPA/static/images/design.svg new file mode 100644 index 000000000..686dfb217 --- /dev/null +++ b/src/SiteGenSPA/static/images/design.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/features.png b/src/SiteGenSPA/static/images/features.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8f2d4d49ea61d723f989e7f5784507423f486b GIT binary patch literal 7189 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 \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/help.png b/src/SiteGenSPA/static/images/help.png new file mode 100644 index 0000000000000000000000000000000000000000..80ae1a77eebebd3aed2f99592474032bfdc25451 GIT binary patch literal 35219 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 literal 0 HcmV?d00001 diff --git a/src/SiteGenSPA/static/images/user-avatar.png b/src/SiteGenSPA/static/images/user-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f493b7401d71e9481f5cfd664a1a934182a4c1 GIT binary patch literal 901 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%*;qrN1?DZF(6Oj-S5fuR$!pIEN!@|nR z%E~Fi%grl7GWdUhL6Cz%ib0B*QHg;`kdaxC@&6G9c?JeXR-jiwzJ&rtCZHSH*f}`4 zxPc0`3NSD+GBY!=FoRqTR9y>{XJ8Rz6;d>GWD^cdWLGK_F>0K+kVDyN<3Z7&iyu^s zlZu)+xx~aJB&Af<)HO7@(s#)lOnKGb1qam<1W^8GhXsy?Nu0=C%Bsum>}AZ%!{dtS#{4`vHY; z%|xrH`_aBi@B1u8Z`L{}OpJHCdGFwgsH4UCN~c-6cgFg&1hAhA|5fuV_Q|&Gfiu!O z9!~hS>c_g(kNj5VuKKYkd~51N<=!MC&4)A6)$gyf=X$z=dE<}lhY>Z-D^J?q`Z=v^ zfl&M6jW77Ov&=uVccF5`#Xu1yjRT<%7-RSkZv4+66#e-ATju`^j-vO!i7-B|7ulnn z_ld{S}`*|I$kT$MFt7F3;!6+WGvi?0<%-HUAkL { const content = getContents(); return ( - + Date: Fri, 27 Oct 2023 00:45:16 +0530 Subject: [PATCH 16/30] PRESS2-1233 | fixed changes --- src/OnboardingSPA/styles/_icons.scss | 1 - src/OnboardingSPA/styles/app.scss | 6 - src/SiteGenSPA/index.js | 77 +----- src/SiteGenSPA/static/icons/back.svg | 3 - src/SiteGenSPA/static/icons/chevron-down.svg | 1 - src/SiteGenSPA/static/icons/chevron-left.svg | 1 - src/SiteGenSPA/static/icons/chevron-right.svg | 1 - src/SiteGenSPA/static/icons/chevron-up.svg | 3 - src/SiteGenSPA/static/icons/default-logo.svg | 1 - src/SiteGenSPA/static/icons/design.svg | 1 - src/SiteGenSPA/static/icons/forward.svg | 1 - src/SiteGenSPA/static/icons/publish.svg | 1 - src/SiteGenSPA/static/icons/reload.svg | 1 - src/SiteGenSPA/static/icons/sell.svg | 1 - .../static/icons/site-features/analytics.svg | 1 - .../icons/site-features/bookingcalendar.svg | 1 - .../static/icons/site-features/comingsoon.svg | 3 - .../static/icons/site-features/email.svg | 1 - .../static/icons/site-features/filter.svg | 1 - .../static/icons/site-features/form.svg | 1 - .../static/icons/site-features/lead.svg | 1 - .../static/icons/site-features/search.svg | 1 - .../static/icons/site-features/security.svg | 1 - .../static/icons/site-features/share.svg | 1 - .../static/icons/site-features/wishlist.svg | 1 - .../static/icons/social/facebook.svg | 3 - .../static/icons/social/instagram.svg | 1 - .../static/icons/social/linkedin.svg | 1 - src/SiteGenSPA/static/icons/social/tiktok.svg | 1 - .../static/icons/social/twitter.svg | 1 - src/SiteGenSPA/static/icons/social/yelp.svg | 1 - .../static/icons/social/youtube.svg | 1 - src/SiteGenSPA/styles/_branding.scss | 257 ------------------ src/SiteGenSPA/styles/_icons.scss | 37 --- src/SiteGenSPA/styles/app.scss | 62 +---- src/onboarding.js | 3 +- 36 files changed, 10 insertions(+), 470 deletions(-) delete mode 100644 src/SiteGenSPA/static/icons/back.svg delete mode 100644 src/SiteGenSPA/static/icons/chevron-down.svg delete mode 100644 src/SiteGenSPA/static/icons/chevron-left.svg delete mode 100644 src/SiteGenSPA/static/icons/chevron-right.svg delete mode 100644 src/SiteGenSPA/static/icons/chevron-up.svg delete mode 100644 src/SiteGenSPA/static/icons/default-logo.svg delete mode 100644 src/SiteGenSPA/static/icons/design.svg delete mode 100644 src/SiteGenSPA/static/icons/forward.svg delete mode 100644 src/SiteGenSPA/static/icons/publish.svg delete mode 100644 src/SiteGenSPA/static/icons/reload.svg delete mode 100644 src/SiteGenSPA/static/icons/sell.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/analytics.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/comingsoon.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/email.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/filter.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/form.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/lead.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/search.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/security.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/share.svg delete mode 100644 src/SiteGenSPA/static/icons/site-features/wishlist.svg delete mode 100644 src/SiteGenSPA/static/icons/social/facebook.svg delete mode 100644 src/SiteGenSPA/static/icons/social/instagram.svg delete mode 100644 src/SiteGenSPA/static/icons/social/linkedin.svg delete mode 100644 src/SiteGenSPA/static/icons/social/tiktok.svg delete mode 100644 src/SiteGenSPA/static/icons/social/twitter.svg delete mode 100644 src/SiteGenSPA/static/icons/social/yelp.svg delete mode 100644 src/SiteGenSPA/static/icons/social/youtube.svg diff --git a/src/OnboardingSPA/styles/_icons.scss b/src/OnboardingSPA/styles/_icons.scss index 9284b60fa..31501c2a6 100644 --- a/src/OnboardingSPA/styles/_icons.scss +++ b/src/OnboardingSPA/styles/_icons.scss @@ -20,7 +20,6 @@ body { --get-started-content-img: url(../static/images/content.png); --get-started-design-img: url(../static/images/design.png); --get-started-features-img: url(../static/images/features.png); - --adminbar-avatar-img: url(../static/images/user-avatar.png); --chevron-left-icon: url(../static/icons/chevron-left.svg); diff --git a/src/OnboardingSPA/styles/app.scss b/src/OnboardingSPA/styles/app.scss index c2305f844..b92bb1b7f 100644 --- a/src/OnboardingSPA/styles/app.scss +++ b/src/OnboardingSPA/styles/app.scss @@ -43,11 +43,6 @@ @import "../components/Loaders/Chapter/Interstitial/stylesheet"; @import "../components/Grid/stylesheet"; @import "../components/ComingSoon/stylesheet"; -@import "../../SiteGenSPA/components/SiteGenInterfaceSkeleton/style"; -@import "../../SiteGenSPA/components/AdminBarSiteGen/stylesheet"; -@import "../../SiteGenSPA/components/ProgressBarSiteGen/stylesheet"; -@import "../../SiteGenSPA/components/ToggleDarkMode/stylesheet"; -@import "../../SiteGenSPA/components/HeaderSiteGen/stylesheet"; // CSS for Pages @import "../steps/BasicInfo/stylesheet"; @@ -62,7 +57,6 @@ @import "../steps/DesignFonts/stylesheet"; @import "../steps/DesignHeaderMenu/stylesheet"; @import "../steps/SiteFeatures/stylesheet"; -@import "../../SiteGenSPA/steps/SiteGenGetStarted/stylesheet"; .nfd-onboarding-container { display: flex; diff --git a/src/SiteGenSPA/index.js b/src/SiteGenSPA/index.js index 71eeb9640..7fd6ea595 100644 --- a/src/SiteGenSPA/index.js +++ b/src/SiteGenSPA/index.js @@ -1,78 +1,5 @@ import './styles/app.scss'; -import { store as nfdOnboardingStore } from './store'; /* must import prior to App! */ -import { getFlow } from './utils/api/flow'; -import { init as initializePlugins } from './utils/api/plugins'; -import { init as initializeThemes } from './utils/api/themes'; -import { trigger as cronTrigger } from './utils/api/cronTrigger'; -import { initialize as initializeSettings } from './utils/api/settings'; -import { DESIGN_STEPS_THEME } from '../constants'; -// import App from './components/App'; -import AppSiteGen from '../SiteGenSPA/components/AppSiteGen'; -import { HashRouter } from 'react-router-dom'; -import { dispatch } from '@wordpress/data'; -import { render } from '@wordpress/element'; -import { getInitialChapters } from './data/flows'; -import { stateToStore } from './chapters/utils'; +// export async function initializeNFDSiteGen() {} -/** - * Component passed to wp.element.render(). - * - * @return {WPComponent} NFDOnboarding Component - */ -const NFDOnboarding = () => ( - - - -); - -const initializeFlowData = ( currentData ) => { - currentData.hasExited = 0; - currentData.isComplete = 0; - const currentFlow = window.nfdOnboarding.currentFlow; - currentData.data.chapters = stateToStore( - getInitialChapters( currentFlow ), - currentData.data.chapters - ); - return currentData; -}; - -/** - * Method to initialize Onboarding interface inside WordPress Admin. - * - * @param {string} id - Element ID to render into. - * @param {Object} runtime - Expects runtime data from window.nfdOnboarding. - */ -export async function initializeNFDOnboarding( id, runtime ) { - initializePlugins(); - initializeThemes(); - setInterval( cronTrigger, 45000 ); - - const DOM_TARGET = document.getElementById( id ); - dispatch( nfdOnboardingStore ).setRuntime( runtime ); - if ( runtime.previewSettings.settings.preRequisites?.themes ) { - dispatch( nfdOnboardingStore ).updateThemeStatus( - runtime.previewSettings.settings.preRequisites?.themes[ - DESIGN_STEPS_THEME - ] - ); - } - - const currentData = await getFlow(); - if ( currentData.error === null ) { - currentData.body = initializeFlowData( currentData.body ); - dispatch( nfdOnboardingStore ).setCurrentOnboardingData( - currentData.body - ); - } - - if ( null !== DOM_TARGET && 'undefined' !== typeof render ) { - render( , DOM_TARGET ); - initializeSettings(); - } else { - // eslint-disable-next-line no-console - console.log( 'Could not find mount element or wp.element.render().' ); - } -} - -export default initializeNFDOnboarding; +export default function initializeNFDSiteGen() {} diff --git a/src/SiteGenSPA/static/icons/back.svg b/src/SiteGenSPA/static/icons/back.svg deleted file mode 100644 index 679d81434..000000000 --- a/src/SiteGenSPA/static/icons/back.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/SiteGenSPA/static/icons/chevron-down.svg b/src/SiteGenSPA/static/icons/chevron-down.svg deleted file mode 100644 index d6ad34472..000000000 --- a/src/SiteGenSPA/static/icons/chevron-down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-left.svg b/src/SiteGenSPA/static/icons/chevron-left.svg deleted file mode 100644 index 25cf48803..000000000 --- a/src/SiteGenSPA/static/icons/chevron-left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-right.svg b/src/SiteGenSPA/static/icons/chevron-right.svg deleted file mode 100644 index 3834a5d5b..000000000 --- a/src/SiteGenSPA/static/icons/chevron-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/chevron-up.svg b/src/SiteGenSPA/static/icons/chevron-up.svg deleted file mode 100644 index 10270765a..000000000 --- a/src/SiteGenSPA/static/icons/chevron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/SiteGenSPA/static/icons/default-logo.svg b/src/SiteGenSPA/static/icons/default-logo.svg deleted file mode 100644 index 70354233f..000000000 --- a/src/SiteGenSPA/static/icons/default-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/design.svg b/src/SiteGenSPA/static/icons/design.svg deleted file mode 100644 index d815df627..000000000 --- a/src/SiteGenSPA/static/icons/design.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/forward.svg b/src/SiteGenSPA/static/icons/forward.svg deleted file mode 100644 index 9a46f450f..000000000 --- a/src/SiteGenSPA/static/icons/forward.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/publish.svg b/src/SiteGenSPA/static/icons/publish.svg deleted file mode 100644 index e09a2982f..000000000 --- a/src/SiteGenSPA/static/icons/publish.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/reload.svg b/src/SiteGenSPA/static/icons/reload.svg deleted file mode 100644 index d292377de..000000000 --- a/src/SiteGenSPA/static/icons/reload.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/sell.svg b/src/SiteGenSPA/static/icons/sell.svg deleted file mode 100644 index 8f016e275..000000000 --- a/src/SiteGenSPA/static/icons/sell.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/analytics.svg b/src/SiteGenSPA/static/icons/site-features/analytics.svg deleted file mode 100644 index c9b31f9b5..000000000 --- a/src/SiteGenSPA/static/icons/site-features/analytics.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg b/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg deleted file mode 100644 index ac25b4674..000000000 --- a/src/SiteGenSPA/static/icons/site-features/bookingcalendar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/comingsoon.svg b/src/SiteGenSPA/static/icons/site-features/comingsoon.svg deleted file mode 100644 index 9fb2dd985..000000000 --- a/src/SiteGenSPA/static/icons/site-features/comingsoon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/SiteGenSPA/static/icons/site-features/email.svg b/src/SiteGenSPA/static/icons/site-features/email.svg deleted file mode 100644 index 525ff6652..000000000 --- a/src/SiteGenSPA/static/icons/site-features/email.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/filter.svg b/src/SiteGenSPA/static/icons/site-features/filter.svg deleted file mode 100644 index dbf81a17d..000000000 --- a/src/SiteGenSPA/static/icons/site-features/filter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/form.svg b/src/SiteGenSPA/static/icons/site-features/form.svg deleted file mode 100644 index 6a4ba90f4..000000000 --- a/src/SiteGenSPA/static/icons/site-features/form.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/lead.svg b/src/SiteGenSPA/static/icons/site-features/lead.svg deleted file mode 100644 index 1971dabca..000000000 --- a/src/SiteGenSPA/static/icons/site-features/lead.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/search.svg b/src/SiteGenSPA/static/icons/site-features/search.svg deleted file mode 100644 index 1c20b2039..000000000 --- a/src/SiteGenSPA/static/icons/site-features/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/security.svg b/src/SiteGenSPA/static/icons/site-features/security.svg deleted file mode 100644 index 091d81af8..000000000 --- a/src/SiteGenSPA/static/icons/site-features/security.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/share.svg b/src/SiteGenSPA/static/icons/site-features/share.svg deleted file mode 100644 index cfb00667c..000000000 --- a/src/SiteGenSPA/static/icons/site-features/share.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/site-features/wishlist.svg b/src/SiteGenSPA/static/icons/site-features/wishlist.svg deleted file mode 100644 index f735d200b..000000000 --- a/src/SiteGenSPA/static/icons/site-features/wishlist.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/facebook.svg b/src/SiteGenSPA/static/icons/social/facebook.svg deleted file mode 100644 index 8137a9265..000000000 --- a/src/SiteGenSPA/static/icons/social/facebook.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/SiteGenSPA/static/icons/social/instagram.svg b/src/SiteGenSPA/static/icons/social/instagram.svg deleted file mode 100644 index 64d983066..000000000 --- a/src/SiteGenSPA/static/icons/social/instagram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/linkedin.svg b/src/SiteGenSPA/static/icons/social/linkedin.svg deleted file mode 100644 index 09273772b..000000000 --- a/src/SiteGenSPA/static/icons/social/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/tiktok.svg b/src/SiteGenSPA/static/icons/social/tiktok.svg deleted file mode 100644 index a822fdc4f..000000000 --- a/src/SiteGenSPA/static/icons/social/tiktok.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/twitter.svg b/src/SiteGenSPA/static/icons/social/twitter.svg deleted file mode 100644 index 901299e4e..000000000 --- a/src/SiteGenSPA/static/icons/social/twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/yelp.svg b/src/SiteGenSPA/static/icons/social/yelp.svg deleted file mode 100644 index 33ab4d4ee..000000000 --- a/src/SiteGenSPA/static/icons/social/yelp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/icons/social/youtube.svg b/src/SiteGenSPA/static/icons/social/youtube.svg deleted file mode 100644 index 315a1a609..000000000 --- a/src/SiteGenSPA/static/icons/social/youtube.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/styles/_branding.scss b/src/SiteGenSPA/styles/_branding.scss index fb4630d56..c89544882 100644 --- a/src/SiteGenSPA/styles/_branding.scss +++ b/src/SiteGenSPA/styles/_branding.scss @@ -9,9 +9,6 @@ body { --wp-admin-theme-color-darker-10--rgb: 0, 107, 161; --wp-admin-theme-color-darker-20: #1e1e1e; --wp-admin-theme-color-darker-20--rgb: 0, 30, 30; - --nfd-onboarding-contrast-icon: url(../../Brands/wordpress/dark.svg); - --nfd-onboarding-icon: url(../../Brands/wordpress/icon.svg); - --nfd-onboarding-logo: url(../../Brands/wordpress/logo.svg); --nfd-onboarding-primary: var(--wp-admin-theme-color); --nfd-onboarding-highlighted--rgb: var(--wp-admin-theme-color-darker-10--rgb); --nfd-onboarding-primary-alt: var(--wp-admin-theme-color-darker-10); @@ -39,259 +36,5 @@ body { --nfd-onboarding-drawer-icon-active-fill: var(--nfd-onboarding-light); --nfd-onboarding-loader-start: var(--nfd-onboarding-primary); --nfd-onboarding-loader-end: var(--nfd-onboarding-secondary); - --nfd-onboarding-step-loader-icon: url(../../Brands/wordpress/step-loader-logo.svg); - --nfd-onboarding-step-error-icon: url(../../Brands/wordpress/step-error-logo.svg); - --nfd-onboarding-step-what-next-img-3: url(../../Brands/wordpress/full-service.png); - --nfd-onboarding-step-what-next-img-1: url(../../Brands/wordpress/wp-admin.png); - --nfd-onboarding-step-what-next-img-2: url(../static/images/help.png); - } - - &.nfd-brand-bluehost, - &.nfd-brand-bluehost-india { - --wp-admin-theme-color: #3575d3; - --wp-admin-theme-color--rgb: 53, 117, 211; - --wp-admin-theme-color-darker-10: #1c5cba; - --wp-admin-theme-color-darker-10--rgb: 28, 92, 186; - --wp-admin-theme-color-darker-20: #0242a0; - --wp-admin-theme-color-darker-20--rgb: 2, 66, 160; - --nfd-onboarding-contrast-icon: url(../../Brands/bluehost/dark.svg); - --nfd-onboarding-icon: url(../../Brands/bluehost/icon.svg); - --nfd-onboarding-logo: url(../../Brands/bluehost/logo.svg); - --nfd-onboarding-primary: #3575d3; - --nfd-onboarding-highlighted--rgb: 123, 177, 253; - --nfd-onboarding-primary-alt: #2c76dc; - --nfd-onboarding-secondary: #495c77; - --nfd-onboarding-secondary-alt: #304663; - --nfd-onboarding-tertiary: #7bb1fd; - --nfd-onboarding-tertiary-alt: #84c0fc; - --nfd-onboarding-base: #fff; - --nfd-onboarding-light-gray: #f0f0f0; - --nfd-onboarding-light-gray-2: #efefef; - --nfd-onboarding-light-gray-3: #f2f2f2; - --nfd-onboarding-light-gray-4: #a7a7a7; - --nfd-onboarding-light-gray-5: #eee; - --nfd-onboarding-light-gray-6: rgb(224, 224, 224); - --nfd-onboarding-light-gray-7: #f6f7f8; - --nfd-onboarding-light-gray-8: #ccc; - --nfd-onboarding-light-gray-highlighted: #e2e9f4; - --nfd-onboarding-contrast: #1d2a3b; - --nfd-onboarding-drawer-base: var(--nfd-onboarding-contrast); - --nfd-onboarding-drawer-contrast: var(--nfd-onboarding-base); - --nfd-onboarding-border: 219, 219, 219; - --nfd-onboarding-drawer-icon-fill: var(--nfd-onboarding-tertiary); - --nfd-onboarding-drawer-icon-active-fill: var(--nfd-onboarding-base); - --nfd-onboarding-loader-start: var(--nfd-onboarding-primary); - --nfd-onboarding-loader-end: var(--nfd-onboarding-tertiary); - --nfd-onboarding-step-loader-icon: url(../../Brands/bluehost/step-loader-logo.svg); - --nfd-onboarding-step-error-icon: url(../../Brands/bluehost/step-error-logo.svg); - --nfd-onboarding-step-what-next-img-3: url(../../Brands/bluehost/bluesky.png); - --nfd-onboarding-step-what-next-img-1: url(../../Brands/bluehost/wp-admin.png); - --nfd-onboarding-step-what-next-img-2: url(../static/images/help.png); - --nfd-onboarding-step-interstitial-img: url(../../Brands/bluehost/step-interstitial.png); - - --nfd-onboarding-sidebar-learn-more-get-started-welcome-illustration: url(../../Brands/bluehost/learn-more-get-started-welcome.svg); - --nfd-onboarding-sidebar-learn-more-get-started-wp-experience-illustration: url(../../Brands/bluehost/learn-more-get-started-wp-experience.svg); - --nfd-onboarding-sidebar-learn-more-get-started-site-type-illustration: url(../../Brands/bluehost/learn-more-get-started-site-type.svg); - --nfd-onboarding-sidebar-learn-more-ecommerce-address-illustration: url(../../Brands/bluehost/learn-more-ecommerce-address.svg); - --nfd-onboarding-sidebar-learn-more-ecommerce-tax-info-illustration: url(../../Brands/bluehost/learn-more-ecommerce-tax-info.svg); - --nfd-onboarding-sidebar-learn-more-ecommerce-products-illustration: url(../../Brands/bluehost/learn-more-ecommerce-products.svg); - --nfd-onboarding-sidebar-learn-more-basic-info-illustration: url(../../Brands/bluehost/learn-more-basic-info.svg); - --nfd-onboarding-sidebar-learn-more-design-theme-styles-illustration: url(../../Brands/bluehost/learn-more-design-theme-styles.svg); - --nfd-onboarding-sidebar-learn-more-design-colors-illustration: url(../../Brands/bluehost/learn-more-design-colors.svg); - --nfd-onboarding-sidebar-learn-more-design-fonts-illustration: url(../../Brands/bluehost/learn-more-design-fonts.svg); - --nfd-onboarding-sidebar-learn-more-design-header-menu-illustration: url(../../Brands/bluehost/learn-more-design-header-menu.svg); - --nfd-onboarding-sidebar-learn-more-design-homepage-illustration: url(../../Brands/bluehost/learn-more-design-homepage.svg); - --nfd-onboarding-sidebar-learn-more-pages-illustration: url(../../Brands/bluehost/learn-more-pages.svg); - --nfd-onboarding-sidebar-learn-more-site-features-illustration: url(../../Brands/bluehost/learn-more-site-features.svg); - --nfd-onboarding-sidebar-learn-more-what-next-illustration: url(../../Brands/bluehost/learn-more-what-next.svg); - } - - &.nfd-brand-hostgator-br { - --wp-admin-theme-color: #2e93ee; - --wp-admin-theme-color--rgb: 46, 147, 238; - --wp-admin-theme-color-darker-10: #1485ec; - --wp-admin-theme-color-darker-10--rgb: 20, 133, 236; - --wp-admin-theme-color-darker-20: #1177d2; - --wp-admin-theme-color-darker-20--rgb: 17, 119, 210; - --nfd-onboarding-contrast-icon: url(../../Brands/hostgator/dark.svg); - --nfd-onboarding-icon: url(../../Brands/hostgator/icon.svg); - --nfd-onboarding-logo: url(../../Brands/hostgator/logo.svg); - --nfd-onboarding-primary: #2e93ee; - --nfd-onboarding-highlighted--rgb: var(--wp-admin-theme-color-darker-10--rgb); - --nfd-onboarding-primary-alt: #3b97ff; - --nfd-onboarding-secondary: #cdd8df; - --nfd-onboarding-secondary-alt: #363636; - --nfd-onboarding-tertiary: #ffcf00; - --nfd-onboarding-tertiary-alt: #ff9144; - --nfd-onboarding-base: #f5f6f8; - --nfd-onboarding-light-gray: #f0f0f0; - --nfd-onboarding-light-gray-2: #efefef; - --nfd-onboarding-light-gray-3: #f2f2f2; - --nfd-onboarding-light-gray-4: #a7a7a7; - --nfd-onboarding-light-gray-5: #eee; - --nfd-onboarding-light-gray-6: rgb(224, 224, 224); - --nfd-onboarding-light-gray-7: #f6f7f8; - --nfd-onboarding-light-gray-8: #ccc; - --nfd-onboarding-light-gray-highlighted: #e2e9f4; - --nfd-onboarding-contrast: #1e2044; - --nfd-onboarding-drawer-base: var(--nfd-onboarding-contrast); - --nfd-onboarding-drawer-contrast: var(--nfd-onboarding-base); - --nfd-onboarding-border: 245, 246, 248; - --nfd-onboarding-drawer-icon-fill: var(--nfd-onboarding-tertiary); - --nfd-onboarding-drawer-icon-active-fill: var(--nfd-onboarding-base); - --nfd-onboarding-loader-start: var(--nfd-onboarding-primary); - --nfd-onboarding-loader-end: var(--nfd-onboarding-tertiary); - --nfd-onboarding-step-loader-icon: url(../../Brands/hostgator/step-loader-logo.svg); - --nfd-onboarding-step-error-icon: url(../../Brands/hostgator/step-error-logo.svg); - --nfd-onboarding-step-what-next-img-3: url(../../Brands/wordpress/full-service.png); - --nfd-onboarding-step-what-next-img-1: url(../../Brands/wordpress/wp-admin.png); - --nfd-onboarding-step-what-next-img-2: url(../static/images/help.png); - } - - &.nfd-brand-webcom { - --wp-admin-theme-color: #4b75fc; - --wp-admin-theme-color--rgb: 75, 117, 252; - --wp-admin-theme-color-darker-10: #2b5cfb; - --wp-admin-theme-color-darker-10--rgb: 43, 92, 251; - --wp-admin-theme-color-darker-20: #0b44fb; - --wp-admin-theme-color-darker-20--rgb: 11, 68, 251; - --nfd-onboarding-contrast-icon: url(../../Brands/webcom/dark.svg); - --nfd-onboarding-icon: url(../../Brands/webcom/icon.svg); - --nfd-onboarding-logo: url(../../Brands/webcom/logo.svg); - --nfd-onboarding-primary: #4b75fc; - --nfd-onboarding-highlighted--rgb: var(--wp-admin-theme-color-darker-10--rgb); - --nfd-onboarding-primary-alt: #0d47fb; - --nfd-onboarding-secondary: #d4dce1; - --nfd-onboarding-secondary-alt: #171003; - --nfd-onboarding-tertiary: #fed96a; - --nfd-onboarding-tertiary-alt: #fec101; - --nfd-onboarding-base: #fff; - --nfd-onboarding-light-gray: #f0f0f0; - --nfd-onboarding-light-gray-2: #efefef; - --nfd-onboarding-light-gray-3: #f2f2f2; - --nfd-onboarding-light-gray-4: #a7a7a7; - --nfd-onboarding-light-gray-5: #eee; - --nfd-onboarding-light-gray-6: rgb(224, 224, 224); - --nfd-onboarding-light-gray-7: #f6f7f8; - --nfd-onboarding-light-gray-8: #ccc; - --nfd-onboarding-light-gray-highlighted: #e2e9f4; - --nfd-onboarding-contrast: #000; - --nfd-onboarding-drawer-base: var(--nfd-onboarding-contrast); - --nfd-onboarding-drawer-contrast: var(--nfd-onboarding-base); - --nfd-onboarding-border: 219, 219, 219; - --nfd-onboarding-drawer-icon-fill: var(--nfd-onboarding-tertiary-alt); - --nfd-onboarding-drawer-icon-active-fill: var(--nfd-onboarding-tertiary-alt); - --nfd-onboarding-loader-start: var(--nfd-onboarding-primary); - --nfd-onboarding-loader-end: var(--nfd-onboarding-tertiary); - } - - &.nfd-brand-crazy-domains { - --wp-admin-theme-color: #548224; - --wp-admin-theme-color--rgb: 84, 130, 36; - --wp-admin-theme-color-darker-10: #4c7520; - --wp-admin-theme-color-darker-10--rgb: 76, 117, 32; - --wp-admin-theme-color-darker-20: #43681d; - --wp-admin-theme-color-darker-20--rgb: 67, 104, 29; - --nfd-onboarding-contrast-icon: url(../../Brands/crazy-domains/icon-empty.svg); - --nfd-onboarding-icon: url(../../Brands/crazy-domains/icon.svg); - --nfd-onboarding-logo: url(../../Brands/crazy-domains/logo.svg); - --nfd-onboarding-primary: var(--wp-admin-theme-color); - --nfd-onboarding-highlighted--rgb: var(--wp-admin-theme-color-darker-10--rgb); - --nfd-onboarding-primary-alt: var(--wp-admin-theme-color-darker-10); - --nfd-onboarding-secondary: #c3cbd8; - --nfd-onboarding-secondary-alt: #1d2a3b; - --nfd-onboarding-tertiary: #196bde; - --nfd-onboarding-tertiary-alt: #c77d1c; - --nfd-onboarding-base: #fff; - --nfd-onboarding-light-gray: #fcfff9; - --nfd-onboarding-light-gray-2: #fcfff9; - --nfd-onboarding-light-gray-3: #fcfff9; - --nfd-onboarding-light-gray-4: #5c5c5c; - --nfd-onboarding-light-gray-5: var(--nfd-onboarding-base); - --nfd-onboarding-light-gray-6: rgb(224, 224, 224); - --nfd-onboarding-light-gray-7: #f6f7f8; - --nfd-onboarding-light-gray-8: #ccc; - --nfd-onboarding-light-gray-highlighted: #e2e9f4; - --nfd-onboarding-contrast: #1d2a3b; - --nfd-onboarding-border: 219, 219, 219; - --nfd-onboarding-drawer-icon-fill: var(--nfd-onboarding-light-gray-4); - --nfd-onboarding-drawer-icon-active-fill: var(--nfd-onboarding-primary); - --nfd-onboarding-loader-start: var(--nfd-onboarding-primary); - --nfd-onboarding-loader-end: var(--nfd-onboarding-secondary); - --nfd-onboarding-step-loader-icon: url(../../Brands/crazy-domains/step-loader-logo.svg); - --nfd-onboarding-step-error-icon: url(../../Brands/crazy-domains/step-error-logo.svg); - --nfd-onboarding-step-what-next-img-3: url(../../Brands/crazy-domains/full-service.png); - --nfd-onboarding-step-what-next-img-1: url(../../Brands/crazy-domains/wp-admin.png); - --nfd-onboarding-step-what-next-img-2: url(../static/images/help.png); - - --nfd-onboarding-drawer-base: var(--nfd-onboarding-base); - --nfd-onboarding-drawer-contrast: var(--nfd-onboarding-contrast); - --nfd-onboarding-content-base: var(--nfd-onboarding-base); - - .nfd-onboarding-drawer__toggle { - background-color: transparent; - - &-button { - background-color: transparent; - } - - border-bottom: 1px solid #e0e0e0; - - &.is-open { - border-bottom: none; - } - } - - .nfd-onboarding-drawer__panel { - - &-scroll-container { - border-right: 1px solid #e0e0e0; // mirror header border. - } - - &-site-title { - color: var(--nfd-onboarding-light-gray-4); - } - - &-menu-link { - color: var(--nfd-onboarding-light-gray-4); - - &.active { - background-color: var(--nfd-onboarding-drawer-base); - color: var(--nfd-onboarding-primary); - border-color: var(--nfd-onboarding-primary); - } - } - - .custom-palette { - color: var(--nfd-onboarding-base); - } - - .drawer-palette--button { - border: 1px solid var(--nfd-onboarding-secondary); - - &:hover { - background-color: var(--nfd-onboarding-primary); - - * { - color: var(--nfd-onboarding-base); - } - } - } - } - - .nfd-onboarding-layout { - - &.is-bg-primary { - background-color: var(--nfd-onboarding-base); - } - - .checkbox-item--selected { - background: rgba(var(--nfd-onboarding-highlighted--rgb), 0.05); - } - - .tab-img { - background-color: rgba(var(--nfd-onboarding-highlighted--rgb), 0.2); - } - } } } diff --git a/src/SiteGenSPA/styles/_icons.scss b/src/SiteGenSPA/styles/_icons.scss index 9284b60fa..c7c9b5bbc 100644 --- a/src/SiteGenSPA/styles/_icons.scss +++ b/src/SiteGenSPA/styles/_icons.scss @@ -1,40 +1,3 @@ body { - --nfd-publish-icon: url(../static/icons/publish.svg); - --nfd-selling-icon: url(../static/icons/sell.svg); - --nfd-design-icon: url(../static/icons/design.svg); - --more-icon: url(../static/icons/more.svg); - --reload-icon: url(../static/icons/reload.svg); - --forward-icon: url(../static/icons/forward.svg); - --back-icon: url(../static/icons/back.svg); - --chevron-up-icon: url(../static/icons/chevron-up.svg); - --chevron-down-icon: url(../static/icons/chevron-down.svg); - --default-logo-icon: url(../static/icons/default-logo.svg); - --facebook-icon: url(../static/icons/social/facebook.svg); - --twitter-icon: url(../static/icons/social/twitter.svg); - --instagram-icon: url(../static/icons/social/instagram.svg); - --linkedin-icon: url(../static/icons/social/linkedin.svg); - --yelp-icon: url(../static/icons/social/yelp.svg); - --youtube-icon: url(../static/icons/social/youtube.svg); - --tiktok-icon: url(../static/icons/social/tiktok.svg); - - --get-started-content-img: url(../static/images/content.png); - --get-started-design-img: url(../static/images/design.png); - --get-started-features-img: url(../static/images/features.png); --adminbar-avatar-img: url(../static/images/user-avatar.png); - - - --chevron-left-icon: url(../static/icons/chevron-left.svg); - --chevron-right-icon: url(../static/icons/chevron-right.svg); - - --site-features-analytics: url(../static/icons/site-features/analytics.svg); - --site-features-bookingcalendar: url(../static/icons/site-features/bookingcalendar.svg); - --site-features-email: url(../static/icons/site-features/email.svg); - --site-features-filter: url(../static/icons/site-features/filter.svg); - --site-features-form: url(../static/icons/site-features/form.svg); - --site-features-lead: url(../static/icons/site-features/lead.svg); - --site-features-search: url(../static/icons/site-features/search.svg); - --site-features-security: url(../static/icons/site-features/security.svg); - --site-features-share: url(../static/icons/site-features/share.svg); - --site-features-wishlist: url(../static/icons/site-features/wishlist.svg); - --site-features-comingsoon: url(../static/icons/site-features/comingsoon.svg); } diff --git a/src/SiteGenSPA/styles/app.scss b/src/SiteGenSPA/styles/app.scss index c2305f844..0bd1e9138 100644 --- a/src/SiteGenSPA/styles/app.scss +++ b/src/SiteGenSPA/styles/app.scss @@ -5,64 +5,14 @@ @import "utilities"; // CSS for Components -@import "../components/Drawer/stylesheet"; -@import "../components/Header/stylesheet"; -@import "../components/Content/stylesheet"; -@import "../components/Layouts/stylesheet"; -@import "../components/SkipButton/stylesheet"; -@import "../components/Loaders/stylesheet"; -@import "../components/MiniPreview/stylesheet"; -@import "../components/Tooltip/stylesheet"; -@import "../components/ImageUploader/stylesheet"; -@import "../components/SocialMediaForm/stylesheet"; -@import "../components/TextInput/stylesheet"; -@import "../components/ExitToWordPress/stylesheet"; -@import "../components/Accordion/stylesheet"; -@import "../components/NewfoldLargeCard/stylesheet"; -@import "../components/SelectableCard/stylesheet"; -@import "../components/SelectableCardList/stylesheet"; -@import "../components/HeadingWithSubHeading/stylesheet"; -@import "../components/Button/stylesheet"; -@import "../components/CardHeader/stylesheet"; -@import "../components/NeedHelpTag/stylesheet"; -@import "../components/Sidebar/stylesheet"; -@import "../components/Sidebar/components/LearnMore/stylesheet"; -@import "../components/LivePreview/stylesheet"; -@import "../steps/DesignColors/stylesheet"; -@import "../steps/GetStarted/GetStartedExperience/stylesheet"; -@import "../components/Button/NavCardButton/stylesheet"; -@import "../steps/Ecommerce/stylesheet"; -@import "../components/ErrorState/stylesheet"; -@import "../components/ErrorModal/stylesheet"; -@import "../components/CheckboxTemplate/CheckboxItem/stylesheet"; -@import "../components/CheckboxTemplate/CheckboxList/stylesheet"; -@import "../components/CheckboxTemplate/CheckboxListSkeleton/stylesheet"; -@import "../components/Sidebar/components/LearnMore/Skeleton/stylesheet"; -@import "../components/Animate/stylesheet"; -@import "../components/NewfoldInterfaceSkeleton/style"; -@import "../components/Loaders/Chapter/Interstitial/stylesheet"; -@import "../components/Grid/stylesheet"; -@import "../components/ComingSoon/stylesheet"; -@import "../../SiteGenSPA/components/SiteGenInterfaceSkeleton/style"; -@import "../../SiteGenSPA/components/AdminBarSiteGen/stylesheet"; -@import "../../SiteGenSPA/components/ProgressBarSiteGen/stylesheet"; -@import "../../SiteGenSPA/components/ToggleDarkMode/stylesheet"; -@import "../../SiteGenSPA/components/HeaderSiteGen/stylesheet"; +@import "../components/SiteGenInterfaceSkeleton/style"; +@import "../components/AdminBarSiteGen/stylesheet"; +@import "../components/ProgressBarSiteGen/stylesheet"; +@import "../components/ToggleDarkMode/stylesheet"; +@import "../components/HeaderSiteGen/stylesheet"; // CSS for Pages -@import "../steps/BasicInfo/stylesheet"; -@import "../steps/TopPriority/stylesheet"; -@import "../steps/DesignHomepageMenu/stylesheet"; -@import "../steps/GetStarted/Welcome/stylesheet"; -@import "../steps/GetStarted/SiteTypeSetup/PrimarySite/stylesheet"; -@import "../steps/GetStarted/SiteTypeSetup/SecondarySite/stylesheet"; -@import "../steps/DesignThemeStyles/stylesheet"; -@import "../steps/WhatNext/stylesheet"; -@import "../steps/SitePages/stylesheet"; -@import "../steps/DesignFonts/stylesheet"; -@import "../steps/DesignHeaderMenu/stylesheet"; -@import "../steps/SiteFeatures/stylesheet"; -@import "../../SiteGenSPA/steps/SiteGenGetStarted/stylesheet"; +@import "../steps/SiteGenGetStarted/stylesheet"; .nfd-onboarding-container { display: flex; diff --git a/src/onboarding.js b/src/onboarding.js index 83805ad3e..13533900d 100644 --- a/src/onboarding.js +++ b/src/onboarding.js @@ -5,6 +5,7 @@ import { NFD_ONBOARDING_ELEMENT_ID, runtimeDataExists } from './constants'; import domReady from '@wordpress/dom-ready'; import { registerCoreBlocks } from '@wordpress/block-library'; import initializeNFDOnboarding from './OnboardingSPA'; +import initializeNFDSiteGen from './SiteGenSPA'; import { HiiveAnalytics } from '@newfold-labs/js-utility-ui-analytics'; import { onboardingRestURL } from './OnboardingSPA/utils/api/common'; import { CATEGORY } from './OnboardingSPA/utils/analytics/hiive/constants'; @@ -23,11 +24,11 @@ if ( runtimeDataExists ) { }, }, } ); - initializeNFDOnboarding( NFD_ONBOARDING_ELEMENT_ID, window.nfdOnboarding ); + initializeNFDSiteGen(); registerCoreBlocks(); } ); } else { From 2a4acaff57e400848cb0265ee411ea27fc0c49b2 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 27 Oct 2023 12:03:06 +0530 Subject: [PATCH 17/30] PRESS2-1233 | added theme provider for theme toggle --- src/SiteGenSPA/components/AppSiteGen/index.js | 41 ++++++++++--------- .../ProgressBarSiteGen/stylesheet.scss | 4 +- .../SiteGenInterfaceSkeleton/index.js | 5 ++- .../components/ThemeContextProvider/index.js | 24 +++++++++++ .../components/ToggleDarkMode/index.js | 11 ++--- src/SiteGenSPA/styles/app.scss | 9 ++++ 6 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 src/SiteGenSPA/components/ThemeContextProvider/index.js diff --git a/src/SiteGenSPA/components/AppSiteGen/index.js b/src/SiteGenSPA/components/AppSiteGen/index.js index acb5f28a0..1b7a361cb 100644 --- a/src/SiteGenSPA/components/AppSiteGen/index.js +++ b/src/SiteGenSPA/components/AppSiteGen/index.js @@ -13,6 +13,7 @@ import { SlotFillProvider } from '@wordpress/components'; import { Fragment } from '@wordpress/element'; import { FullscreenMode } from '@wordpress/interface'; import SiteGenInterfaceSkeleton from '../SiteGenInterfaceSkeleton'; +import { ThemeProvider } from '../ThemeContextProvider'; const AppSiteGen = () => { const location = useLocation(); @@ -21,25 +22,27 @@ const AppSiteGen = () => { return ( - - - } - progressbar={ - - } - header={ } - content={ } - darkModeToggle={ } - /> - + + + + } + progressbar={ + + } + header={ } + content={ } + darkModeToggle={ } + /> + + ); }; diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss index 705dca99c..c34d5f9e0 100644 --- a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss +++ b/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss @@ -1,11 +1,11 @@ $sitegen-progress-blue: #3620f8; -$sitegen-progress-grey: #32373e; +// $sitegen-progress-grey: #32373e; .nfd-sitegen-progressbar { width: 100%; .nfd-sitegen-progressbar-container { - background-color: $sitegen-progress-grey; + background-color: var(--progress-background-color); height: 15px; width: 100%; border-radius: 0; diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js index 3f1060207..bc81de617 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js @@ -2,11 +2,12 @@ * External dependencies */ import classnames from 'classnames'; -import { forwardRef, useEffect } from '@wordpress/element'; +import { forwardRef, useEffect, useContext } from '@wordpress/element'; // eslint-disable-next-line @wordpress/no-unsafe-wp-apis import { __unstableUseNavigateRegions as useNavigateRegions } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { useMergeRefs } from '@wordpress/compose'; +import { ThemeContext } from '../ThemeContextProvider'; function useHTMLClass( className ) { useEffect( () => { @@ -38,6 +39,7 @@ function SiteGenInterfaceSkeleton( ref ) { const navigateRegionsProps = useNavigateRegions( shortcuts ); + const { theme } = useContext( ThemeContext ); useHTMLClass( 'nfd-interface-interface-skeleton__html-container' ); @@ -60,6 +62,7 @@ function SiteGenInterfaceSkeleton( ref={ useMergeRefs( [ ref, navigateRegionsProps.ref ] ) } className={ classnames( className, + theme, 'nfd-interface-interface-skeleton', 'nfd-sitegen-interface-skeleton', navigateRegionsProps.className, diff --git a/src/SiteGenSPA/components/ThemeContextProvider/index.js b/src/SiteGenSPA/components/ThemeContextProvider/index.js new file mode 100644 index 000000000..19e07a827 --- /dev/null +++ b/src/SiteGenSPA/components/ThemeContextProvider/index.js @@ -0,0 +1,24 @@ +import { useState, createContext } from '@wordpress/element'; + +// Create the context directly in the same file +const ThemeContext = createContext(); + +const ThemeProvider = ( { children } ) => { + const [ theme, setTheme ] = useState( 'nfd-sitegen-dark-mode' ); // Default theme is light + + const toggleTheme = () => { + setTheme( ( prevTheme ) => + prevTheme === 'nfd-sitegen-dark-mode' + ? 'nfd-sitegen-light-mode' + : 'nfd-sitegen-dark-mode' + ); + }; + + return ( + + { children } + + ); +}; + +export { ThemeContext, ThemeProvider }; diff --git a/src/SiteGenSPA/components/ToggleDarkMode/index.js b/src/SiteGenSPA/components/ToggleDarkMode/index.js index 98aef5fc0..3577b4b48 100644 --- a/src/SiteGenSPA/components/ToggleDarkMode/index.js +++ b/src/SiteGenSPA/components/ToggleDarkMode/index.js @@ -1,13 +1,14 @@ import { ToggleControl } from '@wordpress/components'; -import { useState } from '@wordpress/element'; +import { useContext } from '@wordpress/element'; +import { ThemeContext } from '../ThemeContextProvider'; import getContents from './contents'; const ToggleDarkMode = () => { - const [ isChecked, setChecked ] = useState( false ); + const { theme, toggleTheme } = useContext( ThemeContext ); + const isChecked = theme === 'nfd-sitegen-dark-mode'; const content = getContents(); - const onChange = ( value ) => { - setChecked( value ); - // Handle the toggle action here + const onChange = () => { + toggleTheme(); }; return ( diff --git a/src/SiteGenSPA/styles/app.scss b/src/SiteGenSPA/styles/app.scss index 0bd1e9138..f6e6d0fd0 100644 --- a/src/SiteGenSPA/styles/app.scss +++ b/src/SiteGenSPA/styles/app.scss @@ -31,3 +31,12 @@ min-height: calc(100vh - #{$admin-bar-height}); } } + +.nfd-sitegen-dark-mode { + --progress-background-color: #32373e; +} + +.nfd-sitegen-light-mode { + --progress-background-color: #fff; + +} From 8c296373ebb21b449f185c378fe5b9554971ec2f Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 27 Oct 2023 12:50:52 +0530 Subject: [PATCH 18/30] PRESS2-1233 | fixed linting issues --- src/SiteGenSPA/components/Animate/index.js | 13 ++++++----- .../components/Animate/stylesheet.scss | 6 ++--- src/SiteGenSPA/components/Layouts/Common.js | 22 +++++++++---------- .../components/Layouts/stylesheet.scss | 9 ++++++-- src/SiteGenSPA/styles/_wordpress.scss | 13 +++++------ 5 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/SiteGenSPA/components/Animate/index.js b/src/SiteGenSPA/components/Animate/index.js index d78559fb0..c6dec17b8 100644 --- a/src/SiteGenSPA/components/Animate/index.js +++ b/src/SiteGenSPA/components/Animate/index.js @@ -1,12 +1,15 @@ import classNames from 'classnames'; /** - * A Animator to show animation - * - * @param {string} type The name of Animation to be shown. - * @param { object | boolean } after The variable to look after for before showing the animation, by default true to show the children right away. - * + * @param {Object} props The properties passed to the Animate function. + * @param {string} props.type The name of Animation to be shown. + * @param {object | boolean} props.after The variable to look after for before showing the animation, by default true to show the children right away. + * @param {Object} props.children The children of the component. + * @param {string} props.className The optional class name for the animation. + * @param {boolean} props.duration The duration for the animation. + * @param {boolean} props.timingFunction The timing function for the animation. */ + const Animate = ( { type, after = true, diff --git a/src/SiteGenSPA/components/Animate/stylesheet.scss b/src/SiteGenSPA/components/Animate/stylesheet.scss index 2f187e862..db8670457 100644 --- a/src/SiteGenSPA/components/Animate/stylesheet.scss +++ b/src/SiteGenSPA/components/Animate/stylesheet.scss @@ -141,7 +141,7 @@ @media (prefers-reduced-motion) { animation: none !important; - translation: none !important; + translate: none !important; } } @@ -150,7 +150,7 @@ @media (prefers-reduced-motion) { animation: none !important; - translation: none !important; + translate: none !important; } } @@ -159,7 +159,7 @@ @media (prefers-reduced-motion) { animation: none !important; - translation: none !important; + translate: none !important; } } } diff --git a/src/SiteGenSPA/components/Layouts/Common.js b/src/SiteGenSPA/components/Layouts/Common.js index 238581b0b..50ae8143a 100644 --- a/src/SiteGenSPA/components/Layouts/Common.js +++ b/src/SiteGenSPA/components/Layouts/Common.js @@ -6,7 +6,7 @@ import Animate from '../Animate'; /** * * @param {*} param0 - * @return + * @return {ReturnType} Returns the inner contianer */ const InnerContainer = ( { children } ) => { return

{ children }
; @@ -15,16 +15,16 @@ const InnerContainer = ( { children } ) => { /** * The Common Layout extends the Base Layout and applies structural styles and animations. * - * @param {Object} props - * @param props.className - * @param props.children - * @param props.isBgPrimary - * @param props.isCentered - * @param props.isVerticallyCentered - * @param props.isContained - * @param props.isPadded - * @param props.isFadeIn - * @return + * @param {Object} props + * @param {string} props.className + * @param {Object} props.children + * @param {boolean} props.isBgPrimary + * @param {boolean} props.isCentered + * @param {boolean} props.isVerticallyCentered + * @param {boolean} props.isContained + * @param {boolean} props.isPadded + * @param {boolean} props.isFadeIn + * @return {ReturnType} Returns the common layout */ const CommonLayout = ( { className = '', diff --git a/src/SiteGenSPA/components/Layouts/stylesheet.scss b/src/SiteGenSPA/components/Layouts/stylesheet.scss index 9346a7fe8..193e423c2 100644 --- a/src/SiteGenSPA/components/Layouts/stylesheet.scss +++ b/src/SiteGenSPA/components/Layouts/stylesheet.scss @@ -1,17 +1,22 @@ .nfd-sitegen-layout__common { min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$admin-bar-height-big}); + @include break-medium { min-height: calc(100vh - #{$header-height} - #{$border-width}); } + &.is-padded { min-height: calc(100vw - #{$header-height} - #{$border-width} - #{$grid-unit * 18} - #{$admin-bar-height-big}); + @include break-medium { min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$grid-unit * 18}); } + padding: #{$grid-unit * 9}; } - > .is-contained { + + >.is-contained { width: 100%; max-width: $break-huge; } -} \ No newline at end of file +} diff --git a/src/SiteGenSPA/styles/_wordpress.scss b/src/SiteGenSPA/styles/_wordpress.scss index e25f148e7..d1a68752f 100644 --- a/src/SiteGenSPA/styles/_wordpress.scss +++ b/src/SiteGenSPA/styles/_wordpress.scss @@ -5,10 +5,9 @@ * @import @wordpress/interface */ - @import '@wordpress/base-styles/breakpoints'; - @import '@wordpress/base-styles/colors'; - @import '@wordpress/base-styles/mixins'; - @import '@wordpress/base-styles/variables'; - @import '@wordpress/base-styles/z-index'; - - @import '@wordpress/interface/src/style.scss'; +@import "@wordpress/base-styles/breakpoints"; +@import "@wordpress/base-styles/colors"; +@import "@wordpress/base-styles/mixins"; +@import "@wordpress/base-styles/variables"; +@import "@wordpress/base-styles/z-index"; +@import "@wordpress/interface/src/style"; From af5371ea2a3da0f37d7fc885e4ceddba89173133 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 27 Oct 2023 12:55:17 +0530 Subject: [PATCH 19/30] PRESS2-1233 | fixed indentation --- .../components/Layouts/stylesheet.scss | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/SiteGenSPA/components/Layouts/stylesheet.scss b/src/SiteGenSPA/components/Layouts/stylesheet.scss index 193e423c2..86d472ac5 100644 --- a/src/SiteGenSPA/components/Layouts/stylesheet.scss +++ b/src/SiteGenSPA/components/Layouts/stylesheet.scss @@ -1,22 +1,22 @@ .nfd-sitegen-layout__common { - min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$admin-bar-height-big}); + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$admin-bar-height-big}); - @include break-medium { - min-height: calc(100vh - #{$header-height} - #{$border-width}); - } + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width}); + } - &.is-padded { - min-height: calc(100vw - #{$header-height} - #{$border-width} - #{$grid-unit * 18} - #{$admin-bar-height-big}); + &.is-padded { + min-height: calc(100vw - #{$header-height} - #{$border-width} - #{$grid-unit * 18} - #{$admin-bar-height-big}); - @include break-medium { - min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$grid-unit * 18}); - } + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$grid-unit * 18}); + } - padding: #{$grid-unit * 9}; - } + padding: #{$grid-unit * 9}; + } - >.is-contained { - width: 100%; - max-width: $break-huge; - } -} + >.is-contained { + width: 100%; + max-width: $break-huge; + } +} \ No newline at end of file From d4bcb7c3d5744a6660a7226a4bb9e1844eba0aaf Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 27 Oct 2023 12:57:12 +0530 Subject: [PATCH 20/30] PRESS2-1233 | fixed indentation --- src/SiteGenSPA/components/Layouts/stylesheet.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SiteGenSPA/components/Layouts/stylesheet.scss b/src/SiteGenSPA/components/Layouts/stylesheet.scss index 86d472ac5..6ba3a2106 100644 --- a/src/SiteGenSPA/components/Layouts/stylesheet.scss +++ b/src/SiteGenSPA/components/Layouts/stylesheet.scss @@ -19,4 +19,4 @@ width: 100%; max-width: $break-huge; } -} \ No newline at end of file +} From 87004bc2700c55b63e10e7bc6e761c1308e043c3 Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Fri, 27 Oct 2023 13:07:28 +0530 Subject: [PATCH 21/30] PRESS2-1233 | deleted image from static --- src/SiteGenSPA/static/images/content.png | Bin 33928 -> 0 bytes src/SiteGenSPA/static/images/content.svg | 1 - src/SiteGenSPA/static/images/design.png | Bin 6597 -> 0 bytes src/SiteGenSPA/static/images/design.svg | 1 - src/SiteGenSPA/static/images/features.png | Bin 7189 -> 0 bytes src/SiteGenSPA/static/images/features.svg | 1 - src/SiteGenSPA/static/images/help.png | Bin 35219 -> 0 bytes 7 files changed, 3 deletions(-) delete mode 100644 src/SiteGenSPA/static/images/content.png delete mode 100644 src/SiteGenSPA/static/images/content.svg delete mode 100644 src/SiteGenSPA/static/images/design.png delete mode 100644 src/SiteGenSPA/static/images/design.svg delete mode 100644 src/SiteGenSPA/static/images/features.png delete mode 100644 src/SiteGenSPA/static/images/features.svg delete mode 100644 src/SiteGenSPA/static/images/help.png diff --git a/src/SiteGenSPA/static/images/content.png b/src/SiteGenSPA/static/images/content.png deleted file mode 100644 index 51d599a9153d6fcbd5b8da10aa8c9f95a8b1f6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33928 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 \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/design.png b/src/SiteGenSPA/static/images/design.png deleted file mode 100644 index fe25f3e2bb458d2f41a9cb1fa7078595f1da2707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6597 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 diff --git a/src/SiteGenSPA/static/images/design.svg b/src/SiteGenSPA/static/images/design.svg deleted file mode 100644 index 686dfb217..000000000 --- a/src/SiteGenSPA/static/images/design.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/features.png b/src/SiteGenSPA/static/images/features.png deleted file mode 100644 index 9c8f2d4d49ea61d723f989e7f5784507423f486b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7189 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 \ No newline at end of file diff --git a/src/SiteGenSPA/static/images/help.png b/src/SiteGenSPA/static/images/help.png deleted file mode 100644 index 80ae1a77eebebd3aed2f99592474032bfdc25451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35219 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 From 042dce73f7905da5abf06d4d1c203b6c27e2cb4f Mon Sep 17 00:00:00 2001 From: Ajay Yadav Date: Mon, 30 Oct 2023 23:48:07 +0530 Subject: [PATCH 22/30] PRESS2-1233 | added common components --- src/Common/Animate/index.js | 80 +++++++++ src/Common/Animate/stylesheet.scss | 170 ++++++++++++++++++ src/Common/Layouts/Base.js | 37 ++++ src/Common/Layouts/Common.js | 62 +++++++ src/Common/Layouts/stylesheet.scss | 22 +++ .../{AdminBarSiteGen => AdminBar}/index.js | 6 +- .../stylesheet.scss | 2 +- src/SiteGenSPA/components/AppSiteGen/index.js | 17 +- .../{HeaderSiteGen => Header}/index.js | 4 +- .../{HeaderSiteGen => Header}/stylesheet.scss | 0 .../index.js | 4 +- .../stylesheet.scss | 0 .../SiteGenInterfaceSkeleton/index.js | 22 +-- .../SiteGenInterfaceSkeleton/style.scss | 35 ++-- .../steps/SiteGenGetStarted/index.js | 2 +- src/SiteGenSPA/styles/app.scss | 6 +- 16 files changed, 417 insertions(+), 52 deletions(-) create mode 100644 src/Common/Animate/index.js create mode 100644 src/Common/Animate/stylesheet.scss create mode 100644 src/Common/Layouts/Base.js create mode 100644 src/Common/Layouts/Common.js create mode 100644 src/Common/Layouts/stylesheet.scss rename src/SiteGenSPA/components/{AdminBarSiteGen => AdminBar}/index.js (79%) rename src/SiteGenSPA/components/{AdminBarSiteGen => AdminBar}/stylesheet.scss (93%) rename src/SiteGenSPA/components/{HeaderSiteGen => Header}/index.js (88%) rename src/SiteGenSPA/components/{HeaderSiteGen => Header}/stylesheet.scss (100%) rename src/SiteGenSPA/components/{ProgressBarSiteGen => ProgressBar}/index.js (76%) rename src/SiteGenSPA/components/{ProgressBarSiteGen => ProgressBar}/stylesheet.scss (100%) diff --git a/src/Common/Animate/index.js b/src/Common/Animate/index.js new file mode 100644 index 000000000..9e4231f54 --- /dev/null +++ b/src/Common/Animate/index.js @@ -0,0 +1,80 @@ +import classNames from 'classnames'; + +/** + * @param {Object} props The properties passed to the Animate function. + * @param {string} props.type The name of Animation to be shown. + * @param {object | boolean} props.after The variable to look after for before showing the animation, by default true to show the children right away. + * @param {Object} props.children The children of the component. + * @param {string} props.className The optional class name for the animation. + * @param {boolean} props.duration The duration for the animation. + * @param {boolean} props.timingFunction The timing function for the animation. + */ + +const Animate = ({ + type, + after = true, + children, + className = '', + duration = false, + timingFunction = false, +}) => { + const prefix = 'animate'; + + /** + * Returns the appropriate className + * + * @return {string | void} ClassName that applies the animations + */ + function getAnimateClassName() { + if (type) { + let classname = ''; + switch (type) { + // Add animation types and appropriate CSS + case 'fade-in': + classname = prefix.concat('__fade-in'); + break; + case 'fade-in-disabled': + classname = prefix.concat('__fade-in--disabled'); + break; + case 'fade-in-right': + classname = prefix.concat('__fade-in--right'); + break; + case 'fade-in-left': + classname = prefix.concat('__fade-in--left'); + break; + case 'fade-in-up': + classname = prefix.concat('__fade-in--up'); + break; + case 'shine': + classname = prefix.concat('__shine'); + break; + case 'shine-placeholder': + classname = prefix.concat('__shine--placeholder'); + break; + case 'dropdown': + classname = prefix.concat('__dropdown'); + break; + case 'load': + classname = prefix.concat('__load'); + break; + } + return classname; + } + } + + return !after ? ( +

{children}
+ ) : ( +
+ {children} +
+ ); +}; + +export default Animate; diff --git a/src/Common/Animate/stylesheet.scss b/src/Common/Animate/stylesheet.scss new file mode 100644 index 000000000..db8670457 --- /dev/null +++ b/src/Common/Animate/stylesheet.scss @@ -0,0 +1,170 @@ +@keyframes fadeIn { + + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + + +@keyframes fadeInRight { + + from { + opacity: 0; + transform: translate3d(33%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeft { + + from { + opacity: 0; + transform: translate3d(-33%, 0, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUp { + + from { + opacity: 0; + transform: translate3d(0, 33%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInWithDisabledClicks { + + from { + opacity: 0; + pointer-events: none; + } + + to { + opacity: 1; + } +} + +@keyframes shine { + + 0% { + transform: translateX(-100%); + } + + 100% { + transform: translateX(100%); + } +} + +@keyframes shine-placeholder { + + 0% { + background-position: -468px 0; + } + + 100% { + background-position: 468px 0; + } +} + +@keyframes dropdown { + + 0% { + transform: rotateX(-90deg); + } + + 70% { + transform: rotateX(20deg); + } + + 100% { + transform: rotateX(0deg); + } +} + +@keyframes load { + + 0% { + left: -100%; + } + + 100% { + left: 100%; + } +} + +.animate { + + &__blank { + opacity: 0; + pointer-events: none; + } + + &__shine { + animation: shine 1.5s linear infinite; + + &--placeholder { + animation: shine-placeholder 1.5s linear infinite; + } + } + + &__dropdown { + animation: dropdown 400ms ease-in-out forwards; + } + + &__fade-in { + + animation: fadeIn 100ms ease-in-out; + + &--disabled { + animation: fadeInWithDisabledClicks 500ms ease-in; + } + + &--right { + animation: fadeInRight 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translate: none !important; + } + } + + &--left { + animation: fadeInLeft 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translate: none !important; + } + } + + &--up { + animation: fadeInUp 360ms ease-out; + + @media (prefers-reduced-motion) { + animation: none !important; + translate: none !important; + } + } + } + + &__load { + animation: load 3s linear infinite; + } +} diff --git a/src/Common/Layouts/Base.js b/src/Common/Layouts/Base.js new file mode 100644 index 000000000..2e2ab7606 --- /dev/null +++ b/src/Common/Layouts/Base.js @@ -0,0 +1,37 @@ +import classNames from 'classnames'; +import { speak } from '@wordpress/a11y'; +import { useEffect } from '@wordpress/element'; +import { useLocation } from 'react-router-dom'; + +import { + OnboardingEvent, + sendOnboardingEvent, +} from '../../OnboardingSPA/utils/analytics/hiive'; +import { ACTION_PAGEVIEW } from '../../OnboardingSPA/utils/analytics/hiive/constants'; + +const BaseLayout = ({ + className = 'nfd-onboarding-layout__base', + children, +}) => { + const location = useLocation(); + const mainContainer = document.querySelector('.nfd-onboard-content'); + + const speakRouteTitle = (title = 'Showing new Onboarding Page') => { + // [TODO]: Determine if some routes should not speak the title + speak(title, 'assertive'); + }; + + useEffect(() => { + mainContainer?.focus({ preventScroll: true }); + speakRouteTitle('Override'); + sendOnboardingEvent(new OnboardingEvent(ACTION_PAGEVIEW)); + }, [location.pathname]); + + return ( +
+ {children} +
+ ); +}; + +export default BaseLayout; diff --git a/src/Common/Layouts/Common.js b/src/Common/Layouts/Common.js new file mode 100644 index 000000000..26b54145c --- /dev/null +++ b/src/Common/Layouts/Common.js @@ -0,0 +1,62 @@ +import BaseLayout from './Base'; +import { Fragment } from '@wordpress/element'; +import classNames from 'classnames'; +import Animate from '../Animate'; + +/** + * + * @param {*} param0 + * @return {ReturnType} Returns the inner contianer + */ +const InnerContainer = ({ children }) => { + return
{children}
; +}; + +/** + * The Common Layout extends the Base Layout and applies structural styles and animations. + * + * @param {Object} props + * @param {string} props.className + * @param {Object} props.children + * @param {boolean} props.isBgPrimary + * @param {boolean} props.isCentered + * @param {boolean} props.isVerticallyCentered + * @param {boolean} props.isContained + * @param {boolean} props.isPadded + * @param {boolean} props.isFadeIn + * @return {ReturnType} Returns the common layout + */ +const CommonLayout = ({ + className = '', + children, + isBgPrimary = false, + isCentered = false, + isVerticallyCentered = false, + isContained = false, + isPadded = false, + isFadeIn = true, +}) => { + const Container = isContained ? InnerContainer : Fragment; + return ( + + + {children} + + + ); +}; + +export default CommonLayout; diff --git a/src/Common/Layouts/stylesheet.scss b/src/Common/Layouts/stylesheet.scss new file mode 100644 index 000000000..86089d6c7 --- /dev/null +++ b/src/Common/Layouts/stylesheet.scss @@ -0,0 +1,22 @@ +.nfd-onboarding-layout__common { + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$admin-bar-height-big}); + + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width}); + } + + &.is-padded { + min-height: calc(100vw - #{$header-height} - #{$border-width} - #{$grid-unit * 18} - #{$admin-bar-height-big}); + + @include break-medium { + min-height: calc(100vh - #{$header-height} - #{$border-width} - #{$grid-unit * 18}); + } + + padding: #{$grid-unit * 9}; + } + + >.is-contained { + width: 100%; + max-width: $break-huge; + } +} diff --git a/src/SiteGenSPA/components/AdminBarSiteGen/index.js b/src/SiteGenSPA/components/AdminBar/index.js similarity index 79% rename from src/SiteGenSPA/components/AdminBarSiteGen/index.js rename to src/SiteGenSPA/components/AdminBar/index.js index 174b34fc2..f3e6586a3 100644 --- a/src/SiteGenSPA/components/AdminBarSiteGen/index.js +++ b/src/SiteGenSPA/components/AdminBar/index.js @@ -1,7 +1,7 @@ import { __ } from '@wordpress/i18n'; import { Icon, wordpress } from '@wordpress/icons'; -const AdminBarSiteGen = () => { +const AdminBar = () => { return (
@@ -11,7 +11,7 @@ const AdminBarSiteGen = () => {
- { __( 'Howdy!', 'wp-module-onboarding' ) }, Maya Jiménez + {__( 'Howdy!', 'wp-module-onboarding' ) }, Maya Jiménez
@@ -20,4 +20,4 @@ const AdminBarSiteGen = () => { ); }; -export default AdminBarSiteGen; +export default AdminBar; diff --git a/src/SiteGenSPA/components/AdminBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/AdminBar/stylesheet.scss similarity index 93% rename from src/SiteGenSPA/components/AdminBarSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/AdminBar/stylesheet.scss index 6e79aa2c1..eda5be19c 100644 --- a/src/SiteGenSPA/components/AdminBarSiteGen/stylesheet.scss +++ b/src/SiteGenSPA/components/AdminBar/stylesheet.scss @@ -4,7 +4,7 @@ $light-grey : #a0a5aa; .nfd-sitegen-admin-bar { padding: 5px; - background-color: #23282d; // Dark grayish background + background-color: #23282d; display: flex; justify-content: space-between; align-items: center; diff --git a/src/SiteGenSPA/components/AppSiteGen/index.js b/src/SiteGenSPA/components/AppSiteGen/index.js index 1b7a361cb..48c9b2a1e 100644 --- a/src/SiteGenSPA/components/AppSiteGen/index.js +++ b/src/SiteGenSPA/components/AppSiteGen/index.js @@ -1,10 +1,10 @@ -import Content from '../../../OnboardingSPA/components/Content'; -import HeaderSiteGen from '../HeaderSiteGen'; -import ToggleDarkMode from '../ToggleDarkMode'; -import AdminBarSiteGen from '../AdminBarSiteGen'; -import ProgressBarSiteGen from '../ProgressBarSiteGen'; import classNames from 'classnames'; import { useLocation } from 'react-router-dom'; +import AdminBar from '../AdminBar'; +import ProgressBar from '../ProgressBar'; +import Header from '../Header'; +import Content from '../../../OnboardingSPA/components/Content'; +import ToggleDarkMode from '../ToggleDarkMode'; // eslint-disable-next-line import/no-extraneous-dependencies import { kebabCase } from 'lodash'; @@ -33,13 +33,14 @@ const AppSiteGen = () => { { 'is-large-viewport': isLargeViewport }, { 'is-small-viewport': ! isLargeViewport } ) } - adminbar={ } + adminbar={ } progressbar={ - + } - header={ } + header={
} content={ } darkModeToggle={ } + footer={} /> diff --git a/src/SiteGenSPA/components/HeaderSiteGen/index.js b/src/SiteGenSPA/components/Header/index.js similarity index 88% rename from src/SiteGenSPA/components/HeaderSiteGen/index.js rename to src/SiteGenSPA/components/Header/index.js index cf686b879..a2eacf317 100644 --- a/src/SiteGenSPA/components/HeaderSiteGen/index.js +++ b/src/SiteGenSPA/components/Header/index.js @@ -3,7 +3,7 @@ import { Button } from '@wordpress/components'; import { Icon, chevronLeft } from '@wordpress/icons'; import { __ } from '@wordpress/i18n'; -const HeaderSiteGen = () => { +const Header = () => { return (
@@ -19,4 +19,4 @@ const HeaderSiteGen = () => { ); }; -export default memo( HeaderSiteGen ); +export default memo( Header ); diff --git a/src/SiteGenSPA/components/HeaderSiteGen/stylesheet.scss b/src/SiteGenSPA/components/Header/stylesheet.scss similarity index 100% rename from src/SiteGenSPA/components/HeaderSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/Header/stylesheet.scss diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/index.js b/src/SiteGenSPA/components/ProgressBar/index.js similarity index 76% rename from src/SiteGenSPA/components/ProgressBarSiteGen/index.js rename to src/SiteGenSPA/components/ProgressBar/index.js index c12a9508c..52a90d4e5 100644 --- a/src/SiteGenSPA/components/ProgressBarSiteGen/index.js +++ b/src/SiteGenSPA/components/ProgressBar/index.js @@ -1,4 +1,4 @@ -const ProgressBarSiteGen = ( { current, total } ) => { +const ProgressBar = ( { current, total } ) => { const percentage = ( current / total ) * 100; return (
@@ -12,4 +12,4 @@ const ProgressBarSiteGen = ( { current, total } ) => { ); }; -export default ProgressBarSiteGen; +export default ProgressBar; diff --git a/src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss b/src/SiteGenSPA/components/ProgressBar/stylesheet.scss similarity index 100% rename from src/SiteGenSPA/components/ProgressBarSiteGen/stylesheet.scss rename to src/SiteGenSPA/components/ProgressBar/stylesheet.scss diff --git a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js index bc81de617..4819e3a38 100644 --- a/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js +++ b/src/SiteGenSPA/components/SiteGenInterfaceSkeleton/index.js @@ -41,7 +41,7 @@ function SiteGenInterfaceSkeleton( const navigateRegionsProps = useNavigateRegions( shortcuts ); const { theme } = useContext( ThemeContext ); - useHTMLClass( 'nfd-interface-interface-skeleton__html-container' ); + useHTMLClass( 'nfd-sg-interface-skeleton__html-container' ); const defaultLabels = { /* translators: accessibility text for the nav bar landmark region. */ @@ -63,7 +63,7 @@ function SiteGenInterfaceSkeleton( className={ classnames( className, theme, - 'nfd-interface-interface-skeleton', + 'nfd-sg-interface-skeleton', 'nfd-sitegen-interface-skeleton', navigateRegionsProps.className, !! footer && 'has-footer' @@ -71,7 +71,7 @@ function SiteGenInterfaceSkeleton( > { !! drawer && (
) } -
+
{ !! adminbar && (
) } -
+
{ !! header && (
) }
{ !! darkModeToggle && (
{ !! footer && (