FastStore powered by Next.js

Related tags

React nextjs.store
Overview

Store Framework

A starter powered by FastStore and NextJS

Kickoff your store with this boilerplate. This starter ships with the main FastStore configuration files you might need to get up and running blazing fast with the blazing-fast store for React.

⚠️ Before you start

As of Dec, 22, 2021, this starter is still far from covering most basic cases found on VTEX. To summarize what we still do not support that is considered basic on the VTEX commerce platform, we prepared the list below. If the feature you want is listed, you can either wait for us to add support to the feature, or fork the repo and implement on your own. Note that, by forking the repo, you will miss new features and improvements we do in this repo and you will need a developer to backport the feature to your store. Finally, this list is a work in progress, so some features may be missing from both base.store starter and this list.

  1. Multiple CMS Previews. Only one user is allowed to preview content from the CMS at a time. If two users preview any content from any page at the CMS, the previews are not consistent and one user may see data from the other.
  2. Price Table
  3. Regionalization
  4. Internationalization
  5. Shared Cart (Carrinho compartilhado)
  6. Clear products that are our of stock from cart
  7. GDPR (LGDP)
  8. Shipping simulation
  9. Sitemap
  10. Sku selector on PDP
  11. Promotions via utm
  12. Product specifications

πŸš€ Quick start

  1. Clone this repo

    Get up and running by cloning this repo.

    # Clone this repo into your machine
    npx degit vtex-sites/nextjs.store awesome.store
  2. Install dependencies

    Install dependencies with yarn

    cd awesome.store/
    yarn
  3. Setup store.config.js

    Choose the ecommerce platform provider of your choice in the store.config file and set the corresponding options. For instance, to connect to the VTEX platform on the store fashioneurope:

    module.exports = {
      platform: 'vtex',
    
      api: {
        storeId: 'fashioneurope'
        environment: 'vtexcommercestable'
      }
    }
  4. Start developing

    Navigate into your new site’s directory and start it up.

    yarn develop
  5. Open the source code and start editing!

    Your site is now running at http://localhost:3000!

    Open the awesome.store directory in your code editor of choice and edit src/pages/index.tsx. Save your changes and the browser will update in real-time!

πŸ§‘β€πŸ’» Contributing

  1. Keep the CHANGELOG updated We use a CHANGELOG to keep the history of all notable changes made to this repository. Each PR must have at least one entry on the [UNRELEASED] section of the CHANGELOG.md file.

🧐 What's inside?

A quick look at the top-level files and directories you'll see in a NextJS project.

./
β”œβ”€β”€ node_modules
β”œβ”€β”€ src
β”œβ”€β”€ .gitignore
β”œβ”€β”€ .eslintignore
β”œβ”€β”€ .prettierignore
β”œβ”€β”€ .prettierrrc
β”œβ”€β”€ .eslintrc
β”œβ”€β”€ LICENSE
└── yarn.lock
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
β”œβ”€β”€ store.config.js
β”œβ”€β”€ README.md
β”œβ”€β”€ CHANGELOG.md
β”œβ”€β”€ __generated__
β”œβ”€β”€ babel.config.js
β”œβ”€β”€ cypress
β”œβ”€β”€ cypress.json
β”œβ”€β”€ lighthouserc.js
β”œβ”€β”€ public
β”œβ”€β”€ pull_request_template.md
β”œβ”€β”€ renovate.json
  1. /node_modules: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed.

  2. /src: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. src is a convention for β€œsource code”.

  3. .gitignore: This file tells git which files it should not track / not maintain a version history for.

  4. .prettierrc: This is a configuration file for Prettier. Prettier is a tool to help keep the formatting of your code consistent.

  5. .eslintrc.js: This is a configuration file for ESLint. ESlint is a tool to find and fix problems in your JavaScript code.

  6. LICENSE: NextJS is licensed under the MIT license.

  7. yarn.lock (See package.json below, first). This is an automatically generated file based on the exact versions of your npm dependencies that were installed for your project. (You won’t change this file directly).

  8. package.json: A manifest file for Node.js projects, which includes things like metadata (the project’s name, author, etc). This manifest is how npm knows which packages to install for your project.

  9. tsconfig.json: The configuration file for the typescript compiler. This will statically analyze your code for errors and bugs before releasing them into production

  10. store.config.js: Configure your e-commerce platform, default sales channel etc.

  11. README.md: A text file containing useful reference information about your project.

  12. CHANGELOG.md: A text file containing all notable changes to the project.

  13. __generated__: Where TypeScript typings are generated for your GraphQL queries. You can use these files for strongly typing your App

  14. babel.config.js: Babel configurations for you app. This is where you can change the targeted browsers.

  15. cypress: End to End(e2e) tests using Cypress. Most of the scenarios are covered here. Add your custom flows to avoid regressions

  16. cypress.json: Cypress configuration file

  17. lighthouserc.js: Configures Google Lighthouse CI. This is where you can turn on/off lighthouse assertions to be used by Lighthouse CI Bot/hook

  18. pull_request_template.md: Template used when creating your Pull Requests

  19. renovate.json: Renovate configuration file to keep your store always fresh with FastStore's latest versions

  20. .prettierignore: Ignore listed files when applying prettier rules

  21. .eslintignore: Ignore listed files when applying eslint rules

πŸ’» Code Structure

All code is inside the src folder. The code is split into folders that implement an MVC-like architecture.

The controller is inside the src/sdk folder. This is where you will find most logic for the application. This folder contains hooks for adding items to cart, making graphql queries, resizing images, etc. If you need to write a custom business logic this is probably the place to put this logic.

The views are written in the src/components folder and are subdivided into domain-specific components. Cart related items are inside the src/components/cart folder. Search and Product related components like facets, product summary, and search results are in their respective folders. Basic building blocks components are inside the UI folder. Components like button, checkbox, and modal are good candidates for the UI folder. Section components are those components that occupy a whole slice on the webpage and are desirable to be changed by a CMS. Section components are Product Gallery, Carousel, Shelf and Product description.

The model, in a website, is where the data fetching occurs. Since this project uses Jamstack, a crucial design decision was made to explicitly split where Static and Dynamic data are fetched. The files inside the src/pages folder use NextJS's File System Route API to declare routes and fetch static data.

To summarize:

  1. src/pages: Routes are declared and static data is fetched.
  2. src/views: Receives static data from src/pages, enriches this data with dynamic attributes, and render section components along with SEO tags.
  3. src/components/sections: Receives necessary data and use domain-specific components (cart/product/search/ui) for rendering a slice on the web page.

✏️ Adding Components

What better than an example for learning the best practices while adding components? In this example, we will add a button component. Components live on the src/components folder. Each component may have, at most, 3 files: a component file, an export file, and a styling file. First, let's create a folder and the files.

mkdir src/components/ui/Button
touch src/components/ui/Button/Button.tsx
touch src/components/ui/Button/index.tsx

The index.tsx is just an export file, so its content is simple:

export { default } from './Button'

The real thing happens on Button.tsx. On this file let's define the component like:

interface Props {}

function Button(props: Props) {
  return <button {...props} />
}

export default Button

And, that's it! Now you have a working button that you can use anywhere on your project. FastStore, however, brings a handy library called @faststore/ui with built-in components to help you speed up your development. To use it, just change Button.tsx to:

import { Button as UIButton } from '@faststore/ui'
import type { ButtonProps } from '@faststore/ui'

interface Props extends ButtonProps {}

function Button(props: Props) {
  return <UIButton {...props} />
}

export default Button

Now, your Button component is powered by Store UI. However, if you try to use this on your app you will see that the button is lacking styles. To add styles, we will use CSS modules because they allow us to target data attributes. On your terminal, type:

touch src/components/ui/Button/button.scss

Now, on button.scss:

[data-store-button] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

This data-store-button is a CSS data attribute selector. To know which selectors are available, check FastStore UI docs.

Now, include the component's CSS into the Store's CSS. Open src/styles/global/components.scss and import this CSS with:

// ...
@import "src/components/ui/Button/button.scss";
// ...

For most components, you would stop here. However, buttons can have different variants. For instance, suppose you want to have a button component with primary and secondary variants. To add variants to the component, update Button.tsx:

import { Button as UIButton } from '@faststore/ui'
import type { ButtonProps } from '@faststore/ui'

interface Props extends ButtonProps {
  variant: 'secondary' | 'primary'
}

function Button({ variant, ...props }: Props) {
  return <UIButton data-button-variant={variant} {...props} />
}

export default Button

and then, on button.scss:

[data-store-button][data-button-variant='primary'] {
  background: blue;
}

[data-store-button][data-button-variant='secondary'] {
  background: pink;
}

You can also use classes, if you wanted to:

function Button({ variant, ...props }: Props) {
  return <UIButton className={variant} {...props} />
}
.primary[data-store-button] {
  background: blue;
}

.secondary[data-store-button] {
  background: pink;
}

Now we have a styled Button component that accepts different variants!! πŸŽ‰ The aforementioned guide works well for UI components. However, components like Navbar and Footer are more complex and usually don't have variants, since they usually serve a single responsibility on the page. For these cases, you can use BEM-Style CSS Syntax in SCSS like:

 // components/common/Navbar/Navbar.tsx
 ...
 function Navbar {
   return (
      <header className="navbar">
        <div className="navbar__header">
         <section className="navbar__row">
           <Button
               className="navbar__menu"
               aria-label="Open Menu"
           >
             <ListIcon size={32} />
           </Button>
         </section>
        </div>
      </header>
   )

Managing SVG Icons

Icons help build web pages by illustrating concepts and improving website navigation. However, using icons can decrease the page's performance. One option to avoid the decrease of the page's performance is to use SVGs from a single SVG file, located in /static/icons.svg, and load them with the ui/Icon component.

In the following steps, learn how to add and use a new SVG icon and avoid decreasing page performance while using an icon.

⚠️ Warning

This is a recommendation while using icons on a web page. Evaluate if this fits in your project.

Adding an SVG icon

  1. In the SVG file, change the svg tag to symbol.
  2. Add an id to the symbol. Remember to use an unique id and do not replicate it.
  3. Remove unnecessary HTML/SVG properties to allow you to style and decrease the final file size, such as fill, stroke-width, width, height, and color.

An example adding Bell icon:

<svg style="display:none">
<symbol id="Bell" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><path d="M56.2,104a71.9,71.9,0,0,1,72.3-72c39.6.3,71.3,33.2,71.3,72.9V112c0,35.8,7.5,56.6,14.1,68a8,8,0,0,1-6.9,12H49a8,8,0,0,1-6.9-12c6.6-11.4,14.1-32.2,14.1-68Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M96,192v8a32,32,0,0,0,64,0v-8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></symbol>
</svg>

Using an SVG icon

  1. Get the icon's id that you created in the SVG icon file.
  2. Add the id in the React component that you desire to use the SVG icon. For example
// src/components/ui/MyIconButton/MyIconButton.tsx
import Icon from 'src/components/ui/Icon' // this path can be outdated.

function ButtonIcon() {
  return (
    <button>
      <Icon name="<<symbol_id>>" weight="thin" />
    </button>
  )
}

export default ButtonIcon

This project uses SVGs from Phosphor icons.

πŸ–ŠοΈ Styling Components

Our customized themes are based on Design Tokens using CSS Variables or a CSS class for each token. Today, we have the following files in the src/styles folder:

tokens.scss

Here you'll find the basic structure to build your theme (font base, color palette, spacing, color-text, body background color...), feel free to update it with your brand guidelines.

Colors

We suggest using a color palette of 3 colors and its gradation: primary, secondary and neutral.

We also listed a couple of customizable tokens so you can easily change your body background, for example.

If you feel the need to edit some of the color decisions, you can enter tokens.scss and update the semantical tokens. E.g.:

--fs-border-color-default: var(--fs-color-neutral-4); // Current
--fs-border-color-default: var(--fs-color-neutral-5); // Updated

Typography

We use the Modular Scale setting to create our text-sizes. If you want to change it, just set the --fs-text-size-base and the scale ratio.

Spacing

The spacing scale is based on rem sizes, so it will remain consistent if you change the --fs-text-size-base.

layout.scss

List of classes used to create default page grid.

.layout__content-full // Should be used for sections that are side to side, generally with a colored background.
.layout__content // Should be used for sections that fit centered on the grid.
.layout__section // This class only adds default vertical margins for page sections.

grid-example-image

typography.scss

For the typography-related styles, we decided to use classes to add extra stylings like font-weight and line-height. In this file, you'll see all the classes for titles, paragraphs, and default settings on the body. You can create new ones here if needed.

πŸ’ Adding queries

We use graphql-codegen to pre-process GraphQL queries. This compilation generates TypeScript typings and configurations for our graphql server under the folder @generated/graphql. This means we can statically analyse your code in search of bugs and secure your graphql server before each deploy. If, however you need to change any GraphQL Fragment, Query or Mutation, you will need to regenerate the whole thing. To do this, open your terminal and type

$ yarn develop

Now, after the nextjs development server is up and running, open another terminal and run

$ yarn generate

That's it! you have just regenerated all graphql queries/fragments for your application and the new data you requested should be available to your component.

Pro tip: Pass -w to the yarn generate command so it watches for changes and you don't need to run this command multiple times

πŸŽ“ Learning the Frameworks

Looking for more guidance? Full documentation for FastStore lives on this GitHub repository. Also, for learning NextJS, take a look at the NextJS Website, they have plenty of tutorials and examples in there.

⚑ Performance & QA

This project has strict performance budgets. Right out of the box, this project performs around 95 on Google's Page Speed Insights website, which usually is way more strict than your laptop's chrome lighthouse. Every time you commit to the repository, our QA bots will run and evaluate your code quality. We recommend you NEVER put in production a code that breaks any of the bots. If a bot breaks and still you need to put the code into production, change the bot config (lighthouserc.js, cypress.json) to make it pass and merge. This way you ensure your website will keep performing well during the years to come.

Adding third party scripts

Adding third-party scripts to a webpage usually makes it slow. To maintain great performance while third-party scripts are added, this project uses Partytown, a lazy-load library that helps relocate intensive scripts into a web worker and off of the main thread.

To add scripts using Partytown, add the type="text/partytown" to the script tag and make sure to add it before the Partytown script or component. Some third-party scripts execute expensive computations that may require some time to run, making pages few slow. If that's the case, wrap those in a function and reference it on the Partytown forward prop. By doing this, Partytown will run this function on a web worker so it doesn't block the main thread.

export const onRenderBody = ({ setHeadComponents }) => {
  // ...
  setHeadComponents([
    <script type="text/partytown">
      window.expensiveFunction = function() {/* expensive computation used by custom-script */}
    </script>
    <script key="custom-script" src="*://domain/path" type="text/partytown" />,
    <Partytown key="partytown" forward={["expensiveFunction"]} />
  ])
  // ...
}

For more information about integrating third-party scripts: Partytown Wiki

Comments
  • chore: Single UI Provider

    chore: Single UI Provider

    What's the purpose of this pull request?

    This PR joins duplicated contexts we had on our code.

    How does it work?

    Both UIProvider and ModalProvider had a goal of controlling the global UI state of our site. This created an interdependency between these contexts, generating a mess on our code. For example, for openning the cart on UIProvider we relied on functions provided by ModalProvider. Also, when openning the cart we had to invoke a function called onModalOpen, what makes no sense since the cart is a drawer, not a modal.

    This PR addresses this issue by merging UIProvider and ModalProvider into a single context so we don't have that mess anymore. Also, I have changed the name of onModalClose and onModalOpen to fadeOut and fadeIn respectively.

    After these changes, the minicart toggle button went from:

    const { closeCart } = useUI()
    const { onModalClose } = useModal()
    
    const onClick = () => {
        onModalClose()
        closeCart()
    }
    
    

    to:

    const { closeCart, fadeOut } = useUI()
    
    const onClick = () => {
        fadeOut()
        closeCart()
    }
    

    How to test it?

    Make sure all fade effects are working correctly, as well as the scroll behavior when the modal is open

    Features 
    opened by tlgimenes 10
  • feat: Add search history & top searches

    feat: Add search history & top searches

    How does it work?

    See https://github.com/vtex-sites/gatsby.store/pull/67 for more details.

    How to test it?

    Because the intelligent search's top search data comes from real usage data from the last 14 days, as of today, we don't have any top search data to show for the storeframework store ID. That means the preview deploy won't display the Top Search component with data. Because of that, and for testing purposes, I've created a temporary branch where I switched the store ID for storecomponents, it has top search data and you can preview it working in this preview deploy.

    NextJS Search History n Top Search

    Known Issues

    Features 
    opened by filipewl 8
  • Feat: integrate with client-cms

    Feat: integrate with client-cms

    Signed-off-by: Arthur Andrade [email protected]## What's the purpose of this pull request?

    *this PR is a refactoring of feat: integrate with VTEX headless CMS #104 by @danzanzini using the client-cms.

    How does it work?

    This PR integrates the Faststore Starter with VTEX headless CMS using the Client CMS Package. The integration was done in index page, where with the next getStaticProps function all data was fetched, and the page was mounted.

    Was added a src/cms/cmsHomeFallback.ts file as fallback for cases of fail in a request or for a project that don't use CMS integration.

    The integration with GlobalCMS items like the Alert should be done in other task.

    How to test it?

    Open the preview link, visit the index page (/) and see if it's everything fine.

    References

    Client CMS Package getStaticProps function

    Checklist

    You may erase this after checking them all ;)

    PR Title and Commit Messages

    PR Description

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.
    • [ ] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.
    • [ ] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    Documentation

    • [x] PR description
    • [ ] Added to/Updated the Storybook - if applicable.
    • [ ] For documentation changes, ping @ carolinamenezes, @ PedroAntunesCosta or @ Mariana-Caetano to review and update.
    Features CMS 
    opened by ArthurTriis1 7
  • Feat: Adds tokens to `OutOfStock`

    Feat: Adds tokens to `OutOfStock`

    What's the purpose of this pull request?

    This PR applies the new Theming structure to OutOfStck: new scoped tokens linked to global ones.

    Additionally, I adjusted the OutOfStock's style.

    How does it work?

    This PR uses local variables to parameterize the OutOfStock properties, then connects these scoped tokens to the global ones.

    Screen Shot 2022-06-06 at 14 34 16

    Tokens

    Title

    Local tokenDefault value/Global token linked
    --fs-out-of-stock-title-margin-bottomvar(--fs-spacing-0)
    --fs-out-of-stock-title-line-height1.15
    --fs-out-of-stock-title-sizevar(--fs-text-size-3)
    --fs-out-of-stock-title-weightvar(--fs-text-weight-bold)

    Message

    Local tokenDefault value/Global token linked
    --fs-out-of-stock-message-column-gapvar(--fs-spacing-0)
    --fs-out-of-stock-message-margin-bottomvar(--fs-spacing-3)
    --fs-out-of-stock-message-line-height1.15
    --fs-out-of-stock-message-sizevar(--fs-text-size-base)
    --fs-out-of-stock-message-weightvar(--fs-text-weight-regular)

    Button

    Local tokenDefault value/Global token linked
    --fs-out-of-stock-button-width100%
    --fs-out-of-stock-button-margin-topvar(--fs-spacing-3)

    How to test it?

    Checklist

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should comes first.
    • [x] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#4)
    • [x] Updated the Storybook - if applicable.
    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.
    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.
    Documentation Features 
    opened by ArthurTriis1 7
  • feat: Incremental Static Build

    feat: Incremental Static Build

    What's the purpose of this pull request?

    This PR uses the new WebOps capability called Incremental Static Builds. This should drastically improve response times and reduce infrastructure usage on deferred pages, like PDPs and PLPs

    How does it work?

    WebOps recently released this Incremental Static Build feature. To use on Next.JS, make sure to use getStaticProps and getStaticPaths APIS and enable USE_STALE_CACHE=true on vtex.env.

    How to test it?

    Open a PDP. Check the response header called x-faststore-cache. The first request should give you a MISS. The second request should give you HIT. Note that HITs are much faster than MISS. Also, note that all subsequent requests have a HIT as value.

    References

    • Original PR on WebOps: https://github.com/vtex/vtex-cicd-platform/pull/105
    Features Performance 
    opened by tlgimenes 7
  • feat: Add new tokens to `SkuSelector` [FS-379]

    feat: Add new tokens to `SkuSelector` [FS-379]

    What's the purpose of this pull request?

    This PR intends to apply new tokens to SkuSelector based on the new Theming structure: new scoped tokens linked to global ones.

    How does it work?

    This PR uses local variables to parameterize the SkuSelector properties, then connects these scoped tokens to the global ones.

    How to test it?

    These changes should not affect the SkuSelector behavior. It can be tested through Storybook, inside the SkuSelector page.

    Checklist

    PR Title and Commit Messages

    • [x] PR title and commit messages follow the Conventional Commits specification
      • Available prefixes: feat, fix, chore, docs, style, refactor, perf, and test

    PR Description

    • [x] Added a label according to the PR goal - Breaking change, Features, Bug fixes, Chore, Documentation, Style changes, Refactoring, Performance, and Test
    • [x] Added the component, hook, or path name in-between backticks (``) - if applicable, e.g., ComponentName component, useWindowDimensions hook

    Documentation

    • [x] PR description
    • [x] Added to/Updated the Storybook - if applicable
    Features 
    opened by lucasfp13 6
  • Feat: [Refinements] Creates `ShippingSimulation`

    Feat: [Refinements] Creates `ShippingSimulation`

    What's the purpose of this pull request?

    This PR aims to create and refine the ShippingSimulation that is found in the PDP. This task didn't include API integration. Thus, we are using mocked data just to see the component working as expected.


    Tasks:

    • [x] Creates Shipping Simulation.
    • [x] CSS Modules.
    • [x] Themification.
    • [x] Storybook.

    How does it work?

    |Desktop|Mobile| |-|-| |06VzGVSK2e|mobile-shipping-simulation|

    πŸ‘€ One behavior to pay attention to:

    • if the user had a PostalCode included in its session, the page should load this PostalCode in the ShippingSimulation as the default.
    • if the user sets the PostalCode in its session while in the PDP using the Regionalization feature, the page should load this PostalCode only if there is no PostalCode included in the ShippingSimulation. But as we don't save the PostalCode from the ShippingSimulation, if the user refreshes the page, the one from the session must override the other from the ShippingSimulation.

    7rxQ0BdqYo

    How to test it?

    So far, we are using mocked data, but you can play around inside the PDP. If something didn't work properly (because we are using a user session), try to clean the IndexDB data.

    You can also see the storybook.

    References

    https://www.figma.com/file/EYJqnbWByrSX9EMKvBzBLm/22%2F06%2F14-Handoff-for-PDP-Components?node-id=1001%3A131786 https://www.figma.com/file/EYJqnbWByrSX9EMKvBzBLm/22%2F06%2F14-Handoff-for-PDP-Components?node-id=1001%3A152727 https://vtex-dev.atlassian.net/jira/software/projects/FS/boards/632?selectedIssue=FS-475

    Checklist

    You may erase this after checking them all ;)

    Changelog

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should come first.
    • [x] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#4)

    PR Description

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.
    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.
    • [x] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    Documentation

    • [x] PR description
    • [x] Added to/Updated the Storybook - if applicable.
    • [ ] For documentation changes, ping @ carolinamenezes or @ PedroAntunesCosta to review and update.
    Documentation Features 
    opened by eduardoformiga 6
  • Feat: Adds tokens to `Navbar`

    Feat: Adds tokens to `Navbar`

    What's the purpose of this pull request?

    This PR applies the new Theming structure to Navbar: new scoped tokens linked to global ones.

    It also refactors and split the navbar-related components as NavbarSlider to its own file.

    How does it work?

    This PR uses local variables to parameterize the Navbar properties, then connects these scoped tokens to the global ones.

    Tokens can be visualized in the storybook.

    How to test it?

    • The Navbar component and its related components should look just as it was before these changes.
    • You can check the story on Storybook.

    Checklist

    Changelog

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should comes first.
    • [x] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#4)

    PR Description

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.
    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.
    • [x] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    Documentation

    • [x] PR description
    • [x] Added to/Updated the Storybook - if applicable.
    • [ ] For documentation changes, ping @ carolinamenezes, @ PedroAntunesCosta or @ Mariana-Caetano to review and update.
    Documentation Features 
    opened by eduardoformiga 6
  • chore: Uses CSS Modules on product components at PLP

    chore: Uses CSS Modules on product components at PLP

    What's the purpose of this pull request?

    This is the first PR to accomplish the use of CSS Modules on all components at PLP. FSSS-355.

    This PR does this for the ProductCard and ProductGrid components. It also adjusts the usage of the ProductGallery section.

    I recommend reviewing this PR hiding whitespaces

    How does it work?

    These steps were followed to accomplish it for both components:

    • Change CSS file name to .module.scss
    • Wrap css content into a single class
    • Import css at the component
    • Removes import in all other places

    How to test it?

    Enter the preview and goes to the PLP, Search, and homepage. Everything should be working fine.

    Checklist

    You may erase this after checking them all ;)

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should comes first.

    • [x] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#12)

    • PR description

    • [x] Updated the Storybook - if applicable.

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.

    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.

    • [x] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    • [x] For documentation changes, ping @carolinamenezes or @Mariana-Caetano to review and update the changes.

    opened by danzanzini 6
  • Feat: add attachments to cartitem

    Feat: add attachments to cartitem

    What's the purpose of this pull request?

    Updates the starter to take attachments into account when calculating the item ID: https://github.com/vtex/faststore/pull/1304

    How does it work?

    The implementation uses the same logic as FastStore API's getId function

    How to test it?

    Add items to the cart and check the browser storage (indexed db). It should work just like before, but with id separator as :: instead of the previous : (this change was introduced to match the logic inside FastStore API)

    Checklist

    You may erase this after checking them all ;)

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should comes first.

    • [x] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#4)

    • PR description

    • [x] Updated the Storybook - if applicable.

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.

    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.

    • [x] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    • [x] For documentation changes, ping @carolinamenezes or @Mariana-Caetano to review and update the changes.

    Features 
    opened by icazevedo 6
  • chore: Improve home performance

    chore: Improve home performance

    What's the purpose of this pull request?

    The main goal of this PR is to decrease the Total Blocking Time (TBT), and improve the LH score metric.

    How does it work?

    This PR decreases the highest portion of the TBT from the first render, which is related to execution and compiling code from SWR, ButtonSignIn, two ProductShelf, and ProductTiles. To tackle this problem these components that use the SWR, now pass the suspense property to SWR. By doing this these components are suspended and rendered into a new task, decreasing the time from the first render task, consequently decreasing the TBT. You can see this at the flamegraph below

    image

    Also, this PR creates a new task for the SWR fetcher function to decrease the possibility to create long tasks. This change impacts all pages.

    Take a look at the results below:

    Before - https://sfj-d8224eb--nextjs.preview.vtex.app/ | Metric | Mean | Standard deviation | Confidence Interval (95%) | |--------|--------|--------|--------| | Cumulative Layout shift (CLS) | 0.00 | 0.00 | [0.00, 0.00] | | First Contentful Paint (FCP) | 1157.39 | 4749.32 | [-542.13, 2856.92] | | Largest Contentful Paint (LCP) | 2067.96 | 217834.57 | [-75883.14, 80019.06] | | Time to Interactive (TTI) | 2961.19 | 15004.17 | [-2407.99, 8330.36] | | Total Blocking Time (TBT) | 506.91 | 15683.75 | [-5105.44, 6119.27] | | Performance score | 0.853 | 0.002182 | [0.852552, 0.854114] | | JavaScript Execution Time | 1380.73 | 34724.50 | [-11045.27, 13806.73] | | Speed Index | 1388.05 | 34829.27 | [-11075.44, 13851.55] |

    After - https://sfj-da42147--nextjs.preview.vtex.app/ | Metric | Mean | Standard deviation | Confidence Interval (95%) | |--------|--------|--------|--------| | Cumulative Layout shift (CLS) | 0.00 | 0.00 | [0.00, 0.00] | | First Contentful Paint (FCP) | 1055.43 | 0.07 | [1055.41, 1055.46] | | Largest Contentful Paint (LCP) | 1687.31 | 126758.50 | [-43672.63, 47047.26] | | Time to Interactive (TTI) | 2680.05 | 3588.11 | [1396.06, 3964.04] | | Total Blocking Time (TBT) | 313.16 | 520.99 | [126.72, 499.59] | | Performance score | 0.925 | 0.000125 | [0.924955, 0.925045] | | JavaScript Execution Time | 1153.76 | 2166.92 | [378.34, 1929.18] | | Speed Index | 1408.14 | 124234.62 | [-43048.64, 45864.93] |

    ⚠️ As you can see the TBT mean is lower, the score is higher, and almost all metrics are more consistent with lower standard deviation.

    How to test it?

    References

    https://nextjs.org/docs/advanced-features/dynamic-import https://loadable-components.com/docs/loadable-vs-react-lazy/

    Checklist

    You may erase this after checking them all ;)

    • [x] Added an entry in the CHANGELOG.md at the beginning of its due section. The latest version should comes first.

    • [ ] Added the PR number with the PR link at the entry in the CHANGELOG.md. E.g., New items in the pull_request_template.md (#4)

    • PR description

    • [x] Updated the Storybook - if applicable.

    • [x] Added a label according to the PR goal - Breaking change, Enhancement, Bug or Chore.

    • [x] Added the component, hook, or pathname in-between backticks (``) - If applicable. E.g., ComponentName component.

    • [x] Identified the function or parameter in the PR - If applicable. E.g., useWindowDimensions hook.

    • [x] For documentation changes, ping @carolinamenezes or @Mariana-Caetano to review and update the changes.

    Features Performance 
    opened by igorbrasileiro 6
  • Update README.md

    Update README.md

    What's the purpose of this pull request?

    Considering the context, what is the problem we'll solve? Where in VTEX's big picture our issue fits in? Write a tweet about the context and the problem itself.

    How does it work?

    Tell us the role of the new feature, or component, in its context.

    How to test it?

    Describe the steps with bullet points. Is there any external reference, link, or example?

    References

    Spread the knowledge: is any content you used to create this PR worth sharing?

    Extra tip: add references to related issues or mention people important to this PR may be good for the documentation and reviewing process

    Checklist

    You may erase this after checking them all :wink:

    PR Title and Commit Messages

    • [ ] PR title and commit messages follow the Conventional Commits specification
      • Available prefixes: feat, fix, chore, docs, style, refactor, perf, and test

    PR Description

    • [ ] Added a label according to the PR goal - Breaking change, Features, Bug fixes, Chore, Documentation, Style changes, Refactoring, Performance, and Test
    • [ ] Added the component, hook, or path name in-between backticks (``) - if applicable, e.g., ComponentName component, useWindowDimensions hook

    Dependencies

    • [ ] Committed the yarn.lock and bun.lockb file when there were changes to the packages

    Documentation

    • [ ] PR description
    • [ ] Added to/Updated the Storybook - if applicable
    • [ ] For documentation changes, ping @carolinamenezes or @PedroAntunesCosta to review and update
    opened by viniagostini 2
  • Feat: Replace `Dropdown` FSUI

    Feat: Replace `Dropdown` FSUI

    What's the purpose of this pull request?

    • [x] Uses Dropdown from the faststore/ui
    • [x] Removes Dropdown components folder

    How does it work?

    Everything should look as before. (Visually)

    How to test it?

    You can test through the preview link.

    Sections that uses Accordion:

    References

    This PR should be merged after https://github.com/vtex/faststore/pull/1572 updates are available.

    opened by ArthurTriis1 2
  • Feat: Replace `Accordion` FSUI

    Feat: Replace `Accordion` FSUI

    What's the purpose of this pull request?

    • [x] Uses Accordion from the faststore/ui
    • [x] Removes Accordion components folder

    How does it work?

    Everything should look as before. (Visually)

    How to test it?

    You can test through the preview link.

    Sections that uses Accordion:

    Desktop

    |PDP| PLP (Facets)| |-|-| |image|image|

    Mobile

    |FooterLinks| PLP (Filters)| |-|-| image|image|

    References

    This PR should be merged after https://github.com/vtex/faststore/pull/1567 updates are available.

    depends on Evergreen 
    opened by hellofanny 2
  • fix: update builder files to the new implementation

    fix: update builder files to the new implementation

    What's the purpose of this pull request?

    Change to the new implementation of the builder files.

    How does it work?

    Add builder argument to the cms sync command. Related to this pr: https://github.com/vtex/cli-plugin-cms/pull/16.

    How to test it?

    Describe the steps with bullet points. Is there any external reference, link, or example?

    References

    Spread the knowledge: is any content you used to create this PR worth sharing?

    Extra tip: add references to related issues or mention people important to this PR may be good for the documentation and reviewing process

    Checklist

    You may erase this after checking them all :wink:

    PR Title and Commit Messages

    • [X] PR title and commit messages follow the Conventional Commits specification
      • Available prefixes: feat, fix, chore, docs, style, refactor, perf, and test

    PR Description

    • [ ] Added a label according to the PR goal - Breaking change, Features, Bug fixes, Chore, Documentation, Style changes, Refactoring, Performance, and Test
    • [ ] Added the component, hook, or path name in-between backticks (``) - if applicable, e.g., ComponentName component, useWindowDimensions hook

    Dependencies

    • [ ] Committed the yarn.lock and bun.lockb file when there were changes to the packages

    Documentation

    • [ ] PR description
    • [ ] Added to/Updated the Storybook - if applicable
    • [ ] For documentation changes, ping @carolinamenezes or @PedroAntunesCosta to review and update
    opened by myllenaalves 2
  • ignore-test

    ignore-test

    What's the purpose of this pull request?

    Considering the context, what is the problem we'll solve? Where in VTEX's big picture our issue fits in? Write a tweet about the context and the problem itself.

    How does it work?

    Tell us the role of the new feature, or component, in its context.

    How to test it?

    Describe the steps with bullet points. Is there any external reference, link, or example?

    References

    Spread the knowledge: is any content you used to create this PR worth sharing?

    Extra tip: add references to related issues or mention people important to this PR may be good for the documentation and reviewing process

    Checklist

    You may erase this after checking them all :wink:

    PR Title and Commit Messages

    • [ ] PR title and commit messages follow the Conventional Commits specification
      • Available prefixes: feat, fix, chore, docs, style, refactor, perf, and test

    PR Description

    • [ ] Added a label according to the PR goal - Breaking change, Features, Bug fixes, Chore, Documentation, Style changes, Refactoring, Performance, and Test
    • [ ] Added the component, hook, or path name in-between backticks (``) - if applicable, e.g., ComponentName component, useWindowDimensions hook

    Dependencies

    • [ ] Committed the yarn.lock and bun.lockb file when there were changes to the packages

    Documentation

    • [ ] PR description
    • [ ] Added to/Updated the Storybook - if applicable
    • [ ] For documentation changes, ping @carolinamenezes or @PedroAntunesCosta to review and update
    opened by cezar-guimaraes 2
  • chore: add code sandbox ci packages preview

    chore: add code sandbox ci packages preview

    What's the purpose of this pull request?

    Considering the context, what is the problem we'll solve? Where in VTEX's big picture our issue fits in? Write a tweet about the context and the problem itself.

    How does it work?

    Tell us the role of the new feature, or component, in its context.

    How to test it?

    Describe the steps with bullet points. Is there any external reference, link, or example?

    References

    Spread the knowledge: is any content you used to create this PR worth sharing?

    Extra tip: add references to related issues or mention people important to this PR may be good for the documentation and reviewing process

    Checklist

    You may erase this after checking them all :wink:

    PR Title and Commit Messages

    • [ ] PR title and commit messages follow the Conventional Commits specification
      • Available prefixes: feat, fix, chore, docs, style, refactor, perf, and test

    PR Description

    • [ ] Added a label according to the PR goal - Breaking change, Features, Bug fixes, Chore, Documentation, Style changes, Refactoring, Performance, and Test
    • [ ] Added the component, hook, or path name in-between backticks (``) - if applicable, e.g., ComponentName component, useWindowDimensions hook

    Dependencies

    • [ ] Committed the yarn.lock and bun.lockb file when there were changes to the packages

    Documentation

    • [ ] PR description
    • [ ] Added to/Updated the Storybook - if applicable
    • [ ] For documentation changes, ping @carolinamenezes or @PedroAntunesCosta to review and update
    Evergreen 
    opened by icazevedo 3
Releases(v22.26.0.beta)
  • v22.26.0.beta(Jul 1, 2022)

    PLPs now support price range filtering, and nonexistent PDPs can now handle 404 errors. Also, more components have been updated to conform to the new Base Store Theming architecture.

    πŸŽ‰ New

    • New Dropdown component (#118)

      The Dropdown component has been extracted from Breadcrumb and received new local tokens as part of adhering to the new Base Store Theming architecture.

      Dropdown component

    • Price range filtering now available for PLPs (#121)

      Thanks to the new PriceRange component, Product Listing Pages (PLPs) can now support price range filtering.

    • 301 redirects added to PDPs (#93)

      So that VTEX stores migrating to FastStore can work seamlessly, a 301 redirect between vtexSlug and fastStoreSlug was created, where:

      • vtexSlug: /{slug}/p
      • fastStoreSlug: /{slug}-{skuId}/p

    Theming

    As part of adhering to the new Base Store Theming architecture, the following components now have new local tokens related to global ones:

    • New local tokens to Tiles (#134)
    • New local tokens to ProductGrid (#144)
    • New local tokens to Accordion (#130)
    • New local tokens to ImageGallery (#143)
    • New local tokens to RegionalizationBar (#104)
    • New local tokens to Modal and RegionalizationModal (#128)
    • New local tokens to Dropdown (#118)
    • New local tokens to EmptyState (#122)
    • New local tokens to Filter (#139)

    πŸ› Bug fix

    • ImageGallerySelector scroll fixed (##132)

      Undesired behaviors of the ImageGallerySelector scroll on Safari were fixed.

      | Before | Now | |-------|--------| | Scroll with error | Fixed scroll |

    ✨ Enhancement

    • Page code error handling enhanced (#116)

      Instead of always responding with a 500 status code, nonexistent Product Details Pages (PDPs) can now handle 404 errors.

    • External and client-side navigation now supported by the Link component (#117)

      The Link component now handles both external and client-side navigation. This change intends to unify the Link component usage.

    • SVG logo replaced by a static asset (#135)

      The SVG logo was removed from the JavaScript code and imported as a static asset. This change aims to reduce the amount of JavaScript downloaded on the client-side since directly declaring SVGs in JS code can harm the Total Blocking Time (TBT) and final bundle sizes.

    • Search history and top searches on search input (#112).

      The last four previously searched terms (SearchHistory) and the top five searches (SuggestionsTopSearch) are now presented on search input.

      Search input

    • CSS selector for DropdownButton updated (#123)

      To select the DropdownButton component, the [data-fs-dropdown-button] CSS handle is being used instead of [data-store-dropdown-button].

    • EmptyState styles updated (#125)

      The --fs-text-size-3 token was replaced by --fs-text-size-lead on the EmptyCart component.

    • Facets styles updated (#150)

      The tokens related to the Facets components were renamed and updated accordingly.

    πŸ“„ Documentation

    • New Regionalization section on the Storybook (#110)

      The Base Store Storybook now has the Regionalization section that lists all regionalization-related components and how to use them.

    • General improvements on Storybook implemented (#129)

      The Sandbox tab is now available for all component pages, allowing to test the component in different viewports and use other add-ons. Also, some console errors on the Storybook were fixed.

    • πŸ“„ EmptyState Storybook enhanced with use cases (#126)

    🧹 Chore

    • Upgraded dependencies (#131)
    • Storybook's version bump from 6.4.20 to 6.5.9 (#120)
    • Support for new type definitions from React 18 (#113)
    Source code(tar.gz)
    Source code(zip)
  • v22.23.0.beta(Jun 10, 2022)

    πŸŽ‰ New feature

    • New Toggle component #15 The Toggle component works as a checkbox, but in the form of a switch control.

    • Updated Link theming #17 The Link component now has new tokens based on the Base Store Theming Structure.

    πŸ› Bug fix

    • Fixed search suggestions locale issue #71 All requests to the FastStore Search API now receive locale info so the search can return product suggestions according to the user locale.

    • Fixed custom attributes for img and link tags #60 Custom attributes are now only passed to img and link HTML tags to avoid inconsistencies in other components.

    • Fixed the fetchPriority prop warning #54 Fixed warning related to the fetchPriority being written in camel case.

    • Fixed Storybook error while importing CSS styles #53

    • Fixed EmptyState visual bug #11 The vertical gap for the empty cart state is now fixed.

    | Before | After | | -------- | -------- | | Screen Shot 2022-05-02 at 15 08 03 | Screen Shot 2022-05-02 at 15 07 31 |

    ✨ Enhancement

    • Improved page loading time with Incremental Static Build #39 Base Store now uses the new Incremental Static Build (ISB) WebOps solution.

    • Replaced OutOfStock component #72 Base Store now uses the OutofStock component from the FastStore UI library.

    • Improved page LCP #49 Improved Largest Contentful Paint (LCP) score after implementing the fetchpriority attribute.

    • Added analytics events to CartItem #35 The CartItem component now tracks user actions via the add_to_cart and remove_from_cart Google Analytics events.

    • Updated Select theming #16 The Select component now has new tokens based on the Base Store Theming Structure.

    • Updated Incentives theming #56 The Incentives component now has new tokens based on the Base Store Theming Structure.

    • Improved Theming documentation on Storybook #67 New docs published on the Base Store Storybook. Also, a new documentation format based on MDX was implemented.

    🧹 Chore

    • CartItem tests for analytics events #66 The CartItem component now has tests to check if events are fired to Google Analytics when users change the quantity of a product on the minicart.

    • UpdatedQuantitySelector styling #76 The QuantitySelector component now uses CSS modules.

    • camelCase standard for CSS Modules classes #42 Since the gatsby.store only imports classes as camel case, the nextjs.store now has a configuration to import classes as camel case too.

    • Improved home performance #45

    • Updated global tokens nomenclature #51

    Source code(tar.gz)
    Source code(zip)
  • v22.19.0.beta(May 9, 2022)

    πŸŽ‰ New feature

    • New search event API - #2 The search.query event has been added to the VTEX Intelligent Search Analytics API. This event is used to generate indices like Top Searches and Suggestions.

    • New theming structure to the BannerText - #470 Local tokens (CSS variables) were added to the BannerText component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens.

    • New theming structure to the Product Shelf component - #464 Local tokens (CSS variables) were added to the Product Shelf component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens.

    • New theming structure to Badge component - #462 Local tokens (CSS variables) were added to the Badge component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens.

    • New theming structure to the Quantity Selector component - #448 Local tokens (CSS variables) were added to the Quantity Selector component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens.

    • Button new theming - #442 Local tokens (CSS variables) were added to the Button component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens. Also, this change:

      • Gathers the buttons variants into a single folder;
      • Switches the order of the buttons variants prefixes/suffixes;
      • Fixes the variant Alert colors.
    • New theming structure to Hero component - #435 Local tokens (CSS variables) were added to the Hero component in the new theming structure (#407) to configure the component's properties and connect the local tokens to the global tokens.

    • New VTEX Search tracking - #389

    • New Storybook package to the base.store - #463 Use the Storybook as a testing environment for components. To enable it, run yarn storybook in the terminal and, after the build, open localhost:6006.

    • RegionalizationModal component - #426 TheRegionalizationModal allows users to set their current location and check available products for their region.

    image

    • Breadcrumb component - #436 The Dropdown was added to the Breadcrumb component. The Dropdown allows related pages to be linked at every level via dropdown menus.

    image

    πŸ› Bug fix

    • Adjust Incentives List to render CMS data - #474 Now CMS users can edit the icons, title and subtitles of the Incentives List.

    • Unused CSS imports - #476 Unused CSS imports were removed from components that are not yet being used.

    • Storybook initialization - #492 To avoid issues with styles being applied while running yarn storybook, the components.scss has been added as storybook-components.scss, and the package.json was updated to include @reach/router.

    • Styling issue on RegionalizationModal - #488 The RegionalizationModal no longer misses its imports in layout.css:

    @import "src/components/regionalization/RegionalizationBar/regionalization-bar.scss";
    @import "src/components/regionalization/RegionalizationButton/regionalization-button.scss";
    @import "src/components/regionalization/RegionalizationInput/regionalization-input.scss";
    @import "src/components/regionalization/RegionalizationModal/regionalization-modal.scss";
    
    • Unusued CSS issues - #480 The error "Unused CSS" in the Lighthouse CI is fixed.

    • Hero layout shift - #472
      The layout shift on Hero section was fixed. Now the the CLS is fixed on lighthouse report.

    • Tweaks layout section spacings - #469
      The spacing between components with the layout section class has been changed from margin to padding. This change is due to a problem with the box-shadow on the product-card.

    ✨ Enhancement

    • Update Regionalization input to use the TextInput component - #9 The Regionalization Input now uses the InputText component.

    • Update RegionalizationButton and RegionalizationBar to show the postal code - #7 The Regionalization Button and Regionalization Bar now shows the last postal code saved, instead of receiving a content prop.

    🧹 Chore

    • Lighthouse check via GitHub Action #484 Removed the GitHub Action that was running Lighthouse since it was failing and WebOps already runs the Lighthouse.
    Source code(tar.gz)
    Source code(zip)
Owner
VTEX Sites
Websites powered by VTEX
VTEX Sites
The JavaScript and API powered WordPress.com

Calypso Calypso is the new WordPress.com front-end – a beautiful redesign of the WordPress dashboard using a single-page web application, powered by t

Automattic 12.2k Dec 30, 2022
βšͺ SVG-Powered component to easily create skeleton loadings.

SVG-Powered component to easily create placeholder loadings (like Facebook's cards loading). Features βš™οΈ Customizable: Feel free to change the colors,

Danilo Woznica 12.7k Jan 4, 2023
A Workspace Web App powered by React and Node Js.

zc_main This is the Zuri Chat frontend built with ExpressJS (Backend) and React (Frontend) Getting Started. Make sure you have nodejs installed by run

Zuri Chat 189 Dec 14, 2022
Chat with an AI that's powered by GPT-j. Talk with it, set parameters, ask questions, and twist words

AI Chat - Open Source | Powered by GPT-j with 6 billion neurons Chat with an AI that's powered by GPT-j. Talk with it, set parameters, ask questions,

Romelianism 3 Dec 29, 2022
Create Sonnat App - Set up a modern web app which is powered by Sonnat.

Create Sonnat App - Set up a modern web app which is powered by Sonnat.

Sonnat 2 Jan 31, 2022
A small CLI tool to create a semantic release and git-cliff powered Changelog

cliff-jumper A small CLI tool to create a semantic release and git-cliff powered Changelog Description When managing a collection of projects you ofte

Favware 15 Sep 22, 2022
Next-gen, highly customizable content editor for the browser - based on React and Redux and written in TypeScript. WYSIWYG on steroids.

ReactPage ReactPage is a smart, extensible and modern editor ("WYSIWYG") for the web written in React. If you are fed up with the limitations of conte

null 9.1k Jan 6, 2023
⚑️The Fullstack React Framework β€” built on Next.js

The Fullstack React Framework "Zero-API" Data Layer β€” Built on Next.js β€” Inspired by Ruby on Rails Read the Documentation β€œZero-API” data layer lets y

⚑️Blitz 12.5k Jan 4, 2023
An interactive CLI automation tool πŸ› οΈ for creating react.js and next.js projects most fast and efficiently. βš›οΈ

An interactive CLI automation tool ??️ for creating react.js and next.js projects most fast and efficiently. βš›οΈ About ℹ️ ReexJs CLI is an interactive

Alexis Guzman 27 Apr 12, 2022
My JAMStack website/blog [Next / MDX / ChakraUI]

carlosazaustre.es Personal website/blog Technologies used Next.js React.js @emotion/styled ChakraUI MarkdownX Vercel Support If you like my work, you

Carlos Azaustre 80 Dec 25, 2022
A forkable Next.js site w/ a blank custom Nextra theme (w/Tailwind)

Nextra Blank Custom Theme/Boilerplate Example A nearly blank MDX blog/content site powered by a custom Nextra theme (see components/layout.js) w/Tailw

Jared Palmer 91 Jan 6, 2023
trying to clone tiktok using next, typescript, tailwindcss and hasura graphql. For educational purposes only

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

null 2 Jan 4, 2022
This is a minimal Next.js app where you can create birthday wishes and share the link to anyone :)

Happy Birthday Wisher Check out the Live Website This is a simple Next.js project where you can generate a birthday wish for someone. Just enter their

Gourav Khunger 21 Dec 22, 2022
Makeup shopping app using Next.js and TypeScript

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Osama Gozlan 2 Nov 21, 2021
Real state property listing app using next.js , chakra.ui, SCSS

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

null 1 Dec 19, 2021
Get an array of all React Spectrum modules, useful for integrating with Next.js

get-react-spectrum-modules This package exports a function that returns an array of all React Spectrum modules that it finds in the node_modules direc

Marc Abramowitz 1 Mar 8, 2022
Build Google 2.0 with Tailwind CSS & Next.js for Education Purpose..

Paradise of Creativity Parimal Nakrani This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server:

Parimal Nakrani 1 Dec 21, 2021
E-commerce project using Next.js

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Mix Sirapat 1 Jan 5, 2022
Build Instagram 2.0 with Next.js (Firebase v9, Tailwind CSS, NextAuth, Recoil) for the Education Purpose..

This example shows how to use Tailwind CSS (v3.0) with Next.js. It follows the steps outlined in the official Tailwind docs.

Parimal Nakrani 1 Dec 24, 2021