Skip to content
This repository has been archived by the owner on Mar 4, 2020. It is now read-only.

feat(theming): exporting slot's classNames form components #827

Merged
merged 5 commits into from
Feb 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

### BREAKING CHANGES
- Rename `combobox` to `root` in `dropdownSearchInputStyles` @layershifter ([#816](https://github.com/stardust-ui/react/pull/816))
- Renamed class names for the slots inside the `ItemLayout` component @mnajdova ([#827](https://github.com/stardust-ui/react/pull/827))

### Features
- Accessibility for menu divider @jurokapsiar ([#822](https://github.com/stardust-ui/react/pull/822))
- Added slot class names in `ChatMessage`, `ChatItem`, `Dropdown`, `ItemLayout`, `Layout`, `MenuItem` @mnajdova ([#827](https://github.com/stardust-ui/react/pull/827))

### Fixes
- Fix `Dropdown` component styles regression @Bugaa92 ([#824](https://github.com/stardust-ui/react/pull/824))
Expand Down
20 changes: 18 additions & 2 deletions packages/react/src/components/Chat/ChatItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import {
import Box from '../Box/Box'
import { ComponentSlotStylesPrepared } from '../../themes/types'

export interface ChatItemSlotClassNames {
message: string
gutter: string
}

export interface ChatItemProps extends UIComponentProps, ChildrenComponentProps {
/** Controls item's relation to other chat items. */
attached?: boolean | 'top' | 'bottom'
Expand All @@ -37,6 +42,7 @@ class ChatItem extends UIComponent<ReactProps<ChatItemProps>, any> {
static className = 'ui-chat__item'
static create: Function
static displayName = 'ChatItem'
static slotClassNames: ChatItemSlotClassNames

static propTypes = {
...commonPropTypes.createCommon({ content: false }),
Expand Down Expand Up @@ -73,18 +79,28 @@ class ChatItem extends UIComponent<ReactProps<ChatItemProps>, any> {

private renderChatItem(styles: ComponentSlotStylesPrepared) {
const { message, gutter, contentPosition } = this.props
const gutterElement = gutter && Box.create(gutter, { defaultProps: { styles: styles.gutter } })
const gutterElement =
gutter &&
Box.create(gutter, {
defaultProps: { className: ChatItem.slotClassNames.gutter, styles: styles.gutter },
})

return (
<>
{contentPosition === 'start' && gutterElement}
{Box.create(message, { defaultProps: { styles: styles.message } })}
{Box.create(message, {
defaultProps: { className: ChatItem.slotClassNames.message, styles: styles.message },
})}
{contentPosition === 'end' && gutterElement}
</>
)
}
}

ChatItem.create = createShorthandFactory(ChatItem, 'message')
ChatItem.slotClassNames = {
message: `${ChatItem.className}__message`,
gutter: `${ChatItem.className}__gutter`,
}

export default ChatItem
9 changes: 8 additions & 1 deletion packages/react/src/components/Chat/ChatMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import Box from '../Box/Box'
export interface ChatMessageSlotClassNames {
author: string
timestamp: string
content: string
}

export interface ChatMessageProps
Expand Down Expand Up @@ -141,7 +142,12 @@ class ChatMessage extends UIComponent<ReactProps<ChatMessageProps>, ChatMessageS
className: ChatMessage.slotClassNames.timestamp,
},
})}
{Box.create(content, { defaultProps: { styles: styles.content } })}
{Box.create(content, {
defaultProps: {
className: ChatMessage.slotClassNames.content,
styles: styles.content,
},
})}
</>
)}
</ElementType>
Expand All @@ -153,6 +159,7 @@ ChatMessage.create = createShorthandFactory(ChatMessage, 'content')
ChatMessage.slotClassNames = {
author: `${ChatMessage.className}__author`,
timestamp: `${ChatMessage.className}__timestamp`,
content: `${ChatMessage.className}__content`,
}

export default ChatMessage
23 changes: 17 additions & 6 deletions packages/react/src/components/Dropdown/Dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ import Button from '../Button/Button'
import { screenReaderContainerStyles } from '../../lib/accessibility/Styles/accessibilityStyles'
import ListItem from '../List/ListItem'

export interface DropdownSlotClassNames {
container: string
selectedItems: string
}

export interface DropdownProps extends UIComponentProps<DropdownProps, DropdownState> {
/** The initial value for the search query, if the dropdown is also a search. */
defaultSearchQuery?: string
Expand Down Expand Up @@ -158,10 +163,7 @@ export interface DropdownState {
* @accessibility
* Implements ARIA collapsible Listbox design pattern, uses aria-live to announce state changes.
*/
export default class Dropdown extends AutoControlledComponent<
Extendable<DropdownProps>,
DropdownState
> {
class Dropdown extends AutoControlledComponent<Extendable<DropdownProps>, DropdownState> {
private buttonRef = React.createRef<HTMLElement>()
private inputRef = React.createRef<HTMLElement>()
private listRef = React.createRef<HTMLElement>()
Expand All @@ -171,6 +173,8 @@ export default class Dropdown extends AutoControlledComponent<

static className = 'ui-dropdown'

static slotClassNames: DropdownSlotClassNames

static propTypes = {
...commonPropTypes.createCommon({
children: false,
Expand Down Expand Up @@ -284,12 +288,12 @@ export default class Dropdown extends AutoControlledComponent<
return (
<Ref innerRef={innerRef}>
<div
className={cx(`${Dropdown.className}__container`, classes.container)}
className={cx(Dropdown.slotClassNames.container, classes.container)}
onClick={multiple ? this.handleContainerClick.bind(this, isOpen) : undefined}
>
<div
ref={this.selectedItemsRef}
className={cx(`${Dropdown.className}__selected-items`, classes.selectedItems)}
className={cx(Dropdown.slotClassNames.selectedItems, classes.selectedItems)}
>
{multiple && this.renderSelectedItems()}
{search
Expand Down Expand Up @@ -782,3 +786,10 @@ export default class Dropdown extends AutoControlledComponent<
_.invoke(this.props, 'onSelectedChange', {}, { ...this.props, value })
}
}

Dropdown.slotClassNames = {
container: `${Dropdown.className}__container`,
selectedItems: `${Dropdown.className}__selected-items`,
}

export default Dropdown
35 changes: 28 additions & 7 deletions packages/react/src/components/ItemLayout/ItemLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ import Layout from '../Layout/Layout'
import { ComponentSlotClasses, ICSSInJSStyle } from '../../themes/types'
import { ReactProps } from '../../types'

export interface ItemLayoutSlotClassNames {
header: string
headerMedia: string
main: string
content: string
contentMedia: string
media: string
endMedia: string
}

export interface ItemLayoutProps extends UIComponentProps, ContentComponentProps<any> {
contentMedia?: any
/** Toggle debug mode */
Expand Down Expand Up @@ -66,6 +76,8 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {

static className = 'ui-itemlayout'

static slotClassNames: ItemLayoutSlotClassNames

static propTypes = {
...commonPropTypes.createCommon({
children: false,
Expand Down Expand Up @@ -103,7 +115,7 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {

return (
<div
className="ui-item-layout__main"
className={ItemLayout.slotClassNames.main}
style={{
gridTemplateRows: '1fr 1fr',
}}
Expand All @@ -117,8 +129,8 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {
renderHeaderArea: (props, state, classes) => {
const { debug, header, headerMedia, truncateHeader, headerCSS, headerMediaCSS } = props

const mergedClasses = cx('ui-item-layout__header', classes.header)
const mediaClasses = cx('ui-item-layout__headerMedia', classes.headerMedia)
const mergedClasses = cx(ItemLayout.slotClassNames.header, classes.header)
const mediaClasses = cx(ItemLayout.slotClassNames.headerMedia, classes.headerMedia)

return !header && !headerMedia ? null : (
<Layout
Expand All @@ -143,8 +155,8 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {
renderContentArea: (props, state, classes) => {
const { debug, content, contentMedia, truncateContent, contentCSS, contentMediaCSS } = props

const mergedClasses = cx('ui-item-layout__content', classes.content)
const mediaClasses = cx('ui-item-layout__contentMedia', classes.contentMedia)
const mergedClasses = cx(ItemLayout.slotClassNames.content, classes.content)
const mediaClasses = cx(ItemLayout.slotClassNames.contentMedia, classes.contentMedia)

return !content && !contentMedia ? null : (
<Layout
Expand Down Expand Up @@ -175,8 +187,8 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {
const mainArea = renderMainArea(this.props, this.state, classes)
const endArea = endMedia

const mergedMediaClasses = cx('ui-item-layout__media', classes.media)
const mergedEndMediaClasses = cx('ui-item-layout__endMedia', classes.endMedia)
const mergedMediaClasses = cx(ItemLayout.slotClassNames.media, classes.media)
const mergedEndMediaClasses = cx(ItemLayout.slotClassNames.endMedia, classes.endMedia)

return (
<Layout
Expand Down Expand Up @@ -210,6 +222,15 @@ class ItemLayout extends UIComponent<ReactProps<ItemLayoutProps>, any> {
}

ItemLayout.create = createShorthandFactory(ItemLayout, 'content')
ItemLayout.slotClassNames = {
header: `${ItemLayout.className}__header`,
headerMedia: `${ItemLayout.className}__headerMedia`,
main: `${ItemLayout.className}__main`,
content: `${ItemLayout.className}__content`,
contentMedia: `${ItemLayout.className}__contentMedia`,
media: `${ItemLayout.className}__media`,
endMedia: `${ItemLayout.className}__endMedia`,
}

export default ItemLayout

Expand Down
36 changes: 29 additions & 7 deletions packages/react/src/components/Layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ import { UIComponent, UIComponentProps, commonPropTypes, rtlTextContainer } from
import { ReactProps } from '../../types'
import { ICSSInJSStyle } from '../../themes/types'

export interface LayoutSlotClassNames {
start: string
main: string
end: string
gap: string
reducedStart: string
reducedMain: string
reducedEnd: string
}

export interface LayoutProps extends UIComponentProps {
debug?: boolean
renderStartArea?: (params: object) => React.ReactNode
Expand Down Expand Up @@ -47,6 +57,8 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {

static displayName = 'Layout'

static slotClassNames: LayoutSlotClassNames

static propTypes = {
...commonPropTypes.createCommon({
children: false,
Expand Down Expand Up @@ -99,7 +111,7 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
return (
start && (
<div
className={cx('ui-layout__start', classes.start)}
className={cx(Layout.slotClassNames.start, classes.start)}
{...rtlTextContainer.getAttributes({ forElements: [start] })}
>
{start}
Expand All @@ -112,7 +124,7 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
return (
main && (
<div
className={cx('ui-layout__main', classes.main)}
className={cx(Layout.slotClassNames.main, classes.main)}
{...rtlTextContainer.getAttributes({ forElements: [main] })}
>
{main}
Expand All @@ -125,7 +137,7 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
return (
end && (
<div
className={cx('ui-layout__end', classes.end)}
className={cx(Layout.slotClassNames.end, classes.end)}
{...rtlTextContainer.getAttributes({ forElements: [end] })}
>
{end}
Expand All @@ -137,7 +149,7 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
// Heads up!
// IE11 Doesn't support grid-gap, insert virtual columns instead
renderGap({ gap, classes }) {
return gap && <span className={cx('ui-layout__gap', classes.gap)} />
return gap && <span className={cx(Layout.slotClassNames.gap, classes.gap)} />
},
}

Expand Down Expand Up @@ -173,9 +185,9 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
if (reducing && isSingleArea) {
const composedClasses = cx(
classes.root,
startArea && 'ui-layout--reduced__start',
mainArea && 'ui-layout--reduced__main',
endArea && 'ui-layout--reduced__end',
startArea && Layout.slotClassNames.reducedStart,
mainArea && Layout.slotClassNames.reducedMain,
endArea && Layout.slotClassNames.reducedEnd,
)
return (
<ElementType {...unhandledProps} className={composedClasses}>
Expand All @@ -196,5 +208,15 @@ class Layout extends UIComponent<ReactProps<LayoutProps>, any> {
}
}

Layout.slotClassNames = {
start: `${Layout.className}__start`,
main: `${Layout.className}__main`,
end: `${Layout.className}__end`,
gap: `${Layout.className}__gap`,
reducedStart: `${Layout.className}--reduced__start`,
reducedMain: `${Layout.className}--reduced__main`,
reducedEnd: `${Layout.className}--reduced__end`,
}

export default Layout
export type LayoutPropsWithDefaults = LayoutProps & typeof Layout.defaultProps
11 changes: 10 additions & 1 deletion packages/react/src/components/Menu/MenuItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ import { focusAsync } from '../../lib/accessibility/FocusZone'
import Ref from '../Ref/Ref'
import Indicator from '../Indicator/Indicator'

export interface MenuItemSlotClassNames {
wrapper: string
}

export interface MenuItemProps
extends UIComponentProps,
ChildrenComponentProps,
Expand Down Expand Up @@ -127,6 +131,8 @@ class MenuItem extends AutoControlledComponent<ReactProps<MenuItemProps>, MenuIt

static create: Function

static slotClassNames: MenuItemSlotClassNames

static propTypes = {
...commonPropTypes.createCommon(),
accessibility: PropTypes.func,
Expand Down Expand Up @@ -244,7 +250,7 @@ class MenuItem extends AutoControlledComponent<ReactProps<MenuItemProps>, MenuIt
if (wrapper) {
return Box.create(wrapper, {
defaultProps: {
className: cx('ui-menu__item__wrapper', classes.wrapper),
className: cx(MenuItem.slotClassNames.wrapper, classes.wrapper),
...accessibility.attributes.wrapper,
...accessibility.keyHandlers.wrapper,
},
Expand Down Expand Up @@ -377,5 +383,8 @@ class MenuItem extends AutoControlledComponent<ReactProps<MenuItemProps>, MenuIt
}

MenuItem.create = createShorthandFactory(MenuItem, 'content')
MenuItem.slotClassNames = {
wrapper: `${MenuItem.className}__wrapper`,
}

export default MenuItem
Loading