├── .env ├── src ├── styles │ ├── mantine-styles.css │ ├── index.scss │ └── fonts.css ├── vite-env.d.ts ├── components │ ├── mantine │ │ └── demo │ │ │ ├── DemoRoot │ │ │ ├── index.ts │ │ │ ├── DemoRoot.module.css │ │ │ └── DemoRoot.tsx │ │ │ ├── DemoColumns │ │ │ ├── index.ts │ │ │ ├── DemoColumns.module.css │ │ │ └── DemoColumns.tsx │ │ │ ├── DemoArea │ │ │ ├── index.ts │ │ │ ├── DemoArea.tsx │ │ │ └── DemoArea.module.css │ │ │ ├── DemoCode │ │ │ ├── index.ts │ │ │ ├── DemoCode.module.scss │ │ │ └── DemoCode.tsx │ │ │ ├── ConfiguratorDemo │ │ │ ├── ConfiguratorDemo.module.css │ │ │ ├── controls │ │ │ │ ├── get-control-label.ts │ │ │ │ ├── types.ts │ │ │ │ ├── transform-select-data.ts │ │ │ │ ├── ConfiguratorColor.control.module.css │ │ │ │ ├── ConfiguratorBoolean.control.tsx │ │ │ │ ├── ConfiguratorString.control.tsx │ │ │ │ ├── ConfiguratorNumber.control.tsx │ │ │ │ ├── ConfiguratorSelect.control.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── ConfiguratorSegmented.control.tsx │ │ │ │ ├── ConfiguratorSize.control.tsx │ │ │ │ └── ColorWheelIcon.tsx │ │ │ ├── clear-props.ts │ │ │ ├── get-code-array.ts │ │ │ └── inject-props.tsx │ │ │ ├── index.ts │ │ │ ├── StylesApiDemo │ │ │ └── StylesApiDemo.module.css │ │ │ ├── Demo │ │ │ └── Demo.tsx │ │ │ └── CodeDemo │ │ │ └── CodeDemo.tsx │ ├── ui │ │ ├── color-scheme-switch │ │ │ ├── index.ts │ │ │ ├── color-scheme-switch.module.css │ │ │ └── color-scheme-switch.tsx │ │ ├── navbar │ │ │ ├── navbar.tsx │ │ │ ├── navbar.module.scss │ │ │ └── navbar-links-group.tsx │ │ ├── chart-tooltip.tsx │ │ └── header │ │ │ └── header.module.scss │ ├── custom │ │ ├── components-demo │ │ │ ├── components-demo.module.css │ │ │ ├── charts │ │ │ │ ├── data │ │ │ │ │ ├── _pie-data.ts │ │ │ │ │ ├── _donut-data.ts │ │ │ │ │ ├── _bubble-data.ts │ │ │ │ │ └── _radar-data.ts │ │ │ │ ├── bubble-chart-demo.tsx │ │ │ │ ├── scatter-chart-demo.tsx │ │ │ │ ├── radar-chart-demo.tsx │ │ │ │ ├── donot-chart-demo.tsx │ │ │ │ ├── sparkline-demo.tsx │ │ │ │ ├── pie-chart-demo.tsx │ │ │ │ └── bar-chart-demo.tsx │ │ │ ├── overlays │ │ │ │ ├── tooltip-demo.tsx │ │ │ │ ├── popover-demo.tsx │ │ │ │ ├── modal-demo.tsx │ │ │ │ ├── drawer-demo.tsx │ │ │ │ ├── hover-card-demo.tsx │ │ │ │ ├── loading-overlay-demo.tsx │ │ │ │ ├── overlay-demo.tsx │ │ │ │ └── dialog-demo.tsx │ │ │ ├── data-display │ │ │ │ ├── image-demo.tsx │ │ │ │ ├── avatar-demo.tsx │ │ │ │ ├── color-swatch-demo.tsx │ │ │ │ ├── badge-demo.tsx │ │ │ │ ├── theme-icon-demo.tsx │ │ │ │ ├── background-image-demo.tsx │ │ │ │ ├── spoiler-demo.tsx │ │ │ │ ├── card-demo.tsx │ │ │ │ └── indicator-demo.tsx │ │ │ ├── inputs │ │ │ │ ├── native-select-demo.tsx │ │ │ │ ├── file-input.tsx │ │ │ │ ├── textarea-demo.tsx │ │ │ │ ├── color-input-demo.tsx │ │ │ │ ├── text-input-demo.tsx │ │ │ │ ├── rating-demo.tsx │ │ │ │ ├── pin-input-demo.tsx │ │ │ │ ├── chip-demo.tsx │ │ │ │ ├── fieldset-demo.tsx │ │ │ │ ├── switch-demo.tsx │ │ │ │ ├── slider-demo.tsx │ │ │ │ ├── segmented-control-demo.tsx │ │ │ │ ├── switch-group-demo.tsx │ │ │ │ ├── radio-group-demo.tsx │ │ │ │ ├── radio-demo.tsx │ │ │ │ ├── checkbox-group-demo.tsx │ │ │ │ └── checkbox-demo.tsx │ │ │ ├── miscellaneous │ │ │ │ ├── date-picker-input-demo.tsx │ │ │ │ └── paper-demo.tsx │ │ │ ├── feedback │ │ │ │ ├── loader-demo.tsx │ │ │ │ ├── progress-demo.tsx │ │ │ │ ├── skeleton-demo.tsx │ │ │ │ ├── notification-demo.tsx │ │ │ │ ├── alert-demo.tsx │ │ │ │ ├── semi-circle-progress-demo.tsx │ │ │ │ └── ring-progress-demo.tsx │ │ │ ├── typography │ │ │ │ ├── mark-demo.tsx │ │ │ │ ├── code-demo.tsx │ │ │ │ ├── highlight-demo.tsx │ │ │ │ ├── title-demo.tsx │ │ │ │ ├── blockquote-demo.tsx │ │ │ │ ├── list-demo.tsx │ │ │ │ ├── text-demo.tsx │ │ │ │ └── table-demo.tsx │ │ │ ├── buttons │ │ │ │ ├── close-button-demo.tsx │ │ │ │ ├── button-demo.tsx │ │ │ │ └── action-icon-demo.tsx │ │ │ ├── combobox │ │ │ │ ├── select-demo.tsx │ │ │ │ ├── multi-select-demo.tsx │ │ │ │ ├── autocomplete-demo.tsx │ │ │ │ ├── tags-input-demo.tsx │ │ │ │ └── pills-input-demo.tsx │ │ │ ├── navigation │ │ │ │ ├── pagination-demo.tsx │ │ │ │ ├── anchor-demo.tsx │ │ │ │ └── stepper-demo.tsx │ │ │ └── components-demo.tsx │ │ ├── testimonial │ │ │ ├── testimonial-grid.tsx │ │ │ └── testimonial-item.tsx │ │ ├── theme-example-cards │ │ │ ├── calendar.tsx │ │ │ ├── create-account.tsx │ │ │ ├── metric.tsx │ │ │ ├── mantine-cards.tsx │ │ │ ├── cookie-settings.tsx │ │ │ └── report-issue.tsx │ │ ├── change-theme-section │ │ │ └── change-theme-section.tsx │ │ └── blocks │ │ │ └── coming-soon │ │ │ └── coming-soon.module.css │ ├── MicrosoftClarity.tsx │ └── GoogleAnalytics.tsx ├── themes │ ├── generated │ │ └── generatedMantineCssStyles.ts │ └── mantine │ │ ├── mantine-css-variable-resolver.ts │ │ └── mantine-theme.ts ├── assets │ └── fonts │ │ ├── Geist-Black.woff2 │ │ ├── Geist-Bold.woff2 │ │ ├── Geist-Light.woff2 │ │ ├── Geist-Thin.woff2 │ │ ├── Geist[wght].woff2 │ │ ├── Geist-Medium.woff2 │ │ ├── Geist-Regular.woff2 │ │ ├── Geist-SemiBold.woff2 │ │ ├── Geist-ExtraBold.woff2 │ │ └── Geist-ExtraLight.woff2 ├── feature │ └── blocks │ │ ├── lib │ │ ├── hero1 │ │ │ ├── attributes.json │ │ │ └── hero1.module.css │ │ ├── feature1 │ │ │ ├── attributes.json │ │ │ └── feature1.module.css │ │ ├── pricing1 │ │ │ ├── attributes.json │ │ │ └── pricing1.module.css │ │ ├── coming-soon │ │ │ ├── attributes.json │ │ │ ├── coming-soon.module.css │ │ │ └── coming-soon.tsx │ │ ├── meet-our-team-1 │ │ │ ├── attributes.json │ │ │ └── meet-our-team-1.module.css │ │ └── index.ts │ │ ├── components │ │ ├── shell │ │ │ ├── shell.module.css │ │ │ └── shell.tsx │ │ ├── block-components │ │ │ └── block-components.tsx │ │ ├── component-preview │ │ │ └── component-preview.tsx │ │ └── component-canvas │ │ │ ├── color-control.tsx │ │ │ ├── component-canvas.module.css │ │ │ └── component-canvas.tsx │ │ └── data │ │ └── types.ts ├── app │ ├── loading.tsx │ ├── playground │ │ └── page.tsx │ ├── blocks │ │ └── page.tsx │ ├── page.tsx │ ├── how-to-use │ │ └── page.tsx │ ├── sitemap.ts │ ├── feedback │ │ └── page.tsx │ └── about │ │ └── page.tsx ├── utils │ ├── cssTemplate.ts │ ├── variants-data.ts │ ├── themeTemplate.ts │ └── input-controls.ts └── _mantine.scss ├── public ├── _redirects ├── robots.txt └── favicon.svg ├── tsconfig.node.tsbuildinfo ├── .prettierrc ├── next-env.d.ts ├── tailwind.config.js ├── .gitignore ├── postcss.config.js ├── next.config.js ├── tsconfig.app.json ├── eslint.config.js ├── js └── scripts │ ├── generateStyles.cjs │ └── compileTS.cjs ├── LICENSE ├── favicon.svg ├── tsconfig.json ├── _mantine.scss └── package.json /.env: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_BASE_PATH="" -------------------------------------------------------------------------------- /src/styles/mantine-styles.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.node.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./vite.config.ts"],"version":"5.6.3"} -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoRoot/index.ts: -------------------------------------------------------------------------------- 1 | export { DemoRoot } from './DemoRoot'; 2 | -------------------------------------------------------------------------------- /src/components/ui/color-scheme-switch/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./color-scheme-switch"; 2 | -------------------------------------------------------------------------------- /src/themes/generated/generatedMantineCssStyles.ts: -------------------------------------------------------------------------------- 1 | export const generatedMantineCssStyles = ``; -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoColumns/index.ts: -------------------------------------------------------------------------------- 1 | export { DemoColumns } from './DemoColumns'; 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": false, 4 | "trailingComma": "es5", 5 | "printWidth": 120 6 | } 7 | -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoArea/index.ts: -------------------------------------------------------------------------------- 1 | export { DemoArea } from './DemoArea'; 2 | export type { DemoAreaProps } from './DemoArea'; 3 | -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoCode/index.ts: -------------------------------------------------------------------------------- 1 | export { DemoCode } from './DemoCode'; 2 | export type { DemoCodeProps } from './DemoCode'; 3 | -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Black.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Bold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Light.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Thin.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist[wght].woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist[wght].woff2 -------------------------------------------------------------------------------- /src/components/mantine/demo/ConfiguratorDemo/ConfiguratorDemo.module.css: -------------------------------------------------------------------------------- 1 | .controls { 2 | padding: calc(var(--mantine-spacing-md) - 4px); 3 | } 4 | -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Medium.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-Regular.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-SemiBold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-ExtraBold.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Geist-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RubixCube-Innovations/mantine-theme-builder/HEAD/src/assets/fonts/Geist-ExtraLight.woff2 -------------------------------------------------------------------------------- /src/components/custom/components-demo/components-demo.module.css: -------------------------------------------------------------------------------- 1 | .navbarWrapper{ 2 | position: sticky; 3 | top: 80px; 4 | z-index: 1; 5 | } 6 | 7 | .content { 8 | flex: 1; 9 | } -------------------------------------------------------------------------------- /src/feature/blocks/lib/hero1/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "hero1", 3 | "category": "hero", 4 | "canvas": { 5 | "center": true, 6 | "maxWidth": 1200 7 | }, 8 | "order": 1 9 | } 10 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/feature1/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "feature1", 3 | "category": "feature", 4 | "canvas": { 5 | "center": true, 6 | "maxWidth": 1200 7 | }, 8 | "order": 2 9 | } 10 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/pricing1/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "pricing1", 3 | "category": "pricing", 4 | "canvas": { 5 | "center": true, 6 | "maxWidth": 1200 7 | }, 8 | "order": 3 9 | } 10 | -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoRoot/DemoRoot.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | border: 1px solid var(--demo-border); 3 | border-radius: var(--mantine-radius-md); 4 | --demo-border: var(--mantine-color-default-border); 5 | } 6 | -------------------------------------------------------------------------------- /src/components/mantine/demo/index.ts: -------------------------------------------------------------------------------- 1 | export { Demo } from './Demo/Demo'; 2 | export type { MantineDemo } from './Demo/Demo'; 3 | export type { ConfiguratorControlOptions } from './ConfiguratorDemo/ConfiguratorDemo'; 4 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/coming-soon/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "coming-soon", 3 | "category": "coming-soon", 4 | "canvas": { 5 | "center": true, 6 | "maxWidth": 1200 7 | }, 8 | "order": 5 9 | } 10 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/meet-our-team-1/attributes.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "meet-our-team-1", 3 | "category": "team", 4 | "canvas": { 5 | "center": true, 6 | "maxWidth": 1200 7 | }, 8 | "order": 4 9 | } 10 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. 6 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["./src/**/*.{js,ts,jsx,tsx}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | corePlugins: { preflight: false, }, 8 | plugins: [], 9 | }; 10 | -------------------------------------------------------------------------------- /src/app/loading.tsx: -------------------------------------------------------------------------------- 1 | import { Center, Loader } from "@mantine/core"; 2 | 3 | export default function Loading() { 4 | return ( 5 |
6 | 7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # Allow all crawlers 2 | User-agent: * 3 | Allow: / 4 | 5 | # Sitemap location 6 | Sitemap: https://mantinehub.com/sitemap.xml 7 | 8 | # Disallow admin and private routes 9 | Disallow: /api/ 10 | Disallow: /_next/ 11 | Disallow: /static/ -------------------------------------------------------------------------------- /src/feature/blocks/components/shell/shell.module.css: -------------------------------------------------------------------------------- 1 | .inner { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | height: 100%; 6 | } 7 | 8 | .main { 9 | padding-bottom: rem(120px); 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/cssTemplate.ts: -------------------------------------------------------------------------------- 1 | export const generateCSSTemplate = () => { 2 | return ` 3 | 4 | .globalMantineInput { 5 | &:focus-within { 6 | outline: rem(1px) solid var(--mantine-primary-color-filled) ; 7 | } 8 | } 9 | 10 | `; 11 | }; 12 | -------------------------------------------------------------------------------- /src/components/mantine/demo/ConfiguratorDemo/controls/get-control-label.ts: -------------------------------------------------------------------------------- 1 | import { upperFirst } from '@mantine/hooks'; 2 | 3 | export function getControlLabel(label: string) { 4 | return upperFirst(label.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase()); 5 | } 6 | -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoRoot/DemoRoot.tsx: -------------------------------------------------------------------------------- 1 | import cx from "clsx"; 2 | import classes from "./DemoRoot.module.css"; 3 | 4 | export function DemoRoot({ className, ...others }: React.ComponentPropsWithoutRef<"div">) { 5 | return
; 6 | } 7 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { Hero1 } from "./hero1/hero1"; 2 | export { Feature1 } from "./feature1/feature1"; 3 | export { Pricing1 } from "./pricing1/pricing1"; 4 | export { ComingSoon } from "./coming-soon/coming-soon"; 5 | export { MeetOurTeam1 } from "./meet-our-team-1/meet-our-team-1"; 6 | -------------------------------------------------------------------------------- /src/components/mantine/demo/DemoCode/DemoCode.module.scss: -------------------------------------------------------------------------------- 1 | .code { 2 | border-bottom-right-radius: var(--mantine-radius-md); 3 | border-bottom-left-radius: var(--mantine-radius-md); 4 | overflow: hidden; 5 | border-top: 1px solid var(--demo-border); 6 | 7 | @mixin mobile { 8 | max-width: calc(100vw - 32px); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/coming-soon/coming-soon.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | padding: 4rem 1rem; 3 | } 4 | 5 | .title { 6 | background-image: linear-gradient(to right, #eea2a2 0%, #bbc1bf 19%, #57c6e1 42%, #b49fda 79%, #7ac5d8 100%); 7 | background-clip: text; 8 | -webkit-background-clip: text; 9 | -webkit-text-fill-color: transparent; 10 | } 11 | -------------------------------------------------------------------------------- /src/components/mantine/demo/ConfiguratorDemo/controls/types.ts: -------------------------------------------------------------------------------- 1 | export type ConfiguratorControl> = { 2 | type: Type; 3 | prop: string; 4 | libraryValue?: any; 5 | initialValue?: any; 6 | transformLabel?: boolean; 7 | } & Params; 8 | 9 | export type ShikiLanguage = "tsx" | "scss" | "html" | "bash" | "json"; 10 | -------------------------------------------------------------------------------- /src/components/ui/color-scheme-switch/color-scheme-switch.module.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | width: 18x; 3 | height: 18x; 4 | } 5 | 6 | .dark { 7 | @mixin dark { 8 | display: none; 9 | } 10 | 11 | @mixin light { 12 | display: block; 13 | } 14 | } 15 | 16 | .light { 17 | @mixin light { 18 | display: none; 19 | } 20 | 21 | @mixin dark { 22 | display: block; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | .next 16 | next-env.d.ts 17 | dist 18 | 19 | # Editor directories and files 20 | .vscode/* 21 | !.vscode/extensions.json 22 | .idea 23 | .DS_Store 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /src/feature/blocks/lib/hero1/hero1.module.css: -------------------------------------------------------------------------------- 1 | .title { 2 | font-size: clamp(2.5rem, 5vw, 4rem); 3 | line-height: 1; 4 | background: linear-gradient(80deg, var(--mantine-primary-color-filled), var(--mantine-primary-color-8)); 5 | 6 | -webkit-background-clip: text; 7 | -webkit-text-fill-color: transparent; 8 | } 9 | 10 | .themeIconBackground { 11 | background: rgba(var(--mantine-primary-color-filled), 0.07); 12 | } 13 | -------------------------------------------------------------------------------- /src/themes/mantine/mantine-css-variable-resolver.ts: -------------------------------------------------------------------------------- 1 | import { CSSVariablesResolver } from "@mantine/core"; 2 | 3 | export const mantineCssVariableResolver: CSSVariablesResolver = () => ({ 4 | variables: { 5 | // variables that do not depend on color scheme 6 | }, 7 | light: { 8 | // variables for light color scheme only 9 | }, 10 | dark: { 11 | // variables for dark color scheme only 12 | }, 13 | }); -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | "postcss-preset-mantine": {}, 6 | "postcss-simple-vars": { 7 | variables: { 8 | "mantine-breakpoint-xs": "36em", 9 | "mantine-breakpoint-sm": "48em", 10 | "mantine-breakpoint-md": "62em", 11 | "mantine-breakpoint-lg": "75em", 12 | "mantine-breakpoint-xl": "88em", 13 | }, 14 | }, 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /src/components/mantine/demo/StylesApiDemo/StylesApiDemo.module.css: -------------------------------------------------------------------------------- 1 | .selector { 2 | display: block; 3 | width: 100%; 4 | font-size: var(--mantine-font-size-sm); 5 | padding: 6px var(--mantine-spacing-sm); 6 | border-radius: var(--mantine-radius-sm); 7 | cursor: help; 8 | 9 | @mixin hover { 10 | @mixin light { 11 | background-color: var(--mantine-color-gray-0); 12 | } 13 | 14 | @mixin dark { 15 | background-color: var(--mantine-color-dark-6); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/playground/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import ComponentsDemo from "@/components/custom/components-demo/components-demo"; 4 | import PageLayout from "@/components/layouts/page-layout"; 5 | 6 | export default function Page() { 7 | return ( 8 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/app/blocks/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import PageLayout from "@/components/layouts/page-layout"; 3 | import BlockComponents from "@/feature/blocks/components/block-components/block-components"; 4 | 5 | export default function Page() { 6 | return ( 7 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/components/custom/testimonial/testimonial-grid.tsx: -------------------------------------------------------------------------------- 1 | import { SimpleGrid } from "@mantine/core"; 2 | import { ITestimonialItem, TestimonialItem } from "./testimonial-item"; 3 | 4 | export const TestimonialGrid = ({ testimonialItems }: { testimonialItems: Array }) => { 5 | return ( 6 | 10 | {testimonialItems.map((testimonial, index) => ( 11 | 12 | ))} 13 | 14 | ); 15 | }; -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | import path from "node:path"; 3 | 4 | const nextConfig = { 5 | output: "export", // Outputs a Single-Page Application (SPA). 6 | distDir: "./dist", // Changes the build output directory to `./dist/`. 7 | basePath: process.env.NEXT_PUBLIC_BASE_PATH, // Sets the base path to `/some-base-path`. 8 | sassOptions: { 9 | implementation: "sass-embedded", 10 | additionalData: `@use "${path.join(process.cwd(), "_mantine").replace(/\\/g, "/")}" as mantine;`, 11 | }, 12 | }; 13 | 14 | export default nextConfig; 15 | -------------------------------------------------------------------------------- /src/components/mantine/demo/ConfiguratorDemo/controls/transform-select-data.ts: -------------------------------------------------------------------------------- 1 | import { upperFirst } from '@mantine/hooks'; 2 | 3 | interface SelectDataItem { 4 | label: string; 5 | value: string; 6 | } 7 | 8 | export type SelectData = (string | SelectDataItem)[]; 9 | 10 | export function transformSelectData(data: SelectData): SelectDataItem[] { 11 | return data.map((item) => { 12 | if (typeof item === 'string') { 13 | return { label: upperFirst(item), value: item }; 14 | } 15 | 16 | return { value: item.value, label: upperFirst(item.label) }; 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/charts/data/_pie-data.ts: -------------------------------------------------------------------------------- 1 | export const data = [ 2 | { name: 'USA', value: 400, color: 'indigo.6' }, 3 | { name: 'India', value: 300, color: 'yellow.6' }, 4 | { name: 'Japan', value: 300, color: 'teal.6' }, 5 | { name: 'Other', value: 200, color: 'gray.6' }, 6 | ]; 7 | 8 | export const dataCode = ` 9 | export const data = [ 10 | { name: 'USA', value: 400, color: 'indigo.6' }, 11 | { name: 'India', value: 300, color: 'yellow.6' }, 12 | { name: 'Japan', value: 300, color: 'teal.6' }, 13 | { name: 'Other', value: 200, color: 'gray.6' }, 14 | ]; 15 | `; 16 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/charts/data/_donut-data.ts: -------------------------------------------------------------------------------- 1 | export const data = [ 2 | { name: 'USA', value: 400, color: 'indigo.6' }, 3 | { name: 'India', value: 300, color: 'yellow.6' }, 4 | { name: 'Japan', value: 100, color: 'teal.6' }, 5 | { name: 'Other', value: 200, color: 'gray.6' }, 6 | ]; 7 | 8 | export const dataCode = ` 9 | export const data = [ 10 | { name: 'USA', value: 400, color: 'indigo.6' }, 11 | { name: 'India', value: 300, color: 'yellow.6' }, 12 | { name: 'Japan', value: 100, color: 'teal.6' }, 13 | { name: 'Other', value: 200, color: 'gray.6' }, 14 | ]; 15 | `; 16 | -------------------------------------------------------------------------------- /src/components/MicrosoftClarity.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import Script from 'next/script'; 4 | 5 | export default function MicrosoftClarity() { 6 | return ( 7 | 16 | ); 17 | } -------------------------------------------------------------------------------- /src/components/mantine/demo/ConfiguratorDemo/clear-props.ts: -------------------------------------------------------------------------------- 1 | import type { ConfiguratorControlOptions } from './ConfiguratorDemo'; 2 | 3 | type Values = Record; 4 | 5 | export function clearProps(controls: ConfiguratorControlOptions[], state: Values) { 6 | const normalizedControls = controls.reduce((acc, control) => { 7 | acc[control.prop] = control.libraryValue; 8 | return acc; 9 | }, {}); 10 | 11 | return Object.keys(state).reduce((acc, key) => { 12 | if (state[key] !== normalizedControls[key]) { 13 | acc[key] = state[key]; 14 | } 15 | return acc; 16 | }, {}); 17 | } 18 | -------------------------------------------------------------------------------- /src/feature/blocks/components/block-components/block-components.tsx: -------------------------------------------------------------------------------- 1 | import { Container } from "@mantine/core"; 2 | import { ComponentCanvas } from "../component-canvas/component-canvas"; 3 | import { components } from "../../data/components"; 4 | 5 | const BlockComponents = () => { 6 | const canvases = components.map((component, index) => ( 7 | 8 | )); 9 | 10 | return ( 11 | 12 | {canvases} 13 | 14 | ); 15 | }; 16 | 17 | export default BlockComponents; 18 | -------------------------------------------------------------------------------- /src/components/GoogleAnalytics.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import Script from 'next/script'; 4 | 5 | export default function GoogleAnalytics() { 6 | return ( 7 | <> 8 | 20 | 21 | ); 22 | } -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "exclude": ["js"] 25 | } 26 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/overlays/tooltip-demo.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Tooltip } from '@mantine/core'; 2 | import { MantineDemo } from '../../../mantine/demo'; 3 | 4 | const code = ` 5 | import { Tooltip, Button } from '@mantine/core'; 6 | 7 | function Demo() { 8 | return ( 9 | 10 | 11 | 12 | ); 13 | } 14 | `; 15 | 16 | function Demo() { 17 | return ( 18 | 19 | 20 | 21 | ); 22 | } 23 | 24 | export const tooltipDemo: MantineDemo = { 25 | type: 'code', 26 | component: Demo, 27 | centered: true, 28 | code, 29 | }; 30 | -------------------------------------------------------------------------------- /src/app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import MantineCards from "@/components/custom/theme-example-cards/mantine-cards"; 4 | import PageLayout from "@/components/layouts/page-layout"; 5 | import { Anchor } from "@mantine/core"; 6 | 7 | export default function Page() { 8 | return ( 9 | 13 | Save time on styling with our ready-to-use themes for{" "} 14 | 15 | Mantine 16 | {" "} 17 | components. Just copy, paste, and watch your app come to life. 18 | 19 | } 20 | > 21 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/data-display/image-demo.tsx: -------------------------------------------------------------------------------- 1 | import { Image } from '@mantine/core'; 2 | import { MantineDemo } from '../../../mantine/demo'; 3 | 4 | const code = ` 5 | import { Image } from '@mantine/core'; 6 | 7 | function Demo() { 8 | return ( 9 | 13 | ); 14 | } 15 | `; 16 | 17 | function Demo() { 18 | return ( 19 | 23 | ); 24 | } 25 | 26 | export const imageDemo: MantineDemo = { 27 | type: 'code', 28 | component: Demo, 29 | code, 30 | }; 31 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/inputs/native-select-demo.tsx: -------------------------------------------------------------------------------- 1 | import { NativeSelect } from "@mantine/core"; 2 | import { MantineDemo } from "../../../mantine/demo"; 3 | import { inputControls } from "../../../../utils/input-controls"; 4 | 5 | const code = ` 6 | import { NativeSelect } from '@mantine/core'; 7 | 8 | function Demo() { 9 | return ; 10 | } 11 | `; 12 | 13 | function Wrapper(props: any) { 14 | return ; 15 | } 16 | 17 | export const nativeSelectDemo: MantineDemo = { 18 | type: "configurator", 19 | component: Wrapper, 20 | code, 21 | centered: true, 22 | maxWidth: 340, 23 | controls: inputControls, 24 | }; 25 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/inputs/file-input.tsx: -------------------------------------------------------------------------------- 1 | import { FileInput } from "@mantine/core"; 2 | import { MantineDemo } from "../../../mantine/demo"; 3 | import { inputControls } from "../../../../utils/input-controls"; 4 | 5 | const code = ` 6 | import { FileInput } from '@mantine/core'; 7 | 8 | 9 | function Demo() { 10 | return ( 11 | 15 | ); 16 | } 17 | `; 18 | 19 | function Wrapper(props: any) { 20 | return ; 21 | } 22 | 23 | export const fileInputDemo: MantineDemo = { 24 | type: "configurator", 25 | component: Wrapper, 26 | code, 27 | centered: true, 28 | maxWidth: 340, 29 | controls: inputControls, 30 | }; 31 | -------------------------------------------------------------------------------- /src/components/custom/components-demo/inputs/textarea-demo.tsx: -------------------------------------------------------------------------------- 1 | import { Textarea } from '@mantine/core'; 2 | import { MantineDemo } from '../../../mantine/demo'; 3 | import { inputControls } from '../../../../utils/input-controls'; 4 | 5 | const code = ` 6 | import { Textarea } from '@mantine/core'; 7 | 8 | 9 | function Demo() { 10 | return ( 11 |