@lumx/core 4.9.0-next.8 → 4.9.0
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/components-and-utils.css +16 -2
- package/js/components/Combobox/ComboboxInput.d.ts +2 -2
- package/js/components/Combobox/ComboboxOption.d.ts +3 -1
- package/js/components/Combobox/ComboboxOptionMoreInfo.d.ts +2 -0
- package/js/components/Combobox/ComboboxOptionSkeleton.d.ts +6 -0
- package/js/components/Combobox/ComboboxPopover.d.ts +3 -1
- package/js/components/Combobox/ComboboxSection.d.ts +2 -2
- package/js/components/Combobox/ComboboxState.d.ts +6 -0
- package/js/components/Combobox/index.d.ts +2 -0
- package/js/components/Combobox/setupCombobox.d.ts +1 -1
- package/js/components/Combobox/setupComboboxInput.d.ts +4 -5
- package/js/components/Combobox/subscribeComboboxState.d.ts +23 -0
- package/js/components/Combobox/types.d.ts +2 -2
- package/js/components/ExpansionPanel/Tests.d.ts +12 -0
- package/js/components/ExpansionPanel/index.d.ts +70 -0
- package/js/components/ImageBlock/ImageCaption.d.ts +36 -0
- package/js/components/ImageBlock/Tests.d.ts +11 -0
- package/js/components/ImageBlock/index.d.ts +63 -0
- package/js/components/Mosaic/Tests.d.ts +13 -0
- package/js/components/TextField/RawInputTextarea.d.ts +1 -0
- package/js/types/jsx/PropsToOverride.d.ts +1 -1
- package/lumx.css +16 -2
- package/package.json +3 -4
- package/scss/components/combobox/_index.scss +44 -15
- package/scss/components/list/_mixins.scss +6 -4
package/components-and-utils.css
CHANGED
|
@@ -5008,7 +5008,17 @@ table {
|
|
|
5008
5008
|
/* ==========================================================================
|
|
5009
5009
|
Combobox
|
|
5010
5010
|
========================================================================== */
|
|
5011
|
+
.lumx-combobox-input .lumx-text-field__chips {
|
|
5012
|
+
width: -moz-min-content;
|
|
5013
|
+
width: min-content;
|
|
5014
|
+
min-width: 0;
|
|
5015
|
+
}
|
|
5016
|
+
|
|
5011
5017
|
.lumx-combobox-popover {
|
|
5018
|
+
max-height: 50vh;
|
|
5019
|
+
color: var(--lumx-color-dark-N);
|
|
5020
|
+
}
|
|
5021
|
+
.lumx-combobox-popover__scroll {
|
|
5012
5022
|
overflow-y: auto;
|
|
5013
5023
|
}
|
|
5014
5024
|
|
|
@@ -5031,7 +5041,11 @@ table {
|
|
|
5031
5041
|
.lumx-combobox-option-skeleton:nth-child(3n+2) .lumx-skeleton-typography {
|
|
5032
5042
|
width: min(55%, 170px);
|
|
5033
5043
|
}
|
|
5034
|
-
|
|
5044
|
+
.lumx-combobox-option .lumx-list-item__content {
|
|
5045
|
+
display: flex;
|
|
5046
|
+
flex-direction: column;
|
|
5047
|
+
justify-items: center;
|
|
5048
|
+
}
|
|
5035
5049
|
.lumx-combobox-option-more-info__popover {
|
|
5036
5050
|
max-width: 256px;
|
|
5037
5051
|
padding: 16px;
|
|
@@ -8233,7 +8247,7 @@ table {
|
|
|
8233
8247
|
|
|
8234
8248
|
/* Section
|
|
8235
8249
|
========================================================================== */
|
|
8236
|
-
.lumx-list-section:not(
|
|
8250
|
+
.lumx-list-section:not([hidden]) ~ .lumx-list-section:not(.lumx-list-section:not([hidden]) + .lumx-list-section):not(.lumx-list-divider + .lumx-list-section)::before {
|
|
8237
8251
|
content: "";
|
|
8238
8252
|
display: block;
|
|
8239
8253
|
height: 1px;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { CommonRef, HasClassName, LumxClassName } from '../../types';
|
|
1
|
+
import type { CommonRef, HasClassName, HasTheme, LumxClassName } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* Defines the props for the core ComboboxInput template.
|
|
4
4
|
*/
|
|
5
|
-
export interface ComboboxInputProps extends HasClassName {
|
|
5
|
+
export interface ComboboxInputProps extends HasClassName, HasTheme {
|
|
6
6
|
/** The ID of the listbox element (for aria-controls). */
|
|
7
7
|
listboxId?: string;
|
|
8
8
|
/** Whether the combobox is open. */
|
|
@@ -41,6 +41,8 @@ export interface ComboboxOptionProps extends HasClassName {
|
|
|
41
41
|
hidden?: boolean;
|
|
42
42
|
/** On click callback. */
|
|
43
43
|
handleClick?(): void;
|
|
44
|
+
/** Extra props forwarded to the inner action element (e.g. link props when as="a"). */
|
|
45
|
+
actionProps?: Record<string, any>;
|
|
44
46
|
/** ref to the root <li> element. */
|
|
45
47
|
ref?: CommonRef;
|
|
46
48
|
/** The value for this option (used for selection). */
|
|
@@ -50,7 +52,7 @@ export interface ComboboxOptionProps extends HasClassName {
|
|
|
50
52
|
* Props that React/Vue wrappers need to re-declare with framework-specific types.
|
|
51
53
|
* Used by `ReactToJSX<ComboboxOptionProps, ComboboxOptionPropsToOverride>`.
|
|
52
54
|
*/
|
|
53
|
-
export type ComboboxOptionPropsToOverride = 'before' | 'after' | 'children' | 'tooltipProps';
|
|
55
|
+
export type ComboboxOptionPropsToOverride = 'before' | 'after' | 'children' | 'tooltipProps' | 'actionProps';
|
|
54
56
|
/**
|
|
55
57
|
* Component display name.
|
|
56
58
|
*/
|
|
@@ -15,6 +15,8 @@ export interface ComboboxOptionMoreInfoProps extends HasClassName {
|
|
|
15
15
|
onMouseEnter?(): void;
|
|
16
16
|
/** Mouse leave callback. */
|
|
17
17
|
onMouseLeave?(): void;
|
|
18
|
+
/** Props forwarded to the IconButton. */
|
|
19
|
+
buttonProps?: Record<string, any>;
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
22
|
* Props that React/Vue wrappers need to re-declare with framework-specific types.
|
|
@@ -13,6 +13,12 @@ export interface ComboboxOptionSkeletonProps extends HasClassName {
|
|
|
13
13
|
children?: JSXElement;
|
|
14
14
|
/** ref to the root <li> element. */
|
|
15
15
|
ref?: CommonRef;
|
|
16
|
+
/**
|
|
17
|
+
* Number of skeleton `<li>` elements to render.
|
|
18
|
+
* Each is an independent element with `:nth-child` width cycling applied by SCSS.
|
|
19
|
+
* @default 1
|
|
20
|
+
*/
|
|
21
|
+
count?: number;
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
24
|
* Props that React/Vue wrappers need to re-declare with framework-specific types.
|
|
@@ -35,6 +35,8 @@ export interface ComboboxPopoverProps extends HasClassName {
|
|
|
35
35
|
export interface ComboboxPopoverComponents {
|
|
36
36
|
/** Popover component (framework-specific). */
|
|
37
37
|
Popover: any;
|
|
38
|
+
/** FlexBox component (framework-specific). */
|
|
39
|
+
FlexBox: any;
|
|
38
40
|
}
|
|
39
41
|
/**
|
|
40
42
|
* ComboboxPopover core template.
|
|
@@ -47,4 +49,4 @@ export interface ComboboxPopoverComponents {
|
|
|
47
49
|
* @param components Injected framework-specific components.
|
|
48
50
|
* @return JSX element.
|
|
49
51
|
*/
|
|
50
|
-
export declare const ComboboxPopover: (props: ComboboxPopoverProps, { Popover }: ComboboxPopoverComponents) => import("react").JSX.Element;
|
|
52
|
+
export declare const ComboboxPopover: (props: ComboboxPopoverProps, { Popover, FlexBox }: ComboboxPopoverComponents) => import("react").JSX.Element;
|
|
@@ -3,8 +3,8 @@ import type { CommonRef, HasClassName, JSXElement, LumxClassName } from '../../t
|
|
|
3
3
|
* Defines the props for the core ComboboxSection template.
|
|
4
4
|
*/
|
|
5
5
|
export interface ComboboxSectionProps extends HasClassName {
|
|
6
|
-
/** Section label displayed as the group title. */
|
|
7
|
-
label?: string;
|
|
6
|
+
/** Section label displayed as the group title. Accepts a plain string or custom JSX content. */
|
|
7
|
+
label?: string | JSXElement;
|
|
8
8
|
/** Section icon */
|
|
9
9
|
icon?: string;
|
|
10
10
|
/** Section content (should be ComboboxOption elements). */
|
|
@@ -53,6 +53,12 @@ export interface ComboboxStateProps {
|
|
|
53
53
|
* Used to suppress false "empty" state while data is loading.
|
|
54
54
|
*/
|
|
55
55
|
isLoading?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether the combobox popover is open.
|
|
58
|
+
* Used to gate live region content so screen readers announce messages
|
|
59
|
+
* when the popover opens (content insertion triggers `aria-live` announcement).
|
|
60
|
+
*/
|
|
61
|
+
isOpen?: boolean;
|
|
56
62
|
};
|
|
57
63
|
}
|
|
58
64
|
/**
|
|
@@ -21,3 +21,5 @@ export { ComboboxSection } from './ComboboxSection';
|
|
|
21
21
|
export type { ComboboxSectionProps, ComboboxSectionPropsToOverride, ComboboxSectionComponents, } from './ComboboxSection';
|
|
22
22
|
export { ComboboxState } from './ComboboxState';
|
|
23
23
|
export type { ComboboxStateProps } from './ComboboxState';
|
|
24
|
+
export { subscribeComboboxState } from './subscribeComboboxState';
|
|
25
|
+
export type { ComboboxStateSetters } from './subscribeComboboxState';
|
|
@@ -13,7 +13,7 @@ interface ComboboxOptions {
|
|
|
13
13
|
*
|
|
14
14
|
* @see https://www.w3.org/WAI/ARIA/apg/patterns/combobox/
|
|
15
15
|
*
|
|
16
|
-
* @param callbacks Callbacks
|
|
16
|
+
* @param callbacks Callbacks invoked on combobox events (e.g. option selection).
|
|
17
17
|
* @param options Options for configuring the shared combobox behavior.
|
|
18
18
|
* @param onTriggerAttach Optional callback invoked when the trigger is registered and the signal is ready.
|
|
19
19
|
* Used by mode-specific wrappers (setupComboboxInput/Button) to automatically
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ComboboxCallbacks, ComboboxHandle } from './types';
|
|
2
2
|
/** Options for configuring the input-mode combobox controller. */
|
|
3
|
-
export interface SetupComboboxInputOptions {
|
|
3
|
+
export interface SetupComboboxInputOptions extends ComboboxCallbacks {
|
|
4
4
|
/**
|
|
5
5
|
* When true (default), the combobox automatically filters options as the user types.
|
|
6
6
|
* Each registered `Combobox.Option` receives filter state updates and hides itself
|
|
@@ -21,9 +21,8 @@ export interface SetupComboboxInputOptions {
|
|
|
21
21
|
* Handles: Home/End (text cursor), ArrowLeft/Right (clear active descendant),
|
|
22
22
|
* filtering (on input and on open), and focus behavior.
|
|
23
23
|
*
|
|
24
|
-
* @param input
|
|
25
|
-
* @param callbacks
|
|
26
|
-
* @param options Options for configuring the input-mode controller.
|
|
24
|
+
* @param input The input element to use as the combobox trigger.
|
|
25
|
+
* @param options Options and callbacks for configuring the input-mode controller.
|
|
27
26
|
* @returns A ComboboxHandle for interacting with the combobox.
|
|
28
27
|
*/
|
|
29
|
-
export declare function setupComboboxInput(input: HTMLInputElement,
|
|
28
|
+
export declare function setupComboboxInput(input: HTMLInputElement, options: SetupComboboxInputOptions): ComboboxHandle;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ComboboxHandle } from './types';
|
|
2
|
+
/** Setters invoked by `subscribeComboboxState` when handle events fire. */
|
|
3
|
+
export interface ComboboxStateSetters {
|
|
4
|
+
/** Called immediately with the current loading state, then on every `loadingChange` event. */
|
|
5
|
+
setIsLoading: (value: boolean) => void;
|
|
6
|
+
/** Called on every `loadingAnnouncement` event (debounced 500ms after skeletons mount). */
|
|
7
|
+
setShouldAnnounce: (value: boolean) => void;
|
|
8
|
+
/** Called with `true` after a short delay when the combobox opens, and `false` immediately on close. */
|
|
9
|
+
setIsOpen: (value: boolean) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to the combobox handle events needed by `ComboboxState`.
|
|
13
|
+
*
|
|
14
|
+
* Manages three subscriptions:
|
|
15
|
+
* - `loadingChange` → `setIsLoading` (+ synchronous initial read of `handle.isLoading`)
|
|
16
|
+
* - `loadingAnnouncement` → `setShouldAnnounce`
|
|
17
|
+
* - `open` → `setIsOpen` (deferred by {@link OPEN_ANNOUNCEMENT_DELAY}ms on open, immediate on close)
|
|
18
|
+
*
|
|
19
|
+
* @param handle The combobox handle to subscribe to.
|
|
20
|
+
* @param setters Framework-specific state setters.
|
|
21
|
+
* @returns A cleanup function that unsubscribes all events and clears timers.
|
|
22
|
+
*/
|
|
23
|
+
export declare function subscribeComboboxState(handle: ComboboxHandle, setters: ComboboxStateSetters): () => void;
|
|
@@ -41,10 +41,10 @@ export interface ComboboxEventMap {
|
|
|
41
41
|
}
|
|
42
42
|
/** Callbacks provided by the consumer (React/Vue) to react to combobox state changes. */
|
|
43
43
|
export interface ComboboxCallbacks {
|
|
44
|
-
/** Called when an option is selected (click or keyboard). */
|
|
44
|
+
/** Called when an option is selected (click or keyboard). Receives the combobox handle for post-selection side effects. */
|
|
45
45
|
onSelect(option: {
|
|
46
46
|
value: string;
|
|
47
|
-
}): void;
|
|
47
|
+
}, handle: ComboboxHandle): void;
|
|
48
48
|
}
|
|
49
49
|
/** Handle returned by `setupCombobox`. Used by framework wrappers and mode controllers. */
|
|
50
50
|
export interface ComboboxHandle {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SetupOptions } from '../../../testing';
|
|
2
|
+
/**
|
|
3
|
+
* Mounts the component and returns common DOM elements / data needed in multiple tests further down.
|
|
4
|
+
*/
|
|
5
|
+
export declare const setup: (propsOverride: any | undefined, { render, ...options }: SetupOptions<any>) => {
|
|
6
|
+
element: HTMLElement;
|
|
7
|
+
header: HTMLElement | null;
|
|
8
|
+
props: any;
|
|
9
|
+
wrapper: Partial<import("../../../testing").SetupResult>;
|
|
10
|
+
};
|
|
11
|
+
declare const _default: (renderOptions: SetupOptions<any>) => void;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { HasClassName, LumxClassName, HasCloseMode, HasTheme, CommonRef, GenericProps, JSXElement } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Defines the props of the component.
|
|
4
|
+
*/
|
|
5
|
+
export interface ExpansionPanelProps extends HasClassName, HasCloseMode, HasTheme {
|
|
6
|
+
/** Whether the expansion panel has a background. */
|
|
7
|
+
hasBackground?: boolean;
|
|
8
|
+
/** Whether the header has a divider. */
|
|
9
|
+
hasHeaderDivider?: boolean;
|
|
10
|
+
/** Whether the component is open or not. */
|
|
11
|
+
isOpen?: boolean;
|
|
12
|
+
/** Label text (overwritten if a `<header>` is provided in the children). */
|
|
13
|
+
label?: string;
|
|
14
|
+
/** On open callback. */
|
|
15
|
+
handleOpen?: (event: any) => void;
|
|
16
|
+
/** On close callback. */
|
|
17
|
+
handleClose?: (event: any) => void;
|
|
18
|
+
/** Props to pass to the toggle button (minus those already set by the ExpansionPanel props). */
|
|
19
|
+
toggleButtonProps: any;
|
|
20
|
+
/** On toggle open or close callback. */
|
|
21
|
+
handleToggleOpen?(shouldOpen: boolean, event: any): void;
|
|
22
|
+
/** Children */
|
|
23
|
+
children?: JSXElement;
|
|
24
|
+
/** Ref forwarded to the root `<section>` element. */
|
|
25
|
+
ref?: CommonRef;
|
|
26
|
+
/** Ref forwarded to the collapsible wrapper `<div>`. */
|
|
27
|
+
wrapperRef?: CommonRef;
|
|
28
|
+
/** Props spread onto the header content `<div>` (e.g. `aria-*`, `data-*`). */
|
|
29
|
+
headerProps: GenericProps;
|
|
30
|
+
/** Content rendered inside the header content area. */
|
|
31
|
+
headerContent?: JSXElement;
|
|
32
|
+
/** Optional drag handle element rendered at the start of the header. */
|
|
33
|
+
dragHandle?: JSXElement;
|
|
34
|
+
/** Content rendered inside the collapsible content area. */
|
|
35
|
+
content?: JSXElement;
|
|
36
|
+
/** Optional footer element rendered below the content. */
|
|
37
|
+
footer?: JSXElement;
|
|
38
|
+
/** IconButton component injected by the framework wrapper (React or Vue). */
|
|
39
|
+
IconButton: any;
|
|
40
|
+
/** Whether the children should remain mounted (visible in the DOM) while the panel is closed. */
|
|
41
|
+
isChildrenVisible?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export type ExpansionPanelPropsToOverride = 'handleOpen' | 'handleClose' | 'toggleButtonProps' | 'handleToggleOpen' | 'wrapperRef' | 'headerProps' | 'headerContent' | 'dragHandle' | 'content' | 'IconButton' | 'isChildrenVisible' | 'footer';
|
|
44
|
+
/**
|
|
45
|
+
* Component display name.
|
|
46
|
+
*/
|
|
47
|
+
export declare const COMPONENT_NAME = "ExpansionPanel";
|
|
48
|
+
/**
|
|
49
|
+
* Component default class name and class prefix.
|
|
50
|
+
*/
|
|
51
|
+
export declare const CLASSNAME: LumxClassName<typeof COMPONENT_NAME>;
|
|
52
|
+
export declare const block: {
|
|
53
|
+
(additionalClasses: import("classnames/types").ClassValue[]): string;
|
|
54
|
+
(modifiers?: import("../../utils/classNames/bem/modifier").Modifier, additionalClasses?: import("classnames/types").ClassValue[]): string;
|
|
55
|
+
}, element: {
|
|
56
|
+
(elem: string, additionalClasses: import("classnames/types").ClassValue[]): string;
|
|
57
|
+
(elem: string, modifiers?: import("../../utils/classNames/bem/modifier").Modifier, additionalClasses?: import("classnames/types").ClassValue[]): string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Component default props.
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEFAULT_PROPS: Partial<ExpansionPanelProps>;
|
|
63
|
+
/**
|
|
64
|
+
* ExpansionPanel component.
|
|
65
|
+
*
|
|
66
|
+
* @param props Component props.
|
|
67
|
+
* @param ref Component ref.
|
|
68
|
+
* @return React element.
|
|
69
|
+
*/
|
|
70
|
+
export declare const ExpansionPanel: (props: ExpansionPanelProps) => import("react").JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { HorizontalAlignment } from '../../constants';
|
|
2
|
+
import { GenericProps, HasPolymorphicAs, HasTheme, JSXElement } from '../../types';
|
|
3
|
+
export type As = 'div' | 'figcaption';
|
|
4
|
+
export type ImageCaptionMetadata = {
|
|
5
|
+
/** Image title to display in the caption. */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** Props to pass to the title. */
|
|
8
|
+
titleProps?: GenericProps;
|
|
9
|
+
/** Image description. Can be either a string, ReactNode, or sanitized html object. */
|
|
10
|
+
description?: JSXElement | {
|
|
11
|
+
__html: string;
|
|
12
|
+
};
|
|
13
|
+
/** Props to pass to the description. */
|
|
14
|
+
descriptionProps?: GenericProps;
|
|
15
|
+
/** Tag content. */
|
|
16
|
+
tags?: JSXElement;
|
|
17
|
+
/** Caption custom CSS style. */
|
|
18
|
+
captionStyle?: GenericProps;
|
|
19
|
+
/** Props to pass to the wrapper FlexBox element. */
|
|
20
|
+
wrapperProps?: GenericProps;
|
|
21
|
+
/** FlexBox component injected by the framework wrapper (React or Vue). */
|
|
22
|
+
FlexBox: any;
|
|
23
|
+
/** Text component injected by the framework wrapper (React or Vue). */
|
|
24
|
+
Text: any;
|
|
25
|
+
};
|
|
26
|
+
export type ImageCaptionPropsToOverride = 'FlexBox' | 'Text' | 'wrapperProps';
|
|
27
|
+
export type ImageCaptionProps<AS extends As = 'figcaption'> = HasTheme & HasPolymorphicAs<AS> & ImageCaptionMetadata & {
|
|
28
|
+
/** Base className for sub elements */
|
|
29
|
+
baseClassName?: string;
|
|
30
|
+
/** Alignment. */
|
|
31
|
+
align?: HorizontalAlignment;
|
|
32
|
+
/** Truncate text on title & description (no line wrapping). */
|
|
33
|
+
truncate?: boolean;
|
|
34
|
+
};
|
|
35
|
+
/** Internal component used to render image captions */
|
|
36
|
+
export declare const ImageCaption: <AS extends As>(props: ImageCaptionProps<AS>) => import("react").JSX.Element | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SetupOptions } from '../../../testing';
|
|
2
|
+
/**
|
|
3
|
+
* Mounts the component and returns common DOM elements / data needed in multiple tests further down.
|
|
4
|
+
*/
|
|
5
|
+
export declare const setup: (propsOverride: any | undefined, { render, ...options }: SetupOptions<any>) => {
|
|
6
|
+
props: any;
|
|
7
|
+
imageBlock: HTMLElement;
|
|
8
|
+
wrapper: Partial<import("../../../testing").SetupResult>;
|
|
9
|
+
};
|
|
10
|
+
declare const _default: (renderOptions: SetupOptions<any>) => void;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { HorizontalAlignment, Size } from '../../constants';
|
|
2
|
+
import type { CommonRef, HasClassName, JSXElement, LumxClassName, GenericProps, HasTheme, ValueOf } from '../../types';
|
|
3
|
+
import { ImageCaptionMetadata, ImageCaptionPropsToOverride } from './ImageCaption';
|
|
4
|
+
/**
|
|
5
|
+
* Image block variants.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ImageBlockCaptionPosition: {
|
|
8
|
+
readonly below: "below";
|
|
9
|
+
readonly over: "over";
|
|
10
|
+
};
|
|
11
|
+
export type ImageBlockCaptionPosition = ValueOf<typeof ImageBlockCaptionPosition>;
|
|
12
|
+
/**
|
|
13
|
+
* Image block sizes.
|
|
14
|
+
*/
|
|
15
|
+
export type ImageBlockSize = Extract<Size, 'xl' | 'xxl'>;
|
|
16
|
+
/**
|
|
17
|
+
* Defines the props of the component.
|
|
18
|
+
*/
|
|
19
|
+
export interface ImageBlockProps extends HasClassName, HasTheme, Omit<ImageCaptionMetadata, ImageCaptionPropsToOverride> {
|
|
20
|
+
/** Action toolbar content. */
|
|
21
|
+
actions?: JSXElement;
|
|
22
|
+
/** Alignment. */
|
|
23
|
+
align?: HorizontalAlignment;
|
|
24
|
+
/** Image alternative text. */
|
|
25
|
+
alt: string;
|
|
26
|
+
/** Caption position. */
|
|
27
|
+
captionPosition?: ImageBlockCaptionPosition;
|
|
28
|
+
/** Whether the image has to fill its container height or not. */
|
|
29
|
+
fillHeight?: boolean;
|
|
30
|
+
/** Image URL. */
|
|
31
|
+
image: string;
|
|
32
|
+
/** Size variant. */
|
|
33
|
+
size?: ImageBlockSize;
|
|
34
|
+
/** Props to pass to the thumbnail (minus those already set by the ImageBlock props). */
|
|
35
|
+
thumbnailProps?: GenericProps;
|
|
36
|
+
/** reference to the root element */
|
|
37
|
+
ref?: CommonRef;
|
|
38
|
+
/** component for rendering the thumbnail */
|
|
39
|
+
Thumbnail: any;
|
|
40
|
+
/** component for rendering the image caption */
|
|
41
|
+
ImageCaption: any;
|
|
42
|
+
}
|
|
43
|
+
export type ImageBlockPropsToOverride = 'Thumbnail' | 'ImageCaption' | 'thumbnailProps';
|
|
44
|
+
/**
|
|
45
|
+
* Component display name.
|
|
46
|
+
*/
|
|
47
|
+
export declare const COMPONENT_NAME = "ImageBlock";
|
|
48
|
+
/**
|
|
49
|
+
* Component default class name and class prefix.
|
|
50
|
+
*/
|
|
51
|
+
export declare const CLASSNAME: LumxClassName<typeof COMPONENT_NAME>;
|
|
52
|
+
/**
|
|
53
|
+
* Component default props.
|
|
54
|
+
*/
|
|
55
|
+
export declare const DEFAULT_PROPS: Partial<ImageBlockProps>;
|
|
56
|
+
/**
|
|
57
|
+
* ImageBlock component.
|
|
58
|
+
*
|
|
59
|
+
* @param props Component props.
|
|
60
|
+
* @param ref Component ref.
|
|
61
|
+
* @return React element.
|
|
62
|
+
*/
|
|
63
|
+
export declare const ImageBlock: (props: ImageBlockProps) => import("react").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SetupOptions } from '../../../testing';
|
|
2
|
+
/**
|
|
3
|
+
* Mounts the component and returns common DOM elements / data needed in multiple tests further down.
|
|
4
|
+
*/
|
|
5
|
+
export declare const setup: (propsOverride: any | undefined, { render, ...options }: SetupOptions<any>) => {
|
|
6
|
+
props: any;
|
|
7
|
+
mosaic: HTMLElement;
|
|
8
|
+
thumbnails: HTMLElement[];
|
|
9
|
+
overlay: HTMLElement | null;
|
|
10
|
+
wrapper: Partial<import("../../../testing").SetupResult>;
|
|
11
|
+
};
|
|
12
|
+
declare const _default: (renderOptions: SetupOptions<any>) => void;
|
|
13
|
+
export default _default;
|
|
@@ -8,6 +8,7 @@ export interface RawInputTextareaProps extends HasTheme, HasClassName {
|
|
|
8
8
|
name?: string | undefined;
|
|
9
9
|
ref?: CommonRef;
|
|
10
10
|
handleChange?: (value: string, name?: string, event?: any) => void;
|
|
11
|
+
handleInput?: (value: string, name?: string, event?: any) => void;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* Component default props.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** list of generic props defined on JSX that need to be redefined for each framework */
|
|
2
|
-
export type PropsToOverride = 'ref' | 'handleClick' | 'handleChange' | 'handleKeyPress' | 'handleClose' | 'handleFocus' | 'handleBeforeClick' | 'handleAfterClick' | 'handleMouseEnter' | 'handleMouseLeave' | 'handleKeyDown';
|
|
2
|
+
export type PropsToOverride = 'ref' | 'handleClick' | 'handleChange' | 'handleInput' | 'handleKeyPress' | 'handleClose' | 'handleFocus' | 'handleBeforeClick' | 'handleAfterClick' | 'handleMouseEnter' | 'handleMouseLeave' | 'handleKeyDown';
|
package/lumx.css
CHANGED
|
@@ -5689,7 +5689,17 @@ table {
|
|
|
5689
5689
|
/* ==========================================================================
|
|
5690
5690
|
Combobox
|
|
5691
5691
|
========================================================================== */
|
|
5692
|
+
.lumx-combobox-input .lumx-text-field__chips {
|
|
5693
|
+
width: -moz-min-content;
|
|
5694
|
+
width: min-content;
|
|
5695
|
+
min-width: 0;
|
|
5696
|
+
}
|
|
5697
|
+
|
|
5692
5698
|
.lumx-combobox-popover {
|
|
5699
|
+
max-height: 50vh;
|
|
5700
|
+
color: var(--lumx-color-dark-N);
|
|
5701
|
+
}
|
|
5702
|
+
.lumx-combobox-popover__scroll {
|
|
5693
5703
|
overflow-y: auto;
|
|
5694
5704
|
}
|
|
5695
5705
|
|
|
@@ -5712,7 +5722,11 @@ table {
|
|
|
5712
5722
|
.lumx-combobox-option-skeleton:nth-child(3n+2) .lumx-skeleton-typography {
|
|
5713
5723
|
width: min(55%, 170px);
|
|
5714
5724
|
}
|
|
5715
|
-
|
|
5725
|
+
.lumx-combobox-option .lumx-list-item__content {
|
|
5726
|
+
display: flex;
|
|
5727
|
+
flex-direction: column;
|
|
5728
|
+
justify-items: center;
|
|
5729
|
+
}
|
|
5716
5730
|
.lumx-combobox-option-more-info__popover {
|
|
5717
5731
|
max-width: 256px;
|
|
5718
5732
|
padding: 16px;
|
|
@@ -8914,7 +8928,7 @@ table {
|
|
|
8914
8928
|
|
|
8915
8929
|
/* Section
|
|
8916
8930
|
========================================================================== */
|
|
8917
|
-
.lumx-list-section:not(
|
|
8931
|
+
.lumx-list-section:not([hidden]) ~ .lumx-list-section:not(.lumx-list-section:not([hidden]) + .lumx-list-section):not(.lumx-list-divider + .lumx-list-section)::before {
|
|
8918
8932
|
content: "";
|
|
8919
8933
|
display: block;
|
|
8920
8934
|
height: 1px;
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@floating-ui/dom": "^1.7.5",
|
|
10
|
-
"@lumx/icons": "^4.9.0
|
|
10
|
+
"@lumx/icons": "^4.9.0",
|
|
11
11
|
"classnames": "^2.3.2",
|
|
12
12
|
"focus-visible": "^5.0.2",
|
|
13
13
|
"lodash": "4.17.23",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"update-version-changelog": "yarn version-changelog ../../CHANGELOG.md"
|
|
70
70
|
},
|
|
71
71
|
"sideEffects": false,
|
|
72
|
-
"version": "4.9.0
|
|
72
|
+
"version": "4.9.0",
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
75
75
|
"@testing-library/dom": "^10.4.1",
|
|
@@ -92,6 +92,5 @@
|
|
|
92
92
|
"vite": "^7.3.1",
|
|
93
93
|
"vite-tsconfig-paths": "^5.1.4",
|
|
94
94
|
"vitest": "^4.0.18"
|
|
95
|
-
}
|
|
96
|
-
"stableVersion": "4.8.1"
|
|
95
|
+
}
|
|
97
96
|
}
|
|
@@ -2,8 +2,23 @@
|
|
|
2
2
|
Combobox
|
|
3
3
|
========================================================================== */
|
|
4
4
|
|
|
5
|
+
// ---- Input -----------------------
|
|
6
|
+
.#{$lumx-base-prefix}-combobox-input {
|
|
7
|
+
.#{$lumx-base-prefix}-text-field__chips {
|
|
8
|
+
width: min-content;
|
|
9
|
+
min-width: 0;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ---- Popover -----------------------
|
|
14
|
+
|
|
5
15
|
.#{$lumx-base-prefix}-combobox-popover {
|
|
6
|
-
|
|
16
|
+
max-height: 50vh;
|
|
17
|
+
color: var(--lumx-color-dark-N);
|
|
18
|
+
|
|
19
|
+
&__scroll {
|
|
20
|
+
overflow-y: auto;
|
|
21
|
+
}
|
|
7
22
|
}
|
|
8
23
|
|
|
9
24
|
// Hide popover and list when there is no option, no state, and no skeleton
|
|
@@ -17,28 +32,42 @@
|
|
|
17
32
|
}
|
|
18
33
|
}
|
|
19
34
|
|
|
35
|
+
// ---- State -----------------------
|
|
36
|
+
|
|
20
37
|
.#{$lumx-base-prefix}-combobox-state {
|
|
21
38
|
text-align: center;
|
|
22
39
|
}
|
|
23
40
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
41
|
+
// ---- Option -----------------------
|
|
42
|
+
|
|
43
|
+
.#{$lumx-base-prefix}-combobox-option {
|
|
44
|
+
// Skeleton option placeholders — width variation via :nth-child cycling
|
|
45
|
+
&-skeleton {
|
|
46
|
+
.#{$lumx-base-prefix}-skeleton-typography {
|
|
47
|
+
width: min(65%, 200px);
|
|
48
|
+
}
|
|
29
49
|
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
&:nth-child(3n + 1) .#{$lumx-base-prefix}-skeleton-typography {
|
|
51
|
+
width: min(70%, 230px);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&:nth-child(3n + 2) .#{$lumx-base-prefix}-skeleton-typography {
|
|
55
|
+
width: min(55%, 170px);
|
|
56
|
+
}
|
|
32
57
|
}
|
|
33
58
|
|
|
34
|
-
|
|
35
|
-
|
|
59
|
+
// Center option content
|
|
60
|
+
.#{$lumx-base-prefix}-list-item__content {
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
justify-items: center;
|
|
36
64
|
}
|
|
37
|
-
}
|
|
38
65
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
66
|
+
// Option more info popover sizing
|
|
67
|
+
&-more-info {
|
|
68
|
+
&__popover {
|
|
69
|
+
max-width: $lumx-size-xxl;
|
|
70
|
+
padding: $lumx-spacing-unit-big;
|
|
71
|
+
}
|
|
43
72
|
}
|
|
44
73
|
}
|
|
@@ -144,10 +144,12 @@
|
|
|
144
144
|
$divider: '.#{$lumx-base-prefix}-list-divider';
|
|
145
145
|
$section: &;
|
|
146
146
|
|
|
147
|
-
// Insert a divider before each section
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
|
|
147
|
+
// Insert a divider before each section that:
|
|
148
|
+
// 1. Is not directly following another visible section (avoids double dividers)
|
|
149
|
+
// 2. Is not directly following an explicit divider
|
|
150
|
+
// 3. Has at least one preceding visible section (uses `~` general sibling combinator
|
|
151
|
+
// so hidden-first-sections don't get a spurious top divider)
|
|
152
|
+
#{$section}:not([hidden]) ~ &:not(#{$section}:not([hidden]) + &):not(#{$divider} + &) {
|
|
151
153
|
&::before {
|
|
152
154
|
content: '';
|
|
153
155
|
display: block;
|