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 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 { hydrate } from 'react-dom';
63
+ import { hydrateRoot } from 'react-dom/client';
64
64
 
65
65
  import App from './App';
66
66
 
67
67
  export default () => {
68
- hydrate(<App />, document.getElementById('app'));
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} context={{}}>
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 { hydrate } from 'react-dom';
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
- hydrate(
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
- <Fragment>
102
- <Route path="/" exact component={Home} />
103
- <Route path="/details" exact component={Details} />
104
- </Fragment>
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
 
@@ -102,13 +102,13 @@ export default {
102
102
  ```js
103
103
  // client.js
104
104
  import React from 'react';
105
- import { hydrate } from 'react-dom';
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
- hydrate(<App site={site} />, document.getElementById('app'));
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
- import { BraidLoadableProvider } from 'braid-design-system';
125
+ const BraidTheme = loadable.lib((props: { themeName }) =>
126
+ import(`braid-design-system/themes/${props.themeName}`),
127
+ );
123
128
 
124
129
  export default ({ site }) => {
125
- return (
126
- <BraidLoadableProvider themeName={site}>
127
- <MyPage />
128
- </BraidLoadableProvider>
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 { hydrate } from 'react-dom';
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
- hydrate(
155
+ hydrateRoot(
156
+ document.getElementById('app')!,
156
157
  <App site={site} analytics={analyticsEnabled} />,
157
- document.getElementById('app'),
158
158
  );
159
159
  };
160
160
  ```
@@ -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 hydrate. e.g.
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
- hydrate(
20
- <App site={site} />,
21
- document.getElementById('app')
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.3",
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 = ['husky', '@types/react', '@types/react-dom'];
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, yellow, red } = require('chalk');
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 prefferedSite = args.site;
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 (prefferedSite && !availableSites.some((site) => prefferedSite === site)) {
51
- console.log(red(`Unknown site '${bold(prefferedSite)}'`));
52
- const suggestedSite = didYouMean(prefferedSite, availableSites);
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, prefferedSite) || '';
95
+ const site = getSiteForHost(hostname, preferredSite) || '';
118
96
 
119
- const rewrites = flatMap(validRoutes, (route) =>
97
+ const rewrites = flatMap(routes, (route) =>
120
98
  getValidLanguagesForRoute(route).map((lang) => {
121
99
  const langRoute = getRouteWithLanguage(route.route, lang);
122
100
 
123
- const normalisedRoute = langRoute
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: normalisedRoute,
137
- destination: path.join(environment, site, langRoute, 'index.html'),
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?: Array<string | { name: string; extends?: string }>;
195
+ languages?: ReadonlyArray<string | { name: string; extends?: string }>;
196
196
 
197
197
  /**
198
198
  * **Only for libraries**
@@ -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;
@@ -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
- <BraidProvider theme={apac}>
15
- <NextSteps environment={environment}/>
16
- </BraidProvider>
14
+ <StrictMode>
15
+ <BraidProvider theme={apac}>
16
+ <NextSteps environment={environment} />
17
+ </BraidProvider>
18
+ </StrictMode>
17
19
  );
@@ -0,0 +1,6 @@
1
+ import { style } from '@vanilla-extract/css';
2
+
3
+ export const background = style({
4
+ minHeight: '100vh',
5
+ background: `linear-gradient(70deg, #76002C 5%, #0d3880 60%, #095863 99.88%)`,
6
+ });
@@ -3,122 +3,180 @@ import {
3
3
  Heading,
4
4
  Text,
5
5
  Strong,
6
- Card,
6
+ ContentBlock,
7
7
  TextLink,
8
8
  Stack,
9
9
  List,
10
10
  } from 'braid-design-system';
11
- import React, { Fragment } from '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
- <Fragment>
19
- <Box background="brand" paddingY="xxlarge" paddingX="gutter">
20
- <Stack space="medium">
21
- <Heading level="1">Congratulations 🎉</Heading>
22
- <Text>
23
- <Strong>{'<%= appName %>'}</Strong> has been successfully initialised.
24
- </Text>
25
- <Text size="small">Current environment: {environment}</Text>
26
- </Stack>
27
- </Box>
28
- <Box paddingX={['xsmall', 'gutter']} style={{ marginTop: '-40px' }}>
29
- <Card>
30
- <Stack space="medium">
31
- <Stack space="large" dividers>
32
- <Heading level="2">🏃🏾‍♀️ Next steps</Heading>
33
-
34
- <Text>
35
- The project comes pre-configured with a lot of standardised
36
- tooling to make authoring web applications easier.
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
- <Card>
79
- <Stack space="medium">
80
- <Stack space="large" dividers>
81
- <Heading level="2">💬 Support</Heading>
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
- <Text>
84
- Whether it&rsquo;s a problem or a feature request, please
85
- don&rsquo;t hesitate to contact us via slack.
86
- </Text>
87
- </Stack>
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&rsquo;s themeable component library.
94
+ </Text>
95
+ </Stack>
96
+
97
+ <Stack space="gutter">
98
+ <Heading level="3">Translations</Heading>
88
99
 
89
- <Heading level="4">Technical support</Heading>
100
+ <Text>
101
+ The project comes with{' '}
102
+ <TextLink href="https://github.com/seek-oss/vocab/">
103
+ Vocab
104
+ </TextLink>{' '}
105
+ — SEEK&rsquo;s strongly-typed internationalization framework
106
+ for React.
107
+ </Text>
108
+ </Stack>
109
+ </Stack>
90
110
 
91
- <Text>
92
- For technical queries about the platform or the design system:
93
- </Text>
111
+ <Stack space="large">
112
+ <Heading level="2">🙋‍♂️ Support</Heading>
94
113
 
95
- <Box paddingBottom="xsmall">
96
- <List>
97
114
  <Text>
98
- <TextLink href="https://seekchat.slack.com/channels/sku-support">
99
- #sku-support
100
- </TextLink>
115
+ Whether it&rsquo;s a problem or a feature request, please
116
+ don&rsquo;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
- <TextLink href="https://seekchat.slack.com/channels/braid-support">
104
- #braid-support
105
- </TextLink>
158
+ For keeping up to date with new features and bug fixes as they
159
+ are released, it&rsquo;s recommended to join and turn on
160
+ notifications for the following channels:
106
161
  </Text>
107
- </List>
108
- </Box>
109
-
110
- <Heading level="4">Design support</Heading>
111
-
112
- <Text>
113
- To discuss new or existing design patterns, visit{' '}
114
- <TextLink href="https://seekchat.slack.com/channels/braid-design-support">
115
- #braid-design-support
116
- </TextLink>
117
- .
118
- </Text>
119
- </Stack>
120
- </Card>
121
- </Box>
122
- </Fragment>
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
+ }
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- import { hydrate } from 'react-dom';
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
- hydrate(<App environment={environment} />, document.getElementById('app'));
8
+ hydrateRoot(document.getElementById('app')!, <App environment={environment} />);
9
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import ReactDOM from 'react-dom/server';
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 = ReactDOM.renderToString(
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 }) => `