Skip to content

Commit

Permalink
[#1998] useBem hook adaptation for camel-case modifiers (#2000)
Browse files Browse the repository at this point in the history
  • Loading branch information
aluarius committed Jun 27, 2022
1 parent d413d9c commit 1fa76f7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
5 changes: 2 additions & 3 deletions packages/ui/src/components/va-switch/VaSwitch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -160,14 +160,13 @@ export default defineComponent({
})
const computedClass = useBem('va-switch', () => ({
...pick(props, ['readonly', 'disabled']),
...pick(props, ['readonly', 'disabled', 'leftLabel']),
checked: isChecked.value,
indeterminate: isIndeterminate.value,
small: props.size === 'small',
large: props.size === 'large',
'left-label': props.leftLabel,
error: computedError.value,
'on-keyboard-focus': hasKeyboardFocus.value,
onKeyboardFocus: hasKeyboardFocus.value,
}))
const styleComputed = computed(() => ({
Expand Down
19 changes: 11 additions & 8 deletions packages/ui/src/composables/useBem.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { computed, Ref, unref, ComputedRef } from 'vue'

import isFunction from 'lodash/isFunction.js'
import kebab from 'lodash/kebabCase.js'

import { __DEV__ } from '../utils/global-utils'

type Key<Prefix extends string, ModifierKey extends string> = `${Prefix}--${ModifierKey}`
type Key<Prefix extends string, ModifierKey extends string> = `${Prefix}--${ModifierKey | string}`

type ClassesObject<Key extends string> = Record<Key, boolean>

Expand All @@ -16,16 +18,17 @@ type ComputedClasses<Key extends string> = ClassesObject<Key> & {

/**
* @description creates BEM modifiers based on transferred prefix (base BEM class) & modifiers list.
* camelCase modifiers names will be transformed to the kebab-case.
* @param prefix string that classes start with (base BEM class).
* @param modifiers list of options that will serve as state BEM modifiers.
* @returns computed classes starting with "prefix" and ending with form state BEM modifier.
* @example
* const result = useBem('va-component', computed(() => pick(props, ['success'])))
* // if success is `true`
* { ...result }: { 'va-component--success': true }
* result.asObject.value: { 'va-component--success': true }
* result.asArray.value: ['va-component--success']
* result.asString.value: 'va-component--success'
* const result = useBem('va-component', computed(() => pick(props, ['success, noError'])))
* // if success & noError are `true`
* { ...result }: { 'va-component--success': true, va-component--no-error: true }
* result.asObject.value: { 'va-component--success': true, va-component--no-error: true }
* result.asArray.value: ['va-component--success', 'va-component--no-error']
* result.asString.value: 'va-component--success va-component--no-error'
*/
export const useBem = <ModifierKey extends string, Prefix extends string>(
prefix: Prefix,
Expand All @@ -41,7 +44,7 @@ export const useBem = <ModifierKey extends string, Prefix extends string>(
return Object
.entries(unref(modifiersList))
.reduce((classesObj: Record<string, boolean>, [modifierName, value]) => {
if (value) { classesObj[`${prefix}--${modifierName}`] = true }
if (value) { classesObj[`${prefix}--${kebab(modifierName)}`] = true }
return classesObj
}, {})
})
Expand Down

0 comments on commit 1fa76f7

Please sign in to comment.