@primer/components 29.1.1 → 30.0.0-rc.48fd5c94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +10 -0
- package/.devcontainer/devcontainer.json +8 -0
- package/.eslintrc.json +136 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/new_component_proposal_template.md +41 -0
- package/.github/dependabot.yml +18 -0
- package/.github/pull_request_template.md +18 -0
- package/.github/workflows/ci.yml +31 -0
- package/.github/workflows/deploy_preview.yml +47 -0
- package/.github/workflows/deploy_production.yml +70 -0
- package/.github/workflows/release.yml +35 -0
- package/.github/workflows/release_canary.yml +70 -0
- package/.github/workflows/release_candidate.yml +60 -0
- package/.github/workflows/size.yml +13 -0
- package/.github/workflows/stale.yml +26 -0
- package/.gitignore +10 -0
- package/.npmrc +4 -0
- package/.nvmrc +1 -0
- package/.storybook/main.js +11 -0
- package/.storybook/preview.js +69 -0
- package/.vscode/launch.json +21 -0
- package/.vscode/settings.json +13 -0
- package/@types/@styled-system/index.d.ts +0 -0
- package/@types/@styled-system/prop-types/index.d.ts +1 -0
- package/@types/@styled-system/props/index.d.ts +1 -0
- package/@types/jest-styled-components/index.d.ts +1 -0
- package/CHANGELOG.md +11 -1
- package/CODEOWNERS +2 -0
- package/babel-defines.js +13 -0
- package/babel.config.js +39 -0
- package/contributor-docs/CODE_OF_CONDUCT.md +76 -0
- package/contributor-docs/CONTRIBUTING.md +274 -0
- package/contributor-docs/adrs/adr-001-typescript.md +23 -0
- package/contributor-docs/adrs/adr-002-behavior-isolation.md +106 -0
- package/contributor-docs/behaviors.md +132 -0
- package/contributor-docs/component-contents-api-patterns.md +316 -0
- package/contributor-docs/principles.md +39 -0
- package/dist/browser.esm.js +130 -130
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +113 -113
- package/dist/browser.umd.js.map +1 -1
- package/docs/.eslintrc +0 -0
- package/docs/.gitignore +91 -0
- package/docs/components/PropsList.js +5 -0
- package/docs/components/State.js +9 -0
- package/docs/components/constants.js +34 -0
- package/docs/components/index.js +2 -0
- package/docs/content/ActionList.mdx +72 -0
- package/docs/content/ActionMenu.mdx +80 -0
- package/docs/content/AnchoredOverlay.mdx +37 -0
- package/docs/content/Avatar.mdx +33 -0
- package/docs/content/AvatarStack.mdx +43 -0
- package/docs/content/BorderBox.md +46 -0
- package/docs/content/Box.md +74 -0
- package/docs/content/BranchName.md +18 -0
- package/docs/content/Breadcrumbs.md +52 -0
- package/docs/content/Buttons.md +56 -0
- package/docs/content/CircleBadge.md +45 -0
- package/docs/content/CircleOcticon.md +18 -0
- package/docs/content/CounterLabel.md +32 -0
- package/docs/content/Details.md +105 -0
- package/docs/content/Dialog.md +108 -0
- package/docs/content/Dialog2.mdx +179 -0
- package/docs/content/Dropdown.md +72 -0
- package/docs/content/DropdownMenu.mdx +49 -0
- package/docs/content/FilterList.md +44 -0
- package/docs/content/FilteredSearch.md +39 -0
- package/docs/content/Flash.md +44 -0
- package/docs/content/Flex.md +58 -0
- package/docs/content/FormGroup.md +46 -0
- package/docs/content/Grid.md +59 -0
- package/docs/content/Header.md +79 -0
- package/docs/content/Heading.md +22 -0
- package/docs/content/Label.md +42 -0
- package/docs/content/LabelGroup.md +31 -0
- package/docs/content/Link.md +37 -0
- package/docs/content/Overlay.mdx +94 -0
- package/docs/content/Pagehead.md +27 -0
- package/docs/content/Pagination.md +187 -0
- package/docs/content/PointerBox.md +81 -0
- package/docs/content/Popover.md +137 -0
- package/docs/content/Portal.mdx +78 -0
- package/docs/content/Position.md +100 -0
- package/docs/content/ProgressBar.mdx +29 -0
- package/docs/content/SelectMenu.md +435 -0
- package/docs/content/SelectPanel.mdx +67 -0
- package/docs/content/SideNav.md +179 -0
- package/docs/content/Spinner.mdx +32 -0
- package/docs/content/StateLabel.md +35 -0
- package/docs/content/StyledOcticon.md +36 -0
- package/docs/content/SubNav.md +102 -0
- package/docs/content/TabNav.md +50 -0
- package/docs/content/Text.md +31 -0
- package/docs/content/TextInput.md +34 -0
- package/docs/content/Timeline.md +138 -0
- package/docs/content/Tooltip.md +41 -0
- package/docs/content/Truncate.md +64 -0
- package/docs/content/UnderlineNav.md +53 -0
- package/docs/content/anchoredPosition.mdx +163 -0
- package/docs/content/core-concepts.md +70 -0
- package/docs/content/focusTrap.mdx +103 -0
- package/docs/content/focusZone.mdx +145 -0
- package/docs/content/getting-started.md +138 -0
- package/docs/content/index.md +33 -0
- package/docs/content/linting.md +35 -0
- package/docs/content/overriding-styles.mdx +81 -0
- package/docs/content/philosophy.md +23 -0
- package/docs/content/primer-theme.md +89 -0
- package/docs/content/ssr.mdx +43 -0
- package/docs/content/system-props.mdx +37 -0
- package/docs/content/theme-reference.md +16 -0
- package/docs/content/theming.md +249 -0
- package/docs/content/useOnEscapePress.mdx +56 -0
- package/docs/content/useOnOutsideClick.mdx +57 -0
- package/docs/content/useOpenAndCloseFocus.mdx +49 -0
- package/docs/content/useOverlay.mdx +62 -0
- package/docs/content/useSafeTimeout.mdx +32 -0
- package/docs/gatsby-config.js +30 -0
- package/docs/gatsby-node.js +101 -0
- package/docs/package-lock.json +20979 -0
- package/docs/package.json +35 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/hero.js +21 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/live-code.js +84 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/live-preview-wrapper.js +39 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/nav-dropdown.js +48 -0
- package/docs/src/@primer/gatsby-theme-doctocat/components/wrap-page-element.js +25 -0
- package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +54 -0
- package/docs/src/@primer/gatsby-theme-doctocat/nav.yml +127 -0
- package/docs/src/@primer/gatsby-theme-doctocat/primer-components-hero.svg +1411 -0
- package/docs/src/props.js +77 -0
- package/jest.config.js +13 -0
- package/lib/Breadcrumbs.d.ts +40 -0
- package/lib/{Breadcrumb.js → Breadcrumbs.js} +31 -21
- package/lib/__tests__/ActionList.d.ts +1 -0
- package/lib/__tests__/ActionList.js +67 -0
- package/lib/__tests__/ActionMenu.d.ts +1 -0
- package/lib/__tests__/ActionMenu.js +154 -0
- package/lib/__tests__/AnchoredOverlay.d.ts +1 -0
- package/lib/__tests__/AnchoredOverlay.js +161 -0
- package/lib/__tests__/Avatar.d.ts +1 -0
- package/lib/__tests__/Avatar.js +70 -0
- package/lib/__tests__/AvatarStack.d.ts +1 -0
- package/lib/__tests__/AvatarStack.js +71 -0
- package/lib/__tests__/BorderBox.d.ts +1 -0
- package/lib/__tests__/BorderBox.js +61 -0
- package/lib/__tests__/Box.d.ts +1 -0
- package/lib/__tests__/Box.js +81 -0
- package/lib/__tests__/BranchName.d.ts +1 -0
- package/lib/__tests__/BranchName.js +39 -0
- package/lib/__tests__/Breadcrumbs.d.ts +1 -0
- package/lib/__tests__/Breadcrumbs.js +40 -0
- package/lib/__tests__/BreadcrumbsItem.d.ts +1 -0
- package/lib/__tests__/BreadcrumbsItem.js +52 -0
- package/lib/__tests__/Button.d.ts +1 -0
- package/lib/__tests__/Button.js +152 -0
- package/lib/__tests__/Caret.d.ts +1 -0
- package/lib/__tests__/Caret.js +52 -0
- package/lib/__tests__/CircleBadge.d.ts +1 -0
- package/lib/__tests__/CircleBadge.js +87 -0
- package/lib/__tests__/CircleOcticon.d.ts +1 -0
- package/lib/__tests__/CircleOcticon.js +74 -0
- package/lib/__tests__/CounterLabel.d.ts +1 -0
- package/lib/__tests__/CounterLabel.js +61 -0
- package/lib/__tests__/Details.d.ts +1 -0
- package/lib/__tests__/Details.js +120 -0
- package/lib/__tests__/Dialog.d.ts +1 -0
- package/lib/__tests__/Dialog.js +188 -0
- package/lib/__tests__/Dropdown.d.ts +1 -0
- package/lib/__tests__/Dropdown.js +70 -0
- package/lib/__tests__/DropdownMenu.d.ts +1 -0
- package/lib/__tests__/DropdownMenu.js +153 -0
- package/lib/__tests__/FilterList.d.ts +1 -0
- package/lib/__tests__/FilterList.js +39 -0
- package/lib/__tests__/FilterListItem.d.ts +1 -0
- package/lib/__tests__/FilterListItem.js +49 -0
- package/lib/__tests__/FilteredSearch.d.ts +1 -0
- package/lib/__tests__/FilteredSearch.js +39 -0
- package/lib/__tests__/Flash.d.ts +1 -0
- package/lib/__tests__/Flash.js +65 -0
- package/lib/__tests__/Flex.d.ts +1 -0
- package/lib/__tests__/Flex.js +77 -0
- package/lib/__tests__/FormGroup.d.ts +1 -0
- package/lib/__tests__/FormGroup.js +58 -0
- package/lib/__tests__/Grid.d.ts +1 -0
- package/lib/__tests__/Grid.js +107 -0
- package/lib/__tests__/Header.d.ts +1 -0
- package/lib/__tests__/Header.js +63 -0
- package/lib/__tests__/Heading.d.ts +1 -0
- package/lib/__tests__/Heading.js +112 -0
- package/lib/__tests__/Label.d.ts +1 -0
- package/lib/__tests__/Label.js +49 -0
- package/lib/__tests__/LabelGroup.d.ts +1 -0
- package/lib/__tests__/LabelGroup.js +41 -0
- package/lib/__tests__/Link.d.ts +1 -0
- package/lib/__tests__/Link.js +73 -0
- package/lib/__tests__/Overlay.d.ts +1 -0
- package/lib/__tests__/Overlay.js +145 -0
- package/lib/__tests__/Pagehead.d.ts +1 -0
- package/lib/__tests__/Pagehead.js +40 -0
- package/lib/__tests__/Pagination/Pagination.d.ts +1 -0
- package/lib/__tests__/Pagination/Pagination.js +50 -0
- package/lib/__tests__/Pagination/PaginationModel.d.ts +1 -0
- package/lib/__tests__/Pagination/PaginationModel.js +186 -0
- package/lib/__tests__/PointerBox.d.ts +1 -0
- package/lib/__tests__/PointerBox.js +49 -0
- package/lib/__tests__/Popover.d.ts +1 -0
- package/lib/__tests__/Popover.js +70 -0
- package/lib/__tests__/Portal.d.ts +1 -0
- package/lib/__tests__/Portal.js +124 -0
- package/lib/__tests__/Position.d.ts +1 -0
- package/lib/__tests__/Position.js +149 -0
- package/lib/__tests__/ProgressBar.d.ts +1 -0
- package/lib/__tests__/ProgressBar.js +71 -0
- package/lib/__tests__/SelectMenu.d.ts +1 -0
- package/lib/__tests__/SelectMenu.js +155 -0
- package/lib/__tests__/SelectPanel.d.ts +1 -0
- package/lib/__tests__/SelectPanel.js +83 -0
- package/lib/__tests__/SideNav.d.ts +1 -0
- package/lib/__tests__/SideNav.js +75 -0
- package/lib/__tests__/Spinner.d.ts +1 -0
- package/lib/__tests__/Spinner.js +56 -0
- package/lib/__tests__/StateLabel.d.ts +1 -0
- package/lib/__tests__/StateLabel.js +74 -0
- package/lib/__tests__/StyledOcticon.d.ts +1 -0
- package/lib/__tests__/StyledOcticon.js +43 -0
- package/lib/__tests__/SubNav.d.ts +1 -0
- package/lib/__tests__/SubNav.js +65 -0
- package/lib/__tests__/SubNavLink.d.ts +1 -0
- package/lib/__tests__/SubNavLink.js +52 -0
- package/lib/__tests__/TabNav.d.ts +1 -0
- package/lib/__tests__/TabNav.js +53 -0
- package/lib/__tests__/Text.d.ts +1 -0
- package/lib/__tests__/Text.js +108 -0
- package/lib/__tests__/TextInput.d.ts +1 -0
- package/lib/__tests__/TextInput.js +81 -0
- package/lib/__tests__/ThemeProvider.d.ts +1 -0
- package/lib/__tests__/ThemeProvider.js +444 -0
- package/lib/__tests__/Timeline.d.ts +1 -0
- package/lib/__tests__/Timeline.js +80 -0
- package/lib/__tests__/Tooltip.d.ts +1 -0
- package/lib/__tests__/Tooltip.js +72 -0
- package/lib/__tests__/Truncate.d.ts +1 -0
- package/lib/__tests__/Truncate.js +66 -0
- package/lib/__tests__/UnderlineNav.d.ts +1 -0
- package/lib/__tests__/UnderlineNav.js +75 -0
- package/lib/__tests__/UnderlineNavLink.d.ts +1 -0
- package/lib/__tests__/UnderlineNavLink.js +54 -0
- package/lib/__tests__/behaviors/anchoredPosition.d.ts +1 -0
- package/lib/__tests__/behaviors/anchoredPosition.js +390 -0
- package/lib/__tests__/behaviors/focusTrap.d.ts +1 -0
- package/lib/__tests__/behaviors/focusTrap.js +234 -0
- package/lib/__tests__/behaviors/focusZone.d.ts +1 -0
- package/lib/__tests__/behaviors/focusZone.js +570 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.d.ts +1 -0
- package/lib/__tests__/behaviors/iterateFocusableElements.js +55 -0
- package/lib/__tests__/filterObject.d.ts +1 -0
- package/lib/__tests__/filterObject.js +30 -0
- package/lib/__tests__/hooks/useAnchoredPosition.d.ts +1 -0
- package/lib/__tests__/hooks/useAnchoredPosition.js +54 -0
- package/lib/__tests__/hooks/useOnEscapePress.d.ts +1 -0
- package/lib/__tests__/hooks/useOnEscapePress.js +32 -0
- package/lib/__tests__/hooks/useOnOutsideClick.d.ts +1 -0
- package/lib/__tests__/hooks/useOnOutsideClick.js +87 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.d.ts +1 -0
- package/lib/__tests__/hooks/useOpenAndCloseFocus.js +60 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.d.ts +1 -0
- package/lib/__tests__/hooks/useProvidedStateOrCreate.js +45 -0
- package/lib/__tests__/theme.d.ts +1 -0
- package/lib/__tests__/theme.js +36 -0
- package/lib/__tests__/themeGet.d.ts +1 -0
- package/lib/__tests__/themeGet.js +25 -0
- package/lib/__tests__/useSafeTimeout.d.ts +1 -0
- package/lib/__tests__/useSafeTimeout.js +45 -0
- package/lib/index.d.ts +2 -2
- package/lib/index.js +8 -2
- package/lib/stories/ActionList.stories.js +382 -0
- package/lib/stories/ActionMenu.stories.js +338 -0
- package/lib/stories/AnchoredOverlay.stories.js +127 -0
- package/lib/stories/AvatarStack.stories.js +49 -0
- package/lib/stories/Button.stories.js +114 -0
- package/lib/stories/ConfirmationDialog.stories.js +111 -0
- package/lib/stories/Dialog.stories.js +265 -0
- package/lib/stories/DropdownMenu.stories.js +122 -0
- package/lib/stories/Overlay.stories.js +185 -0
- package/lib/stories/Portal.stories.js +104 -0
- package/lib/stories/SelectPanel.stories.js +342 -0
- package/lib/stories/ThemeProvider.stories.js +102 -0
- package/lib/stories/useAnchoredPosition.stories.js +351 -0
- package/lib/stories/useFocusTrap.stories.js +356 -0
- package/lib/stories/useFocusZone.stories.js +599 -0
- package/lib-esm/Breadcrumbs.d.ts +40 -0
- package/lib-esm/{Breadcrumb.js → Breadcrumbs.js} +28 -19
- package/lib-esm/__tests__/ActionList.d.ts +1 -0
- package/lib-esm/__tests__/ActionList.js +54 -0
- package/lib-esm/__tests__/ActionMenu.d.ts +1 -0
- package/lib-esm/__tests__/ActionMenu.js +141 -0
- package/lib-esm/__tests__/AnchoredOverlay.d.ts +1 -0
- package/lib-esm/__tests__/AnchoredOverlay.js +135 -0
- package/lib-esm/__tests__/Avatar.d.ts +1 -0
- package/lib-esm/__tests__/Avatar.js +58 -0
- package/lib-esm/__tests__/AvatarStack.d.ts +1 -0
- package/lib-esm/__tests__/AvatarStack.js +57 -0
- package/lib-esm/__tests__/BorderBox.d.ts +1 -0
- package/lib-esm/__tests__/BorderBox.js +49 -0
- package/lib-esm/__tests__/Box.d.ts +1 -0
- package/lib-esm/__tests__/Box.js +69 -0
- package/lib-esm/__tests__/BranchName.d.ts +1 -0
- package/lib-esm/__tests__/BranchName.js +28 -0
- package/lib-esm/__tests__/Breadcrumbs.d.ts +1 -0
- package/lib-esm/__tests__/Breadcrumbs.js +29 -0
- package/lib-esm/__tests__/BreadcrumbsItem.d.ts +1 -0
- package/lib-esm/__tests__/BreadcrumbsItem.js +41 -0
- package/lib-esm/__tests__/Button.d.ts +1 -0
- package/lib-esm/__tests__/Button.js +141 -0
- package/lib-esm/__tests__/Caret.d.ts +1 -0
- package/lib-esm/__tests__/Caret.js +42 -0
- package/lib-esm/__tests__/CircleBadge.d.ts +1 -0
- package/lib-esm/__tests__/CircleBadge.js +73 -0
- package/lib-esm/__tests__/CircleOcticon.d.ts +1 -0
- package/lib-esm/__tests__/CircleOcticon.js +61 -0
- package/lib-esm/__tests__/CounterLabel.d.ts +1 -0
- package/lib-esm/__tests__/CounterLabel.js +49 -0
- package/lib-esm/__tests__/Details.d.ts +1 -0
- package/lib-esm/__tests__/Details.js +109 -0
- package/lib-esm/__tests__/Dialog.d.ts +1 -0
- package/lib-esm/__tests__/Dialog.js +174 -0
- package/lib-esm/__tests__/Dropdown.d.ts +1 -0
- package/lib-esm/__tests__/Dropdown.js +59 -0
- package/lib-esm/__tests__/DropdownMenu.d.ts +1 -0
- package/lib-esm/__tests__/DropdownMenu.js +139 -0
- package/lib-esm/__tests__/FilterList.d.ts +1 -0
- package/lib-esm/__tests__/FilterList.js +28 -0
- package/lib-esm/__tests__/FilterListItem.d.ts +1 -0
- package/lib-esm/__tests__/FilterListItem.js +38 -0
- package/lib-esm/__tests__/FilteredSearch.d.ts +1 -0
- package/lib-esm/__tests__/FilteredSearch.js +28 -0
- package/lib-esm/__tests__/Flash.d.ts +1 -0
- package/lib-esm/__tests__/Flash.js +53 -0
- package/lib-esm/__tests__/Flex.d.ts +1 -0
- package/lib-esm/__tests__/Flex.js +66 -0
- package/lib-esm/__tests__/FormGroup.d.ts +1 -0
- package/lib-esm/__tests__/FormGroup.js +47 -0
- package/lib-esm/__tests__/Grid.d.ts +1 -0
- package/lib-esm/__tests__/Grid.js +96 -0
- package/lib-esm/__tests__/Header.d.ts +1 -0
- package/lib-esm/__tests__/Header.js +52 -0
- package/lib-esm/__tests__/Heading.d.ts +1 -0
- package/lib-esm/__tests__/Heading.js +101 -0
- package/lib-esm/__tests__/Label.d.ts +1 -0
- package/lib-esm/__tests__/Label.js +38 -0
- package/lib-esm/__tests__/LabelGroup.d.ts +1 -0
- package/lib-esm/__tests__/LabelGroup.js +28 -0
- package/lib-esm/__tests__/Link.d.ts +1 -0
- package/lib-esm/__tests__/Link.js +62 -0
- package/lib-esm/__tests__/Overlay.d.ts +1 -0
- package/lib-esm/__tests__/Overlay.js +123 -0
- package/lib-esm/__tests__/Pagehead.d.ts +1 -0
- package/lib-esm/__tests__/Pagehead.js +28 -0
- package/lib-esm/__tests__/Pagination/Pagination.d.ts +1 -0
- package/lib-esm/__tests__/Pagination/Pagination.js +37 -0
- package/lib-esm/__tests__/Pagination/PaginationModel.d.ts +1 -0
- package/lib-esm/__tests__/Pagination/PaginationModel.js +182 -0
- package/lib-esm/__tests__/PointerBox.d.ts +1 -0
- package/lib-esm/__tests__/PointerBox.js +38 -0
- package/lib-esm/__tests__/Popover.d.ts +1 -0
- package/lib-esm/__tests__/Popover.js +56 -0
- package/lib-esm/__tests__/Portal.d.ts +1 -0
- package/lib-esm/__tests__/Portal.js +104 -0
- package/lib-esm/__tests__/Position.d.ts +1 -0
- package/lib-esm/__tests__/Position.js +138 -0
- package/lib-esm/__tests__/ProgressBar.d.ts +1 -0
- package/lib-esm/__tests__/ProgressBar.js +60 -0
- package/lib-esm/__tests__/SelectMenu.d.ts +1 -0
- package/lib-esm/__tests__/SelectMenu.js +145 -0
- package/lib-esm/__tests__/SelectPanel.d.ts +1 -0
- package/lib-esm/__tests__/SelectPanel.js +67 -0
- package/lib-esm/__tests__/SideNav.d.ts +1 -0
- package/lib-esm/__tests__/SideNav.js +63 -0
- package/lib-esm/__tests__/Spinner.d.ts +1 -0
- package/lib-esm/__tests__/Spinner.js +45 -0
- package/lib-esm/__tests__/StateLabel.d.ts +1 -0
- package/lib-esm/__tests__/StateLabel.js +63 -0
- package/lib-esm/__tests__/StyledOcticon.d.ts +1 -0
- package/lib-esm/__tests__/StyledOcticon.js +31 -0
- package/lib-esm/__tests__/SubNav.d.ts +1 -0
- package/lib-esm/__tests__/SubNav.js +52 -0
- package/lib-esm/__tests__/SubNavLink.d.ts +1 -0
- package/lib-esm/__tests__/SubNavLink.js +41 -0
- package/lib-esm/__tests__/TabNav.d.ts +1 -0
- package/lib-esm/__tests__/TabNav.js +42 -0
- package/lib-esm/__tests__/Text.d.ts +1 -0
- package/lib-esm/__tests__/Text.js +95 -0
- package/lib-esm/__tests__/TextInput.d.ts +1 -0
- package/lib-esm/__tests__/TextInput.js +70 -0
- package/lib-esm/__tests__/ThemeProvider.d.ts +1 -0
- package/lib-esm/__tests__/ThemeProvider.js +408 -0
- package/lib-esm/__tests__/Timeline.d.ts +1 -0
- package/lib-esm/__tests__/Timeline.js +69 -0
- package/lib-esm/__tests__/Tooltip.d.ts +1 -0
- package/lib-esm/__tests__/Tooltip.js +61 -0
- package/lib-esm/__tests__/Truncate.d.ts +1 -0
- package/lib-esm/__tests__/Truncate.js +55 -0
- package/lib-esm/__tests__/UnderlineNav.d.ts +1 -0
- package/lib-esm/__tests__/UnderlineNav.js +62 -0
- package/lib-esm/__tests__/UnderlineNavLink.d.ts +1 -0
- package/lib-esm/__tests__/UnderlineNavLink.js +43 -0
- package/lib-esm/__tests__/behaviors/anchoredPosition.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/anchoredPosition.js +388 -0
- package/lib-esm/__tests__/behaviors/focusTrap.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/focusTrap.js +227 -0
- package/lib-esm/__tests__/behaviors/focusZone.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/focusZone.js +487 -0
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.d.ts +1 -0
- package/lib-esm/__tests__/behaviors/iterateFocusableElements.js +48 -0
- package/lib-esm/__tests__/filterObject.d.ts +1 -0
- package/lib-esm/__tests__/filterObject.js +27 -0
- package/lib-esm/__tests__/hooks/useAnchoredPosition.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useAnchoredPosition.js +46 -0
- package/lib-esm/__tests__/hooks/useOnEscapePress.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOnEscapePress.js +23 -0
- package/lib-esm/__tests__/hooks/useOnOutsideClick.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOnOutsideClick.js +68 -0
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useOpenAndCloseFocus.js +52 -0
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.d.ts +1 -0
- package/lib-esm/__tests__/hooks/useProvidedStateOrCreate.js +36 -0
- package/lib-esm/__tests__/theme.d.ts +1 -0
- package/lib-esm/__tests__/theme.js +33 -0
- package/lib-esm/__tests__/themeGet.d.ts +1 -0
- package/lib-esm/__tests__/themeGet.js +22 -0
- package/lib-esm/__tests__/useSafeTimeout.d.ts +1 -0
- package/lib-esm/__tests__/useSafeTimeout.js +39 -0
- package/lib-esm/index.d.ts +2 -2
- package/lib-esm/index.js +1 -1
- package/lib-esm/stories/ActionList.stories.js +334 -0
- package/lib-esm/stories/ActionMenu.stories.js +293 -0
- package/lib-esm/stories/AnchoredOverlay.stories.js +101 -0
- package/lib-esm/stories/AvatarStack.stories.js +32 -0
- package/lib-esm/stories/Button.stories.js +78 -0
- package/lib-esm/stories/ConfirmationDialog.stories.js +86 -0
- package/lib-esm/stories/Dialog.stories.js +240 -0
- package/lib-esm/stories/DropdownMenu.stories.js +94 -0
- package/lib-esm/stories/Overlay.stories.js +154 -0
- package/lib-esm/stories/Portal.stories.js +68 -0
- package/lib-esm/stories/SelectPanel.stories.js +284 -0
- package/lib-esm/stories/ThemeProvider.stories.js +83 -0
- package/lib-esm/stories/useAnchoredPosition.stories.js +313 -0
- package/lib-esm/stories/useFocusTrap.stories.js +309 -0
- package/lib-esm/stories/useFocusZone.stories.js +554 -0
- package/migrating.md +250 -0
- package/now.json +17 -0
- package/package-lock.json +28942 -0
- package/package.json +6 -5
- package/rollup.config.js +36 -0
- package/script/build +19 -0
- package/script/setup +12 -0
- package/src/ActionList/Divider.tsx +25 -0
- package/src/ActionList/Group.tsx +45 -0
- package/src/ActionList/Header.tsx +74 -0
- package/src/ActionList/Item.tsx +460 -0
- package/src/ActionList/List.tsx +253 -0
- package/src/ActionList/index.ts +21 -0
- package/src/ActionMenu.tsx +106 -0
- package/src/AnchoredOverlay/AnchoredOverlay.tsx +180 -0
- package/src/AnchoredOverlay/index.ts +2 -0
- package/src/Avatar.tsx +46 -0
- package/src/AvatarPair.tsx +35 -0
- package/src/AvatarStack.tsx +161 -0
- package/src/BaseStyles.tsx +53 -0
- package/src/BorderBox.tsx +18 -0
- package/src/Box.tsx +54 -0
- package/src/BranchName.tsx +19 -0
- package/src/Breadcrumbs.tsx +101 -0
- package/src/Button/Button.tsx +40 -0
- package/src/Button/ButtonBase.tsx +43 -0
- package/src/Button/ButtonClose.tsx +40 -0
- package/src/Button/ButtonDanger.tsx +43 -0
- package/src/Button/ButtonGroup.tsx +55 -0
- package/src/Button/ButtonInvisible.tsx +27 -0
- package/src/Button/ButtonOutline.tsx +43 -0
- package/src/Button/ButtonPrimary.tsx +41 -0
- package/src/Button/ButtonStyles.tsx +36 -0
- package/src/Button/ButtonTableList.tsx +58 -0
- package/src/Button/index.ts +16 -0
- package/src/Caret.tsx +133 -0
- package/src/CircleBadge.tsx +55 -0
- package/src/CircleOcticon.tsx +37 -0
- package/src/CounterLabel.tsx +52 -0
- package/src/Details.tsx +23 -0
- package/src/Dialog/ConfirmationDialog.tsx +184 -0
- package/src/Dialog/Dialog.tsx +419 -0
- package/src/Dialog.tsx +149 -0
- package/src/Dropdown.tsx +158 -0
- package/src/DropdownMenu/DropdownButton.tsx +15 -0
- package/src/DropdownMenu/DropdownMenu.tsx +115 -0
- package/src/DropdownMenu/index.ts +4 -0
- package/src/DropdownStyles.ts +128 -0
- package/src/FilterList.tsx +81 -0
- package/src/FilteredActionList/FilteredActionList.tsx +152 -0
- package/src/FilteredActionList/index.ts +2 -0
- package/src/FilteredSearch.tsx +28 -0
- package/src/Flash.tsx +77 -0
- package/src/Flex.tsx +15 -0
- package/src/FormGroup.tsx +27 -0
- package/src/Grid.tsx +15 -0
- package/src/Header.tsx +84 -0
- package/src/Heading.tsx +21 -0
- package/src/Label.tsx +75 -0
- package/src/LabelGroup.tsx +18 -0
- package/src/Link.tsx +46 -0
- package/src/Overlay.tsx +194 -0
- package/src/Pagehead.tsx +17 -0
- package/src/Pagination/Pagination.tsx +214 -0
- package/src/Pagination/index.ts +4 -0
- package/src/Pagination/model.tsx +187 -0
- package/src/PointerBox.tsx +31 -0
- package/src/Popover.tsx +236 -0
- package/src/Portal/Portal.tsx +96 -0
- package/src/Portal/index.ts +5 -0
- package/src/Position.tsx +63 -0
- package/src/ProgressBar.tsx +52 -0
- package/src/SelectMenu/SelectMenu.tsx +125 -0
- package/src/SelectMenu/SelectMenuContext.tsx +9 -0
- package/src/SelectMenu/SelectMenuDivider.tsx +25 -0
- package/src/SelectMenu/SelectMenuFilter.tsx +51 -0
- package/src/SelectMenu/SelectMenuFooter.tsx +28 -0
- package/src/SelectMenu/SelectMenuHeader.tsx +50 -0
- package/src/SelectMenu/SelectMenuItem.tsx +137 -0
- package/src/SelectMenu/SelectMenuList.tsx +42 -0
- package/src/SelectMenu/SelectMenuLoadingAnimation.tsx +24 -0
- package/src/SelectMenu/SelectMenuModal.tsx +121 -0
- package/src/SelectMenu/SelectMenuTab.tsx +88 -0
- package/src/SelectMenu/SelectMenuTabPanel.tsx +30 -0
- package/src/SelectMenu/SelectMenuTabs.tsx +44 -0
- package/src/SelectMenu/hooks/useKeyboardNav.js +90 -0
- package/src/SelectMenu/index.ts +15 -0
- package/src/SelectPanel/SelectPanel.tsx +172 -0
- package/src/SelectPanel/index.ts +2 -0
- package/src/SideNav.tsx +193 -0
- package/src/Spinner.tsx +59 -0
- package/src/StateLabel.tsx +110 -0
- package/src/StyledOcticon.tsx +24 -0
- package/src/SubNav.tsx +129 -0
- package/src/TabNav.tsx +77 -0
- package/src/Text.tsx +13 -0
- package/src/TextInput.tsx +183 -0
- package/src/ThemeProvider.tsx +176 -0
- package/src/Timeline.tsx +141 -0
- package/src/Tooltip.tsx +263 -0
- package/src/Truncate.tsx +36 -0
- package/src/UnderlineNav.tsx +110 -0
- package/src/__tests__/.eslintrc.json +11 -0
- package/src/__tests__/ActionList.tsx +49 -0
- package/src/__tests__/ActionMenu.tsx +138 -0
- package/src/__tests__/AnchoredOverlay.tsx +151 -0
- package/src/__tests__/Avatar.tsx +45 -0
- package/src/__tests__/AvatarStack.tsx +45 -0
- package/src/__tests__/BorderBox.tsx +44 -0
- package/src/__tests__/Box.tsx +43 -0
- package/src/__tests__/BranchName.tsx +27 -0
- package/src/__tests__/Breadcrumbs.tsx +28 -0
- package/src/__tests__/BreadcrumbsItem.tsx +32 -0
- package/src/__tests__/Button.tsx +129 -0
- package/src/__tests__/Caret.tsx +36 -0
- package/src/__tests__/CircleBadge.tsx +69 -0
- package/src/__tests__/CircleOcticon.tsx +52 -0
- package/src/__tests__/CounterLabel.tsx +51 -0
- package/src/__tests__/Details.tsx +116 -0
- package/src/__tests__/Dialog.tsx +157 -0
- package/src/__tests__/Dropdown.tsx +57 -0
- package/src/__tests__/DropdownMenu.tsx +138 -0
- package/src/__tests__/FilterList.tsx +27 -0
- package/src/__tests__/FilterListItem.tsx +32 -0
- package/src/__tests__/FilteredSearch.tsx +27 -0
- package/src/__tests__/Flash.tsx +46 -0
- package/src/__tests__/Flex.tsx +59 -0
- package/src/__tests__/FormGroup.tsx +39 -0
- package/src/__tests__/Grid.tsx +83 -0
- package/src/__tests__/Header.tsx +50 -0
- package/src/__tests__/Heading.tsx +92 -0
- package/src/__tests__/Label.tsx +35 -0
- package/src/__tests__/LabelGroup.tsx +31 -0
- package/src/__tests__/Link.tsx +48 -0
- package/src/__tests__/Overlay.tsx +103 -0
- package/src/__tests__/Pagehead.tsx +24 -0
- package/src/__tests__/Pagination/Pagination.tsx +31 -0
- package/src/__tests__/Pagination/PaginationModel.tsx +133 -0
- package/src/__tests__/Pagination/__snapshots__/Pagination.tsx.snap +184 -0
- package/src/__tests__/PointerBox.tsx +35 -0
- package/src/__tests__/Popover.tsx +69 -0
- package/src/__tests__/Portal.tsx +103 -0
- package/src/__tests__/Position.tsx +118 -0
- package/src/__tests__/ProgressBar.tsx +41 -0
- package/src/__tests__/SelectMenu.tsx +142 -0
- package/src/__tests__/SelectPanel.tsx +65 -0
- package/src/__tests__/SideNav.tsx +63 -0
- package/src/__tests__/Spinner.tsx +44 -0
- package/src/__tests__/StateLabel.tsx +50 -0
- package/src/__tests__/StyledOcticon.tsx +28 -0
- package/src/__tests__/SubNav.tsx +51 -0
- package/src/__tests__/SubNavLink.tsx +32 -0
- package/src/__tests__/TabNav.tsx +33 -0
- package/src/__tests__/Text.tsx +79 -0
- package/src/__tests__/TextInput.tsx +50 -0
- package/src/__tests__/ThemeProvider.tsx +441 -0
- package/src/__tests__/Timeline.tsx +59 -0
- package/src/__tests__/Tooltip.tsx +53 -0
- package/src/__tests__/Truncate.tsx +45 -0
- package/src/__tests__/UnderlineNav.tsx +59 -0
- package/src/__tests__/UnderlineNavLink.tsx +32 -0
- package/src/__tests__/__snapshots__/ActionList.tsx.snap +27 -0
- package/src/__tests__/__snapshots__/ActionMenu.tsx.snap +80 -0
- package/src/__tests__/__snapshots__/AnchoredOverlay.tsx.snap +332 -0
- package/src/__tests__/__snapshots__/Avatar.tsx.snap +19 -0
- package/src/__tests__/__snapshots__/AvatarStack.tsx.snap +377 -0
- package/src/__tests__/__snapshots__/BorderBox.tsx.snap +14 -0
- package/src/__tests__/__snapshots__/Box.tsx.snap +201 -0
- package/src/__tests__/__snapshots__/BranchName.tsx.snap +17 -0
- package/src/__tests__/__snapshots__/Breadcrumbs.tsx.snap +29 -0
- package/src/__tests__/__snapshots__/BreadcrumbsItem.tsx.snap +79 -0
- package/src/__tests__/__snapshots__/Button.tsx.snap +832 -0
- package/src/__tests__/__snapshots__/Caret.tsx.snap +373 -0
- package/src/__tests__/__snapshots__/CircleBadge.tsx.snap +141 -0
- package/src/__tests__/__snapshots__/CircleOcticon.tsx.snap +64 -0
- package/src/__tests__/__snapshots__/CounterLabel.tsx.snap +22 -0
- package/src/__tests__/__snapshots__/Details.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Dialog.tsx.snap +200 -0
- package/src/__tests__/__snapshots__/Dropdown.tsx.snap +249 -0
- package/src/__tests__/__snapshots__/DropdownMenu.tsx.snap +106 -0
- package/src/__tests__/__snapshots__/FilterList.tsx.snap +13 -0
- package/src/__tests__/__snapshots__/FilterListItem.tsx.snap +80 -0
- package/src/__tests__/__snapshots__/FilteredSearch.tsx.snap +32 -0
- package/src/__tests__/__snapshots__/Flash.tsx.snap +32 -0
- package/src/__tests__/__snapshots__/Flex.tsx.snap +130 -0
- package/src/__tests__/__snapshots__/FormGroup.tsx.snap +25 -0
- package/src/__tests__/__snapshots__/Grid.tsx.snap +178 -0
- package/src/__tests__/__snapshots__/Header.tsx.snap +79 -0
- package/src/__tests__/__snapshots__/Heading.tsx.snap +13 -0
- package/src/__tests__/__snapshots__/Label.tsx.snap +74 -0
- package/src/__tests__/__snapshots__/LabelGroup.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Link.tsx.snap +213 -0
- package/src/__tests__/__snapshots__/Pagehead.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/PointerBox.tsx.snap +174 -0
- package/src/__tests__/__snapshots__/Popover.tsx.snap +4687 -0
- package/src/__tests__/__snapshots__/Position.tsx.snap +44 -0
- package/src/__tests__/__snapshots__/ProgressBar.tsx.snap +53 -0
- package/src/__tests__/__snapshots__/SelectMenu.tsx.snap +469 -0
- package/src/__tests__/__snapshots__/SelectPanel.tsx.snap +123 -0
- package/src/__tests__/__snapshots__/SideNav.tsx.snap +143 -0
- package/src/__tests__/__snapshots__/Spinner.tsx.snap +33 -0
- package/src/__tests__/__snapshots__/StateLabel.tsx.snap +409 -0
- package/src/__tests__/__snapshots__/StyledOcticon.tsx.snap +25 -0
- package/src/__tests__/__snapshots__/SubNav.tsx.snap +44 -0
- package/src/__tests__/__snapshots__/SubNavLink.tsx.snap +199 -0
- package/src/__tests__/__snapshots__/TabNav.tsx.snap +58 -0
- package/src/__tests__/__snapshots__/Text.tsx.snap +7 -0
- package/src/__tests__/__snapshots__/TextInput.tsx.snap +440 -0
- package/src/__tests__/__snapshots__/ThemeProvider.tsx.snap +15 -0
- package/src/__tests__/__snapshots__/Timeline.tsx.snap +159 -0
- package/src/__tests__/__snapshots__/Tooltip.tsx.snap +227 -0
- package/src/__tests__/__snapshots__/Truncate.tsx.snap +17 -0
- package/src/__tests__/__snapshots__/UnderlineNav.tsx.snap +59 -0
- package/src/__tests__/__snapshots__/UnderlineNavLink.tsx.snap +130 -0
- package/src/__tests__/behaviors/anchoredPosition.ts +295 -0
- package/src/__tests__/behaviors/focusTrap.tsx +236 -0
- package/src/__tests__/behaviors/focusZone.tsx +549 -0
- package/src/__tests__/behaviors/iterateFocusableElements.tsx +61 -0
- package/src/__tests__/filterObject.ts +54 -0
- package/src/__tests__/hooks/useAnchoredPosition.tsx +31 -0
- package/src/__tests__/hooks/useOnEscapePress.tsx +16 -0
- package/src/__tests__/hooks/useOnOutsideClick.tsx +48 -0
- package/src/__tests__/hooks/useOpenAndCloseFocus.tsx +48 -0
- package/src/__tests__/hooks/useProvidedStateOrCreate.tsx +39 -0
- package/src/__tests__/theme.ts +41 -0
- package/src/__tests__/themeGet.ts +15 -0
- package/src/__tests__/useSafeTimeout.tsx +36 -0
- package/src/behaviors/anchoredPosition.ts +442 -0
- package/src/behaviors/focusTrap.ts +184 -0
- package/src/behaviors/focusZone.ts +713 -0
- package/src/constants.ts +62 -0
- package/src/hooks/index.ts +11 -0
- package/src/hooks/useAnchoredPosition.ts +53 -0
- package/src/hooks/useCombinedRefs.ts +40 -0
- package/src/hooks/useDetails.tsx +54 -0
- package/src/hooks/useDialog.ts +121 -0
- package/src/hooks/useFocusTrap.ts +80 -0
- package/src/hooks/useFocusZone.ts +64 -0
- package/src/hooks/useOnEscapePress.ts +63 -0
- package/src/hooks/useOnOutsideClick.tsx +82 -0
- package/src/hooks/useOpenAndCloseFocus.ts +27 -0
- package/src/hooks/useOverlay.tsx +32 -0
- package/src/hooks/useProvidedRefOrCreate.ts +14 -0
- package/src/hooks/useProvidedStateOrCreate.ts +27 -0
- package/src/hooks/useRenderForcingRef.ts +22 -0
- package/src/hooks/useResizeObserver.ts +11 -0
- package/src/hooks/useSafeTimeout.ts +38 -0
- package/src/hooks/useScrollFlash.ts +21 -0
- package/src/index.ts +165 -0
- package/src/polyfills/eventListenerSignal.ts +66 -0
- package/src/stories/ActionList.stories.tsx +364 -0
- package/src/stories/ActionMenu.stories.tsx +322 -0
- package/src/stories/AnchoredOverlay.stories.tsx +117 -0
- package/src/stories/AvatarStack.stories.tsx +37 -0
- package/src/stories/Button.stories.tsx +88 -0
- package/src/stories/ConfirmationDialog.stories.tsx +105 -0
- package/src/stories/Dialog.stories.tsx +240 -0
- package/src/stories/DropdownMenu.stories.tsx +84 -0
- package/src/stories/Overlay.stories.tsx +186 -0
- package/src/stories/Portal.stories.tsx +109 -0
- package/src/stories/SelectPanel.stories.tsx +300 -0
- package/src/stories/ThemeProvider.stories.tsx +104 -0
- package/src/stories/useAnchoredPosition.stories.tsx +320 -0
- package/src/stories/useFocusTrap.stories.tsx +400 -0
- package/src/stories/useFocusZone.stories.tsx +663 -0
- package/src/sx.ts +9 -0
- package/src/theme-preval.js +136 -0
- package/src/theme.ts +3 -0
- package/src/utils/deprecate.tsx +73 -0
- package/src/utils/isNumeric.tsx +4 -0
- package/src/utils/iterateFocusableElements.ts +121 -0
- package/src/utils/ssr.tsx +1 -0
- package/src/utils/test-deprecations.tsx +19 -0
- package/src/utils/test-helpers.tsx +7 -0
- package/src/utils/test-matchers.tsx +109 -0
- package/src/utils/testing.tsx +243 -0
- package/src/utils/theme.js +64 -0
- package/src/utils/types.ts +90 -0
- package/src/utils/uniqueId.ts +6 -0
- package/src/utils/userAgent.ts +7 -0
- package/stats.html +3279 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.json +20 -0
- package/lib/Breadcrumb.d.ts +0 -23
- package/lib-esm/Breadcrumb.d.ts +0 -23
@@ -0,0 +1,117 @@
|
|
1
|
+
import React, {useEffect, useRef, useState} from 'react'
|
2
|
+
import {Meta} from '@storybook/react'
|
3
|
+
|
4
|
+
import {BaseStyles, Box, ThemeProvider} from '..'
|
5
|
+
import Heading from '../Heading'
|
6
|
+
import DropdownButton from '../Button'
|
7
|
+
import {AnchoredOverlay} from '../AnchoredOverlay'
|
8
|
+
import {registerPortalRoot} from '../Portal'
|
9
|
+
|
10
|
+
export default {
|
11
|
+
title: 'Generic behaviors/AnchoredOverlay',
|
12
|
+
decorators: [
|
13
|
+
Story => {
|
14
|
+
return (
|
15
|
+
<ThemeProvider>
|
16
|
+
<BaseStyles>
|
17
|
+
<Story />
|
18
|
+
</BaseStyles>
|
19
|
+
</ThemeProvider>
|
20
|
+
)
|
21
|
+
}
|
22
|
+
]
|
23
|
+
} as Meta
|
24
|
+
|
25
|
+
const HeaderAndLayout = ({children}: {children: JSX.Element}) => {
|
26
|
+
const scrollingElementRef = useRef<HTMLDivElement>(null)
|
27
|
+
useEffect(() => {
|
28
|
+
if (scrollingElementRef.current) {
|
29
|
+
registerPortalRoot(scrollingElementRef.current, 'scrollingPortal')
|
30
|
+
}
|
31
|
+
}, [scrollingElementRef])
|
32
|
+
return (
|
33
|
+
<Box position="absolute" top={0} right={0} bottom={0} left={0} padding={4} backgroundColor="lavenderblush">
|
34
|
+
<Heading>Header or some such</Heading>
|
35
|
+
<Box position="absolute" top={10} right={4} bottom={4} left={4} overflow="scroll" backgroundColor="powderblue">
|
36
|
+
{children}
|
37
|
+
<Box ref={scrollingElementRef} position="absolute" top={0} left={0} />
|
38
|
+
</Box>
|
39
|
+
</Box>
|
40
|
+
)
|
41
|
+
}
|
42
|
+
|
43
|
+
const ButtonWithAnchoredOverlay = ({portalContainerName}: {portalContainerName?: string}) => {
|
44
|
+
const [open, setOpen] = useState(false)
|
45
|
+
|
46
|
+
return (
|
47
|
+
<AnchoredOverlay
|
48
|
+
open={open}
|
49
|
+
onOpen={() => setOpen(true)}
|
50
|
+
onClose={() => setOpen(false)}
|
51
|
+
width="small"
|
52
|
+
height="auto"
|
53
|
+
renderAnchor={props => <DropdownButton {...props}>Kitten, please</DropdownButton>}
|
54
|
+
overlayProps={{portalContainerName}}
|
55
|
+
>
|
56
|
+
<Box width="100%" height="100%" backgroundColor="thistle" display="flex" flexDirection="column">
|
57
|
+
<img src={`//placekitten.com/200/300`} alt="kitten" />
|
58
|
+
</Box>
|
59
|
+
</AnchoredOverlay>
|
60
|
+
)
|
61
|
+
}
|
62
|
+
|
63
|
+
export const DefaultPortal = () => {
|
64
|
+
const rows = 40
|
65
|
+
const columns = 20
|
66
|
+
return (
|
67
|
+
<HeaderAndLayout>
|
68
|
+
<table>
|
69
|
+
<tbody>
|
70
|
+
{Array(rows)
|
71
|
+
.fill(null)
|
72
|
+
.map((_, i) => (
|
73
|
+
<tr key={i}>
|
74
|
+
{Array(columns)
|
75
|
+
.fill(null)
|
76
|
+
.map((_1, j) => (
|
77
|
+
<td key={`${i}${j}`}>
|
78
|
+
<Box m={2}>
|
79
|
+
<ButtonWithAnchoredOverlay />
|
80
|
+
</Box>
|
81
|
+
</td>
|
82
|
+
))}
|
83
|
+
</tr>
|
84
|
+
))}
|
85
|
+
</tbody>
|
86
|
+
</table>
|
87
|
+
</HeaderAndLayout>
|
88
|
+
)
|
89
|
+
}
|
90
|
+
|
91
|
+
export const PortalInsideScrollingElement = () => {
|
92
|
+
const rows = 40
|
93
|
+
const columns = 20
|
94
|
+
return (
|
95
|
+
<HeaderAndLayout>
|
96
|
+
<table>
|
97
|
+
<tbody>
|
98
|
+
{Array(rows)
|
99
|
+
.fill(null)
|
100
|
+
.map((_, i) => (
|
101
|
+
<tr key={i}>
|
102
|
+
{Array(columns)
|
103
|
+
.fill(null)
|
104
|
+
.map((_1, j) => (
|
105
|
+
<td key={`${i}${j}`}>
|
106
|
+
<Box m={2}>
|
107
|
+
<ButtonWithAnchoredOverlay portalContainerName="scrollingPortal" />
|
108
|
+
</Box>
|
109
|
+
</td>
|
110
|
+
))}
|
111
|
+
</tr>
|
112
|
+
))}
|
113
|
+
</tbody>
|
114
|
+
</table>
|
115
|
+
</HeaderAndLayout>
|
116
|
+
)
|
117
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import AvatarStack from '../AvatarStack'
|
2
|
+
import {Meta} from '@storybook/react'
|
3
|
+
import React from 'react'
|
4
|
+
import {ThemeProvider} from '..'
|
5
|
+
import BaseStyles from '../BaseStyles'
|
6
|
+
|
7
|
+
const meta: Meta = {
|
8
|
+
title: 'Composite components/AvatarStack',
|
9
|
+
component: AvatarStack,
|
10
|
+
decorators: [
|
11
|
+
(Story: React.ComponentType): JSX.Element => (
|
12
|
+
<ThemeProvider>
|
13
|
+
<BaseStyles>
|
14
|
+
<Story />
|
15
|
+
</BaseStyles>
|
16
|
+
</ThemeProvider>
|
17
|
+
)
|
18
|
+
],
|
19
|
+
parameters: {
|
20
|
+
controls: {
|
21
|
+
disabled: true
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
export default meta
|
26
|
+
|
27
|
+
export function AvatarStackStory(): JSX.Element {
|
28
|
+
return (
|
29
|
+
<AvatarStack>
|
30
|
+
<img src="https://avatars.githubusercontent.com/primer" alt="" />
|
31
|
+
<img src="https://avatars.githubusercontent.com/github" alt="" />
|
32
|
+
<img src="https://avatars.githubusercontent.com/primer" alt="" />
|
33
|
+
<img src="https://avatars.githubusercontent.com/github" alt="" />
|
34
|
+
</AvatarStack>
|
35
|
+
)
|
36
|
+
}
|
37
|
+
AvatarStackStory.storyName = 'AvatarStack'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import {Meta} from '@storybook/react'
|
3
|
+
|
4
|
+
import {
|
5
|
+
BaseStyles,
|
6
|
+
Button,
|
7
|
+
ButtonClose,
|
8
|
+
ButtonDanger,
|
9
|
+
ButtonGroup,
|
10
|
+
ButtonInvisible,
|
11
|
+
ButtonOutline,
|
12
|
+
ButtonPrimary,
|
13
|
+
ButtonTableList,
|
14
|
+
ThemeProvider
|
15
|
+
} from '..'
|
16
|
+
import {ButtonStyleProps} from 'styled-system'
|
17
|
+
import {ButtonBaseProps} from '../Button/ButtonBase'
|
18
|
+
type StrictButtonStyleProps = ButtonStyleProps & {variant: ButtonBaseProps['variant']}
|
19
|
+
|
20
|
+
export default {
|
21
|
+
title: 'Composite components/Button',
|
22
|
+
|
23
|
+
decorators: [
|
24
|
+
Story => {
|
25
|
+
return (
|
26
|
+
<ThemeProvider>
|
27
|
+
<BaseStyles>
|
28
|
+
<Story />
|
29
|
+
</BaseStyles>
|
30
|
+
</ThemeProvider>
|
31
|
+
)
|
32
|
+
}
|
33
|
+
],
|
34
|
+
argTypes: {
|
35
|
+
as: {
|
36
|
+
table: {
|
37
|
+
disable: true
|
38
|
+
}
|
39
|
+
},
|
40
|
+
theme: {
|
41
|
+
table: {
|
42
|
+
disable: true
|
43
|
+
}
|
44
|
+
},
|
45
|
+
sx: {
|
46
|
+
table: {
|
47
|
+
disable: true
|
48
|
+
}
|
49
|
+
},
|
50
|
+
variant: {
|
51
|
+
control: {
|
52
|
+
type: 'radio',
|
53
|
+
options: ['small', 'medium', 'large']
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
} as Meta
|
58
|
+
|
59
|
+
export const defaultButton = (args: StrictButtonStyleProps) => <Button {...args}>Default Button</Button>
|
60
|
+
export const dangerButton = (args: StrictButtonStyleProps) => <ButtonDanger {...args}>Danger Button</ButtonDanger>
|
61
|
+
export const outlineButton = (args: StrictButtonStyleProps) => <ButtonOutline {...args}>Outline Button</ButtonOutline>
|
62
|
+
export const primaryButton = (args: StrictButtonStyleProps) => <ButtonPrimary {...args}>Primary Button</ButtonPrimary>
|
63
|
+
export const invisibleButton = (args: StrictButtonStyleProps) => (
|
64
|
+
<ButtonInvisible {...args}>Invisible Button</ButtonInvisible>
|
65
|
+
)
|
66
|
+
|
67
|
+
export const closeButton = (args: ButtonStyleProps) => (
|
68
|
+
<ButtonClose {...args} onClick={() => alert('button clicked.')} />
|
69
|
+
)
|
70
|
+
export const buttonGroup = (args: StrictButtonStyleProps) => (
|
71
|
+
<ButtonGroup display="block" my={2}>
|
72
|
+
<Button {...args}>Button 1</Button>
|
73
|
+
<Button {...args}>Button 2</Button>
|
74
|
+
<Button {...args}>Button 3</Button>
|
75
|
+
</ButtonGroup>
|
76
|
+
)
|
77
|
+
export const buttonTableList = (args: ButtonStyleProps) => (
|
78
|
+
<ButtonTableList {...args}>Button Table List</ButtonTableList>
|
79
|
+
)
|
80
|
+
|
81
|
+
defaultButton.args = {variant: 'medium'}
|
82
|
+
dangerButton.args = {variant: 'medium'}
|
83
|
+
outlineButton.args = {variant: 'medium'}
|
84
|
+
primaryButton.args = {variant: 'medium'}
|
85
|
+
invisibleButton.args = {variant: 'medium'}
|
86
|
+
closeButton.args = {variant: 'medium'}
|
87
|
+
buttonGroup.args = {variant: 'medium'}
|
88
|
+
buttonTableList.args = {variant: 'medium'}
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import React, {useState, useRef, useCallback} from 'react'
|
2
|
+
import {Meta} from '@storybook/react'
|
3
|
+
|
4
|
+
import {BaseStyles, Button, Box, ThemeProvider, useTheme} from '..'
|
5
|
+
import {ConfirmationDialog, useConfirm} from '../Dialog/ConfirmationDialog'
|
6
|
+
import {ActionMenu} from '../ActionMenu'
|
7
|
+
|
8
|
+
export default {
|
9
|
+
title: 'Internal components/ConfirmationDialog',
|
10
|
+
component: ConfirmationDialog,
|
11
|
+
decorators: [
|
12
|
+
Story => {
|
13
|
+
// Since portal roots are registered globally, we need this line so that each storybook
|
14
|
+
// story works in isolation.
|
15
|
+
return (
|
16
|
+
<ThemeProvider>
|
17
|
+
<BaseStyles>
|
18
|
+
<Story />
|
19
|
+
</BaseStyles>
|
20
|
+
</ThemeProvider>
|
21
|
+
)
|
22
|
+
}
|
23
|
+
]
|
24
|
+
} as Meta
|
25
|
+
|
26
|
+
export const BasicConfirmationDialog = () => {
|
27
|
+
const [isOpen, setIsOpen] = useState(false)
|
28
|
+
const buttonRef = useRef<HTMLButtonElement>(null)
|
29
|
+
const onDialogClose = useCallback(() => setIsOpen(false), [])
|
30
|
+
return (
|
31
|
+
<>
|
32
|
+
<Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>
|
33
|
+
Show dialog
|
34
|
+
</Button>
|
35
|
+
{isOpen && (
|
36
|
+
<ConfirmationDialog
|
37
|
+
title="Delete universe?"
|
38
|
+
onClose={onDialogClose}
|
39
|
+
confirmButtonContent="Delete it!"
|
40
|
+
confirmButtonType="danger"
|
41
|
+
>
|
42
|
+
Deleting the universe could have disastrous effects, including but not limited to destroying all life on
|
43
|
+
Earth.
|
44
|
+
</ConfirmationDialog>
|
45
|
+
)}
|
46
|
+
</>
|
47
|
+
)
|
48
|
+
}
|
49
|
+
|
50
|
+
export const ShorthandHook = () => {
|
51
|
+
const confirm = useConfirm()
|
52
|
+
const {theme} = useTheme()
|
53
|
+
const onButtonClick = useCallback(
|
54
|
+
async (event: React.MouseEvent) => {
|
55
|
+
if (
|
56
|
+
(await confirm({title: 'Are you sure?', content: 'Do you really want to turn this button green?'})) &&
|
57
|
+
event.target instanceof HTMLElement
|
58
|
+
) {
|
59
|
+
event.target.style.backgroundColor = theme?.colors.auto.green[3] ?? 'green'
|
60
|
+
event.target.textContent = "I'm green!"
|
61
|
+
}
|
62
|
+
},
|
63
|
+
[confirm, theme]
|
64
|
+
)
|
65
|
+
return (
|
66
|
+
<Box display="flex" flexDirection="column" alignItems="flex-start">
|
67
|
+
<Button mb={2} onClick={onButtonClick}>
|
68
|
+
Turn me green!
|
69
|
+
</Button>
|
70
|
+
<Button mb={2} onClick={onButtonClick}>
|
71
|
+
Turn me green!
|
72
|
+
</Button>
|
73
|
+
<Button mb={2} onClick={onButtonClick}>
|
74
|
+
Turn me green!
|
75
|
+
</Button>
|
76
|
+
<Button mb={2} onClick={onButtonClick}>
|
77
|
+
Turn me green!
|
78
|
+
</Button>
|
79
|
+
</Box>
|
80
|
+
)
|
81
|
+
}
|
82
|
+
|
83
|
+
export const ShorthandHookFromActionMenu = () => {
|
84
|
+
const confirm = useConfirm()
|
85
|
+
const [text, setText] = useState('open me')
|
86
|
+
const onButtonClick = useCallback(async () => {
|
87
|
+
if (await confirm({title: 'Are you sure?', content: 'Do you really want to do a trick?'})) {
|
88
|
+
setText('tada!')
|
89
|
+
}
|
90
|
+
}, [confirm])
|
91
|
+
|
92
|
+
return (
|
93
|
+
<Box display="flex" flexDirection="column" alignItems="flex-start">
|
94
|
+
<ActionMenu
|
95
|
+
renderAnchor={props => <Button {...props}>{text}</Button>}
|
96
|
+
items={[
|
97
|
+
{
|
98
|
+
text: 'Do a trick!',
|
99
|
+
onAction: onButtonClick
|
100
|
+
}
|
101
|
+
]}
|
102
|
+
/>
|
103
|
+
</Box>
|
104
|
+
)
|
105
|
+
}
|
@@ -0,0 +1,240 @@
|
|
1
|
+
import React, {useState, useRef, useCallback} from 'react'
|
2
|
+
import {Meta} from '@storybook/react'
|
3
|
+
|
4
|
+
import {BaseStyles, Button, ThemeProvider, Box} from '..'
|
5
|
+
import {Dialog, DialogProps, DialogWidth, DialogHeight} from '../Dialog/Dialog'
|
6
|
+
|
7
|
+
export default {
|
8
|
+
title: 'Internal components/Dialog',
|
9
|
+
component: Dialog,
|
10
|
+
decorators: [
|
11
|
+
Story => {
|
12
|
+
// Since portal roots are registered globally, we need this line so that each storybook
|
13
|
+
// story works in isolation.
|
14
|
+
return (
|
15
|
+
<ThemeProvider>
|
16
|
+
<BaseStyles>
|
17
|
+
<Story />
|
18
|
+
</BaseStyles>
|
19
|
+
</ThemeProvider>
|
20
|
+
)
|
21
|
+
}
|
22
|
+
],
|
23
|
+
argTypes: {
|
24
|
+
width: {
|
25
|
+
defaultValue: 'xlarge',
|
26
|
+
control: {
|
27
|
+
type: 'radio',
|
28
|
+
options: ['small', 'medium', 'large', 'xlarge']
|
29
|
+
}
|
30
|
+
},
|
31
|
+
height: {
|
32
|
+
defaultValue: 'auto',
|
33
|
+
control: {
|
34
|
+
type: 'radio',
|
35
|
+
options: ['small', 'large', 'auto']
|
36
|
+
}
|
37
|
+
},
|
38
|
+
subtitle: {
|
39
|
+
name: 'show subtitle',
|
40
|
+
defaultValue: true,
|
41
|
+
control: {
|
42
|
+
type: 'boolean'
|
43
|
+
}
|
44
|
+
},
|
45
|
+
title: {table: {disable: true}},
|
46
|
+
|
47
|
+
renderHeader: {table: {disable: true}},
|
48
|
+
renderBody: {table: {disable: true}},
|
49
|
+
renderFooter: {table: {disable: true}},
|
50
|
+
onClose: {table: {disable: true}},
|
51
|
+
role: {table: {disable: true}},
|
52
|
+
ref: {table: {disable: true}},
|
53
|
+
key: {table: {disable: true}},
|
54
|
+
footerButtons: {table: {disable: true}}
|
55
|
+
}
|
56
|
+
} as Meta
|
57
|
+
|
58
|
+
const lipsum = (
|
59
|
+
<div style={{fontSize: '14px'}}>
|
60
|
+
<p style={{marginBlockStart: 0}}>
|
61
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sollicitudin mauris maximus elit sagittis, nec
|
62
|
+
lobortis ligula elementum. Nam iaculis, urna nec lobortis posuere, eros urna venenatis eros, vel accumsan turpis
|
63
|
+
nunc vitae enim. Maecenas et lorem lectus. Vivamus iaculis tortor eget ante placerat, nec posuere nisl tincidunt.
|
64
|
+
Cras condimentum ante in accumsan ultricies. Morbi quis porta est, sit amet congue augue. Lorem ipsum dolor sit
|
65
|
+
amet, consectetur adipiscing elit. Ut consequat nunc id quam tempus, id tincidunt neque venenatis. Mauris
|
66
|
+
fringilla tempor est, vitae fermentum enim elementum vitae. Nullam eleifend odio ut porta efficitur. Phasellus
|
67
|
+
luctus tempus posuere.
|
68
|
+
</p>
|
69
|
+
|
70
|
+
<p>
|
71
|
+
Curabitur scelerisque bibendum faucibus. Duis rhoncus nunc est, at pharetra eros tristique a. Nam sodales turpis
|
72
|
+
lectus, quis faucibus felis fermentum in. Curabitur vel velit vel eros laoreet pharetra. Aenean in facilisis
|
73
|
+
sapien, eu porttitor ex. Donec ultrices ac arcu ut lobortis. Pellentesque vitae rutrum orci. Etiam pretium et enim
|
74
|
+
sit amet scelerisque. Nulla sed odio nec lorem dapibus condimentum at sagittis quam. Sed in ornare ex, sed luctus
|
75
|
+
sem. Mauris a est tellus.
|
76
|
+
</p>
|
77
|
+
|
78
|
+
<p>
|
79
|
+
Sed fringilla est ac urna aliquet, eget condimentum felis vulputate. Sed sagittis eros non mauris sodales
|
80
|
+
molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam ante leo,
|
81
|
+
condimentum sed lectus non, rutrum octopodes urna. Mauris neque ante, interdum molestie tellus pharetra, eleifend
|
82
|
+
dapibus justo. Sed at diam ligula. Donec dapibus ipsum quis elit euismod, sed suscipit eros euismod. Aliquam
|
83
|
+
pretium felis quis risus luctus fringilla. Ut purus lacus, mattis a turpis eget, sollicitudin pellentesque neque.
|
84
|
+
</p>
|
85
|
+
|
86
|
+
<p>
|
87
|
+
Nunc sodales quis ante quis porttitor. Vestibulum ornare lacinia ante. Donec a nisi nec arcu aliquam pretium in
|
88
|
+
nec nunc. Donec fringilla erat vitae viverra feugiat. Sed non odio vel ipsum porttitor maximus. Donec id eleifend
|
89
|
+
lectus. Proin varius felis sit amet neque eleifend, vitae porttitor ligula commodo.
|
90
|
+
</p>
|
91
|
+
|
92
|
+
<p>
|
93
|
+
Vivamus felis quam, porttitor a justo sit amet, placerat ultricies nisl. Suspendisse potenti. Maecenas non
|
94
|
+
consequat lorem, eu porta ante. Pellentesque elementum diam sapien, nec ultrices risus convallis eget. Nam
|
95
|
+
pharetra dolor at dictum tempor. Quisque ut est a ligula hendrerit sodales. Curabitur ornare a nulla in laoreet.
|
96
|
+
Maecenas semper mi egestas, dignissim nisi et, elementum neque.
|
97
|
+
</p>
|
98
|
+
</div>
|
99
|
+
)
|
100
|
+
interface DialogStoryProps {
|
101
|
+
width: DialogWidth
|
102
|
+
height: DialogHeight
|
103
|
+
subtitle: boolean
|
104
|
+
}
|
105
|
+
export const BasicDialog = ({width, height, subtitle}: DialogStoryProps) => {
|
106
|
+
const [isOpen, setIsOpen] = useState(false)
|
107
|
+
const [secondOpen, setSecondOpen] = useState(false)
|
108
|
+
const buttonRef = useRef<HTMLButtonElement>(null)
|
109
|
+
const onDialogClose = useCallback(() => setIsOpen(false), [])
|
110
|
+
const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])
|
111
|
+
const openSecondDialog = useCallback(() => setSecondOpen(true), [])
|
112
|
+
return (
|
113
|
+
<>
|
114
|
+
<Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>
|
115
|
+
Show dialog
|
116
|
+
</Button>
|
117
|
+
{isOpen && (
|
118
|
+
<Dialog
|
119
|
+
title="My Dialog"
|
120
|
+
subtitle={subtitle ? 'This is a subtitle!' : undefined}
|
121
|
+
onClose={onDialogClose}
|
122
|
+
width={width}
|
123
|
+
height={height}
|
124
|
+
footerButtons={[
|
125
|
+
{buttonType: 'danger', content: 'Delete the universe', onClick: onDialogClose},
|
126
|
+
{buttonType: 'primary', content: 'Proceed', onClick: openSecondDialog, autoFocus: true}
|
127
|
+
]}
|
128
|
+
>
|
129
|
+
{lipsum}
|
130
|
+
{secondOpen && (
|
131
|
+
<Dialog title="Inner dialog!" onClose={onSecondDialogClose} width="small">
|
132
|
+
Hello world
|
133
|
+
</Dialog>
|
134
|
+
)}
|
135
|
+
</Dialog>
|
136
|
+
)}
|
137
|
+
</>
|
138
|
+
)
|
139
|
+
}
|
140
|
+
|
141
|
+
function CustomHeader({
|
142
|
+
title,
|
143
|
+
subtitle,
|
144
|
+
dialogLabelId,
|
145
|
+
dialogDescriptionId,
|
146
|
+
onClose
|
147
|
+
}: React.PropsWithChildren<DialogProps & {dialogLabelId: string; dialogDescriptionId: string}>) {
|
148
|
+
const onCloseClick = useCallback(() => {
|
149
|
+
onClose('close-button')
|
150
|
+
}, [onClose])
|
151
|
+
if (typeof title === 'string' && typeof subtitle === 'string') {
|
152
|
+
return (
|
153
|
+
<Box bg="auto.blue.3">
|
154
|
+
<h1 id={dialogLabelId}>{title.toUpperCase()}</h1>
|
155
|
+
<h2 id={dialogDescriptionId}>{subtitle.toLowerCase()}</h2>
|
156
|
+
<Dialog.CloseButton onClose={onCloseClick} />
|
157
|
+
</Box>
|
158
|
+
)
|
159
|
+
}
|
160
|
+
return null
|
161
|
+
}
|
162
|
+
function CustomBody({children}: React.PropsWithChildren<DialogProps>) {
|
163
|
+
return <Dialog.Body bg="auto.red.3">{children}</Dialog.Body>
|
164
|
+
}
|
165
|
+
function CustomFooter({footerButtons}: React.PropsWithChildren<DialogProps>) {
|
166
|
+
return (
|
167
|
+
<Dialog.Footer bg="auto.yellow.3">
|
168
|
+
{footerButtons ? <Dialog.Buttons buttons={footerButtons} /> : null}
|
169
|
+
</Dialog.Footer>
|
170
|
+
)
|
171
|
+
}
|
172
|
+
export const WithCustomRenderers = ({width, height, subtitle}: DialogStoryProps) => {
|
173
|
+
const [isOpen, setIsOpen] = useState(false)
|
174
|
+
const onDialogClose = useCallback(() => setIsOpen(false), [])
|
175
|
+
return (
|
176
|
+
<>
|
177
|
+
<Button onClick={() => setIsOpen(!isOpen)}>Show dialog</Button>
|
178
|
+
{isOpen && (
|
179
|
+
<Dialog
|
180
|
+
title="My Dialog"
|
181
|
+
subtitle={subtitle ? 'This is a subtitle!' : undefined}
|
182
|
+
width={width}
|
183
|
+
height={height}
|
184
|
+
renderHeader={CustomHeader}
|
185
|
+
renderBody={CustomBody}
|
186
|
+
renderFooter={CustomFooter}
|
187
|
+
onClose={onDialogClose}
|
188
|
+
footerButtons={[
|
189
|
+
{buttonType: 'danger', content: 'Delete the universe', onClick: onDialogClose},
|
190
|
+
{buttonType: 'primary', content: 'Proceed'}
|
191
|
+
]}
|
192
|
+
>
|
193
|
+
{lipsum}
|
194
|
+
</Dialog>
|
195
|
+
)}
|
196
|
+
</>
|
197
|
+
)
|
198
|
+
}
|
199
|
+
|
200
|
+
export const StressTest = ({width, height, subtitle}: DialogStoryProps) => {
|
201
|
+
const [isOpen, setIsOpen] = useState(false)
|
202
|
+
const [secondOpen, setSecondOpen] = useState(false)
|
203
|
+
const buttonRef = useRef<HTMLButtonElement>(null)
|
204
|
+
const onDialogClose = useCallback(() => setIsOpen(false), [])
|
205
|
+
const onSecondDialogClose = useCallback(() => setSecondOpen(false), [])
|
206
|
+
const openSecondDialog = useCallback(() => setSecondOpen(true), [])
|
207
|
+
const manyButtons = new Array(10).fill(undefined).map((_, i) => ({content: `Button ${i}`}))
|
208
|
+
return (
|
209
|
+
<>
|
210
|
+
<Button ref={buttonRef} onClick={() => setIsOpen(!isOpen)}>
|
211
|
+
Show dialog
|
212
|
+
</Button>
|
213
|
+
{isOpen && (
|
214
|
+
<Dialog
|
215
|
+
title="This dialog has a really long title. So long, in fact, that it should cause wrapping, going to multiple lines!."
|
216
|
+
subtitle={
|
217
|
+
subtitle
|
218
|
+
? "It's not a common scenario, sure, but what if the subtitle is generated from a really long value? Do we just break the dialog? Or do we handle it because we are pros?"
|
219
|
+
: undefined
|
220
|
+
}
|
221
|
+
onClose={onDialogClose}
|
222
|
+
width={width}
|
223
|
+
height={height}
|
224
|
+
footerButtons={[
|
225
|
+
...manyButtons,
|
226
|
+
{buttonType: 'danger', content: 'Delete the universe', onClick: onDialogClose},
|
227
|
+
{buttonType: 'primary', content: 'Proceed', onClick: openSecondDialog, autoFocus: true}
|
228
|
+
]}
|
229
|
+
>
|
230
|
+
{lipsum}
|
231
|
+
{secondOpen && (
|
232
|
+
<Dialog title="Inner dialog!" onClose={onSecondDialogClose} width="small">
|
233
|
+
Hello world
|
234
|
+
</Dialog>
|
235
|
+
)}
|
236
|
+
</Dialog>
|
237
|
+
)}
|
238
|
+
</>
|
239
|
+
)
|
240
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import {Meta} from '@storybook/react'
|
2
|
+
import React from 'react'
|
3
|
+
import {theme, ThemeProvider} from '..'
|
4
|
+
import {ItemInput} from '../ActionList/List'
|
5
|
+
import BaseStyles from '../BaseStyles'
|
6
|
+
import Box from '../Box'
|
7
|
+
import {DropdownMenu, DropdownButton} from '../DropdownMenu'
|
8
|
+
import TextInput from '../TextInput'
|
9
|
+
|
10
|
+
const meta: Meta = {
|
11
|
+
title: 'Composite components/DropdownMenu',
|
12
|
+
component: DropdownMenu,
|
13
|
+
decorators: [
|
14
|
+
(Story: React.ComponentType): JSX.Element => {
|
15
|
+
return (
|
16
|
+
<ThemeProvider theme={theme}>
|
17
|
+
<BaseStyles>
|
18
|
+
<Story />
|
19
|
+
</BaseStyles>
|
20
|
+
</ThemeProvider>
|
21
|
+
)
|
22
|
+
}
|
23
|
+
],
|
24
|
+
parameters: {
|
25
|
+
controls: {
|
26
|
+
disable: true
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
export default meta
|
31
|
+
|
32
|
+
export function FavoriteColorStory(): JSX.Element {
|
33
|
+
const items = React.useMemo(() => [{text: '🔵 Cyan'}, {text: '🔴 Magenta'}, {text: '🟡 Yellow'}], [])
|
34
|
+
const [selectedItem, setSelectedItem] = React.useState<ItemInput | undefined>()
|
35
|
+
|
36
|
+
return (
|
37
|
+
<>
|
38
|
+
<h1>Favorite Color</h1>
|
39
|
+
<TextInput placeholder="Input for focus testing" sx={{mb: 2}} />
|
40
|
+
<div id="favorite-color-label">Please select your favorite color:</div>
|
41
|
+
<DropdownMenu
|
42
|
+
renderAnchor={({children, 'aria-labelledby': ariaLabelledBy, ...anchorProps}) => (
|
43
|
+
<DropdownButton aria-labelledby={`favorite-color-label ${ariaLabelledBy}`} {...anchorProps}>
|
44
|
+
{children}
|
45
|
+
</DropdownButton>
|
46
|
+
)}
|
47
|
+
placeholder="🎨"
|
48
|
+
items={items}
|
49
|
+
selectedItem={selectedItem}
|
50
|
+
onChange={setSelectedItem}
|
51
|
+
/>
|
52
|
+
</>
|
53
|
+
)
|
54
|
+
}
|
55
|
+
FavoriteColorStory.storyName = 'Favorite Color'
|
56
|
+
|
57
|
+
export function ExternalAnchorStory(): JSX.Element {
|
58
|
+
const items = React.useMemo(() => [{text: '🔵 Cyan'}, {text: '🔴 Magenta'}, {text: '🟡 Yellow'}], [])
|
59
|
+
const [selectedItem, setSelectedItem] = React.useState<ItemInput | undefined>()
|
60
|
+
const anchorRef = React.useRef<HTMLDivElement>(null)
|
61
|
+
const [open, setOpen] = React.useState(false)
|
62
|
+
|
63
|
+
return (
|
64
|
+
<Box display="flex" flexDirection="column" alignItems="flex-start">
|
65
|
+
<Box display="flex" flexDirection="row">
|
66
|
+
<DropdownButton onClick={() => setOpen(true)}>Click me to open the dropdown</DropdownButton>
|
67
|
+
<Box ref={anchorRef} bg="papayawhip" p={4} ml={40} borderRadius={2} display="inline-block">
|
68
|
+
Anchored on me!
|
69
|
+
</Box>
|
70
|
+
</Box>
|
71
|
+
<DropdownMenu
|
72
|
+
renderAnchor={null}
|
73
|
+
anchorRef={anchorRef}
|
74
|
+
open={open}
|
75
|
+
onOpenChange={setOpen}
|
76
|
+
placeholder="🎨"
|
77
|
+
items={items}
|
78
|
+
selectedItem={selectedItem}
|
79
|
+
onChange={setSelectedItem}
|
80
|
+
/>
|
81
|
+
</Box>
|
82
|
+
)
|
83
|
+
}
|
84
|
+
ExternalAnchorStory.storyName = 'DropdownMenu with External Anchor'
|