sku 11.3.3 → 11.4.2
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.
- package/CHANGELOG.md +27 -0
- package/docs/docs/building-the-app.md +2 -2
- package/docs/docs/code-splitting.md +10 -10
- package/docs/docs/configuration.md +1 -1
- package/docs/docs/multi-site.md +17 -10
- package/docs/docs/static-rendering.md +3 -3
- package/entry/client/index.js +7 -7
- package/package.json +2 -2
- package/scripts/init.js +6 -1
- package/scripts/serve.js +23 -33
- package/scripts/test.js +3 -0
- package/sku-types.d.ts +3 -3
- package/template/sku.config.ts +1 -1
- package/template/src/App/App.tsx +7 -5
- package/template/src/App/NextSteps.css.ts +6 -0
- package/template/src/App/NextSteps.tsx +154 -96
- package/template/src/client.tsx +2 -2
- package/template/src/render.tsx +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# sku
|
|
2
2
|
|
|
3
|
+
## 11.4.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Allow `:` to be used in dynamic paths again. ([#687](https://github.com/seek-oss/sku/pull/687))
|
|
8
|
+
|
|
9
|
+
Previously, dynamic paths were declared using the standard `:param` syntax, but this had been deprecated in favour of `$param`.
|
|
10
|
+
|
|
11
|
+
This has now been updated to allow for both.
|
|
12
|
+
This should allow `sku serve` to work for projects using colon syntax.
|
|
13
|
+
|
|
14
|
+
## 11.4.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- init: Refresh the next steps page ([#688](https://github.com/seek-oss/sku/pull/688))
|
|
19
|
+
|
|
20
|
+
Uplift the design (subjective) of the next steps page and add links to more useful content for fresh projects. Includes `Vocab` and slack channels for support and release announcements.
|
|
21
|
+
|
|
22
|
+
- React 18 support ([#688](https://github.com/seek-oss/sku/pull/688))
|
|
23
|
+
|
|
24
|
+
## 11.4.0
|
|
25
|
+
|
|
26
|
+
### Minor Changes
|
|
27
|
+
|
|
28
|
+
- The `languages` sku config value now accepts `readonly` types ([#685](https://github.com/seek-oss/sku/pull/685))
|
|
29
|
+
|
|
3
30
|
## 11.3.3
|
|
4
31
|
|
|
5
32
|
### Patch Changes
|
|
@@ -60,11 +60,11 @@ Example client entry
|
|
|
60
60
|
|
|
61
61
|
```js
|
|
62
62
|
import React from 'react';
|
|
63
|
-
import {
|
|
63
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
64
64
|
|
|
65
65
|
import App from './App';
|
|
66
66
|
|
|
67
67
|
export default () => {
|
|
68
|
-
|
|
68
|
+
hydrateRoot(document.getElementById('app')!, <App />);
|
|
69
69
|
};
|
|
70
70
|
```
|
|
@@ -37,7 +37,7 @@ module.exports = {
|
|
|
37
37
|
// render.js
|
|
38
38
|
import React from 'react';
|
|
39
39
|
import { renderToString } from 'react-dom/server';
|
|
40
|
-
import { StaticRouter } from 'react-router-dom';
|
|
40
|
+
import { StaticRouter } from 'react-router-dom/server';
|
|
41
41
|
|
|
42
42
|
import App from './App';
|
|
43
43
|
|
|
@@ -45,7 +45,7 @@ export default {
|
|
|
45
45
|
renderApp: ({ SkuProvider, route }) => {
|
|
46
46
|
return renderToString(
|
|
47
47
|
<SkuProvider>
|
|
48
|
-
<StaticRouter location={route}
|
|
48
|
+
<StaticRouter location={route}>
|
|
49
49
|
<App />
|
|
50
50
|
</StaticRouter>
|
|
51
51
|
</SkuProvider>,
|
|
@@ -73,17 +73,17 @@ export default {
|
|
|
73
73
|
```js
|
|
74
74
|
// client.js
|
|
75
75
|
import React from 'react';
|
|
76
|
-
import {
|
|
76
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
77
77
|
import { BrowserRouter } from 'react-router-dom';
|
|
78
78
|
|
|
79
79
|
import App from './App';
|
|
80
80
|
|
|
81
81
|
export default () => {
|
|
82
|
-
|
|
82
|
+
hydrateRoot(
|
|
83
|
+
document.getElementById('app')!,
|
|
83
84
|
<BrowserRouter>
|
|
84
85
|
<App />
|
|
85
86
|
</BrowserRouter>,
|
|
86
|
-
document.getElementById('app'),
|
|
87
87
|
);
|
|
88
88
|
};
|
|
89
89
|
```
|
|
@@ -91,16 +91,16 @@ export default () => {
|
|
|
91
91
|
```js
|
|
92
92
|
// App.js
|
|
93
93
|
import React, { Fragment } from 'react';
|
|
94
|
-
import { Route } from 'react-router-dom';
|
|
94
|
+
import { Routes, Route } from 'react-router-dom';
|
|
95
95
|
import loadable from 'sku/@loadable/component';
|
|
96
96
|
|
|
97
97
|
const Home = loadable(() => import('./handlers/Home'));
|
|
98
98
|
const Details = loadable(() => import('./handlers/Details'));
|
|
99
99
|
|
|
100
100
|
export default ({ site }) => (
|
|
101
|
-
<
|
|
102
|
-
<Route path="/"
|
|
103
|
-
<Route path="/details"
|
|
104
|
-
</
|
|
101
|
+
<Routes>
|
|
102
|
+
<Route path="/" element={<Home />} />
|
|
103
|
+
<Route path="/details" element={<Details />} />
|
|
104
|
+
</Routes>
|
|
105
105
|
);
|
|
106
106
|
```
|
|
@@ -201,7 +201,7 @@ The browser URL to open when running `sku start` or `sku start-ssr`. It will def
|
|
|
201
201
|
|
|
202
202
|
## languages
|
|
203
203
|
|
|
204
|
-
type `Array<string | { name: string }>`
|
|
204
|
+
type `Array<string | { name: string, extends: string }>`
|
|
205
205
|
|
|
206
206
|
The languages your application supports.
|
|
207
207
|
|
package/docs/docs/multi-site.md
CHANGED
|
@@ -102,13 +102,13 @@ export default {
|
|
|
102
102
|
```js
|
|
103
103
|
// client.js
|
|
104
104
|
import React from 'react';
|
|
105
|
-
import {
|
|
105
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
106
106
|
|
|
107
107
|
import App from './App';
|
|
108
108
|
|
|
109
109
|
// Pass the site variable from `provideClientContext` to the top level component
|
|
110
110
|
export default ({ site }) =>
|
|
111
|
-
|
|
111
|
+
hydrateRoot(document.getElementById('app')!, <App site={site} />);
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
### Loading the theme
|
|
@@ -117,15 +117,22 @@ Now the site is available in our `App` component, we use `BraidLoadableProvider`
|
|
|
117
117
|
|
|
118
118
|
```js
|
|
119
119
|
// App.js
|
|
120
|
-
import React from 'react';
|
|
120
|
+
import React, { ReactNode } from 'react';
|
|
121
|
+
|
|
122
|
+
import { BraidProvider } from 'braid-design-system';
|
|
123
|
+
import loadable from 'sku/@loadable/component';
|
|
121
124
|
|
|
122
|
-
|
|
125
|
+
const BraidTheme = loadable.lib((props: { themeName }) =>
|
|
126
|
+
import(`braid-design-system/themes/${props.themeName}`),
|
|
127
|
+
);
|
|
123
128
|
|
|
124
129
|
export default ({ site }) => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
<
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
130
|
+
<BraidTheme themeName={site}>
|
|
131
|
+
{({ default: theme }) => (
|
|
132
|
+
<BraidProvider theme={theme}>
|
|
133
|
+
<MyPage />
|
|
134
|
+
</BraidProvider>
|
|
135
|
+
)}
|
|
136
|
+
</BraidTheme>
|
|
137
|
+
);
|
|
131
138
|
```
|
|
@@ -145,16 +145,16 @@ Client entry
|
|
|
145
145
|
|
|
146
146
|
```js
|
|
147
147
|
import React from 'react';
|
|
148
|
-
import {
|
|
148
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
149
149
|
|
|
150
150
|
import App from './App';
|
|
151
151
|
|
|
152
152
|
export default ({ site, analyticsEnabled, appLength }) => {
|
|
153
153
|
console.log('HTML source length', appLength);
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
hydrateRoot(
|
|
156
|
+
document.getElementById('app')!,
|
|
156
157
|
<App site={site} analytics={analyticsEnabled} />,
|
|
157
|
-
document.getElementById('app'),
|
|
158
158
|
);
|
|
159
159
|
};
|
|
160
160
|
```
|
package/entry/client/index.js
CHANGED
|
@@ -9,16 +9,16 @@ import clientContextKey from '../clientContextKey';
|
|
|
9
9
|
if (process.env.NODE_ENV === 'development') {
|
|
10
10
|
if (typeof client !== 'function') {
|
|
11
11
|
throw new Error(require('dedent')`
|
|
12
|
-
The sku client entry ('${__SKU_CLIENT_PATH__}') must export a function that calls
|
|
12
|
+
The sku client entry ('${__SKU_CLIENT_PATH__}') must export a function that calls hydrateRoot. e.g.
|
|
13
|
+
|
|
14
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
13
15
|
|
|
14
|
-
import { hydrate } from 'react-dom';
|
|
15
|
-
|
|
16
16
|
import App from './App';
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
export default ({ site }) =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
hydrateRoot(
|
|
20
|
+
document.getElementById('app')!,
|
|
21
|
+
<App site={site} />,
|
|
22
22
|
);
|
|
23
23
|
|
|
24
24
|
See https://seek-oss.github.io/sku/#/./docs/building-the-app?id=client for more info.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sku",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.4.2",
|
|
4
4
|
"description": "Front-end development toolkit, powered by Webpack, Babel, CSS Modules, Less and Jest",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"homepage": "https://github.com/seek-oss/sku#readme",
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"react": "^16.14.0 || ^17.0.0"
|
|
56
|
+
"react": "^16.14.0 || ^17.0.0 || ^18.0.0"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@babel/core": "^7.12.10",
|
package/scripts/init.js
CHANGED
|
@@ -164,7 +164,12 @@ const args = require('../config/args');
|
|
|
164
164
|
|
|
165
165
|
const deps = ['braid-design-system', 'sku', 'react', 'react-dom'];
|
|
166
166
|
|
|
167
|
-
const devDeps = [
|
|
167
|
+
const devDeps = [
|
|
168
|
+
'@vanilla-extract/css',
|
|
169
|
+
'husky',
|
|
170
|
+
'@types/react',
|
|
171
|
+
'@types/react-dom',
|
|
172
|
+
];
|
|
168
173
|
|
|
169
174
|
console.log('Installing packages. This might take a couple of minutes.');
|
|
170
175
|
console.log(
|
package/scripts/serve.js
CHANGED
|
@@ -2,9 +2,8 @@ const path = require('path');
|
|
|
2
2
|
const express = require('express');
|
|
3
3
|
const fs = require('fs-extra');
|
|
4
4
|
const handler = require('serve-handler');
|
|
5
|
-
const partition = require('lodash/partition');
|
|
6
5
|
const flatMap = require('lodash/flatMap');
|
|
7
|
-
const { blue, bold, underline,
|
|
6
|
+
const { blue, bold, underline, red } = require('chalk');
|
|
8
7
|
const didYouMean = require('didyoumean2').default;
|
|
9
8
|
|
|
10
9
|
const {
|
|
@@ -29,7 +28,7 @@ const {
|
|
|
29
28
|
getValidLanguagesForRoute,
|
|
30
29
|
} = require('../lib/language-utils');
|
|
31
30
|
|
|
32
|
-
const
|
|
31
|
+
const preferredSite = args.site;
|
|
33
32
|
|
|
34
33
|
(async () => {
|
|
35
34
|
track.count('serve');
|
|
@@ -47,9 +46,9 @@ const prefferedSite = args.site;
|
|
|
47
46
|
|
|
48
47
|
const availableSites = sites.map(({ name }) => name);
|
|
49
48
|
|
|
50
|
-
if (
|
|
51
|
-
console.log(red(`Unknown site '${bold(
|
|
52
|
-
const suggestedSite = didYouMean(
|
|
49
|
+
if (preferredSite && !availableSites.some((site) => preferredSite === site)) {
|
|
50
|
+
console.log(red(`Unknown site '${bold(preferredSite)}'`));
|
|
51
|
+
const suggestedSite = didYouMean(preferredSite, availableSites);
|
|
53
52
|
|
|
54
53
|
if (suggestedSite) {
|
|
55
54
|
console.log(`Did you mean '${bold(suggestedSite)}'?`);
|
|
@@ -81,27 +80,6 @@ const prefferedSite = args.site;
|
|
|
81
80
|
|
|
82
81
|
const environment = resolveEnvironment();
|
|
83
82
|
|
|
84
|
-
const [invalidRoutes, validRoutes] = partition(
|
|
85
|
-
routes,
|
|
86
|
-
({ route }) => route.indexOf(':') > -1,
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
if (invalidRoutes.length > 0) {
|
|
90
|
-
console.log(yellow(`Invalid dynamic routes:\n`));
|
|
91
|
-
|
|
92
|
-
invalidRoutes.forEach(({ route }) => {
|
|
93
|
-
console.log(yellow(underline(route)));
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
console.log(
|
|
97
|
-
yellow(
|
|
98
|
-
`\n${bold(
|
|
99
|
-
'sku serve',
|
|
100
|
-
)} doesn't support dynamic routes using ':' style syntax.\nPlease upgrade your routes to use '$' instead.`,
|
|
101
|
-
),
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
83
|
const app = express();
|
|
106
84
|
|
|
107
85
|
if (useDevServerMiddleware) {
|
|
@@ -114,16 +92,17 @@ const prefferedSite = args.site;
|
|
|
114
92
|
app.use((request, response) => {
|
|
115
93
|
const [hostname] = request.headers.host.split(':');
|
|
116
94
|
|
|
117
|
-
const site = getSiteForHost(hostname,
|
|
95
|
+
const site = getSiteForHost(hostname, preferredSite) || '';
|
|
118
96
|
|
|
119
|
-
const rewrites = flatMap(
|
|
97
|
+
const rewrites = flatMap(routes, (route) =>
|
|
120
98
|
getValidLanguagesForRoute(route).map((lang) => {
|
|
121
99
|
const langRoute = getRouteWithLanguage(route.route, lang);
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
// $ and : are both acceptable dynamic path delimiters
|
|
102
|
+
const normalisedSourceRoute = langRoute
|
|
124
103
|
.split('/')
|
|
125
104
|
.map((part) => {
|
|
126
|
-
if (part.startsWith('$')) {
|
|
105
|
+
if (part.startsWith('$') || part.startsWith(':')) {
|
|
127
106
|
// Path is dynamic, map part to * match
|
|
128
107
|
return '*';
|
|
129
108
|
}
|
|
@@ -132,9 +111,20 @@ const prefferedSite = args.site;
|
|
|
132
111
|
})
|
|
133
112
|
.join('/');
|
|
134
113
|
|
|
114
|
+
// Segments with : need to be escaped though, because serve expects there to be an equivalent in source
|
|
115
|
+
const normalisedDestinationRoute = langRoute
|
|
116
|
+
.split('/')
|
|
117
|
+
.map((part) => (part.startsWith(':') ? `\\${part}` : part))
|
|
118
|
+
.join('/');
|
|
119
|
+
|
|
135
120
|
return {
|
|
136
|
-
source:
|
|
137
|
-
destination: path.join(
|
|
121
|
+
source: normalisedSourceRoute,
|
|
122
|
+
destination: path.join(
|
|
123
|
+
environment,
|
|
124
|
+
site,
|
|
125
|
+
normalisedDestinationRoute,
|
|
126
|
+
'index.html',
|
|
127
|
+
),
|
|
138
128
|
};
|
|
139
129
|
}),
|
|
140
130
|
);
|
package/scripts/test.js
CHANGED
|
@@ -8,6 +8,9 @@ const { jestDecorator } = require('../context');
|
|
|
8
8
|
|
|
9
9
|
const { runVocabCompile } = require('../lib/runVocab');
|
|
10
10
|
|
|
11
|
+
// https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#configuring-your-testing-environment
|
|
12
|
+
process.env.IS_REACT_ACT_ENVIRONMENT = true;
|
|
13
|
+
|
|
11
14
|
(async () => {
|
|
12
15
|
await runVocabCompile();
|
|
13
16
|
|
package/sku-types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ComponentType } from 'react';
|
|
1
|
+
import { ComponentType, ReactNode } from 'react';
|
|
2
2
|
|
|
3
3
|
interface SharedRenderProps {
|
|
4
4
|
routeName: string;
|
|
@@ -12,7 +12,7 @@ interface SharedRenderProps {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
interface RenderAppProps extends SharedRenderProps {
|
|
15
|
-
SkuProvider: ComponentType
|
|
15
|
+
SkuProvider: ComponentType<{ children: ReactNode }>;
|
|
16
16
|
_addChunk: (chunkName: string) => void;
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -192,7 +192,7 @@ export interface SkuConfig {
|
|
|
192
192
|
*
|
|
193
193
|
* @link https://seek-oss.github.io/sku/#/./docs/configuration?id=languages
|
|
194
194
|
*/
|
|
195
|
-
languages?:
|
|
195
|
+
languages?: ReadonlyArray<string | { name: string; extends?: string }>;
|
|
196
196
|
|
|
197
197
|
/**
|
|
198
198
|
* **Only for libraries**
|
package/template/sku.config.ts
CHANGED
|
@@ -5,7 +5,7 @@ const skuConfig: SkuConfig = {
|
|
|
5
5
|
renderEntry: 'src/render.tsx',
|
|
6
6
|
environments: ['development', 'production'],
|
|
7
7
|
publicPath: '/path/to/public/assets/', // <-- Required for sku build output
|
|
8
|
-
orderImports: true
|
|
8
|
+
orderImports: true,
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
export default skuConfig;
|
package/template/src/App/App.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import 'braid-design-system/reset';
|
|
2
2
|
|
|
3
3
|
import { BraidProvider } from 'braid-design-system';
|
|
4
|
-
import apac from 'braid-design-system/themes/apac'
|
|
5
|
-
import React from 'react';
|
|
4
|
+
import apac from 'braid-design-system/themes/apac';
|
|
5
|
+
import React, { StrictMode } from 'react';
|
|
6
6
|
|
|
7
7
|
import { NextSteps } from './NextSteps';
|
|
8
8
|
|
|
@@ -11,7 +11,9 @@ interface AppProps {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export default ({ environment }: AppProps) => (
|
|
14
|
-
<
|
|
15
|
-
<
|
|
16
|
-
|
|
14
|
+
<StrictMode>
|
|
15
|
+
<BraidProvider theme={apac}>
|
|
16
|
+
<NextSteps environment={environment} />
|
|
17
|
+
</BraidProvider>
|
|
18
|
+
</StrictMode>
|
|
17
19
|
);
|
|
@@ -3,122 +3,180 @@ import {
|
|
|
3
3
|
Heading,
|
|
4
4
|
Text,
|
|
5
5
|
Strong,
|
|
6
|
-
|
|
6
|
+
ContentBlock,
|
|
7
7
|
TextLink,
|
|
8
8
|
Stack,
|
|
9
9
|
List,
|
|
10
10
|
} from 'braid-design-system';
|
|
11
|
-
import React
|
|
11
|
+
import React from 'react';
|
|
12
|
+
|
|
13
|
+
import * as styles from './NextSteps.css';
|
|
12
14
|
|
|
13
15
|
interface NextStepsProps {
|
|
14
16
|
environment: 'development' | 'production';
|
|
15
17
|
}
|
|
16
18
|
export function NextSteps({ environment }: NextStepsProps) {
|
|
17
19
|
return (
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
<Box
|
|
21
|
+
paddingY="xxlarge"
|
|
22
|
+
paddingX={{ mobile: 'small', tablet: 'gutter' }}
|
|
23
|
+
background="customDark"
|
|
24
|
+
className={styles.background}
|
|
25
|
+
>
|
|
26
|
+
<ContentBlock width="large">
|
|
27
|
+
<Stack space="xxlarge">
|
|
28
|
+
<Stack space="xlarge">
|
|
29
|
+
<Stack space="medium" align="center">
|
|
30
|
+
<Heading level="1" component="span">
|
|
31
|
+
🎉
|
|
32
|
+
</Heading>
|
|
33
|
+
<Heading level="1" weight="weak">
|
|
34
|
+
Congratulations!
|
|
35
|
+
</Heading>
|
|
36
|
+
</Stack>
|
|
37
|
+
<Stack space="medium" align="center">
|
|
38
|
+
<Text size="large">
|
|
39
|
+
<Strong>{'<%= appName %>'}</Strong> has been successfully
|
|
40
|
+
initialised.
|
|
37
41
|
</Text>
|
|
42
|
+
<Text>Current environment: {environment}</Text>
|
|
38
43
|
</Stack>
|
|
39
|
-
|
|
40
|
-
<Heading level="4">Platform</Heading>
|
|
41
|
-
|
|
42
|
-
<Text>
|
|
43
|
-
The sku platform provides a number of tools to make development more
|
|
44
|
-
efficient, for example,
|
|
45
|
-
<TextLink href="https://www.typescriptlang.org/">
|
|
46
|
-
TypeScript
|
|
47
|
-
</TextLink>
|
|
48
|
-
, <TextLink href="https://jestjs.io/">Jest</TextLink>,{' '}
|
|
49
|
-
<TextLink href="https://eslint.org/">ESLint</TextLink>,{' '}
|
|
50
|
-
<TextLink href="https://storybook.js.org/">Storybook</TextLink>{' '}
|
|
51
|
-
, and more.
|
|
52
|
-
</Text>
|
|
53
|
-
|
|
54
|
-
<Text>
|
|
55
|
-
For more information see the sku{' '}
|
|
56
|
-
<TextLink href="https://seek-oss.github.io/sku/#/">
|
|
57
|
-
documentation
|
|
58
|
-
</TextLink>
|
|
59
|
-
.
|
|
60
|
-
</Text>
|
|
61
|
-
|
|
62
|
-
<Heading level="4">Components</Heading>
|
|
63
|
-
|
|
64
|
-
<Text>
|
|
65
|
-
The project comes with{' '}
|
|
66
|
-
<TextLink href="https://seek-oss.github.io/braid-design-system/">
|
|
67
|
-
Braid design system
|
|
68
|
-
</TextLink>
|
|
69
|
-
. For more information on the available components check out the{' '}
|
|
70
|
-
<TextLink href="https://seek-oss.github.io/braid-design-system/components">
|
|
71
|
-
documentation
|
|
72
|
-
</TextLink>
|
|
73
|
-
.
|
|
74
|
-
</Text>
|
|
75
44
|
</Stack>
|
|
76
|
-
</Card>
|
|
77
45
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
46
|
+
<Box
|
|
47
|
+
background="surface"
|
|
48
|
+
borderRadius="xlarge"
|
|
49
|
+
boxShadow="large"
|
|
50
|
+
padding={{ mobile: 'large', tablet: 'xlarge', desktop: 'xxlarge' }}
|
|
51
|
+
>
|
|
52
|
+
<Stack
|
|
53
|
+
space={{ mobile: 'xlarge', desktop: 'xxlarge' }}
|
|
54
|
+
dividers="strong"
|
|
55
|
+
>
|
|
56
|
+
<Stack space="large">
|
|
57
|
+
<Heading level="2">🏃🏾♀️ Next steps</Heading>
|
|
58
|
+
<Text>
|
|
59
|
+
The project comes pre-configured with a lot of standardised
|
|
60
|
+
tooling to make authoring web applications easier.
|
|
61
|
+
</Text>
|
|
62
|
+
|
|
63
|
+
<Stack space="gutter">
|
|
64
|
+
<Heading level="3">Platform</Heading>
|
|
82
65
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
66
|
+
<Text>
|
|
67
|
+
The{' '}
|
|
68
|
+
<TextLink href="https://seek-oss.github.io/sku/#/">
|
|
69
|
+
sku platform
|
|
70
|
+
</TextLink>{' '}
|
|
71
|
+
provides a number of tools to make development more
|
|
72
|
+
efficient, for example,{' '}
|
|
73
|
+
<TextLink href="https://www.typescriptlang.org/">
|
|
74
|
+
TypeScript
|
|
75
|
+
</TextLink>
|
|
76
|
+
, <TextLink href="https://jestjs.io/">Jest</TextLink>,{' '}
|
|
77
|
+
<TextLink href="https://eslint.org/">ESLint</TextLink>,{' '}
|
|
78
|
+
<TextLink href="https://storybook.js.org/">
|
|
79
|
+
Storybook
|
|
80
|
+
</TextLink>{' '}
|
|
81
|
+
, and more.
|
|
82
|
+
</Text>
|
|
83
|
+
</Stack>
|
|
84
|
+
|
|
85
|
+
<Stack space="gutter">
|
|
86
|
+
<Heading level="3">Components</Heading>
|
|
87
|
+
|
|
88
|
+
<Text>
|
|
89
|
+
The project comes with{' '}
|
|
90
|
+
<TextLink href="https://seek-oss.github.io/braid-design-system/">
|
|
91
|
+
Braid Design System
|
|
92
|
+
</TextLink>{' '}
|
|
93
|
+
— SEEK’s themeable component library.
|
|
94
|
+
</Text>
|
|
95
|
+
</Stack>
|
|
96
|
+
|
|
97
|
+
<Stack space="gutter">
|
|
98
|
+
<Heading level="3">Translations</Heading>
|
|
88
99
|
|
|
89
|
-
|
|
100
|
+
<Text>
|
|
101
|
+
The project comes with{' '}
|
|
102
|
+
<TextLink href="https://github.com/seek-oss/vocab/">
|
|
103
|
+
Vocab
|
|
104
|
+
</TextLink>{' '}
|
|
105
|
+
— SEEK’s strongly-typed internationalization framework
|
|
106
|
+
for React.
|
|
107
|
+
</Text>
|
|
108
|
+
</Stack>
|
|
109
|
+
</Stack>
|
|
90
110
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
</Text>
|
|
111
|
+
<Stack space="large">
|
|
112
|
+
<Heading level="2">🙋♂️ Support</Heading>
|
|
94
113
|
|
|
95
|
-
<Box paddingBottom="xsmall">
|
|
96
|
-
<List>
|
|
97
114
|
<Text>
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
</TextLink>
|
|
115
|
+
Whether it’s a problem or a feature request, please
|
|
116
|
+
don’t hesitate to contact us via slack.
|
|
101
117
|
</Text>
|
|
118
|
+
|
|
119
|
+
<Stack space="gutter">
|
|
120
|
+
<Heading level="3">Technical support</Heading>
|
|
121
|
+
|
|
122
|
+
<Text>
|
|
123
|
+
For technical queries about the platform or the design
|
|
124
|
+
system:
|
|
125
|
+
</Text>
|
|
126
|
+
|
|
127
|
+
<List>
|
|
128
|
+
<Text>
|
|
129
|
+
<TextLink href="https://seekchat.slack.com/channels/sku-support">
|
|
130
|
+
#sku-support
|
|
131
|
+
</TextLink>
|
|
132
|
+
</Text>
|
|
133
|
+
<Text>
|
|
134
|
+
<TextLink href="https://seekchat.slack.com/channels/braid-support">
|
|
135
|
+
#braid-support
|
|
136
|
+
</TextLink>
|
|
137
|
+
</Text>
|
|
138
|
+
</List>
|
|
139
|
+
</Stack>
|
|
140
|
+
|
|
141
|
+
<Stack space="gutter">
|
|
142
|
+
<Heading level="3">Design support</Heading>
|
|
143
|
+
|
|
144
|
+
<Text>
|
|
145
|
+
To discuss new or existing design patterns, visit{' '}
|
|
146
|
+
<TextLink href="https://seekchat.slack.com/channels/braid-design-support">
|
|
147
|
+
#braid-design-support
|
|
148
|
+
</TextLink>
|
|
149
|
+
.
|
|
150
|
+
</Text>
|
|
151
|
+
</Stack>
|
|
152
|
+
</Stack>
|
|
153
|
+
|
|
154
|
+
<Stack space="large">
|
|
155
|
+
<Heading level="2">📣 Announcements</Heading>
|
|
156
|
+
|
|
102
157
|
<Text>
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
158
|
+
For keeping up to date with new features and bug fixes as they
|
|
159
|
+
are released, it’s recommended to join and turn on
|
|
160
|
+
notifications for the following channels:
|
|
106
161
|
</Text>
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
162
|
+
|
|
163
|
+
<List>
|
|
164
|
+
<Text>
|
|
165
|
+
<TextLink href="https://seekchat.slack.com/channels/front-end-tooling-announcements">
|
|
166
|
+
#front-end-tooling-announcements
|
|
167
|
+
</TextLink>
|
|
168
|
+
</Text>
|
|
169
|
+
<Text>
|
|
170
|
+
<TextLink href="https://seekchat.slack.com/channels/braid-announcements">
|
|
171
|
+
#braid-announcements
|
|
172
|
+
</TextLink>
|
|
173
|
+
</Text>
|
|
174
|
+
</List>
|
|
175
|
+
</Stack>
|
|
176
|
+
</Stack>
|
|
177
|
+
</Box>
|
|
178
|
+
</Stack>
|
|
179
|
+
</ContentBlock>
|
|
180
|
+
</Box>
|
|
123
181
|
);
|
|
124
|
-
}
|
|
182
|
+
}
|
package/template/src/client.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
3
3
|
|
|
4
4
|
import App from './App/App';
|
|
5
5
|
import { ClientContext } from './types';
|
|
6
6
|
|
|
7
7
|
export default ({ environment }: ClientContext) => {
|
|
8
|
-
|
|
8
|
+
hydrateRoot(document.getElementById('app')!, <App environment={environment} />);
|
|
9
9
|
};
|
package/template/src/render.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
2
|
+
import { renderToString } from 'react-dom/server';
|
|
3
3
|
import type { Render } from 'sku';
|
|
4
4
|
|
|
5
5
|
import App from './App/App';
|
|
@@ -11,7 +11,7 @@ interface RenderContext {
|
|
|
11
11
|
|
|
12
12
|
const skuRender: Render<RenderContext> = {
|
|
13
13
|
renderApp: ({ SkuProvider, environment }) => {
|
|
14
|
-
const appHtml =
|
|
14
|
+
const appHtml = renderToString(
|
|
15
15
|
<SkuProvider>
|
|
16
16
|
<App environment={environment as ClientContext['environment']} />
|
|
17
17
|
</SkuProvider>,
|
|
@@ -23,7 +23,7 @@ const skuRender: Render<RenderContext> = {
|
|
|
23
23
|
},
|
|
24
24
|
|
|
25
25
|
provideClientContext: ({ environment }) => ({
|
|
26
|
-
environment
|
|
26
|
+
environment,
|
|
27
27
|
}),
|
|
28
28
|
|
|
29
29
|
renderDocument: ({ app, bodyTags, headTags }) => `
|