@react-spectrum/accordion 3.0.0-nightly.5042 → 3.0.1

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/src/Accordion.tsx CHANGED
@@ -10,91 +10,128 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
+ import {AriaLabelingProps, DOMProps, DOMRef, forwardRefType, StyleProps} from '@react-types/shared';
14
+ import {Button, DisclosureGroup, DisclosureGroupProps, DisclosurePanelProps, DisclosureProps, Heading, Disclosure as RACDisclosure, DisclosurePanel as RACDisclosurePanel} from 'react-aria-components';
13
15
  import ChevronLeftMedium from '@spectrum-icons/ui/ChevronLeftMedium';
14
16
  import ChevronRightMedium from '@spectrum-icons/ui/ChevronRightMedium';
15
17
  import {classNames, useDOMRef, useStyleProps} from '@react-spectrum/utils';
16
- import {DOMRef, Node} from '@react-types/shared';
17
- import {filterDOMProps, mergeProps} from '@react-aria/utils';
18
- import {FocusRing} from '@react-aria/focus';
19
- import React, {forwardRef, useRef} from 'react';
20
- import {SpectrumAccordionProps} from '@react-types/accordion';
18
+ import React, {createContext, forwardRef} from 'react';
21
19
  import styles from '@adobe/spectrum-css-temp/components/accordion/vars.css';
22
- import {TreeState, useTreeState} from '@react-stately/tree';
23
- import {useAccordion, useAccordionItem} from '@react-aria/accordion';
24
- import {useHover} from '@react-aria/interactions';
25
20
  import {useLocale} from '@react-aria/i18n';
26
21
  import {useProviderProps} from '@react-spectrum/provider';
27
22
 
23
+ export interface SpectrumAccordionProps extends Omit<DisclosureGroupProps, 'className' | 'style' | 'children'>, StyleProps, DOMProps {
24
+ /** Whether the Accordion should be displayed with a quiet style. */
25
+ isQuiet?: boolean,
26
+ /** The disclosures within the accordion group. */
27
+ children: React.ReactNode
28
+ }
29
+
30
+ const InternalAccordionContext = createContext<{isQuiet: boolean} | null>(null);
28
31
 
29
- function Accordion<T extends object>(props: SpectrumAccordionProps<T>, ref: DOMRef<HTMLDivElement>) {
32
+ /** A group of disclosures that can be expanded and collapsed. */
33
+ export const Accordion = /*#__PURE__*/(forwardRef as forwardRefType)(function Accordion(props: SpectrumAccordionProps, ref: DOMRef<HTMLDivElement>) {
30
34
  props = useProviderProps(props);
31
- let state = useTreeState<T>(props);
32
35
  let {styleProps} = useStyleProps(props);
33
36
  let domRef = useDOMRef(ref);
34
- let {accordionProps} = useAccordion(props, state, domRef);
37
+ return (
38
+ <InternalAccordionContext.Provider value={{isQuiet: props.isQuiet || false}}>
39
+ <DisclosureGroup
40
+ {...props}
41
+ {...styleProps}
42
+ ref={domRef}
43
+ className={classNames(styles, 'spectrum-Accordion', styleProps.className)}>
44
+ {props.children}
45
+ </DisclosureGroup>
46
+ </InternalAccordionContext.Provider>
47
+ );
48
+ });
49
+
50
+ export interface SpectrumDisclosureProps extends Omit<DisclosureProps, 'className' | 'style' | 'children'>, AriaLabelingProps, StyleProps {
51
+ /** Whether the Disclosure should be displayed with a quiet style. */
52
+ isQuiet?: boolean,
53
+ /** The contents of the disclosure. The first child should be the header, and the second child should be the panel. */
54
+ children: React.ReactNode
55
+ }
35
56
 
57
+ /** A collapsible section of content composed of a heading that expands and collapses a panel. */
58
+ export const Disclosure = /*#__PURE__*/(forwardRef as forwardRefType)(function Disclosure(props: SpectrumDisclosureProps, ref: DOMRef<HTMLDivElement>) {
59
+ props = useProviderProps(props);
60
+ let {styleProps} = useStyleProps(props);
61
+ let domRef = useDOMRef(ref);
62
+ let accordionContext = React.useContext(InternalAccordionContext)!;
36
63
  return (
37
- <div
38
- {...filterDOMProps(props)}
39
- {...accordionProps}
64
+ <RACDisclosure
65
+ {...props}
40
66
  {...styleProps}
41
67
  ref={domRef}
42
- className={classNames(styles, 'spectrum-Accordion', styleProps.className)}>
43
- {[...state.collection].map(item => (
44
- <AccordionItem<T> key={item.key} item={item} state={state} />
45
- ))}
46
- </div>
68
+ className={({isExpanded, isDisabled}) => classNames(styles, 'spectrum-Accordion-item', {
69
+ 'spectrum-Accordion-item--quiet': accordionContext?.isQuiet ?? props.isQuiet,
70
+ 'is-expanded': isExpanded,
71
+ 'is-disabled': isDisabled,
72
+ 'in-accordion': accordionContext != null
73
+ }, styleProps.className)}>
74
+ {props.children}
75
+ </RACDisclosure>
47
76
  );
77
+ });
78
+
79
+ export interface SpectrumDisclosurePanelProps extends Omit<DisclosurePanelProps, 'className' | 'style' | 'children'>, DOMProps, AriaLabelingProps, StyleProps {
80
+ /** The contents of the accordion panel. */
81
+ children: React.ReactNode
48
82
  }
49
83
 
50
- interface AccordionItemProps<T> {
51
- item: Node<T>,
52
- state: TreeState<T>
84
+ /** The panel that contains the content of the disclosure. */
85
+ export const DisclosurePanel = /*#__PURE__*/(forwardRef as forwardRefType)(function DisclosurePanel(props: SpectrumDisclosurePanelProps, ref: DOMRef<HTMLDivElement>) {
86
+ let {styleProps} = useStyleProps(props);
87
+ let domRef = useDOMRef(ref);
88
+ return (
89
+ <RACDisclosurePanel
90
+ ref={domRef}
91
+ {...styleProps as Omit<React.HTMLAttributes<HTMLElement>, 'role'>}
92
+ className={classNames(styles, 'spectrum-Accordion-itemContent', styleProps.className)}
93
+ {...props}>
94
+ {props.children}
95
+ </RACDisclosurePanel>
96
+ );
97
+ });
98
+
99
+ export interface SpectrumDisclosureTitleProps extends DOMProps, AriaLabelingProps, StyleProps {
100
+ /**
101
+ * The heading level of the disclosure header.
102
+ * @default 3
103
+ */
104
+ level?: number,
105
+ /** The contents of the disclosure header. */
106
+ children: React.ReactNode
53
107
  }
54
108
 
55
- function AccordionItem<T>(props: AccordionItemProps<T>) {
56
- props = useProviderProps(props);
57
- let ref = useRef<HTMLButtonElement>(null);
58
- let {state, item} = props;
59
- let {buttonProps, regionProps} = useAccordionItem<T>(props, state, ref);
60
- let isOpen = state.expandedKeys.has(item.key);
61
- let isDisabled = state.disabledKeys.has(item.key);
62
- let {isHovered, hoverProps} = useHover({isDisabled});
109
+ /** The heading of the disclosure. */
110
+ export const DisclosureTitle = /*#__PURE__*/(forwardRef as forwardRefType)(function DisclosureTitle(props: SpectrumDisclosureTitleProps, ref: DOMRef<HTMLHeadingElement>) {
111
+ let {styleProps} = useStyleProps(props);
112
+ let {level = 3} = props;
63
113
  let {direction} = useLocale();
64
-
114
+ let domRef = useDOMRef(ref);
65
115
  return (
66
- <div
67
- className={classNames(styles, 'spectrum-Accordion-item', {
68
- 'is-open': isOpen,
69
- 'is-disabled': isDisabled
70
- })}>
71
- <h3 className={classNames(styles, 'spectrum-Accordion-itemHeading')}>
72
- <FocusRing within focusRingClass={classNames(styles, 'focus-ring')}>
73
- <button
74
- {...mergeProps(buttonProps, hoverProps)}
75
- ref={ref}
76
- className={classNames(styles, 'spectrum-Accordion-itemHeader', {
77
- 'is-hovered': isHovered
78
- })}>
79
- {direction === 'ltr' ? (
80
- <ChevronRightMedium
81
- aria-hidden="true"
82
- UNSAFE_className={classNames(styles, 'spectrum-Accordion-itemIndicator')} />
116
+ <Heading ref={domRef} level={level} {...styleProps} className={classNames(styles, 'spectrum-Accordion-itemHeading', styleProps.className)}>
117
+ <Button
118
+ slot="trigger"
119
+ className={({isHovered, isFocusVisible, isPressed}) => classNames(styles, 'spectrum-Accordion-itemHeader', {
120
+ 'is-hovered': isHovered,
121
+ 'is-pressed': isPressed,
122
+ 'focus-ring': isFocusVisible
123
+ })}>
124
+ {direction === 'ltr' ? (
125
+ <ChevronRightMedium
126
+ aria-hidden="true"
127
+ UNSAFE_className={classNames(styles, 'spectrum-Accordion-itemIndicator')} />
83
128
  ) : (
84
129
  <ChevronLeftMedium
85
130
  aria-hidden="true"
86
131
  UNSAFE_className={classNames(styles, 'spectrum-Accordion-itemIndicator')} />
87
132
  )}
88
- {item.props.title}
89
- </button>
90
- </FocusRing>
91
- </h3>
92
- <div {...regionProps} className={classNames(styles, 'spectrum-Accordion-itemContent')}>
93
- {item.props.children}
94
- </div>
95
- </div>
133
+ {props.children}
134
+ </Button>
135
+ </Heading>
96
136
  );
97
- }
98
-
99
- const _Accordion = forwardRef(Accordion) as <T>(props: SpectrumAccordionProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof Accordion>;
100
- export {_Accordion as Accordion};
137
+ });
package/src/index.ts CHANGED
@@ -10,6 +10,5 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
  /// <reference types="css-module-types" />
13
- export {Accordion} from './Accordion';
14
- export {Item} from '@react-stately/collections';
15
- export type {SpectrumAccordionProps} from '@react-types/accordion';
13
+ export {Disclosure, Accordion, DisclosureTitle, DisclosurePanel} from './Accordion';
14
+ export type {SpectrumAccordionProps, SpectrumDisclosureProps, SpectrumDisclosurePanelProps, SpectrumDisclosureTitleProps} from './Accordion';
@@ -1,144 +0,0 @@
1
- ._7gO6Sq_spectrum-Accordion {
2
- margin: 0;
3
- padding: 0;
4
- list-style: none;
5
- display: block;
6
- }
7
-
8
- ._7gO6Sq_spectrum-Accordion-itemIndicator {
9
- transition: transform ease var(--spectrum-global-animation-duration-100, .13s);
10
- padding-inline-start: var(--spectrum-accordion-icon-spacing, 16px);
11
- padding-inline-end: var(--spectrum-accordion-icon-gap, var(--spectrum-global-dimension-size-100));
12
- display: block;
13
- }
14
-
15
- ._7gO6Sq_spectrum-Accordion-item {
16
- z-index: inherit;
17
- border-bottom: var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)) solid transparent;
18
- margin: 0;
19
- display: list-item;
20
- position: relative;
21
- }
22
-
23
- ._7gO6Sq_spectrum-Accordion-item:first-of-type {
24
- border-top: var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)) solid transparent;
25
- }
26
-
27
- ._7gO6Sq_spectrum-Accordion-itemHeading {
28
- margin: 0;
29
- }
30
-
31
- ._7gO6Sq_spectrum-Accordion-itemHeader {
32
- box-sizing: border-box;
33
- padding-block: var(--spectrum-global-dimension-size-150);
34
- min-height: calc(var(--spectrum-accordion-item-height, 40px) - var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)));
35
- font-size: var(--spectrum-global-dimension-font-size-300);
36
- text-overflow: ellipsis;
37
- cursor: default;
38
- line-height: 1.3;
39
- font-weight: var(--spectrum-global-font-weight-bold, 700);
40
- -webkit-appearance: none;
41
- appearance: none;
42
- background-color: inherit;
43
- text-align: start;
44
- border: 0;
45
- justify-content: flex-start;
46
- align-items: center;
47
- width: 100%;
48
- margin: 0;
49
- padding-inline-start: 2px;
50
- padding-inline-end: var(--spectrum-accordion-item-padding, 16px);
51
- font-family: inherit;
52
- display: flex;
53
- position: relative;
54
- }
55
-
56
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus {
57
- outline: none;
58
- }
59
-
60
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus:after {
61
- content: "";
62
- top: calc(var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)) * -1);
63
- bottom: calc(var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)) * -1);
64
- width: var(--spectrum-accordion-item-border-size-key-focus, 2px);
65
- position: absolute;
66
- }
67
-
68
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus:not(:is(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi))):after {
69
- left: 0;
70
- }
71
-
72
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus:not(:is(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi))):after {
73
- left: 0;
74
- }
75
-
76
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus:-webkit-any(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi)):after {
77
- right: 0;
78
- }
79
-
80
- ._7gO6Sq_spectrum-Accordion-itemHeader:focus:is(:lang(ae), :lang(ar), :lang(arc), :lang(bcc), :lang(bqi), :lang(ckb), :lang(dv), :lang(fa), :lang(glk), :lang(he), :lang(ku), :lang(mzn), :lang(nqo), :lang(pnb), :lang(ps), :lang(sd), :lang(ug), :lang(ur), :lang(yi)):after {
81
- right: 0;
82
- }
83
-
84
- ._7gO6Sq_spectrum-Accordion-itemContent {
85
- padding: 0 var(--spectrum-accordion-item-content-padding, var(--spectrum-global-dimension-size-200)) var(--spectrum-accordion-item-content-padding, var(--spectrum-global-dimension-size-200)) var(--spectrum-accordion-item-content-padding, var(--spectrum-global-dimension-size-200));
86
- display: none;
87
- }
88
-
89
- [dir="ltr"] :is(._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-open > ._7gO6Sq_spectrum-Accordion-itemHeading > ._7gO6Sq_spectrum-Accordion-itemHeader > ._7gO6Sq_spectrum-Accordion-itemIndicator) {
90
- transform: rotate(90deg);
91
- }
92
-
93
- [dir="rtl"] :is(._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-open > ._7gO6Sq_spectrum-Accordion-itemHeading > ._7gO6Sq_spectrum-Accordion-itemHeader > ._7gO6Sq_spectrum-Accordion-itemIndicator) {
94
- transform: rotate(-90deg);
95
- }
96
-
97
- ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-open > ._7gO6Sq_spectrum-Accordion-itemHeader:after {
98
- height: calc(var(--spectrum-accordion-item-height, 40px) - var(--spectrum-accordion-item-border-size, var(--spectrum-alias-border-size-thin)));
99
- }
100
-
101
- ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-open > ._7gO6Sq_spectrum-Accordion-itemContent {
102
- display: block;
103
- }
104
-
105
- ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-disabled ._7gO6Sq_spectrum-Accordion-itemHeader {
106
- cursor: default;
107
- }
108
-
109
- ._7gO6Sq_spectrum-Accordion-item {
110
- border-color: var(--spectrum-accordion-border-color, var(--spectrum-global-color-gray-300));
111
- }
112
-
113
- ._7gO6Sq_spectrum-Accordion-item:first-of-type {
114
- border-top-color: var(--spectrum-accordion-border-color, var(--spectrum-global-color-gray-300));
115
- }
116
-
117
- ._7gO6Sq_spectrum-Accordion-itemHeader {
118
- color: var(--spectrum-alias-text-color, var(--spectrum-global-color-gray-800));
119
- }
120
-
121
- ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_is-hovered {
122
- color: var(--spectrum-alias-text-color-hover, var(--spectrum-global-color-gray-900));
123
- background-color: var(--spectrum-accordion-background-color-hover, var(--spectrum-global-color-gray-200));
124
- }
125
-
126
- ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_focus-ring:after {
127
- background-color: var(--spectrum-accordion-border-left-color-key-focus, var(--spectrum-alias-border-color-focus));
128
- }
129
-
130
- ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-open ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_is-hovered {
131
- background-color: #0000;
132
- }
133
-
134
- ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-disabled ._7gO6Sq_spectrum-Accordion-itemHeader, ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-disabled ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_is-hovered, ._7gO6Sq_spectrum-Accordion-item._7gO6Sq_is-disabled ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_focus-ring {
135
- color: var(--spectrum-alias-text-color-disabled, var(--spectrum-global-color-gray-500));
136
- background-color: #0000;
137
- }
138
-
139
- @media (forced-colors: active) {
140
- ._7gO6Sq_spectrum-Accordion-itemHeader._7gO6Sq_focus-ring {
141
- outline: 3px solid canvastext;
142
- }
143
- }
144
- /*# sourceMappingURL=vars.1361683a.css.map */
@@ -1 +0,0 @@
1
- {"mappings":"AAwBA;;;;;;;AAOA;;;;;;;AASA;;;;;;;;AASE;;;;AAKF;;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;AAiCE;;;;AAGE;;;;;;;;AAAA;;;;AAAA;;;;AAAA;;;;AAAA;;;;AAaJ;;;;;AAUU;;;;AAGA;;;;AAON;;;;AAKA;;;;AAMA;;;;AAkBJ;;;;AAGE;;;;AAKF;;;;AAGE;;;;;AAOE;;;;AASE;;;;AASF;;;;;AASJ;EAEI","sources":["packages/@adobe/spectrum-css-temp/components/accordion/vars.css"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n@import './index.css';\n@import './skin.css';\n"],"names":[],"version":3,"file":"vars.1361683a.css.map"}