Typed Sass Styling (#69)

* Addresses issue #16 -
Add styles via sass and module imports
Adds typed scss imports via gatsby-plugin-sass.
Makes use of .d.scss file generated by gatsby-plugin-scss-typescript,
but avoids importing that directly while they work out issue in gatsby v3.

* adding vscode config for easier local debugging
This commit is contained in:
Nat Hillard 2021-05-20 23:59:20 -04:00 committed by GitHub
parent 13a4e5f47a
commit a587482967
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 1334 additions and 1788 deletions

34
client/.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,34 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Debug Chrome",
"url": "http://localhost:8000",
"webRoot": "${workspaceFolder}"
},
{
"name": "Gatsby develop",
"type": "node",
"request": "launch",
"protocol": "inspector",
"program": "${workspaceRoot}/node_modules/gatsby/dist/bin/gatsby",
"args": ["develop"],
"stopOnEntry": false,
"runtimeArgs": ["--nolazy"],
"sourceMaps": false
},
{
"name": "Gatsby build",
"type": "node",
"request": "launch",
"protocol": "inspector",
"program": "${workspaceRoot}/node_modules/gatsby/dist/bin/gatsby",
"args": ["build"],
"stopOnEntry": false,
"runtimeArgs": ["--nolazy"],
"sourceMaps": false
}
]
}

View file

@ -12,5 +12,14 @@ module.exports = {
siteMetadata: { siteMetadata: {
title: "Justice40", title: "Justice40",
}, },
plugins: ['gatsby-plugin-scss-typescript'], plugins: [{
resolve: 'gatsby-plugin-sass',
options: {
cssLoaderOptions: {
modules: {
exportLocalsConvention: 'camelCaseOnly'
}
}
}
},],
}; };

View file

@ -1,7 +1,12 @@
path = require('path');
// Disable references to window from trussworks/uswds // Disable references to window from trussworks/uswds
// See here: https://www.gatsbyjs.com/docs/debugging-html-builds/#fixing-third-party-modules // See here: https://www.gatsbyjs.com/docs/debugging-html-builds/#fixing-third-party-modules
exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => { exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
if (stage === "build-html" || stage === "develop-html") { actions.setWebpackConfig({
devtool: 'eval-source-map',
});
if (stage === "build-html" || stage === "develop-html") {
actions.setWebpackConfig({ actions.setWebpackConfig({
module: { module: {
rules: [ rules: [
@ -11,6 +16,9 @@ exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
}, },
], ],
}, },
resolve: {
modules: [path.resolve(__dirname, "src"), "node_modules"],
},
}) })
} }
} }

2958
client/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -19,8 +19,9 @@
"@types/react": "^17.0.1", "@types/react": "^17.0.1",
"@types/react-dom": "^17.0.1", "@types/react-dom": "^17.0.1",
"gatsby-cli": "^3.5.0", "gatsby-cli": "^3.5.0",
"gatsby-plugin-scss-typescript": "^5.1.0", "gatsby-plugin-sass": "^4.5.0",
"sass": "^1.32.13" "sass": "^1.33.0",
"sass-loader": "^11.1.1"
}, },
"dependencies": { "dependencies": {
"@trussworks/react-uswds": "^1.17.0", "@trussworks/react-uswds": "^1.17.0",

View file

@ -0,0 +1,17 @@
import React from 'react';
import { Footer } from '@trussworks/react-uswds';
import {Link} from 'gatsby';
const footerLinks = [
<Link to="/">Home</Link>
];
const J40Footer = () => {
return (
<>
<Footer primary={[]} secondary={footerLinks} />
</>
);
};
export default J40Footer;

View file

@ -0,0 +1,32 @@
import React from 'react';
import { GovBanner, Header, Title, PrimaryNav } from '@trussworks/react-uswds';
import { useStaticQuery, graphql, Link } from "gatsby";
const headerLinks = [
<Link to="/">Home</Link>
];
const J40Header = () => {
const data: any = useStaticQuery(graphql`
query MyQuery {
site {
siteMetadata {
title
}
}
}
`)
const siteTitle: string = data.site.siteMetadata?.title || `Title`
return (
<>
<GovBanner />
<Header>
<Title>{siteTitle}</Title>
<PrimaryNav items={headerLinks}/>
</Header>
</>
);
};
export default J40Header;

View file

@ -0,0 +1,9 @@
.site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.site-content {
flex: 1;
}

View file

@ -0,0 +1,13 @@
declare namespace LayoutModuleScssNamespace {
export interface ILayoutModuleScss {
site: string;
siteContent: string;
}
}
declare const LayoutModuleScssModule: LayoutModuleScssNamespace.ILayoutModuleScss & {
/** WARNING: Only available when `css-loader` is used without `style-loader` or `mini-css-extract-plugin` */
locals: LayoutModuleScssNamespace.ILayoutModuleScss;
};
export = LayoutModuleScssModule;

View file

@ -0,0 +1,19 @@
import React, { ReactNode } from "react";
import * as styles from './layout.module.scss';
import J40Header from './J40Header';
import J40Footer from "./J40Footer";
interface ILayoutProps {
children: ReactNode
}
const Layout = ({ children }: ILayoutProps) => {
return (
<div className={styles.site}>
<J40Header />
<div className={styles.siteContent}>{children}</div>
<J40Footer />
</div>
);
};
export default Layout;

View file

@ -1,15 +1,11 @@
import * as React from "react" import * as React from "react"
import {GovBanner} from '@trussworks/react-uswds'; import Layout from '../components/layout';
// markup // markup
const IndexPage = () => { export default function IndexPage() {
return ( return (
<main> <Layout>
<GovBanner />
<title>Justice40</title> <title>Justice40</title>
<h1>Justice40</h1> </Layout>
</main>
) )
} }
export default IndexPage;