├── .nvmrc ├── netlify.toml ├── .env-example ├── public └── images │ ├── main-hero.jpg │ ├── placeholder-video.mp4 │ ├── img-placeholder-dark.png │ ├── person-placeholder-light.png │ ├── favicon.svg │ ├── icon1.svg │ ├── icon2.svg │ ├── logo-white.svg │ ├── logo-dark.svg │ ├── hero.svg │ ├── img-placeholder.svg │ ├── icon3.svg │ └── abstract-feature3.svg ├── src ├── components │ ├── layouts │ │ ├── PostFeedCategoryLayout │ │ │ └── index.tsx │ │ ├── index.ts │ │ ├── BlankBaseLayout │ │ │ └── index.tsx │ │ ├── DefaultBaseLayout │ │ │ └── index.tsx │ │ └── PageLayout │ │ │ └── index.tsx │ ├── sections │ │ ├── RecentPostsSection │ │ │ └── index.tsx │ │ ├── FeaturedPostsSection │ │ │ └── index.tsx │ │ ├── DividerSection │ │ │ └── index.tsx │ │ └── Section │ │ │ └── index.tsx │ ├── atoms │ │ ├── index.ts │ │ ├── Link │ │ │ └── index.tsx │ │ ├── BackgroundImage │ │ │ └── index.tsx │ │ ├── Badge │ │ │ └── index.tsx │ │ ├── Social │ │ │ └── index.tsx │ │ └── Action │ │ │ └── index.tsx │ ├── svgs │ │ ├── play.tsx │ │ ├── chevron-up.tsx │ │ ├── chevron-down.tsx │ │ ├── chevron-left.tsx │ │ ├── plus.tsx │ │ ├── chevron-right.tsx │ │ ├── chevron-big-left.tsx │ │ ├── chevron-big-right.tsx │ │ ├── menu.tsx │ │ ├── arrow-down.tsx │ │ ├── arrow-left.tsx │ │ ├── arrow-right.tsx │ │ ├── arrow-up.tsx │ │ ├── send.tsx │ │ ├── close.tsx │ │ ├── shopping-bag.tsx │ │ ├── facebook.tsx │ │ ├── mail.tsx │ │ ├── youtube.tsx │ │ ├── linkedin.tsx │ │ ├── vimeo.tsx │ │ ├── github.tsx │ │ ├── twitter.tsx │ │ ├── index.tsx │ │ ├── reddit.tsx │ │ └── instagram.tsx │ └── blocks │ │ ├── TitleBlock │ │ └── index.tsx │ │ ├── FormBlock │ │ ├── TextFormControl │ │ │ └── index.tsx │ │ ├── EmailFormControl │ │ │ └── index.tsx │ │ ├── TextareaFormControl │ │ │ └── index.tsx │ │ └── SubmitButtonFormControl │ │ │ └── index.tsx │ │ ├── ImageBlock │ │ └── index.tsx │ │ └── SearchBlock │ │ ├── BaseAutoComplete.jsx │ │ └── AutoCompletePosts.jsx ├── pages │ ├── _app.js │ ├── api │ │ └── reindex.js │ └── [[...slug]].js └── utils │ ├── get-data-attrs.ts │ ├── indexer │ ├── consts.js │ └── markdown-plaintext.js │ ├── base-layout.ts │ ├── page-utils.js │ └── static-paths-resolvers.js ├── .vscode ├── extensions.json ├── settings.json └── launch.json ├── sources └── local │ ├── presets │ ├── images │ │ ├── link-play-6021.png │ │ ├── link-send-5cc9.png │ │ ├── footer-footer-80a8.png │ │ ├── header-header-07de.png │ │ ├── sub-nav-subnav-b29b.png │ │ ├── link-github-icon-3beb.png │ │ ├── link-github-link-f4df.png │ │ ├── link-primary-link-312d.png │ │ ├── link-primary-link-bccf.png │ │ ├── link-reddit-icon-ac51.png │ │ ├── link-reddit-link-e762.png │ │ ├── link-send-email-7dad.png │ │ ├── link-shopping-bag-f246.png │ │ ├── link-twitter-icon-23d8.png │ │ ├── link-twitter-link-3f75.png │ │ ├── link-vimeo-icon-4d05.png │ │ ├── link-vimeo-link-4487.png │ │ ├── link-youtube-icon-f909.png │ │ ├── link-youtube-link-dbc6.png │ │ ├── social-email-icon-0bae.png │ │ ├── social-vimeo-icon-93e4.png │ │ ├── link-facebook-icon-e829.png │ │ ├── link-facebook-link-4bf1.png │ │ ├── link-instagram-icon-a925.png │ │ ├── link-instagram-link-0bf0.png │ │ ├── link-linkedin-icon-2f83.png │ │ ├── link-linkedin-link-427f.png │ │ ├── link-secondary-link-0c1a.png │ │ ├── page-layout-careers-c1de.png │ │ ├── page-layout-pricing-91fd.png │ │ ├── social-github-icon-c23d.png │ │ ├── social-reddit-icon-8f9e.png │ │ ├── social-twitter-icon-5eae.png │ │ ├── social-youtube-icon-54b0.png │ │ ├── button-primary-button-2306.png │ │ ├── form-block-form-block-a081.png │ │ ├── page-layout-empty-page-d243.png │ │ ├── page-layout-main-page-fc14.png │ │ ├── person-person-no-bio-201b.png │ │ ├── person-person-with-bio-2ee3.png │ │ ├── social-facebook-icon-97c5.png │ │ ├── social-instagram-icon-9544.png │ │ ├── social-linkedin-icon-10b3.png │ │ ├── button-secondary-button-92b1.png │ │ ├── image-block-image-block-ffa9.png │ │ ├── pricing-section-pricing-08b5.png │ │ ├── featured-item-product-card-0233.png │ │ ├── footer-links-group-company-ca84.png │ │ ├── footer-links-group-product-df98.png │ │ ├── image-gallery-section-logos-d84a.png │ │ ├── post-layout-post-with-cta-050e.png │ │ ├── pricing-plan-pricing-plan-d01c.png │ │ ├── video-block-default-video-a440.png │ │ ├── divider-section-large-padding-bfd8.png │ │ ├── divider-section-small-padding-2a1b.png │ │ ├── featured-item-expandable-item-c432.png │ │ ├── generic-section-form-sedtion-e54c.png │ │ ├── divider-section-medium-padding-208f.png │ │ ├── featured-item-card-image-on-top-578a.png │ │ ├── featured-item-card-small-image-488e.png │ │ ├── featured-item-card-image-on-bottom-68d5.png │ │ ├── post-layout-post-with-recent-posts-dd5d.png │ │ ├── email-form-control-email-form-field-7835.png │ │ ├── featured-item-feature-carousel-item-8cb4.png │ │ ├── featured-items-section-features-grid-bf42.png │ │ ├── text-form-control-text-form-control-1f37.png │ │ ├── carousel-section-feature-carousel-tabs-ec48.png │ │ ├── featured-item-card-horizontal-for-2-col-66fc.png │ │ ├── featured-item-testimonial-carousel-item-d425.png │ │ ├── featured-people-section-featured-people-d4f4.png │ │ ├── paged-posts-section-post-feed-vertical-a49b.png │ │ ├── recent-posts-section-recent-posts-grid-71ec.png │ │ ├── select-form-control-select-from-control-c9d6.png │ │ ├── featured-items-section-featured-products-5266.png │ │ ├── featured-posts-section-featured-posts-grid-1bc9.png │ │ ├── generic-section-feature-section-image-left-80ff.png │ │ ├── generic-section-generic-section-with-video-a138.png │ │ ├── submit-button-form-control-submit-for-form-2846.png │ │ ├── carousel-section-testimonial-carousel-arrows-e90d.png │ │ ├── checkbox-form-control-checkbox-form-control-2967.png │ │ ├── featured-items-section-featured-items-2-col-6973.png │ │ ├── generic-section-feature-section-image-right-8358.png │ │ ├── textarea-form-control-textarea-form-control-73ab.png │ │ ├── featured-posts-section-featured-posts-big-list-58e6.png │ │ ├── paged-posts-section-page-post-feed-with-search-f8dd.png │ │ ├── featured-items-section-featured-items-small-image-1c22.png │ │ ├── featured-items-section-product-list-with-featured-5cc6.png │ │ ├── featured-people-section-featured-people-grid-alt-9025.png │ │ ├── featured-posts-section-featured-posts-small-list-015d.png │ │ ├── submit-button-form-control-submit-form-with-icon-4479.png │ │ ├── featured-posts-section-featured-posts-with-featured-a400.png │ │ └── featured-items-section-featured-items-expandable-list-73c6.png │ ├── social-email-icon.json │ ├── social-vimeo-icon.json │ ├── social-reddit-icon.json │ ├── social-youtube-icon.json │ ├── social-facebook-icon.json │ ├── social-linkedin-icon.json │ ├── social-instagram-icon.json │ ├── social-github-icon.json │ ├── social-twitter-icon.json │ ├── link-play.json │ ├── link-send.json │ ├── checkboxformcontrol-checkbox-form-control.json │ ├── link-vimeo-icon.json │ ├── textformcontrol-text-form-control.json │ ├── emailformcontrol-email-form-field.json │ ├── link-github-icon.json │ ├── link-reddit-icon.json │ ├── link-send-email.json │ ├── link-vimeo-link.json │ ├── link-github-link.json │ ├── link-instagram-icon.json │ ├── link-reddit-link.json │ ├── link-twitter-icon.json │ ├── link-youtube-icon.json │ ├── link-facebook-icon.json │ ├── link-linkedin-icon.json │ ├── link-twitter-link.json │ ├── link-youtube-link.json │ ├── link-facebook-link.json │ ├── link-linkedin-link.json │ ├── link-shopping-bag.json │ ├── link-instagram-link.json │ ├── link-secondary-link.json │ ├── textareaformcontrol-textarea-form-control.json │ ├── selectformcontrol-select-from-control.json │ ├── dividersection-small-padding.json │ ├── dividersection-large-padding.json │ ├── dividersection-medium-padding.json │ ├── submit-button-form-control-submit-for-form-2846.json │ ├── link-primary-link-bccf.json │ ├── button-primary-button-2306.json │ ├── button-secondary-button-92b1.json │ ├── image-block-image-block-ffa9.json │ ├── submit-button-form-control-submit-form-with-icon-4479.json │ ├── paged-posts-section-page-post-feed-with-search-f8dd.json │ ├── paged-posts-section-post-feed-vertical-a49b.json │ ├── footerlinksgroup-company.json │ ├── video-block-default-video-a440.json │ ├── featured-item-expandable-item-c432.json │ ├── footerlinksgroup-product.json │ ├── recent-posts-section-recent-posts-grid-71ec.json │ ├── subnav-subnav.json │ ├── featured-item-product-card-0233.json │ ├── featured-item-card-image-on-top-578a.json │ ├── featured-item-card-image-on-bottom-68d5.json │ ├── featured-item-card-horizontal-for-2-col-66fc.json │ ├── person-person-no-bio-201b.json │ ├── featured-item-card-small-image-488e.json │ ├── featured-item-feature-carousel-item-8cb4.json │ ├── person-person-with-bio-2ee3.json │ ├── featured-item-testimonial-carousel-item-d425.json │ ├── pricing-plan-pricing-plan-d01c.json │ ├── featured-posts-section-featured-posts-grid-1bc9.json │ ├── featured-posts-section-featured-posts-big-list-58e6.json │ ├── featured-posts-section-featured-posts-with-featured-a400.json │ ├── featured-posts-section-featured-posts-small-list-015d.json │ ├── form-block-form-block-a081.json │ ├── page-layout-empty-page-d243.json │ └── featured-people-section-featured-people-d4f4.json │ └── models │ ├── FooterLinksGroup.ts │ ├── MetaTag.ts │ ├── SubNav.ts │ ├── CheckboxFormControl.ts │ ├── Seo.ts │ ├── EmailFormControl.ts │ ├── ThemeStyleLink.ts │ ├── TextareaFormControl.ts │ ├── TextFormControl.ts │ ├── Badge.ts │ ├── SelectFormControl.ts │ └── Social.ts ├── renovate.json ├── postcss.config.js ├── next-env.d.ts ├── content ├── data │ ├── site.json │ ├── person1.json │ ├── person5.json │ ├── person2.json │ ├── person3.json │ ├── person4.json │ ├── person6.json │ └── style.json └── pages │ └── blog │ └── index.md ├── .prettierrc ├── next.config.js ├── .gitignore ├── tsconfig.json ├── LICENSE ├── package.json └── stackbit.config.ts /.nvmrc: -------------------------------------------------------------------------------- 1 | v18 2 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "npm run build" 3 | publish = ".next" -------------------------------------------------------------------------------- /.env-example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_ALGOLIA_APP_ID= 2 | NEXT_PUBLIC_ALGOLIA_INDEX_NAME= 3 | NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY= -------------------------------------------------------------------------------- /public/images/main-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/public/images/main-hero.jpg -------------------------------------------------------------------------------- /public/images/placeholder-video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/public/images/placeholder-video.mp4 -------------------------------------------------------------------------------- /src/components/layouts/PostFeedCategoryLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import PostFeedLayout from '../PostFeedLayout'; 2 | export default PostFeedLayout; 3 | -------------------------------------------------------------------------------- /src/components/sections/RecentPostsSection/index.tsx: -------------------------------------------------------------------------------- 1 | import PostFeedSection from '../PostFeedSection'; 2 | export default PostFeedSection; 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "bradlc.vscode-tailwindcss"] 3 | } 4 | -------------------------------------------------------------------------------- /public/images/img-placeholder-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/public/images/img-placeholder-dark.png -------------------------------------------------------------------------------- /public/images/person-placeholder-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/public/images/person-placeholder-light.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-play-6021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-play-6021.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-send-5cc9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-send-5cc9.png -------------------------------------------------------------------------------- /src/pages/_app.js: -------------------------------------------------------------------------------- 1 | import '../css/main.css'; 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "local>netlify-templates/renovate-config" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /sources/local/presets/images/footer-footer-80a8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/footer-footer-80a8.png -------------------------------------------------------------------------------- /sources/local/presets/images/header-header-07de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/header-header-07de.png -------------------------------------------------------------------------------- /sources/local/presets/images/sub-nav-subnav-b29b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/sub-nav-subnav-b29b.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-github-icon-3beb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-github-icon-3beb.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-github-link-f4df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-github-link-f4df.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-primary-link-312d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-primary-link-312d.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-primary-link-bccf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-primary-link-bccf.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-reddit-icon-ac51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-reddit-icon-ac51.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-reddit-link-e762.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-reddit-link-e762.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-send-email-7dad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-send-email-7dad.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-shopping-bag-f246.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-shopping-bag-f246.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-twitter-icon-23d8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-twitter-icon-23d8.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-twitter-link-3f75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-twitter-link-3f75.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-vimeo-icon-4d05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-vimeo-icon-4d05.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-vimeo-link-4487.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-vimeo-link-4487.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-youtube-icon-f909.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-youtube-icon-f909.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-youtube-link-dbc6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-youtube-link-dbc6.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-email-icon-0bae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-email-icon-0bae.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-vimeo-icon-93e4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-vimeo-icon-93e4.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-facebook-icon-e829.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-facebook-icon-e829.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-facebook-link-4bf1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-facebook-link-4bf1.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-instagram-icon-a925.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-instagram-icon-a925.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-instagram-link-0bf0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-instagram-link-0bf0.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-linkedin-icon-2f83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-linkedin-icon-2f83.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-linkedin-link-427f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-linkedin-link-427f.png -------------------------------------------------------------------------------- /sources/local/presets/images/link-secondary-link-0c1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/link-secondary-link-0c1a.png -------------------------------------------------------------------------------- /sources/local/presets/images/page-layout-careers-c1de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/page-layout-careers-c1de.png -------------------------------------------------------------------------------- /sources/local/presets/images/page-layout-pricing-91fd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/page-layout-pricing-91fd.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-github-icon-c23d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-github-icon-c23d.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-reddit-icon-8f9e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-reddit-icon-8f9e.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-twitter-icon-5eae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-twitter-icon-5eae.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-youtube-icon-54b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-youtube-icon-54b0.png -------------------------------------------------------------------------------- /sources/local/presets/images/button-primary-button-2306.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/button-primary-button-2306.png -------------------------------------------------------------------------------- /sources/local/presets/images/form-block-form-block-a081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/form-block-form-block-a081.png -------------------------------------------------------------------------------- /sources/local/presets/images/page-layout-empty-page-d243.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/page-layout-empty-page-d243.png -------------------------------------------------------------------------------- /sources/local/presets/images/page-layout-main-page-fc14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/page-layout-main-page-fc14.png -------------------------------------------------------------------------------- /sources/local/presets/images/person-person-no-bio-201b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/person-person-no-bio-201b.png -------------------------------------------------------------------------------- /sources/local/presets/images/person-person-with-bio-2ee3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/person-person-with-bio-2ee3.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-facebook-icon-97c5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-facebook-icon-97c5.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-instagram-icon-9544.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-instagram-icon-9544.png -------------------------------------------------------------------------------- /sources/local/presets/images/social-linkedin-icon-10b3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/social-linkedin-icon-10b3.png -------------------------------------------------------------------------------- /sources/local/presets/images/button-secondary-button-92b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/button-secondary-button-92b1.png -------------------------------------------------------------------------------- /sources/local/presets/images/image-block-image-block-ffa9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/image-block-image-block-ffa9.png -------------------------------------------------------------------------------- /sources/local/presets/images/pricing-section-pricing-08b5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/pricing-section-pricing-08b5.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-product-card-0233.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-product-card-0233.png -------------------------------------------------------------------------------- /sources/local/presets/images/footer-links-group-company-ca84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/footer-links-group-company-ca84.png -------------------------------------------------------------------------------- /sources/local/presets/images/footer-links-group-product-df98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/footer-links-group-product-df98.png -------------------------------------------------------------------------------- /sources/local/presets/images/image-gallery-section-logos-d84a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/image-gallery-section-logos-d84a.png -------------------------------------------------------------------------------- /sources/local/presets/images/post-layout-post-with-cta-050e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/post-layout-post-with-cta-050e.png -------------------------------------------------------------------------------- /sources/local/presets/images/pricing-plan-pricing-plan-d01c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/pricing-plan-pricing-plan-d01c.png -------------------------------------------------------------------------------- /sources/local/presets/images/video-block-default-video-a440.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/video-block-default-video-a440.png -------------------------------------------------------------------------------- /sources/local/presets/images/divider-section-large-padding-bfd8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/divider-section-large-padding-bfd8.png -------------------------------------------------------------------------------- /sources/local/presets/images/divider-section-small-padding-2a1b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/divider-section-small-padding-2a1b.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-expandable-item-c432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-expandable-item-c432.png -------------------------------------------------------------------------------- /sources/local/presets/images/generic-section-form-sedtion-e54c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/generic-section-form-sedtion-e54c.png -------------------------------------------------------------------------------- /sources/local/presets/images/divider-section-medium-padding-208f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/divider-section-medium-padding-208f.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-card-image-on-top-578a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-card-image-on-top-578a.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-card-small-image-488e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-card-small-image-488e.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-card-image-on-bottom-68d5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-card-image-on-bottom-68d5.png -------------------------------------------------------------------------------- /sources/local/presets/images/post-layout-post-with-recent-posts-dd5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/post-layout-post-with-recent-posts-dd5d.png -------------------------------------------------------------------------------- /public/images/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/local/presets/images/email-form-control-email-form-field-7835.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/email-form-control-email-form-field-7835.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-feature-carousel-item-8cb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-feature-carousel-item-8cb4.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-features-grid-bf42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-features-grid-bf42.png -------------------------------------------------------------------------------- /sources/local/presets/images/text-form-control-text-form-control-1f37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/text-form-control-text-form-control-1f37.png -------------------------------------------------------------------------------- /sources/local/presets/images/carousel-section-feature-carousel-tabs-ec48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/carousel-section-feature-carousel-tabs-ec48.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-card-horizontal-for-2-col-66fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-card-horizontal-for-2-col-66fc.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-item-testimonial-carousel-item-d425.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-item-testimonial-carousel-item-d425.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-people-section-featured-people-d4f4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-people-section-featured-people-d4f4.png -------------------------------------------------------------------------------- /sources/local/presets/images/paged-posts-section-post-feed-vertical-a49b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/paged-posts-section-post-feed-vertical-a49b.png -------------------------------------------------------------------------------- /sources/local/presets/images/recent-posts-section-recent-posts-grid-71ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/recent-posts-section-recent-posts-grid-71ec.png -------------------------------------------------------------------------------- /sources/local/presets/images/select-form-control-select-from-control-c9d6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/select-form-control-select-from-control-c9d6.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-featured-products-5266.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-featured-products-5266.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-posts-section-featured-posts-grid-1bc9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-posts-section-featured-posts-grid-1bc9.png -------------------------------------------------------------------------------- /sources/local/presets/images/generic-section-feature-section-image-left-80ff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/generic-section-feature-section-image-left-80ff.png -------------------------------------------------------------------------------- /sources/local/presets/images/generic-section-generic-section-with-video-a138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/generic-section-generic-section-with-video-a138.png -------------------------------------------------------------------------------- /sources/local/presets/images/submit-button-form-control-submit-for-form-2846.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/submit-button-form-control-submit-for-form-2846.png -------------------------------------------------------------------------------- /sources/local/presets/images/carousel-section-testimonial-carousel-arrows-e90d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/carousel-section-testimonial-carousel-arrows-e90d.png -------------------------------------------------------------------------------- /sources/local/presets/images/checkbox-form-control-checkbox-form-control-2967.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/checkbox-form-control-checkbox-form-control-2967.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-featured-items-2-col-6973.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-featured-items-2-col-6973.png -------------------------------------------------------------------------------- /sources/local/presets/images/generic-section-feature-section-image-right-8358.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/generic-section-feature-section-image-right-8358.png -------------------------------------------------------------------------------- /sources/local/presets/images/textarea-form-control-textarea-form-control-73ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/textarea-form-control-textarea-form-control-73ab.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | // postcss.config.js 2 | module.exports = { 3 | plugins: { 4 | 'postcss-import': {}, 5 | 'tailwindcss/nesting': {}, 6 | tailwindcss: {}, 7 | autoprefixer: {} 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /sources/local/presets/images/featured-posts-section-featured-posts-big-list-58e6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-posts-section-featured-posts-big-list-58e6.png -------------------------------------------------------------------------------- /sources/local/presets/images/paged-posts-section-page-post-feed-with-search-f8dd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/paged-posts-section-page-post-feed-with-search-f8dd.png -------------------------------------------------------------------------------- /src/components/sections/FeaturedPostsSection/index.tsx: -------------------------------------------------------------------------------- 1 | import PostFeedSection from '../PostFeedSection'; 2 | export default function FeaturedPostSection(props) { 3 | return ; 4 | } 5 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/pages/api-reference/config/typescript for more information. 6 | -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-featured-items-small-image-1c22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-featured-items-small-image-1c22.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-product-list-with-featured-5cc6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-product-list-with-featured-5cc6.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-people-section-featured-people-grid-alt-9025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-people-section-featured-people-grid-alt-9025.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-posts-section-featured-posts-small-list-015d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-posts-section-featured-posts-small-list-015d.png -------------------------------------------------------------------------------- /sources/local/presets/images/submit-button-form-control-submit-form-with-icon-4479.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/submit-button-form-control-submit-form-with-icon-4479.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-posts-section-featured-posts-with-featured-a400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-posts-section-featured-posts-with-featured-a400.png -------------------------------------------------------------------------------- /sources/local/presets/images/featured-items-section-featured-items-expandable-list-73c6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netlify-templates/content-ops-starter/HEAD/sources/local/presets/images/featured-items-section-featured-items-expandable-list-73c6.png -------------------------------------------------------------------------------- /content/data/site.json: -------------------------------------------------------------------------------- 1 | { 2 | "favicon": "/images/favicon.svg", 3 | "footer": "content/data/footer.json", 4 | "titleSuffix": "Theme Demo", 5 | "defaultSocialImage": "/images/main-hero.jpg", 6 | "type": "Config", 7 | "header": "content/data/header.json" 8 | } -------------------------------------------------------------------------------- /src/components/atoms/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Action } from './Action'; 2 | export { default as BackgroundImage } from './BackgroundImage'; 3 | export { default as Badge } from './Badge'; 4 | export { default as Link } from './Link'; 5 | export { default as Social } from './Social'; 6 | -------------------------------------------------------------------------------- /src/utils/get-data-attrs.ts: -------------------------------------------------------------------------------- 1 | export function getDataAttrs(props: any = {}): any { 2 | return Object.entries(props).reduce((dataAttrs, [key, value]) => { 3 | if (key.startsWith('data-')) { 4 | dataAttrs[key] = value; 5 | } 6 | return dataAttrs; 7 | }, {}); 8 | } 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 160, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "tabWidth": 4, 6 | "overrides": [ 7 | { 8 | "files": ["*.md", "*.yaml"], 9 | "options": { 10 | "tabWidth": 2 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('next').NextConfig} 3 | */ 4 | const nextConfig = { 5 | env: { 6 | stackbitPreview: process.env.STACKBIT_PREVIEW 7 | }, 8 | trailingSlash: true, 9 | reactStrictMode: true, 10 | allowedDevOrigins: [ 11 | '192.168.1.84' 12 | ] 13 | }; 14 | 15 | module.exports = nextConfig; 16 | -------------------------------------------------------------------------------- /sources/local/presets/social-email-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Email icon", 6 | "thumbnail": "images/social-email-icon-0bae.png", 7 | "data": { 8 | "altText": "Email icon", 9 | "url": "/", 10 | "icon": "mail", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-vimeo-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Vimeo icon", 6 | "thumbnail": "images/social-vimeo-icon-93e4.png", 7 | "data": { 8 | "altText": "Vimeo link", 9 | "url": "/", 10 | "icon": "vimeo", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-reddit-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Reddit icon", 6 | "thumbnail": "images/social-reddit-icon-8f9e.png", 7 | "data": { 8 | "altText": "Reddit icon", 9 | "url": "/", 10 | "icon": "reddit", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /src/pages/api/reindex.js: -------------------------------------------------------------------------------- 1 | import { index } from '../../utils/indexer'; 2 | 3 | export default async function handler(req, res) { 4 | try { 5 | const result = await index(); 6 | res.status(200).send({ result }); 7 | } catch (err) { 8 | console.error(err); 9 | res.status(500).send({ error: 'failed to fetch data' }); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /sources/local/presets/social-youtube-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "YouTube icon", 6 | "thumbnail": "images/social-youtube-icon-54b0.png", 7 | "data": { 8 | "altText": "YouTube icon", 9 | "url": "/", 10 | "icon": "youtube", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-facebook-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Facebook icon", 6 | "thumbnail": "images/social-facebook-icon-97c5.png", 7 | "data": { 8 | "altText": "Facebook link", 9 | "url": "/", 10 | "icon": "facebook", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-linkedin-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "LinkedIn icon", 6 | "thumbnail": "images/social-linkedin-icon-10b3.png", 7 | "data": { 8 | "altText": "LinkedIn link", 9 | "url": "/", 10 | "icon": "linkedin", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-instagram-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Instagram icon", 6 | "thumbnail": "images/social-instagram-icon-9544.png", 7 | "data": { 8 | "altText": "Instagram link", 9 | "url": "/", 10 | "icon": "instagram", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /src/components/svgs/play.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Play({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /sources/local/presets/social-github-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "GitHub icon", 6 | "thumbnail": "images/social-github-icon-c23d.png", 7 | "data": { 8 | "altText": "GitHub link", 9 | "url": "https://github.com/netlify", 10 | "icon": "github", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/social-twitter-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Social", 3 | "presets": [ 4 | { 5 | "label": "Twitter icon", 6 | "thumbnail": "images/social-twitter-icon-5eae.png", 7 | "data": { 8 | "altText": "Twitter link", 9 | "url": "https://twitter.com/netlify", 10 | "icon": "twitter", 11 | "elementId": "" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /public/images/icon1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/images/icon2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-up.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronUp({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-down.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronDown({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-left.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronLeft({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/plus.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Plus({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-right.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronRight({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/layouts/index.ts: -------------------------------------------------------------------------------- 1 | import PageLayout from './PageLayout'; 2 | import PostFeedLayout from './PostFeedLayout'; 3 | import PostFeedCategoryLayout from './PostFeedCategoryLayout'; 4 | import PostLayout from './PostLayout'; 5 | import BlankBaseLayout from './BlankBaseLayout'; 6 | import DefaultBaseLayout from './DefaultBaseLayout'; 7 | 8 | export { PageLayout, PostFeedLayout, PostFeedCategoryLayout, PostLayout, BlankBaseLayout, DefaultBaseLayout }; 9 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-big-left.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronBigLeft({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/chevron-big-right.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ChevronBigRight({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/menu.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Menu({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/arrow-down.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ArrowDown({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/arrow-left.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ArrowLeft({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/arrow-right.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ArrowRight({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/arrow-up.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ArrowUp({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /sources/local/presets/link-play.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Play", 6 | "thumbnail": "images/link-play-6021.png", 7 | "data": { 8 | "label": "Play", 9 | "altText": "Play", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "play", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-send.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Send", 6 | "thumbnail": "images/link-send-5cc9.png", 7 | "data": { 8 | "label": "Send", 9 | "altText": "Send", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "send", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/components/svgs/send.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Send({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /sources/local/presets/checkboxformcontrol-checkbox-form-control.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "CheckboxFormControl", 3 | "presets": [ 4 | { 5 | "label": "Checkbox form control", 6 | "thumbnail": "images/checkbox-form-control-checkbox-form-control-2967.png", 7 | "data": { 8 | "name": "updates", 9 | "label": "I have read and accept the legal terms.", 10 | "isRequired": false, 11 | "width": "full" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /sources/local/presets/link-vimeo-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Vimeo icon", 6 | "thumbnail": "images/link-vimeo-icon-4d05.png", 7 | "data": { 8 | "label": null, 9 | "altText": "Vimeo", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "vimeo", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/textformcontrol-text-form-control.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "TextFormControl", 3 | "presets": [ 4 | { 5 | "label": "Text form control", 6 | "thumbnail": "images/text-form-control-text-form-control-1f37.png", 7 | "data": { 8 | "name": "name", 9 | "label": "Name", 10 | "hideLabel": true, 11 | "placeholder": "Your name", 12 | "isRequired": true, 13 | "width": "full" 14 | } 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /sources/local/presets/emailformcontrol-email-form-field.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "EmailFormControl", 3 | "presets": [ 4 | { 5 | "label": "Email form field", 6 | "thumbnail": "images/email-form-control-email-form-field-7835.png", 7 | "data": { 8 | "name": "email", 9 | "label": "Email", 10 | "hideLabel": true, 11 | "placeholder": "Your email", 12 | "isRequired": true, 13 | "width": "full" 14 | } 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /sources/local/presets/link-github-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "GitHub icon", 6 | "thumbnail": "images/link-github-icon-3beb.png", 7 | "data": { 8 | "label": null, 9 | "altText": "GitHub", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "github", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-reddit-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Reddit icon", 6 | "thumbnail": "images/link-reddit-icon-ac51.png", 7 | "data": { 8 | "label": null, 9 | "altText": "Reddit", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "reddit", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-send-email.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Send email", 6 | "thumbnail": "images/link-send-email-7dad.png", 7 | "data": { 8 | "label": "Send email", 9 | "altText": "Play", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "mail", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-vimeo-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Vimeo link", 6 | "thumbnail": "images/link-vimeo-link-4487.png", 7 | "data": { 8 | "label": "Vimeo", 9 | "altText": "Vimeo", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "vimeo", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-github-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "GitHub link", 6 | "thumbnail": "images/link-github-link-f4df.png", 7 | "data": { 8 | "label": "GitHub", 9 | "altText": "GitHub", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "github", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-instagram-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Instagram icon", 6 | "thumbnail": "images/link-instagram-icon-a925.png", 7 | "data": { 8 | "label": null, 9 | "altText": "", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "instagram", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-reddit-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Reddit link", 6 | "thumbnail": "images/link-reddit-link-e762.png", 7 | "data": { 8 | "label": "Reddit", 9 | "altText": "Reddit", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "reddit", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-twitter-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Twitter icon", 6 | "thumbnail": "images/link-twitter-icon-23d8.png", 7 | "data": { 8 | "label": null, 9 | "altText": "Twitter", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "twitter", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-youtube-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "YouTube icon", 6 | "thumbnail": "images/link-youtube-icon-f909.png", 7 | "data": { 8 | "label": null, 9 | "altText": "YouTube", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "youtube", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-facebook-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Facebook icon", 6 | "thumbnail": "images/link-facebook-icon-e829.png", 7 | "data": { 8 | "label": null, 9 | "altText": "Facebook", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "facebook", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-linkedin-icon.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "LinkedIn icon", 6 | "thumbnail": "images/link-linkedin-icon-2f83.png", 7 | "data": { 8 | "label": null, 9 | "altText": "LinkedIn", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "linkedin", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-twitter-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Twitter link", 6 | "thumbnail": "images/link-twitter-link-3f75.png", 7 | "data": { 8 | "label": "Twitter", 9 | "altText": "Twitter", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "twitter", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-youtube-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "YouTube link", 6 | "thumbnail": "images/link-youtube-link-dbc6.png", 7 | "data": { 8 | "label": "YouTube", 9 | "altText": "YouTube", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "youtube", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-facebook-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Facebook link", 6 | "thumbnail": "images/link-facebook-link-4bf1.png", 7 | "data": { 8 | "label": "Facebook", 9 | "altText": "Facebook", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "facebook", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-linkedin-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "LinkedIn link", 6 | "thumbnail": "images/link-linkedin-link-427f.png", 7 | "data": { 8 | "label": "LinkedIn", 9 | "altText": "LinkedIn", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "linkedin", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-shopping-bag.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Shopping bag", 6 | "thumbnail": "images/link-shopping-bag-f246.png", 7 | "data": { 8 | "label": "Buy now", 9 | "altText": "Buy now", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "shoppingBag", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /src/components/svgs/close.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Close({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /sources/local/presets/link-instagram-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Instagram link", 6 | "thumbnail": "images/link-instagram-link-0bf0.png", 7 | "data": { 8 | "label": "Instagram", 9 | "altText": "Instagram", 10 | "url": "/", 11 | "showIcon": true, 12 | "icon": "instagram", 13 | "iconPosition": "left", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /sources/local/presets/link-secondary-link.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Secondary link", 6 | "thumbnail": "images/link-secondary-link-0c1a.png", 7 | "data": { 8 | "label": "See Tutorials", 9 | "altText": "", 10 | "url": "/", 11 | "showIcon": false, 12 | "icon": "arrowRight", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | } 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /public/images/logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /sources/local/presets/textareaformcontrol-textarea-form-control.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "TextareaFormControl", 3 | "presets": [ 4 | { 5 | "label": "Textarea form control", 6 | "thumbnail": "images/textarea-form-control-textarea-form-control-73ab.png", 7 | "data": { 8 | "name": "message", 9 | "label": "Message", 10 | "hideLabel": true, 11 | "placeholder": "Your message", 12 | "isRequired": false, 13 | "width": "full" 14 | } 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /public/images/logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /sources/local/presets/selectformcontrol-select-from-control.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "SelectFormControl", 3 | "presets": [ 4 | { 5 | "label": "Select from control", 6 | "thumbnail": "images/select-form-control-select-from-control-c9d6.png", 7 | "data": { 8 | "name": "company-size", 9 | "label": "Company size", 10 | "hideLabel": false, 11 | "defaultValue": "Please choose...", 12 | "options": [], 13 | "isRequired": false, 14 | "width": "full" 15 | } 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /src/components/atoms/Link/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import NextLink from 'next/link'; 3 | 4 | export default function Link({ children, href, ...other }) { 5 | // Pass Any internal link to Next.js Link, for anything else, use tag 6 | const internal = /^\/(?!\/)/.test(href); 7 | if (internal) { 8 | return ( 9 | 10 | {children} 11 | 12 | ); 13 | } 14 | 15 | return ( 16 | 17 | {children} 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /sources/local/presets/dividersection-small-padding.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "DividerSection", 3 | "presets": [ 4 | { 5 | "label": "Small padding", 6 | "thumbnail": "images/divider-section-small-padding-2a1b.png", 7 | "data": { 8 | "title": "Divider", 9 | "elementId": "", 10 | "colors": "bg-light-fg-dark", 11 | "styles": { 12 | "self": { 13 | "padding": [ 14 | "pt-3", 15 | "pl-3", 16 | "pb-3", 17 | "pr-3" 18 | ] 19 | } 20 | } 21 | } 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /sources/local/presets/dividersection-large-padding.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "DividerSection", 3 | "presets": [ 4 | { 5 | "label": "Large padding", 6 | "thumbnail": "images/divider-section-large-padding-bfd8.png", 7 | "data": { 8 | "title": "Divider", 9 | "elementId": "", 10 | "colors": "bg-light-fg-dark", 11 | "styles": { 12 | "self": { 13 | "padding": [ 14 | "pt-20", 15 | "pl-20", 16 | "pb-20", 17 | "pr-20" 18 | ] 19 | } 20 | } 21 | } 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /sources/local/presets/dividersection-medium-padding.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "DividerSection", 3 | "presets": [ 4 | { 5 | "label": "Medium padding", 6 | "thumbnail": "images/divider-section-medium-padding-208f.png", 7 | "data": { 8 | "title": "Divider", 9 | "elementId": "", 10 | "colors": "bg-light-fg-dark", 11 | "styles": { 12 | "self": { 13 | "padding": [ 14 | "pt-12", 15 | "pl-12", 16 | "pb-12", 17 | "pr-12" 18 | ] 19 | } 20 | } 21 | } 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /sources/local/presets/submit-button-form-control-submit-for-form-2846.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "SubmitButtonFormControl", 3 | "presets": [ 4 | { 5 | "label": "Submit for form", 6 | "locale": null, 7 | "data": { 8 | "label": "Submit", 9 | "showIcon": false, 10 | "icon": "arrowRight", 11 | "iconPosition": "right", 12 | "style": "primary", 13 | "elementId": null 14 | }, 15 | "thumbnail": "images/submit-button-form-control-submit-for-form-2846.png" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /sources/local/presets/link-primary-link-bccf.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Link", 3 | "presets": [ 4 | { 5 | "label": "Primary link", 6 | "locale": null, 7 | "data": { 8 | "label": "See Tutorials", 9 | "altText": "", 10 | "url": "/", 11 | "showIcon": false, 12 | "icon": "arrowRight", 13 | "iconPosition": "right", 14 | "style": "primary", 15 | "elementId": "" 16 | }, 17 | "thumbnail": "images/link-primary-link-bccf.png" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/components/sections/DividerSection/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | import { getDataAttrs } from '../../../utils/get-data-attrs'; 5 | import Section from '../Section'; 6 | 7 | export default function DividerSection(props) { 8 | const { elementId, colors, styles = {} } = props; 9 | 10 | return ( 11 |
12 |
13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/indexer/consts.js: -------------------------------------------------------------------------------- 1 | export const ALGOLIA_APP_ID = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID; 2 | export const ALGOLIA_INDEX_NAME_SUFFIX = process.env.NEXT_PUBLIC_ALGOLIA_INDEX_NAME; 3 | export const ALGOLIA_SEARCH_API_KEY = process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY; 4 | 5 | export const ALGOLIA_ADMIN_API_KEY = process.env.ALGOLIA_ADMIN_API_KEY; 6 | // TODO consider approach of managing indexes, meanwhile use a fixed one. 7 | export const ENV_NAME = /*process.env.NODE_ENV ||*/ 'development'; 8 | 9 | export function buildIndexName() { 10 | const indexName = ENV_NAME + '_' + ALGOLIA_INDEX_NAME_SUFFIX; 11 | return indexName; 12 | } 13 | -------------------------------------------------------------------------------- /sources/local/presets/button-primary-button-2306.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Button", 3 | "presets": [ 4 | { 5 | "label": "Primary button", 6 | "locale": null, 7 | "data": { 8 | "label": "Get started", 9 | "altText": "", 10 | "url": "/", 11 | "showIcon": false, 12 | "icon": "arrowRight", 13 | "iconPosition": "right", 14 | "style": "primary", 15 | "elementId": "" 16 | }, 17 | "thumbnail": "images/button-primary-button-2306.png" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /sources/local/presets/button-secondary-button-92b1.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Button", 3 | "presets": [ 4 | { 5 | "label": "Secondary button", 6 | "locale": null, 7 | "data": { 8 | "label": "Get started", 9 | "altText": "", 10 | "url": "/", 11 | "showIcon": false, 12 | "icon": "arrowRight", 13 | "iconPosition": "right", 14 | "style": "secondary", 15 | "elementId": "" 16 | }, 17 | "thumbnail": "images/button-secondary-button-92b1.png" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /sources/local/presets/image-block-image-block-ffa9.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "ImageBlock", 3 | "presets": [ 4 | { 5 | "label": "Default image", 6 | "locale": null, 7 | "data": { 8 | "url": "/images/hero2.svg", 9 | "altText": "Image alt text placeholder", 10 | "elementId": "", 11 | "styles": { 12 | "self": { 13 | "borderRadius": "medium" 14 | } 15 | } 16 | }, 17 | "thumbnail": "images/image-block-image-block-ffa9.png" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /sources/local/presets/submit-button-form-control-submit-form-with-icon-4479.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "SubmitButtonFormControl", 3 | "presets": [ 4 | { 5 | "label": "Submit form with icon", 6 | "locale": null, 7 | "data": { 8 | "label": "Submit", 9 | "showIcon": true, 10 | "icon": "arrowRight", 11 | "iconPosition": "right", 12 | "style": "primary", 13 | "elementId": null 14 | }, 15 | "thumbnail": "images/submit-button-form-control-submit-form-with-icon-4479.png" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /src/components/svgs/shopping-bag.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function ShoppingBag({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/facebook.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Facebook({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # Netlify Visual Editor (formerly Stackbit) 9 | .stackbit/cache 10 | .cache 11 | 12 | # testing 13 | /coverage 14 | 15 | # next.js 16 | /.next/ 17 | /out/ 18 | 19 | # production 20 | /build 21 | 22 | # misc 23 | .DS_Store 24 | *.pem 25 | Thumbs.db 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # local env files 33 | .env 34 | .env.local 35 | .env.development.local 36 | .env.test.local 37 | .env.production.local 38 | .envrc 39 | 40 | # IDE 41 | *.code-workspace 42 | .idea 43 | 44 | tmp* -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "target": "es2018", 5 | "lib": ["dom", "dom.iterable", "esnext"], 6 | "allowJs": true, 7 | "skipLibCheck": true, 8 | "strict": false, 9 | "forceConsistentCasingInFileNames": true, 10 | "noEmit": true, 11 | "esModuleInterop": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "jsx": "preserve", 17 | "incremental": true 18 | }, 19 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 20 | "exclude": ["node_modules"] 21 | } 22 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 4, 3 | "editor.formatOnSave": true, 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll.eslint": "explicit" 6 | }, 7 | "[javascript]": { 8 | "editor.defaultFormatter": "esbenp.prettier-vscode", 9 | "editor.formatOnSave": true 10 | }, 11 | "[yaml]": { 12 | "editor.defaultFormatter": "esbenp.prettier-vscode", 13 | "editor.tabSize": 2 14 | }, 15 | "[toml]": { 16 | "editor.defaultFormatter": "esbenp.prettier-vscode", 17 | "editor.tabSize": 2 18 | }, 19 | "[markdown]": { 20 | "editor.defaultFormatter": "esbenp.prettier-vscode", 21 | "editor.tabSize": 2 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/base-layout.ts: -------------------------------------------------------------------------------- 1 | import DefaultBaseLayout from '../components/layouts/DefaultBaseLayout'; 2 | import BlankBaseLayout from '../components/layouts/BlankBaseLayout'; 3 | 4 | export function getBaseLayoutComponent(pageBaseLayout, siteConfigBaseLayout) { 5 | const layout = pageBaseLayout || siteConfigBaseLayout || 'DefaultBaseLayout'; 6 | let BaseLayout; 7 | if (layout === 'DefaultBaseLayout') { 8 | BaseLayout = DefaultBaseLayout; 9 | } else if (layout === 'BlankBaseLayout') { 10 | BaseLayout = BlankBaseLayout; 11 | } else { 12 | BaseLayout = DefaultBaseLayout; 13 | } 14 | if (!BaseLayout) { 15 | throw new Error(`no BaseLayout: ${pageBaseLayout} or ${siteConfigBaseLayout}`); 16 | } 17 | return BaseLayout; 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Launch Next.js app", 9 | "request": "launch", 10 | "runtimeArgs": ["run", "dev"], 11 | "runtimeExecutable": "npm", 12 | "skipFiles": ["/**"], 13 | "type": "node" 14 | }, 15 | { 16 | "type": "node", 17 | "request": "attach", 18 | "name": "Attach to application", 19 | "skipFiles": ["/**"], 20 | "port": 9229 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/components/layouts/BlankBaseLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Head from 'next/head'; 3 | import classNames from 'classnames'; 4 | 5 | export default function BlankBaseLayout(props) { 6 | const { page, site } = props; 7 | const { enableAnnotations = true } = site; 8 | const pageMeta = page?.__metadata || {}; 9 | return ( 10 |
11 | 12 | {page.title} 13 | 14 | {site.favicon && } 15 | 16 | {props.children} 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/components/svgs/mail.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Mail({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/youtube.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function YouTube({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/svgs/linkedin.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function LinkedIn({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/layouts/DefaultBaseLayout/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | import Header from '../../sections/Header'; 4 | import Footer from '../../sections/Footer'; 5 | 6 | export default function DefaultBaseLayout(props) { 7 | const { page, site } = props; 8 | const { enableAnnotations = true } = site; 9 | const pageMeta = page?.__metadata || {}; 10 | 11 | return ( 12 |
13 |
14 | {site.header &&
} 15 | {props.children} 16 | {site.footer &&
} 17 |
18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/components/svgs/vimeo.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Vimeo({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/utils/page-utils.js: -------------------------------------------------------------------------------- 1 | function cssClassesFromUrlPath(urlPath) { 2 | const parts = urlPath 3 | .replace(/^\/|\/$/g, '') 4 | .split('/') 5 | .filter(Boolean); 6 | 7 | let css = 'page'; 8 | return parts.map((part) => { 9 | css += `-${part}`; 10 | return css; 11 | }); 12 | } 13 | 14 | function getPageUrl(page) { 15 | if (!page || !page.slug) { 16 | return null; 17 | } 18 | 19 | if (['PostLayout'].includes(page?.__metadata.modelName)) { 20 | return `/blog${page.slug.startsWith('/') ? page.slug : `/${page.slug}`}`; 21 | } 22 | 23 | return page.slug.startsWith('/') ? page.slug : `/${page.slug}`; 24 | } 25 | 26 | function setEnvironmentVariables() { 27 | return { 28 | ...(process?.env?.URL && { URL: process.env.URL }), 29 | } 30 | } 31 | 32 | 33 | module.exports = { 34 | cssClassesFromUrlPath, 35 | getPageUrl, 36 | setEnvironmentVariables 37 | }; -------------------------------------------------------------------------------- /sources/local/presets/paged-posts-section-page-post-feed-with-search-f8dd.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "PagedPostsSection", 3 | "presets": [ 4 | { 5 | "label": "Post feed, grid", 6 | "locale": null, 7 | "data": { 8 | "title": null, 9 | "subtitle": null, 10 | "showThumbnail": true, 11 | "showExcerpt": true, 12 | "showDate": true, 13 | "showAuthor": true, 14 | "actions": [], 15 | "badge": null, 16 | "elementId": null, 17 | "variant": "three-col-grid", 18 | "colors": "bg-light-fg-dark", 19 | "backgroundImage": null, 20 | "styles": { 21 | "self": {} 22 | } 23 | }, 24 | "thumbnail": "images/paged-posts-section-page-post-feed-with-search-f8dd.png" 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /public/images/hero.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/blocks/TitleBlock/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | import { mapStylesToClassNames as mapStyles } from '../../../utils/map-styles-to-class-names'; 5 | 6 | export default function TitleBlock(props) { 7 | const { className, text = [], color = 'text-dark', styles = {} } = props; 8 | const fieldPath = props['data-sb-field-path']; 9 | if (!text) { 10 | return null; 11 | } 12 | 13 | return ( 14 |

25 | {text} 26 |

27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /src/components/atoms/BackgroundImage/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | import { mapStylesToClassNames as mapStyles } from '../../../utils/map-styles-to-class-names'; 4 | 5 | export default function BackgroundImage(props) { 6 | const { url, className, backgroundSize, backgroundPosition, backgroundRepeat, opacity } = props; 7 | if (!url) { 8 | return null; 9 | } 10 | return ( 11 |
25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /sources/local/presets/paged-posts-section-post-feed-vertical-a49b.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "PagedPostsSection", 3 | "presets": [ 4 | { 5 | "label": "Post feed, vertical", 6 | "locale": null, 7 | "data": { 8 | "title": null, 9 | "subtitle": null, 10 | "showThumbnail": true, 11 | "showExcerpt": true, 12 | "showDate": true, 13 | "showAuthor": true, 14 | "actions": [], 15 | "badge": null, 16 | "elementId": null, 17 | "variant": "small-list", 18 | "colors": "bg-light-fg-dark", 19 | "backgroundImage": null, 20 | "styles": { 21 | "self": { 22 | "justifyContent": "center" 23 | } 24 | } 25 | }, 26 | "thumbnail": "images/paged-posts-section-post-feed-vertical-a49b.png" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /sources/local/presets/footerlinksgroup-company.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FooterLinksGroup", 3 | "presets": [ 4 | { 5 | "label": "company", 6 | "thumbnail": "images/footer-links-group-company-ca84.png", 7 | "data": { 8 | "title": "Company", 9 | "links": [ 10 | { 11 | "label": "About", 12 | "altText": "", 13 | "url": "/", 14 | "showIcon": false, 15 | "icon": "arrowRight", 16 | "iconPosition": "right", 17 | "style": "secondary", 18 | "elementId": "", 19 | "$$type": "Link" 20 | }, 21 | { 22 | "label": "Blog", 23 | "altText": "", 24 | "url": "/blog", 25 | "showIcon": false, 26 | "icon": "arrowRight", 27 | "iconPosition": "right", 28 | "style": "secondary", 29 | "elementId": "", 30 | "$$type": "Link" 31 | } 32 | ], 33 | "styles": null 34 | } 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /src/components/atoms/Badge/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | import { mapStylesToClassNames as mapStyles } from '../../../utils/map-styles-to-class-names'; 5 | 6 | export default function Badge(props) { 7 | const { label, color = 'text-primary', styles, className } = props; 8 | const fieldPath = props['data-sb-field-path']; 9 | if (!label) { 10 | return null; 11 | } 12 | 13 | return ( 14 |
25 | 26 | {label} 27 | 28 |
29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /sources/local/models/FooterLinksGroup.ts: -------------------------------------------------------------------------------- 1 | import { Model } from '@stackbit/types'; 2 | 3 | export const FooterLinksGroup: Model = { 4 | type: 'object', 5 | name: 'FooterLinksGroup', 6 | label: 'Footer Links Group', 7 | labelField: 'title', 8 | fields: [ 9 | { 10 | type: 'string', 11 | name: 'title', 12 | label: 'Title', 13 | required: false, 14 | default: 'Your Brand', 15 | hidden: false, 16 | localized: false 17 | }, 18 | { 19 | type: 'list', 20 | name: 'links', 21 | label: 'Links', 22 | required: false, 23 | hidden: false, 24 | localized: false, 25 | items: { 26 | type: 'model', 27 | models: [ 28 | 'Button', 29 | 'Link' 30 | ] 31 | } 32 | }, 33 | { 34 | type: 'json', 35 | name: 'styles', 36 | label: 'Styles', 37 | description: 'The styles field is controlled by Netlify Create editor', 38 | required: false, 39 | hidden: false, 40 | localized: false 41 | } 42 | ] 43 | }; -------------------------------------------------------------------------------- /content/data/person1.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Rhonda Piper", 3 | "role": "Job title", 4 | "image": { 5 | "url": "/images/avatar1.svg", 6 | "altText": "Rhonda Piper", 7 | "styles": { 8 | "self": { 9 | "borderRadius": "medium", 10 | "margin": [ 11 | "mb-8" 12 | ] 13 | } 14 | }, 15 | "type": "ImageBlock" 16 | }, 17 | "colors": "bg-light-fg-dark", 18 | "styles": { 19 | "self": { 20 | "padding": [ 21 | "pt-6", 22 | "pb-6", 23 | "pl-6", 24 | "pr-6" 25 | ], 26 | "textAlign": "center", 27 | "borderColor": "border-neutral", 28 | "borderStyle": "solid", 29 | "borderWidth": 0, 30 | "borderRadius": "none", 31 | "justifyContent": "center" 32 | } 33 | }, 34 | "type": "Person", 35 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 36 | } -------------------------------------------------------------------------------- /public/images/img-placeholder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/images/icon3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /content/data/person5.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Person", 3 | "name": "Drake Garza", 4 | "role": "Job title", 5 | "image": { 6 | "url": "/images/avatar5.svg", 7 | "altText": "Drake Garza", 8 | "styles": { 9 | "self": { 10 | "borderRadius": "medium", 11 | "margin": [ 12 | "mb-8" 13 | ] 14 | } 15 | }, 16 | "type": "ImageBlock" 17 | }, 18 | "colors": "bg-light-fg-dark", 19 | "elementId": null, 20 | "styles": { 21 | "self": { 22 | "padding": [ 23 | "pt-6", 24 | "pb-6", 25 | "pl-6", 26 | "pr-6" 27 | ], 28 | "textAlign": "center", 29 | "borderColor": "border-neutral", 30 | "borderStyle": "solid", 31 | "borderWidth": 0, 32 | "borderRadius": "none", 33 | "justifyContent": "center" 34 | } 35 | }, 36 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 37 | } -------------------------------------------------------------------------------- /content/data/person2.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Person", 3 | "name": "Faizah Chan", 4 | "role": "Co-founder & CEO", 5 | "image": { 6 | "url": "/images/avatar2.svg", 7 | "altText": "Faizah Chan", 8 | "styles": { 9 | "self": { 10 | "borderRadius": "medium", 11 | "margin": [ 12 | "mb-8" 13 | ] 14 | } 15 | }, 16 | "type": "ImageBlock" 17 | }, 18 | "colors": "bg-light-fg-dark", 19 | "elementId": null, 20 | "styles": { 21 | "self": { 22 | "padding": [ 23 | "pt-6", 24 | "pb-6", 25 | "pl-6", 26 | "pr-6" 27 | ], 28 | "textAlign": "center", 29 | "borderColor": "border-neutral", 30 | "borderStyle": "solid", 31 | "borderWidth": 0, 32 | "borderRadius": "none", 33 | "justifyContent": "center" 34 | } 35 | }, 36 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 37 | } -------------------------------------------------------------------------------- /content/data/person3.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Person", 3 | "name": "Asher Schmitt", 4 | "role": "Co-founder & CEO", 5 | "image": { 6 | "url": "/images/avatar3.svg", 7 | "altText": "Asher Schmitt", 8 | "styles": { 9 | "self": { 10 | "borderRadius": "medium", 11 | "margin": [ 12 | "mb-8" 13 | ] 14 | } 15 | }, 16 | "type": "ImageBlock" 17 | }, 18 | "colors": "bg-light-fg-dark", 19 | "elementId": null, 20 | "styles": { 21 | "self": { 22 | "padding": [ 23 | "pt-6", 24 | "pb-6", 25 | "pl-6", 26 | "pr-6" 27 | ], 28 | "textAlign": "center", 29 | "borderColor": "border-neutral", 30 | "borderStyle": "solid", 31 | "borderWidth": 0, 32 | "borderRadius": "none", 33 | "justifyContent": "center" 34 | } 35 | }, 36 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 37 | } -------------------------------------------------------------------------------- /content/data/person4.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Person", 3 | "name": "Nina Mercado", 4 | "role": "Co-founder & CEO", 5 | "image": { 6 | "url": "/images/avatar4.svg", 7 | "altText": "Nina Mercado", 8 | "styles": { 9 | "self": { 10 | "borderRadius": "medium", 11 | "margin": [ 12 | "mb-8" 13 | ] 14 | } 15 | }, 16 | "type": "ImageBlock" 17 | }, 18 | "colors": "bg-light-fg-dark", 19 | "elementId": null, 20 | "styles": { 21 | "self": { 22 | "padding": [ 23 | "pt-6", 24 | "pb-6", 25 | "pl-6", 26 | "pr-6" 27 | ], 28 | "textAlign": "center", 29 | "borderColor": "border-neutral", 30 | "borderStyle": "solid", 31 | "borderWidth": 0, 32 | "borderRadius": "none", 33 | "justifyContent": "center" 34 | } 35 | }, 36 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 37 | } -------------------------------------------------------------------------------- /sources/local/models/MetaTag.ts: -------------------------------------------------------------------------------- 1 | import { Model } from '@stackbit/types'; 2 | 3 | export const MetaTag: Model = { 4 | type: 'object', 5 | name: 'MetaTag', 6 | label: 'Meta Tag', 7 | labelField: 'content', 8 | fields: [ 9 | { 10 | type: 'enum', 11 | name: 'property', 12 | label: 'Property', 13 | required: false, 14 | hidden: false, 15 | localized: false, 16 | options: [ 17 | 'og:title', 18 | 'og:type', 19 | 'og:image', 20 | 'og:image:alt', 21 | 'og:url', 22 | 'og:description', 23 | 'og:locale', 24 | 'og:site_name', 25 | 'og:video', 26 | 'twitter:card', 27 | 'twitter:site', 28 | 'twitter:creator', 29 | 'twitter:description', 30 | 'twitter:title', 31 | 'twitter:image', 32 | 'twitter:image:alt', 33 | 'twitter:player' 34 | ] 35 | }, 36 | { 37 | type: 'string', 38 | name: 'content', 39 | label: 'Content', 40 | required: false, 41 | hidden: false, 42 | localized: false 43 | } 44 | ] 45 | }; -------------------------------------------------------------------------------- /content/data/person6.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Person", 3 | "name": "Harrison Tally", 4 | "role": "Co-founder & CEO", 5 | "image": { 6 | "url": "/images/avatar6.svg", 7 | "altText": "Harrison Tally", 8 | "styles": { 9 | "self": { 10 | "borderRadius": "medium", 11 | "margin": [ 12 | "mb-8" 13 | ] 14 | } 15 | }, 16 | "type": "ImageBlock" 17 | }, 18 | "colors": "bg-light-fg-dark", 19 | "elementId": null, 20 | "styles": { 21 | "self": { 22 | "padding": [ 23 | "pt-6", 24 | "pb-6", 25 | "pl-6", 26 | "pr-6" 27 | ], 28 | "textAlign": "center", 29 | "borderColor": "border-neutral", 30 | "borderStyle": "solid", 31 | "borderWidth": 0, 32 | "borderRadius": "none", 33 | "justifyContent": "center" 34 | } 35 | }, 36 | "bio": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.\n" 37 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 netlify-templates 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 | -------------------------------------------------------------------------------- /src/components/svgs/github.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function GitHub({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "content-ops-starter", 3 | "version": "0.1.0", 4 | "scripts": { 5 | "dev": "next dev", 6 | "build": "next build", 7 | "start": "next start" 8 | }, 9 | "dependencies": { 10 | "@algolia/autocomplete-js": "^1.17.1", 11 | "@algolia/autocomplete-theme-classic": "^1.17.1", 12 | "algoliasearch": "^4.24.0", 13 | "classnames": "^2.5.1", 14 | "dayjs": "^1.11.11", 15 | "front-matter": "^4.0.2", 16 | "glob": "^10.4.2", 17 | "markdown-to-jsx": "^7.7.3", 18 | "marked": "^14.1.2", 19 | "next": "15.5.9", 20 | "react": "^19.1.0", 21 | "react-dom": "^19.1.0", 22 | "swiper": "^11.1.4", 23 | "tailwindcss": "^3.4.3" 24 | }, 25 | "devDependencies": { 26 | "@base2/pretty-print-object": "^1.0.2", 27 | "@stackbit/cms-git": "^1.0.32", 28 | "@stackbit/types": "^2.1.10", 29 | "@types/glob": "^8.1.0", 30 | "@types/react": "^19.1.0", 31 | "@types/react-dom": "^19.1.1", 32 | "autoprefixer": "^10.4.19", 33 | "prettier": "^3.3.2", 34 | "typescript": "^5.6.2" 35 | }, 36 | "main": "next.config.js" 37 | } 38 | -------------------------------------------------------------------------------- /sources/local/presets/video-block-default-video-a440.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "VideoBlock", 3 | "presets": [ 4 | { 5 | "label": "Default video", 6 | "locale": null, 7 | "data": { 8 | "title": "Title of the video", 9 | "url": "/images/placeholder-video.mp4", 10 | "autoplay": true, 11 | "loop": true, 12 | "muted": true, 13 | "controls": false, 14 | "aspectRatio": "16:9", 15 | "elementId": null, 16 | "styles": { 17 | "self": { 18 | "padding": [ 19 | "pt-2", 20 | "pb-2", 21 | "pl-2", 22 | "pr-2" 23 | ], 24 | "borderColor": "border-dark", 25 | "borderStyle": "solid", 26 | "borderWidth": 1, 27 | "borderRadius": "large" 28 | } 29 | } 30 | }, 31 | "thumbnail": "images/video-block-default-video-a440.png" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /src/components/svgs/twitter.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export default function Twitter({ className, ...props }) { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/components/sections/Section/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | import { mapStylesToClassNames as mapStyles } from '../../../utils/map-styles-to-class-names'; 5 | import { getDataAttrs } from '../../../utils/get-data-attrs'; 6 | import BackgroundImage from '../../atoms/BackgroundImage'; 7 | 8 | export default function Section(props) { 9 | const { elementId, className, colors = 'bg-light-fg-dark', backgroundImage, styles = {}, children } = props; 10 | 11 | return ( 12 |
25 | {backgroundImage && } 26 |
{children}
27 |
28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /sources/local/presets/featured-item-expandable-item-c432.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Expandable item", 6 | "locale": null, 7 | "data": { 8 | "title": "Account Executive", 9 | "tagline": null, 10 | "subtitle": "Sales", 11 | "text": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae. explicabo.", 12 | "image": null, 13 | "actions": [], 14 | "elementId": null, 15 | "colors": "bg-neutral-fg-dark", 16 | "styles": { 17 | "self": { 18 | "padding": [ 19 | "pt-8", 20 | "pl-8", 21 | "pb-8", 22 | "pr-8" 23 | ], 24 | "textAlign": "left", 25 | "borderRadius": "x-large", 26 | "flexDirection": "row", 27 | "justifyContent": "center" 28 | } 29 | } 30 | }, 31 | "thumbnail": "images/featured-item-expandable-item-c432.png" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /content/pages/blog/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Blog 3 | slug: /blog 4 | numOfPostsPerPage: 8 5 | enableSearch: true 6 | topSections: 7 | - title: 8 | text: Featured Post 9 | color: text-dark 10 | type: TitleBlock 11 | subtitle: This is the subtitle 12 | posts: 13 | - content/pages/blog/top-ten-lessons-we-learned.md 14 | showThumbnail: true 15 | showExcerpt: true 16 | showDate: true 17 | showAuthor: true 18 | variant: big-list 19 | colors: bg-light-fg-dark 20 | styles: 21 | self: 22 | padding: 23 | - pt-28 24 | - pb-0 25 | - pl-4 26 | - pr-4 27 | justifyContent: flex-start 28 | type: FeaturedPostsSection 29 | hoverEffect: move-up 30 | styles: 31 | title: 32 | textAlign: center 33 | seo: 34 | metaTitle: Blog - Demo site 35 | metaDescription: >- 36 | This is the blog of the demo site where we post about technology, product, 37 | and design. 38 | socialImage: /images/img-placeholder.svg 39 | type: Seo 40 | type: PostFeedLayout 41 | bottomSections: [] 42 | postFeed: 43 | type: PagedPostsSection 44 | title: null 45 | subtitle: null 46 | showThumbnail: true 47 | showExcerpt: true 48 | showDate: true 49 | showAuthor: true 50 | actions: [] 51 | elementId: null 52 | variant: three-col-grid 53 | colors: bg-light-fg-dark 54 | hoverEffect: move-up 55 | --- 56 | -------------------------------------------------------------------------------- /sources/local/presets/footerlinksgroup-product.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FooterLinksGroup", 3 | "presets": [ 4 | { 5 | "label": "Product", 6 | "thumbnail": "images/footer-links-group-product-df98.png", 7 | "data": { 8 | "title": "Product", 9 | "links": [ 10 | { 11 | "label": "Features", 12 | "altText": "", 13 | "url": "/", 14 | "showIcon": false, 15 | "icon": "arrowRight", 16 | "iconPosition": "right", 17 | "style": "secondary", 18 | "elementId": "", 19 | "$$type": "Link" 20 | }, 21 | { 22 | "label": "Pricing", 23 | "altText": "", 24 | "url": "/pricing", 25 | "showIcon": false, 26 | "icon": "arrowRight", 27 | "iconPosition": "right", 28 | "style": "secondary", 29 | "elementId": "", 30 | "$$type": "Link" 31 | }, 32 | { 33 | "label": "Documentation", 34 | "altText": "", 35 | "url": "/", 36 | "showIcon": false, 37 | "icon": "arrowRight", 38 | "iconPosition": "right", 39 | "style": "secondary", 40 | "elementId": "", 41 | "$$type": "Link" 42 | } 43 | ], 44 | "styles": null 45 | } 46 | } 47 | ] 48 | } -------------------------------------------------------------------------------- /sources/local/presets/recent-posts-section-recent-posts-grid-71ec.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "RecentPostsSection", 3 | "presets": [ 4 | { 5 | "label": "Recent posts, grid", 6 | "locale": null, 7 | "data": { 8 | "title": { 9 | "text": "Recent posts", 10 | "color": "text-dark", 11 | "styles": { 12 | "self": { 13 | "textAlign": "center" 14 | } 15 | }, 16 | "$$type": "TitleBlock" 17 | }, 18 | "subtitle": null, 19 | "recentCount": 3, 20 | "showThumbnail": true, 21 | "showExcerpt": true, 22 | "showDate": true, 23 | "showAuthor": true, 24 | "actions": [], 25 | "badge": null, 26 | "elementId": "", 27 | "variant": "three-col-grid", 28 | "colors": "bg-light-fg-dark", 29 | "backgroundImage": null, 30 | "styles": { 31 | "self": { 32 | "justifyContent": "center" 33 | } 34 | } 35 | }, 36 | "thumbnail": "images/recent-posts-section-recent-posts-grid-71ec.png" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /sources/local/presets/subnav-subnav.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "SubNav", 3 | "presets": [ 4 | { 5 | "label": "Subnav", 6 | "thumbnail": "images/sub-nav-subnav-b29b.png", 7 | "data": { 8 | "label": "Dropdown", 9 | "altText": "Dropdown", 10 | "links": [ 11 | { 12 | "label": "Dropdown item", 13 | "altText": "", 14 | "url": "/", 15 | "showIcon": false, 16 | "icon": "arrowRight", 17 | "iconPosition": "right", 18 | "style": "secondary", 19 | "elementId": "", 20 | "$$type": "Link" 21 | }, 22 | { 23 | "label": "Dropdown item", 24 | "altText": "", 25 | "url": "/", 26 | "showIcon": false, 27 | "icon": "arrowRight", 28 | "iconPosition": "right", 29 | "style": "secondary", 30 | "elementId": "", 31 | "$$type": "Link" 32 | }, 33 | { 34 | "label": "Dropdown item", 35 | "altText": "", 36 | "url": "/", 37 | "showIcon": false, 38 | "icon": "arrowRight", 39 | "iconPosition": "right", 40 | "style": "secondary", 41 | "elementId": "", 42 | "$$type": "Link" 43 | } 44 | ], 45 | "labelStyle": "secondary" 46 | } 47 | } 48 | ] 49 | } -------------------------------------------------------------------------------- /src/components/atoms/Social/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | import Link from '../Link'; 4 | import { iconMap } from '../../svgs'; 5 | 6 | export default function Social(props) { 7 | const { elementId, className, altText, url, icon = 'facebook' } = props; 8 | const IconComponent = iconMap[icon]; 9 | const fieldPath = props['data-sb-field-path']; 10 | const annotations = fieldPath 11 | ? { 'data-sb-field-path': [fieldPath, `${fieldPath}.url#@href`, `${fieldPath}.altText#@aria-label`, `${fieldPath}.elementId#@id`].join(' ').trim() } 12 | : {}; 13 | 14 | return ( 15 | 34 | {IconComponent && } 35 | 36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /sources/local/models/SubNav.ts: -------------------------------------------------------------------------------- 1 | import { Model } from '@stackbit/types'; 2 | 3 | export const SubNav: Model = { 4 | type: 'object', 5 | name: 'SubNav', 6 | label: 'Sub-navigation', 7 | labelField: 'label', 8 | fields: [ 9 | { 10 | type: 'string', 11 | name: 'label', 12 | label: 'Label', 13 | required: false, 14 | hidden: false, 15 | localized: false 16 | }, 17 | { 18 | type: 'string', 19 | name: 'altText', 20 | label: 'Alt text', 21 | required: false, 22 | hidden: false, 23 | localized: false 24 | }, 25 | { 26 | type: 'list', 27 | name: 'links', 28 | label: 'Links', 29 | required: false, 30 | hidden: false, 31 | localized: false, 32 | items: { 33 | type: 'model', 34 | models: [ 35 | 'Link' 36 | ] 37 | } 38 | }, 39 | { 40 | type: 'enum', 41 | name: 'labelStyle', 42 | label: 'Label style', 43 | required: false, 44 | default: 'primary', 45 | hidden: false, 46 | localized: false, 47 | options: [ 48 | { 49 | label: 'Primary', 50 | value: 'primary' 51 | }, 52 | { 53 | label: 'Secondary', 54 | value: 'secondary' 55 | } 56 | ], 57 | group: 'styles', 58 | controlType: 'button-group' 59 | } 60 | ], 61 | fieldGroups: [ 62 | { 63 | name: 'styles', 64 | label: 'Styles', 65 | icon: 'palette' 66 | } 67 | ] 68 | }; -------------------------------------------------------------------------------- /sources/local/presets/featured-item-product-card-0233.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Product card", 6 | "locale": null, 7 | "data": { 8 | "title": "Faux Fur Throw", 9 | "tagline": null, 10 | "subtitle": "$ 88 – $ 176", 11 | "text": null, 12 | "image": { 13 | "url": "/images/img-placeholder.svg", 14 | "altText": "Faux Fur Throw", 15 | "elementId": "", 16 | "styles": { 17 | "self": { 18 | "borderRadius": "medium" 19 | } 20 | }, 21 | "$$type": "ImageBlock" 22 | }, 23 | "actions": [], 24 | "elementId": null, 25 | "colors": "bg-light-fg-dark", 26 | "styles": { 27 | "self": { 28 | "padding": [ 29 | "pt-0", 30 | "pl-0", 31 | "pb-0", 32 | "pr-0" 33 | ], 34 | "textAlign": "left", 35 | "borderRadius": "none", 36 | "flexDirection": "col", 37 | "justifyContent": "center" 38 | } 39 | } 40 | }, 41 | "thumbnail": "images/featured-item-product-card-0233.png" 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /sources/local/presets/featured-item-card-image-on-top-578a.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Card, image on top", 6 | "locale": null, 7 | "data": { 8 | "title": "Feature Item One", 9 | "tagline": "This is the tagline", 10 | "subtitle": "This is the item subtitle", 11 | "text": "Follow the tutorial to build your first Netlify Create site.\n", 12 | "image": { 13 | "url": "/images/abstract-feature1.svg", 14 | "altText": "Placeholder text", 15 | "elementId": null, 16 | "styles": { 17 | "self": { 18 | "borderRadius": "x-large" 19 | } 20 | }, 21 | "$$type": "ImageBlock" 22 | }, 23 | "actions": [], 24 | "elementId": null, 25 | "colors": "bg-light-fg-dark", 26 | "styles": { 27 | "self": { 28 | "padding": [ 29 | "pt-8", 30 | "pl-8", 31 | "pb-8", 32 | "pr-8" 33 | ], 34 | "borderRadius": "x-large", 35 | "flexDirection": "col" 36 | } 37 | } 38 | }, 39 | "thumbnail": "images/featured-item-card-image-on-top-578a.png" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /sources/local/presets/featured-item-card-image-on-bottom-68d5.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Card, image on bottom", 6 | "locale": null, 7 | "data": { 8 | "title": "Feature Item One", 9 | "tagline": "This is the tagline", 10 | "subtitle": "This is the item subtitle", 11 | "text": "Follow the tutorial to build your first Netlify Create site.\n", 12 | "image": { 13 | "url": "/images/abstract-feature1.svg", 14 | "altText": "Placeholder text", 15 | "elementId": null, 16 | "styles": { 17 | "self": { 18 | "borderRadius": "x-large" 19 | } 20 | }, 21 | "$$type": "ImageBlock" 22 | }, 23 | "actions": [], 24 | "elementId": null, 25 | "colors": "bg-light-fg-dark", 26 | "styles": { 27 | "self": { 28 | "padding": [ 29 | "pt-8", 30 | "pl-8", 31 | "pb-8", 32 | "pr-8" 33 | ], 34 | "borderRadius": "x-large", 35 | "flexDirection": "col-reverse" 36 | } 37 | } 38 | }, 39 | "thumbnail": "images/featured-item-card-image-on-bottom-68d5.png" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /sources/local/presets/featured-item-card-horizontal-for-2-col-66fc.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Card, horizontal, for 2 col", 6 | "locale": null, 7 | "data": { 8 | "title": "Feature Item One", 9 | "tagline": "This is the tagline", 10 | "subtitle": "This is the item subtitle", 11 | "text": "Follow the tutorial to build your first Netlify Create site.\n", 12 | "image": { 13 | "url": "/images/abstract-feature1.svg", 14 | "altText": "Placeholder text", 15 | "elementId": null, 16 | "styles": { 17 | "self": { 18 | "borderRadius": "x-large" 19 | } 20 | }, 21 | "$$type": "ImageBlock" 22 | }, 23 | "actions": [], 24 | "elementId": null, 25 | "colors": "bg-light-fg-dark", 26 | "styles": { 27 | "self": { 28 | "padding": [ 29 | "pt-8", 30 | "pl-8", 31 | "pb-8", 32 | "pr-8" 33 | ], 34 | "borderRadius": "x-large", 35 | "flexDirection": "row" 36 | } 37 | } 38 | }, 39 | "thumbnail": "images/featured-item-card-horizontal-for-2-col-66fc.png" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /src/utils/static-paths-resolvers.js: -------------------------------------------------------------------------------- 1 | import { getAllNonFeaturedPostsSorted, getAllCategoryPostsSorted, generatePagedPathsForPage, isPublished } from './data-utils'; 2 | 3 | export function resolveStaticPaths({ pages, objects }) { 4 | return pages.reduce((paths, page) => { 5 | if (!process.env.stackbitPreview && page.isDraft) { 6 | return paths; 7 | } 8 | const objectType = page.__metadata?.modelName; 9 | const pageUrlPath = page.__metadata?.urlPath; 10 | if (objectType && StaticPathsResolvers[objectType]) { 11 | const resolver = StaticPathsResolvers[objectType]; 12 | return paths.concat(resolver(page, objects)); 13 | } 14 | return paths.concat(pageUrlPath); 15 | }, []); 16 | } 17 | 18 | const StaticPathsResolvers = { 19 | PostFeedLayout: (page, objects) => { 20 | let posts = getAllNonFeaturedPostsSorted(objects); 21 | if (!process.env.stackbitPreview) { 22 | posts = posts.filter(isPublished); 23 | } 24 | const numOfPostsPerPage = page.numOfPostsPerPage ?? 10; 25 | return generatePagedPathsForPage(page, posts, numOfPostsPerPage); 26 | }, 27 | PostFeedCategoryLayout: (page, objects) => { 28 | const categoryId = page.__metadata?.id; 29 | const numOfPostsPerPage = page.numOfPostsPerPage ?? 10; 30 | let categoryPosts = getAllCategoryPostsSorted(objects, categoryId); 31 | if (!process.env.stackbitPreview) { 32 | categoryPosts = categoryPosts.filter(isPublished); 33 | } 34 | return generatePagedPathsForPage(page, categoryPosts, numOfPostsPerPage); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /src/components/svgs/index.tsx: -------------------------------------------------------------------------------- 1 | import ArrowDown from './arrow-down'; 2 | import ArrowLeft from './arrow-left'; 3 | import ArrowRight from './arrow-right'; 4 | import ArrowUp from './arrow-up'; 5 | import ChevronDown from './chevron-down'; 6 | import ChevronLeft from './chevron-left'; 7 | import ChevronBigLeft from './chevron-big-left'; 8 | import ChevronRight from './chevron-right'; 9 | import ChevronBigRight from './chevron-big-right'; 10 | import ChevronUp from './chevron-up'; 11 | import Close from './close'; 12 | import Facebook from './facebook'; 13 | import GitHub from './github'; 14 | import Instagram from './instagram'; 15 | import LinkedIn from './linkedin'; 16 | import Mail from './mail'; 17 | import Menu from './menu'; 18 | import Play from './play'; 19 | import Reddit from './reddit'; 20 | import Send from './send'; 21 | import ShoppingBag from './shopping-bag'; 22 | import Twitter from './twitter'; 23 | import Vimeo from './vimeo'; 24 | import YouTube from './youtube'; 25 | 26 | export const iconMap = { 27 | arrowDown: ArrowDown, 28 | arrowLeft: ArrowLeft, 29 | arrowRight: ArrowRight, 30 | arrowUp: ArrowUp, 31 | chevronDown: ChevronDown, 32 | chevronLeft: ChevronLeft, 33 | chevronBigLeft: ChevronBigLeft, 34 | chevronRight: ChevronRight, 35 | chevronBigRight: ChevronBigRight, 36 | chevronUp: ChevronUp, 37 | close: Close, 38 | facebook: Facebook, 39 | github: GitHub, 40 | instagram: Instagram, 41 | linkedin: LinkedIn, 42 | mail: Mail, 43 | menu: Menu, 44 | play: Play, 45 | reddit: Reddit, 46 | send: Send, 47 | shoppingBag: ShoppingBag, 48 | twitter: Twitter, 49 | vimeo: Vimeo, 50 | youtube: YouTube 51 | }; 52 | -------------------------------------------------------------------------------- /sources/local/models/CheckboxFormControl.ts: -------------------------------------------------------------------------------- 1 | import { Model } from '@stackbit/types'; 2 | 3 | export const CheckboxFormControl: Model = { 4 | type: 'object', 5 | name: 'CheckboxFormControl', 6 | label: 'CheckboxFormControl', 7 | labelField: 'label', 8 | fields: [ 9 | { 10 | type: 'string', 11 | name: 'name', 12 | label: 'Name', 13 | description: 'Must be unique and not contain whitespace. This is the property name that will be sent to the server with this field value.', 14 | required: true, 15 | default: 'updates', 16 | hidden: false, 17 | localized: false 18 | }, 19 | { 20 | type: 'string', 21 | name: 'label', 22 | label: 'Label', 23 | required: false, 24 | default: 'Sign me up to receive updates', 25 | hidden: false, 26 | localized: false 27 | }, 28 | { 29 | type: 'boolean', 30 | name: 'isRequired', 31 | label: 'Is the field required?', 32 | required: false, 33 | default: false, 34 | hidden: false, 35 | localized: false 36 | }, 37 | { 38 | type: 'enum', 39 | name: 'width', 40 | label: 'Width', 41 | required: false, 42 | default: 'full', 43 | hidden: false, 44 | localized: false, 45 | options: [ 46 | { 47 | label: 'Full', 48 | value: 'full' 49 | }, 50 | { 51 | label: 'One half', 52 | value: '1/2' 53 | } 54 | ], 55 | group: 'styles', 56 | controlType: 'button-group' 57 | } 58 | ], 59 | fieldGroups: [ 60 | { 61 | name: 'styles', 62 | label: 'Styles', 63 | icon: 'palette' 64 | } 65 | ] 66 | }; -------------------------------------------------------------------------------- /sources/local/presets/person-person-no-bio-201b.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "Person", 3 | "presets": [ 4 | { 5 | "label": "Person, no bio", 6 | "locale": null, 7 | "data": { 8 | "name": "Rhonda Piper", 9 | "role": "Job title", 10 | "bio": null, 11 | "image": { 12 | "url": "/images/avatar1.svg", 13 | "altText": "First Last", 14 | "elementId": null, 15 | "styles": { 16 | "self": { 17 | "borderRadius": "medium", 18 | "margin": [ 19 | "mb-8" 20 | ] 21 | } 22 | }, 23 | "$$type": "ImageBlock" 24 | }, 25 | "colors": "bg-light-fg-dark", 26 | "elementId": null, 27 | "styles": { 28 | "self": { 29 | "padding": [ 30 | "pt-6", 31 | "pb-6", 32 | "pl-6", 33 | "pr-6" 34 | ], 35 | "textAlign": "center", 36 | "borderColor": "border-neutral", 37 | "borderStyle": "solid", 38 | "borderWidth": 0, 39 | "borderRadius": "none", 40 | "justifyContent": "center" 41 | } 42 | } 43 | }, 44 | "thumbnail": "images/person-person-no-bio-201b.png" 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /src/components/blocks/FormBlock/TextFormControl/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | export default function TextFormControl(props) { 5 | const { name, label, hideLabel, isRequired, placeholder, width = 'full' } = props; 6 | const fieldPath = props['data-sb-field-path']; 7 | const labelId = `${name}-label`; 8 | const attr: React.InputHTMLAttributes = {}; 9 | if (label) { 10 | attr['aria-labelledby'] = labelId; 11 | } 12 | if (isRequired) { 13 | attr.required = true; 14 | } 15 | if (placeholder) { 16 | attr.placeholder = placeholder; 17 | } 18 | 19 | return ( 20 |
26 | {label && ( 27 | 35 | )} 36 | 44 |
45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/components/blocks/FormBlock/EmailFormControl/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | export default function EmailFormControl(props) { 5 | const { name, label, hideLabel, isRequired, placeholder, width = 'full' } = props; 6 | const fieldPath = props['data-sb-field-path']; 7 | const labelId = `${name}-label`; 8 | const attr: React.InputHTMLAttributes = {}; 9 | if (label) { 10 | attr['aria-labelledby'] = labelId; 11 | } 12 | if (isRequired) { 13 | attr.required = true; 14 | } 15 | if (placeholder) { 16 | attr.placeholder = placeholder; 17 | } 18 | 19 | return ( 20 |
26 | {label && ( 27 | 35 | )} 36 | 44 |
45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /sources/local/presets/featured-item-card-small-image-488e.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "FeaturedItem", 3 | "presets": [ 4 | { 5 | "label": "Card, small image", 6 | "locale": null, 7 | "data": { 8 | "title": "500k", 9 | "tagline": null, 10 | "subtitle": "Numbers Done", 11 | "text": "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae. explicabo.", 12 | "image": { 13 | "url": "/images/icon1.svg", 14 | "altText": "Placeholder text", 15 | "elementId": "", 16 | "styles": { 17 | "self": { 18 | "borderRadius": "x-large" 19 | } 20 | }, 21 | "$$type": "ImageBlock" 22 | }, 23 | "actions": [], 24 | "elementId": null, 25 | "colors": "bg-neutralAlt-fg-dark", 26 | "styles": { 27 | "self": { 28 | "padding": [ 29 | "pt-8", 30 | "pl-8", 31 | "pb-8", 32 | "pr-8" 33 | ], 34 | "borderRadius": "x-large", 35 | "flexDirection": "row", 36 | "justifyContent": "center", 37 | "textAlign": "left" 38 | } 39 | } 40 | }, 41 | "thumbnail": "images/featured-item-card-small-image-488e.png" 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /src/components/blocks/FormBlock/TextareaFormControl/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import classNames from 'classnames'; 3 | 4 | export default function TextareaFormControl(props) { 5 | const { name, label, hideLabel, isRequired, placeholder, width = 'full' } = props; 6 | const fieldPath = props['data-sb-field-path']; 7 | const labelId = `${name}-label`; 8 | const attr: React.TextareaHTMLAttributes = {}; 9 | if (label) { 10 | attr['aria-labelledby'] = labelId; 11 | } 12 | if (isRequired) { 13 | attr.required = true; 14 | } 15 | if (placeholder) { 16 | attr.placeholder = placeholder; 17 | } 18 | 19 | return ( 20 |
26 | {label && ( 27 | 35 | )} 36 |