@shopify/create-hydrogen 0.1.3 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/bin/run.cmd +3 -0
  3. package/bin/run.js +5 -0
  4. package/dist/commands/init.js +76390 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/index.js +21 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +56 -14
  9. package/templates/template-hydrogen/.devcontainer/devcontainer.json +18 -0
  10. package/templates/template-hydrogen/.eslintrc.js +3 -0
  11. package/templates/template-hydrogen/.gitignore +7 -0
  12. package/templates/template-hydrogen/.stackblitzrc +4 -0
  13. package/{template-hydrogen → templates/template-hydrogen}/.stylelintrc.js +1 -1
  14. package/templates/template-hydrogen/.vscode/extensions.json +8 -0
  15. package/templates/template-hydrogen/Dockerfile +15 -0
  16. package/{template-hydrogen → templates/template-hydrogen}/README.md +11 -2
  17. package/{template-hydrogen → templates/template-hydrogen}/_gitignore +0 -0
  18. package/templates/template-hydrogen/index.html +20 -0
  19. package/{template-hydrogen → templates/template-hydrogen}/package.json +20 -15
  20. package/{template-hydrogen → templates/template-hydrogen}/postcss.config.js +0 -0
  21. package/{template-hydrogen/src → templates/template-hydrogen/public}/favicon.svg +0 -0
  22. package/{template-hydrogen → templates/template-hydrogen}/server.js +4 -2
  23. package/{template-hydrogen → templates/template-hydrogen}/shopify.config.js +1 -2
  24. package/templates/template-hydrogen/src/App.client.jsx +8 -0
  25. package/templates/template-hydrogen/src/App.server.jsx +27 -0
  26. package/templates/template-hydrogen/src/components/Button.client.jsx +65 -0
  27. package/templates/template-hydrogen/src/components/Cart.client.jsx +265 -0
  28. package/templates/template-hydrogen/src/components/CartIcon.jsx +33 -0
  29. package/templates/template-hydrogen/src/components/CartIconWithItems.client.jsx +28 -0
  30. package/templates/template-hydrogen/src/components/CartProvider.client.jsx +35 -0
  31. package/templates/template-hydrogen/src/components/CartToggle.client.jsx +30 -0
  32. package/templates/template-hydrogen/src/components/CartUIProvider.client.jsx +45 -0
  33. package/templates/template-hydrogen/src/components/CountrySelector.client.jsx +116 -0
  34. package/templates/template-hydrogen/src/components/DefaultSeo.server.jsx +35 -0
  35. package/templates/template-hydrogen/src/components/FeaturedCollection.jsx +26 -0
  36. package/templates/template-hydrogen/src/components/Footer.server.jsx +103 -0
  37. package/templates/template-hydrogen/src/components/Gallery.client.jsx +65 -0
  38. package/templates/template-hydrogen/src/components/Header.client.jsx +62 -0
  39. package/templates/template-hydrogen/src/components/Layout.server.jsx +87 -0
  40. package/templates/template-hydrogen/src/components/LoadMoreProducts.client.jsx +56 -0
  41. package/templates/template-hydrogen/src/components/LoadingFallback.jsx +26 -0
  42. package/templates/template-hydrogen/src/components/MobileCountrySelector.client.jsx +64 -0
  43. package/templates/template-hydrogen/src/components/MobileNavigation.client.jsx +98 -0
  44. package/templates/template-hydrogen/src/components/MoneyCompareAtPrice.client.jsx +14 -0
  45. package/templates/template-hydrogen/src/components/MoneyPrice.client.jsx +15 -0
  46. package/templates/template-hydrogen/src/components/Navigation.client.jsx +23 -0
  47. package/templates/template-hydrogen/src/components/NotFound.server.jsx +93 -0
  48. package/templates/template-hydrogen/src/components/OpenIcon.jsx +33 -0
  49. package/templates/template-hydrogen/src/components/ProductCard.jsx +50 -0
  50. package/templates/template-hydrogen/src/components/ProductDetails.client.jsx +242 -0
  51. package/{template-hydrogen → templates/template-hydrogen}/src/components/ProductOptions.client.jsx +7 -4
  52. package/templates/template-hydrogen/src/components/Welcome.server.jsx +188 -0
  53. package/templates/template-hydrogen/src/entry-client.jsx +7 -0
  54. package/templates/template-hydrogen/src/entry-server.jsx +6 -0
  55. package/{template-hydrogen → templates/template-hydrogen}/src/index.css +31 -0
  56. package/templates/template-hydrogen/src/pages/collections/[handle].server.jsx +105 -0
  57. package/templates/template-hydrogen/src/pages/index.server.jsx +237 -0
  58. package/{template-hydrogen → templates/template-hydrogen}/src/pages/pages/[handle].server.jsx +14 -5
  59. package/templates/template-hydrogen/src/pages/products/[handle].server.jsx +69 -0
  60. package/templates/template-hydrogen/src/pages/redirect.server.jsx +4 -0
  61. package/templates/template-hydrogen/src/pages/robots.txt.server.js +10 -0
  62. package/{template-hydrogen → templates/template-hydrogen}/src/pages/sitemap.xml.server.jsx +2 -2
  63. package/templates/template-hydrogen/tailwind.config.js +26 -0
  64. package/{template-hydrogen → templates/template-hydrogen}/vite.config.js +1 -0
  65. package/{template-hydrogen → templates/template-hydrogen}/worker.js +1 -0
  66. package/index.js +0 -201
  67. package/scripts/tmp-copy-template-from-dev.js +0 -21
  68. package/scripts/utils.js +0 -29
  69. package/template-hydrogen/.eslintrc.js +0 -41
  70. package/template-hydrogen/.vscode/extensions.json +0 -3
  71. package/template-hydrogen/Dockerfile +0 -15
  72. package/template-hydrogen/index.html +0 -14
  73. package/template-hydrogen/src/App.server.jsx +0 -42
  74. package/template-hydrogen/src/components/Cart.client.jsx +0 -288
  75. package/template-hydrogen/src/components/CartProvider.client.jsx +0 -15
  76. package/template-hydrogen/src/components/DefaultSeo.server.jsx +0 -22
  77. package/template-hydrogen/src/components/Footer.jsx +0 -12
  78. package/template-hydrogen/src/components/Gallery.client.jsx +0 -36
  79. package/template-hydrogen/src/components/Header.client.jsx +0 -46
  80. package/template-hydrogen/src/components/HightlightedProduct.client.jsx +0 -54
  81. package/template-hydrogen/src/components/Layout.client.jsx +0 -61
  82. package/template-hydrogen/src/components/MediaPlaceholder.jsx +0 -21
  83. package/template-hydrogen/src/components/NotFound.server.jsx +0 -104
  84. package/template-hydrogen/src/components/ProductCard.client.jsx +0 -39
  85. package/template-hydrogen/src/components/ProductDetails.client.jsx +0 -184
  86. package/template-hydrogen/src/components/Seo.client.jsx +0 -75
  87. package/template-hydrogen/src/entry-client.jsx +0 -12
  88. package/template-hydrogen/src/entry-server.jsx +0 -7
  89. package/template-hydrogen/src/pages/Index.server.jsx +0 -197
  90. package/template-hydrogen/src/pages/blogs/[handle]/[articleHandle].server.jsx +0 -49
  91. package/template-hydrogen/src/pages/blogs/[handle].server.jsx +0 -76
  92. package/template-hydrogen/src/pages/collections/[handle].server.jsx +0 -69
  93. package/template-hydrogen/src/pages/products/[handle].server.jsx +0 -60
  94. package/template-hydrogen/src/pages/search.server.jsx +0 -107
  95. package/template-hydrogen/tailwind.config.js +0 -9
@@ -1,197 +0,0 @@
1
- import {
2
- useShopQuery,
3
- flattenConnection,
4
- ProductProviderFragment,
5
- } from '@shopify/hydrogen';
6
- import gql from 'graphql-tag';
7
-
8
- import HighlightedProduct from '../components/HightlightedProduct.client';
9
- import Layout from '../components/Layout.client';
10
- import ProductCard from '../components/ProductCard.client';
11
- import MediaPlaceholder from '../components/MediaPlaceholder';
12
-
13
- export default function Index() {
14
- const {data} = useShopQuery({
15
- query: QUERY,
16
- variables: {
17
- numProducts: 3,
18
- numProductMetafields: 0,
19
- numProductVariants: 250,
20
- numProductMedia: 1,
21
- numProductVariantMetafields: 10,
22
- numProductVariantSellingPlanAllocations: 10,
23
- numProductSellingPlanGroups: 10,
24
- },
25
- });
26
-
27
- const products = data ? flattenConnection(data.products) : [];
28
-
29
- return (
30
- <Layout>
31
- <div className="z-0 gradient w-screen h-screen top-0 left-0 right-0 fixed" />
32
- <div className="z-5 relative space-y-16">
33
- <section className="md:px-4 pt-10 pb-4">
34
- <HydrogenGettingStarted />
35
- </section>
36
-
37
- <section className="space-y-6 md:space-y-0 md:grid grid-cols-3 gap-10">
38
- <div>
39
- <CommerceReadyComponents />
40
- </div>
41
- <div className="col-span-2 md:flex shadow-xl p-4 md:p-6 rounded-md bg-white">
42
- {products[0] ? (
43
- <HighlightedProduct product={products[0]} />
44
- ) : (
45
- <MediaPlaceholder text="Your product here" />
46
- )}
47
- </div>
48
- </section>
49
-
50
- <section className="space-y-6 md:space-y-0 md:grid grid-cols-3 gap-10 flex flex-col-reverse">
51
- {products.length > 2 && (
52
- <div className="col-span-2 md:flex shadow-xl p-4 md:p-6 rounded-md space-y-6 md:space-y-0 md:space-x-6 bg-white">
53
- {[products[1], products[2]].map((product) => {
54
- return (
55
- <div key={product.id}>
56
- <ProductCard product={product} />
57
- </div>
58
- );
59
- })}
60
- </div>
61
- )}
62
- <div>
63
- <StyleWithTailwind />
64
- </div>
65
- </section>
66
- </div>
67
- </Layout>
68
- );
69
- }
70
-
71
- function HydrogenGettingStarted() {
72
- const links = [
73
- {
74
- text: 'Browse Hydrogen documentation',
75
- url: 'https://shopify.dev/beta/hydrogen/',
76
- },
77
- {
78
- text: 'Open the GraphiQL editor',
79
- url: '/graphiql',
80
- },
81
- {
82
- text: 'Explore starter templates',
83
- url: '/',
84
- },
85
- ];
86
-
87
- return (
88
- <>
89
- <h2 className="text-4xl md:text-7xl font-extrabold text-center">
90
- Hello, Hydrogen
91
- </h2>
92
-
93
- <p className="text-xl text-center mt-4 mb-8">
94
- Welcome to your custom storefront. Let‘s get building.
95
- </p>
96
-
97
- <ul className="md:flex justify-center gap-5 space-y-4 md:space-y-0">
98
- {links.map((link) => (
99
- <li key={link.url}>
100
- <a
101
- href={link.url}
102
- className="rounded-full bg-white px-4 py-2 bg-opacity-80 flex items-center gap-2"
103
- >
104
- {link.text}
105
- <svg
106
- width="7"
107
- height="13"
108
- viewBox="0 0 7 13"
109
- fill="none"
110
- xmlns="http://www.w3.org/2000/svg"
111
- >
112
- <path
113
- d="M1 1.5L6 6.5L1 11.5"
114
- stroke="currentColor"
115
- strokeWidth="2"
116
- strokeLinecap="round"
117
- strokeLinejoin="round"
118
- />
119
- </svg>
120
- </a>
121
- </li>
122
- ))}
123
- </ul>
124
- </>
125
- );
126
- }
127
-
128
- function CommerceReadyComponents() {
129
- return (
130
- <>
131
- <h2 className="font-bold text-3xl">Commerce-ready components</h2>
132
- <p className="text-xl leading-8 mt-2 mb-4">
133
- Hydrogen includes the most common components for commerce, powered by
134
- your Shopify custom storefront. They&apos;re accessible, performant, and
135
- ready for implementation.
136
- </p>
137
- <a
138
- className="text-blue-500 text-xl flex items-center gap-1"
139
- href="https://shopify.dev/beta/hydrogen/"
140
- >
141
- Browse components
142
- <svg
143
- xmlns="http://www.w3.org/2000/svg"
144
- className="h-5 w-5"
145
- viewBox="0 0 20 20"
146
- fill="currentColor"
147
- >
148
- <path
149
- fillRule="evenodd"
150
- d="M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z"
151
- clipRule="evenodd"
152
- />
153
- </svg>
154
- </a>
155
- </>
156
- );
157
- }
158
-
159
- function StyleWithTailwind() {
160
- return (
161
- <>
162
- <h2 className="font-bold text-3xl">
163
- Style with Tailwind or roll your own
164
- </h2>
165
- <p className="text-xl leading-8 mt-2 mb-4">
166
- Hydrogen starter templates are styled using the flexible{' '}
167
- <a className="text-blue-500" href="https://www.tailwindcss.com">
168
- Tailwind CSS
169
- </a>{' '}
170
- framework. Start building with Tailwind&apos;s library or choose your
171
- own styling - it&apos;s up to you.
172
- </p>
173
- </>
174
- );
175
- }
176
-
177
- const QUERY = gql`
178
- query indexContent(
179
- $numProducts: Int!
180
- $numProductMetafields: Int!
181
- $numProductVariants: Int!
182
- $numProductMedia: Int!
183
- $numProductVariantMetafields: Int!
184
- $numProductVariantSellingPlanAllocations: Int!
185
- $numProductSellingPlanGroups: Int!
186
- ) {
187
- products(first: $numProducts) {
188
- edges {
189
- node {
190
- ...ProductProviderFragment
191
- }
192
- }
193
- }
194
- }
195
-
196
- ${ProductProviderFragment}
197
- `;
@@ -1,49 +0,0 @@
1
- import {RawHtml, useShopQuery} from '@shopify/hydrogen';
2
- import {useParams} from 'react-router-dom';
3
- import gql from 'graphql-tag';
4
-
5
- import Layout from '../../../components/Layout.client';
6
-
7
- export default function Article() {
8
- const {handle, articleHandle} = useParams();
9
- const {data} = useShopQuery({
10
- query: QUERY,
11
- variables: {handle, articleHandle},
12
- });
13
-
14
- const article = data.blogByHandle.articleByHandle;
15
-
16
- return (
17
- <Layout>
18
- <section className="my-8 px-4 pt-10 pb-4 text-white">
19
- <h1 className="text-7xl mb-4 font-semibold tracking-tight">
20
- {article.title}
21
- </h1>
22
- </section>
23
-
24
- <section className="my-8 bg-white rounded-3xl p-10 sticky shadow-2xl">
25
- <p className="font-medium mt-1">
26
- Published {new Date(article.publishedAt).toLocaleDateString()} by{' '}
27
- {article.author.name}
28
- </p>
29
-
30
- <RawHtml string={article.contentHtml} className="prose mt-8" />
31
- </section>
32
- </Layout>
33
- );
34
- }
35
-
36
- const QUERY = gql`
37
- query ArticleDetails($handle: String!, $articleHandle: String!) {
38
- blogByHandle(handle: $handle) {
39
- articleByHandle(handle: $articleHandle) {
40
- title
41
- contentHtml
42
- publishedAt
43
- author: authorV2 {
44
- name
45
- }
46
- }
47
- }
48
- }
49
- `;
@@ -1,76 +0,0 @@
1
- import {useParams} from 'react-router-dom';
2
- import {useShopQuery, RawHtml, Link} from '@shopify/hydrogen';
3
- import gql from 'graphql-tag';
4
-
5
- import Layout from '../../components/Layout.client';
6
-
7
- export default function Blog() {
8
- const {handle} = useParams();
9
- const {data} = useShopQuery({query: QUERY, variables: {handle}});
10
-
11
- const blog = data.blogByHandle;
12
-
13
- return (
14
- <Layout>
15
- <div className="relative">
16
- <section className="my-8 px-4 pt-10 pb-4 text-white">
17
- <h1 className="text-7xl mb-4 font-semibold tracking-tight">
18
- {blog.title}
19
- </h1>
20
- </section>
21
-
22
- <section className="my-8 px-4 pb-4">
23
- <ul className="space-y-12 mt-8">
24
- {blog.articles.edges.map((edge) => {
25
- const article = edge.node;
26
- return (
27
- <li
28
- key={article.id}
29
- className="p-5 rounded-3xl overflow-hidden shadow-2xl bg-white bg-opacity-70"
30
- >
31
- <h2 className="text-xl font-medium">
32
- <Link to={`/blogs/${handle}/${article.handle}`}>
33
- {article.title}
34
- </Link>
35
- </h2>
36
- <p className="font-medium mt-1">
37
- Published on{' '}
38
- {new Date(article.publishedAt).toLocaleDateString()} by{' '}
39
- {article.author.name}
40
- </p>
41
-
42
- <RawHtml
43
- string={article.contentHtml}
44
- className="mt-2 prose"
45
- />
46
- </li>
47
- );
48
- })}
49
- </ul>
50
- </section>
51
- </div>
52
- </Layout>
53
- );
54
- }
55
-
56
- const QUERY = gql`
57
- query BlogDetails($handle: String!) {
58
- blogByHandle(handle: $handle) {
59
- title
60
- articles(first: 10) {
61
- edges {
62
- node {
63
- id
64
- title
65
- handle
66
- publishedAt
67
- contentHtml
68
- author {
69
- name
70
- }
71
- }
72
- }
73
- }
74
- }
75
- }
76
- `;
@@ -1,69 +0,0 @@
1
- import {MediaFile, useShopQuery} from '@shopify/hydrogen';
2
- import {useParams} from 'react-router-dom';
3
- import gql from 'graphql-tag';
4
-
5
- import Layout from '../../components/Layout.client';
6
- import ProductCard from '../../components/ProductCard.client';
7
-
8
- export default function Collection() {
9
- const {handle} = useParams();
10
- const {data} = useShopQuery({query: QUERY, variables: {handle}});
11
-
12
- const collection = data.collectionByHandle;
13
-
14
- return (
15
- <Layout>
16
- <h1 className="text-2xl font-bold">{collection.title}</h1>
17
-
18
- <ul className="grid lg:grid-cols-3 gap-6 mt-4">
19
- {collection.products.edges.map((edge) => (
20
- <li key={edge.node.id}>
21
- <ProductCard product={edge.node} />
22
- </li>
23
- ))}
24
- </ul>
25
- </Layout>
26
- );
27
- }
28
-
29
- const QUERY = gql`
30
- fragment CollectionProductDetails on Product {
31
- id
32
- title
33
- handle
34
- priceRange {
35
- maxVariantPrice {
36
- amount
37
- currencyCode
38
- }
39
- minVariantPrice {
40
- amount
41
- currencyCode
42
- }
43
- }
44
- media(first: 1) {
45
- edges {
46
- node {
47
- ...MediaFileFragment
48
- }
49
- }
50
- }
51
- }
52
-
53
- query CollectionDetails($handle: String!) {
54
- collectionByHandle(handle: $handle) {
55
- id
56
- title
57
-
58
- products(first: 10) {
59
- edges {
60
- node {
61
- ...CollectionProductDetails
62
- }
63
- }
64
- }
65
- }
66
- }
67
-
68
- ${MediaFile.Fragment}
69
- `;
@@ -1,60 +0,0 @@
1
- import {useShopQuery, ProductProviderFragment} from '@shopify/hydrogen';
2
- import {useParams} from 'react-router-dom';
3
- import gql from 'graphql-tag';
4
-
5
- import ProductDetails from '../../components/ProductDetails.client';
6
- import NotFound from '../../components/NotFound.server';
7
-
8
- export default function Product() {
9
- const {handle} = useParams();
10
-
11
- const {data} = useShopQuery({
12
- query: QUERY,
13
- variables: {
14
- handle,
15
- numProductMetafields: 10,
16
- numProductVariants: 250,
17
- numProductMedia: 6,
18
- numProductVariantMetafields: 10,
19
- numProductVariantSellingPlanAllocations: 10,
20
- numProductSellingPlanGroups: 10,
21
- },
22
- });
23
-
24
- if (!data.product) {
25
- return <NotFound />;
26
- }
27
-
28
- return <ProductDetails data={data} />;
29
- }
30
-
31
- const QUERY = gql`
32
- query product(
33
- $handle: String!
34
- $numProductMetafields: Int!
35
- $numProductVariants: Int!
36
- $numProductMedia: Int!
37
- $numProductVariantMetafields: Int!
38
- $numProductVariantSellingPlanAllocations: Int!
39
- $numProductSellingPlanGroups: Int!
40
- ) {
41
- product: product(handle: $handle) {
42
- id
43
- vendor
44
- seo {
45
- title
46
- description
47
- }
48
- images(first: 1) {
49
- edges {
50
- node {
51
- originalSrc
52
- }
53
- }
54
- }
55
- ...ProductProviderFragment
56
- }
57
- }
58
-
59
- ${ProductProviderFragment}
60
- `;
@@ -1,107 +0,0 @@
1
- import {useEffect, useMemo, useState} from 'react';
2
- import {useHistory, useLocation} from 'react-router-dom';
3
- import {useShopQuery, MediaFile} from '@shopify/hydrogen';
4
- import gql from 'graphql-tag';
5
-
6
- import Layout from '../components/Layout.client';
7
- import ProductCard from '../components/ProductCard.client';
8
-
9
- /**
10
- * TODO: Refactor to a true server component.
11
- */
12
- export default function Search() {
13
- const {search} = useLocation();
14
- const originalQuery = useMemo(
15
- () => new URLSearchParams(search).get('query'),
16
- [search],
17
- );
18
- const history = useHistory();
19
- const [query, setQuery] = useState(originalQuery);
20
- const [newQuery, setNewQuery] = useState(query);
21
-
22
- useEffect(() => {
23
- if (originalQuery) {
24
- setQuery(originalQuery);
25
- }
26
- }, [originalQuery]);
27
-
28
- return (
29
- <Layout>
30
- <h1 className="text-2xl font-bold">Search</h1>
31
- <form
32
- onSubmit={(event) => {
33
- event.preventDefault();
34
- setQuery(newQuery);
35
- history.push(`/search?query=${newQuery}`);
36
- }}
37
- className="mt-4 space-x-2"
38
- >
39
- <label htmlFor="search">Search Products:</label>
40
- <input
41
- autocomplete="off"
42
- name="search"
43
- id="search"
44
- type="search"
45
- value={newQuery}
46
- onChange={(event) => setNewQuery(event.target.value)}
47
- className="p-1"
48
- />
49
- <button type="submit" className="bg-black text-white font-bold p-1">
50
- Search
51
- </button>
52
- </form>
53
- {query && <SearchResults query={query} />}
54
- </Layout>
55
- );
56
- }
57
-
58
- function SearchResults({query}) {
59
- const {data, fetching} = useShopQuery({query: QUERY, variables: {query}});
60
-
61
- if (fetching) return <p>Loading...</p>;
62
-
63
- return (
64
- <>
65
- <h2 className="text-xl font-medium mt-8">Search results for: {query}</h2>
66
-
67
- {data.products.edges.length ? (
68
- <ul className="grid lg:grid-cols-3 gap-6 mt-4">
69
- {data.products.edges.map((edge) => (
70
- <li key={edge.node.id}>
71
- <ProductCard product={edge.node} />
72
- </li>
73
- ))}
74
- </ul>
75
- ) : (
76
- <p>No results found.</p>
77
- )}
78
- </>
79
- );
80
- }
81
-
82
- const QUERY = gql`
83
- fragment SearchProductDetails on Product {
84
- id
85
- title
86
- handle
87
- media(first: 1) {
88
- edges {
89
- node {
90
- ...MediaFileFragment
91
- }
92
- }
93
- }
94
- }
95
-
96
- query ProductSearch($query: String!) {
97
- products(query: $query, first: 10) {
98
- edges {
99
- node {
100
- ...SearchProductDetails
101
- }
102
- }
103
- }
104
- }
105
-
106
- ${MediaFile.Fragment}
107
- `;
@@ -1,9 +0,0 @@
1
- module.exports = {
2
- purge: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
3
- mode: 'jit',
4
- darkMode: false, // or 'media' or 'class'
5
- variants: {
6
- extend: {},
7
- },
8
- plugins: [require('@tailwindcss/typography')],
9
- };