├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── config.yml
│ └── feature_request.yml
└── workflows
│ ├── ci.yml
│ ├── deploy.yml
│ └── publish.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── babel.config.cjs
├── copy-assets.cjs
├── docs
├── color-modes.mdx
├── colors.mdx
├── configuration.mdx
├── elements.mdx
├── elements
│ ├── alert.mdx
│ ├── badge.mdx
│ ├── button.mdx
│ ├── card.mdx
│ ├── checkbox.mdx
│ ├── close.mdx
│ ├── column.mdx
│ ├── container.mdx
│ ├── crumb.mdx
│ ├── dropdown.mdx
│ ├── input.mdx
│ ├── label.mdx
│ ├── menu.mdx
│ ├── modal.mdx
│ ├── navlink.mdx
│ ├── progress.mdx
│ ├── radio.mdx
│ ├── scrim.mdx
│ ├── select.mdx
│ ├── slider.mdx
│ ├── spinner.mdx
│ ├── switch.mdx
│ └── textarea.mdx
├── getting-started.mdx
├── helpers.mdx
├── helpers
│ ├── colors.mdx
│ ├── flexbox.mdx
│ ├── other.mdx
│ ├── sizing.mdx
│ ├── spacing.mdx
│ └── typography.mdx
├── markup.mdx
├── naming.mdx
├── packages
│ ├── cli.mdx
│ ├── colors.mdx
│ ├── core.mdx
│ ├── icons.mdx
│ ├── modules.mdx
│ ├── postcss.mdx
│ ├── presets.mdx
│ └── standalone.mdx
├── presets
│ ├── base.mdx
│ ├── dark.mdx
│ ├── ice.mdx
│ ├── mustard.mdx
│ └── noir.mdx
├── reset.mdx
├── responsive.mdx
├── syntax.mdx
└── theme.mdx
├── examples
├── _template.html
├── features.html
├── footer.html
├── hero.html
├── navbar.html
├── pricing.html
├── sign-in.html
└── tabs.html
├── gulpfile.js
├── header.svg
├── jest.config.cjs
├── package.json
├── packages
├── cli
│ ├── README.md
│ ├── index.js
│ └── package.json
├── colors
│ ├── README.md
│ ├── index.js
│ └── package.json
├── core
│ ├── README.md
│ ├── index.js
│ └── package.json
├── icons
│ ├── README.md
│ ├── index.js
│ └── package.json
├── modules
│ ├── README.md
│ ├── elements.js
│ ├── helpers.js
│ ├── index.js
│ ├── markup.js
│ ├── package.json
│ └── reset.js
├── postcss
│ ├── README.md
│ ├── index.js
│ └── package.json
├── preset-base
│ ├── README.md
│ ├── index.js
│ └── package.json
├── preset-dark
│ ├── README.md
│ ├── index.js
│ └── package.json
├── preset-ice
│ ├── README.md
│ ├── index.js
│ └── package.json
├── preset-mustard
│ ├── README.md
│ ├── index.js
│ └── package.json
├── preset-noir
│ ├── README.md
│ ├── index.js
│ └── package.json
├── presets
│ ├── README.md
│ ├── index.js
│ └── package.json
└── standalone
│ ├── README.md
│ ├── example.html
│ ├── index.js
│ └── package.json
├── playground
├── App.jsx
├── actions
│ ├── playground.js
│ └── worker.js
├── components
│ ├── Brand.jsx
│ ├── Button.jsx
│ ├── Editor.jsx
│ ├── FileTab.jsx
│ ├── Preview.jsx
│ └── ShareModal.jsx
├── defaults.js
├── hooks
│ └── useEditor.js
├── index.html
├── package.json
├── playground.html
├── webpack.config.js
└── worker.js
├── siimple-icons
├── README.md
├── header.png
├── package.json
└── siimple.config.js
├── siimple
├── README.md
├── index.js
├── package.json
├── postcss.cjs
└── siimple.config.js
├── test
├── build.test.js
├── merge.test.js
├── mixins.test.js
├── modules.test.js
└── standalone.test.js
└── website
├── assets
└── styles.css
├── components
├── ColorPalette.jsx
├── Examples.jsx
├── Footer.jsx
├── Header.jsx
├── Icons.jsx
├── Link.jsx
├── LiveCode.jsx
├── ModalExample.jsx
├── Pagination.jsx
├── Preset.jsx
├── Section.jsx
├── Sidebar.jsx
├── Tabs.jsx
└── Welcome.jsx
├── data
├── examples.json
├── features.json
└── testimonials.json
├── gatsby-config.js
├── gatsby-node.js
├── gatsby-ssr.js
├── layouts
├── Docs.jsx
└── Page.jsx
├── package.json
├── pages
├── 404.jsx
├── examples.mdx
├── icons.mdx
└── index.mdx
└── sidebar.js
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: jmjuanes
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: "🐛 Report a bug"
2 | description: "Okay, Houston... I think we've had a problem here..."
3 | title: "Bug: "
4 | labels: ["under-investigation"]
5 | body:
6 | - type: textarea
7 | attributes:
8 | label: "Describe the issue"
9 | description: "Please provide a clear and concise description of the bug or issue."
10 | validations:
11 | required: true
12 |
13 | - type: textarea
14 | attributes:
15 | label: "To reproduce"
16 | description: "Steps to reproduce the issue. If possible, add a link to JSFiddle or similar where we can inspect the issue."
17 | validations:
18 | required: true
19 |
20 | - type: textarea
21 | attributes:
22 | label: "Screenshots"
23 | description: "If applicable, add screenshots to help explain your problem."
24 |
25 | - type: dropdown
26 | attributes:
27 | label: "What browser(s) are you seeing the problem on?"
28 | multiple: true
29 | options:
30 | - Chrome
31 | - Safari
32 | - Firefox
33 | - Microsoft Edge
34 | - Opera
35 |
36 | - type: input
37 | attributes:
38 | label: "What version of **siimple** are you using?"
39 | placeholder: "e.g., v4.0.0"
40 | validations:
41 | required: true
42 |
43 | - type: textarea
44 | attributes:
45 | label: "Additional context"
46 | description: "You can add any other context about the problem here..."
47 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 📚 Documentation
4 | url: https://www.siimple.xyz
5 | about: Check the documentation for usage.
6 | - name: 💬 Ask a Question
7 | url: https://github.com/jmjuanes/siimple/discussions
8 | about: How does X work? I made this! I have an idea...
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.yml:
--------------------------------------------------------------------------------
1 | name: "💡 Request a feature"
2 | description: "Suggest a new idea for siimple"
3 | title: "New feature: "
4 | labels: ["request-feature"]
5 | body:
6 | - type: dropdown
7 | attributes:
8 | label: "Feature type"
9 | options:
10 | - "New preset"
11 | - "New element"
12 | - "New icon"
13 | - "Other..."
14 | validations:
15 | required: true
16 |
17 | - type: textarea
18 | attributes:
19 | label: "Is your feature request related to a problem?"
20 | description: "A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]"
21 |
22 | - type: textarea
23 | attributes:
24 | label: "Describe the solution you'd like"
25 | description: "A clear and concise description of what you want to happen."
26 | validations:
27 | required: true
28 |
29 | - type: textarea
30 | attributes:
31 | label: "Describe alternatives you've considered"
32 | description: "A clear and concise description of any alternative solutions or features you've considered."
33 |
34 | - type: textarea
35 | attributes:
36 | label: "Additional context"
37 | description: "Add any other context or screenshots about the feature request here."
38 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | branches: [main]
6 | pull_request:
7 | branches: [main]
8 | types: [opened, reopened, synchronize]
9 |
10 | jobs:
11 | ci:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v2
15 | - uses: actions/setup-node@v2
16 | with:
17 | node-version: 16
18 | - run: yarn install
19 | - run: yarn run build
20 | - run: yarn run test
21 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: Deploy
2 |
3 | on:
4 | push:
5 | tags: ["*"]
6 | workflow_dispatch:
7 |
8 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
9 | permissions:
10 | contents: read
11 | pages: write
12 | id-token: write
13 |
14 | # Allow one concurrent deployment
15 | concurrency:
16 | group: "deploy"
17 | cancel-in-progress: true
18 |
19 | jobs:
20 | deploy:
21 | if: ${{ github.repository == 'jmjuanes/siimple' }}
22 | environment:
23 | name: github-pages
24 | url: ${{ steps.deployment.outputs.page_url }}
25 | runs-on: ubuntu-latest
26 | steps:
27 | - uses: actions/checkout@v3
28 | - uses: actions/setup-node@v2
29 | with:
30 | node-version: 16
31 | - uses: actions/configure-pages@v1
32 | - run: yarn install
33 | - run: yarn run build
34 | - run: yarn run build:website
35 | - uses: actions/upload-pages-artifact@v1
36 | with:
37 | path: public
38 | - uses: actions/deploy-pages@v1
39 | id: deployment
40 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: Publish packages to NPM
2 |
3 | on:
4 | release:
5 | types: [created]
6 |
7 | jobs:
8 | ## Generate list of monorepo packages to publish
9 | packages:
10 | runs-on: ubuntu-latest
11 | outputs:
12 | names: ${{ steps.folders.outputs.folders }}
13 | steps:
14 | - uses: actions/checkout@v3
15 | - id: folders
16 | run: echo "::set-output name=folders::$(ls -d packages/* | jq -R -s -c 'split("\n")[:-1]')"
17 | ## Publish monorepo packages
18 | publish-packages:
19 | runs-on: ubuntu-20.04
20 | needs: [packages]
21 | strategy:
22 | matrix:
23 | package: ${{ fromJson(needs.packages.outputs.names) }}
24 | steps:
25 | - uses: actions/checkout@v3
26 | - uses: actions/setup-node@v3
27 | with:
28 | node-version: '16.x'
29 | registry-url: 'https://registry.npmjs.org'
30 | - run: cd ${{ matrix.package }} && npm publish --access public
31 | env:
32 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
33 | ## Publish main package
34 | publish-dist:
35 | runs-on: ubuntu-latest
36 | needs: [publish-packages]
37 | steps:
38 | - uses: actions/checkout@v3
39 | - uses: actions/setup-node@v3
40 | with:
41 | node-version: '16.x'
42 | registry-url: 'https://registry.npmjs.org'
43 | - run: yarn install
44 | - run: yarn run build
45 | - run: cd siimple && npm publish
46 | env:
47 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
48 | - run: cd siimple-icons && npm publish
49 | env:
50 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
51 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # General files and folders
2 | .DS_Store
3 | node_modules
4 | *.iml
5 | .idea
6 | *.swp
7 | package-lock.json
8 | yarn.lock
9 | firebase-debug.log
10 | *.tgz
11 | *.tar.gz
12 | *.log
13 | .cache
14 |
15 | # Env files
16 | .env
17 | .env.development
18 | .env.production
19 | .env.test
20 |
21 | # Release folders and files
22 | dist
23 | distributions
24 | release
25 | siimple.css
26 | siimple/*.css
27 | siimple-icons/*.css
28 | siimple-icons/siimple-icons.svg
29 | packages/*/*.css
30 |
31 | # Applications output folders
32 | public
33 |
34 | # Other folders and files
35 | .firebaserc
36 | .firebase
37 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, gender identity and expression, level of experience,
9 | nationality, personal appearance, race, religion, or sexual identity and
10 | orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at [team@siimple.xyz](mailto:team@siimple.xyz). All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at [http://contributor-covenant.org/version/1/4][version]
72 |
73 | [homepage]: http://contributor-covenant.org
74 | [version]: http://contributor-covenant.org/version/1/4/
75 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to siimple
2 |
3 | First, thanks a lot for taking the time to contribute to the **siimple** project! :blush::tada:
4 |
5 | Here you have the guidelines that you must read before start contributing to **siimple**.
6 |
7 | ## Code of Conduct
8 |
9 | You must read and follow the [code of conduct](./CODE_OF_CONDUCT.md) of **siimple**.
10 |
11 | ## Questions or problems
12 |
13 | We are happy to help you if you have any problem or questions using **siimple**. Please, send your problem to our [discussions forum](https://github.com/jmjuanes/siimple/discussions).
14 |
15 | ## How to contribute
16 |
17 | As an open source project, we love to receive contributions from the community.
18 |
19 | ### Improve the documentation
20 |
21 | We maintain a documentation site that is public available at https://www.siimple.xyz. You can help us improving the documentation by:
22 | - Adding missing information.
23 | - Fixing typos.
24 | - Updating them to the latest features of the toolkit.
25 |
26 | Feel free to open a new [documentation issue](https://github.com/jmjuanes/siimple/issues).
27 |
28 | ### Bugs
29 |
30 | If you want to report a bug in **siimple**, please open a new [bug issue here](https://github.com/jmjuanes/siimple/issues) and include as many details as possible with your report. Adding code or screenshots are very helpful.
31 |
32 | Also, you can help us and publish a new [pull request](https://github.com/jmjuanes/siimple/pulls) with the bugfix. Remember that **all pull request must be sent against the `main` branch**.
33 |
34 | ### Request a new feature
35 |
36 | You can request a new feature or suggest an improvement on existing functionalities by submitting a new [feature request issue](https://github.com/jmjuanes/siimple/issues).
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Josemi Juanes
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/babel.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | ["@babel/preset-env", {
4 | targets: {
5 | node: "current",
6 | },
7 | }],
8 | ],
9 | };
10 |
--------------------------------------------------------------------------------
/copy-assets.cjs:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | const publicPath = path.resolve(__dirname, "./public");
5 | const assets = [
6 | {
7 | from: "./website/public/",
8 | to: "./",
9 | },
10 | {
11 | from: "./playground/public/",
12 | to: "./playground/",
13 | },
14 | ];
15 |
16 | // Clean prev public folder
17 | console.log(`Clean public folder '${publicPath}'`);
18 | if (fs.existsSync(publicPath)) {
19 | fs.rmSync(publicPath, {recursive: true});
20 | }
21 | fs.mkdirSync(publicPath);
22 |
23 | // Copy assets
24 | console.log("Copying assets...");
25 | assets.forEach(item => {
26 | const sourcePath = path.resolve(__dirname, item.from);
27 | const destPath = path.resolve(publicPath, item.to);
28 |
29 | console.log(`Copying '${sourcePath}' => '${destPath}'`);
30 | fs.cpSync(sourcePath, destPath, {recursive: true});
31 | });
32 |
--------------------------------------------------------------------------------
/docs/color-modes.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: Color Modes
3 | ---
4 |
5 | # Color Modes
6 |
7 | Color modes makes it easy to change the color mode of your website, including support for **dark and light modes**.
8 |
9 | ## Enable color modes
10 |
11 | To enable color mode you should set the `useColorModes` flag to `true` in your theme configuration:
12 |
13 | ```js title=siimple.config.js
14 | export default {
15 | useColorModes: true,
16 | // ...other configuration
17 | };
18 | ```
19 |
20 | ## Defining colors
21 |
22 | Color modes are configured in the `colorModes` field of your theme configuration. Use the key for the color mode name and a nested object for providing the custom colors for the color mode.
23 |
24 | ```js title=siimple.config.js
25 | import colors from "@siimple/colors";
26 |
27 | export default {
28 | useColorModes: true,
29 | colors: {
30 | text: colors.gray["700"],
31 | background: "#fff",
32 | primary: colors.blue["500"],
33 | // ...other colors
34 | },
35 | colorModes: {
36 | dark: {
37 | text: "#fff",
38 | background: colors.gray["800"],
39 | },
40 | // ...other color modes
41 | },
42 | // ...other configuration
43 | };
44 | ```
45 |
46 | In the previous example, we are defining a new color mode `dark` that will change the `text` and `background` colors when enabled.
47 |
48 | ## Manually enable a color mode
49 |
50 | Add an attribute `data-color-mode` to the `` tag with the color mode to apply. For example, if you define the `dark` color mode in your configuration file, you can enable it adding a `data-color-mode="dark"` in your `` tag:
51 |
52 | ```html
53 |
54 |
55 |
56 | ```
57 |
58 | You can use JavaScript to change the color mode in runtime:
59 |
60 | ```js
61 | const setColorMode = mode => {
62 | document.querySelector("html").dataset.colorMode = mode;
63 | };
64 |
65 | // Change the color mode
66 | setColorMode("dark");
67 | ```
68 |
69 | ## Enable Dark mode automatically
70 |
71 | You can easily enable the dark (or light) color mode automatically based on the user color preference using the `prefers-color-scheme` [media query](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme).
72 |
73 | Note that not all browsers supports the `prefers-color-scheme` media. You can check the browser compatibility there: https://caniuse.com/prefers-color-scheme.
74 |
75 | ### Using the useColorModesMediaQuery flag
76 |
77 | We also provide an additional flag called `useColorModesMediaQuery` to automatically use the `prefers-color-scheme` media query to enable the color mode based on the user configuration.
78 |
79 | Just set to `true` the `useColorModesMediaQuery` in your configuration file (note that the `useColorModes` flag **is also required**):
80 |
81 | ```js title=siimple.config.js
82 | export default {
83 | useColorModes: true, // Required!!!
84 | useColorModesMediaQuery: true,
85 | // Configure your color modes
86 | colorModes: {
87 | dark: {
88 | // ...dark color mode configuration
89 | },
90 | // ...other color modes
91 | },
92 | // ...other configuration
93 | };
94 | ```
95 |
96 | ### Using JavaScript
97 |
98 | You can use the [`matchMedia`](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) function of JavaScript to check if the document matches the `(prefers-color-scheme: dark)` media query and enable the dark color mode based on the user preference.
99 |
100 | There is an example using the `setColorMode` function previously created:
101 |
102 | ```js
103 | // Use matchMedia to check the user preference
104 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
105 |
106 | // Initially enable dark mode
107 | setColorMode(prefersDark.matches ? "dark" : "light");
108 |
109 | // Add event listener to color mode changes
110 | perfersDark.addListener(() => {
111 | setColorMode(prefersDark.matches ? "dark" : "light");
112 | });
113 | ```
114 |
--------------------------------------------------------------------------------
/docs/colors.mdx:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Colors"
3 | ---
4 |
5 | # Colors
6 |
7 | We provide a default color palette that you can use to customize your theme in case that you do not have any brand colors.
8 |
9 |