index.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { useGlobalConfig } from '../use-global-config'
  2. export const defaultNamespace = 'el'
  3. const statePrefix = 'is-'
  4. const _bem = (namespace: string, block: string, blockSuffix: string, element: string, modifier: string) => {
  5. let cls = `${namespace}-${block}`
  6. if (blockSuffix) {
  7. cls += `-${blockSuffix}`
  8. }
  9. if (element) {
  10. cls += `__${element}`
  11. }
  12. if (modifier) {
  13. cls += `--${modifier}`
  14. }
  15. return cls
  16. }
  17. export const useNamespace = (block: string) => {
  18. const namespace = useGlobalConfig('namespace', defaultNamespace)
  19. const b = (blockSuffix = '') => _bem(namespace.value, block, blockSuffix, '', '')
  20. const e = (element?: string) => (element ? _bem(namespace.value, block, '', element, '') : '')
  21. const m = (modifier?: string) => (modifier ? _bem(namespace.value, block, '', '', modifier) : '')
  22. const be = (blockSuffix?: string, element?: string) => (blockSuffix && element ? _bem(namespace.value, block, blockSuffix, element, '') : '')
  23. const em = (element?: string, modifier?: string) => (element && modifier ? _bem(namespace.value, block, '', element, modifier) : '')
  24. const bm = (blockSuffix?: string, modifier?: string) => (blockSuffix && modifier ? _bem(namespace.value, block, blockSuffix, '', modifier) : '')
  25. const bem = (blockSuffix?: string, element?: string, modifier?: string) => (blockSuffix && element && modifier ? _bem(namespace.value, block, blockSuffix, element, modifier) : '')
  26. const is: {
  27. (name: string, state: boolean | undefined): string
  28. (name: string): string
  29. } = (name: string, ...args: [boolean | undefined] | []) => {
  30. const state = args.length >= 1 ? args[0]! : true
  31. return name && state ? `${statePrefix}${name}` : ''
  32. }
  33. // for css var
  34. // --el-xxx: value;
  35. const cssVar = (object: Record<string, string>) => {
  36. const styles: Record<string, string> = {}
  37. for (const key in object) {
  38. if (object[key]) {
  39. styles[`--${namespace.value}-${key}`] = object[key]
  40. }
  41. }
  42. return styles
  43. }
  44. // with block
  45. const cssVarBlock = (object: Record<string, string>) => {
  46. const styles: Record<string, string> = {}
  47. for (const key in object) {
  48. if (object[key]) {
  49. styles[`--${namespace.value}-${block}-${key}`] = object[key]
  50. }
  51. }
  52. return styles
  53. }
  54. const cssVarName = (name: string) => `--${namespace.value}-${name}`
  55. const cssVarBlockName = (name: string) => `--${namespace.value}-${block}-${name}`
  56. return {
  57. namespace,
  58. b,
  59. e,
  60. m,
  61. be,
  62. em,
  63. bm,
  64. bem,
  65. is,
  66. // css
  67. cssVar,
  68. cssVarName,
  69. cssVarBlock,
  70. cssVarBlockName,
  71. }
  72. }
  73. export type UseNamespaceReturn = ReturnType<typeof useNamespace>