From 68e11a3088943fc7dd782d04829ae62d80be35dc Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Wed, 18 Sep 2024 17:25:04 -0500 Subject: [PATCH 01/17] Docs: Definition of done --- src/data/nav-items.yaml | 8 +- .../contribution-process/images/PDLC-01.png | Bin 0 -> 91341 bytes .../contributing/contribution-process/index | 146 ++++++++++++++++++ .../contributing/{ => get-started}/code.mdx | 3 +- .../contributing/{ => get-started}/design.mdx | 3 +- .../images/carbon-tutorial.gif | Bin .../{ => get-started}/images/combo-button.gif | Bin .../images/icon-only-switcher.gif | Bin .../images/left-hand-nav-delay.gif | Bin .../images/read-only-form-inputs.gif | Bin .../images/two-handle-slider.gif | Bin .../overview.mdx} | 15 +- 12 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 src/pages/contributing/contribution-process/images/PDLC-01.png create mode 100644 src/pages/contributing/contribution-process/index rename src/pages/contributing/{ => get-started}/code.mdx (98%) rename src/pages/contributing/{ => get-started}/design.mdx (98%) rename src/pages/contributing/{ => get-started}/images/carbon-tutorial.gif (100%) rename src/pages/contributing/{ => get-started}/images/combo-button.gif (100%) rename src/pages/contributing/{ => get-started}/images/icon-only-switcher.gif (100%) rename src/pages/contributing/{ => get-started}/images/left-hand-nav-delay.gif (100%) rename src/pages/contributing/{ => get-started}/images/read-only-form-inputs.gif (100%) rename src/pages/contributing/{ => get-started}/images/two-handle-slider.gif (100%) rename src/pages/contributing/{get-started.mdx => get-started/overview.mdx} (90%) diff --git a/src/data/nav-items.yaml b/src/data/nav-items.yaml index 477a17e74b0..d5a623055c2 100644 --- a/src/data/nav-items.yaml +++ b/src/data/nav-items.yaml @@ -43,10 +43,10 @@ pages: - title: Get started path: /contributing/get-started/ - - title: Code - path: /contributing/code/ - - title: Design - path: /contributing/design/ + - title: Contribution process + path: /contributing/contribution-process/ + - title: Component checklist + path: /contributing/component-checklist/ - title: Documentation path: /contributing/documentation/ - title: Migrating diff --git a/src/pages/contributing/contribution-process/images/PDLC-01.png b/src/pages/contributing/contribution-process/images/PDLC-01.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b3a25e9827686ba7167faae5eddfbff7c10272 GIT binary patch literal 91341 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
  • tlcZmd9@0al$j@4~vxXbAc~A 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

    f3_C-Kbu|pwjSt^p3xxyGB6T54=K>! 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 msJtdx9ACdq`}3XM + +In order to contribute to the Carbon ecosystem, it’s essential that we explain Carbon’s process, clearly define milestones in each phase of contribution, and offer a clear “definition of done” for our contributors. + + + + + +Product Development Lifecycle +Discovery +Delivery +Launch and scale + + + +## Product Development Lifecycle + +Last year IBM debuted a new process framework called the Product Development Lifecycle (PDLC). IBM defines the PDLC as the process of taking a product capability from an idea through its development and release to market, and beyond. Since product development takes place in a continuously evolving market, the framework creates room for validation in every phase of the lifecycle. + +The PDLC is organized into three phases: discovery, delivery, and launch & scale. Once a product is in market, agile product teams do all these types of work concurrently, in parallel work streams, with feedback from in-market learnings shaping the priorities of both discovery and delivery. + +- **Discovery phase**: the purpose of the discovery phase is to address any major value, usability, feasibility and viability risks ahead of delivering product-quality code, in order to arrive at a successful product faster and at a lower cost. +- **Delivery phase**: the delivery phase emphasizes the disciplined execution of determining how we will realize user value and maximizing the efficiency of building it. This includes the functional and non-functional requirements, and the user experience required for customers to adopt product features within a production setting. +- **Launch and scale**: Launch and scale of course, involves having clearly defined success criteria or learning objectives that are monitored after launch. In this phase an asset will become stable and achieve Carbon’s “definition of done.” + +_For IBMers only_: You can read more about the PDLC on [IBM’s Winning Products](https//w3.ibm.com/w3publisher/winning-products/how-we-work/product-development-lifecycle) website. + + + + +![Diagram of the PDLC process](images/PDLC-01.png) + + + + +### Phased contribution + +The Carbon team is especially good at organizing the delivery and launch and scale parts of this framework. We run agile scrum like a product team and Carbon’s cross-functional leadership ensures that we prioritize and execute work through the lenses of Product Management, Design, and Engineering simultaneously. This gives us credibility across IBM Software. + +However, we know our weaknesses too. We need to pair with UX Researchers and subject matter experts from product teams to truly accelerate the discovery phase—as we learned during the Carbon for AI work last year. The Carbon team played a crucial role in helping IBM’s AI experts deliver and operationalize a distinct point of view on AI design and it sparked a change in the way we collaborate across teams.  + +We have taken the PDLC framework and applied it to how we expect new components, features, and patterns to be contributed to Carbon. We have broken the contribution process up into three phases, each having their own set of success criteria and deliverables. + +## Discovery + +The discovery phase is where research, exploration, and validation happen. This is when innovations to the system are proposed and reviewed. + +### Discovery criteria + +For an enhancement or net new component to warrant resourcing a discovery phase, we need to determine the requirements for a component/pattern to be considered as an innovation. Proposals need to show that the component or pattern would be “useful and unique.” + +#### Key considerations: +– Does it replicate anything in the system already, or is there truly a gap? +– If the proposal does replicate an existing asset, is there evidence to show that the proposed solution is better? +– Is there already an existing issue or proposal in [Github](https://github.com/carbon-design-system/carbon/issues) to address the gap? +– Is there evidence that the new asset or enhancement would be useful for many teams or services? +– What is the ratio of feasibility to impact to help prioritize (consult developers and accessibility SMEs)? + +### Discovery deliverables + +All deliverables in discovery phase are to be completed by the contributor or proposal requestor. + +| Deliverable | Description | +|-------------|-------------| +| Github issue | Open a [feature request or enhancement issue](https://github.com/carbon-design-system/carbon/issues/new?assignees=&labels=type%3A+enhancement+%F0%9F%92%A1&projects=&template=FEATURE_REQUEST_OR_ENHANCEMENT.yaml&title=%5BFeature+Request%5D%3A+) in the Carbon GitHub outlining the gap that needs to be resolved. The issue should include all supporting materials and evidence you have gathered in the discovery phase. This can include competitive research, potential solutions, or prototypes. | +| DSAG/DSIT presentation | _For IBMers only_: Present your findings at a Design System Adoption Guild (DSAG) or a Design System Implementation Team (DSIT) meeting. [Sign up](https://ibm.box.com/s/3ly1d50o7rde5pnp8v88c1758z2xxhso) for a time slot when you are ready. + +#### Evaluation and next steps +The Carbon team, DSAG, and DSIT will review the proposal and determine next steps for the proposal. + +Not all proposals in the discovery phase will move on in the lifecycle, some explorations may not gain traction or may be deprioritized by other efforts. This does not mean they are not valid or shouldn’t be used; it only means it currently isn’t a priority to systematize at the core level. + +It’s also important to note that Carbon does not take on ownership and maintenance of certain types of assets like full applications, third party tooling, and shared services. For example, although it is shared tooling, the Carbon team does not include the Carbon for AI chat or IBM Assist Me in its libraries.  + +### Component versus pattern + +Defining and standardizing our terms across the ecosystem is crucial as we align against the PDLC. In the past, teams operated under very different assumptions about what a “pattern” versus “component” is. It has been difficult to move towards stability without everyone being on the same page in this respect. + +Eventually, all Carbon and Carbon for IBM Products resources (e.g. libraries, assets, design kits) will follow a schema to standardize definitions and documentation. However, for now, we’re just going to focus on defining the two most important assets in our ecosystem. + +| Asset | Definition | +|-------|------------| +| Component | An asset that has been designed and coded, that can be imported into a UI. | +| Pattern | Patterns are something that can be accomplished in multiple ways utilizing a combination of component(s) with additional design considerations. Because of the many ways patterns can be implemented, it is not possible to provide code for every scenario, but some patterns do have example code. | + +## Delivery + +In the delivery phase, the Carbon team usually collaborates with a workgroup or discovery team to begin to codify and implement their asset as experimental in the Carbon library. + +### Prioritization + +Once a contribution enters the delivery phase it must be prioritized against the other contributions and work streams. The most important factor in determining prioritization in the contribution pipeline is business impact. The greater the case for reuse or support for a high impact team, the more likely a proposal is to move up in the pipeline and garner more Carbon resources. + +### Delivery criteria + +As a component or pattern enters the delivery phase, we begin to consider the requirements for an asset to reach "stable.” By aligning across the Carbon ecosystem on our requirements for stability—or a “definition of done”— we not only share our expectations with contributors, but we can more easily create a backlog of work to prioritize, and more clearly display the status of assets to users. + +#### Key milestones: +– Carbon resource(s) form a squad with the subject matter experts and establish a feasible quarterly roadmap (3-in-a-box perspective) +– A strong source of truth has been established in Figma, including robust design specs and initial usage docs +– Identify 5–8 stakeholder teams for early usage and feedback +– Backlog work begins on kit, docs, code triumvirate per roadmap +– Any breaking changes are integrated into the Carbon library behind a feature flag + +### Delivery deliverables + +We have broken down the deliverables under each of the deliverable categories below in a comprehensive checklist. All requirements in the component checklist must be completed before it to be considered done. Keep in mind that a Carbon resource will always be involved in the delivery phase. + +| Deliverable | Description | +|-------------|-------------| +| Design spec | A completed design spec that mets all requirements in the [design spec checklist](/contributing/component-checklist/#design-spec).| +| Experimental code | Experimental code that can confidently be used in product. The code does not yet need to met all [code checklist](/contributing/component-checklist/#code) requirements. Code is not required for patterns. | + +## Launch and scale + +Launch and scale of course, involves having clearly defined success criteria or learning objectives that are monitored after launch. In this phase an asset will become stable and achieve Carbon’s “definition of done” as defined below. + +### Launch and scale criteria + +In the delivery phase, the workgroups should begin to think about the requirements for a component or pattern to become “stable.” In the launch and scale phase, all of those requirements must be met. + +By aligning on the [requirements](/contributing/component-checklist) across the ecosystem, we not only share our expectations with contributors, we help them build their backlogs. This process also allows us to begin to think about how we want to display the status of assets to users. + +#### Full, peer-review completion of requirements +Along the way you should be requesting peer reviews on the various deliverables. It is crucial to get reviews early and often to make sure all requirements are accounted for. Reach out to the Carbon team if you are unsure who should review your work. + +#### Final steps +— Once an asset is complete there should be a communication plan in place to raise awareness of the new work across multiple channels. +— PMs should also begin to track the usage (product insertions) of the new asset via Figma’s API and the IBM Telemetry service. + +### Launch and scale deliverables + +We have broken down the deliverables under each of the deliverable categories below in a comprehensive checklist. All requirements in the component checklist must be completed for it to be considered done. + +| Deliverable | Description | +|-------------|-------------| +| Code | Code will be considered stable when all requirements in the [code checklist](/contributing/component-checklist/#code) have been met. Code is not required for patterns. | +| Design kit | A Figma component has been published in the appropriate library and mets all requirements in the [design kit checklist](/contributing/component-checklist/#design-kit). | +| Documentation | Documentation has been published in the appropriate website and mets all requirements in the [documentation checklist](/contributing/component-checklist/#documentation). | + diff --git a/src/pages/contributing/code.mdx b/src/pages/contributing/get-started/code.mdx similarity index 98% rename from src/pages/contributing/code.mdx rename to src/pages/contributing/get-started/code.mdx index 1dc5365732a..6cc5a76a922 100644 --- a/src/pages/contributing/code.mdx +++ b/src/pages/contributing/get-started/code.mdx @@ -1,8 +1,9 @@ --- -title: Code +title: Getting started description: Code contributions can include anything from squashing bugs to adding feature requests. Check out the instructions below to contribute code effectively. +tabs: ['Overview', 'Code', 'Design'] --- export const Title = () => Contribute code; diff --git a/src/pages/contributing/design.mdx b/src/pages/contributing/get-started/design.mdx similarity index 98% rename from src/pages/contributing/design.mdx rename to src/pages/contributing/get-started/design.mdx index ecc4a3499ff..bbc5a0f29c1 100644 --- a/src/pages/contributing/design.mdx +++ b/src/pages/contributing/get-started/design.mdx @@ -1,9 +1,10 @@ --- -title: Design +title: Getting started description: Design contributions can involve anything from creating design specs for feature requests to maintaining Figma libraries. Below you'll find tips and best practices to get started. +tabs: ['Overview', 'Code', 'Design'] --- export const Title = () => Contribute design; diff --git a/src/pages/contributing/images/carbon-tutorial.gif b/src/pages/contributing/get-started/images/carbon-tutorial.gif similarity index 100% rename from src/pages/contributing/images/carbon-tutorial.gif rename to src/pages/contributing/get-started/images/carbon-tutorial.gif diff --git a/src/pages/contributing/images/combo-button.gif b/src/pages/contributing/get-started/images/combo-button.gif similarity index 100% rename from src/pages/contributing/images/combo-button.gif rename to src/pages/contributing/get-started/images/combo-button.gif diff --git a/src/pages/contributing/images/icon-only-switcher.gif b/src/pages/contributing/get-started/images/icon-only-switcher.gif similarity index 100% rename from src/pages/contributing/images/icon-only-switcher.gif rename to src/pages/contributing/get-started/images/icon-only-switcher.gif diff --git a/src/pages/contributing/images/left-hand-nav-delay.gif b/src/pages/contributing/get-started/images/left-hand-nav-delay.gif similarity index 100% rename from src/pages/contributing/images/left-hand-nav-delay.gif rename to src/pages/contributing/get-started/images/left-hand-nav-delay.gif diff --git a/src/pages/contributing/images/read-only-form-inputs.gif b/src/pages/contributing/get-started/images/read-only-form-inputs.gif similarity index 100% rename from src/pages/contributing/images/read-only-form-inputs.gif rename to src/pages/contributing/get-started/images/read-only-form-inputs.gif diff --git a/src/pages/contributing/images/two-handle-slider.gif b/src/pages/contributing/get-started/images/two-handle-slider.gif similarity index 100% rename from src/pages/contributing/images/two-handle-slider.gif rename to src/pages/contributing/get-started/images/two-handle-slider.gif diff --git a/src/pages/contributing/get-started.mdx b/src/pages/contributing/get-started/overview.mdx similarity index 90% rename from src/pages/contributing/get-started.mdx rename to src/pages/contributing/get-started/overview.mdx index 53161e5dcae..422498e94fb 100644 --- a/src/pages/contributing/get-started.mdx +++ b/src/pages/contributing/get-started/overview.mdx @@ -1,9 +1,10 @@ --- -title: Get started +title: Getting started description: The Carbon Design System is made possible through a vibrant community of designers and developers. Anyone can contribute code, design, documentation, and ideas. Here's how you can contribute, too! + tabs: ['Overview', 'Code', 'Design'] --- @@ -192,6 +193,10 @@ solutions and then creating a design spec for developers. [Here are issues](https://github.com/carbon-design-system/carbon/issues?q=is%3Aopen+is%3Aissue+label%3A%22needs%3A+community+contribution%22+) in our enhancement backlog that need design or development work. +### New components + +New components are a large multidiscipline contribution and must be contributed in phases to insure quality and business value. To propose a net new component, follow the [phased contribution process](/contributing/contribution-process) and complete all requirements in the [component checklist](contributing/component-checklist). All requirement categories must be completed before a component can be considered done. + ### Design kits This work is all about creating and updating reusable components in Figma. @@ -226,8 +231,10 @@ on the IBM Design Language site. ## The process -Whether you're contributing code, designs, or documentation, there's a process -to follow. Here's what it looks like: +Whether you’re contributing code, designs, or documentation, there’s a process to follow.  +For larger contributions like new components or patterns a more rigorous process must be followed to insure production level quality and business value. We have laid out the phases and criteria on the next page in [contribution process](contributing/contribution-process). + +For smaller contributions like small additions, enhancements, or bug fixes follow the process below. ### 1. Find a project to work on @@ -262,7 +269,7 @@ Guild, Data Viz Guild, or office hours. In these sessions, it is common to share work in progress and ask lots of questions. As you make progress, update your GitHub issue. -### 3. Review and publish +### 3. Submit for review #### Code deliverables From d4dd766c4b2c26a32fc8980cc8e7303f85b2baa2 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Fri, 20 Sep 2024 13:19:37 -0500 Subject: [PATCH 02/17] component-checklist --- .../component-checklist/index.mdx | 41 +++++++++++++++++++ .../contribution-process/{index => index.mdx} | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/pages/contributing/component-checklist/index.mdx rename src/pages/contributing/contribution-process/{index => index.mdx} (99%) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx new file mode 100644 index 00000000000..011002958df --- /dev/null +++ b/src/pages/contributing/component-checklist/index.mdx @@ -0,0 +1,41 @@ +--- +title: Component checklist +description: + When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. +--- + + + +When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. + + + + + +Definition of done +Design spec +Code +Documentation +Design kit + + + +## Definition of done + +By aligning on the requirements for what it means for a component to be stable, we can create a backlog of work to be prioritized, better differentiate when an asset is a component vs pattern, share expectations with contributors, and begin to think about how we want to display the status of assets to users. We can also work backwards from this strict list of requirements to determine when an asset is in experimental. + +Note: Although not all published assets currently meet these requirements, moving forward, we’d like all new assets to adhere to them. + +| Status | PDLC Phase | Description | +| ------ | ---------- | ----------- | +| Design only | Discovery | | +| Experimental | Delivery | | +| Stable | Launch and scale | | + +## Design spec + +The design specification (spec) is completed in the delivery phase of the product development lifecycle (PDLC). It is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| Color tokens | - Design spec uses only color tokens available in the system.
    - Design spec only contains colors that are tokenized.
    - Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | \ No newline at end of file diff --git a/src/pages/contributing/contribution-process/index b/src/pages/contributing/contribution-process/index.mdx similarity index 99% rename from src/pages/contributing/contribution-process/index rename to src/pages/contributing/contribution-process/index.mdx index 628b7ba8c04..1e8b0cbf6b8 100644 --- a/src/pages/contributing/contribution-process/index +++ b/src/pages/contributing/contribution-process/index.mdx @@ -84,7 +84,7 @@ Defining and standardizing our terms across the ecosystem is crucial as we align Eventually, all Carbon and Carbon for IBM Products resources (e.g. libraries, assets, design kits) will follow a schema to standardize definitions and documentation. However, for now, we’re just going to focus on defining the two most important assets in our ecosystem. -| Asset | Definition | +| Asset | Description | |-------|------------| | Component | An asset that has been designed and coded, that can be imported into a UI. | | Pattern | Patterns are something that can be accomplished in multiple ways utilizing a combination of component(s) with additional design considerations. Because of the many ways patterns can be implemented, it is not possible to provide code for every scenario, but some patterns do have example code. | From dba45be9f4d57e07e8281731e29047df30cfbd07 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Fri, 20 Sep 2024 15:57:17 -0500 Subject: [PATCH 03/17] Completed checklists --- .../component-checklist/index.mdx | 64 +++++++++++++++++-- .../contributing/get-started/overview.mdx | 8 +-- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 011002958df..11ce2447e21 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -28,14 +28,70 @@ Note: Although not all published assets currently meet these requirements, movin | Status | PDLC Phase | Description | | ------ | ---------- | ----------- | -| Design only | Discovery | | -| Experimental | Delivery | | -| Stable | Launch and scale | | +| `Draft` | Discovery | Partially complete and not ready for consumption. | +| `Experimental` | Delivery | Partially complete, not production ready. | +| `Stable` | Launch and scale | Complete and ready for production use. | ## Design spec The design specification (spec) is completed in the delivery phase of the product development lifecycle (PDLC). It is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Color tokens** | — Design spec uses only color tokens available in the system.
    — Design spec only contains colors that are tokenized.
    — Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | — Design specs use only type tokens available in the system.
    — Design specs only contain type styles and sizes that are tokenized.
    — Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | +| **Structure and measurements** | — Design spec uses only spacing tokens available in the system when designing your asset.
    — Clearly annotate spacing and alignment for all design elements.
    — Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Accessibility** | — All text colors pass 4.5:1 color contrast with the exceptions of disabled states.
    — All interactive non-text elements meet 3:1 contrast.
    — Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | + +## Code + +In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| Color tokens | - Design spec uses only color tokens available in the system.
    - Design spec only contains colors that are tokenized.
    - Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | \ No newline at end of file +| **API guiding principles** |

  • Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement.
  • Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.
  • Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers.
  • Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business.
  • Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple?
  • | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** |
  • Every interaction spec’d should be implemented.
  • The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.
  • | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** |
  • Component styles use tokens available in the system
  • Component styles do not contain magic numbers or colors that are not tokenized
  • | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** |
  • Component layout, functionality, and ux works on all device sizes from very large to ~320px wide
  • Component styles use media queries where needed
  • | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** |
  • Component has an interface with all props typed
  • Component interface is exported for use in consuming projects
  • | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | + +### Testing + +A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment)

    Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story

    Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated)

    Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | + +## Documentation + +All components and patterns require usage, style, code, and accessibility guidance published on a Carbon ecosystem website. Carbon provides documentation templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*.

    [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | +| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*.

    [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | +| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | +| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| + +## Design kit + +Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | +| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | +| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | + + diff --git a/src/pages/contributing/get-started/overview.mdx b/src/pages/contributing/get-started/overview.mdx index 422498e94fb..ddf6d121d8d 100644 --- a/src/pages/contributing/get-started/overview.mdx +++ b/src/pages/contributing/get-started/overview.mdx @@ -1,10 +1,10 @@ --- title: Getting started description: - The Carbon Design System is made possible through a vibrant community of - designers and developers. Anyone can contribute code, design, documentation, - and ideas. Here's how you can contribute, too! - tabs: ['Overview', 'Code', 'Design'] + Design contributions can involve anything from creating design specs for + feature requests to maintaining Figma libraries. Below you'll find tips and + best practices to get started. +tabs: ['Overview', 'Code', 'Design'] --- From ae13552845f2c94a5322b499029cc0712e985f73 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Mon, 23 Sep 2024 13:14:13 -0500 Subject: [PATCH 04/17] Update index.mdx --- .../component-checklist/index.mdx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 11ce2447e21..e1deafa0c67 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -94,4 +94,52 @@ Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8 | **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | | **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | +## Design spec checklist +The design specification (spec) is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. + + + + +Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. +
    +**Requirements** +- Design spec uses only color tokens available in the system. +- Design spec only contains colors that are tokenized. +- Color token usage is correct according to our documentation and matches applications across the system. + +
    + Content Section + Content Section + Content Section + Content Section + Content Section +
    + + +## Code checklist + +In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. + + + + +Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. +
    +**Requirements** +- Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. +- Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs +- Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers +- Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. +- Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? + +
    + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section +
    \ No newline at end of file From 9bdd573e3768e6e38881d88a937bf9a26b03be11 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Mon, 23 Sep 2024 16:29:10 -0500 Subject: [PATCH 05/17] Update index.mdx --- src/pages/contributing/component-checklist/index.mdx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index e1deafa0c67..a5f2be64688 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -4,6 +4,8 @@ description: When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. --- +import { UnorderedList, ListItem } from '@carbon/react'; + When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. @@ -38,12 +40,12 @@ The design specification (spec) is completed in the delivery phase of the produc | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| **Color tokens** | — Design spec uses only color tokens available in the system.
    — Design spec only contains colors that are tokenized.
    — Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | — Design specs use only type tokens available in the system.
    — Design specs only contain type styles and sizes that are tokenized.
    — Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | -| **Structure and measurements** | — Design spec uses only spacing tokens available in the system when designing your asset.
    — Clearly annotate spacing and alignment for all design elements.
    — Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system.| Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | +| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations.| Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | | **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | | **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | -| **Accessibility** | — All text colors pass 4.5:1 color contrast with the exceptions of disabled states.
    — All interactive non-text elements meet 3:1 contrast.
    — Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | +| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented.| IBM products must meet WCAG AA accessibility standards. | ## Code From c28af409e43640bdf3c12b6468b90e140f3eb49a Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Tue, 24 Sep 2024 16:04:20 -0500 Subject: [PATCH 06/17] incorporated-feedback-from-meeting --- src/data/nav-items.yaml | 4 +- .../contributing/component-checklist/draft | 147 ++++++++++++++++++ .../component-checklist/index.mdx | 130 +++++++--------- .../contribution-process/images/PDLC-01.png | Bin 91341 -> 0 bytes .../contribution-process/index.mdx | 146 ----------------- 5 files changed, 204 insertions(+), 223 deletions(-) create mode 100644 src/pages/contributing/component-checklist/draft delete mode 100644 src/pages/contributing/contribution-process/images/PDLC-01.png delete mode 100644 src/pages/contributing/contribution-process/index.mdx diff --git a/src/data/nav-items.yaml b/src/data/nav-items.yaml index d5a623055c2..a19dd7badef 100644 --- a/src/data/nav-items.yaml +++ b/src/data/nav-items.yaml @@ -42,9 +42,7 @@ - title: Contributing pages: - title: Get started - path: /contributing/get-started/ - - title: Contribution process - path: /contributing/contribution-process/ + path: /contributing/get-started/overview - title: Component checklist path: /contributing/component-checklist/ - title: Documentation diff --git a/src/pages/contributing/component-checklist/draft b/src/pages/contributing/component-checklist/draft new file mode 100644 index 00000000000..a5f2be64688 --- /dev/null +++ b/src/pages/contributing/component-checklist/draft @@ -0,0 +1,147 @@ +--- +title: Component checklist +description: + When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. +--- + +import { UnorderedList, ListItem } from '@carbon/react'; + + + +When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. + + + + + +Definition of done +Design spec +Code +Documentation +Design kit + + + +## Definition of done + +By aligning on the requirements for what it means for a component to be stable, we can create a backlog of work to be prioritized, better differentiate when an asset is a component vs pattern, share expectations with contributors, and begin to think about how we want to display the status of assets to users. We can also work backwards from this strict list of requirements to determine when an asset is in experimental. + +Note: Although not all published assets currently meet these requirements, moving forward, we’d like all new assets to adhere to them. + +| Status | PDLC Phase | Description | +| ------ | ---------- | ----------- | +| `Draft` | Discovery | Partially complete and not ready for consumption. | +| `Experimental` | Delivery | Partially complete, not production ready. | +| `Stable` | Launch and scale | Complete and ready for production use. | + +## Design spec + +The design specification (spec) is completed in the delivery phase of the product development lifecycle (PDLC). It is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system.| Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | +| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations.| Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented.| IBM products must meet WCAG AA accessibility standards. | + +## Code + +In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **API guiding principles** |
  • Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement.
  • Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.
  • Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers.
  • Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business.
  • Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple?
  • | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** |
  • Every interaction spec’d should be implemented.
  • The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.
  • | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** |
  • Component styles use tokens available in the system
  • Component styles do not contain magic numbers or colors that are not tokenized
  • | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** |
  • Component layout, functionality, and ux works on all device sizes from very large to ~320px wide
  • Component styles use media queries where needed
  • | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** |
  • Component has an interface with all props typed
  • Component interface is exported for use in consuming projects
  • | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | + +### Testing + +A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment)

    Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story

    Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated)

    Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | + +## Documentation + +All components and patterns require usage, style, code, and accessibility guidance published on a Carbon ecosystem website. Carbon provides documentation templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*.

    [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | +| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*.

    [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | +| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | +| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| + +## Design kit + +Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. + +| Requirement | Details | Why this matters | +| ----------- | ------- | ---------------- | +| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | +| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | +| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | + +## Design spec checklist + +The design specification (spec) is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. + + + + +Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. +
    +**Requirements** +- Design spec uses only color tokens available in the system. +- Design spec only contains colors that are tokenized. +- Color token usage is correct according to our documentation and matches applications across the system. + +
    + Content Section + Content Section + Content Section + Content Section + Content Section +
    + + +## Code checklist + +In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. + + + + +Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. +
    +**Requirements** +- Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. +- Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs +- Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers +- Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. +- Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? + +
    + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section + Content Section +
    \ No newline at end of file diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index a5f2be64688..ec978761a8f 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -24,71 +24,100 @@ When building components in the Carbon ecosystem, it’s essential that we align ## Definition of done -By aligning on the requirements for what it means for a component to be stable, we can create a backlog of work to be prioritized, better differentiate when an asset is a component vs pattern, share expectations with contributors, and begin to think about how we want to display the status of assets to users. We can also work backwards from this strict list of requirements to determine when an asset is in experimental. +By aligning on the requirements of component stability, we can easily prioritize a backlog of work, share the status of assets with contributors and +better differentiate when an asset is a component versus a pattern. We can also work backward from this strict list of requirements to inform where a component currently is in the [Product Development Lifecycle](https://w3.ibm.com/w3publisher/winning-products/how-we-work/product-development-lifecycle) (PDLC). With each phase, the component should progress in its completeness. Once it has reached stable and all items in the following checklists have been completed, then the component will be considered done. Note: Although not all published assets currently meet these requirements, moving forward, we’d like all new assets to adhere to them. | Status | PDLC Phase | Description | | ------ | ---------- | ----------- | -| `Draft` | Discovery | Partially complete and not ready for consumption. | -| `Experimental` | Delivery | Partially complete, not production ready. | -| `Stable` | Launch and scale | Complete and ready for production use. | +| `Draft` | Discovery | Partially complete, ready for validation. | +| `Preview candidate` | Discovery | Partially complete, with measurable results, stakeholders, and clear business value. | +| `Preview` | Delivery | Mostly complete, changes possible based on feedback, available to use in production. | +| `Stable` | Launch and scale | Complete across code, kit, docs, design, and ready for production use. | ## Design spec -The design specification (spec) is completed in the delivery phase of the product development lifecycle (PDLC). It is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. +The design specification (spec) is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. + + + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | | **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system.| Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | | **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations.| Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | | **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented.| IBM products must meet WCAG AA accessibility standards. | + + + ## Code In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. + + + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| **API guiding principles** |
  • Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement.
  • Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.
  • Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers.
  • Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business.
  • Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple?
  • | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** |
  • Every interaction spec’d should be implemented.
  • The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.
  • | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** |
  • Component styles use tokens available in the system
  • Component styles do not contain magic numbers or colors that are not tokenized
  • | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** |
  • Component layout, functionality, and ux works on all device sizes from very large to ~320px wide
  • Component styles use media queries where needed
  • | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | -| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** |
  • Component has an interface with all props typed
  • Component interface is exported for use in consuming projects
  • | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.| Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** | Component styles use tokens available in the system Component styles do not contain magic numbers or colors that are not tokenized | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide Component styles use media queries where needed | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed Component interface is exported for use in consuming projects | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | + +
    +
    ### Testing A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. + + + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment)

    Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | -| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story

    Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | -| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated)

    Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | -| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment) Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated) Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | + +
    +
    ## Documentation All components and patterns require usage, style, code, and accessibility guidance published on a Carbon ecosystem website. Carbon provides documentation templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). + + + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | -| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*.

    [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | -| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*.

    [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | -| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | -| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| +| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*. [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | +| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*. [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | +| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | +| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| + +
    +
    ## Design kit Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. + + + | Requirement | Details | Why this matters | | ----------- | ------- | ---------------- | | **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | @@ -96,52 +125,5 @@ Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8 | **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | | **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | -## Design spec checklist - -The design specification (spec) is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. - - - - -Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. -
    -**Requirements** -- Design spec uses only color tokens available in the system. -- Design spec only contains colors that are tokenized. -- Color token usage is correct according to our documentation and matches applications across the system. - -
    - Content Section - Content Section - Content Section - Content Section - Content Section -
    - - -## Code checklist - -In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. - - - - -Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. -
    -**Requirements** -- Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. -- Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs -- Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers -- Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. -- Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? - -
    - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section -
    \ No newline at end of file +
    +
    diff --git a/src/pages/contributing/contribution-process/images/PDLC-01.png b/src/pages/contributing/contribution-process/images/PDLC-01.png deleted file mode 100644 index c0b3a25e9827686ba7167faae5eddfbff7c10272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91341 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
  • tlcZmd9@0al$j@4~vxXbAc~A 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

    f3_C-Kbu|pwjSt^p3xxyGB6T54=K>! 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 msJtdx9ACdq`}3XM - -In order to contribute to the Carbon ecosystem, it’s essential that we explain Carbon’s process, clearly define milestones in each phase of contribution, and offer a clear “definition of done” for our contributors. - - - - - -Product Development Lifecycle -Discovery -Delivery -Launch and scale - - - -## Product Development Lifecycle - -Last year IBM debuted a new process framework called the Product Development Lifecycle (PDLC). IBM defines the PDLC as the process of taking a product capability from an idea through its development and release to market, and beyond. Since product development takes place in a continuously evolving market, the framework creates room for validation in every phase of the lifecycle. - -The PDLC is organized into three phases: discovery, delivery, and launch & scale. Once a product is in market, agile product teams do all these types of work concurrently, in parallel work streams, with feedback from in-market learnings shaping the priorities of both discovery and delivery. - -- **Discovery phase**: the purpose of the discovery phase is to address any major value, usability, feasibility and viability risks ahead of delivering product-quality code, in order to arrive at a successful product faster and at a lower cost. -- **Delivery phase**: the delivery phase emphasizes the disciplined execution of determining how we will realize user value and maximizing the efficiency of building it. This includes the functional and non-functional requirements, and the user experience required for customers to adopt product features within a production setting. -- **Launch and scale**: Launch and scale of course, involves having clearly defined success criteria or learning objectives that are monitored after launch. In this phase an asset will become stable and achieve Carbon’s “definition of done.” - -_For IBMers only_: You can read more about the PDLC on [IBM’s Winning Products](https//w3.ibm.com/w3publisher/winning-products/how-we-work/product-development-lifecycle) website. - - - - -![Diagram of the PDLC process](images/PDLC-01.png) - - - - -### Phased contribution - -The Carbon team is especially good at organizing the delivery and launch and scale parts of this framework. We run agile scrum like a product team and Carbon’s cross-functional leadership ensures that we prioritize and execute work through the lenses of Product Management, Design, and Engineering simultaneously. This gives us credibility across IBM Software. - -However, we know our weaknesses too. We need to pair with UX Researchers and subject matter experts from product teams to truly accelerate the discovery phase—as we learned during the Carbon for AI work last year. The Carbon team played a crucial role in helping IBM’s AI experts deliver and operationalize a distinct point of view on AI design and it sparked a change in the way we collaborate across teams.  - -We have taken the PDLC framework and applied it to how we expect new components, features, and patterns to be contributed to Carbon. We have broken the contribution process up into three phases, each having their own set of success criteria and deliverables. - -## Discovery - -The discovery phase is where research, exploration, and validation happen. This is when innovations to the system are proposed and reviewed. - -### Discovery criteria - -For an enhancement or net new component to warrant resourcing a discovery phase, we need to determine the requirements for a component/pattern to be considered as an innovation. Proposals need to show that the component or pattern would be “useful and unique.” - -#### Key considerations: -– Does it replicate anything in the system already, or is there truly a gap? -– If the proposal does replicate an existing asset, is there evidence to show that the proposed solution is better? -– Is there already an existing issue or proposal in [Github](https://github.com/carbon-design-system/carbon/issues) to address the gap? -– Is there evidence that the new asset or enhancement would be useful for many teams or services? -– What is the ratio of feasibility to impact to help prioritize (consult developers and accessibility SMEs)? - -### Discovery deliverables - -All deliverables in discovery phase are to be completed by the contributor or proposal requestor. - -| Deliverable | Description | -|-------------|-------------| -| Github issue | Open a [feature request or enhancement issue](https://github.com/carbon-design-system/carbon/issues/new?assignees=&labels=type%3A+enhancement+%F0%9F%92%A1&projects=&template=FEATURE_REQUEST_OR_ENHANCEMENT.yaml&title=%5BFeature+Request%5D%3A+) in the Carbon GitHub outlining the gap that needs to be resolved. The issue should include all supporting materials and evidence you have gathered in the discovery phase. This can include competitive research, potential solutions, or prototypes. | -| DSAG/DSIT presentation | _For IBMers only_: Present your findings at a Design System Adoption Guild (DSAG) or a Design System Implementation Team (DSIT) meeting. [Sign up](https://ibm.box.com/s/3ly1d50o7rde5pnp8v88c1758z2xxhso) for a time slot when you are ready. - -#### Evaluation and next steps -The Carbon team, DSAG, and DSIT will review the proposal and determine next steps for the proposal. - -Not all proposals in the discovery phase will move on in the lifecycle, some explorations may not gain traction or may be deprioritized by other efforts. This does not mean they are not valid or shouldn’t be used; it only means it currently isn’t a priority to systematize at the core level. - -It’s also important to note that Carbon does not take on ownership and maintenance of certain types of assets like full applications, third party tooling, and shared services. For example, although it is shared tooling, the Carbon team does not include the Carbon for AI chat or IBM Assist Me in its libraries.  - -### Component versus pattern - -Defining and standardizing our terms across the ecosystem is crucial as we align against the PDLC. In the past, teams operated under very different assumptions about what a “pattern” versus “component” is. It has been difficult to move towards stability without everyone being on the same page in this respect. - -Eventually, all Carbon and Carbon for IBM Products resources (e.g. libraries, assets, design kits) will follow a schema to standardize definitions and documentation. However, for now, we’re just going to focus on defining the two most important assets in our ecosystem. - -| Asset | Description | -|-------|------------| -| Component | An asset that has been designed and coded, that can be imported into a UI. | -| Pattern | Patterns are something that can be accomplished in multiple ways utilizing a combination of component(s) with additional design considerations. Because of the many ways patterns can be implemented, it is not possible to provide code for every scenario, but some patterns do have example code. | - -## Delivery - -In the delivery phase, the Carbon team usually collaborates with a workgroup or discovery team to begin to codify and implement their asset as experimental in the Carbon library. - -### Prioritization - -Once a contribution enters the delivery phase it must be prioritized against the other contributions and work streams. The most important factor in determining prioritization in the contribution pipeline is business impact. The greater the case for reuse or support for a high impact team, the more likely a proposal is to move up in the pipeline and garner more Carbon resources. - -### Delivery criteria - -As a component or pattern enters the delivery phase, we begin to consider the requirements for an asset to reach "stable.” By aligning across the Carbon ecosystem on our requirements for stability—or a “definition of done”— we not only share our expectations with contributors, but we can more easily create a backlog of work to prioritize, and more clearly display the status of assets to users. - -#### Key milestones: -– Carbon resource(s) form a squad with the subject matter experts and establish a feasible quarterly roadmap (3-in-a-box perspective) -– A strong source of truth has been established in Figma, including robust design specs and initial usage docs -– Identify 5–8 stakeholder teams for early usage and feedback -– Backlog work begins on kit, docs, code triumvirate per roadmap -– Any breaking changes are integrated into the Carbon library behind a feature flag - -### Delivery deliverables - -We have broken down the deliverables under each of the deliverable categories below in a comprehensive checklist. All requirements in the component checklist must be completed before it to be considered done. Keep in mind that a Carbon resource will always be involved in the delivery phase. - -| Deliverable | Description | -|-------------|-------------| -| Design spec | A completed design spec that mets all requirements in the [design spec checklist](/contributing/component-checklist/#design-spec).| -| Experimental code | Experimental code that can confidently be used in product. The code does not yet need to met all [code checklist](/contributing/component-checklist/#code) requirements. Code is not required for patterns. | - -## Launch and scale - -Launch and scale of course, involves having clearly defined success criteria or learning objectives that are monitored after launch. In this phase an asset will become stable and achieve Carbon’s “definition of done” as defined below. - -### Launch and scale criteria - -In the delivery phase, the workgroups should begin to think about the requirements for a component or pattern to become “stable.” In the launch and scale phase, all of those requirements must be met. - -By aligning on the [requirements](/contributing/component-checklist) across the ecosystem, we not only share our expectations with contributors, we help them build their backlogs. This process also allows us to begin to think about how we want to display the status of assets to users. - -#### Full, peer-review completion of requirements -Along the way you should be requesting peer reviews on the various deliverables. It is crucial to get reviews early and often to make sure all requirements are accounted for. Reach out to the Carbon team if you are unsure who should review your work. - -#### Final steps -— Once an asset is complete there should be a communication plan in place to raise awareness of the new work across multiple channels. -— PMs should also begin to track the usage (product insertions) of the new asset via Figma’s API and the IBM Telemetry service. - -### Launch and scale deliverables - -We have broken down the deliverables under each of the deliverable categories below in a comprehensive checklist. All requirements in the component checklist must be completed for it to be considered done. - -| Deliverable | Description | -|-------------|-------------| -| Code | Code will be considered stable when all requirements in the [code checklist](/contributing/component-checklist/#code) have been met. Code is not required for patterns. | -| Design kit | A Figma component has been published in the appropriate library and mets all requirements in the [design kit checklist](/contributing/component-checklist/#design-kit). | -| Documentation | Documentation has been published in the appropriate website and mets all requirements in the [documentation checklist](/contributing/component-checklist/#documentation). | - From 4f150a25c97549da2886978d1fd0a49bdb662443 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Tue, 24 Sep 2024 16:14:18 -0500 Subject: [PATCH 07/17] Delete draft --- .../contributing/component-checklist/draft | 147 ------------------ 1 file changed, 147 deletions(-) delete mode 100644 src/pages/contributing/component-checklist/draft diff --git a/src/pages/contributing/component-checklist/draft b/src/pages/contributing/component-checklist/draft deleted file mode 100644 index a5f2be64688..00000000000 --- a/src/pages/contributing/component-checklist/draft +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Component checklist -description: - When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. ---- - -import { UnorderedList, ListItem } from '@carbon/react'; - - - -When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. - - - - - -Definition of done -Design spec -Code -Documentation -Design kit - - - -## Definition of done - -By aligning on the requirements for what it means for a component to be stable, we can create a backlog of work to be prioritized, better differentiate when an asset is a component vs pattern, share expectations with contributors, and begin to think about how we want to display the status of assets to users. We can also work backwards from this strict list of requirements to determine when an asset is in experimental. - -Note: Although not all published assets currently meet these requirements, moving forward, we’d like all new assets to adhere to them. - -| Status | PDLC Phase | Description | -| ------ | ---------- | ----------- | -| `Draft` | Discovery | Partially complete and not ready for consumption. | -| `Experimental` | Delivery | Partially complete, not production ready. | -| `Stable` | Launch and scale | Complete and ready for production use. | - -## Design spec - -The design specification (spec) is completed in the delivery phase of the product development lifecycle (PDLC). It is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. - -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system.| Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | -| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations.| Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | -| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented.| IBM products must meet WCAG AA accessibility standards. | - -## Code - -In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. - -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **API guiding principles** |

  • Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement.
  • Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.
  • Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers.
  • Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business.
  • Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple?
  • | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** |
  • Every interaction spec’d should be implemented.
  • The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.
  • | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** |
  • Component styles use tokens available in the system
  • Component styles do not contain magic numbers or colors that are not tokenized
  • | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** |
  • Component layout, functionality, and ux works on all device sizes from very large to ~320px wide
  • Component styles use media queries where needed
  • | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | -| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** |
  • Component has an interface with all props typed
  • Component interface is exported for use in consuming projects
  • | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | - -### Testing - -A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. - -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment)

    Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | -| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story

    Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | -| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated)

    Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | -| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | - -## Documentation - -All components and patterns require usage, style, code, and accessibility guidance published on a Carbon ecosystem website. Carbon provides documentation templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). - -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*.

    [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | -| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*.

    [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | -| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | -| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| - -## Design kit - -Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. - -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | -| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | -| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | - -## Design spec checklist - -The design specification (spec) is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. - - - - -Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. -
    -**Requirements** -- Design spec uses only color tokens available in the system. -- Design spec only contains colors that are tokenized. -- Color token usage is correct according to our documentation and matches applications across the system. - -
    - Content Section - Content Section - Content Section - Content Section - Content Section -
    - - -## Code checklist - -In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. - - - - -Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. -
    -**Requirements** -- Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. -- Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs -- Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers -- Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. -- Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? - -
    - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section - Content Section -
    \ No newline at end of file From 7da37eba752fdb56c869d7516d35254ae772faa1 Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Wed, 25 Sep 2024 16:23:31 -0700 Subject: [PATCH 08/17] fix(format): update --- .../component-checklist/index.mdx | 142 +++++++++++------- .../contributing/get-started/overview.mdx | 17 ++- 2 files changed, 98 insertions(+), 61 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index ec978761a8f..573e535f712 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -1,14 +1,18 @@ --- title: Component checklist description: - When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. + When building components in the Carbon ecosystem, it’s essential that we align + on a “definition of done” to ensure all components are being built with the + same quality and assurance. --- import { UnorderedList, ListItem } from '@carbon/react'; -When building components in the Carbon ecosystem, it’s essential that we align on a “definition of done” to ensure all components are being built with the same quality and assurance. +When building components in the Carbon ecosystem, it’s essential that we align +on a “definition of done” to ensure all components are being built with the same +quality and assurance. @@ -24,106 +28,130 @@ When building components in the Carbon ecosystem, it’s essential that we align ## Definition of done -By aligning on the requirements of component stability, we can easily prioritize a backlog of work, share the status of assets with contributors and -better differentiate when an asset is a component versus a pattern. We can also work backward from this strict list of requirements to inform where a component currently is in the [Product Development Lifecycle](https://w3.ibm.com/w3publisher/winning-products/how-we-work/product-development-lifecycle) (PDLC). With each phase, the component should progress in its completeness. Once it has reached stable and all items in the following checklists have been completed, then the component will be considered done. - -Note: Although not all published assets currently meet these requirements, moving forward, we’d like all new assets to adhere to them. - -| Status | PDLC Phase | Description | -| ------ | ---------- | ----------- | -| `Draft` | Discovery | Partially complete, ready for validation. | -| `Preview candidate` | Discovery | Partially complete, with measurable results, stakeholders, and clear business value. | -| `Preview` | Delivery | Mostly complete, changes possible based on feedback, available to use in production. | -| `Stable` | Launch and scale | Complete across code, kit, docs, design, and ready for production use. | +By aligning on the requirements of component stability, we can easily prioritize +a backlog of work, share the status of assets with contributors and better +differentiate when an asset is a component versus a pattern. We can also work +backward from this strict list of requirements to inform where a component +currently is in the +[Product Development Lifecycle](https://w3.ibm.com/w3publisher/winning-products/how-we-work/product-development-lifecycle) +(PDLC). With each phase, the component should progress in its completeness. Once +it has reached stable and all items in the following checklists have been +completed, then the component will be considered done. + +Note: Although not all published assets currently meet these requirements, +moving forward, we’d like all new assets to adhere to them. + +| Status | PDLC Phase | Description | +| ------------------- | ---------------- | ------------------------------------------------------------------------------------ | +| `Draft` | Discovery | Partially complete, ready for validation. | +| `Preview candidate` | Discovery | Partially complete, with measurable results, stakeholders, and clear business value. | +| `Preview` | Delivery | Mostly complete, changes possible based on feedback, available to use in production. | +| `Stable` | Launch and scale | Complete across code, kit, docs, design, and ready for production use. | ## Design spec -The design specification (spec) is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. +The design specification (spec) is the blueprint used by developers to build the +component in code and for designers making the component in Figma. It is +referenced as the source of truth for the visuals and functionality of a +component. Having an accurate and detailed design spec ensures the component +will be built and represented consistently across experiences. -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system.| Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | -| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations.| Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | -| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented.| IBM products must meet WCAG AA accessibility standards. | +| Requirement | Details | Why this matters | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | +| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | ## Code -In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. +In order for code to be stable, it must meet all of the following requirements. +Experimental code should plan for these requirements, but does not need to meet +them in the discovery or delivery phases. -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel.| Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** | Component styles use tokens available in the system Component styles do not contain magic numbers or colors that are not tokenized | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide Component styles use media queries where needed | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | -| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** | Component has an interface with all props typed Component interface is exported for use in consuming projects | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| Requirement | Details | Why this matters | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** | Component styles use tokens available in the system Component styles do not contain magic numbers or colors that are not tokenized | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide Component styles use media queries where needed | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed Component interface is exported for use in consuming projects | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | -### Testing +### Testing -A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. +A crucial aspect to ensure continued quality of production stable code is +testing. The following testing requirements must be met before a component can +be considered stable. -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment) Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | -| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | -| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated) Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | -| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| Requirement | Details | Why this matters | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment) Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated) Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | -## Documentation +## Documentation -All components and patterns require usage, style, code, and accessibility guidance published on a Carbon ecosystem website. Carbon provides documentation templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). +All components and patterns require usage, style, code, and accessibility +guidance published on a Carbon ecosystem website. Carbon provides documentation +templates to help ensure visual and content expectations. Additional guidance on +creating layouts and images for website documentation can be found in the +[image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) *(last updated Q1 2024)*. [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) *(last updated 2021)*. | The usage documentation helps describe when to use a component and how it works. | -| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) *(last updated Q3 2024)*. [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) *(last updated Q3 2024)*. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | -| **Code docs** | [Code template](/contributing/documentation/#code-template) *(last updated 2022)*. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | -| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) *(last updated 2023)*. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon.| +| Requirement | Details | Why this matters | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) _(last updated Q1 2024)_. [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) _(last updated 2021)_. | The usage documentation helps describe when to use a component and how it works. | +| **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) _(last updated Q3 2024)_. [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) _(last updated Q3 2024)_. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | +| **Code docs** | [Code template](/contributing/documentation/#code-template) _(last updated 2022)_. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | +| **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) _(last updated 2023)_. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon. | ## Design kit -Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. +Our +[IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) +are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the +guild is not part of the Carbon team, they are crucial partners in our +governance model. -| Requirement | Details | Why this matters | -| ----------- | ------- | ---------------- | -| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | -| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | -| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](https://www.figma.com/design/YAnB1jKx0yCUL29j6uSLpg/(v11)-Carbon-Design-System?m=auto). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | +| Requirement | Details | Why this matters | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | +| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | +| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. |
    diff --git a/src/pages/contributing/get-started/overview.mdx b/src/pages/contributing/get-started/overview.mdx index ddf6d121d8d..58832401f3e 100644 --- a/src/pages/contributing/get-started/overview.mdx +++ b/src/pages/contributing/get-started/overview.mdx @@ -195,7 +195,12 @@ in our enhancement backlog that need design or development work. ### New components -New components are a large multidiscipline contribution and must be contributed in phases to insure quality and business value. To propose a net new component, follow the [phased contribution process](/contributing/contribution-process) and complete all requirements in the [component checklist](contributing/component-checklist). All requirement categories must be completed before a component can be considered done. +New components are a large multidiscipline contribution and must be contributed +in phases to insure quality and business value. To propose a net new component, +follow the [phased contribution process](/contributing/contribution-process) and +complete all requirements in the +[component checklist](contributing/component-checklist). All requirement +categories must be completed before a component can be considered done. ### Design kits @@ -231,10 +236,14 @@ on the IBM Design Language site. ## The process -Whether you’re contributing code, designs, or documentation, there’s a process to follow.  -For larger contributions like new components or patterns a more rigorous process must be followed to insure production level quality and business value. We have laid out the phases and criteria on the next page in [contribution process](contributing/contribution-process). +Whether you’re contributing code, designs, or documentation, there’s a process +to follow.  For larger contributions like new components or patterns a more +rigorous process must be followed to insure production level quality and +business value. We have laid out the phases and criteria on the next page in +[contribution process](contributing/contribution-process). -For smaller contributions like small additions, enhancements, or bug fixes follow the process below. +For smaller contributions like small additions, enhancements, or bug fixes +follow the process below. ### 1. Find a project to work on From d85cfb884318b778b56ca29ddde80c1217aa2b23 Mon Sep 17 00:00:00 2001 From: Alison Joseph Date: Thu, 26 Sep 2024 15:01:58 -0500 Subject: [PATCH 09/17] feat: add custom table styles --- src/pages/contributing/component-checklist/index.mdx | 12 ++++++------ src/styles/index.scss | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 573e535f712..272082ce782 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -56,7 +56,7 @@ referenced as the source of truth for the visuals and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. - + | Requirement | Details | Why this matters | @@ -77,7 +77,7 @@ In order for code to be stable, it must meet all of the following requirements. Experimental code should plan for these requirements, but does not need to meet them in the discovery or delivery phases. - + | Requirement | Details | Why this matters | @@ -101,7 +101,7 @@ A crucial aspect to ensure continued quality of production stable code is testing. The following testing requirements must be met before a component can be considered stable. - + | Requirement | Details | Why this matters | @@ -122,12 +122,12 @@ templates to help ensure visual and content expectations. Additional guidance on creating layouts and images for website documentation can be found in the [image production guidelines](https://carbondesignsystem.com/designing/design-resources/#image-production-guidelines). - + | Requirement | Details | Why this matters | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Usage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) _(last updated Q1 2024)_. [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) _(last updated 2021)_. | The usage documentation helps describe when to use a component and how it works. | +| **xxUsage docs** | [Single variant template](/contributing/documentation/#usage-template:-for-components-with-one-variant) _(last updated Q1 2024)_. [Multiple variant template](/contributing/documentation/#usage-template:-for-components-with-multiple-variants) _(last updated 2021)_. | The usage documentation helps describe when to use a component and how it works. | | **Style docs** | [Single variant template](/contributing/documentation/#style-template:-for-components-with-one-variant) _(last updated Q3 2024)_. [Multiple variant template](/contributing/documentation/#style-template:-for-components-with-multiple-variants) _(last updated Q3 2024)_. | The style documentation helps describe how a component looks, including visual specifications such as color, typography, structure, and size. | | **Code docs** | [Code template](/contributing/documentation/#code-template) _(last updated 2022)_. | The code documentation helps developers implement the component. It includes code snippets, dependencies, and version changes. Although Carbon developers write more detailed documentation in Storybook, they still provide several standard pieces of information on the Carbon website. | | **Accessibility docs** | [Accessibility template](/contributing/documentation/#accessibility-template) _(last updated 2023)_. | The published information, written by our A11y SMEs, helps users understand all the accessibility considerations that are baked into Carbon. | @@ -143,7 +143,7 @@ are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. - + | Requirement | Details | Why this matters | diff --git a/src/styles/index.scss b/src/styles/index.scss index 3ce37c81b85..66abbf73c53 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -8,6 +8,7 @@ @import 'structured-list'; @import 'plex-serif'; @import 'meetups'; +@import 'component-checklist'; @import 'overrides'; @import 'src/components/ColorBlock/color-block.scss'; @import 'src/components/ColorGrid/color-grid.scss'; From 56e568c359e91207390c248ea14c081315fa89f2 Mon Sep 17 00:00:00 2001 From: Alison Joseph Date: Thu, 26 Sep 2024 15:18:56 -0500 Subject: [PATCH 10/17] fix: filename --- src/styles/_component-checklist.scss | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/styles/_component-checklist.scss diff --git a/src/styles/_component-checklist.scss b/src/styles/_component-checklist.scss new file mode 100644 index 00000000000..8e95570a511 --- /dev/null +++ b/src/styles/_component-checklist.scss @@ -0,0 +1,16 @@ +//--------------------------------------- +// Contributing / Component checklist +//--------------------------------------- + +// custom table styles +// align to grid +.table--component-checklist .page-table { + th:first-child { + // 2 columns + width: 15.4%; + } + th:nth-child(2) { + // 5 columns + width: 43%; + } +} From 348a6c49e9f008a3833ef9113269178a8b7a678d Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Fri, 27 Sep 2024 15:07:06 -0500 Subject: [PATCH 11/17] Add: content edits --- .../component-checklist/index.mdx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 272082ce782..9fcbccad00f 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -73,24 +73,24 @@ will be built and represented consistently across experiences. ## Code -In order for code to be stable, it must meet all of the following requirements. -Experimental code should plan for these requirements, but does not need to meet -them in the discovery or delivery phases. +In order for code to be stable, it must meet the requirements in the table below. +Preview code should plan for these requirements, but does not need to meet +them in the discovery or delivery phases. For additional guidance how we prefer to write code for the Carbon Design System, see the [Carbon Style Guide](https://github.com/carbon-design-system/carbon/blob/main/docs/style.md). | Requirement | Details | Why this matters | | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. Prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** | Component styles use tokens available in the system Component styles do not contain magic numbers or colors that are not tokenized | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide Component styles use media queries where needed | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. and prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | | **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** | Component has an interface with all props typed Component interface is exported for use in consuming projects | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade` | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | @@ -106,9 +106,9 @@ be considered stable. | Requirement | Details | Why this matters | | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment) Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | -| **Visual regression tests (VRT)** | Component has at least one test for VRT using Percy - the default story Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | -| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by [accessibility-checker](https://www.ibm.com/able/toolkit/verify/automated) Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by accessibility-checker | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment). Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test on the default story for VRT using Percy. Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT. | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by the [IBM Equal Access Accessibility Checker](https://www.ibm.com/able/toolkit/tools/#develop). Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by IBM Equal Access Accessibility Checker. | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | | **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | @@ -150,8 +150,8 @@ governance model. | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | | **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | -| **Built to spec** | The Figma component should match the [design spec](/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic tracking. | +| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic trackingto better understand adoption and usage. |
    From 82942b467ab826a2e228f9139868cbbb47d24ddb Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Mon, 30 Sep 2024 12:04:47 -0500 Subject: [PATCH 12/17] Apply suggestions from design review Co-authored-by: Alina Jacob <159760598+alina-jacob@users.noreply.github.com> --- src/pages/contributing/component-checklist/index.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 9fcbccad00f..81ecf864ccf 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -62,10 +62,10 @@ will be built and represented consistently across experiences. | Requirement | Details | Why this matters | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system | +| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | | **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, ect. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, ect. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | | **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. |
    From 1903afa3bd54fc5639b7aa306bdc44d5312a0009 Mon Sep 17 00:00:00 2001 From: Alison Joseph Date: Mon, 30 Sep 2024 12:13:32 -0500 Subject: [PATCH 13/17] chore: yarn format --- .../component-checklist/index.mdx | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 81ecf864ccf..bf2eeffbe53 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -62,7 +62,7 @@ will be built and represented consistently across experiences. | Requirement | Details | Why this matters | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | +| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | | **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | | **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | | **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | @@ -73,24 +73,26 @@ will be built and represented consistently across experiences. ## Code -In order for code to be stable, it must meet the requirements in the table below. -Preview code should plan for these requirements, but does not need to meet -them in the discovery or delivery phases. For additional guidance how we prefer to write code for the Carbon Design System, see the [Carbon Style Guide](https://github.com/carbon-design-system/carbon/blob/main/docs/style.md). +In order for code to be stable, it must meet the requirements in the table +below. Preview code should plan for these requirements, but does not need to +meet them in the discovery or delivery phases. For additional guidance how we +prefer to write code for the Carbon Design System, see the +[Carbon Style Guide](https://github.com/carbon-design-system/carbon/blob/main/docs/style.md). -| Requirement | Details | Why this matters | -| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Requirement | Details | Why this matters | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. and prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | -| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | @@ -104,12 +106,12 @@ be considered stable. -| Requirement | Details | Why this matters | -| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment). Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | -| **Visual regression tests (VRT)** | Component has at least one test on the default story for VRT using Percy. Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT. | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | +| Requirement | Details | Why this matters | +| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Unit testing** | Component API and functionality should be thoroughly tested using jest and testing-library (therefore in a jsdom environment). Component unit test coverage should meet and exceed 80% of functions, lines, statements, etc. | Validates and ensures that components work as they’re expected to and regressions are not introduced as changes are made. | +| **Visual regression tests (VRT)** | Component has at least one test on the default story for VRT using Percy. Additional “problematic” or highly concerning component states, stories, viewport-widths can be covered by VRT. | Ensures that components do not visually regress as changes are made. This catches bugs early, avoids disruptive mistakes, and supports the overall stability of the system. | | **Accessibility verification tests (AVT)** | Component has one test of it’s default state checked by the [IBM Equal Access Accessibility Checker](https://www.ibm.com/able/toolkit/tools/#develop). Component has all additional “complex” states (open, closed, highlighted, expanded, focused, hovered, clicked, etc) checked by IBM Equal Access Accessibility Checker. | Ensures that components and assets are accessible. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | -| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | +| **Screen reader/voiceover** | Component has been manually tested to read appropriately in JAWS, VoiceOver, and NVDA. | Ensures that components and assets are able to be used by disabled users who utilize screenreaders. First and foremost this is a moral imperative; accessibility benefits everyone. It additionally supports the goal of IBM products and offerings being able to be sold and used in industries bound by law to have accessible experiences. | @@ -150,8 +152,8 @@ governance model. | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | | **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | -| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic trackingto better understand adoption and usage. | +| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic trackingto better understand adoption and usage. |
    From 93e501886459842a29887f7f3f5cf620b02c9766 Mon Sep 17 00:00:00 2001 From: jeanservaas <43144260+jeanservaas@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:56:13 -0400 Subject: [PATCH 14/17] Update index.mdx Jeannie's small type updates --- .../component-checklist/index.mdx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index bf2eeffbe53..1cc5bf48670 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -52,7 +52,7 @@ moving forward, we’d like all new assets to adhere to them. The design specification (spec) is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is -referenced as the source of truth for the visuals and functionality of a +referenced as the source of truth for the visual appearance and functionality of a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. @@ -61,12 +61,12 @@ will be built and represented consistently across experiences. | Requirement | Details | Why this matters | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Color tokens** | Design spec uses only color tokens available in the system.Design spec only contains colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs use only type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | -| **Structure and measurements** | Design spec uses only spacing tokens available in the system when designing your asset.Clearly annotate spacing and alignment for all design elements.Design spec includes all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Includes specifications for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Includes specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | -| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | +| **Color tokens** | Design specs only use color tokens available in the system.Design specs only contain colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | Design specs only use type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | +| **Structure and measurements** | Design specs only use spacing tokens available in the system.Clearly annotate spacing and alignment for all design elements.Design specs include all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Interaction states** | Designs include specs for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Designs include specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. |
    @@ -84,15 +84,15 @@ prefer to write code for the Carbon Design System, see the | Requirement | Details | Why this matters | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **API guiding principles** | Prioritize end user: put the consumer/dev experience above how difficult it might be for us to implement. Interoperability: support wide band coverage of multiple react versions, node LTS versions, etc. and prefer framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable, confusing, complex, too simple? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimize disruption. Developer experience and productivity can be heavily influenced by confusing or needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible - if we can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | | **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system - they support a11y requirements and reduce the maintenance burden within the system. | +| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system — they support a11y requirements and reduce the maintenance burden within the system. | | **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | | **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | | **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | | **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | | **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate - compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate — compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. |
    From 66bf67806b2651bd7a28a4bce7467634179deafe Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Mon, 30 Sep 2024 14:13:37 -0500 Subject: [PATCH 15/17] typos.mdx --- .../contributing/component-checklist/index.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 1cc5bf48670..f9dd4bfc346 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -85,14 +85,14 @@ prefer to write code for the Carbon Design System, see the | Requirement | Details | Why this matters | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | | **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system — they support a11y requirements and reduce the maintenance burden within the system. | | **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | | **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | | **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best in class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser-focus on stability. Reduces the cost spent by a team to migrate — compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in the Storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best-in-class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser focus on stability. Reduces the cost spent by a team to migrate — compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | @@ -141,7 +141,7 @@ creating layouts and images for website documentation can be found in the Our [IBM Figma best practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0) -are maintained, tracked, and peer reviewed by IBM’s Figma guild. Although the +are maintained, tracked, and peer-reviewed by IBM’s Figma guild. Although the guild is not part of the Carbon team, they are crucial partners in our governance model. @@ -150,10 +150,10 @@ governance model. | Requirement | Details | Why this matters | | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **IBM Figma guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before being merged into the main Figma branch. | -| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when doing a search. | -| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality is what sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) All themes - Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytic trackingto better understand adoption and usage. | +| **IBM Figma Guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before merging into the main Figma branch. | +| **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when searching. | +| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytics to understand adoption and usage better. | From e0e888e499613258818510005f35ccf3dfb41c24 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Mon, 30 Sep 2024 14:16:33 -0500 Subject: [PATCH 16/17] Update from Alina's review --- src/pages/contributing/component-checklist/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index f9dd4bfc346..2f19268852e 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -84,7 +84,7 @@ prefer to write code for the Carbon Design System, see the | Requirement | Details | Why this matters | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer Experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | | **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | | **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system — they support a11y requirements and reduce the maintenance burden within the system. | | **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | From 252ab36c3ba13515d401e3380991de54e330e3c5 Mon Sep 17 00:00:00 2001 From: Anna Gonzales Date: Tue, 1 Oct 2024 09:48:14 -0500 Subject: [PATCH 17/17] run prettier --- .../component-checklist/index.mdx | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/pages/contributing/component-checklist/index.mdx b/src/pages/contributing/component-checklist/index.mdx index 2f19268852e..a1e24f037a9 100644 --- a/src/pages/contributing/component-checklist/index.mdx +++ b/src/pages/contributing/component-checklist/index.mdx @@ -52,21 +52,21 @@ moving forward, we’d like all new assets to adhere to them. The design specification (spec) is the blueprint used by developers to build the component in code and for designers making the component in Figma. It is -referenced as the source of truth for the visual appearance and functionality of a -component. Having an accurate and detailed design spec ensures the component +referenced as the source of truth for the visual appearance and functionality of +a component. Having an accurate and detailed design spec ensures the component will be built and represented consistently across experiences. -| Requirement | Details | Why this matters | -| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Color tokens** | Design specs only use color tokens available in the system.Design specs only contain colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | -| **Type tokens** | Design specs only use type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | -| **Structure and measurements** | Design specs only use spacing tokens available in the system.Clearly annotate spacing and alignment for all design elements.Design specs include all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | -| **Interaction states** | Designs include specs for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | -| **Behaviors** | Designs include specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | -| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | +| Requirement | Details | Why this matters | +| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Color tokens** | Design specs only use color tokens available in the system.Design specs only contain colors that are tokenized.Color token usage is correct according to our documentation and matches applications across the system. | Color tokens are essential to the reusability and scalability of the system; they support a11y requirements and reduce the maintenance burden. They also allow for consistent application of color across the system, and make color functionalities like theming possible. | +| **Type tokens** | Design specs only use type tokens available in the system.Design specs only contain type styles and sizes that are tokenized.Type token usage is correct and consistent with matching applications across the system. | Type tokens are essential to the reusability and scalability of the system and they reduce the maintenance burden. They also allow for consistent type use across the system. | +| **Structure and measurements** | Design specs only use spacing tokens available in the system.Clearly annotate spacing and alignment for all design elements.Design specs include all possible configurations such as sizes and content configurations. | Detailed structure and measurement specs allow developers to build assets quicker and ensure that designs are accurately represented in the code. | +| **Interaction states** | Designs include specs for states such as hover, focus, selected, disabled, read-only, error, warning, etc. | Each state of the component needs to be represented in the specification to ensure that accessibility requirements and quality of the designs are accurately represented in the code. | +| **Behaviors** | Designs include specs for behaviors such as responsiveness, content overflow or reflow, expansion, scrolling, etc. | Developers need to understand how the asset will behave when a user interacts with it. Detailed annotations and specs of the various behaviors will ensure that the designs are accurately represented in the code. | +| **Accessibility** | All text colors pass 4.5:1 color contrast with the exceptions of disabled states.All interactive non-text elements meet 3:1 contrast.Flow of focus is clearly documented. | IBM products must meet WCAG AA accessibility standards. | @@ -82,17 +82,17 @@ prefer to write code for the Carbon Design System, see the -| Requirement | Details | Why this matters | -| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | -| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system — they support a11y requirements and reduce the maintenance burden within the system. | -| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | -| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | -| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | -| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in the Storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | -| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best-in-class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | -| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser focus on stability. Reduces the cost spent by a team to migrate — compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | +| Requirement | Details | Why this matters | +| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **API guiding principles** | Prioritize end user: emphasize the consumer/dev experience above difficulty of implementation. Interoperability: support wide band coverage of multiple React versions, node LTS versions, etc. and favor framework/library agnostic approaches to component APIs and designs.Stability: always deprecate before removal, ensure long deprecation periods, consider the migration experience for developers. Composition: components should be broken down into logical pieces to support the many disparate configurations that are required by the business. Developer experience: consider how a developer will use this component; will they find it approachable or confusing? | Careful consideration of API design ensures that future changes to the system can be made in an iterative way that minimizes disruption. Developer experience and productivity can be heavily influenced by needlessly complex APIs. The business has a wide range of requirements and should meet as many of them as possible. Prioritize the user wherever possible — if you can make things easier for them by writing extra code, handling complexity internally, or taking care of a common concern, do so. It’s our job to contain chaos so that it’s easier and faster to build excellent software products. | +| **Built to spec** | Every interaction spec’d should be implemented. The [design spec](/contributing/component-checklist/#design-spec) should match the implementation perfectly down to the pixel. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Tokens** | Component styles use tokens available in the system. Component styles do not contain magic numbers or colors that are not tokenized. | Tokens are essential to the reusability and scalability of the system — they support a11y requirements and reduce the maintenance burden within the system. | +| **Globalization** | All strings are configurable and parameterized (props) in a way that is agnostic and compatible with a wide range of g11n i18n solutions/libraries. | Ensures assets can be reused within products and offerings worldwide. | +| **Responsiveness** | Component layout, functionality, and ux works on all device sizes from very large to ~320px wide. Component styles use media queries where needed. | Ensures assets work properly on small screens so that IBM products and offerings can be used on as many devices as possible. | +| **Storybook** | A default and playground story exists in Storybook. | Ensures re-usable code and a demo are available. | +| **Documentation** | Long-form documentation is provided in both storybook and the carbon website. | Usage examples in the Storybook do not answer all questions, cover all interactions, or provide pointed helpful information regarding the intended component usage and configuration. | +| **Fully Typed/JSDoc** | Component has an interface with all props typed. Component interface is exported for use in consuming projects. | Ensures that components and assets are built using Typescript to attain the inherent benefits of strongly typed programming language, but also provides a best-in-class developer experience (particularly through intellisense), even for those not using TypeScript in their projects. | +| **Codemods** | If the component/change will require migration by consuming teams, an automated code migration script should be written and made available through `@carbon/upgrade`. | Ensure that consumers using a given component will have a graceful experience when breaking changes occur. Also holds a lot of weight as to the perception of the system’s ability to adapt and innovate while maintaining a laser focus on stability. Reduces the cost spent by a team to migrate — compounded across all the teams we support across IBM this can have a significant impact on IBM’s bottom line in cost/productivity. | @@ -148,12 +148,12 @@ governance model. -| Requirement | Details | Why this matters | -| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Requirement | Details | Why this matters | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **IBM Figma Guidelines** | Figma components follow the guidelines as defined in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM-Documentation-Library?node-id=654-4435&t=67lxOP8nwgq7z2E1-0).

    The guidance includes topics on component properties, auto layout, styles, icons, item and base components, content, construction, and file organization. | This checklist ensures components are built correctly before merging into the main Figma branch. | | **IBM Figma Naming Convention** | Figma components follow the component naming convention documented in [IBM Figma Best Practices](https://www.figma.com/design/4UYvy6eey28bD3IvtNF8xP/IBM%C2%AE-Documentation-Library?m=auto&node-id=642-4479&t=1rSjk0nlj8wBV9aK-1). | The naming convention ensures that file architecture and component hierarchies are both standardized and intuitive for the user.

    With this method we are able to have hierarchy between the final components, their bases, and their pieces when we traverse through the assets/instance swapper panels while still being able to view the entire component name when searching. | -| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | -| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytics to understand adoption and usage better. | +| **Built to spec** | The Figma component should match the [design spec](/contributing/component-checklist/#design-spec) perfectly down to the pixel. Every interaction spec’d should be included in the Figma component. | Thorough implementation with intense attention to detail is pivotal to maintaining pervasive design excellence within the system. This high bar of quality sets our system apart and drives adoption, user satisfaction, and overall outcomes. | +| **Published to a library** | A Figma component must be published to the appropriate IBM Figma library. Components built in the Carbon repo are published in [(V11) Carbon Design System](). | A published connected component ensures accurate use across products. It also allows for Figma analytics to understand adoption and usage better. |