From 93a32ffe1e020b0bc1ea86c923f1b86acb6efb99 Mon Sep 17 00:00:00 2001 From: Francesco Longo Date: Mon, 2 Sep 2024 18:30:02 +0200 Subject: [PATCH] feat: Make breadcrumb responsive --- pages/breadcrumb-group/events.page.tsx | 9 +- pages/breadcrumb-group/responsive.page.tsx | 63 ++++++++++++ .../breadcrumb-group/responsiveness.page.tsx | 60 +++++++++++ .../__tests__/global-breadcrumbs.test.tsx | 6 +- .../__integ__/breadcrumb-group.test.ts | 56 ++++++++++- .../__tests__/analytics-metadata.test.tsx | 16 ++- .../__tests__/breadcrumb-group.test.tsx | 39 +++++++- .../__tests__/breadcrumb-item.test.tsx | 17 ---- src/breadcrumb-group/__tests__/utils.test.ts | 99 +++++++++++++++++++ .../__tests__/widgetized-breadcrumbs.test.tsx | 15 +-- src/breadcrumb-group/implementation.tsx | 87 ++++++++++++---- src/breadcrumb-group/interfaces.ts | 5 +- src/breadcrumb-group/item/funnel.tsx | 7 +- src/breadcrumb-group/item/item.tsx | 58 ++++------- src/breadcrumb-group/item/styles.scss | 25 ++--- src/breadcrumb-group/styles.scss | 50 +++------- src/breadcrumb-group/utils.ts | 61 ++++++++++++ 17 files changed, 525 insertions(+), 148 deletions(-) create mode 100644 pages/breadcrumb-group/responsive.page.tsx create mode 100644 pages/breadcrumb-group/responsiveness.page.tsx create mode 100644 src/breadcrumb-group/__tests__/utils.test.ts diff --git a/pages/breadcrumb-group/events.page.tsx b/pages/breadcrumb-group/events.page.tsx index d4d550b5868..7d8d4a5fb73 100644 --- a/pages/breadcrumb-group/events.page.tsx +++ b/pages/breadcrumb-group/events.page.tsx @@ -6,7 +6,7 @@ import { SpaceBetween } from '~components'; import BreadcrumbGroup, { BreadcrumbGroupProps } from '~components/breadcrumb-group'; import ScreenshotArea from '../utils/screenshot-area'; -const items = [ +const defaultItems = [ 'First that is very very very very very very long long long text', 'Second', 'Third', @@ -27,6 +27,7 @@ export default function ButtonDropdownPage() { const onClickCallback = (event: CustomEvent) => { setOnClickMessage(`OnClick: ${event.detail.text} item was selected`); }; + const [items, setItems] = useState(defaultItems); return (
@@ -56,6 +57,12 @@ export default function ButtonDropdownPage() { items={shortItems.map(text => ({ text, href: `#` }))} /> + +
diff --git a/pages/breadcrumb-group/responsive.page.tsx b/pages/breadcrumb-group/responsive.page.tsx new file mode 100644 index 00000000000..417c72e4746 --- /dev/null +++ b/pages/breadcrumb-group/responsive.page.tsx @@ -0,0 +1,63 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import React from 'react'; + +import Box from '~components/box'; +import BreadcrumbGroup from '~components/breadcrumb-group'; +import SpaceBetween from '~components/space-between'; + +export default function ResponsiveBreadcrumbsPage() { + return ( +
+ + +

Responsive breadcrumbs

+ + + + + + + + +
+
+
+ ); +} + +interface ResponsiveBreadcrumbsProps { + items: Array; + widths: Array; +} + +const ResponsiveBreadcrumbs = ({ items, widths }: ResponsiveBreadcrumbsProps) => { + const breadcrumbs = items.map(text => ({ text, href: `#` })); + return ( + + {widths.map((width, key) => ( +
+ +
+ ))} +
+ ); +}; diff --git a/pages/breadcrumb-group/responsiveness.page.tsx b/pages/breadcrumb-group/responsiveness.page.tsx new file mode 100644 index 00000000000..7b15fc4a93e --- /dev/null +++ b/pages/breadcrumb-group/responsiveness.page.tsx @@ -0,0 +1,60 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +import React, { useState } from 'react'; + +import { Button, FormField, SpaceBetween, Textarea } from '~components'; +import BreadcrumbGroup from '~components/breadcrumb-group'; +import Input from '~components/input'; + +export default function ResponsiveBreadcrumbsPage() { + const [itemsLists, setItemsLists] = useState([ + ['A', 'AB', 'ABC', 'ABCD', 'ABCDEF', 'ABCDEFGHIJsjbdkasbdhjabsjdhasjhdabsjd'], + ['EC2', 'Instances', 'i-03abdc1839101a53f'], + [ + 'Amazon S3', + 'Buckets', + '164981592106-us-east-1-athena-results-bucket-n8qxkwo99y', + '5d04ca725b8547220d019af4d3g0ae11', + ], + ]); + const [minBreadcrumbWidth, setMinBreadcrumbWidth] = useState('120'); + const [newBreadcrumb, setNewBreadcrumb] = useState('["A", "AB", "ABCDEFGHIJsjbdkasbdhjabsjdhasjhdabsjd"]'); + return ( +
+ +

Responsive breadcrumbs

+ + { + setMinBreadcrumbWidth(evt.detail.value || undefined); + }} + /> + + setItemsLists([...itemsLists, JSON.parse(newBreadcrumb)])}>Add + } + > +