├── .editorconfig ├── .github ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md ├── renovate.json └── workflows │ ├── ci.yaml │ └── pr.yaml ├── .gitignore ├── .husky └── pre-commit ├── .lintstagedrc ├── .markdownlint.json ├── .npmrc ├── .nvmrc ├── .prettierrc ├── .storybook ├── main.js ├── manager-head.html ├── manager.js ├── preview-head.html ├── preview.js └── static │ └── images │ └── avatars │ ├── chrome.png │ ├── clove.png │ ├── default.png │ ├── fennel.png │ ├── linden.png │ ├── reed.png │ ├── rue.png │ ├── sage.png │ ├── system.png │ └── user.png ├── .stylelintrc ├── .svgo.config.js ├── .yarnclean ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── babel.config.js ├── docs ├── adrs │ ├── 001-theming-peer-dependency.md │ ├── 002-theme-default-prop-removal.md │ └── README.md ├── api.md ├── changelogs │ ├── v6.md │ ├── v7.md │ └── v8.md ├── demo.md ├── development.md ├── documentation.md ├── migration.md ├── migrations │ ├── v6.md │ ├── v7.md │ └── v8.md ├── typescript.md └── versioning.md ├── eslint.config.mjs ├── lerna.json ├── package-lock.json ├── package.json ├── packages ├── .template │ ├── README.md │ ├── demo │ │ └── {{lowercase component}}.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── {{capitalize component}}.spec.tsx │ │ │ ├── {{capitalize component}}.tsx │ │ │ └── {{capitalize component}}Text.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── Styled{{capitalize component}}.spec.tsx │ │ │ ├── Styled{{capitalize component}}.ts │ │ │ ├── Styled{{capitalize component}}Text.spec.tsx │ │ │ ├── Styled{{capitalize component}}Text.ts │ │ │ └── index.ts │ │ └── types │ │ │ └── index.ts │ └── tsconfig.build.json ├── accordions │ ├── README.md │ ├── demo │ │ ├── accordion.stories.mdx │ │ ├── stepper.stories.mdx │ │ ├── stories │ │ │ ├── AccordionStory.tsx │ │ │ ├── StepperStory.tsx │ │ │ ├── TimelineStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── timeline.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── accordion │ │ │ │ ├── Accordion.spec.tsx │ │ │ │ ├── Accordion.tsx │ │ │ │ └── components │ │ │ │ │ ├── Header.spec.tsx │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── Label.spec.tsx │ │ │ │ │ ├── Label.tsx │ │ │ │ │ ├── Panel.spec.tsx │ │ │ │ │ ├── Panel.tsx │ │ │ │ │ ├── Section.spec.tsx │ │ │ │ │ └── Section.tsx │ │ │ ├── stepper │ │ │ │ ├── Stepper.spec.tsx │ │ │ │ ├── Stepper.tsx │ │ │ │ └── components │ │ │ │ │ ├── Content.spec.tsx │ │ │ │ │ ├── Content.tsx │ │ │ │ │ ├── Label.spec.tsx │ │ │ │ │ ├── Label.tsx │ │ │ │ │ ├── Step.spec.tsx │ │ │ │ │ └── Step.tsx │ │ │ └── timeline │ │ │ │ ├── Timeline.tsx │ │ │ │ └── components │ │ │ │ ├── Content.tsx │ │ │ │ ├── Item.tsx │ │ │ │ └── OppositeContent.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── accordion │ │ │ │ ├── StyledAccordion.ts │ │ │ │ ├── StyledButton.spec.tsx │ │ │ │ ├── StyledButton.ts │ │ │ │ ├── StyledHeader.ts │ │ │ │ ├── StyledInnerPanel.ts │ │ │ │ ├── StyledPanel.spec.tsx │ │ │ │ ├── StyledPanel.ts │ │ │ │ ├── StyledRotateIcon.spec.tsx │ │ │ │ ├── StyledRotateIcon.ts │ │ │ │ └── StyledSection.ts │ │ │ ├── index.ts │ │ │ ├── stepper │ │ │ │ ├── StyledContent.spec.tsx │ │ │ │ ├── StyledContent.ts │ │ │ │ ├── StyledIcon.spec.tsx │ │ │ │ ├── StyledIcon.ts │ │ │ │ ├── StyledInnerContent.ts │ │ │ │ ├── StyledLabel.spec.tsx │ │ │ │ ├── StyledLabel.ts │ │ │ │ ├── StyledLabelText.spec.tsx │ │ │ │ ├── StyledLabelText.ts │ │ │ │ ├── StyledLine.ts │ │ │ │ ├── StyledStep.spec.tsx │ │ │ │ ├── StyledStep.ts │ │ │ │ ├── StyledStepper.spec.tsx │ │ │ │ └── StyledStepper.ts │ │ │ └── timeline │ │ │ │ ├── StyledContent.ts │ │ │ │ ├── StyledItem.spec.tsx │ │ │ │ ├── StyledItem.ts │ │ │ │ ├── StyledItemIcon.ts │ │ │ │ ├── StyledOppositeContent.spec.tsx │ │ │ │ ├── StyledOppositeContent.ts │ │ │ │ ├── StyledSeparator.ts │ │ │ │ └── StyledTimeline.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── index.ts │ │ │ ├── useAccordionContext.spec.tsx │ │ │ ├── useAccordionContext.ts │ │ │ ├── useHeaderContext.spec.tsx │ │ │ ├── useHeaderContext.ts │ │ │ ├── useSectionContext.spec.tsx │ │ │ ├── useSectionContext.ts │ │ │ ├── useStepContext.ts │ │ │ ├── useStepperContext.ts │ │ │ ├── useTimelineContext.spec.tsx │ │ │ ├── useTimelineContext.ts │ │ │ ├── useTimelineItemContext.spec.tsx │ │ │ └── useTimelineItemContext.ts │ └── tsconfig.build.json ├── avatars │ ├── README.md │ ├── demo │ │ ├── avatar.stories.mdx │ │ ├── statusindicator.stories.mdx │ │ ├── stories │ │ │ ├── AvatarStory.tsx │ │ │ ├── StatusIndicatorStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── ChromeStory.tsx │ │ │ ├── MenuStory.tsx │ │ │ └── StatusMenuStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Avatar.spec.tsx │ │ │ ├── Avatar.tsx │ │ │ ├── StatusIndicator.spec.tsx │ │ │ ├── StatusIndicator.tsx │ │ │ └── components │ │ │ │ └── Text.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledAvatar.spec.tsx │ │ │ ├── StyledAvatar.ts │ │ │ ├── StyledStandaloneStatus.ts │ │ │ ├── StyledStandaloneStatusCaption.ts │ │ │ ├── StyledStandaloneStatusIndicator.ts │ │ │ ├── StyledStatusIndicator.spec.tsx │ │ │ ├── StyledStatusIndicator.ts │ │ │ ├── StyledStatusIndicatorBase.ts │ │ │ ├── StyledText.spec.tsx │ │ │ ├── StyledText.ts │ │ │ ├── index.ts │ │ │ └── utility.ts │ │ └── types │ │ │ └── index.ts │ └── tsconfig.build.json ├── breadcrumbs │ ├── README.md │ ├── demo │ │ ├── breadcrumb.stories.mdx │ │ └── stories │ │ │ ├── BreadcrumbStory.tsx │ │ │ └── data.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Breadcrumb.spec.tsx │ │ │ └── Breadcrumb.tsx │ │ ├── index.ts │ │ └── styled │ │ │ ├── StyledBreadcrumb.spec.tsx │ │ │ ├── StyledBreadcrumb.ts │ │ │ ├── StyledBreadcrumbItem.spec.tsx │ │ │ ├── StyledBreadcrumbItem.ts │ │ │ ├── StyledCenteredBreadcrumbItem.tsx │ │ │ ├── StyledChevronIcon.tsx │ │ │ └── index.ts │ └── tsconfig.build.json ├── buttons │ ├── README.md │ ├── demo │ │ ├── anchor.stories.mdx │ │ ├── button.stories.mdx │ │ ├── chevronButton.stories.mdx │ │ ├── iconButton.stories.mdx │ │ ├── splitButton.stories.mdx │ │ ├── stories │ │ │ ├── ButtonStory.tsx │ │ │ └── SplitButtonStory.tsx │ │ ├── toggleButton.stories.mdx │ │ └── toggleIconButton.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Anchor.spec.tsx │ │ │ ├── Anchor.tsx │ │ │ ├── Button.spec.tsx │ │ │ ├── Button.tsx │ │ │ ├── ChevronButton.spec.tsx │ │ │ ├── ChevronButton.tsx │ │ │ ├── IconButton.spec.tsx │ │ │ ├── IconButton.tsx │ │ │ ├── SplitButton.spec.tsx │ │ │ ├── SplitButton.tsx │ │ │ ├── ToggleButton.spec.tsx │ │ │ ├── ToggleButton.tsx │ │ │ ├── ToggleIconButton.spec.tsx │ │ │ ├── ToggleIconButton.tsx │ │ │ └── components │ │ │ │ ├── EndIcon.tsx │ │ │ │ └── StartIcon.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledAnchor.spec.tsx │ │ │ ├── StyledAnchor.ts │ │ │ ├── StyledButton.spec.tsx │ │ │ ├── StyledButton.ts │ │ │ ├── StyledExternalIcon.spec.tsx │ │ │ ├── StyledExternalIcon.ts │ │ │ ├── StyledIcon.spec.tsx │ │ │ ├── StyledIcon.ts │ │ │ ├── StyledIconButton.spec.tsx │ │ │ ├── StyledIconButton.ts │ │ │ ├── StyledSplitButton.spec.tsx │ │ │ ├── StyledSplitButton.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ └── useSplitButtonContext.ts │ └── tsconfig.build.json ├── chrome │ ├── README.md │ ├── demo │ │ ├── chrome.stories.mdx │ │ ├── sheet.stories.mdx │ │ └── stories │ │ │ ├── ChromeStory.tsx │ │ │ ├── SheetStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Chrome.spec.tsx │ │ │ ├── Chrome.tsx │ │ │ ├── SkipNav.spec.tsx │ │ │ ├── SkipNav.tsx │ │ │ ├── body │ │ │ │ ├── Body.spec.tsx │ │ │ │ ├── Body.tsx │ │ │ │ ├── Content.spec.tsx │ │ │ │ ├── Content.tsx │ │ │ │ ├── Main.spec.tsx │ │ │ │ └── Main.tsx │ │ │ ├── footer │ │ │ │ ├── Footer.spec.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── FooterItem.spec.tsx │ │ │ │ └── FooterItem.tsx │ │ │ ├── header │ │ │ │ ├── Header.spec.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── HeaderItem.spec.tsx │ │ │ │ ├── HeaderItem.tsx │ │ │ │ ├── HeaderItemIcon.spec.tsx │ │ │ │ ├── HeaderItemIcon.tsx │ │ │ │ ├── HeaderItemText.spec.tsx │ │ │ │ ├── HeaderItemText.tsx │ │ │ │ ├── HeaderItemWrapper.spec.tsx │ │ │ │ └── HeaderItemWrapper.tsx │ │ │ ├── nav │ │ │ │ ├── Nav.spec.tsx │ │ │ │ ├── Nav.tsx │ │ │ │ ├── NavItem.spec.tsx │ │ │ │ ├── NavItem.tsx │ │ │ │ ├── NavItemIcon.spec.tsx │ │ │ │ ├── NavItemIcon.tsx │ │ │ │ ├── NavItemText.spec.tsx │ │ │ │ ├── NavItemText.tsx │ │ │ │ └── NavList.tsx │ │ │ └── sheet │ │ │ │ ├── Sheet.spec.tsx │ │ │ │ ├── Sheet.tsx │ │ │ │ └── components │ │ │ │ ├── Body.spec.tsx │ │ │ │ ├── Body.tsx │ │ │ │ ├── Close.spec.tsx │ │ │ │ ├── Close.tsx │ │ │ │ ├── Description.spec.tsx │ │ │ │ ├── Description.tsx │ │ │ │ ├── Footer.spec.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── FooterItem.spec.tsx │ │ │ │ ├── FooterItem.tsx │ │ │ │ ├── Header.spec.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── Title.spec.tsx │ │ │ │ └── Title.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledChrome.ts │ │ │ ├── StyledSkipNav.ts │ │ │ ├── StyledSkipNavIcon.ts │ │ │ ├── body │ │ │ │ ├── StyledBody.ts │ │ │ │ ├── StyledContent.tsx │ │ │ │ └── StyledMain.tsx │ │ │ ├── footer │ │ │ │ ├── StyledFooter.ts │ │ │ │ └── StyledFooterItem.ts │ │ │ ├── header │ │ │ │ ├── StyledBaseHeaderItem.ts │ │ │ │ ├── StyledHeader.ts │ │ │ │ ├── StyledHeaderItem.ts │ │ │ │ ├── StyledHeaderItemIcon.ts │ │ │ │ ├── StyledHeaderItemText.ts │ │ │ │ ├── StyledHeaderItemWrapper.ts │ │ │ │ └── StyledLogoHeaderItem.ts │ │ │ ├── index.ts │ │ │ ├── nav │ │ │ │ ├── StyledBaseNavItem.ts │ │ │ │ ├── StyledBrandmarkNavItem.ts │ │ │ │ ├── StyledLogoNavItem.ts │ │ │ │ ├── StyledNav.ts │ │ │ │ ├── StyledNavButton.ts │ │ │ │ ├── StyledNavItemIcon.ts │ │ │ │ ├── StyledNavItemText.ts │ │ │ │ ├── StyledNavList.ts │ │ │ │ └── StyledNavListItem.ts │ │ │ ├── sheet │ │ │ │ ├── StyledSheet.spec.tsx │ │ │ │ ├── StyledSheet.ts │ │ │ │ ├── StyledSheetBody.ts │ │ │ │ ├── StyledSheetClose.spec.tsx │ │ │ │ ├── StyledSheetClose.ts │ │ │ │ ├── StyledSheetDescription.ts │ │ │ │ ├── StyledSheetFooter.spec.tsx │ │ │ │ ├── StyledSheetFooter.ts │ │ │ │ ├── StyledSheetFooterItem.spec.tsx │ │ │ │ ├── StyledSheetFooterItem.ts │ │ │ │ ├── StyledSheetHeader.spec.tsx │ │ │ │ ├── StyledSheetHeader.ts │ │ │ │ ├── StyledSheetTitle.ts │ │ │ │ ├── StyledSheetWrapper.spec.tsx │ │ │ │ └── StyledSheetWrapper.ts │ │ │ └── utils.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── useBodyContext.ts │ │ │ ├── useChromeContext.ts │ │ │ ├── useFocusableMount.spec.tsx │ │ │ ├── useFocusableMount.ts │ │ │ ├── useNavContext.ts │ │ │ ├── useNavListContext.ts │ │ │ └── useSheetContext.ts │ └── tsconfig.build.json ├── colorpickers │ ├── README.md │ ├── demo │ │ ├── colorPicker.stories.mdx │ │ ├── colorPickerDialog.stories.mdx │ │ ├── colorSwatch.stories.mdx │ │ ├── colorSwatchDialog.stories.mdx │ │ └── stories │ │ │ ├── ColorPickerDialogStory.tsx │ │ │ ├── ColorSwatchDialogStory.tsx │ │ │ └── data.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── ColorPicker │ │ │ │ ├── ColorWell.spec.tsx │ │ │ │ ├── ColorWell.tsx │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── reducer.ts │ │ │ ├── ColorPickerDialog │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.tsx │ │ │ ├── ColorSwatch │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.tsx │ │ │ └── ColorSwatchDialog │ │ │ │ ├── index.spec.tsx │ │ │ │ └── index.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── ColorPicker │ │ │ │ ├── StyledAlphaRange.ts │ │ │ │ ├── StyledColorPicker.ts │ │ │ │ ├── StyledColorWell.ts │ │ │ │ ├── StyledColorWellThumb.ts │ │ │ │ ├── StyledHexField.ts │ │ │ │ ├── StyledHueRange.ts │ │ │ │ ├── StyledInput.ts │ │ │ │ ├── StyledInputGroup.ts │ │ │ │ ├── StyledLabel.ts │ │ │ │ ├── StyledPreview.ts │ │ │ │ ├── StyledRGBAField.spec.tsx │ │ │ │ ├── StyledRGBAField.ts │ │ │ │ ├── StyledSliderGroup.ts │ │ │ │ ├── StyledSliders.spec.tsx │ │ │ │ └── StyledSliders.ts │ │ │ ├── ColorPickerDialog │ │ │ │ ├── StyledButton.ts │ │ │ │ ├── StyledButtonPreview.ts │ │ │ │ ├── StyledTooltipBody.ts │ │ │ │ └── StyledTooltipDialog.ts │ │ │ ├── ColorSwatch │ │ │ │ ├── StyledCell.ts │ │ │ │ ├── StyledColorSwatch.ts │ │ │ │ ├── StyledColorSwatchInput.ts │ │ │ │ ├── StyledColorSwatchLabel.ts │ │ │ │ └── StyledIcon.ts │ │ │ ├── common │ │ │ │ ├── StyledRange.spec.tsx │ │ │ │ └── StyledRange.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── conversion.ts │ │ │ ├── saturation.spec.tsx │ │ │ ├── saturation.ts │ │ │ └── validation.ts │ └── tsconfig.build.json ├── datepickers │ ├── README.md │ ├── demo │ │ ├── datePicker.stories.mdx │ │ ├── datePickerRange.stories.mdx │ │ ├── stories │ │ │ ├── DatePickerRangeStory.tsx │ │ │ ├── DatePickerStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ └── CalendarStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── DatePicker │ │ │ │ ├── DatePicker.spec.tsx │ │ │ │ ├── DatePicker.tsx │ │ │ │ ├── components │ │ │ │ │ ├── Calendar.tsx │ │ │ │ │ ├── Input.tsx │ │ │ │ │ └── MonthSelector.tsx │ │ │ │ └── utils │ │ │ │ │ ├── date-picker-reducer.ts │ │ │ │ │ └── useDatePickerContext.ts │ │ │ └── DatePickerRange │ │ │ │ ├── DatePickerRange.spec.tsx │ │ │ │ ├── DatePickerRange.tsx │ │ │ │ ├── components │ │ │ │ ├── Calendar.tsx │ │ │ │ ├── End.spec.tsx │ │ │ │ ├── End.tsx │ │ │ │ ├── Month.tsx │ │ │ │ ├── Start.spec.tsx │ │ │ │ └── Start.tsx │ │ │ │ └── utils │ │ │ │ ├── date-picker-range-reducer.ts │ │ │ │ └── useDatePickerRangeContext.ts │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledCalendar.ts │ │ │ ├── StyledCalendarItem.ts │ │ │ ├── StyledDatePicker.ts │ │ │ ├── StyledDay.spec.tsx │ │ │ ├── StyledDay.ts │ │ │ ├── StyledDayLabel.ts │ │ │ ├── StyledHeader.ts │ │ │ ├── StyledHeaderLabel.ts │ │ │ ├── StyledHeaderPaddle.spec.tsx │ │ │ ├── StyledHeaderPaddle.ts │ │ │ ├── StyledHighlight.ts │ │ │ ├── StyledMenu.ts │ │ │ ├── StyledMenuWrapper.ts │ │ │ ├── StyledRangeCalendar.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── calendar-utils.spec.ts │ │ │ └── calendar-utils.ts │ └── tsconfig.build.json ├── draggable │ ├── README.md │ ├── demo │ │ ├── draggable-list.stories.mdx │ │ ├── draggable.stories.mdx │ │ ├── dropzone.stories.mdx │ │ ├── stories │ │ │ ├── DraggableListStory.tsx │ │ │ ├── DraggableStory.tsx │ │ │ ├── DropzoneStory.tsx │ │ │ └── data.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── DragAndDropStory.tsx │ │ │ ├── components.tsx │ │ │ ├── data.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── draggable-list │ │ │ │ ├── DraggableList.spec.tsx │ │ │ │ ├── DraggableList.tsx │ │ │ │ └── components │ │ │ │ │ ├── DropIndicator.tsx │ │ │ │ │ └── Item.tsx │ │ │ ├── draggable │ │ │ │ ├── Draggable.spec.tsx │ │ │ │ ├── Draggable.tsx │ │ │ │ └── components │ │ │ │ │ ├── Content.spec.tsx │ │ │ │ │ ├── Content.tsx │ │ │ │ │ ├── Grip.spec.tsx │ │ │ │ │ └── Grip.tsx │ │ │ └── dropzone │ │ │ │ ├── Dropzone.spec.tsx │ │ │ │ ├── Dropzone.tsx │ │ │ │ └── components │ │ │ │ ├── Icon.tsx │ │ │ │ └── Message.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── draggable-list │ │ │ │ ├── StyledDraggableList.spec.tsx │ │ │ │ ├── StyledDraggableList.ts │ │ │ │ ├── StyledDropIndicator.ts │ │ │ │ └── StyledItem.ts │ │ │ ├── draggable │ │ │ │ ├── StyledContent.ts │ │ │ │ ├── StyledDraggable.spec.tsx │ │ │ │ ├── StyledDraggable.ts │ │ │ │ ├── StyledGrip.spec.tsx │ │ │ │ └── StyledGrip.ts │ │ │ ├── dropzone │ │ │ │ ├── StyledDropzone.ts │ │ │ │ ├── StyledIcon.spec.tsx │ │ │ │ ├── StyledIcon.ts │ │ │ │ └── StyledMessage.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── useDraggableListContext.ts │ │ │ └── useDropzoneContext.ts │ └── tsconfig.build.json ├── dropdowns.legacy │ ├── README.md │ ├── demo │ │ ├── autocomplete.stories.mdx │ │ ├── combobox.stories.mdx │ │ ├── menu.stories.mdx │ │ ├── multiselect.stories.mdx │ │ ├── select.stories.mdx │ │ ├── stories │ │ │ ├── AutocompleteStory.tsx │ │ │ ├── ComboboxStory.tsx │ │ │ ├── DropdownFieldStory.tsx │ │ │ ├── DropdownStory.tsx │ │ │ ├── MenuStory.tsx │ │ │ ├── MultiselectStory.tsx │ │ │ ├── SelectStory.tsx │ │ │ ├── TriggerStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ └── MenuStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Autocomplete │ │ │ │ ├── Autocomplete.spec.tsx │ │ │ │ └── Autocomplete.tsx │ │ │ ├── Combobox │ │ │ │ ├── Combobox.spec.tsx │ │ │ │ └── Combobox.tsx │ │ │ ├── Dropdown │ │ │ │ ├── Dropdown.spec.tsx │ │ │ │ └── Dropdown.tsx │ │ │ ├── Fields │ │ │ │ ├── Field.spec.tsx │ │ │ │ ├── Field.tsx │ │ │ │ ├── Hint.spec.tsx │ │ │ │ ├── Hint.tsx │ │ │ │ ├── Label.spec.tsx │ │ │ │ ├── Label.tsx │ │ │ │ ├── Message.spec.tsx │ │ │ │ └── Message.tsx │ │ │ ├── Menu │ │ │ │ ├── Items │ │ │ │ │ ├── AddItem.spec.tsx │ │ │ │ │ ├── AddItem.tsx │ │ │ │ │ ├── HeaderIcon.spec.tsx │ │ │ │ │ ├── HeaderIcon.tsx │ │ │ │ │ ├── HeaderItem.spec.tsx │ │ │ │ │ ├── HeaderItem.tsx │ │ │ │ │ ├── Item.spec.tsx │ │ │ │ │ ├── Item.tsx │ │ │ │ │ ├── ItemMeta.spec.tsx │ │ │ │ │ ├── ItemMeta.tsx │ │ │ │ │ ├── MediaBody.spec.tsx │ │ │ │ │ ├── MediaBody.tsx │ │ │ │ │ ├── MediaFigure.spec.tsx │ │ │ │ │ ├── MediaFigure.tsx │ │ │ │ │ ├── MediaItem.spec.tsx │ │ │ │ │ ├── MediaItem.tsx │ │ │ │ │ ├── NextItem.spec.tsx │ │ │ │ │ ├── NextItem.tsx │ │ │ │ │ ├── PreviousItem.spec.tsx │ │ │ │ │ └── PreviousItem.tsx │ │ │ │ ├── Menu.spec.tsx │ │ │ │ ├── Menu.tsx │ │ │ │ ├── Separator.spec.tsx │ │ │ │ └── Separator.tsx │ │ │ ├── Multiselect │ │ │ │ ├── Multiselect.spec.tsx │ │ │ │ └── Multiselect.tsx │ │ │ ├── Select │ │ │ │ ├── Select.spec.tsx │ │ │ │ └── Select.tsx │ │ │ └── Trigger │ │ │ │ ├── Trigger.spec.tsx │ │ │ │ └── Trigger.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── index.ts │ │ │ ├── items │ │ │ │ ├── StyledAddItem.ts │ │ │ │ ├── StyledItem.spec.tsx │ │ │ │ ├── StyledItem.ts │ │ │ │ ├── StyledItemIcon.ts │ │ │ │ ├── StyledItemMeta.ts │ │ │ │ ├── StyledNextIcon.tsx │ │ │ │ ├── StyledNextItem.ts │ │ │ │ ├── StyledPreviousIcon.tsx │ │ │ │ ├── StyledPreviousItem.ts │ │ │ │ ├── header │ │ │ │ │ ├── StyledHeaderIcon.ts │ │ │ │ │ └── StyledHeaderItem.ts │ │ │ │ └── media │ │ │ │ │ ├── StyledMediaBody.ts │ │ │ │ │ ├── StyledMediaFigure.ts │ │ │ │ │ └── StyledMediaItem.ts │ │ │ ├── menu │ │ │ │ ├── StyledMenu.ts │ │ │ │ ├── StyledMenuWrapper.ts │ │ │ │ └── StyledSeparator.ts │ │ │ ├── multiselect │ │ │ │ ├── StyledMultiselectInput.ts │ │ │ │ ├── StyledMultiselectItemWrapper.ts │ │ │ │ ├── StyledMultiselectItemsContainer.ts │ │ │ │ └── StyledMultiselectMoreAnchor.ts │ │ │ └── select │ │ │ │ ├── StyledFauxInput.ts │ │ │ │ ├── StyledInput.ts │ │ │ │ └── StyledSelect.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── garden-placements.ts │ │ │ ├── gardenPlacements.spec.ts │ │ │ ├── useDropdownContext.spec.tsx │ │ │ ├── useDropdownContext.ts │ │ │ ├── useFieldContext.spec.tsx │ │ │ ├── useFieldContext.ts │ │ │ ├── useItemContext.spec.tsx │ │ │ ├── useItemContext.ts │ │ │ ├── useMenuContext.spec.tsx │ │ │ └── useMenuContext.ts │ └── tsconfig.build.json ├── dropdowns │ ├── README.md │ ├── demo │ │ ├── combobox.stories.mdx │ │ ├── menu.stories.mdx │ │ ├── stories │ │ │ ├── ComboboxStory.tsx │ │ │ ├── MenuStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── NestedStory.tsx │ │ │ ├── PortalStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ ├── package.json │ ├── src │ │ ├── context │ │ │ ├── useComboboxContext.ts │ │ │ ├── useFieldContext.ts │ │ │ ├── useItemContext.ts │ │ │ ├── useItemGroupContext.ts │ │ │ ├── useMenuContext.ts │ │ │ └── useOptionContext.ts │ │ ├── elements │ │ │ ├── combobox │ │ │ │ ├── Combobox.spec.tsx │ │ │ │ ├── Combobox.tsx │ │ │ │ ├── Field.tsx │ │ │ │ ├── Hint.tsx │ │ │ │ ├── Label.tsx │ │ │ │ ├── Listbox.tsx │ │ │ │ ├── Message.tsx │ │ │ │ ├── OptGroup.spec.tsx │ │ │ │ ├── OptGroup.tsx │ │ │ │ ├── Option.spec.tsx │ │ │ │ ├── Option.tsx │ │ │ │ ├── OptionMeta.tsx │ │ │ │ ├── Tag.tsx │ │ │ │ ├── TagAvatar.tsx │ │ │ │ ├── TagGroup.tsx │ │ │ │ └── utils.ts │ │ │ └── menu │ │ │ │ ├── Item.tsx │ │ │ │ ├── ItemGroup.tsx │ │ │ │ ├── ItemMeta.tsx │ │ │ │ ├── Menu.spec.tsx │ │ │ │ ├── Menu.tsx │ │ │ │ ├── MenuList.tsx │ │ │ │ ├── Separator.tsx │ │ │ │ └── utils.ts │ │ ├── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── views │ │ │ ├── combobox │ │ │ ├── StyledCombobox.ts │ │ │ ├── StyledContainer.ts │ │ │ ├── StyledField.ts │ │ │ ├── StyledFloatingListbox.ts │ │ │ ├── StyledHint.ts │ │ │ ├── StyledInput.ts │ │ │ ├── StyledInputGroup.ts │ │ │ ├── StyledInputIcon.ts │ │ │ ├── StyledLabel.ts │ │ │ ├── StyledListbox.ts │ │ │ ├── StyledListboxSeparator.ts │ │ │ ├── StyledMessage.ts │ │ │ ├── StyledOptGroup.ts │ │ │ ├── StyledOption.ts │ │ │ ├── StyledOptionContent.ts │ │ │ ├── StyledOptionIcon.ts │ │ │ ├── StyledOptionMeta.ts │ │ │ ├── StyledOptionSelectionIcon.ts │ │ │ ├── StyledOptionTypeIcon.ts │ │ │ ├── StyledTag.ts │ │ │ ├── StyledTagsButton.ts │ │ │ ├── StyledTrigger.ts │ │ │ └── StyledValue.ts │ │ │ ├── index.ts │ │ │ └── menu │ │ │ ├── StyledFloatingMenu.ts │ │ │ ├── StyledItem.ts │ │ │ ├── StyledItemAnchor.ts │ │ │ ├── StyledItemContent.ts │ │ │ ├── StyledItemGroup.ts │ │ │ ├── StyledItemIcon.ts │ │ │ ├── StyledItemMeta.ts │ │ │ ├── StyledItemTypeIcon.ts │ │ │ ├── StyledMenu.ts │ │ │ └── StyledSeparator.ts │ └── tsconfig.build.json ├── forms │ ├── README.md │ ├── demo │ │ ├── checkbox.stories.mdx │ │ ├── fauxInput.stories.mdx │ │ ├── fieldset.stories.mdx │ │ ├── file.stories.mdx │ │ ├── fileList.stories.mdx │ │ ├── fileUpload.stories.mdx │ │ ├── input.stories.mdx │ │ ├── inputGroup.stories.mdx │ │ ├── mediaInput.stories.mdx │ │ ├── radio.stories.mdx │ │ ├── range.stories.mdx │ │ ├── select.stories.mdx │ │ ├── stories │ │ │ ├── CheckboxStory.tsx │ │ │ ├── FauxInputStory.tsx │ │ │ ├── FieldStory.tsx │ │ │ ├── FieldsetStory.tsx │ │ │ ├── FileListStory.tsx │ │ │ ├── FileStory.tsx │ │ │ ├── FileUploadStory.tsx │ │ │ ├── InputGroupStory.tsx │ │ │ ├── InputStory.tsx │ │ │ ├── MediaInputStory.tsx │ │ │ ├── RadioStory.tsx │ │ │ ├── RangeStory.tsx │ │ │ ├── SelectStory.tsx │ │ │ ├── TextareaStory.tsx │ │ │ ├── TilesStory.tsx │ │ │ ├── ToggleStory.tsx │ │ │ ├── common.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ ├── textarea.stories.mdx │ │ ├── tiles.stories.mdx │ │ ├── toggle.stories.mdx │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ └── FileUploadStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Checkbox.spec.tsx │ │ │ ├── Checkbox.tsx │ │ │ ├── FileUpload.spec.tsx │ │ │ ├── FileUpload.tsx │ │ │ ├── Input.spec.tsx │ │ │ ├── Input.tsx │ │ │ ├── MediaInput.spec.tsx │ │ │ ├── MediaInput.tsx │ │ │ ├── Radio.spec.tsx │ │ │ ├── Radio.tsx │ │ │ ├── Range.spec.tsx │ │ │ ├── Range.tsx │ │ │ ├── Select.spec.tsx │ │ │ ├── Select.tsx │ │ │ ├── Textarea.spec.tsx │ │ │ ├── Textarea.tsx │ │ │ ├── Toggle.spec.tsx │ │ │ ├── Toggle.tsx │ │ │ ├── common │ │ │ │ ├── Field.spec.tsx │ │ │ │ ├── Field.tsx │ │ │ │ ├── Fieldset.spec.tsx │ │ │ │ ├── Fieldset.tsx │ │ │ │ ├── Hint.spec.tsx │ │ │ │ ├── Hint.tsx │ │ │ │ ├── Label.spec.tsx │ │ │ │ ├── Label.tsx │ │ │ │ ├── Legend.spec.tsx │ │ │ │ ├── Legend.tsx │ │ │ │ ├── Message.spec.tsx │ │ │ │ ├── Message.tsx │ │ │ │ ├── MessageIcon.spec.tsx │ │ │ │ └── MessageIcon.tsx │ │ │ ├── faux-input │ │ │ │ ├── FauxInput.spec.tsx │ │ │ │ ├── FauxInput.tsx │ │ │ │ └── components │ │ │ │ │ ├── EndIcon.tsx │ │ │ │ │ └── StartIcon.tsx │ │ │ ├── file-list │ │ │ │ ├── FileList.spec.tsx │ │ │ │ ├── FileList.tsx │ │ │ │ ├── components │ │ │ │ │ ├── Close.spec.tsx │ │ │ │ │ ├── Close.tsx │ │ │ │ │ ├── Delete.spec.tsx │ │ │ │ │ ├── Delete.tsx │ │ │ │ │ ├── File.spec.tsx │ │ │ │ │ ├── File.tsx │ │ │ │ │ ├── Item.spec.tsx │ │ │ │ │ └── Item.tsx │ │ │ │ └── utils.tsx │ │ │ ├── input-group │ │ │ │ ├── InputGroup.spec.tsx │ │ │ │ └── InputGroup.tsx │ │ │ └── tiles │ │ │ │ ├── Tiles.spec.tsx │ │ │ │ ├── Tiles.tsx │ │ │ │ └── components │ │ │ │ ├── Description.tsx │ │ │ │ ├── Icon.tsx │ │ │ │ ├── Label.tsx │ │ │ │ └── Tile.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── checkbox │ │ │ │ ├── StyledCheckHint.spec.tsx │ │ │ │ ├── StyledCheckHint.ts │ │ │ │ ├── StyledCheckInput.spec.tsx │ │ │ │ ├── StyledCheckInput.ts │ │ │ │ ├── StyledCheckLabel.spec.tsx │ │ │ │ ├── StyledCheckLabel.ts │ │ │ │ ├── StyledCheckMessage.spec.tsx │ │ │ │ ├── StyledCheckMessage.ts │ │ │ │ ├── StyledCheckSvg.spec.tsx │ │ │ │ ├── StyledCheckSvg.ts │ │ │ │ ├── StyledDashSvg.spec.tsx │ │ │ │ └── StyledDashSvg.ts │ │ │ ├── common │ │ │ │ ├── StyledField.spec.tsx │ │ │ │ ├── StyledField.ts │ │ │ │ ├── StyledFieldset.spec.tsx │ │ │ │ ├── StyledFieldset.ts │ │ │ │ ├── StyledHint.spec.tsx │ │ │ │ ├── StyledHint.ts │ │ │ │ ├── StyledLabel.spec.tsx │ │ │ │ ├── StyledLabel.ts │ │ │ │ ├── StyledLegend.spec.tsx │ │ │ │ ├── StyledLegend.ts │ │ │ │ ├── StyledMessage.spec.tsx │ │ │ │ ├── StyledMessage.ts │ │ │ │ ├── StyledMessageIcon.spec.tsx │ │ │ │ └── StyledMessageIcon.ts │ │ │ ├── file-list │ │ │ │ ├── StyledFile.spec.tsx │ │ │ │ ├── StyledFile.ts │ │ │ │ ├── StyledFileClose.spec.tsx │ │ │ │ ├── StyledFileClose.ts │ │ │ │ ├── StyledFileDelete.spec.tsx │ │ │ │ ├── StyledFileDelete.ts │ │ │ │ ├── StyledFileIcon.spec.tsx │ │ │ │ ├── StyledFileIcon.ts │ │ │ │ ├── StyledFileList.spec.tsx │ │ │ │ ├── StyledFileList.ts │ │ │ │ ├── StyledFileListItem.spec.tsx │ │ │ │ └── StyledFileListItem.ts │ │ │ ├── file-upload │ │ │ │ └── StyledFileUpload.ts │ │ │ ├── index.ts │ │ │ ├── input-group │ │ │ │ └── StyledInputGroup.ts │ │ │ ├── radio │ │ │ │ ├── StyledRadioHint.spec.tsx │ │ │ │ ├── StyledRadioHint.ts │ │ │ │ ├── StyledRadioInput.spec.tsx │ │ │ │ ├── StyledRadioInput.ts │ │ │ │ ├── StyledRadioLabel.spec.tsx │ │ │ │ ├── StyledRadioLabel.ts │ │ │ │ ├── StyledRadioMessage.spec.tsx │ │ │ │ ├── StyledRadioMessage.ts │ │ │ │ ├── StyledRadioSvg.spec.tsx │ │ │ │ └── StyledRadioSvg.ts │ │ │ ├── range │ │ │ │ ├── StyledRangeInput.spec.tsx │ │ │ │ └── StyledRangeInput.ts │ │ │ ├── select │ │ │ │ ├── StyledSelect.spec.tsx │ │ │ │ ├── StyledSelect.ts │ │ │ │ ├── StyledSelectWrapper.spec.tsx │ │ │ │ └── StyledSelectWrapper.ts │ │ │ ├── text │ │ │ │ ├── StyledTextArea.spec.tsx │ │ │ │ ├── StyledTextFauxInput.spec.tsx │ │ │ │ ├── StyledTextFauxInput.ts │ │ │ │ ├── StyledTextInput.spec.tsx │ │ │ │ ├── StyledTextInput.tsx │ │ │ │ ├── StyledTextMediaFigure.spec.tsx │ │ │ │ ├── StyledTextMediaFigure.ts │ │ │ │ ├── StyledTextMediaInput.spec.tsx │ │ │ │ ├── StyledTextMediaInput.ts │ │ │ │ └── StyledTextarea.ts │ │ │ ├── tiles │ │ │ │ ├── StyledTile.ts │ │ │ │ ├── StyledTileDescription.ts │ │ │ │ ├── StyledTileIcon.ts │ │ │ │ ├── StyledTileInput.ts │ │ │ │ └── StyledTileLabel.ts │ │ │ └── toggle │ │ │ │ ├── StyledToggleHint.spec.tsx │ │ │ │ ├── StyledToggleHint.ts │ │ │ │ ├── StyledToggleInput.spec.tsx │ │ │ │ ├── StyledToggleInput.ts │ │ │ │ ├── StyledToggleLabel.spec.tsx │ │ │ │ ├── StyledToggleLabel.ts │ │ │ │ ├── StyledToggleMessage.spec.tsx │ │ │ │ ├── StyledToggleMessage.ts │ │ │ │ ├── StyledToggleSvg.spec.tsx │ │ │ │ └── StyledToggleSvg.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── useFieldContext.ts │ │ │ ├── useFieldsetContext.ts │ │ │ ├── useFileContext.ts │ │ │ ├── useInputContext.ts │ │ │ ├── useInputGroupContext.ts │ │ │ └── useTilesContext.ts │ └── tsconfig.build.json ├── grid │ ├── README.md │ ├── demo │ │ ├── grid.stories.mdx │ │ ├── paneProvider.stories.mdx │ │ ├── stories │ │ │ ├── GridStory.tsx │ │ │ ├── PaneProviderStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── CardStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Col.spec.tsx │ │ │ ├── Col.tsx │ │ │ ├── Grid.spec.tsx │ │ │ ├── Grid.tsx │ │ │ ├── Row.spec.tsx │ │ │ ├── Row.tsx │ │ │ └── pane │ │ │ │ ├── Pane.spec.tsx │ │ │ │ ├── Pane.tsx │ │ │ │ ├── PaneProvider.spec.tsx │ │ │ │ ├── PaneProvider.tsx │ │ │ │ └── components │ │ │ │ ├── Content.spec.tsx │ │ │ │ ├── Content.tsx │ │ │ │ ├── Splitter.spec.tsx │ │ │ │ ├── Splitter.tsx │ │ │ │ ├── SplitterButton.spec.tsx │ │ │ │ └── SplitterButton.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledCol.spec.tsx │ │ │ ├── StyledCol.ts │ │ │ ├── StyledGrid.spec.tsx │ │ │ ├── StyledGrid.ts │ │ │ ├── StyledRow.spec.tsx │ │ │ ├── StyledRow.ts │ │ │ ├── index.ts │ │ │ └── pane │ │ │ │ ├── StyledPane.ts │ │ │ │ ├── StyledPaneContent.ts │ │ │ │ ├── StyledPaneSplitter.ts │ │ │ │ ├── StyledPaneSplitterButton.ts │ │ │ │ └── StyledPaneSplitterButtonContainer.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── useGridContext.spec.tsx │ │ │ ├── useGridContext.ts │ │ │ ├── usePaneContext.ts │ │ │ ├── usePaneProviderContext.ts │ │ │ └── usePaneSplitterContext.ts │ └── tsconfig.build.json ├── loaders │ ├── README.md │ ├── demo │ │ ├── dots.stories.mdx │ │ ├── inline.stories.mdx │ │ ├── progress.stories.mdx │ │ ├── skeleton.stories.mdx │ │ ├── spinner.stories.mdx │ │ └── stories │ │ │ ├── SkeletonStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Dots.spec.tsx │ │ │ ├── Dots.tsx │ │ │ ├── Inline.spec.tsx │ │ │ ├── Inline.tsx │ │ │ ├── Progress.spec.tsx │ │ │ ├── Progress.tsx │ │ │ ├── Skeleton.spec.tsx │ │ │ ├── Skeleton.tsx │ │ │ ├── Spinner.spec.tsx │ │ │ └── Spinner.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledDots.spec.tsx │ │ │ ├── StyledDots.ts │ │ │ ├── StyledInline.ts │ │ │ ├── StyledLoadingPlaceholder.ts │ │ │ ├── StyledProgress.ts │ │ │ ├── StyledSVG.spec.tsx │ │ │ ├── StyledSVG.ts │ │ │ ├── StyledSkeleton.ts │ │ │ ├── StyledSpinnerCircle.spec.tsx │ │ │ ├── StyledSpinnerCircle.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── animations.ts │ │ │ └── spinner-coordinates.ts │ └── tsconfig.build.json ├── modals │ ├── README.md │ ├── demo │ │ ├── drawer.stories.mdx │ │ ├── modal.stories.mdx │ │ ├── stories │ │ │ ├── DrawerStory.tsx │ │ │ ├── ModalStory.tsx │ │ │ ├── TooltipDialogStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── tooltipDialog.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Body.spec.tsx │ │ │ ├── Body.tsx │ │ │ ├── Close.spec.tsx │ │ │ ├── Close.tsx │ │ │ ├── Drawer │ │ │ │ ├── Body.spec.tsx │ │ │ │ ├── Body.tsx │ │ │ │ ├── Close.spec.tsx │ │ │ │ ├── Close.tsx │ │ │ │ ├── Drawer.spec.tsx │ │ │ │ ├── Drawer.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── FooterItem.tsx │ │ │ │ ├── Header.spec.tsx │ │ │ │ └── Header.tsx │ │ │ ├── Footer.spec.tsx │ │ │ ├── Footer.tsx │ │ │ ├── FooterItem.spec.tsx │ │ │ ├── FooterItem.tsx │ │ │ ├── Header.spec.tsx │ │ │ ├── Header.tsx │ │ │ ├── Modal.spec.tsx │ │ │ ├── Modal.tsx │ │ │ └── TooltipDialog │ │ │ │ ├── Body.spec.tsx │ │ │ │ ├── Body.tsx │ │ │ │ ├── Close.spec.tsx │ │ │ │ ├── Close.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── FooterItem.tsx │ │ │ │ ├── Title.spec.tsx │ │ │ │ ├── Title.tsx │ │ │ │ ├── TooltipDialog.spec.tsx │ │ │ │ └── TooltipDialog.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledBackdrop.spec.tsx │ │ │ ├── StyledBackdrop.ts │ │ │ ├── StyledBody.ts │ │ │ ├── StyledClose.spec.tsx │ │ │ ├── StyledClose.ts │ │ │ ├── StyledDangerIcon.spec.tsx │ │ │ ├── StyledDangerIcon.ts │ │ │ ├── StyledDrawer.spec.tsx │ │ │ ├── StyledDrawer.ts │ │ │ ├── StyledDrawerBody.ts │ │ │ ├── StyledDrawerClose.spec.tsx │ │ │ ├── StyledDrawerClose.ts │ │ │ ├── StyledDrawerFooter.ts │ │ │ ├── StyledDrawerFooterItem.ts │ │ │ ├── StyledDrawerHeader.spec.tsx │ │ │ ├── StyledDrawerHeader.ts │ │ │ ├── StyledFooter.spec.tsx │ │ │ ├── StyledFooter.ts │ │ │ ├── StyledFooterItem.spec.tsx │ │ │ ├── StyledFooterItem.ts │ │ │ ├── StyledHeader.spec.tsx │ │ │ ├── StyledHeader.ts │ │ │ ├── StyledModal.spec.tsx │ │ │ ├── StyledModal.ts │ │ │ ├── StyledTooltipDialog.ts │ │ │ ├── StyledTooltipDialogBackdrop.ts │ │ │ ├── StyledTooltipDialogBody.ts │ │ │ ├── StyledTooltipDialogClose.ts │ │ │ ├── StyledTooltipDialogFooter.ts │ │ │ ├── StyledTooltipDialogFooterItem.ts │ │ │ ├── StyledTooltipDialogTitle.ts │ │ │ ├── StyledTooltipWrapper.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── useModalContext.spec.tsx │ │ │ ├── useModalContext.ts │ │ │ ├── useTooltipDialogContext.spec.tsx │ │ │ └── useTooltipDialogContext.tsx │ └── tsconfig.build.json ├── notifications │ ├── README.md │ ├── demo │ │ ├── alert.stories.mdx │ │ ├── global-alert.stories.mdx │ │ ├── notification.stories.mdx │ │ ├── stories │ │ │ ├── AlertStory.tsx │ │ │ ├── GlobalAlertStory.tsx │ │ │ ├── NotificationStory.tsx │ │ │ ├── ToastProviderStory.tsx │ │ │ ├── ToastStory.tsx │ │ │ ├── WellStory.tsx │ │ │ └── data.ts │ │ ├── toastProvider.stories.mdx │ │ └── well.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Close.spec.tsx │ │ │ ├── Close.tsx │ │ │ ├── Notification.spec.tsx │ │ │ ├── Notification.tsx │ │ │ ├── Paragraph.spec.tsx │ │ │ ├── Paragraph.tsx │ │ │ ├── Title.spec.tsx │ │ │ ├── Title.tsx │ │ │ ├── alert │ │ │ │ ├── Alert.spec.tsx │ │ │ │ ├── Alert.tsx │ │ │ │ ├── Close.spec.tsx │ │ │ │ ├── Close.tsx │ │ │ │ ├── Paragraph.spec.tsx │ │ │ │ ├── Paragraph.tsx │ │ │ │ ├── Title.spec.tsx │ │ │ │ └── Title.tsx │ │ │ ├── global-alert │ │ │ │ ├── GlobalAlert.spec.tsx │ │ │ │ ├── GlobalAlert.tsx │ │ │ │ ├── GlobalAlertButton.spec.tsx │ │ │ │ ├── GlobalAlertButton.tsx │ │ │ │ ├── GlobalAlertClose.spec.tsx │ │ │ │ ├── GlobalAlertClose.tsx │ │ │ │ ├── GlobalAlertContent.spec.tsx │ │ │ │ ├── GlobalAlertContent.tsx │ │ │ │ ├── GlobalAlertTitle.spec.tsx │ │ │ │ └── GlobalAlertTitle.tsx │ │ │ ├── toaster │ │ │ │ ├── Toast.ts │ │ │ │ ├── ToastContext.ts │ │ │ │ ├── ToastProvider.spec.tsx │ │ │ │ ├── ToastProvider.tsx │ │ │ │ ├── ToastSlot.spec.tsx │ │ │ │ ├── ToastSlot.tsx │ │ │ │ ├── reducer.ts │ │ │ │ ├── styled.ts │ │ │ │ ├── useToast.spec.tsx │ │ │ │ └── useToast.ts │ │ │ └── well │ │ │ │ ├── Paragraph.spec.tsx │ │ │ │ ├── Paragraph.tsx │ │ │ │ ├── Title.spec.tsx │ │ │ │ ├── Title.tsx │ │ │ │ ├── Well.spec.tsx │ │ │ │ └── Well.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledAlert.spec.tsx │ │ │ ├── StyledAlert.ts │ │ │ ├── StyledBase.spec.tsx │ │ │ ├── StyledBase.ts │ │ │ ├── StyledIcon.spec.tsx │ │ │ ├── StyledIcon.ts │ │ │ ├── StyledNotification.spec.tsx │ │ │ ├── StyledNotification.ts │ │ │ ├── StyledWell.spec.tsx │ │ │ ├── StyledWell.ts │ │ │ ├── content │ │ │ │ ├── StyledClose.spec.tsx │ │ │ │ ├── StyledClose.ts │ │ │ │ ├── StyledParagraph.ts │ │ │ │ └── StyledTitle.ts │ │ │ ├── global-alert │ │ │ │ ├── StyledGlobalAlert.spec.tsx │ │ │ │ ├── StyledGlobalAlert.ts │ │ │ │ ├── StyledGlobalAlertButton.spec.tsx │ │ │ │ ├── StyledGlobalAlertButton.ts │ │ │ │ ├── StyledGlobalAlertClose.spec.tsx │ │ │ │ ├── StyledGlobalAlertClose.ts │ │ │ │ ├── StyledGlobalAlertContent.ts │ │ │ │ ├── StyledGlobalAlertIcon.spec.tsx │ │ │ │ ├── StyledGlobalAlertIcon.ts │ │ │ │ ├── StyledGlobalAlertTitle.spec.tsx │ │ │ │ ├── StyledGlobalAlertTitle.ts │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── icons.ts │ │ │ ├── useGlobalAlertContext.ts │ │ │ └── useNotificationsContext.ts │ └── tsconfig.build.json ├── pagination │ ├── README.md │ ├── demo │ │ ├── cursorPagination.stories.mdx │ │ ├── offsetPagination.stories.mdx │ │ └── stories │ │ │ └── CursorPaginationStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── CursorPagination │ │ │ │ ├── CursorPagination.tsx │ │ │ │ └── components │ │ │ │ │ ├── First.spec.tsx │ │ │ │ │ ├── First.tsx │ │ │ │ │ ├── Last.spec.tsx │ │ │ │ │ ├── Last.tsx │ │ │ │ │ ├── Next.spec.tsx │ │ │ │ │ ├── Next.tsx │ │ │ │ │ ├── Previous.spec.tsx │ │ │ │ │ └── Previous.tsx │ │ │ └── OffsetPagination │ │ │ │ ├── OffsetPagination.spec.tsx │ │ │ │ ├── OffsetPagination.tsx │ │ │ │ └── components │ │ │ │ ├── Gap.spec.tsx │ │ │ │ ├── Gap.tsx │ │ │ │ ├── Next.spec.tsx │ │ │ │ ├── Next.tsx │ │ │ │ ├── Page.spec.tsx │ │ │ │ ├── Page.tsx │ │ │ │ ├── Previous.spec.tsx │ │ │ │ └── Previous.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── CursorPagination │ │ │ │ ├── StyledCursor.spec.tsx │ │ │ │ ├── StyledCursor.ts │ │ │ │ ├── StyledCursorPagination.ts │ │ │ │ ├── StyledIcon.spec.tsx │ │ │ │ └── StyledIcon.ts │ │ │ ├── OffsetPagination │ │ │ │ ├── StyledGapListItem.spec.tsx │ │ │ │ ├── StyledGapListItem.ts │ │ │ │ ├── StyledList.spec.tsx │ │ │ │ ├── StyledList.ts │ │ │ │ ├── StyledListItem.ts │ │ │ │ ├── StyledNav.ts │ │ │ │ ├── StyledNavigation.spec.tsx │ │ │ │ ├── StyledNavigation.ts │ │ │ │ ├── StyledPage.spec.tsx │ │ │ │ ├── StyledPage.ts │ │ │ │ ├── StyledPageBase.spec.tsx │ │ │ │ └── StyledPageBase.ts │ │ │ └── index.ts │ │ └── types │ │ │ └── index.ts │ └── tsconfig.build.json ├── tables │ ├── README.md │ ├── demo │ │ ├── stories │ │ │ ├── TableStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── table.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Body.tsx │ │ │ ├── Caption.spec.tsx │ │ │ ├── Caption.tsx │ │ │ ├── Cell.spec.tsx │ │ │ ├── Cell.tsx │ │ │ ├── GroupRow.spec.tsx │ │ │ ├── GroupRow.tsx │ │ │ ├── Head.tsx │ │ │ ├── HeaderCell.spec.tsx │ │ │ ├── HeaderCell.tsx │ │ │ ├── HeaderRow.spec.tsx │ │ │ ├── HeaderRow.tsx │ │ │ ├── OverflowButton.spec.tsx │ │ │ ├── OverflowButton.tsx │ │ │ ├── Row.spec.tsx │ │ │ ├── Row.tsx │ │ │ ├── SortableCell.spec.tsx │ │ │ ├── SortableCell.tsx │ │ │ ├── Table.spec.tsx │ │ │ └── Table.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledBaseRow.ts │ │ │ ├── StyledBody.ts │ │ │ ├── StyledCaption.ts │ │ │ ├── StyledCell.ts │ │ │ ├── StyledGroupRow.ts │ │ │ ├── StyledHead.spec.tsx │ │ │ ├── StyledHead.ts │ │ │ ├── StyledHeaderCell.ts │ │ │ ├── StyledHeaderRow.ts │ │ │ ├── StyledHiddenCell.ts │ │ │ ├── StyledOverflowButton.ts │ │ │ ├── StyledRow.ts │ │ │ ├── StyledSortableButton.ts │ │ │ ├── StyledTable.ts │ │ │ ├── index.ts │ │ │ └── style-utils.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ └── useTableContext.ts │ └── tsconfig.build.json ├── tabs │ ├── README.md │ ├── demo │ │ ├── stories │ │ │ ├── TabsStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ └── tabs.stories.mdx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Tab.spec.tsx │ │ │ ├── Tab.tsx │ │ │ ├── TabList.spec.tsx │ │ │ ├── TabList.tsx │ │ │ ├── TabPanel.spec.tsx │ │ │ ├── TabPanel.tsx │ │ │ ├── Tabs.spec.tsx │ │ │ └── Tabs.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledTab.ts │ │ │ ├── StyledTabList.ts │ │ │ ├── StyledTabPanel.ts │ │ │ ├── StyledTabs.ts │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── toTabs.ts │ │ │ └── useTabsContext.ts │ └── tsconfig.build.json ├── tags │ ├── README.md │ ├── demo │ │ ├── stories │ │ │ └── TagStory.tsx │ │ ├── tag.stories.mdx │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── FauxInputStory.tsx │ │ │ └── data.ts │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Avatar.tsx │ │ │ ├── Close.spec.tsx │ │ │ ├── Close.tsx │ │ │ ├── Tag.spec.tsx │ │ │ └── Tag.tsx │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledAvatar.spec.tsx │ │ │ ├── StyledAvatar.ts │ │ │ ├── StyledClose.spec.tsx │ │ │ ├── StyledClose.ts │ │ │ ├── StyledTag.spec.tsx │ │ │ ├── StyledTag.ts │ │ │ └── index.ts │ │ └── types │ │ │ └── index.ts │ └── tsconfig.build.json ├── theming │ ├── README.md │ ├── demo │ │ ├── colorSchemeProvider.stories.mdx │ │ ├── stories │ │ │ ├── ArrowStylesStory.tsx │ │ │ ├── ColorSchemeProviderStory.tsx │ │ │ ├── GetColorStory.tsx │ │ │ ├── MenuStylesStory.tsx │ │ │ ├── PaletteStory.tsx │ │ │ └── data.ts │ │ ├── themeProvider.stories.mdx │ │ ├── utilities.stories.mdx │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ ├── GetColorStory.tsx │ │ │ └── GetColorV8Story.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── ColorSchemeProvider.tsx │ │ │ ├── ThemeProvider.spec.tsx │ │ │ ├── ThemeProvider.tsx │ │ │ ├── palette │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.spec.ts.snap │ │ │ │ ├── index.spec.ts │ │ │ │ ├── index.ts │ │ │ │ └── v8.ts │ │ │ └── theme │ │ │ │ ├── __snapshots__ │ │ │ │ └── index.spec.ts.snap │ │ │ │ ├── index.spec.ts │ │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── StyledBaseIcon.ts │ │ │ ├── arrowStyles.spec.tsx │ │ │ ├── arrowStyles.ts │ │ │ ├── componentStyles.spec.ts │ │ │ ├── componentStyles.ts │ │ │ ├── focusStyles.spec.tsx │ │ │ ├── focusStyles.ts │ │ │ ├── getArrowPosition.spec.ts │ │ │ ├── getArrowPosition.ts │ │ │ ├── getCheckeredBackground.spec.ts │ │ │ ├── getCheckeredBackground.ts │ │ │ ├── getColor.spec.ts │ │ │ ├── getColor.ts │ │ │ ├── getColorV8.spec.ts │ │ │ ├── getColorV8.ts │ │ │ ├── getFloatingPlacements.spec.ts │ │ │ ├── getFloatingPlacements.ts │ │ │ ├── getFocusBoxShadow.spec.ts │ │ │ ├── getFocusBoxShadow.ts │ │ │ ├── getLineHeight.spec.ts │ │ │ ├── getLineHeight.ts │ │ │ ├── getMenuPosition.spec.ts │ │ │ ├── getMenuPosition.ts │ │ │ ├── mediaQuery.spec.ts │ │ │ ├── mediaQuery.ts │ │ │ ├── menuStyles.spec.tsx │ │ │ ├── menuStyles.ts │ │ │ ├── retrieveComponentStyles.spec.ts │ │ │ ├── retrieveComponentStyles.ts │ │ │ ├── useColorScheme.spec.tsx │ │ │ ├── useColorScheme.ts │ │ │ ├── useDocument.spec.tsx │ │ │ ├── useDocument.ts │ │ │ ├── useText.spec.tsx │ │ │ ├── useText.ts │ │ │ ├── useWindow.spec.ts │ │ │ └── useWindow.ts │ └── tsconfig.build.json ├── tooltips │ ├── README.md │ ├── demo │ │ ├── stories │ │ │ ├── TooltipStory.tsx │ │ │ ├── data.ts │ │ │ └── types.ts │ │ ├── tooltip.stories.mdx │ │ └── ~patterns │ │ │ ├── patterns.stories.mdx │ │ │ └── stories │ │ │ └── MenuStory.tsx │ ├── package.json │ ├── src │ │ ├── elements │ │ │ ├── Paragraph.spec.tsx │ │ │ ├── Paragraph.tsx │ │ │ ├── Title.spec.tsx │ │ │ ├── Title.tsx │ │ │ ├── Tooltip.spec.tsx │ │ │ ├── Tooltip.tsx │ │ │ └── utils.ts │ │ ├── index.ts │ │ ├── styled │ │ │ ├── StyledParagraph.ts │ │ │ ├── StyledTitle.ts │ │ │ ├── StyledTooltip.ts │ │ │ ├── StyledTooltipWrapper.ts │ │ │ └── index.ts │ │ └── types │ │ │ └── index.ts │ └── tsconfig.build.json └── typography │ ├── README.md │ ├── demo │ ├── 00_sm.stories.mdx │ ├── 01_md.stories.mdx │ ├── 02_lg.stories.mdx │ ├── 03_xl.stories.mdx │ ├── 04_xxl.stories.mdx │ ├── 05_xxxl.stories.mdx │ ├── blockquote.stories.mdx │ ├── code.stories.mdx │ ├── codeBlock.stories.mdx │ ├── ellipsis.stories.mdx │ ├── orderedList.stories.mdx │ ├── paragraph.stories.mdx │ ├── span.stories.mdx │ ├── stories │ │ ├── BlockquoteStory.tsx │ │ ├── OrderedListStory.tsx │ │ ├── ParagraphStory.tsx │ │ ├── SpanStory.tsx │ │ ├── TypescaleStory.tsx │ │ ├── UnorderedListStory.tsx │ │ ├── data.ts │ │ └── types.ts │ └── unorderedList.stories.mdx │ ├── package.json │ ├── src │ ├── elements │ │ ├── Blockquote.spec.tsx │ │ ├── Blockquote.tsx │ │ ├── Code.spec.tsx │ │ ├── Code.tsx │ │ ├── CodeBlock.spec.tsx │ │ ├── CodeBlock.tsx │ │ ├── Ellipsis.spec.tsx │ │ ├── Ellipsis.tsx │ │ ├── LG.spec.tsx │ │ ├── LG.tsx │ │ ├── MD.spec.tsx │ │ ├── MD.tsx │ │ ├── Paragraph.spec.tsx │ │ ├── Paragraph.tsx │ │ ├── SM.spec.tsx │ │ ├── SM.tsx │ │ ├── XL.spec.tsx │ │ ├── XL.tsx │ │ ├── XXL.spec.tsx │ │ ├── XXL.tsx │ │ ├── XXXL.spec.tsx │ │ ├── XXXL.tsx │ │ ├── lists │ │ │ ├── OrderedList.spec.tsx │ │ │ ├── OrderedList.tsx │ │ │ ├── OrderedListItem.spec.tsx │ │ │ ├── OrderedListItem.tsx │ │ │ ├── UnorderedList.spec.tsx │ │ │ ├── UnorderedList.tsx │ │ │ ├── UnorderedListItem.spec.tsx │ │ │ └── UnorderedListItem.tsx │ │ └── span │ │ │ ├── Icon.tsx │ │ │ ├── Span.spec.tsx │ │ │ ├── Span.tsx │ │ │ └── StartIcon.tsx │ ├── index.ts │ ├── styled │ │ ├── StyledBlockquote.spec.tsx │ │ ├── StyledBlockquote.ts │ │ ├── StyledCode.ts │ │ ├── StyledCodeBlock.spec.tsx │ │ ├── StyledCodeBlock.ts │ │ ├── StyledCodeBlockContainer.spec.tsx │ │ ├── StyledCodeBlockContainer.ts │ │ ├── StyledCodeBlockLine.spec.tsx │ │ ├── StyledCodeBlockLine.ts │ │ ├── StyledCodeBlockToken.spec.tsx │ │ ├── StyledCodeBlockToken.ts │ │ ├── StyledEllipsis.spec.tsx │ │ ├── StyledEllipsis.ts │ │ ├── StyledFont.spec.tsx │ │ ├── StyledFont.tsx │ │ ├── StyledIcon.spec.tsx │ │ ├── StyledIcon.ts │ │ ├── StyledList.spec.tsx │ │ ├── StyledList.ts │ │ ├── StyledListItem.spec.tsx │ │ ├── StyledListItem.ts │ │ ├── StyledParagraph.spec.tsx │ │ ├── StyledParagraph.ts │ │ └── index.ts │ ├── types │ │ └── index.ts │ └── utils │ │ ├── useOrderedListContext.spec.tsx │ │ ├── useOrderedListContext.ts │ │ ├── useUnorderedListContext.spec.tsx │ │ └── useUnorderedListContext.ts │ └── tsconfig.build.json ├── tsconfig.json └── utils ├── build ├── Intl.d.ts ├── declarations.d.ts ├── react.d.ts ├── rollup.config.js └── styled.d.ts ├── scripts ├── build.sh ├── deploy.mjs ├── new.mjs └── tag.mjs └── test ├── garden-test-utils.tsx ├── jest.config.js ├── jest.d.ts ├── jest.setup.js ├── rootDir └── __mocks__ │ ├── dom-helpers │ └── scrollTo.js │ └── popper.js.js ├── svg-mock.tsx └── tsconfig.test.json /.editorconfig: -------------------------------------------------------------------------------- 1 | ; top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | 7 | trim_trailing_whitespace = true 8 | 9 | ; Unix style line endings 10 | end_of_line = lf 11 | 12 | ; Always end file on newline 13 | insert_final_newline = true 14 | 15 | ; Indentation 16 | indent_style = space 17 | indent_size = 2 18 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @zendeskgarden/maintainers 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Expectations 2 | 3 | 6 | 7 | ## Reality 8 | 9 | 12 | 13 | ## Steps to Reproduce 14 | 15 | 1. 16 | 1. 17 | 1. 18 | 19 | 23 | 24 | ### Fine Print 25 | 26 | - Component: 27 | - Version: 28 | - Browsers: all 29 | -------------------------------------------------------------------------------- /.github/workflows/pr.yaml: -------------------------------------------------------------------------------- 1 | name: PR 2 | on: 3 | pull_request: 4 | types: [opened, labeled, unlabeled, synchronize] 5 | jobs: 6 | label: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: mheap/github-action-required-labels@v5 10 | with: 11 | mode: exactly 12 | count: 1 13 | labels: 'PR: Breaking Change :boom:, PR: Bug Fix :bug:, PR: Docs :memo:, PR: Internal :seedling:, PR: New Feature :rocket:' 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .changelog 3 | .env 4 | .netlify 5 | .vscode 6 | node_modules 7 | yarn.lock 8 | *.log 9 | demo/**/* 10 | packages/**/dist 11 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npm exec lint-staged && npm run build -- --since HEAD --exclude-dependents 2 | -------------------------------------------------------------------------------- /.lintstagedrc: -------------------------------------------------------------------------------- 1 | { 2 | "*.{js,ts,tsx}": [ 3 | "stylelint", 4 | "eslint --max-warnings 0", 5 | "jest --config=utils/test/jest.config.js --bail --findRelatedTests --passWithNoTests", 6 | "prettier --write" 7 | ], 8 | "!(*CHANGELOG|docs/changelogs/*).{md,mdx}": [ 9 | "markdownlint", 10 | "prettier --write" 11 | ], 12 | "**/package.json": [ 13 | "prettier-package-json --write" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "first-line-h1": false, 4 | "first-header-h1": false, 5 | "line-length": { 6 | "line_length": 100, 7 | "tables": false 8 | }, 9 | "no-inline-html": false 10 | } 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "arrowParens": "avoid" 6 | } 7 | -------------------------------------------------------------------------------- /.storybook/manager-head.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.storybook/manager.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { create } from '@storybook/theming/create'; 9 | import { addons } from '@storybook/addons'; 10 | import { DEFAULT_THEME } from '../packages/theming/src'; 11 | 12 | addons.setConfig({ 13 | panelPosition: 'right', 14 | theme: create({ 15 | brandTitle: 'Zendesk Garden React Components', 16 | brandUrl: 'https://github.com/zendeskgarden/react-components', 17 | brandImage: null, 18 | colorSecondary: DEFAULT_THEME.palette.blue[600], 19 | fontBase: DEFAULT_THEME.fonts.system, 20 | fontCode: DEFAULT_THEME.fonts.mono 21 | }) 22 | }); 23 | -------------------------------------------------------------------------------- /.storybook/preview-head.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /.storybook/static/images/avatars/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/chrome.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/clove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/clove.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/default.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/fennel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/fennel.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/linden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/linden.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/reed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/reed.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/rue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/rue.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/sage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/sage.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/system.png -------------------------------------------------------------------------------- /.storybook/static/images/avatars/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zendeskgarden/react-components/8e3d4369bbffa70092350babfb49cc7bf7b431ff/.storybook/static/images/avatars/user.png -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@zendeskgarden/stylelint-config"], 3 | "customSyntax": "postcss-styled-syntax", 4 | "rules": { 5 | "block-no-empty": null, 6 | "declaration-empty-line-before": null, 7 | "keyframes-name-pattern": null, 8 | "media-query-no-invalid": null, 9 | "selector-type-case": null, 10 | "selector-type-no-unknown": null, 11 | "time-min-milliseconds": [100, { "ignore": ["delay"] }], 12 | "value-keyword-case": ["lower", { "ignoreKeywords": ["dummyValue"] }] 13 | }, 14 | "ignoreFiles": ["packages/**/*.spec.{js,ts,tsx}", "packages/**/dist/**"] 15 | } 16 | -------------------------------------------------------------------------------- /.svgo.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | module.exports = { 9 | plugins: [ 10 | { 11 | name: 'addAttributesToSVGElement', 12 | params: { 13 | attributes: [ 14 | { 15 | focusable: false 16 | }, 17 | { 18 | 'aria-hidden': true 19 | } 20 | ] 21 | } 22 | } 23 | ] 24 | }; 25 | -------------------------------------------------------------------------------- /.yarnclean: -------------------------------------------------------------------------------- 1 | @types/react-native 2 | -------------------------------------------------------------------------------- /docs/adrs/README.md: -------------------------------------------------------------------------------- 1 | # Architectural Decision Records 2 | 3 | Garden architectural decison records (ADRs) capture important decisions made, 4 | along with context and consequences. 5 | 6 | - [ADR-001](./001-theming-peer-dependency.md): Theming peer dependency 7 | - [ADR-002](./002-theme-default-prop-removal.md): Removal of `theme` default prop 8 | -------------------------------------------------------------------------------- /packages/.template/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { HTMLAttributes } from 'react'; 9 | 10 | export { {{capitalize component}} } from './elements/{{capitalize component}}'; 11 | 12 | export type { I{{capitalize component}}Props } from './types'; 13 | -------------------------------------------------------------------------------- /packages/.template/src/styled/Styled{{capitalize component}}Text.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Styled{{capitalize component}}Text } from './Styled{{capitalize component}}Text'; 11 | 12 | describe('Styled{{capitalize component}}Text', () => { 13 | it('renders default styling', () => { 14 | const { container } = render(); 15 | 16 | expect(container.firstChild).toHaveStyleRule('text-overflow', 'ellipsis'); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /packages/.template/src/styled/Styled{{capitalize component}}Text.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | 10 | const COMPONENT_ID = '{{pluralize (lowercase component)}}.{{lowercase component}}.text'; 11 | 12 | export const Styled{{capitalize component}}Text = styled.span.attrs({ 13 | 'data-garden-id': COMPONENT_ID, 14 | 'data-garden-version': PACKAGE_VERSION 15 | })` 16 | display: block; 17 | max-width: 100%; 18 | overflow: hidden; 19 | text-overflow: ellipsis; 20 | `; 21 | -------------------------------------------------------------------------------- /packages/.template/src/styled/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export * from './Styled{{capitalize component}}'; 9 | export * from './Styled{{capitalize component}}Text'; 10 | -------------------------------------------------------------------------------- /packages/.template/src/types/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { HTMLAttributes } from 'react'; 9 | 10 | export interface I{{capitalize component}}Props extends HTMLAttributes { 11 | /** Applies compact styling */ 12 | isCompact?: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /packages/.template/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "declarationDir": "dist/typings", 6 | "declaration": true, 7 | "sourceMap": false, 8 | "noEmit": false, 9 | "paths": {} 10 | }, 11 | "include": ["src/**/*"], 12 | "exclude": ["**/*.spec.tsx", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/accordions/demo/stories/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export interface IAccordionSection { 9 | headerLabel: string; 10 | panel: string; 11 | } 12 | 13 | export interface IStepperStep { 14 | label: string; 15 | content: string; 16 | } 17 | 18 | export interface ITimelineItem { 19 | title: string; 20 | description: string; 21 | } 22 | -------------------------------------------------------------------------------- /packages/accordions/src/elements/accordion/components/Section.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React, { forwardRef, HTMLAttributes } from 'react'; 9 | import { StyledSection } from '../../../styled'; 10 | 11 | const SectionComponent = forwardRef>( 12 | (props, ref) => 13 | ); 14 | 15 | SectionComponent.displayName = 'Accordion.Section'; 16 | 17 | /** 18 | * @extends HTMLAttributes 19 | */ 20 | export const Section = SectionComponent; 21 | -------------------------------------------------------------------------------- /packages/accordions/src/elements/stepper/Stepper.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Stepper } from './Stepper'; 11 | 12 | describe('Stepper', () => { 13 | it('passes ref to underlying DOM element', () => { 14 | const ref = React.createRef(); 15 | const { container } = render(); 16 | 17 | expect(container.firstChild).toBe(ref.current); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /packages/accordions/src/elements/timeline/components/OppositeContent.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React, { forwardRef, HTMLAttributes } from 'react'; 9 | import { StyledOppositeContent } from '../../../styled'; 10 | 11 | const OppositeContentComponent = forwardRef>( 12 | (props, ref) => 13 | ); 14 | 15 | OppositeContentComponent.displayName = 'Timeline.OppositeContent'; 16 | 17 | /** 18 | * @extends HTMLAttributes 19 | */ 20 | export const OppositeContent = OppositeContentComponent; 21 | -------------------------------------------------------------------------------- /packages/accordions/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export { Accordion } from './elements/accordion/Accordion'; 9 | export { Stepper } from './elements/stepper/Stepper'; 10 | export { Timeline } from './elements/timeline/Timeline'; 11 | 12 | export type { 13 | IAccordionProps, 14 | IStepperProps, 15 | IStepperLabelProps, 16 | ITimelineProps, 17 | ITimelineItemProps 18 | } from './types'; 19 | -------------------------------------------------------------------------------- /packages/accordions/src/styled/accordion/StyledAccordion.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { componentStyles } from '@zendeskgarden/react-theming'; 10 | 11 | const COMPONENT_ID = 'accordions.accordion'; 12 | 13 | export const StyledAccordion = styled.div.attrs({ 14 | 'data-garden-id': COMPONENT_ID, 15 | 'data-garden-version': PACKAGE_VERSION 16 | })` 17 | ${componentStyles}; 18 | `; 19 | -------------------------------------------------------------------------------- /packages/accordions/src/styled/accordion/StyledSection.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { componentStyles } from '@zendeskgarden/react-theming'; 10 | import { StyledPanel } from './StyledPanel'; 11 | 12 | const COMPONENT_ID = 'accordions.section'; 13 | 14 | export const StyledSection = styled.div.attrs({ 15 | 'data-garden-id': COMPONENT_ID, 16 | 'data-garden-version': PACKAGE_VERSION 17 | })` 18 | &:last-child ${StyledPanel} { 19 | border: none; 20 | } 21 | 22 | ${componentStyles}; 23 | `; 24 | -------------------------------------------------------------------------------- /packages/accordions/src/styled/timeline/StyledContent.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { componentStyles } from '@zendeskgarden/react-theming'; 10 | 11 | const COMPONENT_ID = 'timeline.content'; 12 | 13 | export const StyledTimelineContent = styled.div.attrs({ 14 | 'data-garden-id': COMPONENT_ID, 15 | 'data-garden-version': PACKAGE_VERSION 16 | })` 17 | flex: 1; 18 | padding: ${props => `${props.theme.space.base * 5}px ${props.theme.space.base * 4}px`}; 19 | ${componentStyles}; 20 | `; 21 | -------------------------------------------------------------------------------- /packages/accordions/src/styled/timeline/StyledTimeline.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { componentStyles } from '@zendeskgarden/react-theming'; 10 | 11 | const COMPONENT_ID = 'timeline'; 12 | 13 | /** 14 | * 1.
    reset. 15 | */ 16 | export const StyledTimeline = styled.ol.attrs({ 17 | 'data-garden-id': COMPONENT_ID, 18 | 'data-garden-version': PACKAGE_VERSION 19 | })` 20 | margin: 0; /* [1] */ 21 | padding: 0; /* [1] */ 22 | list-style: none; /* [1] */ 23 | ${componentStyles}; 24 | `; 25 | -------------------------------------------------------------------------------- /packages/accordions/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export * from './useStepperContext'; 9 | export * from './useStepContext'; 10 | export * from './useAccordionContext'; 11 | export * from './useSectionContext'; 12 | export * from './useHeaderContext'; 13 | export * from './useTimelineContext'; 14 | export * from './useTimelineItemContext'; 15 | -------------------------------------------------------------------------------- /packages/accordions/src/utils/useHeaderContext.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { createContext, useContext } from 'react'; 9 | 10 | export interface IHeaderContext { 11 | isHovered: boolean; 12 | otherTriggerProps: any; 13 | } 14 | 15 | export const HeaderContext = createContext(undefined); 16 | 17 | export const useHeaderContext = () => { 18 | const context = useContext(HeaderContext); 19 | 20 | if (context === undefined) { 21 | throw new Error('This component must be rendered within a Accordion.Header component'); 22 | } 23 | 24 | return context; 25 | }; 26 | -------------------------------------------------------------------------------- /packages/accordions/src/utils/useSectionContext.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { createContext, useContext } from 'react'; 9 | 10 | export interface ISectionContext { 11 | sectionIndex: number; 12 | } 13 | 14 | export const SectionContext = createContext(undefined); 15 | 16 | export const useSectionContext = () => { 17 | const context = useContext(SectionContext); 18 | 19 | if (context === undefined) { 20 | throw new Error('This component must be rendered within an Accordion component'); 21 | } 22 | 23 | return context; 24 | }; 25 | -------------------------------------------------------------------------------- /packages/accordions/src/utils/useStepperContext.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { createContext, useContext } from 'react'; 9 | 10 | export interface IStepperContext { 11 | activeIndex: number; 12 | isHorizontal: boolean; 13 | } 14 | 15 | export const StepperContext = createContext(undefined); 16 | 17 | export const useStepperContext = () => { 18 | const context = useContext(StepperContext); 19 | 20 | if (context === undefined) { 21 | throw new Error('This component must be rendered within a Stepper component'); 22 | } 23 | 24 | return context; 25 | }; 26 | -------------------------------------------------------------------------------- /packages/accordions/src/utils/useTimelineContext.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { createContext, useContext } from 'react'; 9 | 10 | export interface ITimelineContext { 11 | isAlternate?: boolean; 12 | } 13 | 14 | export const TimelineContext = createContext(undefined); 15 | 16 | export const useTimelineContext = () => { 17 | const context = useContext(TimelineContext); 18 | 19 | if (context === undefined) { 20 | throw new Error('This component must be rendered within a Timeline component'); 21 | } 22 | 23 | return context; 24 | }; 25 | -------------------------------------------------------------------------------- /packages/accordions/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "declarationDir": "dist/typings", 6 | "declaration": true, 7 | "sourceMap": false, 8 | "noEmit": false, 9 | "paths": {} 10 | }, 11 | "include": ["src/**/*"], 12 | "exclude": ["**/*.spec.tsx", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/avatars/demo/stories/StatusIndicatorStory.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { Story } from '@storybook/react'; 10 | import { StatusIndicator, IStatusIndicatorProps } from '@zendeskgarden/react-avatars'; 11 | 12 | export const StatusIndicatorStory: Story = ({ ...args }) => { 13 | return ; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/avatars/demo/stories/data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export const AVATAR_TYPE = ['icon', 'image', 'text'] as const; 9 | -------------------------------------------------------------------------------- /packages/avatars/demo/stories/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { AVATAR_TYPE } from './data'; 9 | 10 | export type TYPE = (typeof AVATAR_TYPE)[number]; 11 | -------------------------------------------------------------------------------- /packages/avatars/src/elements/components/Text.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React, { forwardRef, HTMLAttributes } from 'react'; 9 | import { StyledText } from '../../styled'; 10 | 11 | const TextComponent = forwardRef>((props, ref) => ( 12 | 13 | )); 14 | 15 | TextComponent.displayName = 'Avatar.Text'; 16 | 17 | /** 18 | * @extends HTMLAttributes 19 | */ 20 | export const Text = TextComponent; 21 | -------------------------------------------------------------------------------- /packages/avatars/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export { Avatar } from './elements/Avatar'; 9 | export { StatusIndicator } from './elements/StatusIndicator'; 10 | 11 | export type { IAvatarProps, IStatusIndicatorProps } from './types'; 12 | -------------------------------------------------------------------------------- /packages/avatars/src/styled/StyledText.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { componentStyles } from '@zendeskgarden/react-theming'; 10 | 11 | const COMPONENT_ID = 'avatars.text'; 12 | 13 | /** 14 | * Accepts all `` attributes 15 | */ 16 | export const StyledText = styled.span.attrs({ 17 | 'data-garden-id': COMPONENT_ID, 18 | 'data-garden-version': PACKAGE_VERSION 19 | })` 20 | overflow: hidden; 21 | text-align: center; 22 | white-space: nowrap; 23 | 24 | ${componentStyles}; 25 | `; 26 | -------------------------------------------------------------------------------- /packages/avatars/src/styled/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export * from './StyledAvatar'; 9 | export * from './StyledStandaloneStatus'; 10 | export * from './StyledStandaloneStatusCaption'; 11 | export * from './StyledStandaloneStatusIndicator'; 12 | export * from './StyledStatusIndicator'; 13 | export * from './StyledText'; 14 | -------------------------------------------------------------------------------- /packages/avatars/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "declarationDir": "dist/typings", 6 | "declaration": true, 7 | "sourceMap": false, 8 | "noEmit": false, 9 | "paths": {} 10 | }, 11 | "include": ["src/**/*"], 12 | "exclude": ["**/*.spec.tsx", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/breadcrumbs/demo/stories/data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export const BREADCRUMB_CHILDREN = ['Garden', 'Vegetable row', 'Lettuce']; 9 | -------------------------------------------------------------------------------- /packages/breadcrumbs/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export { Breadcrumb } from './elements/Breadcrumb'; 9 | -------------------------------------------------------------------------------- /packages/breadcrumbs/src/styled/StyledCenteredBreadcrumbItem.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { StyledBreadcrumbItem } from './StyledBreadcrumbItem'; 10 | 11 | export const StyledCenteredBreadcrumbItem = styled(StyledBreadcrumbItem).attrs({ 12 | 'aria-hidden': true 13 | })` 14 | display: flex; 15 | align-items: center; 16 | `; 17 | -------------------------------------------------------------------------------- /packages/breadcrumbs/src/styled/StyledChevronIcon.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import styled from 'styled-components'; 9 | import { em } from 'polished'; 10 | import { getColor, StyledBaseIcon } from '@zendeskgarden/react-theming'; 11 | 12 | export const StyledChevronIcon = styled(StyledBaseIcon)` 13 | transform: ${p => p.theme.rtl && `rotate(180deg);`}; 14 | margin: 0 ${p => em(p.theme.space.base, p.theme.fontSizes.md)}; 15 | color: ${p => getColor({ variable: 'foreground.subtle', theme: p.theme })}; 16 | `; 17 | -------------------------------------------------------------------------------- /packages/breadcrumbs/src/styled/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export { StyledBreadcrumb } from './StyledBreadcrumb'; 9 | export { StyledChevronIcon } from './StyledChevronIcon'; 10 | export { StyledBreadcrumbItem } from './StyledBreadcrumbItem'; 11 | export { StyledCenteredBreadcrumbItem } from './StyledCenteredBreadcrumbItem'; 12 | -------------------------------------------------------------------------------- /packages/breadcrumbs/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "declarationDir": "dist/typings", 6 | "declaration": true, 7 | "sourceMap": false, 8 | "noEmit": false, 9 | "paths": {} 10 | }, 11 | "include": ["src/**/*"], 12 | "exclude": ["**/*.spec.tsx", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/buttons/src/elements/components/EndIcon.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { IButtonIconProps } from '../../types'; 10 | import { StyledIcon } from '../../styled'; 11 | 12 | const EndIconComponent = ({ isRotated, ...props }: IButtonIconProps) => ( 13 | 14 | ); 15 | 16 | EndIconComponent.displayName = 'Button.EndIcon'; 17 | 18 | /** 19 | * @extends SVGAttributes 20 | */ 21 | export const EndIcon = EndIconComponent; 22 | -------------------------------------------------------------------------------- /packages/buttons/src/elements/components/StartIcon.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { IButtonIconProps } from '../../types'; 10 | import { StyledIcon } from '../../styled'; 11 | 12 | const StartIconComponent = ({ isRotated, ...props }: IButtonIconProps) => ( 13 | 14 | ); 15 | 16 | StartIconComponent.displayName = 'Button.StartIcon'; 17 | 18 | /** 19 | * @extends SVGAttributes 20 | */ 21 | export const StartIcon = StartIconComponent; 22 | -------------------------------------------------------------------------------- /packages/buttons/src/styled/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export * from './StyledAnchor'; 9 | export { StyledButton } from './StyledButton'; 10 | export * from './StyledSplitButton'; 11 | export * from './StyledExternalIcon'; 12 | export * from './StyledIcon'; 13 | export { StyledIconButton } from './StyledIconButton'; 14 | -------------------------------------------------------------------------------- /packages/buttons/src/utils/useSplitButtonContext.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import { createContext, useContext } from 'react'; 9 | 10 | export const SplitButtonContext = createContext(undefined); 11 | 12 | export const useSplitButtonContext = () => { 13 | return useContext(SplitButtonContext); 14 | }; 15 | -------------------------------------------------------------------------------- /packages/buttons/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "declarationDir": "dist/typings", 6 | "declaration": true, 7 | "sourceMap": false, 8 | "noEmit": false, 9 | "paths": {} 10 | }, 11 | "include": ["src/**/*"], 12 | "exclude": ["**/*.spec.tsx", "**/*.spec.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /packages/chrome/demo/stories/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | export interface IFooterItem { 9 | text: string; 10 | type?: 'basic' | 'primary'; 11 | } 12 | 13 | export interface IHeaderItem { 14 | text: string; 15 | hasIcon: boolean; 16 | isRound?: boolean; 17 | isClipped?: boolean; 18 | maxX?: boolean; 19 | maxY?: boolean; 20 | isWrapper?: boolean; 21 | } 22 | 23 | export interface INavItem { 24 | text: string; 25 | } 26 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/body/Body.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Body } from './Body'; 11 | 12 | describe('Body', () => { 13 | it('passes ref to underlying DOM element', () => { 14 | const ref = React.createRef(); 15 | const { container } = render(); 16 | 17 | expect(container.firstChild).toBe(ref.current); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/body/Content.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Content } from './Content'; 11 | import { Body } from './Body'; 12 | 13 | describe('Content', () => { 14 | it('passes ref to underlying DOM element', () => { 15 | const ref = React.createRef(); 16 | const { queryByTestId } = render( 17 | 18 | 19 | 20 | ); 21 | 22 | expect(queryByTestId('content')).toBe(ref.current); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/body/Content.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React, { HTMLAttributes } from 'react'; 9 | import { StyledContent } from '../../styled'; 10 | import { useBodyContext } from '../../utils/useBodyContext'; 11 | 12 | /** 13 | * @extends HTMLAttributes 14 | */ 15 | export const Content = React.forwardRef>( 16 | (props, ref) => { 17 | const { hasFooter } = useBodyContext() || {}; 18 | 19 | return ; 20 | } 21 | ); 22 | 23 | Content.displayName = 'Content'; 24 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/body/Main.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Main } from './Main'; 11 | 12 | describe('Main', () => { 13 | it('passes ref to underlying DOM element', () => { 14 | const ref = React.createRef(); 15 | const { container } = render(
    ); 16 | 17 | expect(container.firstChild).toBe(ref.current); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/body/Main.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React, { HTMLAttributes } from 'react'; 9 | import { StyledMain } from '../../styled'; 10 | 11 | /** 12 | * @extends HTMLAttributes 13 | */ 14 | export const Main = React.forwardRef>((props, ref) => ( 15 | 16 | )); 17 | 18 | Main.displayName = 'Main'; 19 | -------------------------------------------------------------------------------- /packages/chrome/src/elements/footer/Footer.spec.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Zendesk, Inc. 3 | * 4 | * Use of this source code is governed under the Apache License, Version 2.0 5 | * found at http://www.apache.org/licenses/LICENSE-2.0. 6 | */ 7 | 8 | import React from 'react'; 9 | import { render } from 'garden-test-utils'; 10 | import { Footer } from './Footer'; 11 | 12 | describe('Footer', () => { 13 | it('passes ref to underlying DOM element', () => { 14 | const ref = React.createRef(); 15 | const { container } = render(