@react-spectrum/accordion 3.0.0-nightly.5038 → 3.0.0

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,140 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
+ import {AriaLabelingProps, DOMProps, DOMRef, 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
+ function Accordion(props: SpectrumAccordionProps, ref: DOMRef<HTMLDivElement>) {
30
33
  props = useProviderProps(props);
31
- let state = useTreeState<T>(props);
32
34
  let {styleProps} = useStyleProps(props);
33
35
  let domRef = useDOMRef(ref);
34
- let {accordionProps} = useAccordion(props, state, domRef);
36
+ return (
37
+ <InternalAccordionContext.Provider value={{isQuiet: props.isQuiet || false}}>
38
+ <DisclosureGroup
39
+ {...props}
40
+ {...styleProps}
41
+ ref={domRef}
42
+ className={classNames(styles, 'spectrum-Accordion', styleProps.className)}>
43
+ {props.children}
44
+ </DisclosureGroup>
45
+ </InternalAccordionContext.Provider>
46
+ );
47
+ }
48
+
49
+ export interface SpectrumDisclosureProps extends Omit<DisclosureProps, 'className' | 'style' | 'children'>, AriaLabelingProps, StyleProps {
50
+ /** Whether the Disclosure should be displayed with a quiet style. */
51
+ isQuiet?: boolean,
52
+ /** The contents of the disclosure. The first child should be the header, and the second child should be the panel. */
53
+ children: React.ReactNode
54
+ }
35
55
 
56
+ function Disclosure(props: SpectrumDisclosureProps, ref: DOMRef<HTMLDivElement>) {
57
+ props = useProviderProps(props);
58
+ let {styleProps} = useStyleProps(props);
59
+ let domRef = useDOMRef(ref);
60
+ let accordionContext = React.useContext(InternalAccordionContext)!;
36
61
  return (
37
- <div
38
- {...filterDOMProps(props)}
39
- {...accordionProps}
62
+ <RACDisclosure
63
+ {...props}
40
64
  {...styleProps}
41
65
  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>
66
+ className={({isExpanded, isDisabled}) => classNames(styles, 'spectrum-Accordion-item', {
67
+ 'spectrum-Accordion-item--quiet': accordionContext?.isQuiet ?? props.isQuiet,
68
+ 'is-expanded': isExpanded,
69
+ 'is-disabled': isDisabled,
70
+ 'in-accordion': accordionContext != null
71
+ }, styleProps.className)}>
72
+ {props.children}
73
+ </RACDisclosure>
47
74
  );
48
75
  }
49
76
 
50
- interface AccordionItemProps<T> {
51
- item: Node<T>,
52
- state: TreeState<T>
77
+ export interface SpectrumDisclosurePanelProps extends Omit<DisclosurePanelProps, 'className' | 'style' | 'children'>, DOMProps, AriaLabelingProps, StyleProps {
78
+ /** The contents of the accordion panel. */
79
+ children: React.ReactNode
53
80
  }
54
81
 
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});
63
- let {direction} = useLocale();
82
+ function DisclosurePanel(props: SpectrumDisclosurePanelProps, ref: DOMRef<HTMLDivElement>) {
83
+ let {styleProps} = useStyleProps(props);
84
+ let domRef = useDOMRef(ref);
85
+ return (
86
+ <RACDisclosurePanel
87
+ ref={domRef}
88
+ {...styleProps as Omit<React.HTMLAttributes<HTMLElement>, 'role'>}
89
+ className={classNames(styles, 'spectrum-Accordion-itemContent', styleProps.className)}
90
+ {...props}>
91
+ {props.children}
92
+ </RACDisclosurePanel>
93
+ );
94
+ }
95
+
96
+ export interface SpectrumDisclosureTitleProps extends DOMProps, AriaLabelingProps, StyleProps {
97
+ /**
98
+ * The heading level of the disclosure header.
99
+ * @default 3
100
+ */
101
+ level?: number,
102
+ /** The contents of the disclosure header. */
103
+ children: React.ReactNode
104
+ }
64
105
 
106
+ function DisclosureTitle(props: SpectrumDisclosureTitleProps, ref: DOMRef<HTMLHeadingElement>) {
107
+ let {styleProps} = useStyleProps(props);
108
+ let {level = 3} = props;
109
+ let {direction} = useLocale();
110
+ let domRef = useDOMRef(ref);
65
111
  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')} />
112
+ <Heading ref={domRef} level={level} {...styleProps} className={classNames(styles, 'spectrum-Accordion-itemHeading', styleProps.className)}>
113
+ <Button
114
+ slot="trigger"
115
+ className={({isHovered, isFocusVisible, isPressed}) => classNames(styles, 'spectrum-Accordion-itemHeader', {
116
+ 'is-hovered': isHovered,
117
+ 'is-pressed': isPressed,
118
+ 'focus-ring': isFocusVisible
119
+ })}>
120
+ {direction === 'ltr' ? (
121
+ <ChevronRightMedium
122
+ aria-hidden="true"
123
+ UNSAFE_className={classNames(styles, 'spectrum-Accordion-itemIndicator')} />
83
124
  ) : (
84
125
  <ChevronLeftMedium
85
126
  aria-hidden="true"
86
127
  UNSAFE_className={classNames(styles, 'spectrum-Accordion-itemIndicator')} />
87
128
  )}
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>
129
+ {props.children}
130
+ </Button>
131
+ </Heading>
96
132
  );
97
133
  }
98
134
 
99
- const _Accordion = forwardRef(Accordion) as <T>(props: SpectrumAccordionProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof Accordion>;
135
+ /** A group of disclosures that can be expanded and collapsed. */
136
+ const _Accordion = forwardRef(Accordion) as (props: SpectrumAccordionProps & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof Accordion>;
100
137
  export {_Accordion as Accordion};
138
+
139
+ /** A collapsible section of content composed of a heading that expands and collapses a panel. */
140
+ const _Disclosure = forwardRef(Disclosure) as (props: SpectrumDisclosureProps & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof Disclosure>;
141
+ export {_Disclosure as Disclosure};
142
+
143
+ /** The panel that contains the content of the disclosure. */
144
+ const _DisclosurePanel = forwardRef(DisclosurePanel) as (props: SpectrumDisclosurePanelProps & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof DisclosurePanel>;
145
+ export {_DisclosurePanel as DisclosurePanel};
146
+
147
+ /** The heading of the disclosure. */
148
+ const _DisclosureTitle = forwardRef(DisclosureTitle) as (props: SpectrumDisclosureTitleProps & {ref?: DOMRef<HTMLDivElement>}) => ReturnType<typeof DisclosureTitle>;
149
+ export {_DisclosureTitle as DisclosureTitle};
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"}