@theroutingcompany/components 0.0.25 → 0.0.26-alpha.1

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/README.md +5 -285
  2. package/dist/trc-components.es.js +14278 -14019
  3. package/dist/trc-components.es.js.map +1 -1
  4. package/dist/trc-components.umd.js +713 -968
  5. package/dist/trc-components.umd.js.map +1 -1
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/package.json +6 -3
  8. package/types/cypress/support/component.d.ts +9 -0
  9. package/types/cypress.config.d.ts +3 -0
  10. package/types/src/components/Badge/Badge.cy.d.ts +1 -0
  11. package/types/{components → src/components}/Badge/Badge.d.ts +2 -2
  12. package/types/{components → src/components}/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  13. package/types/{components → src/components}/Button/Button.d.ts +8 -4
  14. package/types/src/components/Button/ButtonBase.d.ts +54 -0
  15. package/types/src/components/Button/Group.d.ts +10 -0
  16. package/types/src/components/Button/Icon.d.ts +10 -0
  17. package/types/src/components/Button/styles.d.ts +1 -0
  18. package/types/src/components/Calendar/Calendar.d.ts +6 -0
  19. package/types/src/components/Calendar/CalendarCell.d.ts +12 -0
  20. package/types/src/components/Calendar/CalendarGrid.d.ts +10 -0
  21. package/types/src/components/Calendar/TimeDateSelect.d.ts +11 -0
  22. package/types/src/components/Calendar/index.d.ts +6 -0
  23. package/types/src/components/Connect/Connect.d.ts +12 -0
  24. package/types/{components → src/components}/Flex/Flex.d.ts +1 -1
  25. package/types/{components → src/components}/FormControl/FormControl.d.ts +3 -3
  26. package/types/src/components/Inline/Inline.d.ts +0 -0
  27. package/types/src/components/Input/InlineEdit/InlineEdit.d.ts +11 -0
  28. package/types/{components → src/components}/Input/InputBase.d.ts +3 -0
  29. package/types/src/components/Input/TextInput/TextInput.d.ts +15 -0
  30. package/types/{components → src/components}/MultiSelect/MultiSelectListBox.d.ts +3 -3
  31. package/types/src/components/Stack/Stack.d.ts +0 -0
  32. package/types/{components → src/components}/Title/Title.d.ts +1 -2
  33. package/types/src/components/Tokens/Tokens.cy.d.ts +1 -0
  34. package/types/src/components/UnstyledLink/UnstyledLink.d.ts +0 -0
  35. package/types/{components → src/components}/index.d.ts +1 -1
  36. package/types/components/Button/ButtonBase.d.ts +0 -6
  37. package/types/components/Button/HighEmphasisButton/HighEmphasisButton.d.ts +0 -6
  38. package/types/components/Button/LowEmphasisButton/LowEmphasisButton.d.ts +0 -5
  39. package/types/components/Button/MediumEmphasisButton/MediumEmphasisButton.d.ts +0 -5
  40. package/types/components/Calendar/CalendarCell.d.ts +0 -12
  41. package/types/components/Calendar/CalendarGrid.d.ts +0 -10
  42. package/types/components/Calendar/index.d.ts +0 -4
  43. package/types/components/IconButton/IconButton.d.ts +0 -31
  44. package/types/components/Input/TextInput/TextInput.d.ts +0 -27
  45. /package/types/{components/Grid/Grid.d.ts → cypress/support/commands.d.ts} +0 -0
  46. /package/types/{components → src/components}/AccessibleIcon/AccessibleIcon.d.ts +0 -0
  47. /package/types/{components → src/components}/AlertDialog/AlertDialog.d.ts +0 -0
  48. /package/types/{components → src/components}/Box/Box.d.ts +0 -0
  49. /package/types/{components → src/components}/Calendar/CalendarHeader.d.ts +0 -0
  50. /package/types/{components → src/components}/Calendar/RangeCalendar.d.ts +0 -0
  51. /package/types/{components → src/components}/Checkbox/Checkbox.d.ts +0 -0
  52. /package/types/{components → src/components}/ComboBox/ComboBox.d.ts +0 -0
  53. /package/types/{components → src/components}/Dialog/Dialog.d.ts +0 -0
  54. /package/types/{components → src/components}/Drawer/Drawer.d.ts +0 -0
  55. /package/types/{components → src/components}/DropdownMenu/DropdownMenu.d.ts +0 -0
  56. /package/types/{components → src/components}/Fieldset/Fieldset.d.ts +0 -0
  57. /package/types/{components → src/components}/FileUpload/FileUpload.d.ts +0 -0
  58. /package/types/{components → src/components}/FormControl/useFormInput.d.ts +0 -0
  59. /package/types/{components/Stack/Stack.d.ts → src/components/Grid/Grid.d.ts} +0 -0
  60. /package/types/{components → src/components}/Heading/Heading.d.ts +0 -0
  61. /package/types/{components → src/components}/Input/NumberInput/NumberInput.d.ts +0 -0
  62. /package/types/{components → src/components}/Input/TextArea/TextArea.d.ts +0 -0
  63. /package/types/{components → src/components}/Input/TimeInput/TimeInput.d.ts +0 -0
  64. /package/types/{components → src/components}/Label/Label.d.ts +0 -0
  65. /package/types/{components → src/components}/ListBox/ListBox.d.ts +0 -0
  66. /package/types/{components → src/components}/ListBox/timezones.d.ts +0 -0
  67. /package/types/{components → src/components}/MultiSelect/MultiSelect.d.ts +0 -0
  68. /package/types/{components → src/components}/MultiSelect/MultiSelectPopover.d.ts +0 -0
  69. /package/types/{components → src/components}/MultiSelect/useMultiSelect.d.ts +0 -0
  70. /package/types/{components → src/components}/MultiSelect/useMultiSelectListState.d.ts +0 -0
  71. /package/types/{components → src/components}/MultiSelect/useMultiSelectState.d.ts +0 -0
  72. /package/types/{components → src/components}/NavigationMenu/NavigationMenu.d.ts +0 -0
  73. /package/types/{components → src/components}/Page/Page.d.ts +0 -0
  74. /package/types/{components → src/components}/Page/PageHeader.d.ts +0 -0
  75. /package/types/{components → src/components}/Paginator/Paginator.d.ts +0 -0
  76. /package/types/{components → src/components}/Popover/Popover.d.ts +0 -0
  77. /package/types/{components → src/components}/RadioGroup/RadioGroup.d.ts +0 -0
  78. /package/types/{components → src/components}/ReactAriaButton/ReactAriaButton.d.ts +0 -0
  79. /package/types/{components → src/components}/Search/Search.d.ts +0 -0
  80. /package/types/{components → src/components}/SegmentControl/SegmentControl.d.ts +0 -0
  81. /package/types/{components → src/components}/Select/Select.d.ts +0 -0
  82. /package/types/{components → src/components}/SingleSelect/SingleSelect.d.ts +0 -0
  83. /package/types/{components → src/components}/Switch/Switch.d.ts +0 -0
  84. /package/types/{components → src/components}/Table/Table.d.ts +0 -0
  85. /package/types/{components → src/components}/Tabs/Tabs.d.ts +0 -0
  86. /package/types/{components → src/components}/Text/Text.d.ts +0 -0
  87. /package/types/{components → src/components}/Toast/Toast.d.ts +0 -0
  88. /package/types/{components → src/components}/Tooltip/IconTooltip.d.ts +0 -0
  89. /package/types/{components → src/components}/Tooltip/Tooltip.d.ts +0 -0
  90. /package/types/{helpers → src/helpers}/css.d.ts +0 -0
  91. /package/types/{helpers → src/helpers}/index.d.ts +0 -0
  92. /package/types/{helpers → src/helpers}/interactionStates.d.ts +0 -0
  93. /package/types/{helpers → src/helpers}/tokenUtils.d.ts +0 -0
  94. /package/types/{helpers → src/helpers}/typeHelpers.d.ts +0 -0
  95. /package/types/{index.d.ts → src/index.d.ts} +0 -0
package/README.md CHANGED
@@ -12,8 +12,8 @@ First double check if everything that needs to exported is added to the `compone
12
12
 
13
13
  ### Public
14
14
 
15
- - Login to NPM with the shared TREX 1pass creds.
16
- - Execute the ./scripts/release.sh file.
15
+ - Login to NPM with the shared TREX 1pass creds.
16
+ - Execute the ./scripts/release.sh file.
17
17
 
18
18
  ```
19
19
  npm run ready:release
@@ -21,8 +21,8 @@ npm run ready:release
21
21
 
22
22
  ### Prerelease
23
23
 
24
- - Login to NPM with the shared TREX 1pass creds.
25
- - Execute the ./scripts/prerelease.sh file.
24
+ - Login to NPM with the shared TREX 1pass creds.
25
+ - Execute the ./scripts/prerelease.sh file.
26
26
 
27
27
  ```
28
28
  npm run ready:prerelease
@@ -43,29 +43,6 @@ It may seem weird at first sight that two component libraries are used but they
43
43
 
44
44
  Styling is done with [styled-components](https://styled-components.com/), a CSS-in-JS library.
45
45
 
46
- The approach is roughly:
47
-
48
- 1. A "base" styled component with shared styles: `ButtonBase`
49
- 2. Each variant in the Figma designs is a styled component 'extending' the base component: ` const PrimaryButton = styled(ButtonBase)`
50
-
51
- - All variant are placed in an object (a map but not a `Map()`)
52
- - The exported takes a `variant` prop and uses it to get the right styled component from the object map
53
-
54
- ## Missing
55
-
56
- This component library is very much a work in progress and has many gaps.
57
-
58
- - Far from all components in the Components Figma have been implemented
59
- - For existing component, we need more documentation. Often, design systems include a "Guidelines" or "When to Use" section" on the component doc page.
60
- - Tests!
61
-
62
- ## Guiding Principles
63
-
64
- Partly inspired by these
65
-
66
- - [Notes on maintaining an internal React component library](https://www.gabe.pizza/notes-on-component-libraries/)
67
- - [Component API Standards](https://jonambas.com/posts/component-api-standards)
68
-
69
46
  ### Start Simple
70
47
 
71
48
  Or the “Principle of Least Power”.
@@ -106,7 +83,7 @@ Similar to last point. Compound components scale better.
106
83
  ```jsx
107
84
  <AlertDialog>
108
85
  <AlertDialogTrigger asChild>
109
- <Button>Open dialog</Button>
86
+ <Button size='small'>Open dialog</Button>
110
87
  </AlertDialogTrigger>
111
88
  <AlertDialogContent size={size}>
112
89
  <AlertDialogTitle>Header</AlertDialogTitle>
@@ -130,260 +107,3 @@ Similar to last point. Compound components scale better.
130
107
  </AlertDialogContent>
131
108
  </AlertDialog>
132
109
  ```
133
-
134
- ### Prefer React Context for components that depend on each other
135
-
136
- Compound components are components that <q cite="https://kentcdodds.com/blog/compound-components-with-react-hooks">components that work together to accomplish a useful task</q>.
137
- Radix makes extensive use of compound components.
138
-
139
- Also see [Most of the time, it’s a good idea to use React context for components that depend on each other.](https://www.gabe.pizza/notes-on-component-libraries/#most-of-the-time-its-a-good-idea-to-use-react-context-for-components-that-depend-on-each-other) for an example.
140
-
141
- The context should only be consumed within the library component and not exported.
142
-
143
- <figure>
144
- <blockquote>
145
- [T]he context should be kept internal to the library. Allowing the naked context to be imported and handled by applications creates a brittle coupling that will easily break in future upgrades.
146
- </blockquote>
147
- <figcaption>
148
- <cite>
149
- <a href="https://www.gabe.pizza/notes-on-component-libraries/#most-of-the-time-its-a-good-idea-to-use-react-context-for-components-that-depend-on-each-other">Notes on maintaining an internal React component library
150
- — Most of the time, it’s a good idea to use React context for components that depend on each other.</a>
151
- </cite>
152
- </figcaption>
153
- </figure>
154
-
155
- ### Avoid the `React.Children` API and `React.cloneElement`, prefer React Context
156
-
157
- Avoid the Children API and `cloneElement`.
158
-
159
- The Children API is a <q>leaky abstraction</q> and in [maintenance mode](https://github.com/reactjs/rfcs/pull/61#issuecomment-431247764).
160
- <small>At the moment it's only used in the breadcrumbs component.</small>
161
-
162
- The [React docs](https://beta.reactjs.org/reference/react/cloneElement#cloneelement) discourages the use of `cloneElement` because <q cite="https://beta.reactjs.org/reference/react/cloneElement#cloneelement">Cloning children makes it hard to tell how the data flows through your app.</q> and <q cite="https://beta.reactjs.org/reference/react/cloneElement#cloneelement">Using cloneElement is uncommon and can lead to fragile code</q>.
163
-
164
- ### Don't rename HTML attributes
165
-
166
- <figure>
167
- <blockquote> Native attributes or common props, such as `className`, `id` or `onClick`, should not be renamed. Don't force your engineers to learn APIs they already know.</blockquote>
168
- <figcaption>
169
- <cite>
170
- <a href="https://www.jonambas.com/posts/component-api-standards">React Component API Standards — Native Attributes</a>
171
- </cite>
172
- </figcaption>
173
- </figure>
174
-
175
- - ❌ `<TextInput isDisabled />`
176
- - ✅ `<TextInput disabled />`
177
-
178
- It is unfortunate that react-aria breaks with this principle. Therefore we have to rename boolean props before passing them to react-aria's hooks, usually prefix them with `is-`, and the reverse, remove the prefixes from the types.
179
-
180
- ### Use design tokens where possible
181
-
182
- Using design tokens consistently will make it easier to change values at scale in the future.
183
-
184
- - ❌ `color: black;`
185
- - ✅ `color: ${tokens.color_black};`
186
-
187
- ## Prefer meaningful tokens
188
-
189
- For example, if we ever decide to implement dark mode, meaningfully-named tokens will make this switch easier.
190
-
191
- - ❌ `color: ${tokens.color_black};`
192
- - ✅ `color: ${tokens.tokens.color_text_strong};`
193
-
194
- ### Use HSL colors
195
-
196
- [HSL notation](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl) is more readable and more intuitive. Prefer it over other color notations like hex codes or `rgb()`
197
-
198
- - ❌ `color: #4287f5;`
199
- - ❌ `color: rgb(66, 135, 245);`
200
- - ✅ `color: hsl(217deg 90% 61%);`
201
-
202
- Prefer modern [`hsl()`](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl) over `hsla()`. `hsla` is legacy syntax. Add the alpha channel at the end after a `/`.
203
-
204
- - ❌ `color: hsla(217deg, 90%, 61%, 0.8);`
205
- - ✅ `color: hsl(217deg 90% 61% / 0.8);`
206
-
207
- Some reading material on this:
208
-
209
- - [Why you should use HSL over other colour formats in your CSS.](https://sujansundareswaran.com/blog/why-hsl-is-better-than-hex-and-rgb)
210
- - [Using HSL Colors In CSS](https://www.smashingmagazine.com/2021/07/hsl-colors-css/)
211
-
212
- ## Avoid adding margins by default to components
213
-
214
- Avoid “leaky margins”. When possible, prefer a flex or grid container to space child items.
215
-
216
- There are exceptions, eg a header or footer that is expected to always have some room below or above it.
217
-
218
- <figure>
219
- <blockquote>The trouble with confining styles to objects is that not everything should be considered a property of an object per se. Take margins: margins are something that exist between elements. Simply giving an element a top margin makes no sense, no matter how few or how many times you do it. <em>It’s like applying glue to one side of an object before you’ve determined whether you actually want to stick it to something or what that something might be.</em>
220
- </blockquote>
221
- <figcaption>
222
- <cite>
223
- <a href="https://alistapart.com/article/axiomatic-css-and-lobotomized-owls/#section5">Axiomatic CSS and Lobotomized Owls — Dispensing with margins
224
- by Heydon Pickering</a>
225
- </cite>
226
- </figcaption>
227
- </figure>
228
-
229
- ## Style variants
230
-
231
- > **Warning**
232
- > This is not settled and this pattern is not followed consistently (yet?).
233
-
234
- Use CSS variables for the dynamic parts in styled-components using.
235
-
236
- See [The styled-components Happy Path](https://www.joshwcomeau.com/css/styled-components/)
237
-
238
- ### Merge props
239
-
240
- Use the [`mergeProps`](https://react-spectrum.adobe.com/react-aria/mergeProps.html) function from `@react-aria/util` to merge props correctly.
241
- For example, Radix adds events handlers to buttons inside `*Trigger` components with an `asChild` prop, `mergeProps` ensures there are chained instead of overwritten which enables functionality to be composed.
242
-
243
- ### Forward refs
244
-
245
- <figure>
246
- <blockquote>Refs should always be forwarded, either to the outermost DOM element, or to the most applicable element of the component. For example form components should forward refs to `<input/>`.</blockquote>
247
- <figcaption>
248
- <cite>
249
- <a href="https://www.jonambas.com/posts/component-api-standards">React Component API Standards — Refs</a>
250
- </cite>
251
- </figcaption>
252
- </figure>
253
-
254
- This is very important for components based on RadixUI and react-aria to work correctly.
255
-
256
- <figure>
257
- <blockquote>All component parts that render a DOM element have an `asChild` prop. This is useful when you want a part to attach its accessibility and functional requirements onto your own element instead.</blockquote>
258
- <figcaption>
259
- <cite>
260
- <a href="https://www.radix-ui.com/docs/primitives/overview/styling#changing-the-rendered-element">React Component API Standards — Changing the rendered element</a>
261
- </cite>
262
- </figcaption>
263
- </figure>
264
-
265
- For components based on react-aria that require a DOM ref, use `useObjectRef` hook from `@react-aria/utils` with the forwarded ref. See PR [Add a useObjectRef util](https://github.com/adobe/react-spectrum/pull/2293)
266
-
267
- ### Prefer attribute selectors to style component states
268
-
269
- Don't add classNames to style a component in a certain state (eg invalid, selected, disabled), use attribute selectors instead. Use `aria-` or custom `data-` attributes to add styles for states.
270
-
271
- Prefer `~=` over `=`. `~=` matches <q cite="https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors#syntax">whitespace-separated list of words, one of which is exactly value</q>, whereas `=` matches an <q>attr whose value is exactly value</q>.
272
- For compound states, e.g `date-state='selected on'` the latter will not work.
273
-
274
- (I like to think of it like `[...strings.split(" ")].includes(value)`. vs `strings === value`)
275
-
276
- - ❌ `[data-state='selected']`.
277
- - ✅ `[data-state~='selected']`
278
-
279
- Radix adds a custom attribute with the state automatically. The attribute names and values are listed on each component's doc page ([example](https://www.radix-ui.com/docs/primitives/components/toggle#root)).
280
- For component built on react-aria, we need to add `data-` attribute ourselves.
281
-
282
- Recommended reads:
283
-
284
- - [Building a Button Part 1: Press Events](https://react-spectrum.adobe.com/blog/building-a-button-part-1.html)
285
- - [Building a Button Part 2: Hover Interactions](https://react-spectrum.adobe.com/blog/building-a-button-part-2.html)
286
- - [Building a Button Part 3: Keyboard Focus Behavior](https://react-spectrum.adobe.com/blog/building-a-button-part-3.html)
287
-
288
- ### Prefer `:focus-visible` over `:focus`
289
-
290
- Focus state styles should only be shown on keyboard interactions. Basically [`:focus-visible`](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible) is a smarter pseudo-selector that only shows the focus states with (not totally sure about that).
291
-
292
- There are also a few react-aria hooks to handle these interaction state ([useFocus](https://react-spectrum.adobe.com/react-aria/useFocus.html), [useHover](https://react-spectrum.adobe.com/react-aria/useHover.html)), it's not totally clear to me yet what the benefit of these hooks are over plain CSS pseudo-selectors.
293
-
294
- ### TypeScript only
295
-
296
- > **Warning**
297
- > Unfinished
298
-
299
- Only write TypeScript files.
300
- The linting config is also quite strict with `@typescript-eslint`.
301
-
302
- ### Types of component props should be strong
303
-
304
- Correct component types make it easier to use components without having to look at the source or an example.
305
- Exact types for props (for editor autocomplete) is a necessity, not a nice-to-have. Be as detailed as possible.
306
-
307
- <figure>
308
- <blockquote>
309
- <ul>
310
- <li>Avoid “stringly typed” code. Prefer more appropriate types where not every string is a possibility.</li>
311
- <li><em>Prefer a union of string literal types to string if that more accurately describes the domain of a variable. You’ll get stricter type checking and improve the development experience.</em></li>
312
- </ul>
313
- </blockquote>
314
- <figcaption>
315
- <cite>
316
- <a href="https://www.oreilly.com/library/view/effective-typescript/9781492053736/ch04.html#avoid-strings">Effective TypeScript - Prefer More Precise Alternatives to String Types</a>
317
- </cite>
318
- </figcaption>
319
- </figure>
320
-
321
-
322
- - ❌ `type Variant = string;`
323
- - ✅ `type Variant = 'primary' | 'secondary' | 'danger' | 'inverse';`
324
-
325
- ### Avoid spreads on native JSX elements
326
-
327
- > **Warning**
328
- > This is a principle we don't currently abide by but should!
329
-
330
- See [Avoiding JSX spread on foreign data prevents weird bugs sometimes.](https://www.gabe.pizza/notes-on-component-libraries/#avoiding-jsx-spread-on-foreign-data-prevents-weird-bugs-sometimes).
331
-
332
- > I recommend, whenever possible, to destructure the props object and forward keys as needed. Breaking the props down removes excessive keys, allows setting defaults, and makes grepping the code easier.
333
-
334
- Two ways we can solve this
335
-
336
- 1. Filter spread props. Reject all non-DOM props using a utility. Note react-aria has a util names `filterDOMProps` despite its name it does not filter DOM props (I think it's a legacy util).
337
- 2. Be more explicit. Write out all the props to forward and types explicitly.
338
-
339
- Note, Radix often required spreading on to the underlying DOM node
340
-
341
- <figure>
342
- <blockquote>
343
- <em>Your component must spread props</em>.
344
- When Radix clones your component, it will pass its own props and event handlers to make it functional and accessible.
345
- If your component doesn't support those props, it will break.
346
- This is done by spreading all of the props onto the underlying DOM node.
347
- </blockquote>
348
- <figcaption>
349
- <cite>
350
- <a href="https://www.radix-ui.com/docs/primitives/guides/composition#your-component-must-spread-props">Composing with your own React components</a>
351
- </cite>
352
- </figcaption>
353
- </figure>
354
-
355
- ## Configurable Components Should Have Sane Defaults & Not Blow Up Without Props
356
-
357
- > **Warning**
358
- > This is a principle we don't always abide by but should!
359
-
360
- Every component should have enough default props to render without exploding and look normal.
361
-
362
- - ❌ `<Title>Hi</Title>` without `size` prop raising `Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined`
363
- - ✅ `<Title>Hi</Hi>` without `size` prop defaults to `size='medium'` and doesn’t blow up.
364
-
365
-
366
- ## Examples
367
-
368
- - [the component gallery](https://component.gallery/) "Designed to be a reference for anyone building component-based user interfaces, The Component Gallery is an up-to-date repository of interface components based on examples from the world of design systems."
369
- - [Storybook showcase](https://storybook.js.org/showcase)
370
- - [Shopify Polaris](https://polaris.shopify.com/)
371
- - [Primer: React implementation of GitHub's Primer Design System](https://primer.style/react/)
372
- - [Paste: The Design System for building Twilio customer experiences](https://paste.twilio.design/)
373
- - [Spectrum: Adobe’s design system.](https://react-spectrum.adobe.com/react-spectrum/)
374
- - [Evergreen: Segment’s design system](https://evergreen.segment.com/)
375
- - [awesome-react-design-systems](https://github.com/jbranchaud/awesome-react-design-systems)
376
-
377
- ## Misc Reading
378
-
379
- - [The styled-components Happy Path](https://www.joshwcomeau.com/css/styled-components/)
380
- - [Demystifying styled-components](https://www.joshwcomeau.com/react/demystifying-styled-components/)
381
- - [CSS Variables for React Devs](https://www.joshwcomeau.com/css/css-variables-for-react-devs/)
382
- - [You Don’t Need A UI Framework](https://www.smashingmagazine.com/2022/05/you-dont-need-ui-framework/)
383
- - [Vadim Demedes Design system tips](https://twitter.com/i/events/1577907596966641665)
384
- - [The difference between correct-ness and useful-ness in a design system/](https://www.robinrendle.com/notes/the-difference-between-correct-ness-and-useful-ness-in-a-design-system/)
385
- - [Apple Developer: Layout - Foundations - Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/foundations/layout/)
386
-
387
- #### TypeScript
388
-
389
- - [TypeScript + React: Typing Generic forwardRefs](https://fettblog.eu/typescript-react-generic-forward-refs/)