import path from 'node:path' import { themes as prismThemes } from 'prism-react-renderer' import designs from '../../config/software/designs.json' import tailwindcss from 'tailwindcss' import autoprefixer from 'autoprefixer' import smartypants from 'remark-smartypants' /* * We customize the sidebar somewhat: * - We bundle the options as one page, so keep them out the sidebar * - We hide certain dynamic pages (like for measurements sets, patterns, and so on) */ function customizeSidebar(items) { // Filter out design options const docs = items.filter((entry) => entry.label === 'Docs').pop().items for (const item in docs) { if (docs[item].label === 'FreeSewing Designs') { for (const design in docs[item].items) { for (const subpage in docs[item].items[design].items) { if (docs[item].items[design].items[subpage].label === 'Design Options') { docs[item].items[design].items[subpage].items = [] } } } } if (docs[item].label === 'hidden') { console.log(docs[item]) } } return items } const config = { title: 'FreeSewing', tagline: 'FreeSewing documentation for makers', favicon: 'img/favicon.ico', url: 'https://freesewing.org', baseUrl: '/', // Not time to look into this now onBrokenLinks: 'warn', onBrokenMarkdownLinks: 'warn', future: { experimental_faster: false, // Too many bugs for now }, /* * We need to make sure we can import from .mjs files */ plugins: [ () => ({ name: 'mjs-loader', configureWebpack() { return { module: { rules: [ { test: /\.mjs$/, include: /node_modules/, type: 'javascript/auto', }, { test: /\.mjs$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react'], }, }, }, ], }, } }, }), () => ({ name: 'fs-loader', configureWebpack() { const fsConfig = { resolve: { alias: {} }, } // Load plugins from source, rather than compiled package for (const plugin of [ 'core-plugins', 'plugin-annotations', 'plugin-bin-pack', 'plugin-bust', 'plugin-flip', 'plugin-gore', 'plugin-i18n', 'plugin-measurements', 'plugin-mirror', 'plugin-ringsector', 'plugin-round', 'plugin-sprinkle', 'plugin-svgattr', 'plugin-theme', 'plugin-timing', 'plugin-versionfree-svg', ]) { fsConfig.resolve.alias[`@freesewing/${plugin}`] = path.resolve( __dirname, `../../plugins/${plugin}/src/index.mjs` ) } // Load these from source, rather than compiled package for (const pkg of ['core', 'i18n', 'models', 'snapseries']) { fsConfig.resolve.alias[`@freesewing/${pkg}`] = path.resolve( __dirname, `../../packages/${pkg}/src/index.mjs` ) } // Load designs from source, rather than compiled package for (const pkg of Object.keys(designs)) { fsConfig.resolve.alias[`@freesewing/${pkg}`] = path.resolve( __dirname, `../../designs/${pkg}/src/index.mjs` ) } // i18n folder fsConfig.resolve.alias[`@i18n`] = path.resolve(__dirname, `../../i18n`) // Yaml loader fsConfig.module = { rules: [ { test: /\.ya?ml$/, use: 'yaml-loader', }, ], } return fsConfig }, }), [ '@docusaurus/plugin-content-blog', { id: 'showcase', routeBasePath: 'showcase', path: './showcase', authorsMapPath: '../authors.json', postsPerPage: 50, blogSidebarCount: 10, blogSidebarTitle: 'Recent Showcases', }, ], [ '@docusaurus/plugin-content-blog', { id: 'newsletter', routeBasePath: 'newsletter', path: './newsletter', authorsMapPath: '../authors.json', blogTitle: 'FreeSewing Newsletter', blogDescription: 'Four times per year, honest wholesome content, no ads, no nonsense', blogSidebarCount: 50, blogSidebarTitle: 'Newsletter Editions', postsPerPage: 10, feedOptions: { type: 'rss', title: 'FreeSewing Newsletter Editions', description: 'A feed for the FreeSewing newsletter', copyright: 'FreeSewing', language: 'en', createFeedItems: async (params) => { const { blogPosts, defaultCreateFeedItems, ...rest } = params return defaultCreateFeedItems({ blogPosts: blogPosts.filter((item, index) => index < 10), ...rest, }) }, }, }, ], async function myPlugin() { return { name: 'docusaurus-tailwindcss', configurePostCss(postcssOptions) { // Appends TailwindCSS and AutoPrefixer. postcssOptions.plugins.push(tailwindcss) postcssOptions.plugins.push(autoprefixer) return postcssOptions }, } }, ], i18n: { defaultLocale: 'en', locales: ['en'] }, presets: [ [ 'classic', { docs: { routeBasePath: '/', //'/docs', sidebarPath: './sidebars.js', editUrl: 'https://github.com/freesewing/freesewing/tree/v4/sites/org/', async sidebarItemsGenerator({ defaultSidebarItemsGenerator, ...args }) { const sidebarItems = await defaultSidebarItemsGenerator(args) return customizeSidebar(sidebarItems) }, remarkPlugins: [[smartypants, { dashes: 'oldschool' }]], }, theme: { customCss: './src/css/custom.css', }, blog: { path: 'blog', // Simple use-case: string editUrl editUrl: 'https://github.com/freesewing/freesewing/site/orgdocs/', editLocalizedFiles: false, blogTitle: 'FreeSewing Blog', blogDescription: 'News and updates from the people behind FreeSewing', blogSidebarCount: 5, blogSidebarTitle: 'Recent blog posts', routeBasePath: 'blog', authorsMapPath: '../authors.json', include: ['*/index.mdx'], exclude: [ '**/_*.{js,jsx,ts,tsx,md,mdx}', '**/_*/**', '**/*.test.{js,jsx,ts,tsx}', '**/__tests__/**', ], postsPerPage: 10, blogListComponent: '@theme/BlogListPage', blogTagsListComponent: '@theme/BlogTagsListPage', blogTagsPostsComponent: '@theme/BlogTagsPostsPage', remarkPlugins: [[smartypants, { dashes: 'oldschool' }]], truncateMarker: //, showReadingTime: true, feedOptions: { type: 'rss', title: 'FreeSewing Blog Posts', description: 'News and updates from the people behind FreeSewing', copyright: 'FreeSewing', language: 'en', createFeedItems: async (params) => { const { blogPosts, defaultCreateFeedItems, ...rest } = params return defaultCreateFeedItems({ // keep only the 10 most recent blog posts in the feed blogPosts: blogPosts.filter((item, index) => index < 10), ...rest, }) }, }, }, }, ], ], themeConfig: { colorMode: { defaultMode: 'light', disableSwitch: false, respectPrefersColorScheme: true, }, image: 'img/freesewing-social-card.png', navbar: { title: 'FreeSewing', logo: { alt: 'FreeSewing Logo', src: 'img/logo.svg', }, items: [ { type: 'custom-FreeSewingNavbarItem', position: 'left', id: 'designs' }, { type: 'custom-FreeSewingNavbarItem', position: 'left', id: 'docs' }, { type: 'custom-FreeSewingNavbarItem', position: 'left', id: 'showcase' }, { type: 'custom-FreeSewingNavbarItem', position: 'left', id: 'blog' }, { type: 'custom-FreeSewingNavbarItem', position: 'left', id: 'forum' }, { type: 'custom-FreeSewingNavbarItem', position: 'right', id: 'account' }, ], }, footer: { style: 'light', links: [ { title: 'Sections', items: [ { label: 'FreeSewing Designs', to: '/designs/' }, { label: 'FreeSewing Showcase', to: '/showcase/' }, { label: 'FreeSewing Blog', to: '/blog/' }, { label: 'FreeSewing Editor', to: '/editor/' }, { label: 'Curated Measurements Sets', to: '/curated-sets/' }, ], }, { title: 'Help & Support', items: [ { label: 'About FreeSewing', to: '/docs/about/' }, { label: 'Getting Started', to: '/docs/about/guide/' }, { label: 'Frequently Asked Questions', href: '/docs/about/faq/' }, { label: 'Documentation', href: '/docs/' }, { label: 'Need Help?', href: '/support' }, ], }, { title: 'More', items: [ { label: 'FreeSewing.eu', to: 'https://freesewing.eu/' }, { label: 'FreeSewing.dev', to: 'https://freesewing.dev/' }, { label: 'FreeSewing.social', to: 'https://freesewing.social/' }, { label: 'Code on Codeberg', to: 'https://codeberg.org/freesewing/freesewing' }, { label: 'FreeSewing Revenue Pledge 💜', href: '/docs/about/pledge/' }, ], }, ], copyright: `FreeSewing is brought to you by Joost De Cock and contributors with the financial support of our patrons`, }, prism: { theme: prismThemes.dracula, darkTheme: prismThemes.dracula, }, }, } export default config