Overview
This documentation is to help you understand the template's structure. Please go through the documentation carefully to understand how this template is made and how to edit this properly. Basic HTML, CSS and JS knowledge is required to customize this template.
If you have any questions that are beyond the scope of this help file, please feel free to get in touch.
Support for my items includes:
-
Responding to questions or problems regarding the item and its features
Fixing bugs and reported issues
Providing updates to ensure compatibility with new software versions
Item support does not include:
Before seeking support please:
-
Make sure your question is a valid item Issue and not a customization request.
Make sure you have read through the documentation and any related video guides before asking support on how to accomplish a task.
Make sure to double check the item FAQs.
If you have customized your item and now have an issue, back-track to make sure you didn't make a mistake. If you have made changes and can't find the issue, please provide us with your changelog.
Most of the time we find that the solution to people's issues can be solved with a simple "Google Search". You might want to try that before seeking support. You might be able to fix the issue yourself much quicker than we can respond to your request.
Make sure to state the name of the item you are having issues with when requesting support via ThemeForest.
What is it?
Primer is a creative material design admin template built for React. It comes out of the box with support for RTL and comes with light and dark colour schemes. With this, you get all you need to start working on your SAAS, CRM, CMS or dashboard based project.
Once you've purchased Primer please consider giving a 5 star rating, it helps in pushing out more updates and adding a lot more features.
Getting started
This template is built with create-react-app and requires Node and NPM or YARN to be installed.
1. Installing the prerequisites
Node.js and NPM: You can download Node.js from https://nodejs.org. NPM comes bundled with Node.js
For yarn, you can checkout these installation instructions.
2. Installing the packages
Before proceding you'll need to install packages. You can do this by running npm install / yarn install from the root of your project to install all the necessary dependencies.
3. .env variables
In order to use Google maps, openweather and alphavantage you'll need to add the API keys inside the .env file in the root of your project. A sample.env file is already provided, use this to add your api keys.
To get a google map api key follow this link https://developers.google.com/maps/documentation/javascript/get-api-key
To get an open weather api key follow this link https://openweathermap.org/appid
To get an alphavantage api key follow this link https://www.alphavantage.co/support/#api-key
4. Running your project
Run `npm start or yarn start` to launch a dev server. Navigate to `http://localhost:3000/`. The app will automatically reload if you change any of the source files.
To create a production ready build for deployment you can run `npm run build or yarn build`
Folder Structure
.
├── README.md
├── documentation
│ ├── assets
│ │ ├── material.css
│ │ ├── material.js
│ │ ├── material.min.css
│ │ ├── material.min.css.map
│ │ └── material.min.js
│ ├── images
│ │ ├── android-desktop.png
│ │ ├── favicon.png
│ │ └── ios-desktop.png
│ ├── index.html
│ └── styles.css
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── manifest.json
│ └── static
│ ├── fonts
│ │ └── pe
│ │ ├── css
│ │ │ ├── helper.css
│ │ │ ├── helper.min.css
│ │ │ ├── pe-icon-set-weather.css
│ │ │ └── pe-icon-set-weather.min.css
│ │ └── fonts
│ │ ├── pe-icon-set-weather.eot
│ │ ├── pe-icon-set-weather.svg
│ │ ├── pe-icon-set-weather.ttf
│ │ └── pe-icon-set-weather.woff
│ ├── images
│ │ ├── avatar.jpg
│ │ ├── face1.jpg
│ │ ├── face2.jpg
│ │ ├── face3.jpg
│ │ ├── face4.jpg
│ │ ├── face5.jpg
│ │ ├── face6.jpg
│ │ ├── face7.jpg
│ │ ├── logo-dark.svg
│ │ ├── logo.svg
│ │ └── unsplash
│ │ ├── 1.jpg
│ │ ├── 10.jpg
│ │ ├── 11.jpg
│ │ ├── 12.jpg
│ │ ├── 13.jpg
│ │ ├── 14.jpg
│ │ ├── 15.jpg
│ │ ├── 16.jpg
│ │ ├── 17.jpg
│ │ ├── 18.jpg
│ │ ├── 19.jpg
│ │ ├── 2.jpg
│ │ ├── 20.jpg
│ │ ├── 21.jpg
│ │ ├── 22.jpg
│ │ ├── 3.jpg
│ │ ├── 4.jpg
│ │ ├── 5.jpg
│ │ ├── 6.jpg
│ │ ├── 7.jpg
│ │ ├── 8.jpg
│ │ ├── 9.jpg
│ │ └── fashion3.jpg
│ └── styles
│ └── app.css
└── src
├── components
│ ├── ActivityStream
│ │ └── ActivityStream.js
│ ├── AppProvider
│ │ ├── AppContext.js
│ │ └── AppProvider.js
│ ├── Cards
│ │ ├── CartCard.js
│ │ ├── ImageStatCard.js
│ │ ├── MapCard.js
│ │ ├── NewsCard.js
│ │ ├── PostCard.js
│ │ ├── ProfileCard.js
│ │ ├── StatCard.js
│ │ └── WeatherCard.js
│ ├── Demo
│ │ └── Example.js
│ ├── Header
│ │ └── Header.js
│ ├── Message
│ │ ├── Item.js
│ │ └── Message.js
│ ├── NotificationCenter
│ │ └── NotificationCenter.js
│ ├── Pricing
│ │ └── Pricing.js
│ ├── Sidebar
│ │ ├── Sidebar.js
│ │ └── SidebarItem.js
│ ├── Timeline
│ │ └── Timeline.js
│ ├── Workspace
│ │ └── Workspace.js
│ ├── Wrapper
│ │ └── Wrapper.js
│ └── index.js
├── containers
│ └── Dashboard.js
├── helpers.js
├── index.js
├── pages
│ ├── Apps
│ │ ├── Calendar.js
│ │ ├── Chat.js
│ │ ├── Media.js
│ │ ├── Messages.js
│ │ ├── Social.js
│ │ └── calendar.css
│ ├── Authentication
│ │ ├── Lockscreen.js
│ │ ├── PasswordReset.js
│ │ ├── Signin.js
│ │ └── Signup.js
│ ├── Charts
│ │ └── Charts.js
│ ├── Documentation
│ ├── Ecommerce
│ │ ├── Detail.js
│ │ └── Products.js
│ ├── Errors
│ │ ├── BackendError.js
│ │ └── NotFound.js
│ ├── Forms
│ │ ├── Editor.js
│ │ └── editor.css
│ ├── Home
│ │ └── Home.js
│ ├── Maps
│ │ ├── Google.js
│ │ └── Leaflet.js
│ ├── Material
│ │ ├── app-bar.js
│ │ ├── autocomplete.js
│ │ ├── avatars.js
│ │ ├── badges.js
│ │ ├── bottom-navigation.js
│ │ ├── buttons.js
│ │ ├── cards.js
│ │ ├── chips.js
│ │ ├── dialogs.js
│ │ ├── dividers.js
│ │ ├── drawers.js
│ │ ├── expansion-panels.js
│ │ ├── grid-list.js
│ │ ├── lists.js
│ │ ├── menus.js
│ │ ├── paper.js
│ │ ├── pickers.js
│ │ ├── progress.js
│ │ ├── selection-controls.js
│ │ ├── selects.js
│ │ ├── snackbars.js
│ │ ├── steppers.js
│ │ ├── tables.js
│ │ ├── tabs.js
│ │ ├── text-fields.js
│ │ └── tooltips.js
│ ├── Pages
│ │ ├── Blank.js
│ │ ├── Invoice.js
│ │ ├── Pricing.js
│ │ └── Timeline.js
│ ├── Taskboard
│ │ └── Taskboard.js
│ ├── Widgets
│ │ └── Widgets.js
│ └── index.js
├── registerServiceWorker.js
├── routes.js
├── styles
│ ├── Chat.js
│ ├── Dashboard.js
│ ├── Ecommerce.js
│ ├── EcommerceDetail.js
│ ├── Header.js
│ ├── MessageItem.js
│ ├── Messages.js
│ ├── NotificationCenter.js
│ ├── Pricing.js
│ ├── Session.js
│ ├── Sidebar.js
│ ├── SidebarItem.js
│ ├── Social.js
│ ├── StatCard.js
│ ├── Stream.js
│ ├── Taskboard.js
│ ├── Timeline.js
│ ├── Widget.js
│ ├── Workspace.js
│ ├── Wrapper.js
│ └── variables.js
└── utils
├── demos
│ ├── app-bar
│ │ ├── ButtonAppBar.js
│ │ ├── MenuAppBar.js
│ │ ├── SimpleAppBar.js
│ │ └── app-bar.md
│ ├── autocomplete
│ │ ├── IntegrationAutosuggest.js
│ │ ├── IntegrationDownshift.js
│ │ ├── IntegrationReactSelect.js
│ │ └── autocomplete.md
│ ├── avatars
│ │ ├── IconAvatars.js
│ │ ├── ImageAvatars.js
│ │ ├── LetterAvatars.js
│ │ └── avatars.md
│ ├── badges
│ │ ├── SimpleBadge.js
│ │ └── badges.md
│ ├── bottom-navigation
│ │ ├── LabelBottomNavigation.js
│ │ ├── SimpleBottomNavigation.js
│ │ └── bottom-navigation.md
│ ├── buttons
│ │ ├── ButtonBases.js
│ │ ├── ButtonSizes.js
│ │ ├── ContainedButtons.js
│ │ ├── CustomizedButtons.js
│ │ ├── FloatingActionButtonZoom.js
│ │ ├── FloatingActionButtons.js
│ │ ├── IconButtons.js
│ │ ├── IconLabelButtons.js
│ │ ├── OutlinedButtons.js
│ │ ├── TextButtons.js
│ │ └── buttons.md
│ ├── cards
│ │ ├── MediaControlCard.js
│ │ ├── RecipeReviewCard.js
│ │ ├── SimpleCard.js
│ │ ├── SimpleMediaCard.js
│ │ └── cards.md
│ ├── chips
│ │ ├── Chips.js
│ │ ├── ChipsArray.js
│ │ └── chips.md
│ ├── dialogs
│ │ ├── AlertDialog.js
│ │ ├── AlertDialogSlide.js
│ │ ├── ConfirmationDialog.js
│ │ ├── FormDialog.js
│ │ ├── FullScreenDialog.js
│ │ ├── ResponsiveDialog.js
│ │ ├── SimpleDialog.js
│ │ └── dialogs.md
│ ├── dividers
│ │ ├── InsetDividers.js
│ │ ├── ListDividers.js
│ │ └── dividers.md
│ ├── drawers
│ │ ├── ClippedDrawer.js
│ │ ├── MiniDrawer.js
│ │ ├── PermanentDrawer.js
│ │ ├── PersistentDrawer.js
│ │ ├── ResponsiveDrawer.js
│ │ ├── SwipeableTemporaryDrawer.js
│ │ ├── TemporaryDrawer.js
│ │ ├── drawers.md
│ │ └── tileData.js
│ ├── expansion-panels
│ │ ├── ControlledExpansionPanels.js
│ │ ├── DetailedExpansionPanel.js
│ │ ├── SimpleExpansionPanel.js
│ │ └── expansion-panels.md
│ ├── grid-list
│ │ ├── AdvancedGridList.js
│ │ ├── ImageGridList.js
│ │ ├── SingleLineGridList.js
│ │ ├── TitlebarGridList.js
│ │ ├── grid-list.md
│ │ └── tileData.js
│ ├── lists
│ │ ├── CheckboxList.js
│ │ ├── CheckboxListSecondary.js
│ │ ├── FolderList.js
│ │ ├── InsetList.js
│ │ ├── InteractiveList.js
│ │ ├── NestedList.js
│ │ ├── PinnedSubheaderList.js
│ │ ├── SimpleList.js
│ │ ├── SwitchListSecondary.js
│ │ └── lists.md
│ ├── menus
│ │ ├── FadeMenu.js
│ │ ├── ListItemComposition.js
│ │ ├── LongMenu.js
│ │ ├── MenuListComposition.js
│ │ ├── SimpleListMenu.js
│ │ ├── SimpleMenu.js
│ │ └── menus.md
│ ├── paper
│ │ ├── PaperSheet.js
│ │ └── paper.md
│ ├── pickers
│ │ ├── DateAndTimePickers.js
│ │ ├── DatePickers.js
│ │ ├── TimePickers.js
│ │ └── pickers.md
│ ├── progress
│ │ ├── CircularDeterminate.js
│ │ ├── CircularIndeterminate.js
│ │ ├── CircularIntegration.js
│ │ ├── CircularStatic.js
│ │ ├── DelayingAppearance.js
│ │ ├── LinearBuffer.js
│ │ ├── LinearDeterminate.js
│ │ ├── LinearIndeterminate.js
│ │ ├── LinearQuery.js
│ │ └── progress.md
│ ├── selection-controls
│ │ ├── CheckboxLabels.js
│ │ ├── Checkboxes.js
│ │ ├── CheckboxesGroup.js
│ │ ├── CustomizedSwitches.js
│ │ ├── RadioButtons.js
│ │ ├── RadioButtonsGroup.js
│ │ ├── SwitchLabels.js
│ │ ├── Switches.js
│ │ ├── SwitchesGroup.js
│ │ └── selection-controls.md
│ ├── selects
│ │ ├── ControlledOpenSelect.js
│ │ ├── DialogSelect.js
│ │ ├── MultipleSelect.js
│ │ ├── NativeSelects.js
│ │ ├── SimpleSelect.js
│ │ └── selects.md
│ ├── snackbars
│ │ ├── ConsecutiveSnackbars.js
│ │ ├── CustomizedSnackbars.js
│ │ ├── DirectionSnackbar.js
│ │ ├── FabIntegrationSnackbar.js
│ │ ├── FadeSnackbar.js
│ │ ├── LongTextSnackbar.js
│ │ ├── PositionedSnackbar.js
│ │ ├── SimpleSnackbar.js
│ │ └── snackbars.md
│ ├── steppers
│ │ ├── DotsMobileStepper.js
│ │ ├── HorizontalLinearAlternativeLabelStepper.js
│ │ ├── HorizontalLinearStepper.js
│ │ ├── HorizontalNonLinearAlternativeLabelStepper.js
│ │ ├── HorizontalNonLinearStepper.js
│ │ ├── HorizontalNonLinearStepperWithError.js
│ │ ├── ProgressMobileStepper.js
│ │ ├── SwipeableTextMobileStepper.js
│ │ ├── TextMobileStepper.js
│ │ ├── VerticalLinearStepper.js
│ │ └── steppers.md
│ ├── tables
│ │ ├── CustomPaginationActionsTable.js
│ │ ├── CustomizedTable.js
│ │ ├── EnhancedTable.js
│ │ ├── SimpleTable.js
│ │ └── tables.md
│ ├── tabs
│ │ ├── CenteredTabs.js
│ │ ├── CustomizedTabs.js
│ │ ├── DisabledTabs.js
│ │ ├── FullWidthTabs.js
│ │ ├── IconLabelTabs.js
│ │ ├── IconTabs.js
│ │ ├── ScrollableTabsButtonAuto.js
│ │ ├── ScrollableTabsButtonForce.js
│ │ ├── ScrollableTabsButtonPrevent.js
│ │ ├── SimpleTabs.js
│ │ ├── TabsWrappedLabel.js
│ │ └── tabs.md
│ ├── text-fields
│ │ ├── ComposedTextField.js
│ │ ├── CustomizedInputs.js
│ │ ├── FormattedInputs.js
│ │ ├── InputAdornments.js
│ │ ├── InputWithIcon.js
│ │ ├── Inputs.js
│ │ ├── TextFieldMargins.js
│ │ ├── TextFields.js
│ │ └── text-fields.md
│ └── tooltips
│ ├── ControlledTooltips.js
│ ├── PositionedTooltips.js
│ ├── SimpleTooltips.js
│ └── tooltips.md
└── mock
├── activity.js
├── calendar.js
├── chart.js
├── chats.js
├── contacts.js
├── dashboard.js
├── feed.js
├── index.js
├── invoice.js
├── messages.js
├── notifications.js
├── pricing.js
├── product.js
├── reviews.js
├── taskboard.js
└── timeline.js
Dashboard routes
Dashboard routes are dynamically defined in /src/routes.js.
For link routes use this format
[{
path: '/widgets',
name: 'Widgets',
type: 'link',
icon: PhotoIcon,
component: Widgets
badge: {
type: 'error',
value: '10'
}
}]
Where:
-
path - path to your route
name - the text appearing in the sidebar
type - nav link type. Can either be a link, submenu or external
icon - icon element displayed in the sidebar
badge - (optional) used to display the badge element. This is an object which takes in value and type with type being either primary, secondary or error
component - the react component to render
For sub menus use this format
[{
path: '/material',
name: 'Material',
type: 'submenu',
icon: EqualizerIcon,
badge: {
type: 'error',
value: '10'
},
children: [{
path: '/appbar',
name: 'App Bar',
component: AppBar
}
}]
}]
Where:
-
path - path to your route
name - the text appearing in the sidebar
type - nav link type. Can either be a link, submenu or external
icon - icon element displayed in the sidebar
badge - (optional) used to display the badge element. This is an object which takes in value and type with type being either primary, secondary or error
Children - an array of submenu objects. The object takes in path, name and component
component - the react component to render
For external routes use this format
[{
path: 'http://reactprimer.nyasha.me/docs',
name: 'Documentation',
type: 'external',
icon: LocalLibraryIcon,
badge: {
type: 'error',
value: '10'
}
}]
Where:
-
path - link to open
name - the text appearing in the sidebar
type - nav link type. Can either be a link, submenu or external
icon - icon element displayed in the sidebar
badge - (optional) used to display the badge element. This is an object which takes in value and type with type being either primary, secondary or error
Helper classes
These are all the available helper classes used in the template
General
.radius-none (no round corners)
.radius-round (border corners based on $border-radius-base)
.radius-circle (circle radius corners)
.overflow-visible
.overflow-hidden
.overflow-auto
.block (display block)
.button-block
.inline-block
.center-block
.relative (position relative)
.fixed
.absolute
.shadow-none
.border-none
.background-none
Spacing
Spacing classes are named using the format: {property}{sides}-{size}
Where property is one of:
Where sides is one of:
t - for classes that set margin-top or padding-top
b - for classes that set margin-bottom or padding-bottom
l - for classes that set margin-left or padding-left
r - for classes that set margin-right or padding-right
x - for classes that set both *-left and *-right
y - for classes that set both *-top and *-bottom
a - for classes that set a margin or padding on all 4 sides of the element
Where size is one of:
0 - for classes that eliminate the margin or padding by setting it to 0
1 - (by default) for classes that set the margin or padding to $spacer-x or $spacer-y
2 - (by default) for classes that set the margin or padding to $spacer-x * 1.5 or $spacer-y * 1.5
3 - (by default) for classes that set the margin or padding to $spacer-x * 3 or $spacer-y * 3