Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Component System: Add FormGroup + ControlLabel components #28568

Merged
merged 19 commits into from
Feb 12, 2021

Conversation

ItsJonQ
Copy link

@ItsJonQ ItsJonQ commented Jan 28, 2021

Screen Capture on 2021-01-28 at 16-14-19

This update adds a couple of low-level Form components for the new Component System, as part of #28399

This 2 components are at the heart of creating form-based UI, such as those found with attribute controls / design tools:

Screen Shot 2021-01-28 at 4 34 20 PM

Compatible components (coming soon) would automatically be bound with labels (as well as htmlFor ids for a11y).
This is done through the internal FormGroupContext, resulting in a very minimal component API setup that looks like this:

<FormGroup label="First name">
    <TextInput />
</FormGroup>

The example above would automatically render a label and a unique id. That id would then be bound between the label (via htmlFor) and the <TextInput />.

In the next Component System, all form based components are pre-connected to this FormGroupContext, allowing them to work out of the box with zero setup.

How has this been tested?

Locally in Storybook + Jest.
This component is already used in the next FontSizePicker, which has been tested in Gutenberg.

Local Storybook testing can found here:
http://localhost:50240/?path=/story/components-formgroup--default

After running npm run storybook:dev

Types of changes

  • Enhanced the useInstanceId hook to add a preferredId argument
  • Moved over ControlLabel and FormGroup from @wp-g2/components

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • [n/a] I've updated all React Native files affected by any refactorings/renamings in this PR.

@ItsJonQ ItsJonQ added [Package] Components /packages/components [Feature] Component System WordPress component system labels Jan 28, 2021
@ItsJonQ ItsJonQ self-assigned this Jan 28, 2021
@github-actions
Copy link

github-actions bot commented Jan 28, 2021

Size Change: -8 B (0%)

Total Size: 1.37 MB

Filename Size Change
build/components/index.js 270 kB -29 B (0%)
build/compose/index.js 11 kB +21 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.78 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/index.js 9.09 kB 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/index.js 124 kB 0 B
build/block-editor/style-rtl.css 12.1 kB 0 B
build/block-editor/style.css 12.1 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 103 B 0 B
build/block-library/blocks/audio/style.css 103 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 465 B 0 B
build/block-library/blocks/button/style.css 464 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 233 B 0 B
build/block-library/blocks/buttons/editor.css 233 B 0 B
build/block-library/blocks/buttons/style-rtl.css 303 B 0 B
build/block-library/blocks/buttons/style.css 303 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 390 B 0 B
build/block-library/blocks/cover/editor.css 389 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 396 B 0 B
build/block-library/blocks/embed/style.css 395 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 679 B 0 B
build/block-library/blocks/gallery/editor.css 679 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 395 B 0 B
build/block-library/blocks/navigation-link/editor.css 397 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.34 kB 0 B
build/block-library/blocks/navigation/editor.css 1.34 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 195 B 0 B
build/block-library/blocks/navigation/style.css 195 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 214 B 0 B
build/block-library/blocks/page-list/editor.css 214 B 0 B
build/block-library/blocks/page-list/style-rtl.css 527 B 0 B
build/block-library/blocks/page-list/style.css 526 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 696 B 0 B
build/block-library/blocks/social-links/editor.css 696 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB 0 B
build/block-library/blocks/social-links/style.css 1.37 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 557 B 0 B
build/block-library/blocks/template-part/editor.css 556 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.04 kB 0 B
build/block-library/editor.css 9.03 kB 0 B
build/block-library/index.js 145 kB 0 B
build/block-library/style-rtl.css 8.8 kB 0 B
build/block-library/style.css 8.8 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 48.2 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/core-data/index.js 16.8 kB 0 B
build/customize-widgets/index.js 4.08 kB 0 B
build/customize-widgets/style-rtl.css 168 B 0 B
build/customize-widgets/style.css 168 B 0 B
build/data-controls/index.js 827 B 0 B
build/data/index.js 8.86 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 769 B 0 B
build/dom-ready/index.js 570 B 0 B
build/dom/index.js 4.94 kB 0 B
build/edit-navigation/index.js 10.5 kB 0 B
build/edit-navigation/style-rtl.css 1.18 kB 0 B
build/edit-navigation/style.css 1.18 kB 0 B
build/edit-post/index.js 307 kB 0 B
build/edit-post/style-rtl.css 6.79 kB 0 B
build/edit-post/style.css 6.78 kB 0 B
build/edit-site/index.js 25.4 kB 0 B
build/edit-site/style-rtl.css 4.37 kB 0 B
build/edit-site/style.css 4.37 kB 0 B
build/edit-widgets/index.js 20 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/index.js 41.9 kB 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/element/index.js 4.61 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.77 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.28 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 4.01 kB 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/keyboard-shortcuts/index.js 2.53 kB 0 B
build/keycodes/index.js 1.93 kB 0 B
build/list-reusable-blocks/index.js 3.15 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 5.35 kB 0 B
build/notices/index.js 1.85 kB 0 B
build/nux/index.js 3.41 kB 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.54 kB 0 B
build/primitives/index.js 1.42 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/react-i18n/index.js 1.45 kB 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/index.js 2.92 kB 0 B
build/rich-text/index.js 13.4 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 3.01 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

Copy link
Contributor

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! One last thing we need to do is add these components to the packages/components/tsconfig.json include rule.

@ItsJonQ
Copy link
Author

ItsJonQ commented Jan 29, 2021

@saramarcondes Haiii! I've added the files to tsconfig.json and did the best I could with types, but I'm getting destroyed, lol. 🙈

@sarayourfriend
Copy link
Contributor

@ItsJonQ Because form-group depends on @wordpress/compose which is untyped, we cannot type these modules. Anything that depends on form-group won't be able to be typed either. We should still add prop types to FormGroupContent/Help/Label however.

@gziolo gziolo added the Needs Accessibility Feedback Need input from accessibility label Feb 1, 2021
@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 1, 2021

@saramarcondes Thanks for the heads up! The comment about @wordpress/compose makes sense to me.

Will do my best with the prop JSDoc type definitions

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 1, 2021

@saramarcondes Haii!! I've added types via JSDocs to the FormGroup components. I suspect I didn't do it correctly, haha.

I'm seeing this error:

Syntax error in type: import('react').CSSProperties[ 'width' ] jsdoc/valid-types

Any insight would be helpful! Thank you 🙏

@sarayourfriend
Copy link
Contributor

@ItsJonQ You did it just fine! It's just that the JSDoc parser that is used for our JSDoc linter doesn't understand complex types like function signatures and imports. If you check out other parts of the code based that are typed you'll notice that they're littered with /* eslint-disable jsdoc/valid-types */. This is unfortunate but I'm not sure what we can do about it other than disable the rule (but then we might start getting actually invalid types committed... who knows.

cc @sirreal @gziolo have y'all given any thought to disabling that rule? jsdoc/no-undefined-types is another that tends to give us trouble when typing JavaScript files.

@gziolo
Copy link
Member

gziolo commented Feb 2, 2021

@ItsJonQ You did it just fine! It's just that the JSDoc parser that is used for our JSDoc linter doesn't understand complex types like function signatures and imports. If you check out other parts of the code based that are typed you'll notice that they're littered with /* eslint-disable jsdoc/valid-types */. This is unfortunate but I'm not sure what we can do about it other than disable the rule (but then we might start getting actually invalid types committed... who knows.

cc @sirreal @gziolo have y'all given any thought to disabling that rule? jsdoc/no-undefined-types is another that tends to give us trouble when typing JavaScript files.

Yes, I noticed that for other G2 components as well. It looks like we are reaching the limit for those JSDoc rules. I would personally seek ways to disable them for those files that are typed with TypeScript. As far as I understand those two duplicate their work at the moment. We have tsconfig.json files in every package that has TS types defined, even when not fully, it could be a good compromise to use glob and disable those rules for packages that have at least one file typed. What do you think?

@sarayourfriend
Copy link
Contributor

@gziolo That sounds promising, however I'm not familiar with how to disable rules using file patterns in that way.

@sirreal
Copy link
Member

sirreal commented Feb 2, 2021

When we're typechecking a package, the JSDoc type linter to be is totally irrelevant as far as I can tell. TypeScript tooling handles checking the types.

For packages that are typed or untyped, this is easy. The lint rule is on or off. The problem is that we have some packages now that are progressively being type, e.g. components. I don't think we want to disable the lint rule for these partially typed packages.

A good middle ground would be to disable it for the packages that are completely typed so they don't have to use so many eslint disables. Unfortunately, I think this would have to be a manual list. Doing anything more advanced like trying to parse the tsconfig files to see what's typechecked seems too complex for this problem.

@gziolo
Copy link
Member

gziolo commented Feb 2, 2021

A good middle ground would be to disable it for the packages that are completely typed so they don't have to use so many eslint disables. Unfortunately, I think this would have to be a manual list. Doing anything more advanced like trying to parse the tsconfig files to see what's typechecked seems too complex for this problem.

Can we use the following match as a way to disable those rules?

"include": [ "src/**/*" ]

It would cover the case when some packages are partially typed. We would have to detect all such config files and use their parent folders to construct the rule for overrides. I can prototype something.

@sirreal
Copy link
Member

sirreal commented Feb 3, 2021

Can we use the following match as a way to disable those rules?

"include": [ "src/**/*" ]

Looking at include in tsconfig is going to be complex, I believe. We might need to inspect files, include, and exclude. I may have a good idea for an alternative heuristic 🙂

Our convention is to write types to the dist-types for publish. This requires a field to be added to the package.json when we're ready to publish the types, and we're only doing that when packages are fully typed. We may be able to check package.json for the presence of this, and disable the JSDoc type linter if it's present:

"types": "build-types",

@gziolo
Copy link
Member

gziolo commented Feb 4, 2021

Looking at include in tsconfig is going to be complex, I believe. We might need to inspect files, include, and exclude. I may have a good idea for an alternative heuristic 🙂

Our convention is to write types to the dist-types for publish. This requires a field to be added to the package.json when we're ready to publish the types, and we're only doing that when packages are fully typed. We may be able to check package.json for the presence of this, and disable the JSDoc type linter if it's present:

"types": "build-types",

I opened #28729 to address the issue with ESLint and TS types. It doesn't help with this PR just yet, but overall it should be a step in the right direction.

@sarayourfriend sarayourfriend force-pushed the add/form-group-component branch from bfdd7a5 to ef012fd Compare February 4, 2021 20:45
@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 8, 2021

With VStack integrated (thanks @saramarcondes ), we can continue with this PR 🎉

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 10, 2021

Local Storybook testing can found here:
http://localhost:50240/?path=/story/components-formgroup--default

After running npm run storybook:dev

@sarayourfriend
Copy link
Contributor

Should we see if @diegohaz can do an a11y review for us? I think we've got our bases covered but just to make sure.

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 10, 2021

...@diegohaz can do an a11y review for us? I think we've got our bases covered but just to make sure.
@sarayourfriend Good idea ❤️

@diegohaz diegohaz self-requested a review February 10, 2021 20:54
Copy link
Member

@diegohaz diegohaz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks really good overall, but I noticed two issues with the help text:

  1. The element should be associated with the input using aria-describedby="help-text-id" on the input.

  2. The help text color doesn't meet the minimum contrast ratio required for WCAG 2.1 AA on a white background. You can check this with the Chrome Web Inspector:

    Web Inspector showing contrast ratio

    I guess #767676 or darker should fix this.

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 11, 2021

@diegohaz Amazing! Thank you for checking 😍

We have a design token for muted <Text /> colors:
https://github.com/ItsJonQ/g2/blob/main/packages/styles/src/theme/config.js#L45

I can make the adjustment there, and it should ripple across the system

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 11, 2021

Created a PR here:
ItsJonQ/g2#261


Update: I wonder if it's about time we bring in create-styles and styles into the Gutenberg repo @sarayourfriend 😉

@sarayourfriend
Copy link
Contributor

I wonder if it's about time we bring in create-styles and styles into the Gutenberg repo @sarayourfriend 😉

I'm ready for this, but would want to check with @gziolo first to see if we're far enough along for it to be worth it. We have run into several times where we had to make updates and publish new versions of the style system though, so it'd be nice if those just lived in the ui folder.

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 11, 2021

I'm ready for this, but would want to check with @gziolo first to see

That's fair :)

so it'd be nice if those just lived in the ui folder.

Yessss 🙌

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 11, 2021

Screen Shot 2021-02-11 at 2 48 09 PM

Haii! With the recent push, the contrast for the help text in FormGroup should be fixed 👍

@ItsJonQ
Copy link
Author

ItsJonQ commented Feb 11, 2021

How are folks feeling with the latest updates :D

@gziolo
Copy link
Member

gziolo commented Feb 12, 2021

I wonder if it's about time we bring in create-styles and styles into the Gutenberg repo @sarayourfriend 😉

I'm ready for this, but would want to check with @gziolo first to see if we're far enough along for it to be worth it. We have run into several times where we had to make updates and publish new versions of the style system though, so it'd be nice if those just lived in the ui folder.

Do we have all components moved that FontSizeControl depends on? Let's make sure first that we don't reference @wp-g2/components in the ui folder anymore, and then we can immediately work on create-styles and styles. I agree that for start having those 2 packages as ui/styles and ui/create-styles subfolders would prevent some hassles with package and documentation wrangling 👍

@sarayourfriend
Copy link
Contributor

@gziolo There are actually many left to go. All of the ones currently listed in #28399 are still required for the FontSizeControl.

@gziolo
Copy link
Member

gziolo commented Feb 12, 2021

There are actually many left to go. All of the ones currently listed in #28399 are still required for the FontSizeControl.

Slider, Card or Menu are necessary as well? Well, maybe, I assumed it's composed only of a few components 😄 You know better what to do, it doesn't matter that match what you will move first at this stage. I think it's easier to review components than the more advanced bits related to styles.

@sarayourfriend
Copy link
Contributor

Slider, Card or Menu are necessary as well

These are dependencies of other components that are used. Many components in the G2 system rely on context to render one way or another (Divider for example, depends on Dropdown for it's context, which in turn depends on Menu).

Copy link
Contributor

@sarayourfriend sarayourfriend left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@sarayourfriend sarayourfriend merged commit aedca43 into master Feb 12, 2021
@sarayourfriend sarayourfriend deleted the add/form-group-component branch February 12, 2021 20:01
@github-actions github-actions bot added this to the Gutenberg 10.1 milestone Feb 12, 2021
@gziolo
Copy link
Member

gziolo commented Feb 15, 2021

Slider, Card or Menu are necessary as well

These are dependencies of other components that are used. Many components in the G2 system rely on context to render one way or another (Divider for example, depends on Dropdown for it's context, which in turn depends on Menu).

I find it a bit concerning. I hope that the FontSizeControl is an exception since it's very complex. Overall, I would assume that you should only need the code that is related to a given component so you could take advantage of tree-shaking when you use it with a 3rd party project that doesn't depend on WordPress. We should do an audit and verify whether the current dependencies in the code are optimal.

@sarayourfriend
Copy link
Contributor

I think you're right that we're just hitting on the particularly complex parts of G2 with FontSizeControl. Tree shaking does work (ItsJonQ/g2#37) but I guess there are some interconnected dependencies. They do not spider through the whole project though.

@diegohaz
Copy link
Member

diegohaz commented Feb 15, 2021

I'm not sure if it would work for G2, but one possible solution could be creating more specific components when they depend on some other component's context. For example, DropdownDivider would depend on Dropdown, but Divider wouldn't.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Component System WordPress component system Needs Accessibility Feedback Need input from accessibility [Package] Components /packages/components
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants