@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.
- package/dist/development/context/createOptionalContextFactory.js +13 -0
- package/dist/development/context/createOptionalContextFactory.js.map +1 -0
- package/dist/development/hooks/useId.js +13 -0
- package/dist/development/hooks/useId.js.map +1 -0
- package/dist/development/index.js +20 -0
- package/dist/development/index.js.map +1 -1
- package/dist/development/theming/ColorSchemeProvider.js +18 -0
- package/dist/development/theming/ColorSchemeProvider.js.map +1 -0
- package/dist/development/theming/GlobalClassNamePrefixContext.js +6 -0
- package/dist/development/theming/GlobalClassNamePrefixContext.js.map +1 -0
- package/dist/development/theming/contexts.js +12 -0
- package/dist/development/theming/contexts.js.map +1 -0
- package/dist/development/theming/useClassName.js +17 -0
- package/dist/development/theming/useClassName.js.map +1 -0
- package/dist/development/theming/useClassNameFactory.js +20 -0
- package/dist/development/theming/useClassNameFactory.js.map +1 -0
- package/dist/development/theming/useThemedClassName.js +17 -0
- package/dist/development/theming/useThemedClassName.js.map +1 -0
- package/dist/development/theming/useThemedClassNameFactory.js +27 -0
- package/dist/development/theming/useThemedClassNameFactory.js.map +1 -0
- package/dist/production/context/createOptionalContextFactory.js +13 -0
- package/dist/production/context/createOptionalContextFactory.js.map +1 -0
- package/dist/production/hooks/useId.js +13 -0
- package/dist/production/hooks/useId.js.map +1 -0
- package/dist/production/index.js +20 -0
- package/dist/production/index.js.map +1 -1
- package/dist/production/theming/ColorSchemeProvider.js +14 -0
- package/dist/production/theming/ColorSchemeProvider.js.map +1 -0
- package/dist/production/theming/GlobalClassNamePrefixContext.js +6 -0
- package/dist/production/theming/GlobalClassNamePrefixContext.js.map +1 -0
- package/dist/production/theming/contexts.js +12 -0
- package/dist/production/theming/contexts.js.map +1 -0
- package/dist/production/theming/useClassName.js +17 -0
- package/dist/production/theming/useClassName.js.map +1 -0
- package/dist/production/theming/useClassNameFactory.js +20 -0
- package/dist/production/theming/useClassNameFactory.js.map +1 -0
- package/dist/production/theming/useThemedClassName.js +17 -0
- package/dist/production/theming/useThemedClassName.js.map +1 -0
- package/dist/production/theming/useThemedClassNameFactory.js +27 -0
- package/dist/production/theming/useThemedClassNameFactory.js.map +1 -0
- package/dist/types/context/createOptionalContextFactory.d.ts +3 -0
- package/dist/types/context/createOptionalContextFactory.d.ts.map +1 -0
- package/dist/types/context/index.d.ts +1 -0
- package/dist/types/context/index.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/hooks/useId.d.ts +10 -0
- package/dist/types/hooks/useId.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/theming/ColorSchemeProvider.d.ts +7 -0
- package/dist/types/theming/ColorSchemeProvider.d.ts.map +1 -0
- package/dist/types/theming/GlobalClassNamePrefixContext.d.ts +2 -0
- package/dist/types/theming/GlobalClassNamePrefixContext.d.ts.map +1 -0
- package/dist/types/theming/contexts.d.ts +12 -0
- package/dist/types/theming/contexts.d.ts.map +1 -0
- package/dist/types/theming/index.d.ts +8 -0
- package/dist/types/theming/index.d.ts.map +1 -0
- package/dist/types/theming/useClassName.d.ts +11 -0
- package/dist/types/theming/useClassName.d.ts.map +1 -0
- package/dist/types/theming/useClassNameFactory.d.ts +17 -0
- package/dist/types/theming/useClassNameFactory.d.ts.map +1 -0
- package/dist/types/theming/useThemedClassName.d.ts +39 -0
- package/dist/types/theming/useThemedClassName.d.ts.map +1 -0
- package/dist/types/theming/useThemedClassNameFactory.d.ts +3 -0
- package/dist/types/theming/useThemedClassNameFactory.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/context/createOptionalContextFactory.ts +13 -0
- package/src/context/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useId.ts +21 -0
- package/src/index.ts +1 -0
- package/src/theming/ColorSchemeProvider.tsx +19 -0
- package/src/theming/GlobalClassNamePrefixContext.ts +3 -0
- package/src/theming/contexts.ts +18 -0
- package/src/theming/index.ts +7 -0
- package/src/theming/useClassName.ts +28 -0
- package/src/theming/useClassNameFactory.ts +47 -0
- package/src/theming/useThemedClassName.ts +54 -0
- 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
|
+
}
|