index.ts 2.7 KB

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