Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

RFC: Field Package Layout #25380

Merged
merged 5 commits into from
Nov 9, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions rfcs/react-components/convergence/field-package-layout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# RFC: Field Package Layout

---

Contributors: @behowell

## Summary

This RFC explores several options for which packages Field-related components should live in.

## Problem statement

Currently, all Field versions of the components are exported from a single package: `@fluentui/react-field` (this is described in more detail as Option 0 below). This results in a large package with unrelated components exported from it. This RFC aims to decide what is the best place to put the Field component definitions.

## Background

All form components have both a base version without a label (e.g. `Input`), and a Field version that adds a label, message, and layout options (e.g. `InputField`).

### Current package layout: export all from `@fluentui/react-field`

This is how the packages are currently organized: the `@fluentui/react-field` package exports all of the individual component field types (`InputField`, `TextareaField`, etc.), and has dependencies on each components' packages.

**Exports**

- `@fluentui/react-field` exports:
- Field utilities (`useField_unstable`, etc.)
- `CheckboxField`
- `ComboboxField`
- `InputField`
- `ProgressField`
- `RadioGroupField`
- `SelectField`
- `SliderField`
- `SpinButtonField`
- `SwitchField`
- `TextareaField`

**Dependencies**

- `@fluentui/react-field` depends on:
- `@fluentui/react-checkbox`
- `@fluentui/react-combobox`
- `@fluentui/react-input`
- `@fluentui/react-progress`
- `@fluentui/react-radio`
- `@fluentui/react-select`
- `@fluentui/react-slider`
- `@fluentui/react-spinbutton`
- `@fluentui/react-switch`
- `@fluentui/react-textarea`
- `@fluentui/react-icons`
- `@fluentui/react-label`

## Detailed Design or Proposal

### ✅ Option 1: Export Field version from base component package

This would invert the dependencies, and have `@fluentui/react-field` be a utility package that only exports the definitions required to create Field components.

**Exports**

- `@fluentui/react-field` exports:
- Field utilities (`useField_unstable`, etc.)
- `@fluentui/react-input` exports:
- `Input`
- `InputField`
- (Similar for other form component packages)

**Dependencies**

- `@fluentui/react-input` adds dependencies on:
- `@fluentui/react-field`
- `@fluentui/react-icons`
- `@fluentui/react-label`
- (Similar for other form component packages)

#### Pros

- Keeps code related to a component and its Field version in the same place, and doesn't require modifying the base `@fluentui/react-field` package when adding a new component.
- Third parties can use the `@fluentui/react-field` package to create Field versions of their own components without pulling in dependencies on all input controls.

#### Cons

- Adds dependencies on field, label, and icons, to all form component packages. However, this should be tree-shaken out.

## Discarded solutions

### ❌ Option 0: Keep things as they are today

No change: export all field components from `@fluentui/react-field`

#### Pros

- Keeps react-field dependencies (including `@fluentui/react-label` and `@fluentui/react-icons`) out of base component packages.
- All Field-related code is in the same package.

#### Cons

- The `@fluentui/react-field` package depends on many other packages that are unrelated to each other.
- The code related to the base component and its Field version are split between two packages.
- Potentially unexpected that `Input` and `InputField` are in different packages.

### ❌ Option 2: Add `-field` versions of each package

Add the following packages:

- `@fluentui/react-checkbox-field`
- `@fluentui/react-combobox-field`
- `@fluentui/react-input-field`
- `@fluentui/react-progress-field`
- `@fluentui/react-radio-field`
- `@fluentui/react-select-field`
- `@fluentui/react-slider-field`
- `@fluentui/react-spinbutton-field`
- `@fluentui/react-switch-field`
- `@fluentui/react-textarea-field`

**Exports**

- `@fluentui/react-input-field` exports:
- `InputField`
- (Similar for other new packages)

**Dependencies**

- `@fluentui/react-input-field` depends on:
- `@fluentui/react-input`
- `@fluentui/react-field`
- `@fluentui/react-icons`
- `@fluentui/react-label`
- (Similar for other new packages)

#### Pros

- Clean dependency graph; keeps Field and base components separate

#### Cons

- Much more overhead to create and maintain 10+ new packages