Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
a333656
chore(lerna): publishing package
codebender828 Mar 22, 2020
c5eb00f
chore: improve Avatar, Alert, AlertDialog, Avatar exports
codebender828 Mar 23, 2020
7928e85
chore: improve Badge exports
codebender828 Mar 23, 2020
830f5e2
chore: improve Box exports
codebender828 Mar 23, 2020
0ca1a6f
chore: improve Breadcrumb exports
codebender828 Mar 23, 2020
db4ed83
refactor(button): preserve button width with icon and improve exports
codebender828 Mar 23, 2020
555e5c9
chore: improve ButtonGroup exports
codebender828 Mar 23, 2020
bd49b78
chore: improve Checkbox exports
codebender828 Mar 23, 2020
08a6a4e
chore: improve CheckboxGroup exports
codebender828 Mar 23, 2020
bb86382
chore: improve CircularProgress, ClickOutside, Code exports
codebender828 Mar 23, 2020
ebc0223
chore: improve Code exports
codebender828 Mar 23, 2020
3554533
chore: improve Collapse
codebender828 Mar 23, 2020
e3fe637
chore: improve ColorModeProvider, ControlBox exports
codebender828 Mar 23, 2020
aedd262
chore: improve Css exports
codebender828 Mar 23, 2020
b0f2daa
chore: improve CSSReset exports
codebender828 Mar 23, 2020
ef2a91a
chore: improve Divider, Drawer exports
codebender828 Mar 23, 2020
287fdfa
chore: improve Editable exports
codebender828 Mar 23, 2020
0621131
chore: improve Flex exports
codebender828 Mar 23, 2020
b528e10
chore: improve FormControl exports
codebender828 Mar 23, 2020
38e790a
chore: improve FormControl stories
codebender828 Mar 23, 2020
fbda275
chore: improve FormHelperText exports
codebender828 Mar 23, 2020
b594457
chore: improve FormLabel exports
codebender828 Mar 23, 2020
9e9a657
chore: improve Fragment exports
codebender828 Mar 23, 2020
5dbedf5
chore: improve Grid exports
codebender828 Mar 23, 2020
0bc2973
chore: improve Heading exports
codebender828 Mar 23, 2020
8a47745
chore: improve Icon exports
codebender828 Mar 23, 2020
b6523c9
chore: improve IconButton, Image exports
codebender828 Mar 23, 2020
a0d2dec
chore: improve Input exports
codebender828 Mar 23, 2020
7609901
chore: improve Input stories
codebender828 Mar 23, 2020
934e09b
chore: improve InputAddon exports
codebender828 Mar 23, 2020
c42869d
chore: improve InputElement exports
codebender828 Mar 23, 2020
a3965cb
chore: improve InputGroup exports
codebender828 Mar 23, 2020
79ff0a7
chore: improve Link exports
codebender828 Mar 23, 2020
9752711
chore: improve List exports
codebender828 Mar 23, 2020
5289734
fix: improve MenuGroup spacing variables
codebender828 Mar 23, 2020
461d5fa
fix: improve Modal exports
codebender828 Mar 23, 2020
884f315
chore: improve NoSsr exports
codebender828 Mar 23, 2020
292d509
chore: improve NumberInput exports
codebender828 Mar 23, 2020
ff04f6f
chore: improve Popover exports
codebender828 Mar 23, 2020
ad03f10
chore: improve Popper exports
codebender828 Mar 23, 2020
8ed4cd4
chore: improve Portal exports
codebender828 Mar 23, 2020
7257c74
chore: improve Progress exports
codebender828 Mar 23, 2020
86e14b3
chore: improve PseudoBox exports
codebender828 Mar 23, 2020
a428934
chore: improve Radio exports
codebender828 Mar 23, 2020
aa0728c
chore: improve RadioButtonGroup exports
codebender828 Mar 23, 2020
b280091
chore: improve RadioGroup exports
codebender828 Mar 23, 2020
0197524
chore: improve Select exports
codebender828 Mar 23, 2020
34b1156
feat(select): implement v-model
codebender828 Mar 23, 2020
5350929
chore: improve SimpleGrid exports
codebender828 Mar 23, 2020
5d44f09
fix: improve Slider exports and fix slider transition perf
codebender828 Mar 23, 2020
66264a9
chore: improve Spinner exports
codebender828 Mar 23, 2020
94bdfdf
chore: improve Stack exports
codebender828 Mar 23, 2020
086126e
chore: improve Stat exports
codebender828 Mar 23, 2020
d1fe835
chore: improve Switch exports
codebender828 Mar 23, 2020
2bc7344
chore: improve Tabs exports
codebender828 Mar 23, 2020
5f16bbd
fix: resolve Switch imports
codebender828 Mar 23, 2020
760e161
chore: improve Tag exports
codebender828 Mar 23, 2020
589ad37
chore: improve Text exports
codebender828 Mar 23, 2020
db1f368
chore: improve Textarea exports
codebender828 Mar 23, 2020
de1d9d6
chore: improve ThemeProvider exports
codebender828 Mar 23, 2020
c4adc03
chore: improve Toast exports
codebender828 Mar 23, 2020
f7b10d0
chore: improve Toolti[ exports
codebender828 Mar 23, 2020
1438734
chore: improve Transition exports
codebender828 Mar 23, 2020
82d4c12
chore: improve VisuallyHidden exports
codebender828 Mar 23, 2020
ff01762
test: update button snapshot
codebender828 Mar 23, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .storybook/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ import {
faBolt,
faUserSlash,
faCheckCircle,
faCog } from '@fortawesome/free-solid-svg-icons'
faCog,
faLock,
faEye,
faEyeSlash } from '@fortawesome/free-solid-svg-icons'

import {
faChevronCircleUp,
Expand Down Expand Up @@ -48,7 +51,10 @@ Vue.use(Kiwi, {
faTimesCircle,
faGithub,
faCheckCircle,
faCog
faCog,
faLock,
faEye,
faEyeSlash
}
}
})
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"test": "jest",
"clean": "lerna run clean",
"release": "lerna publish",
"patch": "lerna version patch",
"push": "git add -A && git commit -m \"chore(lerna): publishing package \" && lerna version --conventional-commits",
"storybook": "start-storybook -p 9000",
"build-storybook": "build-storybook --quiet",
Expand Down
313 changes: 313 additions & 0 deletions packages/chakra-ui-core/src/Accordion/Accordion.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
import { baseProps } from '../config'
import Box from '../Box'
import { forwardProps, cloneVNodes, useId, isDef } from '../utils'
import PseudoBox from '../PseudoBox'
import styleProps from '../config/props'
import Collapse from '../Collapse'
import Icon from '../Icon'
import { iconProps } from '../Icon/icon.props'

const Accordion = {
name: 'Accordion',
props: {
...baseProps,
allowMultiple: Boolean,
allowToggle: Boolean,
index: {
type: Number,
default: null
},
defaultIndex: {
type: [Array, Number],
default: 0
}
},
data () {
const initializeState = () => {
if (this.allowMultiple) {
return this.defaultIndex || []
} else {
return this.defaultIndex || 0
}
}
return {
expandedIndex: initializeState()
}
},
computed: {
isControlled () {
return this.index != null
},
_index: {
get () {
return this.isControlled ? this.index : this.expandedIndex
},
set (val) {
this.expandedIndex = val
}
}
},
methods: {
getExpandCondition (index, itemIndex) {
if (Array.isArray(index)) {
return index.includes(itemIndex)
}
return index === itemIndex
}
},
render (h) {
const children = this.$slots.default.filter(e => e.tag)
const cloned = cloneVNodes(children, h)
const clones = cloned.map((vnode, index) => {
const clone = h(vnode.componentOptions.Ctor, {
...vnode.data,
...(vnode.componentOptions.listeners || {}),
props: {
...(vnode.data.props || {}),
...vnode.componentOptions.propsData,
isOpen: this.getExpandCondition(this._index, index)
},
on: {
change: (isExpanded) => {
if (this.allowMultiple) {
if (isExpanded) {
let newIndices = [...this._index, index]
if (!this.isControlled) {
this.expandedIndex = newIndices
};
this.$emit('change', newIndices)
} else {
let newIndices = this._index.filter(
itemIndex => itemIndex !== index
)
if (!this.isControlled) {
this.expandedIndex = newIndices
};
this.$emit('change', newIndices)
}
} else {
if (isExpanded) {
if (!this.isControlled) {
this.expandedIndex = index
};
this.$emit('change', index)
} else {
if (this.allowToggle) {
if (!this.isControlled) {
this.expandedIndex = null
};
this.$emit('change', null)
}
}
}
}
}
}, vnode.componentOptions.children)
return clone
})

return h(Box, {
props: forwardProps(this.$props),
attrs: {
'data-accordion': ''
}
}, clones)
}
}

const AccordionItem = {
name: 'AccordionItem',
props: {
...styleProps,
isOpen: {
type: Boolean,
default: null
},
defaultIsOpen: {
type: Boolean,
default: false
},
id: {
type: String,
default: useId()
},
isDisabled: {
type: Boolean,
default: false
}
},
provide () {
return {
$AccordionContext: () => this.AccordionContext
}
},
data () {
return {
isExpanded: this.defaultIsOpen || false
}
},
computed: {
AccordionContext () {
return {
isExpanded: this._isExpanded,
isDisabled: this.isDisabled,
headerId: this.headerId,
panelId: this.panelId,
onToggle: this.onToggle
}
},
isControlled () {
return isDef(this.isOpen)
},
_isExpanded: {
get () {
return this.isControlled ? this.isOpen : this.isExpanded
},
set (value) {
this.isExpanded = value
}
},
headerId () {
return `accordion-header-${this.id}`
},
panelId () {
return `accordion-panel-${this.id}`
}
},
methods: {
onToggle () {
this.$emit('change', !this._isExpanded)
if (!this.isControlled) {
this._isExpanded = !this._isExpanded
}
}
},
render (h) {
return h(PseudoBox, {
props: {
...forwardProps(this.$props),
borderTopWidth: '1px',
_last: { borderBottomWidth: '1px' }
},
attrs: {
'data-accordion-item': ''
}
}, [
this.$scopedSlots.default({
isExpanded: this._isExpanded,
isDisabled: this.isDisabled
})
])
}
}

const AccordionHeader = {
name: 'AccordionHeader',
inject: ['$AccordionContext'],
props: styleProps,
computed: {
context () {
return this.$AccordionContext()
}
},
render (h) {
const { isExpanded, panelId, headerId, isDisabled, onToggle } = this.context
return h(PseudoBox, {
props: {
...forwardProps(this.$props),
as: 'button',
display: 'flex',
alignItems: 'center',
width: '100%',
outline: 0,
transition: 'all 0.2s',
px: 4,
py: 2,
_focus: { boxShadow: 'outline' },
_hover: { bg: 'blackAlpha.50' },
_disabled: { opacity: '0.4', cursor: 'not-allowed' }
},
attrs: {
id: headerId,
type: 'button',
disabled: isDisabled,
'aria-disabled': isDisabled,
'aria-expanded': isExpanded,
'aria-controls': panelId
},
nativeOn: {
click: (e) => {
onToggle()
this.$emit('click', e)
}
}
}, this.$slots.default)
}
}

const AccordionPanel = {
name: 'AccordionPanel',
inject: ['$AccordionContext'],
props: baseProps,
computed: {
context () {
return this.$AccordionContext()
}
},
render (h) {
const { isExpanded, panelId, headerId } = this.context

return h(Collapse, {
props: {
...forwardProps(this.$props),
isOpen: isExpanded,
pt: 2,
px: 4,
pb: 5
},
attrs: {
id: panelId,
'data-accordion-panel': '',
'aria-labelledby': headerId,
'aria-hidden': !isExpanded,
role: 'region'
}
}, this.$slots.default)
}
}

const AccordionIcon = {
name: 'AccordionIcon',
inject: ['$AccordionContext'],
props: {
...baseProps,
...iconProps
},
computed: {
context () {
return this.$AccordionContext()
}
},
render (h) {
const { isExpanded, isDisabled } = this.context
return h(Icon, {
props: {
...forwardProps(this.$props),
size: this.size || '1.25em',
name: this.name || 'chevron-down',
opacity: isDisabled ? 0.4 : 1,
transform: isExpanded ? 'rotate(-180deg)' : null,
transition: 'transform 0.2s',
transformOrigin: 'center'
}
})
}
}

export {
Accordion,
AccordionItem,
AccordionHeader,
AccordionPanel,
AccordionIcon
}
Loading