@contember/react-utils 1.2.0-rc.0 → 1.2.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/development/context/createOptionalContextFactory.js +13 -0
  2. package/dist/development/context/createOptionalContextFactory.js.map +1 -0
  3. package/dist/development/hooks/useId.js +13 -0
  4. package/dist/development/hooks/useId.js.map +1 -0
  5. package/dist/development/index.js +20 -0
  6. package/dist/development/index.js.map +1 -1
  7. package/dist/development/theming/ColorSchemeProvider.js +18 -0
  8. package/dist/development/theming/ColorSchemeProvider.js.map +1 -0
  9. package/dist/development/theming/GlobalClassNamePrefixContext.js +6 -0
  10. package/dist/development/theming/GlobalClassNamePrefixContext.js.map +1 -0
  11. package/dist/development/theming/contexts.js +12 -0
  12. package/dist/development/theming/contexts.js.map +1 -0
  13. package/dist/development/theming/useClassName.js +17 -0
  14. package/dist/development/theming/useClassName.js.map +1 -0
  15. package/dist/development/theming/useClassNameFactory.js +20 -0
  16. package/dist/development/theming/useClassNameFactory.js.map +1 -0
  17. package/dist/development/theming/useThemedClassName.js +17 -0
  18. package/dist/development/theming/useThemedClassName.js.map +1 -0
  19. package/dist/development/theming/useThemedClassNameFactory.js +27 -0
  20. package/dist/development/theming/useThemedClassNameFactory.js.map +1 -0
  21. package/dist/production/context/createOptionalContextFactory.js +13 -0
  22. package/dist/production/context/createOptionalContextFactory.js.map +1 -0
  23. package/dist/production/hooks/useId.js +13 -0
  24. package/dist/production/hooks/useId.js.map +1 -0
  25. package/dist/production/index.js +20 -0
  26. package/dist/production/index.js.map +1 -1
  27. package/dist/production/theming/ColorSchemeProvider.js +14 -0
  28. package/dist/production/theming/ColorSchemeProvider.js.map +1 -0
  29. package/dist/production/theming/GlobalClassNamePrefixContext.js +6 -0
  30. package/dist/production/theming/GlobalClassNamePrefixContext.js.map +1 -0
  31. package/dist/production/theming/contexts.js +12 -0
  32. package/dist/production/theming/contexts.js.map +1 -0
  33. package/dist/production/theming/useClassName.js +17 -0
  34. package/dist/production/theming/useClassName.js.map +1 -0
  35. package/dist/production/theming/useClassNameFactory.js +20 -0
  36. package/dist/production/theming/useClassNameFactory.js.map +1 -0
  37. package/dist/production/theming/useThemedClassName.js +17 -0
  38. package/dist/production/theming/useThemedClassName.js.map +1 -0
  39. package/dist/production/theming/useThemedClassNameFactory.js +27 -0
  40. package/dist/production/theming/useThemedClassNameFactory.js.map +1 -0
  41. package/dist/types/context/createOptionalContextFactory.d.ts +3 -0
  42. package/dist/types/context/createOptionalContextFactory.d.ts.map +1 -0
  43. package/dist/types/context/index.d.ts +1 -0
  44. package/dist/types/context/index.d.ts.map +1 -1
  45. package/dist/types/hooks/index.d.ts +1 -0
  46. package/dist/types/hooks/index.d.ts.map +1 -1
  47. package/dist/types/hooks/useId.d.ts +10 -0
  48. package/dist/types/hooks/useId.d.ts.map +1 -0
  49. package/dist/types/index.d.ts +1 -0
  50. package/dist/types/index.d.ts.map +1 -1
  51. package/dist/types/theming/ColorSchemeProvider.d.ts +7 -0
  52. package/dist/types/theming/ColorSchemeProvider.d.ts.map +1 -0
  53. package/dist/types/theming/GlobalClassNamePrefixContext.d.ts +2 -0
  54. package/dist/types/theming/GlobalClassNamePrefixContext.d.ts.map +1 -0
  55. package/dist/types/theming/contexts.d.ts +12 -0
  56. package/dist/types/theming/contexts.d.ts.map +1 -0
  57. package/dist/types/theming/index.d.ts +8 -0
  58. package/dist/types/theming/index.d.ts.map +1 -0
  59. package/dist/types/theming/useClassName.d.ts +11 -0
  60. package/dist/types/theming/useClassName.d.ts.map +1 -0
  61. package/dist/types/theming/useClassNameFactory.d.ts +17 -0
  62. package/dist/types/theming/useClassNameFactory.d.ts.map +1 -0
  63. package/dist/types/theming/useThemedClassName.d.ts +39 -0
  64. package/dist/types/theming/useThemedClassName.d.ts.map +1 -0
  65. package/dist/types/theming/useThemedClassNameFactory.d.ts +3 -0
  66. package/dist/types/theming/useThemedClassNameFactory.d.ts.map +1 -0
  67. package/dist/types/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +2 -2
  69. package/src/context/createOptionalContextFactory.ts +13 -0
  70. package/src/context/index.ts +1 -0
  71. package/src/hooks/index.ts +1 -0
  72. package/src/hooks/useId.ts +21 -0
  73. package/src/index.ts +1 -0
  74. package/src/theming/ColorSchemeProvider.tsx +19 -0
  75. package/src/theming/GlobalClassNamePrefixContext.ts +3 -0
  76. package/src/theming/contexts.ts +18 -0
  77. package/src/theming/index.ts +7 -0
  78. package/src/theming/useClassName.ts +28 -0
  79. package/src/theming/useClassNameFactory.ts +47 -0
  80. package/src/theming/useThemedClassName.ts +54 -0
  81. package/src/theming/useThemedClassNameFactory.ts +41 -0
@@ -0,0 +1,47 @@
1
+ import { NestedClassName, deduplicateClassName, flatClassNameList } from '@contember/utilities'
2
+ import { useContext } from 'react'
3
+ import { GlobalClassNamePrefixContext } from './GlobalClassNamePrefixContext'
4
+
5
+ /**
6
+ * Hook for component class name accepting outer class name
7
+ *
8
+ * Returns a reusable function almost that is handy for components
9
+ * with many sub-component parts that should inherit the root component
10
+ * name.
11
+ *
12
+ * Also, product of the factory is a function that can be used outside of rules of hooks.
13
+ *
14
+ * @param componentClassName - Component class name
15
+ * @param glue - String to use to glue component and sub-component suffix
16
+ * @param prefixOverride - Context component prefix override
17
+ * @returns
18
+ */
19
+ export function useClassNameFactory(
20
+ componentClassName: NestedClassName,
21
+ glue: string | null = '-',
22
+ prefixOverride?: string | null | undefined,
23
+ ) {
24
+ const contextPrefix = useContext(GlobalClassNamePrefixContext)
25
+ const classNamePrefix: string = prefixOverride === null || prefixOverride === '' ? '' : prefixOverride || contextPrefix
26
+
27
+ const componentClassNameList: string[] = flatClassNameList(componentClassName).map(
28
+ componentClassName => `${classNamePrefix}${componentClassName}`,
29
+ )
30
+
31
+ return function componentClassNameFor(
32
+ suffix: string | null | undefined = null,
33
+ additionalClassName: NestedClassName = null,
34
+ ): string {
35
+ const classNameSuffix: string = suffix ?? ''
36
+
37
+ return deduplicateClassName((classNameSuffix
38
+ ? (classNameSuffix.match(/^[a-zA-Z0-9]/)
39
+ ? componentClassNameList.map(componentClassName => `${componentClassName}${glue}${classNameSuffix}`)
40
+ : componentClassNameList.map(componentClassName => `${componentClassName}${classNameSuffix}`)
41
+ )
42
+ : componentClassNameList
43
+ ).concat(
44
+ flatClassNameList(additionalClassName),
45
+ )).join(' ')
46
+ }
47
+ }
@@ -0,0 +1,54 @@
1
+ import { NestedClassName, colorSchemeClassName, filterThemedClassName } from '@contember/utilities'
2
+ import { useColorScheme } from './contexts'
3
+ import { useClassName } from './useClassName'
4
+
5
+ /**
6
+ * Hook for component class name accepting outer class name with theme-* and scheme-* class manes
7
+ *
8
+ * It looks for theme CSS classes in the given class name, deduplicates them and returns final theme class name with scheme CSS class set
9
+ * @internal
10
+ *
11
+ * @param componentClassName - Component class name
12
+ * @param additionalClassName - Additional class name
13
+ * @param prefixOverride - Context component prefix override
14
+ * @returns string
15
+ * @see useColorScheme
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * function Button({ className }: { className?: string | string[] }) {
20
+ * const [contentThemeClassName, controlsThemeClassName] = useThemedClassName(className)
21
+ *
22
+ * return (
23
+ * <div className={contentThemeClassName}>
24
+ * <button className={controlsThemeClassName}>Click me</button>
25
+ * </div>
26
+ * )
27
+ * }
28
+ *
29
+ * function App() {
30
+ * return (
31
+ * <Button className="theme-default theme-danger:hover" />
32
+ * )
33
+ * }
34
+ *
35
+ * // renders:
36
+ * // <div class="scheme-system theme-default-content theme-danger-content:hover">
37
+ * // <button class="scheme-system theme-default-controls theme-danger-controls:hover">Click me</button>
38
+ * // </div>
39
+ * ```
40
+ */
41
+ export function useThemedClassName(
42
+ componentClassName: NestedClassName,
43
+ additionalClassName: NestedClassName,
44
+ prefixOverride?: string | null | undefined,
45
+ ): string {
46
+ return useClassName(
47
+ componentClassName,
48
+ filterThemedClassName(
49
+ additionalClassName,
50
+ colorSchemeClassName(useColorScheme()),
51
+ ),
52
+ prefixOverride,
53
+ )
54
+ }
@@ -0,0 +1,41 @@
1
+ import { NestedClassName, colorSchemeClassName, deduplicateClassName, filterThemedClassName, flatClassNameList } from '@contember/utilities'
2
+ import { useContext } from 'react'
3
+ import { GlobalClassNamePrefixContext } from './GlobalClassNamePrefixContext'
4
+ import { useColorScheme } from './contexts'
5
+
6
+ export function useThemedClassNameFactory(
7
+ componentClassName: NestedClassName,
8
+ glue: string | null = '-',
9
+ prefixOverride?: string | null | undefined,
10
+ ) {
11
+ const contextPrefix = useContext(GlobalClassNamePrefixContext)
12
+ const classNamePrefix: string = prefixOverride === null || prefixOverride === '' ? '' : prefixOverride || contextPrefix
13
+
14
+ const componentClassNameList: string[] = flatClassNameList(componentClassName).map(
15
+ componentClassName => `${classNamePrefix}${componentClassName}`,
16
+ )
17
+
18
+ const colorScheme = colorSchemeClassName(useColorScheme())
19
+
20
+ return function componentClassNameFor(
21
+ suffix: string | null | undefined = null,
22
+ additionalClassName: NestedClassName = null,
23
+ ): string {
24
+ const classNameSuffix: string = suffix ?? ''
25
+
26
+ return deduplicateClassName((classNameSuffix
27
+ ? (classNameSuffix.match(/^[a-zA-Z0-9]/)
28
+ ? componentClassNameList.map(componentClassName => `${componentClassName}${glue}${classNameSuffix}`)
29
+ : componentClassNameList.map(componentClassName => `${componentClassName}${classNameSuffix}`)
30
+ )
31
+ : componentClassNameList
32
+ ).concat(
33
+ flatClassNameList(
34
+ filterThemedClassName(
35
+ additionalClassName,
36
+ colorScheme,
37
+ ),
38
+ ),
39
+ )).join(' ')
40
+ }
41
+ }