diff --git a/docs-ui/src/components/Changelog/index.tsx b/docs-ui/src/components/Changelog/index.tsx index e43c662be5..224e23d668 100644 --- a/docs-ui/src/components/Changelog/index.tsx +++ b/docs-ui/src/components/Changelog/index.tsx @@ -21,21 +21,53 @@ export function Changelog() { .map(version => { const entries = groupedChangelog[version]; + // Group entries by bump type + const groupedByBump = entries.reduce((acc, entry) => { + const bumpType = entry.type || 'other'; + if (!acc[bumpType]) { + acc[bumpType] = []; + } + acc[bumpType].push(entry); + return acc; + }, {} as Record); + + // Define the order of bump types + const bumpOrder = ['breaking', 'new', 'fix', 'other']; + + const bumpSections = bumpOrder + .filter(bumpType => groupedByBump[bumpType]?.length > 0) + .map(bumpType => { + const bumpEntries = groupedByBump[bumpType]; + let sectionTitle = 'Other Changes'; + if (bumpType === 'breaking') { + sectionTitle = 'Breaking Changes'; + } else if (bumpType === 'new') { + sectionTitle = 'New Features'; + } else if (bumpType === 'fix') { + sectionTitle = 'Bug Fixes'; + } + + return `### ${sectionTitle} + + ${bumpEntries + .map(e => { + const prs = + e.prs.length > 0 && + e.prs + .map( + pr => + `[#${pr}](https://github.com/backstage/backstage/pull/${pr})`, + ) + .join(', '); + return `- ${e.description} ${prs}`; + }) + .join('\n')}`; + }) + .join('\n\n'); + return `## Version ${version} - ${entries - .map(e => { - const prs = - e.prs.length > 0 && - e.prs - .map( - pr => - `[#${pr}](https://github.com/backstage/backstage/pull/${pr})`, - ) - .join(', '); - return `- ${e.description} ${prs}`; - }) - .join('\n')}`; + ${bumpSections}`; }) .join('\n'); diff --git a/docs-ui/src/css/mdx.module.css b/docs-ui/src/css/mdx.module.css index 4900455504..61c0208865 100644 --- a/docs-ui/src/css/mdx.module.css +++ b/docs-ui/src/css/mdx.module.css @@ -35,6 +35,7 @@ .li { color: var(--secondary); margin-bottom: 0.5rem; + line-height: 1.5; } .a { diff --git a/docs-ui/src/utils/changelog.ts b/docs-ui/src/utils/changelog.ts index 94317ab78b..9a08063dbe 100644 --- a/docs-ui/src/utils/changelog.ts +++ b/docs-ui/src/utils/changelog.ts @@ -2,6 +2,7 @@ export type Component = | 'avatar' | 'box' | 'button' + | 'button-link' | 'heading' | 'text' | 'icon-button' @@ -18,7 +19,13 @@ export type Component = | 'tooltip' | 'scrollarea' | 'flex' - | 'switch'; + | 'switch' + | 'grid' + | 'searchfield' + | 'radio' + | 'card' + | 'skeleton' + | 'header'; export type Version = `${number}.${number}.${number}`; @@ -26,51 +33,227 @@ export interface ChangelogProps { components: Component[]; description: string; version: Version; - platform: 'oss' | 'portal'; prs: string[]; + type?: 'breaking' | 'new' | 'fix'; } export const changelog: ChangelogProps[] = [ + { + components: ['tooltip'], + version: '0.6.0', + description: 'New `Tooltip` component.', + prs: ['30461'], + type: 'new', + }, + { + components: ['card'], + version: '0.6.0', + description: 'New `Card` component.', + prs: ['30467'], + type: 'new', + }, + { + components: ['header'], + version: '0.6.0', + description: 'New `Header` component.', + prs: ['30410', '30459', '30493'], + type: 'new', + }, + { + components: ['button', 'button-link', 'icon-button'], + version: '0.6.0', + description: 'Improve `Button`, `ButtonIcon` and `ButtonLink` styling.', + prs: ['30448'], + type: 'fix', + }, + { + components: ['text', 'heading'], + version: '0.6.0', + description: + 'Update return types for `Heading` & `Text` components for React 19.', + prs: ['30440'], + type: 'fix', + }, + { + components: ['button', 'button-link', 'icon-button'], + version: '0.6.0', + description: + 'New `tertiary` variant to `Button`, `ButtonIcon` and `ButtonLink`.', + prs: ['30453'], + type: 'new', + }, + { + components: ['skeleton'], + version: '0.6.0', + description: 'New `Skeleton` component.', + prs: ['30466'], + type: 'new', + }, + { + components: ['icon-button'], + version: '0.6.0', + description: 'Rename `IconButton` to `ButtonIcon`.', + prs: ['30297'], + type: 'breaking', + }, + { + components: ['button-link'], + version: '0.6.0', + description: + 'New `ButtonLink`, which replaces the previous render prop pattern on `Button` and `IconButton`.', + prs: ['30297'], + type: 'new', + }, + { + components: ['button', 'button-link', 'icon-button'], + version: '0.6.0', + description: 'Remove the `render` prop from all button-related components.', + prs: ['30297'], + type: 'breaking', + }, + { + components: [], + version: '0.6.0', + description: + 'We are consolidating all css files into a single styles.css in Canon.', + prs: ['30325'], + type: 'fix', + }, + { + components: ['searchfield'], + version: '0.6.0', + description: 'New `SearchField` component.', + prs: ['30357'], + type: 'new', + }, + { + components: ['radio'], + version: '0.6.0', + description: 'New `RadioGroup` + `Radio` component.', + prs: ['30327'], + type: 'new', + }, + { + components: ['textfield'], + version: '0.6.0', + description: 'Added placeholder prop back to `TextField` component.', + prs: ['30286'], + type: 'fix', + }, + { + components: ['textfield'], + version: '0.5.0', + description: '`TextField` in Canon now has multiple label sizes.', + prs: ['30249'], + type: 'breaking', + }, + { + components: ['textfield'], + version: '0.5.0', + description: + '`TextField` can now hide label and description while keeping them available for screen readers.', + prs: ['30249'], + type: 'breaking', + }, + { + components: ['textfield'], + version: '0.5.0', + description: + 'We are removing the `render` prop in favour of the `as` prop on `Heading` and `Text`.', + prs: ['30291'], + type: 'breaking', + }, + { + components: ['textfield'], + version: '0.5.0', + description: 'Move `TextField` component to use react Aria under the hood.', + prs: ['30286'], + type: 'breaking', + }, + { + components: ['button', 'button-link'], + version: '0.5.0', + description: + 'Added a render prop to the `Button` component to use it as a link.', + prs: ['30165'], + type: 'new', + }, + { + components: ['heading'], + version: '0.5.0', + description: 'Fix styling for the title4 prop on the Heading component.', + prs: ['30167'], + type: 'fix', + }, + { + components: ['flex'], + version: '0.5.0', + description: + 'Add `min-width: 0;` by default on Flex components to support truncated text.', + prs: ['30168'], + type: 'fix', + }, + { + components: ['button', 'button-link', 'icon-button'], + version: '0.5.0', + description: + '`Button`, `ButtonLink`, `ButtonIcon` now default to size `small` instead of `medium`', + prs: ['30085', '30097'], + type: 'breaking', + }, + { + components: ['grid'], + version: '0.5.0', + description: 'Rename Grid component to ``', + prs: ['30013'], + type: 'breaking', + }, + { + components: ['flex', 'container', 'grid', 'box'], + version: '0.5.0', + description: 'Fixes spacing props on layout components', + prs: ['30013'], + type: 'fix', + }, { components: ['switch'], version: '0.5.0', - description: '✨ Add new `Switch` component', - platform: 'portal', + description: 'New `Switch` component', prs: ['30251'], + type: 'new', }, { components: ['tabs'], version: '0.4.0', - description: '✨ Add new `Tabs` component', - platform: 'portal', + description: 'New `Tabs` component', prs: ['29996'], + type: 'new', }, { components: ['text', 'heading'], version: '0.4.0', - description: '✨ Add `truncate` prop to `Text` and `Heading`', - platform: 'portal', + description: 'Add `truncate` prop to `Text` and `Heading`', prs: ['29988'], + type: 'new', }, { components: ['menu'], version: '0.4.0', - description: '✨ Add combobox option to `Menu`', - platform: 'portal', + description: 'Add combobox option to `Menu`', prs: ['29986'], + type: 'new', }, { components: ['textfield'], version: '0.4.0', - description: '✨ Add icon prop on `TextField`', - platform: 'portal', + description: 'Add icon prop on `TextField`', prs: ['29820'], + type: 'new', }, { components: ['button', 'icon-button'], version: '0.4.0', description: 'Improve icon props on `Button` and `IconButton`', - platform: 'portal', prs: ['29667'], }, { @@ -78,309 +261,277 @@ export const changelog: ChangelogProps[] = [ version: '0.4.0', description: 'Improve the way we treat custom render on `Text` and `Heading`', - platform: 'portal', prs: ['29989'], }, { components: ['menu'], version: '0.4.0', description: 'Improve `Menu` styles', - platform: 'portal', prs: ['29986'], }, { components: ['textfield'], version: '0.4.0', description: 'Improve `TextField` styles', - platform: 'portal', prs: ['29974'], }, { components: ['textfield'], version: '0.4.0', description: 'Improve clear button on `TextField`', - platform: 'portal', prs: ['29878'], }, { components: ['flex'], version: '0.4.0', description: 'Fix spacing props on all layout components', - platform: 'portal', prs: ['30013'], }, { components: [], version: '0.4.0', description: 'Fix - Pin Base UI version', - platform: 'portal', prs: ['29782'], }, { components: ['select'], version: '0.4.0', description: 'Fix - Clicking `Select` label moves focus to trigger', - platform: 'portal', prs: ['29755'], }, { components: ['datatable'], version: '0.4.0', description: 'Fix `DataTable.Pagination` count issue', - platform: 'portal', prs: ['29688'], }, { components: ['datatable'], version: '0.3.0', description: 'Add `DataTable` component', - platform: 'portal', prs: ['29484', '29603'], + type: 'new', }, { components: ['select'], version: '0.3.0', description: 'Add `Select` component', - platform: 'portal', prs: ['29440'], + type: 'new', }, { components: ['avatar'], version: '0.3.0', description: 'Add `Avatar` component', - platform: 'portal', prs: ['29594'], + type: 'new', }, { components: ['collapsible'], version: '0.3.0', description: 'Add `Collapsible` component', - platform: 'portal', prs: ['29617'], + type: 'new', }, { components: ['textfield'], version: '0.3.0', description: 'Add `TextField` component instead of `Field` + `Input`', - platform: 'portal', prs: ['29364'], + type: 'new', }, { components: ['datatable'], version: '0.3.0', description: 'Add `TableCellProfile`', - platform: 'portal', prs: ['29600'], + type: 'new', }, { components: [], version: '0.3.0', description: 'Add breakpoint hooks - `up()` and `down()`', - platform: 'portal', prs: ['29564'], + type: 'new', }, { components: [], version: '0.3.0', description: 'Add gray scale css tokens', - platform: 'portal', prs: ['29543'], + type: 'new', }, { components: [], version: '0.3.0', description: 'Update CSS styling API using `[data-___]` instead of class names for props', - platform: 'portal', prs: ['29560'], }, { components: ['checkbox'], version: '0.3.0', description: 'Update `Checkbox` dark mode', - platform: 'portal', prs: ['29544'], }, { components: ['container'], version: '0.3.0', description: 'Update `Container` styles', - platform: 'portal', prs: ['29475'], }, { components: ['menu'], version: '0.3.0', description: 'Update `Menu` styles', - platform: 'portal', prs: ['29351'], }, { components: ['select'], version: '0.3.0', description: 'Fix `Select` styles on small sizes + with long option names', - platform: 'portal', prs: ['29545'], }, { components: ['link'], version: '0.3.0', description: 'Fix render prop on `Link`', - platform: 'portal', prs: ['29247'], }, { components: ['textfield', 'select'], version: '0.3.0', description: 'Remove `Field` from `TextField` + `Select`', - platform: 'portal', prs: ['29482'], }, { components: ['text', 'heading'], version: '0.3.0', description: 'Update `textDecoration` to `none` on `Text` / `Heading`', - platform: 'portal', prs: ['29357'], }, { components: ['text', 'heading'], version: '0.3.0', description: 'Update `textDecoration` to `none` on `Text` / `Heading`', - platform: 'portal', prs: ['29357'], }, { components: [], version: '0.3.0', description: 'Docs - Use stories from Storybook for all examples in Nextjs', - platform: 'portal', prs: ['29306'], }, { components: [], version: '0.3.0', description: 'Docs - Add release page (this one 🤗)', - platform: 'portal', prs: ['29461'], }, { components: [], version: '0.3.0', description: 'Docs - Add docs for Menu, Link', - platform: 'portal', prs: ['29576'], }, { components: [], version: '0.3.0', description: 'Fix CSS watch mode', - platform: 'portal', prs: ['29352'], }, { components: ['menu'], version: '0.2.0', description: 'New `Menu` component', - platform: 'portal', prs: ['29151'], + type: 'new', }, { components: ['icon-button'], version: '0.2.0', description: 'New `IconButton` component', - platform: 'portal', prs: ['29239'], + type: 'new', }, { components: ['scrollarea'], version: '0.2.0', description: 'New `ScrollArea` component', - platform: 'portal', prs: ['29240'], + type: 'new', }, { components: ['button', 'checkbox'], version: '0.2.0', description: 'Improve `Button` & `Checkbox` styles', - platform: 'portal', prs: ['29127', '28789'], }, { components: ['text'], version: '0.2.0', description: 'Improve `Text` styles', - platform: 'portal', prs: ['29200'], }, { components: ['icon'], version: '0.2.0', description: 'Renamed `CanonProvider` to `IconProvider`', - platform: 'portal', prs: ['29002'], }, { components: ['icon'], version: '0.2.0', description: 'Added about 40+ new icons', - platform: 'portal', prs: ['29264'], }, { components: [], version: '0.2.0', description: 'Simplified styling into a unique styles.css file', - platform: 'portal', prs: ['29199'], }, { components: [], version: '0.2.0', description: 'Added Canon styles to Backstage', - platform: 'portal', prs: ['29137'], + type: 'new', }, { components: [], version: '0.2.0', description: 'Update global CSS tokens', - platform: 'portal', prs: ['28804'], }, { components: ['flex'], version: '0.2.0', description: 'Merge Stack + Inline into Flex', - platform: 'portal', prs: ['28634'], }, { components: ['button'], version: '0.2.0', description: 'Improve `Button` types', - platform: 'portal', prs: ['29205'], }, { components: [], version: '0.2.0', description: 'Move font weight and family back to each components', - platform: 'portal', prs: ['28972'], }, { components: [], version: '0.2.0', description: 'Fix custom values in spacing props', - platform: 'portal', prs: ['28770'], }, { components: [], version: '0.2.0', description: 'Multiple updates on the Canon Docs site', - platform: 'portal', prs: ['28760'], }, ];