DinisCruz commited on
Commit
f8a007d
·
1 Parent(s): 2b51f09

added first version of docusaurus website , including GH action

Browse files
.github/workflows/deploy.yml ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #file: noinspection YAMLSchemaValidation
2
+ name: Deploy to GitHub Pages
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - main
8
+
9
+ jobs:
10
+ deploy:
11
+ name: Deploy to GitHub Pages
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v3
15
+ - uses: actions/setup-node@v3
16
+ with:
17
+ node-version: 18
18
+ cache: yarn
19
+
20
+ - name: Install dependencies
21
+ run:
22
+ - cd website/code
23
+ - yarn install --frozen-lockfile
24
+ - name: Build website
25
+ run:
26
+ - cd website/code
27
+ - yarn build
28
+
29
+ - name: Deploy to GitHub Pages
30
+ uses: peaceiris/actions-gh-pages@v3
31
+ with:
32
+ github_token: ${{ secrets.GITHUB_TOKEN }}
33
+ publish_dir: ./build
34
+ user_name: github-actions[bot]
35
+ user_email: 41898282+github-actions[bot]@users.noreply.github.com
.gitignore CHANGED
@@ -158,3 +158,4 @@ cython_debug/
158
  # and can be added to the global gitignore or merged into this file. For a more nuclear
159
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
  #.idea/
 
 
158
  # and can be added to the global gitignore or merged into this file. For a more nuclear
159
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
  #.idea/
161
+ website/code/.docusaurus
website/code/docs/getting-started.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ sidebar_position: 1
3
+ ---
4
+
5
+
6
+ # The Cyber Board Roam (docs getting started page)
7
+
8
+ Welcome to the Cyber Board Room website
9
+
website/code/docusaurus.config.js ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // @ts-check
2
+ // Note: type annotations allow type checking and IDEs autocompletion
3
+
4
+ const lightCodeTheme = require('prism-react-renderer/themes/github');
5
+
6
+ /** @type {import('@docusaurus/types').Config} */
7
+ const config = {
8
+ title: 'The Cyber Board Room',
9
+ tagline: 'CBR',
10
+ favicon: 'img/favicon.ico',
11
+
12
+ url: 'https://tbd',
13
+ baseUrl: '/the-cbr/cbr-athena/',
14
+
15
+ onBrokenLinks: 'throw',
16
+ onBrokenMarkdownLinks: 'warn',
17
+
18
+ i18n: {
19
+ defaultLocale: 'en',
20
+ locales: ['en'],
21
+ },
22
+
23
+ presets: [
24
+ [
25
+ 'classic',
26
+ /** @type {import('@docusaurus/preset-classic').Options} */
27
+ ({
28
+ docs: {
29
+ sidebarPath: require.resolve('./sidebars.js'),
30
+ },
31
+ theme: {
32
+ customCss: [
33
+ require.resolve("./src/css/custom.css"),
34
+ require.resolve("antd/dist/antd.css"),
35
+ ],
36
+ },
37
+ }),
38
+ ],
39
+ ],
40
+
41
+ themeConfig:
42
+ /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
43
+ ({
44
+ colorMode: {
45
+ defaultMode: "light",
46
+ disableSwitch: true,
47
+ respectPrefersColorScheme: false,
48
+ },
49
+ navbar: {
50
+ title: 'The CBR',
51
+ logo: {
52
+ alt: 'The Cyber Board Room',
53
+ src: 'img/cbr-logo.jpg',
54
+ },
55
+ items: [
56
+ {
57
+ type: 'doc',
58
+ docId: 'getting-started',
59
+ position: 'left',
60
+ label: 'Docs',
61
+ },
62
+ ],
63
+ },
64
+ footer: {
65
+ style: 'dark',
66
+
67
+ copyright: `Copyright © ${new Date().getFullYear()} The Cyber Board Room`,
68
+ },
69
+ prism: {
70
+ theme: lightCodeTheme,
71
+ },
72
+ }),
73
+ };
74
+
75
+ module.exports = config;
website/code/package.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "website",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "docusaurus": "docusaurus",
7
+ "start": "docusaurus start",
8
+ "build": "docusaurus build",
9
+ "swizzle": "docusaurus swizzle",
10
+ "deploy": "docusaurus deploy",
11
+ "clear": "docusaurus clear",
12
+ "serve": "docusaurus serve",
13
+ "write-translations": "docusaurus write-translations",
14
+ "write-heading-ids": "docusaurus write-heading-ids"
15
+ },
16
+ "dependencies": {
17
+ "@ant-design/icons": "^4.7.0",
18
+ "@cmfcmf/docusaurus-search-local": "^0.11.0",
19
+ "@docusaurus/core": "2.3.1",
20
+ "@docusaurus/preset-classic": "2.3.1",
21
+ "@mdx-js/react": "^1.6.22",
22
+ "antd": "^4.23.6",
23
+ "clsx": "^1.2.1",
24
+ "param-case": "^3.0.4",
25
+ "prism-react-renderer": "^1.3.5",
26
+ "react": "^17.0.2",
27
+ "react-dom": "^17.0.2"
28
+ },
29
+ "devDependencies": {
30
+ "@docusaurus/module-type-aliases": "2.3.1"
31
+ },
32
+ "browserslist": {
33
+ "production": [
34
+ ">0.5%",
35
+ "not dead",
36
+ "not op_mini all"
37
+ ],
38
+ "development": [
39
+ "last 1 chrome version",
40
+ "last 1 firefox version",
41
+ "last 1 safari version"
42
+ ]
43
+ },
44
+ "engines": {
45
+ "node": ">=16.14"
46
+ }
47
+ }
website/code/sidebars.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ // @ts-check
2
+
3
+ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
4
+ const sidebars = {
5
+ tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
6
+ };
7
+
8
+ module.exports = sidebars;
website/code/src/components/HomepageComponents.jsx ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { paramCase } from 'param-case';
3
+ import Link from '@docusaurus/Link';
4
+ import clsx from 'clsx';
5
+
6
+ export function HomepageSection({
7
+ id,
8
+ title,
9
+ children,
10
+ description,
11
+ className,
12
+ hasSubSections = false,
13
+ HeadingTag = 'h3',
14
+ }) {
15
+ return (
16
+ <div
17
+ className={clsx(
18
+ 'homepage-section',
19
+ hasSubSections && 'has-sub-sections',
20
+ className
21
+ )}
22
+ >
23
+ {title && <HeadingTag id={id ?? paramCase(title)}>{title}</HeadingTag>}
24
+ {description && <p className="section-description">{description}</p>}
25
+ <div className="section-content">{children}</div>
26
+ </div>
27
+ );
28
+ }
29
+
30
+ export function HomepageCard({ id, icon, title, description, to }) {
31
+ return (
32
+ <Link to={to} className="homepage-card">
33
+ {icon && <div className="icon">{icon}</div>}
34
+ <div className="card-content">
35
+ <div className="title" id={id && paramCase(title)}>
36
+ {title}
37
+ </div>
38
+ <div className="description">{description}</div>
39
+ </div>
40
+ </Link>
41
+ );
42
+ }
website/code/src/css/custom.css ADDED
@@ -0,0 +1,287 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Fonts */
2
+
3
+ @font-face {
4
+ font-family: Inter var;
5
+ font-weight: 100 900;
6
+ font-display: block;
7
+ font-style: normal;
8
+ font-named-instance: "Regular";
9
+ src: url(/static/fonts/Inter-roman.var.woff2) format("woff2");
10
+ }
11
+
12
+ @font-face {
13
+ font-family: Inter var;
14
+ font-weight: 100 900;
15
+ font-display: block;
16
+ font-style: italic;
17
+ font-named-instance: "Italic";
18
+ src: url(/static/fonts/Inter-italic.var.woff2) format("woff2");
19
+ }
20
+
21
+ @font-face {
22
+ font-family: Fira Code VF;
23
+ font-weight: 300 700;
24
+ font-style: normal;
25
+ src: url(/static/fonts/FiraCode-VF.woff2) format("woff2-variations"),
26
+ url(/static/fonts/FiraCode-VF.woff) format("woff-variations");
27
+ }
28
+
29
+ :root {
30
+ --ifm-color-primary: #2e8555;
31
+ --ifm-color-primary-dark: #29784c;
32
+ --ifm-color-primary-darker: #277148;
33
+ --ifm-color-primary-darkest: #205d3b;
34
+ --ifm-color-primary-light: #33925d;
35
+ --ifm-color-primary-lighter: #359962;
36
+ --ifm-color-primary-lightest: #3cad6e;
37
+ --ifm-code-font-size: 95%;
38
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
39
+ }
40
+
41
+ a {
42
+ color: #156cbd;
43
+ }
44
+
45
+ nav.navbar {
46
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
47
+ background-color: rgb(209, 227, 221);
48
+ }
49
+
50
+ pre.prism-code {
51
+ border: 1px solid rgba(0, 0, 0, 0.1);
52
+ }
53
+
54
+ .navbar__logo {
55
+ height: 26px;
56
+ }
57
+
58
+ .navbar__item,
59
+ .menu__link {
60
+ font-size: 16px;
61
+ }
62
+
63
+ .menu__link {
64
+ border-radius: 4px 0 0 4px;
65
+ }
66
+
67
+ .menu__list-item-collapsible:hover {
68
+ background: none;
69
+ }
70
+
71
+ ul.menu__list > li > a.menu__link--active {
72
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
73
+ }
74
+
75
+ nav.menu {
76
+ padding-right: 0;
77
+ scrollbar-gutter: auto;
78
+ }
79
+
80
+ img.cover-image {
81
+ display: block;
82
+ width: 100%;
83
+ max-width: 840px;
84
+ border-radius: 16px;
85
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
86
+ margin: 0 auto;
87
+ }
88
+
89
+ ul.emoji-list {
90
+ list-style-type: none;
91
+ padding-left: 12px;
92
+ }
93
+
94
+ ul.emoji-list li {
95
+ display: flex;
96
+ align-items: flex-start;
97
+ line-height: 32px;
98
+ }
99
+
100
+ ul.emoji-list span {
101
+ display: inline-block;
102
+ margin-right: 12px;
103
+ font-size: 28px;
104
+ }
105
+
106
+ /* Disables link hover decoration enabled by default in docusaurus v2.0.0-beta.22 */
107
+ .navbar__link,
108
+ .table-of-contents__link,
109
+ .pagination-nav,
110
+ .footer {
111
+ --ifm-link-hover-decoration: none;
112
+ }
113
+
114
+ table {
115
+ border-collapse: collapse;
116
+ border: none;
117
+ background-color: transparent;
118
+
119
+ text-align: left;
120
+ font-size: 90%;
121
+ }
122
+
123
+ /* Mobile breakpoint */
124
+ @media only screen and (max-width: 996px) {
125
+ :root {
126
+ --ifm-spacing-horizontal: 1rem;
127
+ }
128
+
129
+ .footer__row {
130
+ flex-direction: column;
131
+ }
132
+
133
+ .footer__data {
134
+ margin-bottom: 3rem;
135
+ }
136
+ }
137
+
138
+ /**
139
+ Image caption, use in markdown as:
140
+ ![Image ALT](./path/to/image)
141
+ _my image caption_
142
+ */
143
+ img + em {
144
+ text-align: center;
145
+ display: block;
146
+ margin-top: 1rem;
147
+ }
148
+
149
+ /**
150
+ Style for a terminal image, markdown usage (add #terminal to end of url):
151
+ ![Image ALT](./path/to/image#terminal)
152
+ */
153
+ img[src$="#terminal"] {
154
+ display: block;
155
+ max-width: 720px;
156
+ margin-left: auto;
157
+ margin-right: auto;
158
+ }
159
+
160
+ .pad {
161
+ padding: 0 1rem;
162
+ }
163
+
164
+ .center {
165
+ width: 100%;
166
+ max-width: 1080px;
167
+ margin: 1rem auto;
168
+ min-height: 400px;
169
+ }
170
+
171
+ .homepage-content {
172
+ padding-bottom: 6rem;
173
+ }
174
+
175
+ #hero {
176
+ padding: 2rem 0 1.5rem 0;
177
+ margin-bottom: 4rem;
178
+ border-bottom: 1px solid rgb(51, 51, 51);
179
+ }
180
+
181
+ #hero h2 {
182
+ font-size: 36px;
183
+ }
184
+
185
+ #hero p {
186
+ color: rgb(51, 51, 51);
187
+ }
188
+
189
+ .section-content {
190
+ display: grid;
191
+ grid-template-columns: repeat(3, minmax(0, 1fr));
192
+ gap: 12px;
193
+ }
194
+
195
+ .two-cols .section-content {
196
+ grid-template-columns: repeat(2, minmax(0, 1fr));
197
+ }
198
+
199
+ .has-sub-sections > h3 {
200
+ margin-bottom: 1.5rem;
201
+ }
202
+
203
+ .has-sub-sections > .section-content {
204
+ grid-template-columns: repeat(1, minmax(0, 1fr));
205
+ }
206
+ .has-sub-sections > .section-content > .homepage-section {
207
+ margin-bottom: 1rem;
208
+ grid-template-columns: repeat(1, minmax(0, 1fr));
209
+ }
210
+
211
+ .homepage-section {
212
+ margin-bottom: 3rem;
213
+ }
214
+
215
+ .homepage-section h3 {
216
+ font-weight: 600;
217
+ }
218
+
219
+ .section-description {
220
+ color: rgb(51, 51, 51);
221
+ margin: 0rem 0 1.25rem 0;
222
+ margin-top: -0.5rem;
223
+ }
224
+
225
+ .has-sub-sections > .section-content .section-description {
226
+ font-size: 14px;
227
+ }
228
+
229
+ .homepage-card {
230
+ display: flex;
231
+ flex-direction: column;
232
+ align-items: flex-start;
233
+ gap: 10px;
234
+ padding: 0.75rem;
235
+ text-decoration: none;
236
+ color: rgb(51, 51, 51);
237
+
238
+ --ifm-link-hover-decoration: none;
239
+ --ifm-link-hover-color: inherit;
240
+ cursor: pointer;
241
+
242
+ transition-property: background-color, color;
243
+
244
+ border: 1px solid #2e2e2e;
245
+ border-radius: 8px;
246
+ }
247
+
248
+ .homepage-card:hover {
249
+ background-color: #dee1f2;
250
+ }
251
+
252
+ .icon svg {
253
+ width: auto;
254
+ height: 100%;
255
+ }
256
+
257
+ .homepage-card .icon {
258
+ width: 48px;
259
+ height: 48px;
260
+ }
261
+
262
+ .card-content {
263
+ display: flex;
264
+ flex-direction: column;
265
+ gap: 4px;
266
+ }
267
+
268
+ .card-content .title {
269
+ font-size: 16px;
270
+ letter-spacing: -0.5px;
271
+ font-weight: 600;
272
+ }
273
+
274
+ .card-content .description {
275
+ font-size: 14px;
276
+ color: rgb(51, 51, 51);
277
+ line-height: 1.5;
278
+ }
279
+
280
+ @media screen and (max-width: 768px) {
281
+ .section-content {
282
+ grid-template-columns: repeat(1, minmax(0, 1fr));
283
+ }
284
+ .two-cols .section-content {
285
+ grid-template-columns: repeat(1, minmax(0, 1fr));
286
+ }
287
+ }
website/code/src/pages/index.jsx ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import Layout from "@theme/Layout";
3
+ import { useHistory } from "@docusaurus/router";
4
+ import { Button } from "antd";
5
+
6
+ import {
7
+ HomepageCard as Card,
8
+ HomepageSection as Section,
9
+ } from "../components/HomepageComponents";
10
+
11
+
12
+
13
+ export default function Homepage() {
14
+ const router = useHistory();
15
+ console.log("in Home page")
16
+
17
+ return (
18
+ <Layout description="CBR" wrapperClassName="homepage">
19
+ <div className="pad">
20
+ <div className="center homepage-content">
21
+ <div id="hero">
22
+ <h2>Cyber Board Room</h2>
23
+ <br />
24
+ <p>
25
+ CBR website
26
+ </p>
27
+ <br />
28
+ <Button
29
+ type="primary"
30
+ size="large"
31
+ shape="round"
32
+ onClick={() =>
33
+ router.push(
34
+ "/the-cbr/cbr-athena/docs/getting-started"
35
+ )
36
+ }
37
+ >
38
+ Start Reading &rarr;
39
+ </Button>
40
+ </div>
41
+
42
+ <Section title="Website areas">
43
+ <Card
44
+ title="Chat Bot"
45
+ description="Chat Bot."
46
+ to="/the-cbr/cbr-athena/docs/getting-started"
47
+ />
48
+ <Card
49
+ title="Guidance and docs"
50
+ description="Guidance and Docs"
51
+ to="/the-cbr/cbr-athena/docs/getting-started"
52
+ />
53
+ </Section>
54
+ </div>
55
+ </div>
56
+ </Layout>
57
+ );
58
+ }
website/code/static/.nojekyll ADDED
File without changes
website/code/static/fonts/FiraCode-VF.woff ADDED
Binary file (139 kB). View file
 
website/code/static/fonts/FiraCode-VF.woff2 ADDED
Binary file (113 kB). View file
 
website/code/static/fonts/Inter-italic.var.woff2 ADDED
Binary file (245 kB). View file
 
website/code/static/fonts/Inter-roman.var.woff2 ADDED
Binary file (227 kB). View file
 
website/code/static/img/cbr-logo.jpg ADDED
website/docker/docusaurus/Dockerfile ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Node.js 18.2-slim image from Docker Hub
2
+ FROM node:18.2-slim
3
+
4
+ # Set the working directory to /app
5
+ WORKDIR /app
6
+
7
+ # Copy the package.json and package-lock.json
8
+ COPY package*.json ./
9
+
10
+ # Install any needed packages specified in package.json
11
+ RUN npm install
12
+
13
+ # Make port 3000 available to the world outside this container
14
+ EXPOSE 3000
15
+
16
+ # make sure to mount the site on /app/site folder
17
+ WORKDIR /app/site
18
+
19
+ CMD ["sh", "-c", "npx docusaurus start --host 0.0.0.0"]
website/docker/docusaurus/docker-create.sh ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ docker build --progress=plain -t docusaurus-app -f ./docker/docusaurus/Dockerfile ./docker/docusaurus
2
+ #docker build -t docusaurus .
3
+ #docker run --rm -it -p 3000:3000 docusaurus
website/docker/docusaurus/docker-run-locally.sh ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ docker run -it --rm -p 3000:3000 -v $(pwd)/code:/app/site docusaurus-app
2
+
3
+ #--entrypoint bash
website/docker/docusaurus/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
website/docker/docusaurus/package.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "website",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "docusaurus": "docusaurus",
7
+ "start": "docusaurus start",
8
+ "build": "docusaurus build",
9
+ "swizzle": "docusaurus swizzle",
10
+ "deploy": "docusaurus deploy",
11
+ "clear": "docusaurus clear",
12
+ "serve": "docusaurus serve",
13
+ "write-translations": "docusaurus write-translations",
14
+ "write-heading-ids": "docusaurus write-heading-ids"
15
+ },
16
+ "dependencies": {
17
+ "@ant-design/icons": "^4.7.0",
18
+ "@cmfcmf/docusaurus-search-local": "^0.11.0",
19
+ "@docusaurus/core": "2.3.1",
20
+ "@docusaurus/preset-classic": "2.3.1",
21
+ "@mdx-js/react": "^1.6.22",
22
+ "antd": "^4.23.6",
23
+ "clsx": "^1.2.1",
24
+ "param-case": "^3.0.4",
25
+ "prism-react-renderer": "^1.3.5",
26
+ "react": "^17.0.2",
27
+ "react-dom": "^17.0.2"
28
+ },
29
+ "devDependencies": {
30
+ "@docusaurus/module-type-aliases": "2.3.1"
31
+ },
32
+ "browserslist": {
33
+ "production": [
34
+ ">0.5%",
35
+ "not dead",
36
+ "not op_mini all"
37
+ ],
38
+ "development": [
39
+ "last 1 chrome version",
40
+ "last 1 firefox version",
41
+ "last 1 safari version"
42
+ ]
43
+ },
44
+ "engines": {
45
+ "node": ">=16.14"
46
+ }
47
+ }